From 3ab4a2a3e085452041dd3f907497e7e72e4624b2 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 18 Jul 2021 23:14:10 +0200 Subject: [PATCH 001/148] New framework LITTLEFS -> LittleFS --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- lib/lib_div/lib_mail/src/ESP_Mail_FS.h | 11 ++--------- .../ESP32-HomeKit/src/hap_platform_keystore.cpp | 2 +- platformio_tasmota32.ini | 2 +- platformio_tasmota_cenv_sample.ini | 14 +++++++------- platformio_tasmota_env32.ini | 2 +- tasmota/tasmota.ino | 2 +- tasmota/xdrv_50_filesystem.ino | 8 ++++---- 8 files changed, 18 insertions(+), 25 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e892e2467..dc9395db5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - - [ ] The code change is tested and works with Tasmota core ESP32 V.1.0.7.1 + - [ ] The code change is tested and works with Tasmota core ESP32 V.1.0.7.2 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ diff --git a/lib/lib_div/lib_mail/src/ESP_Mail_FS.h b/lib/lib_div/lib_mail/src/ESP_Mail_FS.h index 973a33492..0e9007fcb 100644 --- a/lib/lib_div/lib_mail/src/ESP_Mail_FS.h +++ b/lib/lib_div/lib_mail/src/ESP_Mail_FS.h @@ -19,15 +19,8 @@ */ // #define ESP_Mail_DEFAULT_FLASH_FS SPIFFS -#ifdef ESP8266 - #include - #define ESP_Mail_DEFAULT_FLASH_FS LittleFS -#endif - -#ifdef ESP32 - #include - #define ESP_Mail_DEFAULT_FLASH_FS LITTLEFS -#endif +#include +#define ESP_Mail_DEFAULT_FLASH_FS LittleFS /** * To use SD card file systems with different hardware interface diff --git a/lib/libesp32_div/ESP32-HomeKit/src/hap_platform_keystore.cpp b/lib/libesp32_div/ESP32-HomeKit/src/hap_platform_keystore.cpp index ec27c90c5..8e4656ea1 100755 --- a/lib/libesp32_div/ESP32-HomeKit/src/hap_platform_keystore.cpp +++ b/lib/libesp32_div/ESP32-HomeKit/src/hap_platform_keystore.cpp @@ -47,7 +47,7 @@ const char * hap_platform_keystore_get_factory_nvs_partition_name() { #ifdef HAP_USE_LITTLEFS -#include +#include extern FS *ffsp; diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 07c9d3974..d3a5b7743 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -27,7 +27,7 @@ build_flags = ${esp_defaults.build_flags} [core32] platform = espressif32 @ 3.3.0 -platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.1/tasmota-arduinoespressif32-release_v3.3.5.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.2/tasmota-arduinoespressif32-release_v3.3.5.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 6911570f7..c90503726 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -8,7 +8,7 @@ [core_dev] ; *** Esp8266 core for Arduino 3.0.1 platform = espressif8266 @ 3.1.0 -platform_packages = +platform_packages = build_unflags = ${esp_defaults.build_unflags} -Wswitch-unreachable build_flags = ${esp82xx_defaults.build_flags} @@ -31,8 +31,8 @@ build_flags = ${esp32_defaults.build_flags} [env:tasmota32s2] extends = env:tasmota32_base board = esp32s2 -platform = https://github.com/platformio/platform-espressif32.git#feature/idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/331/framework-arduinoespressif32-master-209a0d389.tar.gz +platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/340/framework-arduinoespressif32-master-caf43f7e9.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} -DFIRMWARE_LITE @@ -47,8 +47,8 @@ lib_ignore = [env:tasmota32c3] extends = env:tasmota32_base board = esp32c3 -platform = https://github.com/platformio/platform-espressif32.git#feature/idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/331/framework-arduinoespressif32-master-209a0d389.tar.gz +platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/340/framework-arduinoespressif32-master-caf43f7e9.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable @@ -70,8 +70,8 @@ lib_ignore = ; *** EXPERIMENTAL Tasmota version for ESP32 IDF4.4. [env:tasmota32idf4] extends = env:tasmota32_base -platform = https://github.com/platformio/platform-espressif32.git#feature/idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/331/framework-arduinoespressif32-master-209a0d389.tar.gz +platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/340/framework-arduinoespressif32-master-caf43f7e9.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 9cba1dfd1..fe9af2ce2 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -50,7 +50,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 [env:tasmota32solo1] extends = env:tasmota32_base -platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7/tasmota-arduinoespressif32-solo1-release_v3.3.5.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.2/tasmota-arduinoespressif32-solo1-release_v3.3.5.tar.gz platformio/tool-esptoolpy @ ~1.30100 platformio/tool-mklittlefs @ ~1.203.200522 build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 721770637..1b007621a 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -66,7 +66,7 @@ #endif // USE_SDCARD #endif // ESP8266 #ifdef ESP32 -#include +#include #ifdef USE_SDCARD #include #endif // USE_SDCARD diff --git a/tasmota/xdrv_50_filesystem.ino b/tasmota/xdrv_50_filesystem.ino index 87d722474..d42cdda8d 100644 --- a/tasmota/xdrv_50_filesystem.ino +++ b/tasmota/xdrv_50_filesystem.ino @@ -109,8 +109,8 @@ void UfsInitOnce(void) { #ifdef ESP32 // try lfs first - ffsp = &LITTLEFS; - if (!LITTLEFS.begin(true)) { + ffsp = &LittleFS; + if (!LittleFS.begin(true)) { // ffat is second ffsp = &FFat; if (!FFat.begin(true)) { @@ -223,9 +223,9 @@ uint32_t UfsInfo(uint32_t sel, uint32_t type) { #endif // ESP8266 #ifdef ESP32 if (sel == 0) { - result = LITTLEFS.totalBytes(); + result = LittleFS.totalBytes(); } else { - result = LITTLEFS.totalBytes() - LITTLEFS.usedBytes(); + result = LittleFS.totalBytes() - LittleFS.usedBytes(); } #endif // ESP32 break; From f6b527d189ab87815cf464a5300d6ea965f7bf81 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 19 Jul 2021 09:55:43 +0200 Subject: [PATCH 002/148] fix =d mode --- tasmota/xsns_53_sml.ino | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index cb7fa9497..184261771 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -456,7 +456,7 @@ const uint8_t meter[]= //0x77,0x07,0x01,0x00,0x01,0x08,0x01,0xff "1,77070101010801ff@1000," D_TPWRIN1 ",kWh," DJ_TPWRIN1 ",2|" // Verbrauch T1 //0x77,0x07,0x01,0x00,0x01,0x07,0x00,0xff -"1,77070100010700ff@1," D_TPWRCURR ",W," DJ_TPWRCURR ",0|" // Strom Gesamt +"1,77070100010700ff@1," D_TPWRCURR ",W," DJ_TPWRCURR ",0|" // Strom Gesamt //0x77,0x07,0x01,0x00,0x01,0x07,0x00,0xff "1,77070100150700ff@1," D_TPWRCURR1 ",W," DJ_TPWRCURR1 ",0|" // Strom L1 //0x77,0x07,0x01,0x00,0x01,0x07,0x00,0xff @@ -1438,6 +1438,13 @@ void SML_Decode(uint8_t index) { continue; } + // =d must handle dindex + if (*mp == '=' && *(mp + 1) == 'd') { + if (index != mindex) { + dindex++; + } + } + if (index!=mindex) goto nextsect; // start of serial source buffer From 7d15e15d8adc36401d65f5fb1079cc8770f3bf53 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Sat, 17 Jul 2021 09:17:19 +0200 Subject: [PATCH 003/148] prometheus: Fix wrong format on ESP32, incorrect names in types When built for ESP32 the memory fragmentation metric was incorrectly terminated (likely a typo). The type information for "tasmota_global_humidity_percentage" didn't include the "_percentage" and "tasmota_sensors" wsa incorrect too. Signed-off-by: Michael Hanselmann --- tasmota/xsns_75_prometheus.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index f15c569f6..2a560c743 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -113,7 +113,7 @@ void HandleMetrics(void) { } if (TasmotaGlobal.humidity != 0) { dtostrfd(TasmotaGlobal.humidity, Settings->flag2.humidity_resolution, parameter); - WSContentSend_P(PSTR("# TYPE tasmota_global_humidity gauge\ntasmota_global_humidity_percentage %s\n"), parameter); + WSContentSend_P(PSTR("# TYPE tasmota_global_humidity_percentage gauge\ntasmota_global_humidity_percentage %s\n"), parameter); } if (TasmotaGlobal.pressure_hpa != 0) { dtostrfd(TasmotaGlobal.pressure_hpa, Settings->flag2.pressure_resolution, parameter); @@ -124,7 +124,7 @@ void HandleMetrics(void) { #ifdef ESP32 int32_t freeMaxMem = 100 - (int32_t)(ESP_getMaxAllocHeap() * 100 / ESP_getFreeHeap()); WSContentSend_PD(PSTR("# TYPE tasmota_memory_bytes gauge\ntasmota_memory_bytes{memory=\"Ram\"} %d\n"), ESP_getFreeHeap()); - WSContentSend_PD(PSTR("# TYPE tasmota_memory_ratio gauge\ntasmota_memory_ratio{memory=\"Fragmentation\"} %d)"), freeMaxMem / 100); + WSContentSend_PD(PSTR("# TYPE tasmota_memory_ratio gauge\ntasmota_memory_ratio{memory=\"Fragmentation\"} %d\n"), freeMaxMem / 100); if (UsePSRAM()) { WSContentSend_P(PSTR("# TYPE tasmota_memory_bytes gauge\ntasmota_memory_bytes{memory=\"Psram\"} %d\n"), ESP.getFreePsram() ); } @@ -196,7 +196,7 @@ void HandleMetrics(void) { const char *value = value1.getStr(nullptr); String sensor = FormatMetricName(key1.getStr()); if (value != nullptr && isdigit(value[0] && strcmp(sensor.c_str(), "time") != 0)) { //remove false 'time' metric - WSContentSend_P(PSTR("# TYPE tasmota_sensors_%s gauge\ntasmota_sensors{sensor=\"%s\"} %s\n"), sensor.c_str(), sensor.c_str(), value); + WSContentSend_P(PSTR("# TYPE tasmota_sensors gauge\ntasmota_sensors{sensor=\"%s\"} %s\n"), sensor.c_str(), value); } } } From 1b96833d6afc386c7b870e1ddb840ef43a93ed26 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Mon, 19 Jul 2021 09:58:50 +0200 Subject: [PATCH 004/148] prometheus: Use utility functions to format metrics Format strings for Prometheus metrics were written manually and the `# TYPE` lines needed to be kept in sync with actual metrics. As indicated by the previous commit it wasn't always as consistent as desired. In addition there was a lot of repetition among the strings which couldn't be reduced at build time. With this change utility functions are introduced which eliminate the need for specifying the same metric name more than once. At the same time the proper escaping for label values, initially added in commit 16b5f2fe9, is now applied for all labels. The size of the program shrinks slightly by 212 bytes on ESP8266 in the "tasmota" configuration with Prometheus enabled and 412 bytes on ESP32 with the "tasmota32" configuration. Signed-off-by: Michael Hanselmann --- tasmota/xsns_75_prometheus.ino | 223 +++++++++++++++++++++++++-------- 1 file changed, 171 insertions(+), 52 deletions(-) diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index 2a560c743..8640a8d02 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -74,14 +74,91 @@ String FormatMetricName(const char *metric) { return formatted; } -// Labels can be any sequence of UTF-8 characters, but backslash, double-quote -// and line feed must be escaped. -String FormatLabelValue(const char *value) { - String formatted = value; - formatted.replace("\\", "\\\\"); - formatted.replace("\"", "\\\""); - formatted.replace("\n", "\\n"); - return formatted; +const uint8_t + kPromMetricNoPrefix = _BV(1), + kPromMetricGauge = _BV(2), + kPromMetricCounter = _BV(3), + kPromMetricTypeMask = kPromMetricGauge | kPromMetricCounter; + +// Format and send a Prometheus metric to the client. Use flags to configure +// the type. Labels must be supplied in tuples of two character array pointers +// and terminated by nullptr. +void WritePromMetric(const char *name, uint8_t flags, const char *value, va_list labels) { + PGM_P const prefix = (flags & kPromMetricNoPrefix) ? PSTR("") : PSTR("tasmota_"); + PGM_P tmp; + String lval; + + switch (flags & kPromMetricTypeMask) { + case kPromMetricGauge: + tmp = PSTR("gauge"); + break; + case kPromMetricCounter: + tmp = PSTR("counter"); + break; + default: + tmp = nullptr; + break; + } + + if (tmp != nullptr) { + WSContentSend_P(PSTR("# TYPE %s%s %s\n"), prefix, name, tmp); + } + + WSContentSend_P(PSTR("%s%s{"), prefix, name); + + for (const char *sep = PSTR(""); ; sep = PSTR(",")) { + if ((tmp = va_arg(labels, PGM_P)) == nullptr) { + break; + } + + // A few label values are stored in PROGMEM. The _P functions, e.g. + // snprintf_P, support both program and heap/stack memory with the "%s" + // format on ESP8266/ESP32. Casting the pointer to __FlashStringHelper has + // the same effect with String::operator=. + if (!(lval = va_arg(labels, const __FlashStringHelper *))) { + break; + } + + // Labels can be any sequence of UTF-8 characters, but backslash, + // double-quote and line feed must be escaped. + lval.replace("\\", "\\\\"); + lval.replace("\"", "\\\""); + lval.replace("\n", "\\n"); + + WSContentSend_P(PSTR("%s%s=\"%s\""), sep, tmp, lval.c_str()); + } + + WSContentSend_P(PSTR("} %s\n"), value); +} + +void WritePromMetricInt32(const char *name, uint8_t flags, const int32_t value, ...) { + char str[16]; + + snprintf_P(str, sizeof(str), PSTR("%d"), value); + + va_list labels; + va_start(labels, value); + WritePromMetric(name, flags, str, labels); + va_end(labels); +} + +void WritePromMetricDec(const char *name, uint8_t flags, double number, unsigned char prec, ...) { + char value[FLOATSZ]; + + // Prometheus always requires "." as the decimal separator. + dtostrfd(number, prec, value); + + va_list labels; + va_start(labels, prec); + WritePromMetric(name, flags, value, labels); + va_end(labels); +} + +void WritePromMetricStr(const char *name, uint8_t flags, const char *value, ...) { + va_list labels; + va_start(labels, value); + WritePromMetric(name, flags, value, labels); + va_end(labels); } void HandleMetrics(void) { @@ -91,63 +168,94 @@ void HandleMetrics(void) { WSContentBegin(200, CT_PLAIN); - char parameter[FLOATSZ]; + char namebuf[64]; // Pseudo-metric providing metadata about the running firmware version. - WSContentSend_P(PSTR("# TYPE tasmota_info gauge\ntasmota_info{version=\"%s\",image=\"%s\",build_timestamp=\"%s\",devicename=\"%s\"} 1\n"), - TasmotaGlobal.version, TasmotaGlobal.image_name, GetBuildDateAndTime().c_str(), FormatLabelValue(SettingsText(SET_DEVICENAME)).c_str()); - WSContentSend_P(PSTR("# TYPE tasmota_uptime_seconds gauge\ntasmota_uptime_seconds %d\n"), TasmotaGlobal.uptime); - WSContentSend_P(PSTR("# TYPE tasmota_boot_count counter\ntasmota_boot_count %d\n"), Settings->bootcount); - WSContentSend_P(PSTR("# TYPE tasmota_flash_writes_total counter\ntasmota_flash_writes_total %d\n"), Settings->save_flag); + WritePromMetricInt32(PSTR("info"), kPromMetricGauge, 1, + PSTR("version"), TasmotaGlobal.version, + PSTR("image"), TasmotaGlobal.image_name, + PSTR("build_timestamp"), GetBuildDateAndTime().c_str(), + PSTR("devicename"), SettingsText(SET_DEVICENAME), + nullptr); + WritePromMetricInt32(PSTR("uptime_seconds"), kPromMetricGauge, TasmotaGlobal.uptime, nullptr); + WritePromMetricInt32(PSTR("boot_count"), kPromMetricCounter, Settings->bootcount, nullptr); + WritePromMetricInt32(PSTR("flash_writes_total"), kPromMetricCounter, Settings->save_flag, nullptr); // Pseudo-metric providing metadata about the WiFi station. - WSContentSend_P(PSTR("# TYPE tasmota_wifi_station_info gauge\ntasmota_wifi_station_info{bssid=\"%s\",ssid=\"%s\"} 1\n"), WiFi.BSSIDstr().c_str(), WiFi.SSID().c_str()); + WritePromMetricInt32(PSTR("wifi_station_info"), kPromMetricGauge, 1, + PSTR("bssid"), WiFi.BSSIDstr().c_str(), + PSTR("ssid"), WiFi.SSID().c_str(), + nullptr); // Wi-Fi Signal strength - WSContentSend_P(PSTR("# TYPE tasmota_wifi_station_signal_dbm gauge\ntasmota_wifi_station_signal_dbm{mac_address=\"%s\"} %d\n"), WiFi.BSSIDstr().c_str(), WiFi.RSSI()); + WritePromMetricInt32(PSTR("wifi_station_signal_dbm"), kPromMetricGauge, WiFi.RSSI(), + PSTR("mac_address"), WiFi.BSSIDstr().c_str(), + nullptr); if (!isnan(TasmotaGlobal.temperature_celsius)) { - dtostrfd(TasmotaGlobal.temperature_celsius, Settings->flag2.temperature_resolution, parameter); - WSContentSend_P(PSTR("# TYPE tasmota_global_temperature_celsius gauge\ntasmota_global_temperature_celsius %s\n"), parameter); + WritePromMetricDec(PSTR("global_temperature_celsius"), kPromMetricGauge, + TasmotaGlobal.temperature_celsius, Settings->flag2.temperature_resolution, + nullptr); } + if (TasmotaGlobal.humidity != 0) { - dtostrfd(TasmotaGlobal.humidity, Settings->flag2.humidity_resolution, parameter); - WSContentSend_P(PSTR("# TYPE tasmota_global_humidity_percentage gauge\ntasmota_global_humidity_percentage %s\n"), parameter); + WritePromMetricDec(PSTR("global_humidity_percentage"), kPromMetricGauge, + TasmotaGlobal.humidity, Settings->flag2.humidity_resolution, + nullptr); } + if (TasmotaGlobal.pressure_hpa != 0) { - dtostrfd(TasmotaGlobal.pressure_hpa, Settings->flag2.pressure_resolution, parameter); - WSContentSend_P(PSTR("# TYPE tasmota_global_pressure_hpa gauge\ntasmota_global_pressure_hpa %s\n"), parameter); + WritePromMetricDec(PSTR("global_pressure_hpa"), kPromMetricGauge, + TasmotaGlobal.pressure_hpa, Settings->flag2.pressure_resolution, + nullptr); } // Pseudo-metric providing metadata about the free memory. - #ifdef ESP32 - int32_t freeMaxMem = 100 - (int32_t)(ESP_getMaxAllocHeap() * 100 / ESP_getFreeHeap()); - WSContentSend_PD(PSTR("# TYPE tasmota_memory_bytes gauge\ntasmota_memory_bytes{memory=\"Ram\"} %d\n"), ESP_getFreeHeap()); - WSContentSend_PD(PSTR("# TYPE tasmota_memory_ratio gauge\ntasmota_memory_ratio{memory=\"Fragmentation\"} %d\n"), freeMaxMem / 100); - if (UsePSRAM()) { - WSContentSend_P(PSTR("# TYPE tasmota_memory_bytes gauge\ntasmota_memory_bytes{memory=\"Psram\"} %d\n"), ESP.getFreePsram() ); - } - #else // ESP32 - WSContentSend_PD(PSTR("# TYPE tasmota_memory_bytes gauge\ntasmota_memory_bytes{memory=\"ram\"} %d\n"), ESP_getFreeHeap()); - #endif // ESP32 +#ifdef ESP32 + int32_t freeMaxMem = 100 - (int32_t)(ESP_getMaxAllocHeap() * 100 / ESP_getFreeHeap()); + + WritePromMetricInt32(PSTR("memory_bytes"), kPromMetricGauge, + ESP_getFreeHeap(), PSTR("memory"), PSTR("Ram"), nullptr); + + // FIXME: Always truncated to integer + WritePromMetricInt32(PSTR("memory_ratio"), kPromMetricGauge, + freeMaxMem / 100, PSTR("memory"), PSTR("Fragmentation"), nullptr); + + if (UsePSRAM()) { + WritePromMetricInt32(PSTR("memory_bytes"), kPromMetricGauge, + ESP.getFreePsram(), PSTR("memory"), PSTR("Psram"), nullptr); + } +#else // ESP32 + WritePromMetricInt32(PSTR("memory_bytes"), kPromMetricGauge, + ESP_getFreeHeap(), PSTR("memory"), PSTR("ram"), nullptr); +#endif // ESP32 #ifdef USE_ENERGY_SENSOR - dtostrfd(Energy.voltage[0], Settings->flag2.voltage_resolution, parameter); - WSContentSend_P(PSTR("# TYPE energy_voltage_volts gauge\nenergy_voltage_volts %s\n"), parameter); - dtostrfd(Energy.current[0], Settings->flag2.current_resolution, parameter); - WSContentSend_P(PSTR("# TYPE energy_current_amperes gauge\nenergy_current_amperes %s\n"), parameter); - dtostrfd(Energy.active_power[0], Settings->flag2.wattage_resolution, parameter); - WSContentSend_P(PSTR("# TYPE energy_power_active_watts gauge\nenergy_power_active_watts %s\n"), parameter); - dtostrfd(Energy.daily, Settings->flag2.energy_resolution, parameter); - WSContentSend_P(PSTR("# TYPE energy_power_kilowatts_daily counter\nenergy_power_kilowatts_daily %s\n"), parameter); - dtostrfd(Energy.total, Settings->flag2.energy_resolution, parameter); - WSContentSend_P(PSTR("# TYPE energy_power_kilowatts_total counter\nenergy_power_kilowatts_total %s\n"), parameter); + // TODO: Don't disable prefix on energy metrics + WritePromMetricDec(PSTR("energy_voltage_volts"), + kPromMetricGauge | kPromMetricNoPrefix, + Energy.voltage[0], Settings->flag2.voltage_resolution, nullptr); + WritePromMetricDec(PSTR("energy_current_amperes"), + kPromMetricGauge | kPromMetricNoPrefix, + Energy.current[0], Settings->flag2.current_resolution, nullptr); + WritePromMetricDec(PSTR("energy_power_active_watts"), + kPromMetricGauge | kPromMetricNoPrefix, + Energy.active_power[0], Settings->flag2.wattage_resolution, nullptr); + WritePromMetricDec(PSTR("energy_power_kilowatts_daily"), + kPromMetricCounter | kPromMetricNoPrefix, + Energy.daily, Settings->flag2.energy_resolution, nullptr); + WritePromMetricDec(PSTR("energy_power_kilowatts_total"), + kPromMetricCounter | kPromMetricNoPrefix, + Energy.total, Settings->flag2.energy_resolution, nullptr); #endif for (uint32_t device = 0; device < TasmotaGlobal.devices_present; device++) { power_t mask = 1 << device; - WSContentSend_P(PSTR("# TYPE relay%d_state gauge\nrelay%d_state %d\n"), device+1, device+1, (TasmotaGlobal.power & mask)); + // TODO: Don't disable prefix + snprintf_P(namebuf, sizeof(namebuf), PSTR("relay%d_state"), device + 1); + WritePromMetricInt32(namebuf, kPromMetricGauge | kPromMetricNoPrefix, + (TasmotaGlobal.power & mask), nullptr); } ResponseClear(); @@ -169,9 +277,12 @@ void HandleMetrics(void) { if (value != nullptr && isdigit(value[0])) { String sensor = FormatMetricName(key2.getStr()); String type = FormatMetricName(key3.getStr()); - const char *unit = UnitfromType(type.c_str()); //grab base unit corresponding to type - WSContentSend_P(PSTR("# TYPE tasmota_sensors_%s_%s gauge\ntasmota_sensors_%s_%s{sensor=\"%s\"} %s\n"), - type.c_str(), unit, type.c_str(), unit, sensor.c_str(), value); //build metric as "# TYPE tasmota_sensors_%type%_%unit% gauge\ntasmotasensors_%type%_%unit%{sensor=%sensor%"} %value%"" + + snprintf_P(namebuf, sizeof(namebuf), PSTR("sensors_%s_%s"), + type.c_str(), UnitfromType(type.c_str())); + WritePromMetricStr(namebuf, kPromMetricGauge, value, + PSTR("sensor"), sensor.c_str(), + nullptr); } } } else { @@ -179,14 +290,19 @@ void HandleMetrics(void) { if (value != nullptr && isdigit(value[0])) { String sensor = FormatMetricName(key1.getStr()); String type = FormatMetricName(key2.getStr()); - const char *unit = UnitfromType(type.c_str()); if (strcmp(type.c_str(), "totalstarttime") != 0) { // this metric causes Prometheus of fail + snprintf_P(namebuf, sizeof(namebuf), PSTR("sensors_%s_%s"), + type.c_str(), UnitfromType(type.c_str())); + if (strcmp(type.c_str(), "id") == 0) { // this metric is NaN, so convert it to a label, see Wi-Fi metrics above - WSContentSend_P(PSTR("# TYPE tasmota_sensors_%s_%s gauge\ntasmota_sensors_%s_%s{sensor=\"%s\",id=\"%s\"} 1\n"), - type.c_str(), unit, type.c_str(), unit, sensor.c_str(), value); + WritePromMetricInt32(namebuf, kPromMetricGauge, 1, + PSTR("sensor"), sensor.c_str(), + PSTR("id"), value, + nullptr); } else { - WSContentSend_P(PSTR("# TYPE tasmota_sensors_%s_%s gauge\ntasmota_sensors_%s_%s{sensor=\"%s\"} %s\n"), - type.c_str(), unit, type.c_str(), unit, sensor.c_str(), value); + WritePromMetricStr(namebuf, kPromMetricGauge, value, + PSTR("sensor"), sensor.c_str(), + nullptr); } } } @@ -195,8 +311,11 @@ void HandleMetrics(void) { } else { const char *value = value1.getStr(nullptr); String sensor = FormatMetricName(key1.getStr()); + if (value != nullptr && isdigit(value[0] && strcmp(sensor.c_str(), "time") != 0)) { //remove false 'time' metric - WSContentSend_P(PSTR("# TYPE tasmota_sensors gauge\ntasmota_sensors{sensor=\"%s\"} %s\n"), sensor.c_str(), value); + WritePromMetricStr(PSTR("sensors"), kPromMetricGauge, value, + PSTR("sensor"), sensor.c_str(), + nullptr); } } } From 718f5fc9ab090911bb68f82bdcb0840802820ff8 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Mon, 19 Jul 2021 13:09:55 +0200 Subject: [PATCH 005/148] prometheus: Unify memory metrics The "memory fragmentation" value named "memory_ratio" was always truncated to an integer, so in all likelyhood 0. It didn't work anyway until the incorrect line termination was fixed in an earlier commit. Neither could the Psram metric be parsed correctly due to the the same incorrect line termination. With this change memory usage is reported in line with Prometheus' upstream recommendations (https://prometheus.io/docs/practices/naming/). Labels are no longer used to separate distinct dimensions. Total and free memory as well as the maximum allocation size are reported as separate metrics where available while labels are used to differenciate the separate kinds of memory (heap on all, psram on ESP32). Label values are now also lowercase on ESP32 to match ESP8266. Metrics should report their base values, not the result of a calculation. Therefore the already non-working "fragmentation" metric is dropped. It can easily be calculated in PromQL instead. The renaming of metrics and label values makes this a breaking change, especially on ESP32. With the aforementioned formatting errors which made them unusable that shouldn't be a problem. Signed-off-by: Michael Hanselmann --- tasmota/xsns_75_prometheus.ino | 58 ++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index 8640a8d02..b4a3e602c 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -22,10 +22,13 @@ * Prometheus support * * The text format for metrics, labels and values is documented at [1]. Only - * the UTF-8 text encoding is supported. + * the UTF-8 text encoding is supported. [2] describes how metrics and labels + * should be named. * * [1] * https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md + * [2] + * https://github.com/prometheus/docs/blob/master/content/docs/practices/naming.md * \*********************************************************************************************/ @@ -161,6 +164,28 @@ void WritePromMetricStr(const char *name, uint8_t flags, const char *value, ...) va_end(labels); } +// Sentinel value for known memory metrics, chosen to unlikely match actual +// values. +const uint32_t kPromMemoryUnknown = 0xFFFFFFFF - 1; + +// Write metrics providing information about used and available memory. +void WritePromMemoryMetrics(const char *type, uint32_t size, uint32_t avail, uint32_t max_alloc) { + if (size != kPromMemoryUnknown) { + WritePromMetricInt32(PSTR("memory_size_bytes"), kPromMetricGauge, size, + PSTR("memory"), type, nullptr); + } + + WritePromMetricInt32(PSTR("memory_free_bytes"), kPromMetricGauge, avail, + PSTR("memory"), type, nullptr); + + if (max_alloc != kPromMemoryUnknown) { + // The largest contiguous free memory block, useful for checking + // fragmentation. + WritePromMetricInt32(PSTR("memory_max_alloc_bytes"), kPromMetricGauge, max_alloc, + PSTR("memory"), type, nullptr); + } +} + void HandleMetrics(void) { if (!HttpCheckPriviledgedAccess()) { return; } @@ -211,25 +236,26 @@ void HandleMetrics(void) { nullptr); } - // Pseudo-metric providing metadata about the free memory. + WritePromMemoryMetrics(PSTR("heap"), #ifdef ESP32 - int32_t freeMaxMem = 100 - (int32_t)(ESP_getMaxAllocHeap() * 100 / ESP_getFreeHeap()); - - WritePromMetricInt32(PSTR("memory_bytes"), kPromMetricGauge, - ESP_getFreeHeap(), PSTR("memory"), PSTR("Ram"), nullptr); - - // FIXME: Always truncated to integer - WritePromMetricInt32(PSTR("memory_ratio"), kPromMetricGauge, - freeMaxMem / 100, PSTR("memory"), PSTR("Fragmentation"), nullptr); + ESP.getHeapSize(), +#else + kPromMemoryUnknown, +#endif + ESP_getFreeHeap(), +#ifdef ESP32 + ESP_getMaxAllocHeap() +#else + kPromMemoryUnknown +#endif + ); +#ifdef ESP32 if (UsePSRAM()) { - WritePromMetricInt32(PSTR("memory_bytes"), kPromMetricGauge, - ESP.getFreePsram(), PSTR("memory"), PSTR("Psram"), nullptr); + WritePromMemoryMetrics(PSTR("psram"), ESP.getPsramSize(), + ESP.getFreePsram(), ESP.getMaxAllocPsram()); } -#else // ESP32 - WritePromMetricInt32(PSTR("memory_bytes"), kPromMetricGauge, - ESP_getFreeHeap(), PSTR("memory"), PSTR("ram"), nullptr); -#endif // ESP32 +#endif #ifdef USE_ENERGY_SENSOR // TODO: Don't disable prefix on energy metrics From 78a5e7f30f471a48ce511345531fdbbab42d5614 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Mon, 19 Jul 2021 17:41:38 +0200 Subject: [PATCH 006/148] Update italian language --- tasmota/language/it_IT.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 021c2eacc..b149df380 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 28.05.2021 + * Updated until v9.4.0.1 - Last update 19.07.2021 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -198,8 +198,8 @@ #define D_WEIGHT "Peso" #define D_WARMLIGHT "Calda" #define D_WEB_SERVER "Server web" -#define D_SOC "Stato di Carica" -#define D_SOH "State of Health" +#define D_SOC "Stato di carica" +#define D_SOH "State di salute" // tasmota.ino #define D_WARNING_MINIMAL_VERSION "ATTENZIONE Questa versione non supporta il salvataggio delle impostazioni" From 353c0b613034d09b86db4c2fa870c90ea2b28164 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 19 Jul 2021 18:15:14 +0200 Subject: [PATCH 007/148] Update de_DE.h --- tasmota/language/de_DE.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index d93f1135a..672d8f235 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -198,8 +198,8 @@ #define D_WEIGHT "Gewicht" #define D_WARMLIGHT "warm" #define D_WEB_SERVER "Web-Server" -#define D_SOC "State of Charge" -#define D_SOH "State of Health" +#define D_SOC "Ladestatus" +#define D_SOH "Gesundheitsstatus" // tasmota.ino #define D_WARNING_MINIMAL_VERSION "ACHTUNG: Diese Version unterstützt keine persistenten Einstellungen" From f99d5b0e0fd784cbd880bf12385b7c7ccf936144 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 19 Jul 2021 18:45:04 +0200 Subject: [PATCH 008/148] Berry support for static class members --- lib/libesp32/Berry/generate/be_const_strtab.h | 1 + .../Berry/generate/be_const_strtab_def.h | 3 +- .../Berry/generate/be_fixed_be_class_bytes.h | 2 +- .../Berry/generate/be_fixed_be_class_list.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_arc.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_bar.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_btn.h | 2 +- .../generate/be_fixed_be_class_lv_btnmatrix.h | 2 +- .../generate/be_fixed_be_class_lv_calendar.h | 2 +- .../generate/be_fixed_be_class_lv_canvas.h | 2 +- .../generate/be_fixed_be_class_lv_chart.h | 2 +- .../generate/be_fixed_be_class_lv_checkbox.h | 2 +- .../generate/be_fixed_be_class_lv_color.h | 2 +- .../generate/be_fixed_be_class_lv_cont.h | 2 +- .../generate/be_fixed_be_class_lv_cpicker.h | 2 +- .../generate/be_fixed_be_class_lv_ctypes.h | 2 +- .../generate/be_fixed_be_class_lv_dropdown.h | 2 +- .../generate/be_fixed_be_class_lv_font.h | 2 +- .../generate/be_fixed_be_class_lv_gauge.h | 2 +- .../generate/be_fixed_be_class_lv_group.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_img.h | 2 +- .../generate/be_fixed_be_class_lv_imgbtn.h | 2 +- .../generate/be_fixed_be_class_lv_indev.h | 2 +- .../generate/be_fixed_be_class_lv_keyboard.h | 2 +- .../generate/be_fixed_be_class_lv_label.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_led.h | 2 +- .../generate/be_fixed_be_class_lv_line.h | 2 +- .../generate/be_fixed_be_class_lv_linemeter.h | 2 +- .../generate/be_fixed_be_class_lv_list.h | 2 +- .../generate/be_fixed_be_class_lv_msgbox.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_obj.h | 2 +- .../generate/be_fixed_be_class_lv_objmask.h | 2 +- .../generate/be_fixed_be_class_lv_page.h | 2 +- .../generate/be_fixed_be_class_lv_roller.h | 2 +- .../generate/be_fixed_be_class_lv_slider.h | 2 +- .../generate/be_fixed_be_class_lv_spinbox.h | 2 +- .../generate/be_fixed_be_class_lv_spinner.h | 2 +- .../generate/be_fixed_be_class_lv_style.h | 2 +- .../generate/be_fixed_be_class_lv_switch.h | 2 +- .../generate/be_fixed_be_class_lv_table.h | 2 +- .../generate/be_fixed_be_class_lv_tabview.h | 2 +- .../generate/be_fixed_be_class_lv_textarea.h | 2 +- .../generate/be_fixed_be_class_lv_tileview.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_win.h | 2 +- .../Berry/generate/be_fixed_be_class_map.h | 2 +- .../Berry/generate/be_fixed_be_class_md5.h | 2 +- .../Berry/generate/be_fixed_be_class_range.h | 4 +- .../generate/be_fixed_be_class_tasmota.h | 14 ++-- .../be_fixed_be_class_tasmota_driver.h | 26 +++---- .../be_fixed_be_class_tasmota_i2c_driver.h | 6 +- .../generate/be_fixed_be_class_tasmota_wire.h | 2 +- .../Berry/generate/be_fixed_be_lvgl_cb.h | 2 +- lib/libesp32/Berry/src/be_api.c | 5 +- lib/libesp32/Berry/src/be_bytecode.c | 4 +- lib/libesp32/Berry/src/be_class.c | 63 +++++++++++++++-- lib/libesp32/Berry/src/be_class.h | 6 +- lib/libesp32/Berry/src/be_constobj.h | 10 +++ lib/libesp32/Berry/src/be_lexer.c | 2 +- lib/libesp32/Berry/src/be_lexer.h | 3 +- lib/libesp32/Berry/src/be_object.c | 1 + lib/libesp32/Berry/src/be_object.h | 5 +- lib/libesp32/Berry/src/be_parser.c | 28 +++++++- lib/libesp32/Berry/src/be_solidifylib.c | 5 +- lib/libesp32/Berry/src/be_strlib.c | 1 + lib/libesp32/Berry/src/be_vm.c | 33 ++++++++- lib/libesp32/Berry/tests/class_const.be | 69 +++++++++++++++++++ lib/libesp32/Berry/tools/coc/hash_map.cpp | 2 +- lib/libesp32/Berry/tools/coc/str_build.cpp | 2 +- 68 files changed, 290 insertions(+), 95 deletions(-) create mode 100644 lib/libesp32/Berry/tests/class_const.be diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 6691c08f6..11b5c6e7f 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -414,6 +414,7 @@ extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; extern const bcstring be_const_str_save; extern const bcstring be_const_str_size; extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_static; extern const bcstring be_const_str_exp; extern const bcstring be_const_str_on; extern const bcstring be_const_str_BL0940_RX; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index 3141a2641..988eca7bc 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -413,7 +413,8 @@ be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_lv_dr be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, &be_const_str_save); be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_size); be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, NULL); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_on); be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_WIEGAND_D0); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h index 968d964fd..80ee78fdd 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h @@ -7,7 +7,7 @@ static be_define_const_map_slots(be_class_bytes_map) { { be_const_key(seti, -1), be_const_func(m_set) }, { be_const_key(setitem, -1), be_const_func(m_setitem) }, { be_const_key(item, 18), be_const_func(m_item) }, - { be_const_key(dot_p, 3), be_const_int(0) }, + { be_const_key(dot_p, 3), be_const_var(0) }, { be_const_key(geti, -1), be_const_func(m_geti) }, { be_const_key(opt_connect, -1), be_const_func(m_connect) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_list.h b/lib/libesp32/Berry/generate/be_fixed_be_class_list.h index 98a52b494..300efcce0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_list.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_list.h @@ -14,7 +14,7 @@ static be_define_const_map_slots(be_class_list_map) { { be_const_key(tostring, 3), be_const_func(m_tostring) }, { be_const_key(opt_eq, -1), be_const_func(m_equal) }, { be_const_key(init, -1), be_const_func(m_init) }, - { be_const_key(dot_p, 17), be_const_int(0) }, + { be_const_key(dot_p, 17), be_const_var(0) }, { be_const_key(setitem, -1), be_const_func(m_setitem) }, { be_const_key(opt_connect, 4), be_const_func(m_connect) }, { be_const_key(opt_neq, -1), be_const_func(m_nequal) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h index dfa8110f5..d0512204e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_arc_map) { { be_const_key(init, 2), be_const_func(lvbe_arc_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h index 2d4336f44..c96c467db 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_bar_map) { { be_const_key(init, 2), be_const_func(lvbe_bar_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h index cf8d80833..29590fa55 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_btn_map) { { be_const_key(init, 2), be_const_func(lvbe_btn_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h index ec4dc09e0..3a029c9c3 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_btnmatrix_map) { { be_const_key(init, 2), be_const_func(lvbe_btnmatrix_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h index 593c30b69..80f07efb6 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_calendar_map) { { be_const_key(init, 2), be_const_func(lvbe_calendar_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h index 74607f0a4..4fd9bb5ea 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_canvas_map) { { be_const_key(init, 2), be_const_func(lvbe_canvas_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h index 0ebc1f578..6b09657c2 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_chart_map) { { be_const_key(init, 2), be_const_func(lvbe_chart_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h index f64be0ded..3165be40a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_checkbox_map) { { be_const_key(init, 2), be_const_func(lvbe_checkbox_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h index 252a6d6ab..1f4f75bfc 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_color_map) { { be_const_key(init, -1), be_const_func(lco_init) }, { be_const_key(tostring, 2), be_const_func(lco_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, }; static be_define_const_map( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h index 3ab5828ba..609766430 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_cont_map) { { be_const_key(init, 2), be_const_func(lvbe_cont_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h index 5a91a5708..e9be78a9a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_cpicker_map) { { be_const_key(init, 2), be_const_func(lvbe_cpicker_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h index 0f4672d54..0fea061de 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h @@ -1,7 +1,7 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_lv_ctypes_map) { - { be_const_key(dot_def, -1), be_const_int(0) }, + { be_const_key(dot_def, -1), be_const_var(0) }, { be_const_key(setmember, -1), be_const_func(be_ctypes_setmember) }, { be_const_key(init, -1), be_const_func(be_ctypes_init) }, { be_const_key(member, 2), be_const_func(be_ctypes_member) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h index c36d9970e..b5011f491 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_dropdown_map) { { be_const_key(init, 2), be_const_func(lvbe_dropdown_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h index 47cf8975f..1e1ebc351 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_font_map) { { be_const_key(init, -1), be_const_func(lvx_init) }, { be_const_key(tostring, 2), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, }; static be_define_const_map( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h index 2e84145b9..cb86f23c3 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_gauge_map) { { be_const_key(init, 2), be_const_func(lvbe_gauge_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h index 46f29f0c1..f939812a2 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_group_map) { { be_const_key(init, 2), be_const_func(lvbe_group_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h index 6f04c933b..e00cc4a9a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_img_map) { { be_const_key(init, 2), be_const_func(lvbe_img_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h index 2270dfdff..c35b0d8cd 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_imgbtn_map) { { be_const_key(init, 2), be_const_func(lvbe_imgbtn_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h index 002804d30..591758d8f 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_indev_map) { { be_const_key(init, 2), be_const_func(lv0_init) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h index 68d674421..f1ffefb5b 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_keyboard_map) { { be_const_key(init, 2), be_const_func(lvbe_keyboard_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h index 5bcfae692..c05287a03 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_label_map) { { be_const_key(init, 2), be_const_func(lvbe_label_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h index 70bc6b820..e3995f1e0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_led_map) { { be_const_key(init, 2), be_const_func(lvbe_led_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h index 7c32984a9..e12a41e8b 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_line_map) { { be_const_key(init, 2), be_const_func(lvbe_line_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h index af20fbd2f..72d00f372 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_linemeter_map) { { be_const_key(init, 2), be_const_func(lvbe_linemeter_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h index 56701ea96..ddbf5a12d 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_list_map) { { be_const_key(init, 2), be_const_func(lvbe_list_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h index f60c95fdd..f4402002b 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_msgbox_map) { { be_const_key(init, 2), be_const_func(lvbe_msgbox_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h index 5f5328325..242fd7edb 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_obj_map) { { be_const_key(init, 2), be_const_func(lvbe_obj_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h index e0d00517a..76ec1d349 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_objmask_map) { { be_const_key(init, 2), be_const_func(lvbe_objmask_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h index a345946de..99b08a995 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_page_map) { { be_const_key(init, 2), be_const_func(lvbe_page_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h index 82995edf2..32c3b9ec3 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_roller_map) { { be_const_key(init, 2), be_const_func(lvbe_roller_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h index 10a0a7823..2b5f13dee 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_slider_map) { { be_const_key(init, 2), be_const_func(lvbe_slider_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h index 14129797d..b511ad385 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_spinbox_map) { { be_const_key(init, 2), be_const_func(lvbe_spinbox_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h index 5f5e44912..d4c71b01e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_spinner_map) { { be_const_key(init, 2), be_const_func(lvbe_spinner_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h index 1ef46979f..0cec3423e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_style_map) { { be_const_key(init, 2), be_const_func(lvs_init) }, { be_const_key(tostring, -1), be_const_func(lvs_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h index 335286fce..c84d70737 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_switch_map) { { be_const_key(init, 2), be_const_func(lvbe_switch_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h index 9ad524712..b9449ea7d 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_table_map) { { be_const_key(init, 2), be_const_func(lvbe_table_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h index 1c29ebe88..39c793ba8 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_tabview_map) { { be_const_key(init, 2), be_const_func(lvbe_tabview_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h index 0284a9e59..290a439bc 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_textarea_map) { { be_const_key(init, 2), be_const_func(lvbe_textarea_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h index 34111754a..88b478d11 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_tileview_map) { { be_const_key(init, 2), be_const_func(lvbe_tileview_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h index 5d65d04e9..edca478bd 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_win_map) { { be_const_key(init, 2), be_const_func(lvbe_win_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_map.h b/lib/libesp32/Berry/generate/be_fixed_be_class_map.h index 06c75a050..76e99df82 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_map.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_map.h @@ -1,7 +1,7 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_map_map) { - { be_const_key(dot_p, 2), be_const_int(0) }, + { be_const_key(dot_p, 2), be_const_var(0) }, { be_const_key(insert, -1), be_const_func(m_insert) }, { be_const_key(remove, -1), be_const_func(m_remove) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h b/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h index 59979b2ad..121a8e6ea 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h @@ -2,7 +2,7 @@ static be_define_const_map_slots(be_class_md5_map) { { be_const_key(update, -1), be_const_func(m_md5_update) }, - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(finish, -1), be_const_func(m_md5_finish) }, { be_const_key(init, 1), be_const_func(m_md5_init) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_range.h b/lib/libesp32/Berry/generate/be_fixed_be_class_range.h index fc55c6304..371840af1 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_range.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_range.h @@ -5,9 +5,9 @@ static be_define_const_map_slots(be_class_range_map) { { be_const_key(iter, -1), be_const_func(m_iter) }, { be_const_key(lower, -1), be_const_func(m_lower) }, { be_const_key(init, 4), be_const_func(m_init) }, - { be_const_key(__upper__, -1), be_const_int(0) }, + { be_const_key(__upper__, -1), be_const_var(0) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, - { be_const_key(__lower__, -1), be_const_int(1) }, + { be_const_key(__lower__, -1), be_const_var(1) }, { be_const_key(upper, 1), be_const_func(m_upper) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h index 34c41ed47..2343a1ae9 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h @@ -10,14 +10,14 @@ static be_define_const_map_slots(be_class_tasmota_map) { { be_const_key(_cmd, -1), be_const_func(l_cmd) }, { be_const_key(web_send, 16), be_const_func(l_webSend) }, { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) }, - { be_const_key(_cb, -1), be_const_int(0) }, + { be_const_key(_cb, -1), be_const_var(0) }, { be_const_key(exec_cmd, -1), be_const_closure(exec_cmd_closure) }, { be_const_key(i2c_enabled, 42), be_const_func(l_i2cenabled) }, { be_const_key(cmd, -1), be_const_closure(cmd_closure) }, { be_const_key(resp_cmnd_done, 28), be_const_func(l_respCmndDone) }, { be_const_key(set_light, 1), be_const_closure(set_light_closure) }, { be_const_key(get_light, -1), be_const_closure(get_light_closure) }, - { be_const_key(_rules, 50), be_const_int(1) }, + { be_const_key(_rules, 50), be_const_var(1) }, { be_const_key(time_reached, -1), be_const_func(l_timereached) }, { be_const_key(web_send_decimal, -1), be_const_func(l_webSendDecimal) }, { be_const_key(load, 22), be_const_closure(load_closure) }, @@ -32,14 +32,14 @@ static be_define_const_map_slots(be_class_tasmota_map) { { be_const_key(get_option, -1), be_const_func(l_getoption) }, { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) }, { be_const_key(response_append, -1), be_const_func(l_respAppend) }, - { be_const_key(_timers, -1), be_const_int(2) }, + { be_const_key(_timers, -1), be_const_var(2) }, { be_const_key(try_rule, -1), be_const_closure(try_rule_closure) }, { be_const_key(set_power, 45), be_const_func(l_setpower) }, { be_const_key(resp_cmnd_error, -1), be_const_func(l_respCmndError) }, { be_const_key(publish, -1), be_const_func(l_publish) }, - { be_const_key(_ccmd, 13), be_const_int(3) }, + { be_const_key(_ccmd, 13), be_const_var(3) }, { be_const_key(_get_cb, -1), be_const_func(l_get_cb) }, - { be_const_key(wire1, 15), be_const_int(4) }, + { be_const_key(wire1, 15), be_const_var(4) }, { be_const_key(gen_cb, 6), be_const_closure(gen_cb_closure) }, { be_const_key(rtc, -1), be_const_func(l_rtc) }, { be_const_key(time_dump, -1), be_const_func(l_time_dump) }, @@ -50,13 +50,13 @@ static be_define_const_map_slots(be_class_tasmota_map) { { be_const_key(find_op, 25), be_const_closure(find_op_closure) }, { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) }, { be_const_key(get_power, -1), be_const_func(l_getpower) }, - { be_const_key(wire2, 8), be_const_int(5) }, + { be_const_key(wire2, 8), be_const_var(5) }, { be_const_key(wire_scan, 55), be_const_closure(wire_scan_closure) }, { be_const_key(resp_cmnd_failed, -1), be_const_func(l_respCmndFailed) }, { be_const_key(exec_rules, -1), be_const_closure(exec_rules_closure) }, { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) }, { be_const_key(resp_cmnd, -1), be_const_func(l_respCmnd) }, - { be_const_key(_drivers, -1), be_const_int(6) }, + { be_const_key(_drivers, -1), be_const_var(6) }, { be_const_key(add_driver, -1), be_const_closure(add_driver_closure) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h index 2e7af22fc..7ad6a4a4a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h @@ -1,21 +1,21 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_tasmota_driver_map) { - { be_const_key(every_second, 1), be_const_int(0) }, - { be_const_key(web_add_config_button, -1), be_const_int(1) }, - { be_const_key(web_sensor, 5), be_const_int(2) }, - { be_const_key(web_add_button, 10), be_const_int(3) }, + { be_const_key(every_second, 1), be_const_var(0) }, + { be_const_key(web_add_config_button, -1), be_const_var(1) }, + { be_const_key(web_sensor, 5), be_const_var(2) }, + { be_const_key(web_add_button, 10), be_const_var(3) }, { be_const_key(add_cmd, -1), be_const_closure(add_cmd_closure) }, - { be_const_key(web_add_console_button, 12), be_const_int(4) }, - { be_const_key(web_add_management_button, -1), be_const_int(5) }, - { be_const_key(display, -1), be_const_int(6) }, + { be_const_key(web_add_console_button, 12), be_const_var(4) }, + { be_const_key(web_add_management_button, -1), be_const_var(5) }, + { be_const_key(display, -1), be_const_var(6) }, { be_const_key(get_tasmota, 13), be_const_closure(get_tasmota_closure) }, - { be_const_key(every_100ms, -1), be_const_int(7) }, - { be_const_key(save_before_restart, -1), be_const_int(8) }, - { be_const_key(button_pressed, -1), be_const_int(9) }, - { be_const_key(web_add_handler, -1), be_const_int(10) }, - { be_const_key(web_add_main_button, -1), be_const_int(11) }, - { be_const_key(json_append, 8), be_const_int(12) }, + { be_const_key(every_100ms, -1), be_const_var(7) }, + { be_const_key(save_before_restart, -1), be_const_var(8) }, + { be_const_key(button_pressed, -1), be_const_var(9) }, + { be_const_key(web_add_handler, -1), be_const_var(10) }, + { be_const_key(web_add_main_button, -1), be_const_var(11) }, + { be_const_key(json_append, 8), be_const_var(12) }, }; static be_define_const_map( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h index 0cb3f6fc5..2bc2cdf6a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h @@ -3,13 +3,13 @@ static be_define_const_map_slots(be_class_tasmota_i2c_driver_map) { { be_const_key(read32, -1), be_const_closure(read32_closure) }, { be_const_key(write8, 6), be_const_closure(write8_closure) }, - { be_const_key(name, -1), be_const_int(0) }, - { be_const_key(addr, 10), be_const_int(1) }, + { be_const_key(name, -1), be_const_var(0) }, + { be_const_key(addr, 10), be_const_var(1) }, { be_const_key(read12, -1), be_const_closure(read12_closure) }, { be_const_key(write_bit, 8), be_const_closure(write_bit_closure) }, { be_const_key(read13, -1), be_const_closure(read13_closure) }, { be_const_key(read24, -1), be_const_closure(read24_closure) }, - { be_const_key(wire, -1), be_const_int(2) }, + { be_const_key(wire, -1), be_const_var(2) }, { be_const_key(init, -1), be_const_closure(init_closure) }, { be_const_key(read8, -1), be_const_closure(read8_closure) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h index d43d4aa8e..71ade9f7e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h @@ -2,7 +2,7 @@ static be_define_const_map_slots(be_class_tasmota_wire_map) { { be_const_key(_end_transmission, 10), be_const_func(b_wire_endtransmission) }, - { be_const_key(bus, -1), be_const_int(0) }, + { be_const_key(bus, -1), be_const_var(0) }, { be_const_key(_read, 7), be_const_func(b_wire_read) }, { be_const_key(read, -1), be_const_func(b_wire_validread) }, { be_const_key(_request_from, -1), be_const_func(b_wire_requestfrom) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h b/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h index 7348587a9..433187e60 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h @@ -1,7 +1,7 @@ #include "be_constobj.h" static be_define_const_map_slots(be_lvgl_cb_map) { - { be_const_key(dot_p, -1), be_const_int(0) }, + { be_const_key(dot_p, -1), be_const_var(0) }, { be_const_key(tostring, 2), be_const_func(lvx_tostring) }, { be_const_key(call, -1), be_const_func(lv_cb_call) }, { be_const_key(init, 0), be_const_func(lv0_init) }, diff --git a/lib/libesp32/Berry/src/be_api.c b/lib/libesp32/Berry/src/be_api.c index 14236a5ce..aeb348bbb 100644 --- a/lib/libesp32/Berry/src/be_api.c +++ b/lib/libesp32/Berry/src/be_api.c @@ -36,7 +36,7 @@ static void class_init(bvm *vm, bclass *c, const bnfuncinfo *lib) if (lib->function) { /* method */ be_prim_method_bind(vm, c, s, lib->function); } else { - be_member_bind(vm, c, s); /* member */ + be_member_bind(vm, c, s, btrue); /* member */ } ++lib; } @@ -643,6 +643,9 @@ static int ins_member(bvm *vm, int index, const char *k) if (var_isinstance(o)) { binstance *obj = var_toobj(o); type = be_instance_member(vm, obj, be_newstr(vm, k), top); + if (type == BE_NONE) { + type = BE_NIL; + } } return type; } diff --git a/lib/libesp32/Berry/src/be_bytecode.c b/lib/libesp32/Berry/src/be_bytecode.c index b8242d326..e6d69a0dd 100644 --- a/lib/libesp32/Berry/src/be_bytecode.c +++ b/lib/libesp32/Berry/src/be_bytecode.c @@ -129,7 +129,7 @@ static bstring** save_members(bvm *vm, void *fp, bclass *c, int nvar) } while ((node = be_map_next(members, &iter)) != NULL) { be_assert(var_isstr(&node->key)); - if (var_isint(&node->value)) { /* cache member name */ + if (var_isindex(&node->value)) { /* cache member name */ if (vars == NULL) { return NULL; /* should never be executed */ } @@ -405,7 +405,7 @@ static void load_class(bvm *vm, void *fp, bvalue *v) } for (count = 0; count < nvar; ++count) { /* load member-variable table */ bstring *name = cache_string(vm, fp); - be_member_bind(vm, c, name); + be_member_bind(vm, c, name, btrue); be_stackpop(vm, 1); /* pop the cached string */ } } diff --git a/lib/libesp32/Berry/src/be_class.c b/lib/libesp32/Berry/src/be_class.c index ffb196372..720bba05c 100644 --- a/lib/libesp32/Berry/src/be_class.c +++ b/lib/libesp32/Berry/src/be_class.c @@ -53,18 +53,25 @@ int be_class_attribute(bvm *vm, bclass *c, bstring *attr) } } } - return BE_NIL; + return BE_NONE; } -void be_member_bind(bvm *vm, bclass *c, bstring *name) +void be_member_bind(bvm *vm, bclass *c, bstring *name, bbool var) { bvalue *attr; set_fixed(name); check_members(vm, c); attr = be_map_insertstr(vm, c->members, name, NULL); restore_fixed(name); - attr->v.i = c->nvar++; - attr->type = MT_VARIABLE; + if (var) { + /* this is an instance variable so we set it as MT_VARIABLE */ + attr->v.i = c->nvar++; + attr->type = MT_VARIABLE; + } else { + /* this is a static class constant, leave it as BE_NIL */ + attr->v.i = 0; + attr->type = BE_NIL; + } } void be_method_bind(bvm *vm, bclass *c, bstring *name, bproto *p) @@ -135,6 +142,23 @@ static binstance* instance_member(bvm *vm, return NULL; } +static bclass* class_member(bvm *vm, + bclass *obj, bstring *name, bvalue *dst) +{ + for (; obj; obj = obj->super) { + bmap *members = obj->members; + if (members) { + bvalue *v = be_map_findstr(vm, members, name); + if (v) { + *dst = *v; + return obj; + } + } + } + var_setnil(dst); + return NULL; +} + void be_class_upvalue_init(bvm *vm, bclass *c) { bmap *mbr = c->members; @@ -216,7 +240,24 @@ int be_instance_member(bvm *vm, binstance *obj, bstring *name, bvalue *dst) if (obj && type == MT_VARIABLE) { *dst = obj->members[dst->v.i]; } - return type; + if (obj) { + return type; + } else { + return BE_NONE; + } +} + +int be_class_member(bvm *vm, bclass *obj, bstring *name, bvalue *dst) +{ + int type; + be_assert(name != NULL); + obj = class_member(vm, obj, name, dst); + type = var_type(dst); + if (obj) { + return type; + } else { + return BE_NONE; + } } bbool be_instance_setmember(bvm *vm, binstance *o, bstring *name, bvalue *src) @@ -246,3 +287,15 @@ bbool be_instance_setmember(bvm *vm, binstance *o, bstring *name, bvalue *src) } return bfalse; } + +bbool be_class_setmember(bvm *vm, bclass *o, bstring *name, bvalue *src) +{ + bvalue v; + be_assert(name != NULL); + bclass * obj = class_member(vm, o, name, &v); + if (obj && !var_istype(&v, MT_VARIABLE)) { + be_map_insertstr(vm, obj->members, name, src); + return btrue; + } + return bfalse; +} diff --git a/lib/libesp32/Berry/src/be_class.h b/lib/libesp32/Berry/src/be_class.h index 3b9458013..3186afd66 100644 --- a/lib/libesp32/Berry/src/be_class.h +++ b/lib/libesp32/Berry/src/be_class.h @@ -10,7 +10,7 @@ #include "be_object.h" -#define MT_VARIABLE BE_INT +#define MT_VARIABLE BE_INDEX #define MT_METHOD BE_CLOSURE #define MT_PRIMMETHOD BE_NTVFUNC @@ -52,7 +52,7 @@ struct binstance { bclass* be_newclass(bvm *vm, bstring *name, bclass *super); void be_class_compress(bvm *vm, bclass *c); int be_class_attribute(bvm *vm, bclass *c, bstring *attr); -void be_member_bind(bvm *vm, bclass *c, bstring *name); +void be_member_bind(bvm *vm, bclass *c, bstring *name, bbool var); void be_method_bind(bvm *vm, bclass *c, bstring *name, bproto *p); void be_prim_method_bind(bvm *vm, bclass *c, bstring *name, bntvfunc f); void be_closure_method_bind(bvm *vm, bclass *c, bstring *name, bclosure *cl); @@ -60,6 +60,8 @@ int be_class_closure_count(bclass *c); void be_class_upvalue_init(bvm *vm, bclass *c); bbool be_class_newobj(bvm *vm, bclass *c, bvalue *argv, int argc, int mode); int be_instance_member(bvm *vm, binstance *obj, bstring *name, bvalue *dst); +int be_class_member(bvm *vm, bclass *obj, bstring *name, bvalue *dst); bbool be_instance_setmember(bvm *vm, binstance *obj, bstring *name, bvalue *src); +bbool be_class_setmember(bvm *vm, bclass *obj, bstring *name, bvalue *src); #endif diff --git a/lib/libesp32/Berry/src/be_constobj.h b/lib/libesp32/Berry/src/be_constobj.h index 8efbb0e09..543d6b62a 100644 --- a/lib/libesp32/Berry/src/be_constobj.h +++ b/lib/libesp32/Berry/src/be_constobj.h @@ -42,6 +42,11 @@ extern "C" { .type = BE_INT \ } +#define be_const_var(_val) { \ + .v.i = (bint)(_val), \ + .type = BE_INDEX \ +} + #define be_const_real(_val) { \ .v.r = (breal)(_val), \ .type = BE_REAL \ @@ -140,6 +145,11 @@ const bntvmodule be_native_module(_module) = { \ BE_INT \ } +#define be_const_var(_val) { \ + bvaldata(bint(_val)), \ + BE_INDEX \ +} + #define be_const_real(_val) { \ bvaldata(breal(_val)), \ BE_REAL \ diff --git a/lib/libesp32/Berry/src/be_lexer.c b/lib/libesp32/Berry/src/be_lexer.c index af987113d..c4c736508 100644 --- a/lib/libesp32/Berry/src/be_lexer.c +++ b/lib/libesp32/Berry/src/be_lexer.c @@ -38,7 +38,7 @@ static const char* const kwords_tab[] = { ":", "?", "->", "if", "elif", "else", "while", "for", "def", "end", "class", "break", "continue", "return", "true", "false", "nil", "var", "do", - "import", "as", "try", "except", "raise" + "import", "as", "try", "except", "raise", "static" }; void be_lexerror(blexer *lexer, const char *msg) diff --git a/lib/libesp32/Berry/src/be_lexer.h b/lib/libesp32/Berry/src/be_lexer.h index 09090db6b..467070946 100644 --- a/lib/libesp32/Berry/src/be_lexer.h +++ b/lib/libesp32/Berry/src/be_lexer.h @@ -88,7 +88,8 @@ typedef enum { KeyAs, /* keyword as */ KeyTry, /* keyword try */ KeyExcept, /* keyword except */ - KeyRaise /* keyword raise */ + KeyRaise, /* keyword raise */ + KeyStatic /* keyword static */ } btokentype; struct blexerreader { diff --git a/lib/libesp32/Berry/src/be_object.c b/lib/libesp32/Berry/src/be_object.c index a0da81939..1162cdf8a 100644 --- a/lib/libesp32/Berry/src/be_object.c +++ b/lib/libesp32/Berry/src/be_object.c @@ -29,6 +29,7 @@ const char* be_vtype2str(bvalue *v) case BE_MAP: return "map"; case BE_INSTANCE: return "instance"; case BE_MODULE: return "module"; + case BE_INDEX: return "index"; default: return "invalid type"; } } diff --git a/lib/libesp32/Berry/src/be_object.h b/lib/libesp32/Berry/src/be_object.h index d465138ec..b98718c76 100644 --- a/lib/libesp32/Berry/src/be_object.h +++ b/lib/libesp32/Berry/src/be_object.h @@ -13,12 +13,13 @@ /* basic types, do not change value */ #define BE_NONE (-1) /* unknow type */ #define BE_COMPTR (-2) /* common pointer */ +#define BE_INDEX (-3) /* index for instance variable, previously BE_INT */ #define BE_NIL 0 #define BE_INT 1 #define BE_REAL 2 #define BE_BOOL 3 #define BE_FUNCTION 4 -#define BE_STRING 5 +#define BE_STRING 5 /* from this type can be gced, see BE_GCOBJECT */ #define BE_CLASS 6 #define BE_INSTANCE 7 #define BE_PROTO 8 @@ -207,6 +208,7 @@ typedef const char* (*breader)(void*, size_t*); #define var_islist(_v) var_istype(_v, BE_LIST) #define var_ismap(_v) var_istype(_v, BE_MAP) #define var_ismodule(_v) var_istype(_v, BE_MODULE) +#define var_isindex(_v) var_istype(_v, BE_INDEX) #define var_isnumber(_v) (var_isint(_v) || var_isreal(_v)) #define var_setnil(_v) var_settype(_v, BE_NIL) @@ -223,6 +225,7 @@ typedef const char* (*breader)(void*, size_t*); #define var_setlist(_v, _o) var_setobj(_v, BE_LIST, _o) #define var_setmap(_v, _o) var_setobj(_v, BE_MAP, _o) #define var_setmodule(_v, _o) var_setobj(_v, BE_MODULE, _o) +#define var_setindex(_v, _i) { var_settype(_v, BE_INDEX); (_v)->v.i = (_i); } #define var_setproto(_v, _o) var_setobj(_v, BE_PROTO, _o) #define var_tobool(_v) ((_v)->v.b) diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 62df59b85..744d9cecb 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -1208,7 +1208,7 @@ static void return_stmt(bparser *parser) static void check_class_attr(bparser *parser, bclass *c, bstring *attr) { - if (be_class_attribute(parser->vm, c, attr) != BE_NIL) { + if (be_class_attribute(parser->vm, c, attr) != BE_NONE) { push_error(parser, "redefinition of the attribute '%s'", str(attr)); } @@ -1221,11 +1221,11 @@ static void classvar_stmt(bparser *parser, bclass *c) scan_next_token(parser); /* skip 'var' */ if (match_id(parser, name) != NULL) { check_class_attr(parser, c, name); - be_member_bind(parser->vm, c, name); + be_member_bind(parser->vm, c, name, btrue); while (match_skip(parser, OptComma)) { /* ',' */ if (match_id(parser, name) != NULL) { check_class_attr(parser, c, name); - be_member_bind(parser->vm, c, name); + be_member_bind(parser->vm, c, name, btrue); } else { parser_error(parser, "class var error"); } @@ -1235,6 +1235,27 @@ static void classvar_stmt(bparser *parser, bclass *c) } } +static void classstatic_stmt(bparser *parser, bclass *c) +{ + bstring *name; + /* 'static' ID {',' ID} */ + scan_next_token(parser); /* skip 'static' */ + if (match_id(parser, name) != NULL) { + check_class_attr(parser, c, name); + be_member_bind(parser->vm, c, name, bfalse); + while (match_skip(parser, OptComma)) { /* ',' */ + if (match_id(parser, name) != NULL) { + check_class_attr(parser, c, name); + be_member_bind(parser->vm, c, name, bfalse); + } else { + parser_error(parser, "class static error"); + } + } + } else { + parser_error(parser, "class static error"); + } +} + static void classdef_stmt(bparser *parser, bclass *c) { bexpdesc e; @@ -1266,6 +1287,7 @@ static void class_block(bparser *parser, bclass *c) while (block_follow(parser)) { switch (next_type(parser)) { case KeyVar: classvar_stmt(parser, c); break; + case KeyStatic: classstatic_stmt(parser, c); break; case KeyDef: classdef_stmt(parser, c); break; case OptSemic: scan_next_token(parser); break; default: push_error(parser, diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index 03523c9a8..a6dec57ac 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -38,6 +38,7 @@ static const char * m_type_ktab(int type) switch (type){ case BE_NIL: return "BE_NIL"; case BE_INT: return "BE_INT"; + case BE_INDEX: return "BE_INDEX"; case BE_REAL: return "BE_REAL"; case BE_BOOL: return "BE_BOOL"; case BE_STRING: return "BE_STRING"; @@ -82,7 +83,7 @@ static void m_solidify_proto(bvm *vm, bproto *pr, const char * func_name, int bu logfmt("%*s%d, /* has constants */\n", indent, "", (pr->nconst > 0) ? 1 : 0); if (pr->nconst > 0) { - logfmt("%*s( &(const bvalue[%2d]) { /* upvals */\n", indent, "", pr->nconst); + logfmt("%*s( &(const bvalue[%2d]) { /* constants */\n", indent, "", pr->nconst); for (int k = 0; k < pr->nconst; k++) { int type = pr->ktab[k].type; const char *type_name = m_type_ktab(type); @@ -99,7 +100,7 @@ static void m_solidify_proto(bvm *vm, bproto *pr, const char * func_name, int bu be_raise(vm, "internal_error", "Strings greater than 255 chars not supported yet"); } logfmt("\", %i, %zu) }, %s},\n", be_strhash(pr->ktab[k].v.s), len >= 255 ? 255 : len, type_name); - } else if (type == BE_INT) { + } else if (type == BE_INT || type == BE_INDEX) { logfmt("%*s { { .i=%" BE_INT_FMTLEN "i }, %s},\n", indent, "", pr->ktab[k].v.i, type_name); } else if (type == BE_REAL) { #if BE_USE_SINGLE_FLOAT diff --git a/lib/libesp32/Berry/src/be_strlib.c b/lib/libesp32/Berry/src/be_strlib.c index 67cb528c3..4bef42d10 100644 --- a/lib/libesp32/Berry/src/be_strlib.c +++ b/lib/libesp32/Berry/src/be_strlib.c @@ -80,6 +80,7 @@ static bstring* sim2str(bvm *vm, bvalue *v) case BE_BOOL: strcpy(sbuf, var_tobool(v) ? "true" : "false"); break; + case BE_INDEX: case BE_INT: sprintf(sbuf, BE_INT_FORMAT, var_toint(v)); break; diff --git a/lib/libesp32/Berry/src/be_vm.c b/lib/libesp32/Berry/src/be_vm.c index 97fee645c..92604b6d4 100644 --- a/lib/libesp32/Berry/src/be_vm.c +++ b/lib/libesp32/Berry/src/be_vm.c @@ -228,7 +228,8 @@ static bbool obj2bool(bvm *vm, bvalue *var) binstance *obj = var_toobj(var); bstring *tobool = str_literal(vm, "tobool"); /* get operator method */ - if (be_instance_member(vm, obj, tobool, vm->top)) { + int type = be_instance_member(vm, obj, tobool, vm->top); + if (type != BE_NONE && type != BE_NIL) { vm->top[1] = *var; /* move self to argv[0] */ be_dofunc(vm, vm->top, 1); /* call method 'tobool' */ /* check the return value */ @@ -273,7 +274,7 @@ static int obj_attribute(bvm *vm, bvalue *o, bvalue *c, bvalue *dst) bstring *attr = var_tostr(c); binstance *obj = var_toobj(o); int type = be_instance_member(vm, obj, attr, dst); - if (basetype(type) == BE_NIL) { /* if no method found, try virtual */ + if (type == BE_NONE) { /* if no method found, try virtual */ /* get method 'member' */ int type2 = be_instance_member(vm, obj, str_literal(vm, "member"), vm->top); if (basetype(type2) == BE_FUNCTION) { @@ -287,7 +288,7 @@ static int obj_attribute(bvm *vm, bvalue *o, bvalue *c, bvalue *dst) type = var_type(dst); } } - if (basetype(type) == BE_NIL) { + if (type == BE_NONE) { vm_error(vm, "attribute_error", "the '%s' object has no attribute '%s'", str(be_instance_name(obj)), str(attr)); @@ -295,6 +296,19 @@ static int obj_attribute(bvm *vm, bvalue *o, bvalue *c, bvalue *dst) return type; } +static int class_attribute(bvm *vm, bvalue *o, bvalue *c, bvalue *dst) +{ + bstring *attr = var_tostr(c); + bclass *obj = var_toobj(o); + int type = be_class_member(vm, obj, attr, dst); + if (type == BE_NONE || type == BE_INDEX) { + vm_error(vm, "attribute_error", + "the '%s' class has no static attribute '%s'", + str(obj->name), str(attr)); + } + return type; +} + static bbool object_eqop(bvm *vm, const char *op, bbool iseq, bvalue *a, bvalue *b) { @@ -741,6 +755,9 @@ newframe: /* a new call frame */ if (var_isinstance(b) && var_isstr(c)) { obj_attribute(vm, b, c, a); reg = vm->reg; + } else if (var_isclass(b) && var_isstr(c)) { + class_attribute(vm, b, c, a); + reg = vm->reg; } else if (var_ismodule(b) && var_isstr(c)) { bstring *attr = var_tostr(c); bmodule *module = var_toobj(b); @@ -833,6 +850,16 @@ newframe: /* a new call frame */ } dispatch(); } + if (var_isclass(a) && var_isstr(b)) { + bclass *obj = var_toobj(a); + bstring *attr = var_tostr(b); + if (!be_class_setmember(vm, obj, attr, c)) { + vm_error(vm, "attribute_error", + "class '%s' cannot assign to static attribute '%s'", + str(be_class_name(obj)), str(attr)); + } + dispatch(); + } if (var_ismodule(a) && var_isstr(b)) { bmodule *obj = var_toobj(a); bstring *attr = var_tostr(b); diff --git a/lib/libesp32/Berry/tests/class_const.be b/lib/libesp32/Berry/tests/class_const.be new file mode 100644 index 000000000..a3abef400 --- /dev/null +++ b/lib/libesp32/Berry/tests/class_const.be @@ -0,0 +1,69 @@ +def assert_attribute_error(f) + try + f() + assert(false, 'unexpected execution flow') + except .. as e, m + assert(e == 'attribute_error') + end +end + +class A + static a + def init() self.b = 2 end + def f() end + var b + static c, s, r +end + +assert(A.a == nil) +assert(A.c == nil) +assert(A.s == nil) +assert_attribute_error(/-> A.b) +assert_attribute_error(/-> A.d) + +a = A() +assert(a.b == 2) +assert(a.a == nil) +assert(a.c == nil) + +A.a = 1 +A.c = 3 +A.s = "foo" +A.r = 3.5 +assert(a.a == 1) +assert(a.c == 3) +assert(A.a == 1) +assert(A.c == 3) +import gc gc.collect() +assert(A.s == "foo") +assert(a.s == "foo") +assert(A.r == 3.5) +assert(a.r == 3.5) + +#- test valid or invalid methods and members -# + +def assert_attribute_error(c) + try + compile(c)() + assert(false, 'unexpected execution flow') + except .. as e, m + assert(e == 'attribute_error') + end +end + +class A + var a, g + static h + def init() self.a = 1 end + def f(x, y) return type(self) end +end +a=A() +a.g = def (x, y) return type(x) end +A.h = def (x, y) return type(x) end + +assert(type(a.g) == 'function') +assert(type(a.h) == 'function') + +assert_attribute_error("a.g(1,2)") +assert(a.h(1) == 'instance') +# A.h(1) - error diff --git a/lib/libesp32/Berry/tools/coc/hash_map.cpp b/lib/libesp32/Berry/tools/coc/hash_map.cpp index 988b8a03a..e05ca4677 100755 --- a/lib/libesp32/Berry/tools/coc/hash_map.cpp +++ b/lib/libesp32/Berry/tools/coc/hash_map.cpp @@ -128,7 +128,7 @@ hash_map::entry hash_map::entry_modify(entry entry, int *var_count) { entry.key = coc::escape_operator(entry.key); if (entry.value == "var") { - entry.value = "be_const_int(" + entry.value = "be_const_var(" + std::to_string(*var_count) + ")"; ++(*var_count); } else { diff --git a/lib/libesp32/Berry/tools/coc/str_build.cpp b/lib/libesp32/Berry/tools/coc/str_build.cpp index affd5016e..ebc44301e 100644 --- a/lib/libesp32/Berry/tools/coc/str_build.cpp +++ b/lib/libesp32/Berry/tools/coc/str_build.cpp @@ -46,7 +46,7 @@ void str_build::keywords() { "var", opif + 14 }, { "do", opif + 15 }, { "import", opif + 16 }, { "as", opif + 17 }, { "try", opif + 18 }, { "except", opif + 19 }, - { "raise", opif + 20 } + { "raise", opif + 20 }, { "static", opif + 21 } }; for (auto it : tab) { make_ceil(it.first, it.second); From ea65fa91644992d6e1f938bd308d1816450026fc Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Mon, 19 Jul 2021 13:57:32 -0300 Subject: [PATCH 009/148] Updated Spanish Translation --- tasmota/language/es_ES.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index cc5afd018..22ff7fe0e 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -1,5 +1,5 @@ /* - es-ES.h - localization for Spanish - Spain for Tasmota (International Spanish valid for all latinamerica) + es-ES.h - Tasmota localization for Spanish (International Spanish valid for all latinamerica) Copyright (C) 2021 Adrian Scillato @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 + * Updated until v9.5.0.3 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -194,7 +194,7 @@ #define D_UV_POWER "UV Power" #define D_VERSION "Versión" #define D_VOLTAGE "Tensión" -#define D_VOLUME "Volume" +#define D_VOLUME "Volumen" #define D_WEIGHT "Peso" #define D_WARMLIGHT "Cálida" #define D_WEB_SERVER "Servidor Web" From 2a9d80bea23eae248829e932400a37b103735e57 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <39969427+ascillato2@users.noreply.github.com> Date: Mon, 19 Jul 2021 13:59:56 -0300 Subject: [PATCH 010/148] Update IT-Localization File version --- tasmota/language/it_IT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index b149df380..c0e748418 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 19.07.2021 + * Updated until v9.5.0.3 - Last update 19.07.2021 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) From e0000c7f8a13f6b9cd9d2e4ce9940e22200f1856 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <39969427+ascillato2@users.noreply.github.com> Date: Mon, 19 Jul 2021 14:01:42 -0300 Subject: [PATCH 011/148] Update DE-Localization File Version --- tasmota/language/de_DE.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 672d8f235..388abd2f2 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -1,7 +1,7 @@ /* de-DE.h - localization for German - Germany for Tasmota - Copyright (C) 2021 VinceMasuka + Copyright (C) 2021 VinceMasuka and Jason2866 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.3.1.3 + * Updated until v9.5.0.3 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) From c06dfc428d79d038d4a1586f5f671d1be8a78933 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Mon, 19 Jul 2021 14:06:11 -0300 Subject: [PATCH 012/148] Update Portuguese-PT Translation --- tasmota/language/pt_PT.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index df17497a6..2f467be6b 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 + * Updated until v9.5.0.3 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -198,8 +198,8 @@ #define D_WEIGHT "Peso" #define D_WARMLIGHT "Luz Quente" #define D_WEB_SERVER "Servidor WEB" -#define D_SOC "State of Charge" -#define D_SOH "State of Health" +#define D_SOC "Estado de Carga" +#define D_SOH "Estado de Saúde" // tasmota.ino #define D_WARNING_MINIMAL_VERSION "AVISO esta versão não supporta configurações persistentes" From 81a845d9321b2fc1c8cc3fc36c58788be15b8e54 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Mon, 19 Jul 2021 14:06:35 -0300 Subject: [PATCH 013/148] Update Portuguese-BR Translation --- tasmota/language/pt_BR.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 0233c77b3..156ce5a8e 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 + * Updated until v9.5.0.3 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -198,8 +198,8 @@ #define D_WEIGHT "Peso" #define D_WARMLIGHT "Luz quente" #define D_WEB_SERVER "Servidor WEB" -#define D_SOC "State of Charge" -#define D_SOH "State of Health" +#define D_SOC "Estado de Carga" +#define D_SOH "Estado de Saúde" // tasmota.ino #define D_WARNING_MINIMAL_VERSION "AVISO: esta versão não supporta configurações persistentes" From c73bb9953adb41c7ab059258cdfcf589bce86215 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Mon, 19 Jul 2021 14:24:53 -0300 Subject: [PATCH 014/148] LOG: Increase readability of project name and device name --- tasmota/tasmota.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 721770637..ecf78f0a0 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -1,5 +1,5 @@ /* - tasmota.ino - Tasmota firmware for iTead Sonoff, Wemos and NodeMCU hardware + tasmota.ino - Tasmota firmware for iTead Sonoff, Wemos, NodeMCU, ESP8266 and ESP32 hardwares Copyright (C) 2021 Theo Arends @@ -398,7 +398,7 @@ void setup(void) { SetPowerOnState(); WifiConnect(); - AddLog(LOG_LEVEL_INFO, PSTR(D_PROJECT " %s %s " D_VERSION " %s%s-" ARDUINO_CORE_RELEASE "(%s)"), + AddLog(LOG_LEVEL_INFO, PSTR(D_PROJECT " %s - %s " D_VERSION " %s%s-" ARDUINO_CORE_RELEASE "(%s)"), PSTR(PROJECT), SettingsText(SET_DEVICENAME), TasmotaGlobal.version, TasmotaGlobal.image_name, GetBuildDateAndTime().c_str()); #ifdef FIRMWARE_MINIMAL AddLog(LOG_LEVEL_INFO, PSTR(D_WARNING_MINIMAL_VERSION)); From 7035bacc09744396e3d1674cfcb547d4f505f51e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 20 Jul 2021 14:37:15 +0200 Subject: [PATCH 015/148] Fix SD memory leak --- platformio_tasmota_cenv_sample.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index c90503726..d5286bb6c 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -32,7 +32,7 @@ build_flags = ${esp32_defaults.build_flags} extends = env:tasmota32_base board = esp32s2 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/340/framework-arduinoespressif32-master-caf43f7e9.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/349/framework-arduinoespressif32-master-caf43f7e9.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} -DFIRMWARE_LITE @@ -48,7 +48,7 @@ lib_ignore = extends = env:tasmota32_base board = esp32c3 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/340/framework-arduinoespressif32-master-caf43f7e9.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/349/framework-arduinoespressif32-master-caf43f7e9.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable @@ -71,7 +71,7 @@ lib_ignore = [env:tasmota32idf4] extends = env:tasmota32_base platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/340/framework-arduinoespressif32-master-caf43f7e9.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/349/framework-arduinoespressif32-master-caf43f7e9.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable From 517499b90a1f3fe9dc8b10a49595ff29ae68a1ee Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 20 Jul 2021 16:44:17 +0200 Subject: [PATCH 016/148] Solo1 OTA wdt fix --- platformio_tasmota_env32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index fe9af2ce2..6145ec8ae 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -50,7 +50,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 [env:tasmota32solo1] extends = env:tasmota32_base -platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.2/tasmota-arduinoespressif32-solo1-release_v3.3.5.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.3/tasmota-arduinoespressif32-solo1-release_v3.3.5.tar.gz platformio/tool-esptoolpy @ ~1.30100 platformio/tool-mklittlefs @ ~1.203.200522 build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 From 84e58739a0abcf3df7c6bf3849a22ed600d9c4ed Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 20 Jul 2021 21:05:10 +0200 Subject: [PATCH 017/148] Berry add support for I2S audio mp3 playback --- CHANGELOG.md | 1 + lib/libesp32/Berry/default/be_driverlib.c | 2 + lib/libesp32/Berry/default/be_gpio_lib.c | 26 +- lib/libesp32/Berry/default/be_i2s_audio_lib.c | 98 + lib/libesp32/Berry/default/be_modtab.c | 7 + lib/libesp32/Berry/default/be_tasmotalib.c | 371 ++-- .../Berry/default/embedded/Tasmota.be | 4 +- lib/libesp32/Berry/generate/be_const_strtab.h | 1280 +++++------ .../Berry/generate/be_const_strtab_def.h | 1881 +++++++++-------- .../be_fixed_be_class_audio_file_source.h | 17 + .../be_fixed_be_class_audio_file_source_fs.h | 19 + .../be_fixed_be_class_audio_generator.h | 17 + .../be_fixed_be_class_audio_generator_mp3.h | 23 + .../generate/be_fixed_be_class_audio_output.h | 17 + .../be_fixed_be_class_audio_output_i2s.h | 19 + .../Berry/generate/be_fixed_be_class_bytes.h | 2 +- .../Berry/generate/be_fixed_be_class_list.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_arc.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_bar.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_btn.h | 2 +- .../generate/be_fixed_be_class_lv_btnmatrix.h | 2 +- .../generate/be_fixed_be_class_lv_calendar.h | 2 +- .../generate/be_fixed_be_class_lv_canvas.h | 2 +- .../generate/be_fixed_be_class_lv_chart.h | 2 +- .../generate/be_fixed_be_class_lv_checkbox.h | 2 +- .../generate/be_fixed_be_class_lv_color.h | 2 +- .../generate/be_fixed_be_class_lv_cont.h | 2 +- .../generate/be_fixed_be_class_lv_cpicker.h | 2 +- .../generate/be_fixed_be_class_lv_ctypes.h | 2 +- .../generate/be_fixed_be_class_lv_dropdown.h | 2 +- .../generate/be_fixed_be_class_lv_font.h | 2 +- .../generate/be_fixed_be_class_lv_gauge.h | 2 +- .../generate/be_fixed_be_class_lv_group.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_img.h | 2 +- .../generate/be_fixed_be_class_lv_imgbtn.h | 2 +- .../generate/be_fixed_be_class_lv_indev.h | 2 +- .../generate/be_fixed_be_class_lv_keyboard.h | 2 +- .../generate/be_fixed_be_class_lv_label.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_led.h | 2 +- .../generate/be_fixed_be_class_lv_line.h | 2 +- .../generate/be_fixed_be_class_lv_linemeter.h | 2 +- .../generate/be_fixed_be_class_lv_list.h | 2 +- .../generate/be_fixed_be_class_lv_msgbox.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_obj.h | 2 +- .../generate/be_fixed_be_class_lv_objmask.h | 2 +- .../generate/be_fixed_be_class_lv_page.h | 2 +- .../generate/be_fixed_be_class_lv_roller.h | 2 +- .../generate/be_fixed_be_class_lv_slider.h | 2 +- .../generate/be_fixed_be_class_lv_spinbox.h | 2 +- .../generate/be_fixed_be_class_lv_spinner.h | 2 +- .../generate/be_fixed_be_class_lv_style.h | 2 +- .../generate/be_fixed_be_class_lv_switch.h | 2 +- .../generate/be_fixed_be_class_lv_table.h | 2 +- .../generate/be_fixed_be_class_lv_tabview.h | 2 +- .../generate/be_fixed_be_class_lv_textarea.h | 2 +- .../generate/be_fixed_be_class_lv_tileview.h | 2 +- .../Berry/generate/be_fixed_be_class_lv_win.h | 2 +- .../Berry/generate/be_fixed_be_class_map.h | 2 +- .../Berry/generate/be_fixed_be_class_md5.h | 2 +- .../Berry/generate/be_fixed_be_class_range.h | 4 +- .../generate/be_fixed_be_class_tasmota.h | 14 +- .../be_fixed_be_class_tasmota_driver.h | 33 +- .../be_fixed_be_class_tasmota_i2c_driver.h | 6 +- .../generate/be_fixed_be_class_tasmota_wire.h | 2 +- .../Berry/generate/be_fixed_be_lvgl_cb.h | 2 +- lib/libesp32/Berry/generate/be_fixed_gpio.h | 518 ++--- lib/libesp32/Berry/src/be_constobj.h | 69 +- lib/libesp32/Berry/src/be_parser.c | 28 +- lib/libesp32/Berry/src/be_solidifylib.c | 152 +- lib/libesp32/Berry/tools/coc/hash_map.cpp | 2 +- tasmota/xdrv_52_3_berry_audio.ino | 185 ++ 71 files changed, 2775 insertions(+), 2110 deletions(-) create mode 100644 lib/libesp32/Berry/default/be_i2s_audio_lib.c create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source.h create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator.h create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_output.h create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h create mode 100644 tasmota/xdrv_52_3_berry_audio.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index 17fb77879..c775e9a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout (#12651) - Disable PSRAM on unsupported hardware +- Berry add support for I2S audio mp3 playback ## [9.5.0.2] 20210714 ### Added diff --git a/lib/libesp32/Berry/default/be_driverlib.c b/lib/libesp32/Berry/default/be_driverlib.c index e8ff3a74c..a62a53805 100644 --- a/lib/libesp32/Berry/default/be_driverlib.c +++ b/lib/libesp32/Berry/default/be_driverlib.c @@ -125,6 +125,7 @@ void be_load_driverlib(bvm *vm) { #if !BE_USE_PRECOMPILED_OBJECT static const bnfuncinfo members[] = { { "every_second", NULL }, + { "every_50ms", NULL }, { "every_100ms", NULL }, { "web_add_handler", NULL }, { "web_add_button", NULL }, @@ -155,6 +156,7 @@ void be_load_driverlib(bvm *vm) { class be_class_tasmota_driver (scope: global, name: Driver) { every_second, var + every_50ms, var every_100ms, var web_add_handler, var web_add_button, var diff --git a/lib/libesp32/Berry/default/be_gpio_lib.c b/lib/libesp32/Berry/default/be_gpio_lib.c index d2c9bf8db..045fbd23e 100644 --- a/lib/libesp32/Berry/default/be_gpio_lib.c +++ b/lib/libesp32/Berry/default/be_gpio_lib.c @@ -275,7 +275,18 @@ be_native_module_attr_table(gpio) { be_native_module_int("HALLEFFECT", 237), be_native_module_int("EPD_DATA", 238), be_native_module_int("INPUT", 239), - be_native_module_int("SENSOR_END", 240), + be_native_module_int("KEY1_PD", 240), + be_native_module_int("KEY1_INV_PD", 241), + be_native_module_int("SWT1_PD", 242), + be_native_module_int("I2S_OUT_DATA", 243), + be_native_module_int("I2S_OUT_CLK", 244), + be_native_module_int("I2S_OUT_SLCT", 245), + be_native_module_int("I2S_IN_DATA", 246), + be_native_module_int("I2S_IN_CLK", 247), + be_native_module_int("I2S_IN_SLCT", 248), + be_native_module_int("INTERRUPT", 249), + + be_native_module_int("SENSOR_END", 250), be_native_module_function("pin_mode", gp_pin_mode), be_native_module_function("digital_write", gp_digital_write), @@ -546,7 +557,18 @@ module gpio (scope: global) { HALLEFFECT, int(237) EPD_DATA, int(238) INPUT, int(239) - SENSOR_END, int(240) + KEY1_PD, int(240) + KEY1_INV_PD, int(241) + SWT1_PD, int(242) + I2S_OUT_DATA, int(243) + I2S_OUT_CLK, int(244) + I2S_OUT_SLCT, int(245) + I2S_IN_DATA, int(246) + I2S_IN_CLK, int(247) + I2S_IN_SLCT, int(248) + INTERRUPT, int(249) + + SENSOR_END, int(250) pin_mode, func(gp_pin_mode) digital_write, func(gp_digital_write) diff --git a/lib/libesp32/Berry/default/be_i2s_audio_lib.c b/lib/libesp32/Berry/default/be_i2s_audio_lib.c new file mode 100644 index 000000000..fb08e66b0 --- /dev/null +++ b/lib/libesp32/Berry/default/be_i2s_audio_lib.c @@ -0,0 +1,98 @@ +/******************************************************************** + * Tasmota I2S audio classes + * + * + *******************************************************************/ +#include "be_constobj.h" + +#ifdef USE_I2S +#ifdef USE_I2S_AUDIO_BERRY + +// extern bclass* be_class_tasmota_driver; // Parent class + + +extern int i2s_output_i2s_init(bvm *vm); +extern int i2s_output_i2s_deinit(bvm *vm); + +extern int i2s_generator_mp3_init(bvm *vm); +extern int i2s_generator_mp3_deinit(bvm *vm); +extern int i2s_generator_mp3_begin(bvm *vm); +extern int i2s_generator_mp3_loop(bvm *vm); +extern int i2s_generator_mp3_stop(bvm *vm); +extern int i2s_generator_mp3_isrunning(bvm *vm); + +#ifdef USE_UFILESYS +extern int i2s_file_source_fs_init(bvm *vm); +extern int i2s_file_source_fs_deinit(bvm *vm); +#endif // USE_UFILESYS + + +#if BE_USE_PRECOMPILED_OBJECT +#include "../generate/be_fixed_be_class_audio_output.h" +#include "../generate/be_fixed_be_class_audio_output_i2s.h" +#include "../generate/be_fixed_be_class_audio_generator.h" +#include "../generate/be_fixed_be_class_audio_generator_mp3.h" +#include "../generate/be_fixed_be_class_audio_file_source.h" +#include "../generate/be_fixed_be_class_audio_file_source_fs.h" +#endif + +void be_load_driver_audio_lib(bvm *vm) { + be_pushntvclass(vm, &be_class_audio_output); + be_setglobal(vm, "AudioOutput"); + be_pop(vm, 1); + + be_pushntvclass(vm, &be_class_audio_output_i2s); + be_setglobal(vm, "AudioOutputI2S"); + be_pop(vm, 1); + + be_pushntvclass(vm, &be_class_audio_generator_mp3); + be_setglobal(vm, "AudioGeneratorMP3"); + be_pop(vm, 1); + +#ifdef USE_UFILESYS + be_pushntvclass(vm, &be_class_audio_file_source_fs); + be_setglobal(vm, "AudioFileSourceFS"); + be_pop(vm, 1); +#endif // USE_UFILESYS +} + +/* @const_object_info_begin + +class be_class_audio_output (scope: global, name: AudioOutput) { + .p, var +} + +class be_class_audio_generator (scope: global, name: AudioGenerator) { + .p, var +} + +class be_class_audio_file_source (scope: global, name: AudioFileSource) { + .p, var +} + +class be_class_audio_output_i2s (scope: global, name: AudioOutputI2S, super: be_class_audio_output) { + init, func(i2s_output_i2s_init) + deinit, func(i2s_output_i2s_deinit) + close, func(i2s_output_i2s_deinit) +} + +class be_class_audio_generator_mp3 (scope: global, name: AudioGeneratorMP3, super: be_class_audio_generator) { + init, func(i2s_generator_mp3_init) + deinit, func(i2s_generator_mp3_deinit) + close, func(i2s_generator_mp3_deinit) + begin, func(i2s_generator_mp3_begin) + loop, func(i2s_generator_mp3_loop) + stop, func(i2s_generator_mp3_stop) + isrunning, func(i2s_generator_mp3_isrunning) +} + +class be_class_audio_file_source_fs (scope: global, name: AudioFileSourceFS, super: be_class_audio_file_source) { + init, func(i2s_file_source_fs_init) + deinit, func(i2s_file_source_fs_deinit) + close, func(i2s_file_source_fs_deinit) +} + +@const_object_info_end */ + +#endif // USE_I2S_AUDIO_BERRY +#endif // USE_I2S \ No newline at end of file diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index 42ef74c7f..1654aa804 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -100,6 +100,10 @@ extern void be_load_driverlib(bvm *vm); extern void be_load_driver_i2c_lib(bvm *vm); extern void be_load_md5_lib(bvm *vm); +#ifdef USE_I2S_AUDIO_BERRY +extern void be_load_driver_audio_lib(bvm *vm); +#endif + #ifdef USE_LVGL extern void be_load_lvgl_color_lib(bvm *vm); extern void be_load_lvgl_font_lib(bvm *vm); @@ -126,6 +130,9 @@ BERRY_API void be_load_custom_libs(bvm *vm) be_load_wirelib(vm); be_load_driver_i2c_lib(vm); #endif // USE_I2C +#ifdef USE_I2S_AUDIO_BERRY + be_load_driver_audio_lib(vm); +#endif #ifdef USE_LVGL // LVGL be_load_lvgl_color_lib(vm); diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index f0268439e..5bff80d4f 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -1368,193 +1368,200 @@ be_local_closure(event, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* upvals */ - { { .s=be_nested_const_str("cmd", -158181397, 3) }, BE_STRING}, - { { .s=be_nested_const_str("exec_cmd", 493567399, 8) }, BE_STRING}, - { { .s=be_nested_const_str("rule", -64077613, 4) }, BE_STRING}, - { { .s=be_nested_const_str("exec_rules", 1445221092, 10) }, BE_STRING}, - { { .s=be_nested_const_str("mqtt_data", -1756753932, 9) }, BE_STRING}, - { { .s=be_nested_const_str("gc", 1042313471, 2) }, BE_STRING}, - { { .s=be_nested_const_str("every_50ms", -1911083288, 10) }, BE_STRING}, - { { .s=be_nested_const_str("run_deferred", 371594696, 12) }, BE_STRING}, - { { .s=be_nested_const_str("_drivers", -1034638311, 8) }, BE_STRING}, - { { .s=be_nested_const_str("every_second", 2075451465, 12) }, BE_STRING}, - { { .s=be_nested_const_str("every_100ms", 1546407804, 11) }, BE_STRING}, - { { .s=be_nested_const_str("web_add_button", -757092238, 14) }, BE_STRING}, - { { .s=be_nested_const_str("web_add_main_button", -334599632, 19) }, BE_STRING}, - { { .s=be_nested_const_str("web_add_management_button", -1556090110, 25) }, BE_STRING}, - { { .s=be_nested_const_str("web_add_config_button", 639674325, 21) }, BE_STRING}, - { { .s=be_nested_const_str("web_add_console_button", -813531104, 22) }, BE_STRING}, - { { .s=be_nested_const_str("save_before_restart", 1253239338, 19) }, BE_STRING}, - { { .s=be_nested_const_str("web_add_handler", -304792334, 15) }, BE_STRING}, - { { .s=be_nested_const_str("web_sensor", -1394870324, 10) }, BE_STRING}, - { { .s=be_nested_const_str("json_append", -1292948012, 11) }, BE_STRING}, - { { .s=be_nested_const_str("button_pressed", 1694209616, 14) }, BE_STRING}, - { { .s=be_nested_const_str("button_preselif", 491115394, 15) }, BE_STRING}, - { { .s=be_nested_const_str("display", 1164572437, 7) }, BE_STRING}, - { { .s=be_nested_const_str("string", 398550328, 6) }, BE_STRING}, - { { .s=be_nested_const_str("log", 1062293841, 3) }, BE_STRING}, - { { .s=be_nested_const_str("format", -1180859054, 6) }, BE_STRING}, - { { .s=be_nested_const_str("BRY: exception %s - %m", -1290966132, 22) }, BE_STRING}, - { { .i=3 }, BE_INT}, - { { .s=be_nested_const_str("stop_iteration", -121173395, 14) }, BE_STRING}, + ( &(const bvalue[26]) { /* constants */ + be_nested_string("every_50ms", -1911083288, 10), + be_nested_string("run_deferred", 371594696, 12), + be_nested_string("cmd", -158181397, 3), + be_nested_string("exec_cmd", 493567399, 8), + be_nested_string("rule", -64077613, 4), + be_nested_string("exec_rules", 1445221092, 10), + be_nested_string("mqtt_data", -1756753932, 9), + be_nested_string("gc", 1042313471, 2), + be_nested_string("_drivers", -1034638311, 8), + be_nested_string("every_second", 2075451465, 12), + be_nested_string("every_100ms", 1546407804, 11), + be_nested_string("web_add_button", -757092238, 14), + be_nested_string("web_add_main_button", -334599632, 19), + be_nested_string("web_add_management_button", -1556090110, 25), + be_nested_string("web_add_config_button", 639674325, 21), + be_nested_string("web_add_console_button", -813531104, 22), + be_nested_string("save_before_restart", 1253239338, 19), + be_nested_string("web_add_handler", -304792334, 15), + be_nested_string("web_sensor", -1394870324, 10), + be_nested_string("json_append", -1292948012, 11), + be_nested_string("button_pressed", 1694209616, 14), + be_nested_string("display", 1164572437, 7), + be_nested_string("string", 398550328, 6), + be_nested_string("format", -1180859054, 6), + be_nested_string("BRY: Exception> '%s' - %s", -2047976332, 25), + be_nested_string("stop_iteration", -121173395, 14), }), (be_nested_const_str("event", -30355297, 5)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[153]) { /* code */ + ( &(const binstruction[163]) { /* code */ 0x1C140300, // 0000 EQ R5 R1 R256 - 0x78160006, // 0001 JMPF R5 #0009 + 0x78160001, // 0001 JMPF R5 #0004 0x8C140101, // 0002 GETMET R5 R0 R257 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x5C240800, // 0005 MOVE R9 R4 - 0x7C140800, // 0006 CALL R5 4 - 0x80040A00, // 0007 RET 1 R5 - 0x7002008E, // 0008 JMP #0098 - 0x1C140302, // 0009 EQ R5 R1 R258 - 0x78160004, // 000A JMPF R5 #0010 - 0x8C140103, // 000B GETMET R5 R0 R259 - 0x5C1C0800, // 000C MOVE R7 R4 - 0x7C140400, // 000D CALL R5 2 - 0x80040A00, // 000E RET 1 R5 - 0x70020087, // 000F JMP #0098 - 0x1C140304, // 0010 EQ R5 R1 R260 - 0x78160002, // 0011 JMPF R5 #0015 - 0x4C140000, // 0012 LDNIL 5 - 0x80040A00, // 0013 RET 1 R5 - 0x70020082, // 0014 JMP #0098 - 0x1C140305, // 0015 EQ R5 R1 R261 - 0x78160003, // 0016 JMPF R5 #001B - 0x8C140105, // 0017 GETMET R5 R0 R261 - 0x7C140200, // 0018 CALL R5 1 - 0x80040A00, // 0019 RET 1 R5 - 0x7002007C, // 001A JMP #0098 - 0x1C140306, // 001B EQ R5 R1 R262 - 0x78160003, // 001C JMPF R5 #0021 - 0x8C140107, // 001D GETMET R5 R0 R263 - 0x7C140200, // 001E CALL R5 1 - 0x80040A00, // 001F RET 1 R5 - 0x70020076, // 0020 JMP #0098 - 0x88140108, // 0021 GETMBR R5 R0 R264 - 0x78160074, // 0022 JMPF R5 #0098 - 0x60140000, // 0023 GETGBL R5 G0 - 0x88180108, // 0024 GETMBR R6 R0 R264 - 0x7C140200, // 0025 CALL R5 1 - 0xA802006D, // 0026 EXBLK 0 #0095 - 0x5C180A00, // 0027 MOVE R6 R5 - 0x7C180000, // 0028 CALL R6 0 - 0xA802005E, // 0029 EXBLK 0 #0089 - 0x1C1C0309, // 002A EQ R7 R1 R265 - 0x781E0004, // 002B JMPF R7 #0031 - 0x881C0D09, // 002C GETMBR R7 R6 R265 - 0x781E0002, // 002D JMPF R7 #0031 - 0x8C1C0D09, // 002E GETMET R7 R6 R265 - 0x7C1C0200, // 002F CALL R7 1 - 0x70020055, // 0030 JMP #0087 - 0x1C1C030A, // 0031 EQ R7 R1 R266 - 0x781E0004, // 0032 JMPF R7 #0038 - 0x881C0D0A, // 0033 GETMBR R7 R6 R266 - 0x781E0002, // 0034 JMPF R7 #0038 - 0x8C1C0D0A, // 0035 GETMET R7 R6 R266 - 0x7C1C0200, // 0036 CALL R7 1 - 0x7002004E, // 0037 JMP #0087 - 0x1C1C030B, // 0038 EQ R7 R1 R267 - 0x781E0004, // 0039 JMPF R7 #003F - 0x881C0D0B, // 003A GETMBR R7 R6 R267 - 0x781E0002, // 003B JMPF R7 #003F - 0x8C1C0D0B, // 003C GETMET R7 R6 R267 - 0x7C1C0200, // 003D CALL R7 1 - 0x70020047, // 003E JMP #0087 - 0x1C1C030C, // 003F EQ R7 R1 R268 - 0x781E0004, // 0040 JMPF R7 #0046 - 0x881C0D0C, // 0041 GETMBR R7 R6 R268 - 0x781E0002, // 0042 JMPF R7 #0046 - 0x8C1C0D0C, // 0043 GETMET R7 R6 R268 - 0x7C1C0200, // 0044 CALL R7 1 - 0x70020040, // 0045 JMP #0087 - 0x1C1C030D, // 0046 EQ R7 R1 R269 - 0x781E0004, // 0047 JMPF R7 #004D - 0x881C0D0D, // 0048 GETMBR R7 R6 R269 - 0x781E0002, // 0049 JMPF R7 #004D - 0x8C1C0D0D, // 004A GETMET R7 R6 R269 - 0x7C1C0200, // 004B CALL R7 1 - 0x70020039, // 004C JMP #0087 - 0x1C1C030E, // 004D EQ R7 R1 R270 - 0x781E0004, // 004E JMPF R7 #0054 - 0x881C0D0E, // 004F GETMBR R7 R6 R270 - 0x781E0002, // 0050 JMPF R7 #0054 - 0x8C1C0D0E, // 0051 GETMET R7 R6 R270 - 0x7C1C0200, // 0052 CALL R7 1 - 0x70020032, // 0053 JMP #0087 - 0x1C1C030F, // 0054 EQ R7 R1 R271 - 0x781E0004, // 0055 JMPF R7 #005B - 0x881C0D0F, // 0056 GETMBR R7 R6 R271 - 0x781E0002, // 0057 JMPF R7 #005B - 0x8C1C0D0F, // 0058 GETMET R7 R6 R271 - 0x7C1C0200, // 0059 CALL R7 1 - 0x7002002B, // 005A JMP #0087 - 0x1C1C0310, // 005B EQ R7 R1 R272 - 0x781E0004, // 005C JMPF R7 #0062 - 0x881C0D10, // 005D GETMBR R7 R6 R272 - 0x781E0002, // 005E JMPF R7 #0062 - 0x8C1C0D10, // 005F GETMET R7 R6 R272 - 0x7C1C0200, // 0060 CALL R7 1 - 0x70020024, // 0061 JMP #0087 - 0x1C1C0311, // 0062 EQ R7 R1 R273 - 0x781E0004, // 0063 JMPF R7 #0069 - 0x881C0D11, // 0064 GETMBR R7 R6 R273 - 0x781E0002, // 0065 JMPF R7 #0069 - 0x8C1C0D11, // 0066 GETMET R7 R6 R273 - 0x7C1C0200, // 0067 CALL R7 1 - 0x7002001D, // 0068 JMP #0087 - 0x1C1C0312, // 0069 EQ R7 R1 R274 - 0x781E0004, // 006A JMPF R7 #0070 - 0x881C0D12, // 006B GETMBR R7 R6 R274 - 0x781E0002, // 006C JMPF R7 #0070 - 0x8C1C0D12, // 006D GETMET R7 R6 R274 - 0x7C1C0200, // 006E CALL R7 1 - 0x70020016, // 006F JMP #0087 - 0x1C1C0313, // 0070 EQ R7 R1 R275 - 0x781E0004, // 0071 JMPF R7 #0077 - 0x881C0D13, // 0072 GETMBR R7 R6 R275 - 0x781E0002, // 0073 JMPF R7 #0077 - 0x8C1C0D13, // 0074 GETMET R7 R6 R275 - 0x7C1C0200, // 0075 CALL R7 1 - 0x7002000F, // 0076 JMP #0087 - 0x1C1C0314, // 0077 EQ R7 R1 R276 - 0x781E0007, // 0078 JMPF R7 #0081 - 0x881C0D14, // 0079 GETMBR R7 R6 R276 - 0x781E0005, // 007A JMPF R7 #0081 - 0x1C1C0311, // 007B EQ R7 R1 R273 - 0x781DFFFE, // 007C JMPF R7 #007C - 0x881C0D16, // 007D GETMBR R7 R6 R278 - 0x8C1C0D16, // 007E GETMET R7 R6 R278 - 0x7C1C0200, // 007F CALL R7 1 - 0x70020005, // 0080 JMP #0087 - 0x1C1C0316, // 0081 EQ R7 R1 R278 - 0x781E0003, // 0082 JMPF R7 #0087 - 0x881C0D16, // 0083 GETMBR R7 R6 R278 - 0x781E0001, // 0084 JMPF R7 #0087 - 0x8C1C0D16, // 0085 GETMET R7 R6 R278 - 0x7C1C0200, // 0086 CALL R7 1 - 0xA8040001, // 0087 EXBLK 1 1 - 0x7002000A, // 0088 JMP #0094 - 0xAC1C0002, // 0089 CATCH R7 0 2 - 0x70020007, // 008A JMP #0093 - 0xA4262E00, // 008B IMPORT R9 R279 - 0x8C280118, // 008C GETMET R10 R0 R280 - 0x8C301319, // 008D GETMET R12 R9 R281 - 0x5838001A, // 008E LDCONST R14 K26 - 0x583C001B, // 008F LDCONST R15 K27 - 0x7C300600, // 0090 CALL R12 3 - 0x7C280400, // 0091 CALL R10 2 - 0x70020000, // 0092 JMP #0094 - 0xB0080000, // 0093 RAISE 2 R0 R0 - 0x7001FF91, // 0094 JMP #0027 - 0x5814001C, // 0095 LDCONST R5 K28 - 0xAC140200, // 0096 CATCH R5 1 0 - 0xB0080000, // 0097 RAISE 2 R0 R0 - 0x80000000, // 0098 RET 0 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x1C140302, // 0004 EQ R5 R1 R258 + 0x78160006, // 0005 JMPF R5 #000D + 0x8C140103, // 0006 GETMET R5 R0 R259 + 0x5C1C0400, // 0007 MOVE R7 R2 + 0x5C200600, // 0008 MOVE R8 R3 + 0x5C240800, // 0009 MOVE R9 R4 + 0x7C140800, // 000A CALL R5 4 + 0x80040A00, // 000B RET 1 R5 + 0x70020094, // 000C JMP #00A2 + 0x1C140304, // 000D EQ R5 R1 R260 + 0x78160004, // 000E JMPF R5 #0014 + 0x8C140105, // 000F GETMET R5 R0 R261 + 0x5C1C0800, // 0010 MOVE R7 R4 + 0x7C140400, // 0011 CALL R5 2 + 0x80040A00, // 0012 RET 1 R5 + 0x7002008D, // 0013 JMP #00A2 + 0x1C140306, // 0014 EQ R5 R1 R262 + 0x78160002, // 0015 JMPF R5 #0019 + 0x4C140000, // 0016 LDNIL 5 + 0x80040A00, // 0017 RET 1 R5 + 0x70020088, // 0018 JMP #00A2 + 0x1C140307, // 0019 EQ R5 R1 R263 + 0x78160003, // 001A JMPF R5 #001F + 0x8C140107, // 001B GETMET R5 R0 R263 + 0x7C140200, // 001C CALL R5 1 + 0x80040A00, // 001D RET 1 R5 + 0x70020082, // 001E JMP #00A2 + 0x88140108, // 001F GETMBR R5 R0 R264 + 0x78160080, // 0020 JMPF R5 #00A2 + 0x60140000, // 0021 GETGBL R5 G0 + 0x88180108, // 0022 GETMBR R6 R0 R264 + 0x7C140200, // 0023 CALL R5 1 + 0xA8020079, // 0024 EXBLK 0 #009F + 0x5C180A00, // 0025 MOVE R6 R5 + 0x7C180000, // 0026 CALL R6 0 + 0xA8020069, // 0027 EXBLK 0 #0092 + 0x1C1C0309, // 0028 EQ R7 R1 R265 + 0x781E0004, // 0029 JMPF R7 #002F + 0x881C0D09, // 002A GETMBR R7 R6 R265 + 0x781E0002, // 002B JMPF R7 #002F + 0x8C1C0D09, // 002C GETMET R7 R6 R265 + 0x7C1C0200, // 002D CALL R7 1 + 0x70020060, // 002E JMP #0090 + 0x1C1C0300, // 002F EQ R7 R1 R256 + 0x781E0004, // 0030 JMPF R7 #0036 + 0x881C0D00, // 0031 GETMBR R7 R6 R256 + 0x781E0002, // 0032 JMPF R7 #0036 + 0x8C1C0D00, // 0033 GETMET R7 R6 R256 + 0x7C1C0200, // 0034 CALL R7 1 + 0x70020059, // 0035 JMP #0090 + 0x1C1C030A, // 0036 EQ R7 R1 R266 + 0x781E0004, // 0037 JMPF R7 #003D + 0x881C0D0A, // 0038 GETMBR R7 R6 R266 + 0x781E0002, // 0039 JMPF R7 #003D + 0x8C1C0D0A, // 003A GETMET R7 R6 R266 + 0x7C1C0200, // 003B CALL R7 1 + 0x70020052, // 003C JMP #0090 + 0x1C1C030B, // 003D EQ R7 R1 R267 + 0x781E0004, // 003E JMPF R7 #0044 + 0x881C0D0B, // 003F GETMBR R7 R6 R267 + 0x781E0002, // 0040 JMPF R7 #0044 + 0x8C1C0D0B, // 0041 GETMET R7 R6 R267 + 0x7C1C0200, // 0042 CALL R7 1 + 0x7002004B, // 0043 JMP #0090 + 0x1C1C030C, // 0044 EQ R7 R1 R268 + 0x781E0004, // 0045 JMPF R7 #004B + 0x881C0D0C, // 0046 GETMBR R7 R6 R268 + 0x781E0002, // 0047 JMPF R7 #004B + 0x8C1C0D0C, // 0048 GETMET R7 R6 R268 + 0x7C1C0200, // 0049 CALL R7 1 + 0x70020044, // 004A JMP #0090 + 0x1C1C030D, // 004B EQ R7 R1 R269 + 0x781E0004, // 004C JMPF R7 #0052 + 0x881C0D0D, // 004D GETMBR R7 R6 R269 + 0x781E0002, // 004E JMPF R7 #0052 + 0x8C1C0D0D, // 004F GETMET R7 R6 R269 + 0x7C1C0200, // 0050 CALL R7 1 + 0x7002003D, // 0051 JMP #0090 + 0x1C1C030E, // 0052 EQ R7 R1 R270 + 0x781E0004, // 0053 JMPF R7 #0059 + 0x881C0D0E, // 0054 GETMBR R7 R6 R270 + 0x781E0002, // 0055 JMPF R7 #0059 + 0x8C1C0D0E, // 0056 GETMET R7 R6 R270 + 0x7C1C0200, // 0057 CALL R7 1 + 0x70020036, // 0058 JMP #0090 + 0x1C1C030F, // 0059 EQ R7 R1 R271 + 0x781E0004, // 005A JMPF R7 #0060 + 0x881C0D0F, // 005B GETMBR R7 R6 R271 + 0x781E0002, // 005C JMPF R7 #0060 + 0x8C1C0D0F, // 005D GETMET R7 R6 R271 + 0x7C1C0200, // 005E CALL R7 1 + 0x7002002F, // 005F JMP #0090 + 0x1C1C0310, // 0060 EQ R7 R1 R272 + 0x781E0004, // 0061 JMPF R7 #0067 + 0x881C0D10, // 0062 GETMBR R7 R6 R272 + 0x781E0002, // 0063 JMPF R7 #0067 + 0x8C1C0D10, // 0064 GETMET R7 R6 R272 + 0x7C1C0200, // 0065 CALL R7 1 + 0x70020028, // 0066 JMP #0090 + 0x1C1C0311, // 0067 EQ R7 R1 R273 + 0x781E0004, // 0068 JMPF R7 #006E + 0x881C0D11, // 0069 GETMBR R7 R6 R273 + 0x781E0002, // 006A JMPF R7 #006E + 0x8C1C0D11, // 006B GETMET R7 R6 R273 + 0x7C1C0200, // 006C CALL R7 1 + 0x70020021, // 006D JMP #0090 + 0x1C1C0312, // 006E EQ R7 R1 R274 + 0x781E0004, // 006F JMPF R7 #0075 + 0x881C0D12, // 0070 GETMBR R7 R6 R274 + 0x781E0002, // 0071 JMPF R7 #0075 + 0x8C1C0D12, // 0072 GETMET R7 R6 R274 + 0x7C1C0200, // 0073 CALL R7 1 + 0x7002001A, // 0074 JMP #0090 + 0x1C1C0313, // 0075 EQ R7 R1 R275 + 0x781E0004, // 0076 JMPF R7 #007C + 0x881C0D13, // 0077 GETMBR R7 R6 R275 + 0x781E0002, // 0078 JMPF R7 #007C + 0x8C1C0D13, // 0079 GETMET R7 R6 R275 + 0x7C1C0200, // 007A CALL R7 1 + 0x70020013, // 007B JMP #0090 + 0x1C1C0314, // 007C EQ R7 R1 R276 + 0x781E0004, // 007D JMPF R7 #0083 + 0x881C0D14, // 007E GETMBR R7 R6 R276 + 0x781E0002, // 007F JMPF R7 #0083 + 0x8C1C0D14, // 0080 GETMET R7 R6 R276 + 0x7C1C0200, // 0081 CALL R7 1 + 0x7002000C, // 0082 JMP #0090 + 0x1C1C0311, // 0083 EQ R7 R1 R273 + 0x781E0004, // 0084 JMPF R7 #008A + 0x881C0D15, // 0085 GETMBR R7 R6 R277 + 0x781E0002, // 0086 JMPF R7 #008A + 0x8C1C0D15, // 0087 GETMET R7 R6 R277 + 0x7C1C0200, // 0088 CALL R7 1 + 0x70020005, // 0089 JMP #0090 + 0x1C1C0315, // 008A EQ R7 R1 R277 + 0x781E0003, // 008B JMPF R7 #0090 + 0x881C0D15, // 008C GETMBR R7 R6 R277 + 0x781E0001, // 008D JMPF R7 #0090 + 0x8C1C0D15, // 008E GETMET R7 R6 R277 + 0x7C1C0200, // 008F CALL R7 1 + 0xA8040001, // 0090 EXBLK 1 1 + 0x7002000B, // 0091 JMP #009E + 0xAC1C0002, // 0092 CATCH R7 0 2 + 0x70020008, // 0093 JMP #009D + 0xA4262C00, // 0094 IMPORT R9 R278 + 0x6028000F, // 0095 GETGBL R10 G15 + 0x8C2C1317, // 0096 GETMET R11 R9 R279 + 0x58340018, // 0097 LDCONST R13 K24 + 0x5C380E00, // 0098 MOVE R14 R7 + 0x5C3C1000, // 0099 MOVE R15 R8 + 0x7C2C0800, // 009A CALL R11 4 + 0x7C280200, // 009B CALL R10 1 + 0x70020000, // 009C JMP #009E + 0xB0080000, // 009D RAISE 2 R0 R0 + 0x7001FF85, // 009E JMP #0025 + 0x58140019, // 009F LDCONST R5 K25 + 0xAC140200, // 00A0 CATCH R5 1 0 + 0xB0080000, // 00A1 RAISE 2 R0 R0 + 0x80000000, // 00A2 RET 0 R0 }) ) ); diff --git a/lib/libesp32/Berry/default/embedded/Tasmota.be b/lib/libesp32/Berry/default/embedded/Tasmota.be index 4b3647168..cf92ac5b9 100644 --- a/lib/libesp32/Berry/default/embedded/Tasmota.be +++ b/lib/libesp32/Berry/default/embedded/Tasmota.be @@ -242,15 +242,17 @@ class Tasmota2 : Tasmota end def event(type, cmd, idx, payload) + if type=='every_50ms' self.run_deferred() end #- first run deferred events -# + if type=='cmd' return self.exec_cmd(cmd, idx, payload) elif type=='rule' return self.exec_rules(payload) elif type=='mqtt_data' return nil elif type=='gc' return self.gc() - elif type=='every_50ms' return self.run_deferred() elif self._drivers for d:self._drivers try if type=='every_second' && d.every_second d.every_second() + elif type=='every_50ms' && d.every_50ms d.every_50ms() elif type=='every_100ms' && d.every_100ms d.every_100ms() elif type=='web_add_button' && d.web_add_button d.web_add_button() elif type=='web_add_main_button' && d.web_add_main_button d.web_add_main_button() diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 11b5c6e7f..ce34e8dd5 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,635 +1,657 @@ -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_ROT1A; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str_WEBCAM_PSCLK; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_return; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_web_add_management_button; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_ADC_TEMP; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_TM1637CLK; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_A4988_DIR; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_lv_sqrt_res; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_web_sensor; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_CNTR1_NP; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_SDM630_TX; -extern const bcstring be_const_str_every_second; -extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_RC522_CS; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_REL1_INV; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_WEBCAM_SIOC; -extern const bcstring be_const_str_I2C_SCL; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_web_add_button; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_KEY1_INV; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_get_tasmota; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_HPMA_TX; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_lv_gauge_format_cb; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_every_100ms; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_display; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_SYMBOL_PLAY; -extern const bcstring be_const_str_MGC3130_RESET; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_MAX7219DIN; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_HLW_CF; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_save_before_restart; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_WE517_RX; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_PN532_RXD; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_web_add_console_button; -extern const bcstring be_const_str_web_add_handler; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_NRG_SEL_INV; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str_json_append; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str_HRE_DATA; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_SM16716_SEL; -extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_lv_draw_mask_saved; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_BOILER_OT_TX; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_ZEROCROSS; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_BL0940_RX; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_TM1637DIO; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_GPS_RX; -extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_AZ_RXD; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_button_pressed; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_PWM1_INV; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_TASMOTACLIENT_RXD; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_MAX7219CLK; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str_SYMBOL_CHARGE; extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_SDM72_TX; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_WIEGAND_D1; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str_SYMBOL_NEXT; -extern const bcstring be_const_str_WEBCAM_XCLK; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_OUTPUT_LO; -extern const bcstring be_const_str_SSPI_DC; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_update; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_SR04_TRIG; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_lv_draw_mask_radius_param; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_lv_signal_cb; -extern const bcstring be_const_str_Driver; -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_web_add_config_button; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_SYMBOL_BULLET; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_lv_tileview; extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_web_add_main_button; +extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_CSE7766_TX; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_TXD; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_KEY1; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_every_100ms; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_exec_rules; extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_web_add_config_button; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_display; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_REL1; +extern const bcstring be_const_str_SYMBOL_SETTINGS; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_OPTION_A; +extern const bcstring be_const_str_SYMBOL_LEFT; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_HX711_DAT; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_DHT22; +extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_web_add_management_button; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_chars_in_string; +extern const bcstring be_const_str_wire2; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_SYMBOL_SHUFFLE; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_RDM6300_RX; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_web_add_button; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_millis; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_SSD1351_DC; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_SI7021; extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_SENSOR_END; extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str__ccmd; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_get_tasmota; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_SYMBOL_MUTE; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_lv_dropdown; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_SYMBOL_WIFI; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_has_arg; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_find_key_i; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_SDM72_TX; +extern const bcstring be_const_str_VL53L0X_XSHUT1; +extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_setbits; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str_GPS_TX; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_SYMBOL_BATTERY_3; +extern const bcstring be_const_str_json_append; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; +extern const bcstring be_const_str_ADC_BUTTON; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str_MD5; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str_web_add_main_button; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_I2S_OUT_CLK; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_save_before_restart; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_load_font; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_tostring; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_read12; +extern const bcstring be_const_str_DDS2382_TX; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_reverse_gamma10; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_SWT1_NP; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str_lv_img; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str_elif; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_SYMBOL_OK; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str_find; extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str_AudioGeneratorMP3; +extern const bcstring be_const_str_close; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_every_second; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_TASMOTACLIENT_RST; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_AS3935; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_SYMBOL_CHARGE; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_PWM1; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_web_add_console_button; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_SYMBOL_AUDIO; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_I2C_Driver; +extern const bcstring be_const_str_KEY1_TC; +extern const bcstring be_const_str__buffer; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_SR04_TRIG; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_SYMBOL_USB; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str_lv_line; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_class; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str_AudioFileSourceFS; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_get; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_DI; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_SSD1351_CS; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_loop; +extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str___lower__; +extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_size; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_SYMBOL_REFRESH; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_AZ_RXD; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_AZ_TXD; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_HX711_SCK; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_lv_draw_label_dsc; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str_Driver; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_web_add_handler; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str_push; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_SYMBOL_EJECT; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_item; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_TELEINFO_ENABLE; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str_arg_size; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_SDM630_TX; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_bytes; +extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_cmd; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_SYMBOL_RIGHT; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; +extern const bcstring be_const_str_SWT1_PD; +extern const bcstring be_const_str_add_cmd; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str_CNTR1_NP; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_WEBCAM_SIOD; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_update; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_SDM72_RX; +extern const bcstring be_const_str_SYMBOL_PAUSE; +extern const bcstring be_const_str_every_50ms; +extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_button_pressed; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_BUZZER; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_lv_slider; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_MIEL_HVAC_TX; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str_wire1; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_web_sensor; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str_MGC3130_RESET; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_MAX31855DO; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str__end_transmission; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_return; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_BUZZER_INV; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_screenshot; +extern const bcstring be_const_str_web_send; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_SYMBOL_GPS; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_lv_signal_cb; +extern const bcstring be_const_str_CNTR1; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_LEDLNK_INV; +extern const bcstring be_const_str_NRG_CF1; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_remove_cmd; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_MGC3130_XFER; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_SM16716_SEL; +extern const bcstring be_const_str_add_rule; +extern const bcstring be_const_str_setitem; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index 988eca7bc..c9df0c8c4 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,950 +1,983 @@ -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SYMBOL_PLUS); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_hex); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_setrange); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_concat); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_raise); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_SPI_CLK); -be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_SYMBOL_MINUS); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_WEBCAM_PSCLK); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_top); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_return); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_OUTPUT_OPEN_DRAIN); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_write_bytes); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_call); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_lv_draw_mask_angle_param); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_atan); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_content_flush); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_TM1638STB); -be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_web_add_management_button); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, NULL); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_Wire); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, NULL); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_init); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_redirect); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_finish); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, NULL); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_NEOPOOL_TX); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_SSD1331_CS); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_TELEINFO_RX); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, NULL); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, NULL); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_pin_mode); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_SYMBOL_HOME); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_TM1637CLK); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_char); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_ZIGBEE_TX); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_AS3935); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_lv_sqrt_res); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_cosh); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_web_sensor); -be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_A4988_ENA); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_lv_point); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_resp_cmnd_str); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_lv_event_cb); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, NULL); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MAX31855CS); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_SDM630_TX); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_every_second); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, NULL); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, NULL); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_def); -be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_load_font); -be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, &be_const_str_real); -be_define_const_str(real, "real", 3604983901u, 0, 4, &be_const_str_set); -be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SSPI_CS); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, NULL); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_OUTPUT_HI); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_LED1_INV); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_SPI_CS); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_WEBCAM_RESET); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_ceil); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_clear); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_response_append); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_write_bit); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_lv_calendar); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_arg); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); -be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_rand); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_web_add_button); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, &be_const_str_except); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, NULL); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_RA8876_CS); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str___iterator__); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_lv_draw_mask_map_param_cfg); -be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, &be_const_str_module); -be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, NULL); -be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, &be_const_str_read24); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_start); -be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_SYMBOL_DRIVE); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_SYMBOL_WARNING); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_gamma8); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_lv_draw_mask_line_param); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, &be_const_str_memory); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_digital_read); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_lv_design_cb); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_get_option); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_SYMBOL_BATTERY_2); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_read32); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_abs); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_SM16716_DAT); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_SYMBOL_PAUSE); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_attrdump); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_lv_draw_mask_fade_param); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, NULL); -be_define_const_str(super, "super", 4152230356u, 0, 5, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_lv_led); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_time_dump); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_PN532_TXD); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_compile); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, &be_const_str_lv_gauge_format_cb); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, NULL); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_TASMOTACLIENT_RST); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_tolower); -be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, &be_const_str_type); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, NULL); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_lv_list); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str__available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_display); -be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_WEBCAM_SIOD); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str_publish); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_map); -be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_SSD1351_CS); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_SYMBOL_PLAY); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, NULL); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SYMBOL_SAVE); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_lv_draw_mask_radius_param_cfg); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, NULL); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_SYMBOL_USB); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_int); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_VL53L0X_XSHUT1); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str_set_power); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, NULL); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_lv_img); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_while); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_lv_spinner); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_SYMBOL_KEYBOARD); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_lv_slider); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_PWM1); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_SWT1); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, NULL); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, NULL); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_TM1638DIO); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_read12); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_state); -be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, NULL); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_SYMBOL_PASTE); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_resolvecmnd); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, NULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, NULL); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str__buffer); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_HJL_CF); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_lv_draw_mask_fade_param_cfg); -be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_SYMBOL_DOWN); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_save_before_restart); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, &be_const_str_write8); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, NULL); -be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, &be_const_str_SYMBOL_BATTERY_1); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_WE517_RX); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_digital_write); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_lv_spinbox); -be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_pin); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_SI7021); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_WE517_TX); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_lv_obj); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, NULL); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, NULL); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_arg_size); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_millis); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_wire2); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_lv_canvas); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_WEBCAM_DATA); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, NULL); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_NEOPOOL_RX); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_OUTPUT); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_lv_msgbox); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_lv_table); -be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_P9813_DAT); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_WEBCAM_PWDN); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_count); -be_define_const_str(count, "count", 967958004u, 0, 5, NULL); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_read8); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_PZEM004_RX); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str__begin_transmission); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_web_add_console_button); -be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, &be_const_str_web_add_handler); -be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_find); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, NULL); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_MCP39F5_RX); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_ROT1B); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_SOLAXX1_TX); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, NULL); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_WEBCAM_VSYNC); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_tan); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_web_send); -be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_chars_in_string); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, NULL); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_read_bytes); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_SYMBOL_CALL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_NRG_CF1); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_SYMBOL_MUTE); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, NULL); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, NULL); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_lv_chart); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_name); -be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); -be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_FALLING); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_DYP_RX); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_LEDLNK); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_lv_textarea); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_SSD1351_DC); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str_SYMBOL_COPY); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_SYMBOL_UP); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_json_append); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_TASMOTACLIENT_RST_INV); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_add_rule); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_resize); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_resp_cmnd_error); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_TASMOTACLIENT_TXD); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_RC522_RST); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_SYMBOL_LEFT); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_MHZ_TXD); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_SAIR_TX); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_assert); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_lv_draw_mask_saved); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, &be_const_str_read); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_ROT1B_NP); -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, NULL); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str___upper__); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, NULL); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str__write); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_lv_draw_mask_line_param_cfg); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_addr); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_find_key_i); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_P9813_CLK); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_area); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_split); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_SM2135_CLK); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_ZEROCROSS); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_i2c_enabled); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, &be_const_str_wire1); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, &be_const_str_seti); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, NULL); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str__ccmd); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, NULL); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_TM1638CLK); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_lv_keyboard); -be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_elif); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_LE01MR_TX); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_lv_tileview); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, &be_const_str_class); -be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, NULL); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_lv_draw_mask_angle_param_cfg); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, &be_const_str_save); -be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_static); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_WIEGAND_D0); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_indev); -be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_TFMINIPLUS_RX); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_arg_name); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_setbits); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, NULL); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_get_power); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, NULL); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_BS814_CLK); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, NULL); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_TM1637DIO); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_lv_btnmatrix); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_classname); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_add_driver); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_content_button); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_content_stop); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_exists); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_HX711_SCK); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_RDM6300_RX); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, NULL); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_ZIGBEE_RX); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str_imax); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_montserrat_font); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(srand, "srand", 465518633u, 0, 5, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_try_rule); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_SDM120_TX); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_SYMBOL_BELL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_tostring); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_HRXL_RX); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_button_pressed); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_lv_arc); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_SYMBOL_POWER); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_bar); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_linemeter); -be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, &be_const_str_lv_page); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, &be_const_str_upper); -be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_exec_rules); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_content_send_style); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, NULL); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_WS2812); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_lv_line); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_RF_SENSOR); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, NULL); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, NULL); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_cb_dispatch); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_DHT11_OUT); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_SYMBOL_RIGHT); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_gen_cb); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_lv_cpicker); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_content_send); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_lv_group); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_SYMBOL_CHARGE); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_get_light); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_load_freetype_font); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_SDM72_TX); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str_SYMBOL_VOLUME_MID); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str_TELEINFO_ENABLE); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_collect); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_add); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_isinstance); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_rtc); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_add_cmd); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_erase); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_as); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_KEY1_INV_NP); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str___lower__); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_set_light); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_KEY1_NP); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_WIEGAND_D1); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_find_op); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_content_start); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_SYMBOL_NEXT); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, &be_const_str_WEBCAM_XCLK); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, NULL); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_scale_uint); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_SSPI_DC); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_lv_tabview); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_ILI9341_DC); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_yield); -be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, NULL); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SYMBOL_BLUETOOTH); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_lv_draw_label_dsc); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_update); -be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SYMBOL_NEW_LINE); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_ZIGBEE_RST); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, NULL); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_MGC3130_XFER); -be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str__drivers); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_detect); -be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); -be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_TUYA_TX); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str__cb); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_RXD); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, NULL); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_calldepth); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_DSB_OUT); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, NULL); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_member); -be_define_const_str(member, "member", 719708611u, 0, 6, NULL); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_range); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_issubclass); be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str_bytes); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_lv_signal_cb); -be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, NULL); -be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, NULL); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SYMBOL_DUMMY); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_WEBCAM_HSD); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, NULL); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_SYMBOL_WIFI); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, NULL); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, NULL); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_SM16716_CLK); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_SYMBOL_EJECT); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, NULL); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_SYMBOL_DOWNLOAD); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_SYMBOL_EDIT); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_geti); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_lv_label); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, &be_const_str_true); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_SYMBOL_CLOSE); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_SYMBOL_CUT); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str__request_from); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_lower); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_I2C_SCL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, NULL); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_PMS5003_TX); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_lv_draw_mask_angle_param_cfg); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_SYMBOL_FILE); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_lv_bar); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, NULL); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_lv_tabview); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_WEBCAM_PSCLK); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_TELEINFO_RX); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, NULL); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, NULL); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_read8); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_ceil); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_every_100ms); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_setmember); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_lv_linemeter); +be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, NULL); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_exec_rules); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_web_add_config_button); +be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_display); +be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_lower); be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_ctypes_bytes); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); -be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, NULL); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_seg7_font); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_SYMBOL_SETTINGS); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, NULL); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_SYMBOL_VIDEO); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, &be_const_str__timers); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SYMBOL_LEFT); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, NULL); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_SYMBOL_CALL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str_resp_cmnd); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_SOLAXX1_TX); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_SYMBOL_PASTE); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_gc); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, NULL); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str__rules); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_content_start); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_web_add_management_button); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_SDM120_TX); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_chars_in_string); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_wire2); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_lv_roller); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_SYMBOL_BATTERY_2); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, NULL); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_atan); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_pin); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_web_add_button); +be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_millis); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_montserrat_font); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_number); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_pin_mode); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_SYMBOL_MINUS); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_TFMINIPLUS_RX); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, &be_const_str_lv_list); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); +be_define_const_str(member, "member", 719708611u, 0, 6, NULL); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, NULL); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, NULL); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_SSD1351_DC); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_seg7_font); be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_I2C_SDA); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, NULL); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_lv_cb); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_SENSOR_END); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, NULL); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_WEBCAM_DATA); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, NULL); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_SYMBOL_EDIT); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_ctypes_bytes); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str__request_from); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_acos); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_HJL_CF); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str__ccmd); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_isinstance); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, NULL); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_get_tasmota); +be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, NULL); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_get_power); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_lv_gauge_format_cb); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, NULL); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SDM630_RX); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_SYMBOL_SAVE); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, NULL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_asstring); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_count); +be_define_const_str(count, "count", 967958004u, 0, 5, NULL); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_lv_btnmatrix); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_MHZ_RXD); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SBR_RX); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_SYMBOL_IMAGE); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_iter); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_def); +be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_add); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_lv_dropdown); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_format); +be_define_const_str(format, "format", 3114108242u, 0, 6, NULL); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_byte); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_content_send_style); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_MAX7219CLK); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_SDM72_TX); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str_lv_draw_mask_map_param_cfg); +be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_HM10_TX); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_ROT1B); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_bus); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_draw_img_dsc); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_setbits); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_HRXL_RX); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_codedump); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_write); +be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); +be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_SDCARD_CS); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, NULL); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_REL1_INV); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_msgbox); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_delay); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_json_append); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_lv_draw_mask_line_param_cfg); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_lv_led); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_MD5); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_SPI_CLK); +be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_SYMBOL_EYE_OPEN); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_SYMBOL_HOME); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_web_add_main_button); +be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_lv_cont); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_save_before_restart); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_load_font); +be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, &be_const_str_lv_style); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_LMT01); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_detect); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_input); +be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_tostring); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_HLW_CF); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_HPMA_RX); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_read12); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_chart); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_lv_indev); +be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, NULL); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_SYMBOL_DIRECTORY); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_erase); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_getbits); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, &be_const_str_save); +be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, NULL); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_name); +be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_LED1); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_SSPI_SCLK); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_TM1638DIO); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_i2c_enabled); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, NULL); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_SAIR_RX); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str__cmd); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_compile); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SYMBOL_PLAY); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_lv_img); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_SDM120_RX); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_attrdump); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_elif); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str__drivers); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_geti); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_lv_calendar); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_WINDMETER_SPEED); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_lv_cb); be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, NULL); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, NULL); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_close); +be_define_const_str(close, "close", 667630371u, 0, 5, NULL); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, NULL); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_every_second); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_lv_draw_rect_dsc); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_load_freetype_font); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_resize); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MAX7219DIN); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SYMBOL_DUMMY); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, NULL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SPI_MOSI); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_AudioOutput); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_ETH_PHY_MDC); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_IEM3000_TX); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_imax); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_SYMBOL_BELL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_redirect); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_lv_draw_mask_saved); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_lv_canvas); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, &be_const_str_lv_sqrt_res); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_deg); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_TASMOTACLIENT_TXD); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_lv_table); +be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_PROJECTOR_CTRL_RX); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_KEY1_INV); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_imin); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_lv_draw_mask_angle_param); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_ZIGBEE_TX); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_resp_cmnd_failed); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_web_add_console_button); +be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, NULL); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_AudioOutputI2S); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_LE01MR_TX); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_ROT1B_NP); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_TM1638STB); +be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, NULL); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, NULL); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str__read); +be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_PULLDOWN); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_RF_SENSOR); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_lv_color); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_KEY1_TC); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str__buffer); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_add_driver); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_find_op); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_rand); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_LEDLNK); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, NULL); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, NULL); +be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_SYMBOL_NEXT); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, &be_const_str_SYMBOL_USB); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, NULL); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_SPI_MISO); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_time_dump); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_SPI_CS); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_lv_line); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_write_bit); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); +be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_WEBCAM_SIOC); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_cosh); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_WE517_RX); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_ZEROCROSS); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_get); +be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_resp_cmnd_str); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_ROT1A); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_SYMBOL_UPLOAD); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_deinit); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_SSD1351_CS); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_SSPI_CS); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); +be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_BL0940_RX); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, NULL); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_yield); +be_define_const_str(yield, "yield", 1821831854u, 0, 5, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_size); +be_define_const_str(size, "size", 597743964u, 0, 4, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_SYMBOL_REFRESH); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_lv_draw_mask_fade_param); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); +be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_AZ_RXD); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SYMBOL_BACKSPACE); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_SYMBOL_DOWN); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_calldepth); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_true); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_lv_arc); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_SOLAXX1_RX); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SR04_ECHO); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_log); +be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_set_light); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_SYMBOL_UP); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_hex); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, NULL); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_event); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_lv_draw_label_dsc); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_try); +be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_lv_textarea); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_WEBCAM_PSRCS); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, NULL); +be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_WEBCAM_PWDN); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, NULL); +be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, &be_const_str_OLED_RESET); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SSPI_DC); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_SYMBOL_BATTERY_EMPTY); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str__write); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_web_add_handler); +be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, &be_const_str_scale_uint); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_TX2X_TXD_BLACK); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_SYMBOL_EJECT); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_classof); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_item); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_SSPI_MAX31865_CS1); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_for); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_ST7789_CS); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str__cb); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_arg_size); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_lv_keyboard); +be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, NULL); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_abs); +be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_SYMBOL_BLUETOOTH); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_WEBCAM_VSYNC); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, NULL); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_MAX31855CS); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_NRG_SEL_INV); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, NULL); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_bytes); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_gamma8); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_lv_spinbox); +be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_SDS0X1_RX); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_tolower); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_cmd); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, NULL); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, NULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_arg_name); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_start); +be_define_const_str(start, "start", 1697318111u, 0, 5, &be_const_str_except); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, NULL); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_add_cmd); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_int); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_lv_draw_mask_line_param); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_BS814_CLK); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_CNTR1_NP); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_MAX31855CLK); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_WEBCAM_SIOD); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str_exists); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); +be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_EXS_ENABLE); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_update); +be_define_const_str(update, "update", 672109684u, 0, 6, NULL); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_SDM72_RX); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_SYMBOL_PAUSE); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_every_50ms); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_get_option); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_button_pressed); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_set); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_lv_draw_mask_fade_param_cfg); +be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_lv_area); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, NULL); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_SBR_TX); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_char); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_lv_design_cb); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, NULL); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_PWM1_INV); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_lv_checkbox); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, &be_const_str_finish); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_remove_rule); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_digital_read); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_arg); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, NULL); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_wire1); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_AS608_TX); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_gen_cb); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_get_free_heap); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_web_sensor); +be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_lv_event_cb); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_write_bytes); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, NULL); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_lv_draw_mask_radius_param_cfg); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, &be_const_str_lv_page); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, NULL); +be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_TM1637CLK); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_ZIGBEE_RST); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str__end_transmission); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_top); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_return); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_as); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_NONE); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_P9813_CLK); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_SYMBOL_STOP); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, NULL); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_WIEGAND_D0); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_lv_spinner); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_seti); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str__available); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, &be_const_str_read_bytes); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); +be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_exec_cmd); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_web_send); +be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_WE517_TX); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_SYMBOL_GPS); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_SYMBOL_VOLUME_MID); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_insert); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_real); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, &be_const_str_IEM3000_RX); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_addr); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_check_privileged_access); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_signal_cb); +be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, NULL); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_cb_dispatch); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_LEDLNK_INV); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_NRG_CF1); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_SYMBOL_PREV); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_read32); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, NULL); +be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_SM16716_SEL); +be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_add_rule); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_setitem); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); static const bstring* const m_string_table[] = { - NULL, - (const bstring *)&be_const_str_lv_style, - (const bstring *)&be_const_str_ETH_PHY_MDIO, - (const bstring *)&be_const_str_bus, - (const bstring *)&be_const_str_ROT1A, - (const bstring *)&be_const_str_EPAPER42_CS, - (const bstring *)&be_const_str_MCP39F5_RST, - (const bstring *)&be_const_str_SYMBOL_SETTINGS, - (const bstring *)&be_const_str_pi, - (const bstring *)&be_const_str_acos, - NULL, - (const bstring *)&be_const_str_SYMBOL_BACKSPACE, - (const bstring *)&be_const_str_resp_cmnd, - (const bstring *)&be_const_str_NRG_SEL, - (const bstring *)&be_const_str_SYMBOL_OK, - (const bstring *)&be_const_str_SYMBOL_BATTERY_3, - (const bstring *)&be_const_str_ADC_TEMP, - (const bstring *)&be_const_str_SPI_DC, - (const bstring *)&be_const_str_MIEL_HVAC_RX, - (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV, - (const bstring *)&be_const_str_MAX7219CS, - (const bstring *)&be_const_str_SDM72_RX, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_lv_dropdown, - NULL, - (const bstring *)&be_const_str_A4988_DIR, - (const bstring *)&be_const_str_IEM3000_TX, - (const bstring *)&be_const_str_BS814_DAT, - (const bstring *)&be_const_str_opt_add, - NULL, - (const bstring *)&be_const_str_delay, - (const bstring *)&be_const_str_iter, - (const bstring *)&be_const_str_fromstring, - NULL, - (const bstring *)&be_const_str_CNTR1_NP, - NULL, - (const bstring *)&be_const_str_tanh, - (const bstring *)&be_const_str_lv_objmask, - (const bstring *)&be_const_str_SOLAXX1_RX, - (const bstring *)&be_const_str_HRE_CLOCK, - (const bstring *)&be_const_str_SYMBOL_AUDIO, - NULL, - (const bstring *)&be_const_str_RC522_CS, - (const bstring *)&be_const_str_REL1, - NULL, - (const bstring *)&be_const_str_PZEM016_RX, - (const bstring *)&be_const_str_SYMBOL_TRASH, - (const bstring *)&be_const_str_REL1_INV, - (const bstring *)&be_const_str_FTC532, - (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_ADC_INPUT, - (const bstring *)&be_const_str_cmd, - (const bstring *)&be_const_str_lv_btn, - (const bstring *)&be_const_str_gc, - (const bstring *)&be_const_str_WINDMETER_SPEED, - (const bstring *)&be_const_str_WEBCAM_SIOC, - (const bstring *)&be_const_str_I2C_SCL, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str__read, - (const bstring *)&be_const_str_SYMBOL_SHUFFLE, - (const bstring *)&be_const_str_DDSU666_TX, - (const bstring *)&be_const_str_RFRECV, - (const bstring *)&be_const_str_PZEM017_RX, - (const bstring *)&be_const_str_KEY1_INV, - (const bstring *)&be_const_str_ADC_BUTTON, - (const bstring *)&be_const_str_get_tasmota, - (const bstring *)&be_const_str_MIEL_HVAC_TX, - NULL, - (const bstring *)&be_const_str_SPI_MOSI, - (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_PMS5003_RX, - (const bstring *)&be_const_str_dump, - (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, - (const bstring *)&be_const_str_SYMBOL_IMAGE, - (const bstring *)&be_const_str_HPMA_RX, - (const bstring *)&be_const_str_CC1101_GDO0, - (const bstring *)&be_const_str_super, - (const bstring *)&be_const_str_TCP_RX, - (const bstring *)&be_const_str_HPMA_TX, - (const bstring *)&be_const_str_TCP_TX, - (const bstring *)&be_const_str_remove_rule, - (const bstring *)&be_const_str_KEY1_TC, - (const bstring *)&be_const_str_lv_cont, - NULL, - (const bstring *)&be_const_str_every_100ms, + (const bstring *)&be_const_str_get_light, + (const bstring *)&be_const_str_lv_tileview, + (const bstring *)&be_const_str_LE01MR_RX, (const bstring *)&be_const_str_CSE7766_TX, - (const bstring *)&be_const_str_SM2135_DAT, - (const bstring *)&be_const_str_input, - (const bstring *)&be_const_str_IRRECV, - (const bstring *)&be_const_str_MGC3130_RESET, - (const bstring *)&be_const_str_resp_cmnd_failed, - (const bstring *)&be_const_str_ADC_RANGE, - (const bstring *)&be_const_str_PZEM0XX_TX, - (const bstring *)&be_const_str_LEDLNK_INV, - (const bstring *)&be_const_str__end_transmission, - (const bstring *)&be_const_str_get, - (const bstring *)&be_const_str_SPI_MISO, - NULL, - (const bstring *)&be_const_str_format, - (const bstring *)&be_const_str_MAX7219DIN, - (const bstring *)&be_const_str_HM10_RX, - (const bstring *)&be_const_str_getbits, - NULL, - (const bstring *)&be_const_str_A4988_MS1, - NULL, - NULL, + (const bstring *)&be_const_str_response_append, (const bstring *)&be_const_str_NRF24_CS, - (const bstring *)&be_const_str_SSD1331_DC, - (const bstring *)&be_const_str_PMS5003_TX, - (const bstring *)&be_const_str_exec_cmd, - (const bstring *)&be_const_str_HLW_CF, - (const bstring *)&be_const_str_SYMBOL_DIRECTORY, - (const bstring *)&be_const_str_ST7789_CS, - (const bstring *)&be_const_str_SYMBOL_BATTERY_FULL, - (const bstring *)&be_const_str_log10, + (const bstring *)&be_const_str_read, + (const bstring *)&be_const_str_Wire, + (const bstring *)&be_const_str_copy, + (const bstring *)&be_const_str_P9813_DAT, + NULL, (const bstring *)&be_const_str_TXD, - (const bstring *)&be_const_str_SYMBOL_EYE_OPEN, - (const bstring *)&be_const_str_EXS_ENABLE, - (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, - (const bstring *)&be_const_str_SBR_TX, - (const bstring *)&be_const_str_MAX31855DO, - (const bstring *)&be_const_str_byte, - (const bstring *)&be_const_str_write, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_KEY1, + (const bstring *)&be_const_str_SYMBOL_TRASH, + (const bstring *)&be_const_str_split, + (const bstring *)&be_const_str_module, + NULL, + (const bstring *)&be_const_str_BOILER_OT_TX, + (const bstring *)&be_const_str_PZEM017_RX, + (const bstring *)&be_const_str_AS608_RX, + NULL, + NULL, + (const bstring *)&be_const_str_WEBCAM_XCLK, + (const bstring *)&be_const_str_floor, + (const bstring *)&be_const_str_lv_point, + (const bstring *)&be_const_str_WS2812, + (const bstring *)&be_const_str_ADC_RANGE, + (const bstring *)&be_const_str_REL1, + (const bstring *)&be_const_str_SYMBOL_SD_CARD, + (const bstring *)&be_const_str_continue, + (const bstring *)&be_const_str_OPTION_A, + (const bstring *)&be_const_str_MAX7219CS, + (const bstring *)&be_const_str_lv_switch, + (const bstring *)&be_const_str_HX711_DAT, + (const bstring *)&be_const_str_ZIGBEE_RX, + (const bstring *)&be_const_str_ROT1A_NP, + NULL, + NULL, + (const bstring *)&be_const_str_DHT22, + (const bstring *)&be_const_str_DYP_RX, + (const bstring *)&be_const_str_SYMBOL_DOWNLOAD, + (const bstring *)&be_const_str_SYMBOL_SHUFFLE, + (const bstring *)&be_const_str_DHT11_OUT, + (const bstring *)&be_const_str_RDM6300_RX, + (const bstring *)&be_const_str_SYMBOL_WARNING, + (const bstring *)&be_const_str_stop, + (const bstring *)&be_const_str_TFMINIPLUS_TX, + (const bstring *)&be_const_str_classname, + (const bstring *)&be_const_str_SWT1, + (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV, + NULL, + NULL, + (const bstring *)&be_const_str_member, + NULL, + (const bstring *)&be_const_str_SYMBOL_COPY, + (const bstring *)&be_const_str___iterator__, + NULL, + (const bstring *)&be_const_str_SYMBOL_CUT, + (const bstring *)&be_const_str_KEY1_PD, + (const bstring *)&be_const_str_static, + NULL, + (const bstring *)&be_const_str_lv_label, + (const bstring *)&be_const_str_SI7021, + (const bstring *)&be_const_str_HIGH, + (const bstring *)&be_const_str_DDSU666_TX, + NULL, + (const bstring *)&be_const_str_ILI9341_CS, + (const bstring *)&be_const_str_CC1101_GDO0, + (const bstring *)&be_const_str_ILI9488_CS, + (const bstring *)&be_const_str_SYMBOL_PLUS, + (const bstring *)&be_const_str_HRE_DATA, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_EPD_DATA, + (const bstring *)&be_const_str_I2S_IN_CLK, + (const bstring *)&be_const_str_WEBCAM_PCLK, + (const bstring *)&be_const_str_RA8876_CS, + (const bstring *)&be_const_str_WEBCAM_RESET, + (const bstring *)&be_const_str_SM16716_CLK, + (const bstring *)&be_const_str_KEY1_NP, + NULL, + (const bstring *)&be_const_str_SM16716_DAT, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_INPUT, + NULL, + (const bstring *)&be_const_str_ARIRFSEL, + NULL, + (const bstring *)&be_const_str_begin, + NULL, + (const bstring *)&be_const_str_NEOPOOL_TX, + (const bstring *)&be_const_str_SSD1331_DC, + (const bstring *)&be_const_str_TUYA_RX, + (const bstring *)&be_const_str_FTC532, + (const bstring *)&be_const_str_BS814_DAT, + (const bstring *)&be_const_str_setrange, + (const bstring *)&be_const_str_concat, + (const bstring *)&be_const_str_SYMBOL_MUTE, + (const bstring *)&be_const_str_ST7789_DC, + (const bstring *)&be_const_str_SYMBOL_WIFI, + (const bstring *)&be_const_str_lv_obj, + (const bstring *)&be_const_str_DSB_OUT, + (const bstring *)&be_const_str_has_arg, + (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str_find_key_i, + (const bstring *)&be_const_str__begin_transmission, + (const bstring *)&be_const_str_DHT11, + (const bstring *)&be_const_str_VL53L0X_XSHUT1, + NULL, + NULL, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_BACKLIGHT, + (const bstring *)&be_const_str_DSB, + (const bstring *)&be_const_str_NRF24_DC, + (const bstring *)&be_const_str_type, + (const bstring *)&be_const_str_KEY1_INV_NP, NULL, (const bstring *)&be_const_str_GPS_TX, - (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_lv_switch, - (const bstring *)&be_const_str_SAIR_RX, - (const bstring *)&be_const_str_SSPI_MAX31865_CS1, - (const bstring *)&be_const_str_DHT22, - (const bstring *)&be_const_str_deinit, + (const bstring *)&be_const_str_SYMBOL_POWER, + (const bstring *)&be_const_str_tan, NULL, - (const bstring *)&be_const_str_SYMBOL_FILE, - (const bstring *)&be_const_str_ROT1A_NP, - (const bstring *)&be_const_str_IEM3000_RX, - NULL, - (const bstring *)&be_const_str_has_arg, - (const bstring *)&be_const_str_SSPI_MOSI, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_LMT01, - (const bstring *)&be_const_str_PN532_RXD, - (const bstring *)&be_const_str_INPUT_PULLDOWN, - (const bstring *)&be_const_str_CSE7761_RX, - (const bstring *)&be_const_str_NRG_SEL_INV, - NULL, - (const bstring *)&be_const_str_ILI9488_CS, + (const bstring *)&be_const_str_SYMBOL_BATTERY_3, + (const bstring *)&be_const_str_SSD1331_CS, + (const bstring *)&be_const_str_ADC_BUTTON, (const bstring *)&be_const_str_opt_call, NULL, - (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, - (const bstring *)&be_const_str_LED1, - (const bstring *)&be_const_str_INPUT_PULLUP, - (const bstring *)&be_const_str_MAX31855CLK, - (const bstring *)&be_const_str_SYMBOL_GPS, - (const bstring *)&be_const_str_SWT1_NP, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_DHT11, - (const bstring *)&be_const_str_ETH_PHY_POWER, - (const bstring *)&be_const_str_TFMINIPLUS_TX, - (const bstring *)&be_const_str_EPAPER29_CS, - (const bstring *)&be_const_str_event, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str_CSE7766_RX, - (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_RFSEND, - (const bstring *)&be_const_str_TX2X_TXD_BLACK, - (const bstring *)&be_const_str_TUYA_RX, - NULL, - (const bstring *)&be_const_str_HRE_DATA, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_SM16716_SEL, + (const bstring *)&be_const_str_OPEN_DRAIN, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_PN532_RXD, (const bstring *)&be_const_str_ADC_BUTTON_INV, - (const bstring *)&be_const_str_MP3_DFR562, - (const bstring *)&be_const_str_rad, - (const bstring *)&be_const_str_ARIRFSEL, - (const bstring *)&be_const_str_lv_group_focus_cb, - (const bstring *)&be_const_str_SENSOR_END, - (const bstring *)&be_const_str_codedump, - (const bstring *)&be_const_str_CNTR1, + NULL, + (const bstring *)&be_const_str_FALLING, (const bstring *)&be_const_str_DDS2382_TX, - (const bstring *)&be_const_str_SSPI_MISO, - (const bstring *)&be_const_str_pop, - (const bstring *)&be_const_str_SDCARD_CS, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_BOILER_OT_TX, - NULL, - (const bstring *)&be_const_str_CHANGE, - (const bstring *)&be_const_str_lv_draw_rect_dsc, - (const bstring *)&be_const_str_ST7789_DC, - (const bstring *)&be_const_str_var, - (const bstring *)&be_const_str_MCP39F5_TX, - (const bstring *)&be_const_str_AS608_TX, - (const bstring *)&be_const_str_get_free_heap, - NULL, - (const bstring *)&be_const_str_KEY1, - NULL, - (const bstring *)&be_const_str_BUZZER_INV, - (const bstring *)&be_const_str_lv_roller, - (const bstring *)&be_const_str_ADC_CT_POWER, - (const bstring *)&be_const_str_asstring, - (const bstring *)&be_const_str_NONE, - (const bstring *)&be_const_str_exp, - (const bstring *)&be_const_str_BL0940_RX, - (const bstring *)&be_const_str_check_privileged_access, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_PULLDOWN, (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_SYMBOL_LOOP, - (const bstring *)&be_const_str_MHZ_RXD, - (const bstring *)&be_const_str_BACKLIGHT, - NULL, - NULL, - (const bstring *)&be_const_str_PULLUP, - (const bstring *)&be_const_str_SR04_ECHO, - NULL, - (const bstring *)&be_const_str_ADE7953_IRQ, - (const bstring *)&be_const_str_SYMBOL_PREV, - (const bstring *)&be_const_str_HX711_DAT, - (const bstring *)&be_const_str_dot_p, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_AZ_RXD, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_srand, - NULL, - (const bstring *)&be_const_str_LOW, + (const bstring *)&be_const_str_memory, (const bstring *)&be_const_str_DDS2382_RX, - (const bstring *)&be_const_str_SDM120_RX, - (const bstring *)&be_const_str_wire_scan, - (const bstring *)&be_const_str_SBR_RX, - (const bstring *)&be_const_str_PWM1_INV, - (const bstring *)&be_const_str_ETH_PHY_MDC, - (const bstring *)&be_const_str_run_deferred, - (const bstring *)&be_const_str_SYMBOL_REFRESH, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str_SYMBOL_CLOSE, + (const bstring *)&be_const_str_CHANGE, + (const bstring *)&be_const_str_PN532_TXD, + (const bstring *)&be_const_str_SSPI_MOSI, + NULL, + (const bstring *)&be_const_str_resolvecmnd, + (const bstring *)&be_const_str_exp, + (const bstring *)&be_const_str_collect, + (const bstring *)&be_const_str_SWT1_NP, + (const bstring *)&be_const_str_PZEM016_RX, + (const bstring *)&be_const_str_lv_group_focus_cb, + (const bstring *)&be_const_str_RFRECV, + (const bstring *)&be_const_str_A4988_MS1, + NULL, + (const bstring *)&be_const_str_RXD, + (const bstring *)&be_const_str_SAIR_TX, + (const bstring *)&be_const_str_WEBCAM_HREF, + (const bstring *)&be_const_str_SYMBOL_OK, + (const bstring *)&be_const_str_CSE7761_RX, + (const bstring *)&be_const_str_WEBCAM_HSD, + (const bstring *)&be_const_str_SYMBOL_KEYBOARD, + (const bstring *)&be_const_str_SYMBOL_DRIVE, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_BOILER_OT_RX, + (const bstring *)&be_const_str_ADC_CT_POWER, + (const bstring *)&be_const_str_asin, (const bstring *)&be_const_str_TASMOTACLIENT_RXD, NULL, - (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, - (const bstring *)&be_const_str_SYMBOL_VOLUME_MAX, - (const bstring *)&be_const_str_MAX7219CLK, - (const bstring *)&be_const_str_WEBCAM_PCLK, - (const bstring *)&be_const_str_try, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_ADC_PH, - NULL, - NULL, - (const bstring *)&be_const_str_IBEACON_TX, - NULL, - (const bstring *)&be_const_str_OLED_RESET, - (const bstring *)&be_const_str_scan, - (const bstring *)&be_const_str_SDS0X1_RX, - (const bstring *)&be_const_str_AS608_RX, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str__timers, - (const bstring *)&be_const_str_lv_draw_img_dsc, - NULL, - (const bstring *)&be_const_str_HIGH, - (const bstring *)&be_const_str_DSB, - NULL, - (const bstring *)&be_const_str_ARIRFRCV, - (const bstring *)&be_const_str_NRF24_DC, - (const bstring *)&be_const_str_SYMBOL_STOP, - (const bstring *)&be_const_str_A4988_STP, - (const bstring *)&be_const_str_WEBCAM_PSRCS, - NULL, - (const bstring *)&be_const_str_OUTPUT_LO, - (const bstring *)&be_const_str_push, - (const bstring *)&be_const_str_cos, - (const bstring *)&be_const_str_set_timer, - (const bstring *)&be_const_str_DEEPSLEEP, - (const bstring *)&be_const_str_SDM630_RX, - (const bstring *)&be_const_str_DI, - (const bstring *)&be_const_str_INPUT, - (const bstring *)&be_const_str_SYMBOL_SD_CARD, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_copy, - (const bstring *)&be_const_str_SR04_TRIG, - NULL, - (const bstring *)&be_const_str_HALLEFFECT, - (const bstring *)&be_const_str_imin, - (const bstring *)&be_const_str_SYMBOL_VIDEO, - (const bstring *)&be_const_str_SYMBOL_LIST, - (const bstring *)&be_const_str_AZ_TXD, - (const bstring *)&be_const_str_end, - (const bstring *)&be_const_str_SYMBOL_BATTERY_EMPTY, - (const bstring *)&be_const_str_for, - (const bstring *)&be_const_str_BUZZER, - (const bstring *)&be_const_str_SSPI_SCLK, - (const bstring *)&be_const_str_issubclass, - (const bstring *)&be_const_str_WEBCAM_HREF, - (const bstring *)&be_const_str_Driver, - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_IBEACON_RX, - (const bstring *)&be_const_str_HM10_TX, - (const bstring *)&be_const_str_BOILER_OT_RX, - (const bstring *)&be_const_str_item, - (const bstring *)&be_const_str_SDS0X1_TX, - (const bstring *)&be_const_str_OPEN_DRAIN, - (const bstring *)&be_const_str__rules, - (const bstring *)&be_const_str_insert, - (const bstring *)&be_const_str_web_add_config_button, - (const bstring *)&be_const_str_SYMBOL_BULLET, - (const bstring *)&be_const_str_SYMBOL_UPLOAD, - (const bstring *)&be_const_str_lv_draw_mask_common_dsc, - (const bstring *)&be_const_str_LE01MR_RX, - (const bstring *)&be_const_str_web_add_main_button, - (const bstring *)&be_const_str_floor, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_NRG_SEL, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, + (const bstring *)&be_const_str_SPI_DC, + (const bstring *)&be_const_str_TASMOTACLIENT_RST, + (const bstring *)&be_const_str_MHZ_TXD, + (const bstring *)&be_const_str_resp_cmnd_error, + (const bstring *)&be_const_str_AS3935, + (const bstring *)&be_const_str_SYMBOL_CHARGE, + (const bstring *)&be_const_str_opt_neq, (const bstring *)&be_const_str_DCKI, - (const bstring *)&be_const_str_ILI9341_CS + (const bstring *)&be_const_str_PWM1, + (const bstring *)&be_const_str_PULLUP, + (const bstring *)&be_const_str_ARIRFRCV, + (const bstring *)&be_const_str_MCP39F5_RX, + (const bstring *)&be_const_str_SM2135_CLK, + (const bstring *)&be_const_str_SYMBOL_AUDIO, + (const bstring *)&be_const_str_IBEACON_TX, + (const bstring *)&be_const_str_ILI9341_DC, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_IBEACON_RX, + (const bstring *)&be_const_str_HALLEFFECT, + (const bstring *)&be_const_str_SR04_TRIG, + (const bstring *)&be_const_str_OUTPUT_HI, + (const bstring *)&be_const_str_CSE7766_RX, + (const bstring *)&be_const_str_class, + (const bstring *)&be_const_str_SYMBOL_LOOP, + NULL, + (const bstring *)&be_const_str_INPUT_PULLDOWN, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_DI, + (const bstring *)&be_const_str_write8, + (const bstring *)&be_const_str_I2S_OUT_DATA, + NULL, + (const bstring *)&be_const_str_PZEM004_RX, + (const bstring *)&be_const_str_loop, + (const bstring *)&be_const_str_ADC_TEMP, + NULL, + (const bstring *)&be_const_str___lower__, + NULL, + (const bstring *)&be_const_str_lv_group, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_range, + NULL, + (const bstring *)&be_const_str_ADE7953_IRQ, + (const bstring *)&be_const_str_NEOPOOL_RX, + (const bstring *)&be_const_str_MCP39F5_TX, + (const bstring *)&be_const_str_HPMA_TX, + (const bstring *)&be_const_str_ETH_PHY_MDIO, + (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str_lv_cpicker, + (const bstring *)&be_const_str_MP3_DFR562, + (const bstring *)&be_const_str_log10, + (const bstring *)&be_const_str_INTERRUPT, + (const bstring *)&be_const_str_SYMBOL_VOLUME_MAX, + (const bstring *)&be_const_str_HX711_SCK, + (const bstring *)&be_const_str_WIEGAND_D1, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_I2S_OUT_SLCT, + (const bstring *)&be_const_str_A4988_ENA, + (const bstring *)&be_const_str_publish, + (const bstring *)&be_const_str_SYMBOL_BULLET, + NULL, + (const bstring *)&be_const_str_Driver, + (const bstring *)&be_const_str_RFSEND, + (const bstring *)&be_const_str_HM10_RX, + NULL, + (const bstring *)&be_const_str_TUYA_TX, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_DEEPSLEEP, + NULL, + (const bstring *)&be_const_str_TELEINFO_ENABLE, + (const bstring *)&be_const_str_TM1637DIO, + NULL, + (const bstring *)&be_const_str_SDM630_TX, + (const bstring *)&be_const_str_RC522_RST, + NULL, + (const bstring *)&be_const_str_set_power, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_TM1638CLK, + (const bstring *)&be_const_str___upper__, + (const bstring *)&be_const_str_IRSEND, + (const bstring *)&be_const_str_content_stop, + (const bstring *)&be_const_str_KEY1_INV_PD, + (const bstring *)&be_const_str_SDS0X1_TX, + (const bstring *)&be_const_str_init, + (const bstring *)&be_const_str_digital_write, + NULL, + (const bstring *)&be_const_str_SYMBOL_RIGHT, + (const bstring *)&be_const_str_ETH_PHY_POWER, + (const bstring *)&be_const_str_SYMBOL_BATTERY_FULL, + (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, + (const bstring *)&be_const_str_SWT1_PD, + (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_map, + (const bstring *)&be_const_str_ADC_INPUT, + (const bstring *)&be_const_str_LOW, + (const bstring *)&be_const_str_LED1_INV, + (const bstring *)&be_const_str_EPAPER29_CS, + (const bstring *)&be_const_str_OUTPUT, + (const bstring *)&be_const_str_I2S_IN_DATA, + (const bstring *)&be_const_str_SM2135_DAT, + (const bstring *)&be_const_str_INPUT_PULLUP, + (const bstring *)&be_const_str_I2S_IN_SLCT, + (const bstring *)&be_const_str_TCP_TX, + (const bstring *)&be_const_str_content_button, + NULL, + (const bstring *)&be_const_str_BUZZER, + (const bstring *)&be_const_str_lv_slider, + NULL, + (const bstring *)&be_const_str_MIEL_HVAC_TX, + (const bstring *)&be_const_str_content_send, + (const bstring *)&be_const_str_opt_add, + (const bstring *)&be_const_str_content_flush, + (const bstring *)&be_const_str_rtc, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_SYMBOL_LIST, + (const bstring *)&be_const_str_SYMBOL_BATTERY_1, + (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, + NULL, + (const bstring *)&be_const_str_SSPI_MISO, + (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, + (const bstring *)&be_const_str_try_rule, + NULL, + (const bstring *)&be_const_str_MGC3130_RESET, + (const bstring *)&be_const_str_state, + (const bstring *)&be_const_str_MAX31855DO, + (const bstring *)&be_const_str_SYMBOL_NEW_LINE, + (const bstring *)&be_const_str_A4988_DIR, + (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, + NULL, + (const bstring *)&be_const_str_dot_p, + (const bstring *)&be_const_str_OUTPUT_LO, + (const bstring *)&be_const_str_PMS5003_RX, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_call, + (const bstring *)&be_const_str_MIEL_HVAC_RX, + NULL, + (const bstring *)&be_const_str_RC522_CS, + (const bstring *)&be_const_str_EPAPER42_CS, + NULL, + (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, + (const bstring *)&be_const_str_CNTR1, + (const bstring *)&be_const_str_IRRECV, + (const bstring *)&be_const_str_read24, + (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_A4988_STP, + (const bstring *)&be_const_str_fromstring, + (const bstring *)&be_const_str_MGC3130_XFER, + (const bstring *)&be_const_str_Tasmota, + (const bstring *)&be_const_str_PZEM0XX_TX }; static const struct bconststrtab m_const_string_table = { - .size = 306, - .count = 613, + .size = 317, + .count = 635, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source.h new file mode 100644 index 000000000..c862ef474 --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source.h @@ -0,0 +1,17 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_file_source_map) { + { be_const_key(dot_p, -1), be_const_index(0) }, +}; + +static be_define_const_map( + be_class_audio_file_source_map, + 1 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_file_source, + 1, + NULL, + AudioFileSource +); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h new file mode 100644 index 000000000..07937ef47 --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h @@ -0,0 +1,19 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_file_source_fs_map) { + { be_const_key(init, 2), be_const_func(i2s_file_source_fs_init) }, + { be_const_key(deinit, -1), be_const_func(i2s_file_source_fs_deinit) }, + { be_const_key(close, -1), be_const_func(i2s_file_source_fs_deinit) }, +}; + +static be_define_const_map( + be_class_audio_file_source_fs_map, + 3 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_file_source_fs, + 0, + (bclass *)&be_class_audio_file_source, + AudioFileSourceFS +); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator.h new file mode 100644 index 000000000..d6c5c9a6a --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator.h @@ -0,0 +1,17 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_generator_map) { + { be_const_key(dot_p, -1), be_const_index(0) }, +}; + +static be_define_const_map( + be_class_audio_generator_map, + 1 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_generator, + 1, + NULL, + AudioGenerator +); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h new file mode 100644 index 000000000..785fb53b1 --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h @@ -0,0 +1,23 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_generator_mp3_map) { + { be_const_key(close, -1), be_const_func(i2s_generator_mp3_deinit) }, + { be_const_key(stop, -1), be_const_func(i2s_generator_mp3_stop) }, + { be_const_key(loop, 0), be_const_func(i2s_generator_mp3_loop) }, + { be_const_key(isrunning, 1), be_const_func(i2s_generator_mp3_isrunning) }, + { be_const_key(begin, -1), be_const_func(i2s_generator_mp3_begin) }, + { be_const_key(deinit, 6), be_const_func(i2s_generator_mp3_deinit) }, + { be_const_key(init, -1), be_const_func(i2s_generator_mp3_init) }, +}; + +static be_define_const_map( + be_class_audio_generator_mp3_map, + 7 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_generator_mp3, + 0, + (bclass *)&be_class_audio_generator, + AudioGeneratorMP3 +); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output.h new file mode 100644 index 000000000..cb9c6282d --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output.h @@ -0,0 +1,17 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_output_map) { + { be_const_key(dot_p, -1), be_const_index(0) }, +}; + +static be_define_const_map( + be_class_audio_output_map, + 1 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_output, + 1, + NULL, + AudioOutput +); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h new file mode 100644 index 000000000..295ea5cd5 --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h @@ -0,0 +1,19 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_output_i2s_map) { + { be_const_key(init, 2), be_const_func(i2s_output_i2s_init) }, + { be_const_key(deinit, -1), be_const_func(i2s_output_i2s_deinit) }, + { be_const_key(close, -1), be_const_func(i2s_output_i2s_deinit) }, +}; + +static be_define_const_map( + be_class_audio_output_i2s_map, + 3 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_output_i2s, + 0, + (bclass *)&be_class_audio_output, + AudioOutputI2S +); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h index 80ee78fdd..1ce30aa49 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h @@ -7,7 +7,7 @@ static be_define_const_map_slots(be_class_bytes_map) { { be_const_key(seti, -1), be_const_func(m_set) }, { be_const_key(setitem, -1), be_const_func(m_setitem) }, { be_const_key(item, 18), be_const_func(m_item) }, - { be_const_key(dot_p, 3), be_const_var(0) }, + { be_const_key(dot_p, 3), be_const_index(0) }, { be_const_key(geti, -1), be_const_func(m_geti) }, { be_const_key(opt_connect, -1), be_const_func(m_connect) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_list.h b/lib/libesp32/Berry/generate/be_fixed_be_class_list.h index 300efcce0..6d94eb931 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_list.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_list.h @@ -14,7 +14,7 @@ static be_define_const_map_slots(be_class_list_map) { { be_const_key(tostring, 3), be_const_func(m_tostring) }, { be_const_key(opt_eq, -1), be_const_func(m_equal) }, { be_const_key(init, -1), be_const_func(m_init) }, - { be_const_key(dot_p, 17), be_const_var(0) }, + { be_const_key(dot_p, 17), be_const_index(0) }, { be_const_key(setitem, -1), be_const_func(m_setitem) }, { be_const_key(opt_connect, 4), be_const_func(m_connect) }, { be_const_key(opt_neq, -1), be_const_func(m_nequal) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h index d0512204e..df2ec5f5f 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_arc.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_arc_map) { { be_const_key(init, 2), be_const_func(lvbe_arc_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h index c96c467db..0d178107a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_bar.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_bar_map) { { be_const_key(init, 2), be_const_func(lvbe_bar_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h index 29590fa55..e11d63c37 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btn.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_btn_map) { { be_const_key(init, 2), be_const_func(lvbe_btn_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h index 3a029c9c3..eaec83aa4 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_btnmatrix.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_btnmatrix_map) { { be_const_key(init, 2), be_const_func(lvbe_btnmatrix_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h index 80f07efb6..7434f5004 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_calendar.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_calendar_map) { { be_const_key(init, 2), be_const_func(lvbe_calendar_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h index 4fd9bb5ea..7c0b03d35 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_canvas.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_canvas_map) { { be_const_key(init, 2), be_const_func(lvbe_canvas_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h index 6b09657c2..f71d24f42 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_chart.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_chart_map) { { be_const_key(init, 2), be_const_func(lvbe_chart_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h index 3165be40a..a73e60029 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_checkbox.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_checkbox_map) { { be_const_key(init, 2), be_const_func(lvbe_checkbox_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h index 1f4f75bfc..fb031e934 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_color_map) { { be_const_key(init, -1), be_const_func(lco_init) }, { be_const_key(tostring, 2), be_const_func(lco_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, }; static be_define_const_map( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h index 609766430..69e3e156d 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cont.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_cont_map) { { be_const_key(init, 2), be_const_func(lvbe_cont_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h index e9be78a9a..cd1c2af01 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_cpicker.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_cpicker_map) { { be_const_key(init, 2), be_const_func(lvbe_cpicker_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h index 0fea061de..c81a8a43e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_ctypes.h @@ -1,7 +1,7 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_lv_ctypes_map) { - { be_const_key(dot_def, -1), be_const_var(0) }, + { be_const_key(dot_def, -1), be_const_index(0) }, { be_const_key(setmember, -1), be_const_func(be_ctypes_setmember) }, { be_const_key(init, -1), be_const_func(be_ctypes_init) }, { be_const_key(member, 2), be_const_func(be_ctypes_member) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h index b5011f491..ebe16e2f0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_dropdown.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_dropdown_map) { { be_const_key(init, 2), be_const_func(lvbe_dropdown_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h index 1e1ebc351..ee3fb3136 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_font.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_font_map) { { be_const_key(init, -1), be_const_func(lvx_init) }, { be_const_key(tostring, 2), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, }; static be_define_const_map( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h index cb86f23c3..e0d014cc6 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_gauge.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_gauge_map) { { be_const_key(init, 2), be_const_func(lvbe_gauge_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h index f939812a2..393e4cad3 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_group.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_group_map) { { be_const_key(init, 2), be_const_func(lvbe_group_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h index e00cc4a9a..2536f53b5 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_img.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_img_map) { { be_const_key(init, 2), be_const_func(lvbe_img_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h index c35b0d8cd..aa272b8a9 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_imgbtn.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_imgbtn_map) { { be_const_key(init, 2), be_const_func(lvbe_imgbtn_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h index 591758d8f..ecda18431 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_indev.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_indev_map) { { be_const_key(init, 2), be_const_func(lv0_init) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h index f1ffefb5b..293f8c091 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_keyboard.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_keyboard_map) { { be_const_key(init, 2), be_const_func(lvbe_keyboard_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h index c05287a03..b8cb81e58 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_label.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_label_map) { { be_const_key(init, 2), be_const_func(lvbe_label_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h index e3995f1e0..a0f3b0b85 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_led.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_led_map) { { be_const_key(init, 2), be_const_func(lvbe_led_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h index e12a41e8b..34dd43d2d 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_line.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_line_map) { { be_const_key(init, 2), be_const_func(lvbe_line_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h index 72d00f372..9242241d7 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_linemeter.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_linemeter_map) { { be_const_key(init, 2), be_const_func(lvbe_linemeter_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h index ddbf5a12d..630146d49 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_list.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_list_map) { { be_const_key(init, 2), be_const_func(lvbe_list_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h index f4402002b..d922885c0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_msgbox.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_msgbox_map) { { be_const_key(init, 2), be_const_func(lvbe_msgbox_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h index 242fd7edb..a145b957a 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_obj.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_obj_map) { { be_const_key(init, 2), be_const_func(lvbe_obj_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h index 76ec1d349..7bf87f4d7 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_objmask.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_objmask_map) { { be_const_key(init, 2), be_const_func(lvbe_objmask_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h index 99b08a995..a8e711925 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_page.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_page_map) { { be_const_key(init, 2), be_const_func(lvbe_page_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h index 32c3b9ec3..8dc63062b 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_roller.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_roller_map) { { be_const_key(init, 2), be_const_func(lvbe_roller_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h index 2b5f13dee..d37d39db0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_slider.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_slider_map) { { be_const_key(init, 2), be_const_func(lvbe_slider_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h index b511ad385..6258e8832 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinbox.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_spinbox_map) { { be_const_key(init, 2), be_const_func(lvbe_spinbox_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h index d4c71b01e..b782385f1 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_spinner.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_spinner_map) { { be_const_key(init, 2), be_const_func(lvbe_spinner_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h index 0cec3423e..789c6be38 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_style.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_style_map) { { be_const_key(init, 2), be_const_func(lvs_init) }, { be_const_key(tostring, -1), be_const_func(lvs_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h index c84d70737..2033de3b4 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_switch.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_switch_map) { { be_const_key(init, 2), be_const_func(lvbe_switch_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h index b9449ea7d..f351e768d 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_table.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_table_map) { { be_const_key(init, 2), be_const_func(lvbe_table_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h index 39c793ba8..514c2520e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tabview.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_tabview_map) { { be_const_key(init, 2), be_const_func(lvbe_tabview_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h index 290a439bc..25eeb27d7 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_textarea.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_textarea_map) { { be_const_key(init, 2), be_const_func(lvbe_textarea_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h index 88b478d11..04404de1f 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_tileview.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_tileview_map) { { be_const_key(init, 2), be_const_func(lvbe_tileview_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h index edca478bd..96e5c6970 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_win.h @@ -3,7 +3,7 @@ static be_define_const_map_slots(be_class_lv_win_map) { { be_const_key(init, 2), be_const_func(lvbe_win_create) }, { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(member, 0), be_const_func(lvx_member) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_map.h b/lib/libesp32/Berry/generate/be_fixed_be_class_map.h index 76e99df82..d9c033a8b 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_map.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_map.h @@ -1,7 +1,7 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_map_map) { - { be_const_key(dot_p, 2), be_const_var(0) }, + { be_const_key(dot_p, 2), be_const_index(0) }, { be_const_key(insert, -1), be_const_func(m_insert) }, { be_const_key(remove, -1), be_const_func(m_remove) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h b/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h index 121a8e6ea..34f7ae7e5 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_md5.h @@ -2,7 +2,7 @@ static be_define_const_map_slots(be_class_md5_map) { { be_const_key(update, -1), be_const_func(m_md5_update) }, - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(finish, -1), be_const_func(m_md5_finish) }, { be_const_key(init, 1), be_const_func(m_md5_init) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_range.h b/lib/libesp32/Berry/generate/be_fixed_be_class_range.h index 371840af1..cce2842eb 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_range.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_range.h @@ -5,9 +5,9 @@ static be_define_const_map_slots(be_class_range_map) { { be_const_key(iter, -1), be_const_func(m_iter) }, { be_const_key(lower, -1), be_const_func(m_lower) }, { be_const_key(init, 4), be_const_func(m_init) }, - { be_const_key(__upper__, -1), be_const_var(0) }, + { be_const_key(__upper__, -1), be_const_index(0) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, - { be_const_key(__lower__, -1), be_const_var(1) }, + { be_const_key(__lower__, -1), be_const_index(1) }, { be_const_key(upper, 1), be_const_func(m_upper) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h index 2343a1ae9..61b0d7716 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h @@ -10,14 +10,14 @@ static be_define_const_map_slots(be_class_tasmota_map) { { be_const_key(_cmd, -1), be_const_func(l_cmd) }, { be_const_key(web_send, 16), be_const_func(l_webSend) }, { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) }, - { be_const_key(_cb, -1), be_const_var(0) }, + { be_const_key(_cb, -1), be_const_index(0) }, { be_const_key(exec_cmd, -1), be_const_closure(exec_cmd_closure) }, { be_const_key(i2c_enabled, 42), be_const_func(l_i2cenabled) }, { be_const_key(cmd, -1), be_const_closure(cmd_closure) }, { be_const_key(resp_cmnd_done, 28), be_const_func(l_respCmndDone) }, { be_const_key(set_light, 1), be_const_closure(set_light_closure) }, { be_const_key(get_light, -1), be_const_closure(get_light_closure) }, - { be_const_key(_rules, 50), be_const_var(1) }, + { be_const_key(_rules, 50), be_const_index(1) }, { be_const_key(time_reached, -1), be_const_func(l_timereached) }, { be_const_key(web_send_decimal, -1), be_const_func(l_webSendDecimal) }, { be_const_key(load, 22), be_const_closure(load_closure) }, @@ -32,14 +32,14 @@ static be_define_const_map_slots(be_class_tasmota_map) { { be_const_key(get_option, -1), be_const_func(l_getoption) }, { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) }, { be_const_key(response_append, -1), be_const_func(l_respAppend) }, - { be_const_key(_timers, -1), be_const_var(2) }, + { be_const_key(_timers, -1), be_const_index(2) }, { be_const_key(try_rule, -1), be_const_closure(try_rule_closure) }, { be_const_key(set_power, 45), be_const_func(l_setpower) }, { be_const_key(resp_cmnd_error, -1), be_const_func(l_respCmndError) }, { be_const_key(publish, -1), be_const_func(l_publish) }, - { be_const_key(_ccmd, 13), be_const_var(3) }, + { be_const_key(_ccmd, 13), be_const_index(3) }, { be_const_key(_get_cb, -1), be_const_func(l_get_cb) }, - { be_const_key(wire1, 15), be_const_var(4) }, + { be_const_key(wire1, 15), be_const_index(4) }, { be_const_key(gen_cb, 6), be_const_closure(gen_cb_closure) }, { be_const_key(rtc, -1), be_const_func(l_rtc) }, { be_const_key(time_dump, -1), be_const_func(l_time_dump) }, @@ -50,13 +50,13 @@ static be_define_const_map_slots(be_class_tasmota_map) { { be_const_key(find_op, 25), be_const_closure(find_op_closure) }, { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) }, { be_const_key(get_power, -1), be_const_func(l_getpower) }, - { be_const_key(wire2, 8), be_const_var(5) }, + { be_const_key(wire2, 8), be_const_index(5) }, { be_const_key(wire_scan, 55), be_const_closure(wire_scan_closure) }, { be_const_key(resp_cmnd_failed, -1), be_const_func(l_respCmndFailed) }, { be_const_key(exec_rules, -1), be_const_closure(exec_rules_closure) }, { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) }, { be_const_key(resp_cmnd, -1), be_const_func(l_respCmnd) }, - { be_const_key(_drivers, -1), be_const_var(6) }, + { be_const_key(_drivers, -1), be_const_index(6) }, { be_const_key(add_driver, -1), be_const_closure(add_driver_closure) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h index 7ad6a4a4a..19c71b1e0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h @@ -1,31 +1,32 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_tasmota_driver_map) { - { be_const_key(every_second, 1), be_const_var(0) }, - { be_const_key(web_add_config_button, -1), be_const_var(1) }, - { be_const_key(web_sensor, 5), be_const_var(2) }, - { be_const_key(web_add_button, 10), be_const_var(3) }, + { be_const_key(button_pressed, 6), be_const_index(0) }, + { be_const_key(web_add_management_button, -1), be_const_index(1) }, + { be_const_key(web_add_button, 13), be_const_index(2) }, + { be_const_key(web_add_config_button, -1), be_const_index(3) }, + { be_const_key(json_append, -1), be_const_index(4) }, + { be_const_key(display, 3), be_const_index(5) }, + { be_const_key(web_add_console_button, 14), be_const_index(6) }, + { be_const_key(every_100ms, -1), be_const_index(7) }, + { be_const_key(every_50ms, -1), be_const_index(8) }, + { be_const_key(every_second, -1), be_const_index(9) }, + { be_const_key(save_before_restart, -1), be_const_index(10) }, + { be_const_key(get_tasmota, -1), be_const_closure(get_tasmota_closure) }, + { be_const_key(web_sensor, 7), be_const_index(11) }, + { be_const_key(web_add_handler, 1), be_const_index(12) }, + { be_const_key(web_add_main_button, -1), be_const_index(13) }, { be_const_key(add_cmd, -1), be_const_closure(add_cmd_closure) }, - { be_const_key(web_add_console_button, 12), be_const_var(4) }, - { be_const_key(web_add_management_button, -1), be_const_var(5) }, - { be_const_key(display, -1), be_const_var(6) }, - { be_const_key(get_tasmota, 13), be_const_closure(get_tasmota_closure) }, - { be_const_key(every_100ms, -1), be_const_var(7) }, - { be_const_key(save_before_restart, -1), be_const_var(8) }, - { be_const_key(button_pressed, -1), be_const_var(9) }, - { be_const_key(web_add_handler, -1), be_const_var(10) }, - { be_const_key(web_add_main_button, -1), be_const_var(11) }, - { be_const_key(json_append, 8), be_const_var(12) }, }; static be_define_const_map( be_class_tasmota_driver_map, - 15 + 16 ); BE_EXPORT_VARIABLE be_define_const_class( be_class_tasmota_driver, - 13, + 14, NULL, Driver ); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h index 2bc2cdf6a..9801aedbb 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h @@ -3,13 +3,13 @@ static be_define_const_map_slots(be_class_tasmota_i2c_driver_map) { { be_const_key(read32, -1), be_const_closure(read32_closure) }, { be_const_key(write8, 6), be_const_closure(write8_closure) }, - { be_const_key(name, -1), be_const_var(0) }, - { be_const_key(addr, 10), be_const_var(1) }, + { be_const_key(name, -1), be_const_index(0) }, + { be_const_key(addr, 10), be_const_index(1) }, { be_const_key(read12, -1), be_const_closure(read12_closure) }, { be_const_key(write_bit, 8), be_const_closure(write_bit_closure) }, { be_const_key(read13, -1), be_const_closure(read13_closure) }, { be_const_key(read24, -1), be_const_closure(read24_closure) }, - { be_const_key(wire, -1), be_const_var(2) }, + { be_const_key(wire, -1), be_const_index(2) }, { be_const_key(init, -1), be_const_closure(init_closure) }, { be_const_key(read8, -1), be_const_closure(read8_closure) }, }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h index 71ade9f7e..9c5543578 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_wire.h @@ -2,7 +2,7 @@ static be_define_const_map_slots(be_class_tasmota_wire_map) { { be_const_key(_end_transmission, 10), be_const_func(b_wire_endtransmission) }, - { be_const_key(bus, -1), be_const_var(0) }, + { be_const_key(bus, -1), be_const_index(0) }, { be_const_key(_read, 7), be_const_func(b_wire_read) }, { be_const_key(read, -1), be_const_func(b_wire_validread) }, { be_const_key(_request_from, -1), be_const_func(b_wire_requestfrom) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h b/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h index 433187e60..a0ddbeb33 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_lvgl_cb.h @@ -1,7 +1,7 @@ #include "be_constobj.h" static be_define_const_map_slots(be_lvgl_cb_map) { - { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(dot_p, -1), be_const_index(0) }, { be_const_key(tostring, 2), be_const_func(lvx_tostring) }, { be_const_key(call, -1), be_const_func(lv_cb_call) }, { be_const_key(init, 0), be_const_func(lv0_init) }, diff --git a/lib/libesp32/Berry/generate/be_fixed_gpio.h b/lib/libesp32/Berry/generate/be_fixed_gpio.h index 480e53d40..8638ff65e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_gpio.h +++ b/lib/libesp32/Berry/generate/be_fixed_gpio.h @@ -1,269 +1,279 @@ #include "be_constobj.h" static be_define_const_map_slots(m_libgpio_map) { - { be_const_key(MAX31855CLK, -1), be_const_int(79) }, - { be_const_key(DHT11_OUT, 197), be_const_int(40) }, - { be_const_key(PZEM004_RX, 113), be_const_int(47) }, - { be_const_key(BS814_DAT, 115), be_const_int(215) }, - { be_const_key(ROT1B_NP, -1), be_const_int(212) }, - { be_const_key(WEBCAM_HREF, -1), be_const_int(161) }, - { be_const_key(SPI_CLK, 233), be_const_int(23) }, - { be_const_key(TCP_TX, -1), be_const_int(171) }, - { be_const_key(SM16716_DAT, 72), be_const_int(92) }, - { be_const_key(AZ_RXD, 136), be_const_int(77) }, - { be_const_key(PWM1, -1), be_const_int(13) }, - { be_const_key(EXS_ENABLE, -1), be_const_int(129) }, - { be_const_key(ETH_PHY_POWER, -1), be_const_int(173) }, - { be_const_key(HIGH, -1), be_const_int(1) }, - { be_const_key(ETH_PHY_MDIO, -1), be_const_int(175) }, - { be_const_key(MP3_DFR562, 11), be_const_int(67) }, - { be_const_key(HM10_RX, -1), be_const_int(138) }, - { be_const_key(SSPI_MOSI, -1), be_const_int(27) }, - { be_const_key(KEY1_INV_NP, -1), be_const_int(4) }, - { be_const_key(NONE, -1), be_const_int(0) }, - { be_const_key(DDS2382_RX, 18), be_const_int(123) }, - { be_const_key(DSB_OUT, -1), be_const_int(42) }, - { be_const_key(FTC532, -1), be_const_int(195) }, - { be_const_key(ARIRFSEL, 222), be_const_int(99) }, - { be_const_key(pin, -1), be_const_func(gp_pin) }, - { be_const_key(RFRECV, -1), be_const_int(36) }, - { be_const_key(HRXL_RX, -1), be_const_int(144) }, - { be_const_key(HRE_CLOCK, -1), be_const_int(106) }, - { be_const_key(AS608_RX, -1), be_const_int(188) }, - { be_const_key(SDS0X1_TX, -1), be_const_int(54) }, - { be_const_key(TM1637DIO, 112), be_const_int(223) }, - { be_const_key(ILI9488_CS, 138), be_const_int(201) }, - { be_const_key(WEBCAM_VSYNC, 184), be_const_int(160) }, - { be_const_key(TASMOTACLIENT_RST, 224), be_const_int(132) }, - { be_const_key(INPUT, 57), be_const_int(239) }, - { be_const_key(SBR_TX, -1), be_const_int(56) }, - { be_const_key(HPMA_TX, -1), be_const_int(135) }, - { be_const_key(MCP39F5_RX, 41), be_const_int(87) }, - { be_const_key(OUTPUT, 69), be_const_int(2) }, - { be_const_key(AZ_TXD, -1), be_const_int(76) }, { be_const_key(ADC_BUTTON, -1), be_const_int(150) }, - { be_const_key(ETH_PHY_MDC, -1), be_const_int(174) }, - { be_const_key(ZEROCROSS, -1), be_const_int(236) }, - { be_const_key(AS3935, 147), be_const_int(146) }, - { be_const_key(SSPI_MAX31865_CS1, -1), be_const_int(105) }, - { be_const_key(LEDLNK_INV, 56), be_const_int(18) }, - { be_const_key(RDM6300_RX, -1), be_const_int(113) }, - { be_const_key(TM1638STB, -1), be_const_int(66) }, - { be_const_key(SR04_TRIG, 166), be_const_int(58) }, - { be_const_key(CSE7761_RX, -1), be_const_int(229) }, - { be_const_key(HM10_TX, -1), be_const_int(139) }, - { be_const_key(SM16716_CLK, 111), be_const_int(91) }, - { be_const_key(ADC_TEMP, 120), be_const_int(148) }, - { be_const_key(NRG_SEL_INV, -1), be_const_int(82) }, - { be_const_key(OPEN_DRAIN, -1), be_const_int(16) }, - { be_const_key(ST7789_DC, 196), be_const_int(207) }, - { be_const_key(INPUT_PULLDOWN, 122), be_const_int(9) }, - { be_const_key(SM2135_CLK, 219), be_const_int(126) }, - { be_const_key(WEBCAM_PSCLK, 32), be_const_int(163) }, - { be_const_key(ADC_CT_POWER, 82), be_const_int(153) }, - { be_const_key(OUTPUT_OPEN_DRAIN, -1), be_const_int(18) }, - { be_const_key(CC1101_GDO2, -1), be_const_int(143) }, - { be_const_key(SM2135_DAT, 28), be_const_int(127) }, - { be_const_key(digital_write, -1), be_const_func(gp_digital_write) }, - { be_const_key(GPS_TX, 68), be_const_int(137) }, - { be_const_key(TFMINIPLUS_RX, -1), be_const_int(235) }, - { be_const_key(RC522_CS, -1), be_const_int(196) }, - { be_const_key(PMS5003_TX, -1), be_const_int(52) }, - { be_const_key(DDS2382_TX, -1), be_const_int(122) }, - { be_const_key(IEM3000_RX, 133), be_const_int(180) }, - { be_const_key(ZIGBEE_RX, -1), be_const_int(112) }, { be_const_key(ZIGBEE_RST, -1), be_const_int(181) }, - { be_const_key(HPMA_RX, -1), be_const_int(134) }, - { be_const_key(SDS0X1_RX, -1), be_const_int(55) }, - { be_const_key(WEBCAM_RESET, -1), be_const_int(155) }, - { be_const_key(CNTR1, 249), be_const_int(11) }, - { be_const_key(ADC_LIGHT, 231), be_const_int(149) }, - { be_const_key(HRE_DATA, 34), be_const_int(107) }, - { be_const_key(OUTPUT_HI, -1), be_const_int(120) }, - { be_const_key(LED1_INV, 176), be_const_int(10) }, - { be_const_key(LMT01, -1), be_const_int(178) }, - { be_const_key(DSB, -1), be_const_int(41) }, - { be_const_key(CSE7766_RX, -1), be_const_int(97) }, - { be_const_key(SBR_RX, -1), be_const_int(57) }, - { be_const_key(PROJECTOR_CTRL_TX, 148), be_const_int(224) }, - { be_const_key(DI, 211), be_const_int(94) }, - { be_const_key(PZEM0XX_TX, -1), be_const_int(46) }, - { be_const_key(SENSOR_END, -1), be_const_int(240) }, - { be_const_key(A4988_ENA, 97), be_const_int(118) }, - { be_const_key(WEBCAM_PSRCS, 46), be_const_int(165) }, - { be_const_key(ELECTRIQ_MOODL_TX, -1), be_const_int(145) }, - { be_const_key(WEBCAM_XCLK, -1), be_const_int(156) }, - { be_const_key(PN532_RXD, -1), be_const_int(90) }, - { be_const_key(BL0940_RX, 195), be_const_int(170) }, - { be_const_key(PMS5003_RX, -1), be_const_int(53) }, - { be_const_key(HALLEFFECT, -1), be_const_int(237) }, - { be_const_key(PWM1_INV, 172), be_const_int(14) }, - { be_const_key(TASMOTACLIENT_RXD, -1), be_const_int(131) }, - { be_const_key(WEBCAM_SIOD, 110), be_const_int(157) }, - { be_const_key(TM1637CLK, 33), be_const_int(222) }, - { be_const_key(IRRECV, -1), be_const_int(34) }, - { be_const_key(SPI_MOSI, -1), be_const_int(22) }, - { be_const_key(TELEINFO_RX, 182), be_const_int(176) }, - { be_const_key(TASMOTACLIENT_RST_INV, -1), be_const_int(133) }, - { be_const_key(PROJECTOR_CTRL_RX, -1), be_const_int(225) }, - { be_const_key(WIEGAND_D0, -1), be_const_int(216) }, - { be_const_key(ADE7953_IRQ, -1), be_const_int(108) }, - { be_const_key(SPI_DC, -1), be_const_int(25) }, - { be_const_key(IRSEND, -1), be_const_int(33) }, - { be_const_key(TFMINIPLUS_TX, 87), be_const_int(234) }, - { be_const_key(I2C_SCL, -1), be_const_int(19) }, - { be_const_key(MAX7219DIN, -1), be_const_int(232) }, - { be_const_key(ROT1A_NP, -1), be_const_int(211) }, - { be_const_key(PZEM017_RX, 156), be_const_int(49) }, - { be_const_key(WINDMETER_SPEED, -1), be_const_int(168) }, - { be_const_key(RC522_RST, -1), be_const_int(191) }, - { be_const_key(SR04_ECHO, 89), be_const_int(59) }, - { be_const_key(BOILER_OT_TX, -1), be_const_int(167) }, - { be_const_key(ZIGBEE_TX, 104), be_const_int(111) }, - { be_const_key(REL1_INV, -1), be_const_int(8) }, - { be_const_key(WS2812, -1), be_const_int(43) }, - { be_const_key(BUZZER, 0), be_const_int(15) }, - { be_const_key(CC1101_GDO0, -1), be_const_int(142) }, - { be_const_key(SWT1_NP, -1), be_const_int(6) }, - { be_const_key(SSPI_DC, 49), be_const_int(30) }, - { be_const_key(ADC_RANGE, 128), be_const_int(152) }, - { be_const_key(OPTION_A, 174), be_const_int(194) }, - { be_const_key(SHELLY_DIMMER_RST_INV, -1), be_const_int(190) }, - { be_const_key(MGC3130_XFER, -1), be_const_int(73) }, - { be_const_key(VL53L0X_XSHUT1, 140), be_const_int(230) }, - { be_const_key(SSD1351_CS, -1), be_const_int(204) }, - { be_const_key(LEDLNK, 63), be_const_int(17) }, - { be_const_key(P9813_DAT, 67), be_const_int(193) }, - { be_const_key(pin_mode, 218), be_const_func(gp_pin_mode) }, - { be_const_key(RF_SENSOR, -1), be_const_int(75) }, - { be_const_key(TELEINFO_ENABLE, -1), be_const_int(177) }, - { be_const_key(RISING, -1), be_const_int(1) }, - { be_const_key(DHT11, -1), be_const_int(37) }, - { be_const_key(SDCARD_CS, -1), be_const_int(210) }, - { be_const_key(ROT1B, 169), be_const_int(103) }, - { be_const_key(TUYA_RX, -1), be_const_int(72) }, - { be_const_key(SSPI_CS, -1), be_const_int(29) }, - { be_const_key(DCKI, -1), be_const_int(95) }, - { be_const_key(XPT2046_CS, -1), be_const_int(227) }, - { be_const_key(DDSU666_RX, -1), be_const_int(125) }, - { be_const_key(A4988_STP, -1), be_const_int(117) }, - { be_const_key(SOLAXX1_RX, -1), be_const_int(110) }, - { be_const_key(NRG_SEL, -1), be_const_int(81) }, - { be_const_key(HX711_DAT, -1), be_const_int(69) }, - { be_const_key(SSPI_MISO, -1), be_const_int(26) }, - { be_const_key(WEBCAM_HSD, -1), be_const_int(164) }, - { be_const_key(GPS_RX, -1), be_const_int(136) }, - { be_const_key(NEOPOOL_RX, -1), be_const_int(219) }, - { be_const_key(PZEM016_RX, -1), be_const_int(48) }, - { be_const_key(CSE7761_TX, -1), be_const_int(228) }, - { be_const_key(OLED_RESET, -1), be_const_int(32) }, - { be_const_key(ADC_INPUT, 101), be_const_int(147) }, - { be_const_key(LE01MR_TX, 80), be_const_int(141) }, - { be_const_key(EPAPER29_CS, 238), be_const_int(202) }, - { be_const_key(DHT22, -1), be_const_int(38) }, - { be_const_key(BACKLIGHT, -1), be_const_int(31) }, - { be_const_key(NRG_CF1, -1), be_const_int(83) }, - { be_const_key(MCP39F5_RST, 1), be_const_int(88) }, - { be_const_key(SDM120_TX, -1), be_const_int(60) }, - { be_const_key(HLW_CF, -1), be_const_int(84) }, - { be_const_key(BOILER_OT_RX, -1), be_const_int(166) }, - { be_const_key(TUYA_TX, -1), be_const_int(71) }, - { be_const_key(NRF24_DC, -1), be_const_int(198) }, - { be_const_key(TM1638DIO, -1), be_const_int(65) }, - { be_const_key(IBEACON_RX, 179), be_const_int(115) }, - { be_const_key(DEEPSLEEP, -1), be_const_int(128) }, - { be_const_key(HJL_CF, -1), be_const_int(85) }, - { be_const_key(DDSU666_TX, 154), be_const_int(124) }, - { be_const_key(MHZ_TXD, -1), be_const_int(44) }, - { be_const_key(MIEL_HVAC_TX, 22), be_const_int(183) }, - { be_const_key(BS814_CLK, 209), be_const_int(214) }, - { be_const_key(SM16716_SEL, -1), be_const_int(93) }, - { be_const_key(KEY1_TC, 48), be_const_int(169) }, - { be_const_key(SWT1, 5), be_const_int(5) }, - { be_const_key(WEBCAM_DATA, 217), be_const_int(159) }, - { be_const_key(PULLDOWN, -1), be_const_int(8) }, - { be_const_key(A4988_MS1, -1), be_const_int(119) }, - { be_const_key(pin_used, -1), be_const_func(gp_pin_used) }, - { be_const_key(IBEACON_TX, 220), be_const_int(114) }, - { be_const_key(NRF24_CS, -1), be_const_int(197) }, - { be_const_key(RXD, -1), be_const_int(101) }, - { be_const_key(NEOPOOL_TX, -1), be_const_int(218) }, - { be_const_key(WEBCAM_SIOC, -1), be_const_int(158) }, - { be_const_key(TASMOTACLIENT_TXD, -1), be_const_int(130) }, - { be_const_key(MAX31855CS, -1), be_const_int(78) }, - { be_const_key(TM1638CLK, -1), be_const_int(64) }, - { be_const_key(ILI9341_CS, -1), be_const_int(199) }, - { be_const_key(PN532_TXD, -1), be_const_int(89) }, - { be_const_key(LOW, -1), be_const_int(0) }, - { be_const_key(SOLAXX1_TX, -1), be_const_int(109) }, - { be_const_key(SDM72_RX, -1), be_const_int(221) }, - { be_const_key(PULLUP, -1), be_const_int(4) }, - { be_const_key(MIEL_HVAC_RX, -1), be_const_int(184) }, - { be_const_key(MAX31855DO, 216), be_const_int(80) }, - { be_const_key(REL1, -1), be_const_int(7) }, - { be_const_key(HX711_SCK, -1), be_const_int(68) }, - { be_const_key(WEBCAM_PCLK, -1), be_const_int(162) }, - { be_const_key(ARIRFRCV, 175), be_const_int(98) }, - { be_const_key(SAIR_TX, -1), be_const_int(50) }, - { be_const_key(digital_read, -1), be_const_func(gp_digital_read) }, - { be_const_key(LE01MR_RX, 125), be_const_int(140) }, - { be_const_key(TX2X_TXD_BLACK, -1), be_const_int(70) }, - { be_const_key(KEY1_INV, -1), be_const_int(3) }, - { be_const_key(ADC_JOY, -1), be_const_int(104) }, - { be_const_key(ST7789_CS, -1), be_const_int(206) }, - { be_const_key(SSD1331_CS, -1), be_const_int(208) }, - { be_const_key(FALLING, -1), be_const_int(2) }, - { be_const_key(SPI_CS, -1), be_const_int(24) }, - { be_const_key(BUZZER_INV, -1), be_const_int(16) }, - { be_const_key(RFSEND, -1), be_const_int(35) }, - { be_const_key(WE517_RX, -1), be_const_int(186) }, - { be_const_key(INPUT_PULLUP, -1), be_const_int(5) }, - { be_const_key(A4988_DIR, 223), be_const_int(116) }, - { be_const_key(SSPI_SCLK, -1), be_const_int(28) }, - { be_const_key(EPAPER42_CS, 252), be_const_int(203) }, - { be_const_key(SDM120_RX, -1), be_const_int(61) }, - { be_const_key(DYP_RX, -1), be_const_int(182) }, - { be_const_key(EPD_DATA, -1), be_const_int(238) }, - { be_const_key(TXD, -1), be_const_int(100) }, - { be_const_key(P9813_CLK, -1), be_const_int(192) }, + { be_const_key(SPI_CLK, 231), be_const_int(23) }, { be_const_key(MHZ_RXD, -1), be_const_int(45) }, - { be_const_key(WIEGAND_D1, -1), be_const_int(217) }, - { be_const_key(SSD1331_DC, 90), be_const_int(209) }, - { be_const_key(ADC_PH, -1), be_const_int(213) }, - { be_const_key(CSE7766_TX, -1), be_const_int(96) }, - { be_const_key(ADC_BUTTON_INV, 81), be_const_int(151) }, + { be_const_key(SDM72_RX, -1), be_const_int(221) }, + { be_const_key(A4988_MS1, -1), be_const_int(119) }, + { be_const_key(DEEPSLEEP, -1), be_const_int(128) }, + { be_const_key(WIEGAND_D1, 192), be_const_int(217) }, + { be_const_key(WEBCAM_HSD, -1), be_const_int(164) }, + { be_const_key(TM1637DIO, -1), be_const_int(223) }, + { be_const_key(KEY1_INV_NP, 252), be_const_int(4) }, + { be_const_key(IBEACON_RX, -1), be_const_int(115) }, + { be_const_key(OUTPUT_LO, 243), be_const_int(121) }, + { be_const_key(RISING, 87), be_const_int(1) }, + { be_const_key(WEBCAM_PWDN, 10), be_const_int(154) }, + { be_const_key(BOILER_OT_TX, 32), be_const_int(167) }, { be_const_key(CNTR1_NP, -1), be_const_int(12) }, - { be_const_key(OUTPUT_LO, 85), be_const_int(121) }, - { be_const_key(SHELLY_DIMMER_BOOT0, -1), be_const_int(189) }, - { be_const_key(WEBCAM_PWDN, -1), be_const_int(154) }, - { be_const_key(KEY1, 246), be_const_int(1) }, - { be_const_key(RA8876_CS, 204), be_const_int(205) }, - { be_const_key(SDM630_RX, 171), be_const_int(63) }, - { be_const_key(ILI9341_DC, -1), be_const_int(200) }, - { be_const_key(LED1, 257), be_const_int(9) }, - { be_const_key(SPI_MISO, -1), be_const_int(21) }, - { be_const_key(SSD1351_DC, 30), be_const_int(226) }, - { be_const_key(MAX7219CLK, -1), be_const_int(231) }, - { be_const_key(MCP39F5_TX, -1), be_const_int(86) }, - { be_const_key(ROT1A, -1), be_const_int(102) }, - { be_const_key(TCP_RX, 42), be_const_int(172) }, - { be_const_key(WE517_TX, -1), be_const_int(185) }, - { be_const_key(SAIR_RX, 214), be_const_int(51) }, - { be_const_key(IEM3000_TX, 143), be_const_int(179) }, - { be_const_key(SDM630_TX, -1), be_const_int(62) }, - { be_const_key(KEY1_NP, 251), be_const_int(2) }, - { be_const_key(I2C_SDA, -1), be_const_int(20) }, - { be_const_key(MGC3130_RESET, -1), be_const_int(74) }, - { be_const_key(SI7021, -1), be_const_int(39) }, - { be_const_key(MAX7219CS, 151), be_const_int(233) }, - { be_const_key(SDM72_TX, -1), be_const_int(220) }, - { be_const_key(AS608_TX, 6), be_const_int(187) }, + { be_const_key(MAX7219DIN, -1), be_const_int(232) }, + { be_const_key(I2C_SDA, 42), be_const_int(20) }, + { be_const_key(DCKI, 188), be_const_int(95) }, + { be_const_key(I2S_IN_CLK, -1), be_const_int(247) }, { be_const_key(CHANGE, -1), be_const_int(4) }, + { be_const_key(pin_used, -1), be_const_func(gp_pin_used) }, + { be_const_key(HALLEFFECT, -1), be_const_int(237) }, + { be_const_key(ADC_TEMP, 112), be_const_int(148) }, + { be_const_key(SSPI_MOSI, 254), be_const_int(27) }, + { be_const_key(TASMOTACLIENT_RST, -1), be_const_int(132) }, + { be_const_key(ZIGBEE_RX, -1), be_const_int(112) }, + { be_const_key(ROT1B_NP, 107), be_const_int(212) }, + { be_const_key(SSD1351_CS, 149), be_const_int(204) }, + { be_const_key(MAX7219CLK, -1), be_const_int(231) }, + { be_const_key(SSD1331_DC, -1), be_const_int(209) }, + { be_const_key(SR04_TRIG, -1), be_const_int(58) }, + { be_const_key(TCP_RX, 187), be_const_int(172) }, + { be_const_key(SM16716_DAT, 91), be_const_int(92) }, + { be_const_key(OLED_RESET, 264), be_const_int(32) }, + { be_const_key(RDM6300_RX, -1), be_const_int(113) }, + { be_const_key(LOW, -1), be_const_int(0) }, + { be_const_key(ADC_BUTTON_INV, 79), be_const_int(151) }, + { be_const_key(SM16716_CLK, 76), be_const_int(91) }, + { be_const_key(SSPI_DC, -1), be_const_int(30) }, + { be_const_key(TFMINIPLUS_RX, -1), be_const_int(235) }, + { be_const_key(TM1638CLK, -1), be_const_int(64) }, + { be_const_key(BL0940_RX, -1), be_const_int(170) }, + { be_const_key(WEBCAM_PSCLK, -1), be_const_int(163) }, + { be_const_key(RFRECV, -1), be_const_int(36) }, + { be_const_key(GPS_RX, 124), be_const_int(136) }, + { be_const_key(DSB_OUT, -1), be_const_int(42) }, + { be_const_key(HPMA_TX, -1), be_const_int(135) }, + { be_const_key(SHELLY_DIMMER_RST_INV, -1), be_const_int(190) }, + { be_const_key(SDM72_TX, -1), be_const_int(220) }, + { be_const_key(HJL_CF, -1), be_const_int(85) }, + { be_const_key(IEM3000_RX, 24), be_const_int(180) }, + { be_const_key(KEY1_NP, -1), be_const_int(2) }, + { be_const_key(DDS2382_RX, -1), be_const_int(123) }, + { be_const_key(INPUT_PULLDOWN, -1), be_const_int(9) }, + { be_const_key(SSPI_MISO, -1), be_const_int(26) }, + { be_const_key(DDS2382_TX, -1), be_const_int(122) }, + { be_const_key(SDM630_RX, -1), be_const_int(63) }, + { be_const_key(SDS0X1_TX, 63), be_const_int(54) }, + { be_const_key(HPMA_RX, -1), be_const_int(134) }, + { be_const_key(DYP_RX, -1), be_const_int(182) }, + { be_const_key(NRG_CF1, 138), be_const_int(83) }, + { be_const_key(REL1_INV, 169), be_const_int(8) }, + { be_const_key(MCP39F5_RST, 131), be_const_int(88) }, + { be_const_key(I2S_OUT_SLCT, 170), be_const_int(245) }, + { be_const_key(ADE7953_IRQ, -1), be_const_int(108) }, + { be_const_key(REL1, -1), be_const_int(7) }, + { be_const_key(SOLAXX1_TX, 154), be_const_int(109) }, + { be_const_key(CSE7766_RX, -1), be_const_int(97) }, + { be_const_key(PROJECTOR_CTRL_TX, 29), be_const_int(224) }, + { be_const_key(PULLUP, -1), be_const_int(4) }, + { be_const_key(SPI_DC, 90), be_const_int(25) }, + { be_const_key(IBEACON_TX, -1), be_const_int(114) }, + { be_const_key(IEM3000_TX, 157), be_const_int(179) }, + { be_const_key(WEBCAM_PSRCS, -1), be_const_int(165) }, + { be_const_key(ELECTRIQ_MOODL_TX, -1), be_const_int(145) }, + { be_const_key(LED1_INV, -1), be_const_int(10) }, + { be_const_key(TASMOTACLIENT_RXD, 109), be_const_int(131) }, + { be_const_key(PN532_RXD, -1), be_const_int(90) }, + { be_const_key(ROT1A, 197), be_const_int(102) }, + { be_const_key(PROJECTOR_CTRL_RX, -1), be_const_int(225) }, + { be_const_key(EPAPER29_CS, -1), be_const_int(202) }, + { be_const_key(VL53L0X_XSHUT1, -1), be_const_int(230) }, + { be_const_key(DDSU666_RX, 22), be_const_int(125) }, + { be_const_key(SSPI_CS, -1), be_const_int(29) }, + { be_const_key(BACKLIGHT, 60), be_const_int(31) }, + { be_const_key(CC1101_GDO0, 225), be_const_int(142) }, + { be_const_key(INTERRUPT, -1), be_const_int(249) }, + { be_const_key(MP3_DFR562, -1), be_const_int(67) }, + { be_const_key(ROT1A_NP, -1), be_const_int(211) }, + { be_const_key(PZEM017_RX, -1), be_const_int(49) }, + { be_const_key(RC522_CS, 81), be_const_int(196) }, + { be_const_key(TASMOTACLIENT_RST_INV, -1), be_const_int(133) }, + { be_const_key(ETH_PHY_MDIO, -1), be_const_int(175) }, + { be_const_key(WE517_RX, -1), be_const_int(186) }, + { be_const_key(LMT01, -1), be_const_int(178) }, + { be_const_key(ILI9488_CS, -1), be_const_int(201) }, + { be_const_key(I2C_SCL, 0), be_const_int(19) }, + { be_const_key(TM1638STB, -1), be_const_int(66) }, + { be_const_key(ETH_PHY_MDC, -1), be_const_int(174) }, + { be_const_key(WE517_TX, 96), be_const_int(185) }, + { be_const_key(IRSEND, -1), be_const_int(33) }, + { be_const_key(I2S_OUT_CLK, -1), be_const_int(244) }, + { be_const_key(SPI_CS, -1), be_const_int(24) }, + { be_const_key(SWT1, -1), be_const_int(5) }, + { be_const_key(HM10_RX, -1), be_const_int(138) }, + { be_const_key(WEBCAM_HREF, -1), be_const_int(161) }, + { be_const_key(OPEN_DRAIN, -1), be_const_int(16) }, + { be_const_key(AS608_TX, -1), be_const_int(187) }, + { be_const_key(SSPI_SCLK, -1), be_const_int(28) }, + { be_const_key(A4988_DIR, -1), be_const_int(116) }, + { be_const_key(SHELLY_DIMMER_BOOT0, -1), be_const_int(189) }, + { be_const_key(I2S_OUT_DATA, -1), be_const_int(243) }, + { be_const_key(MIEL_HVAC_TX, -1), be_const_int(183) }, + { be_const_key(WEBCAM_SIOC, 41), be_const_int(158) }, + { be_const_key(RF_SENSOR, 57), be_const_int(75) }, + { be_const_key(AZ_TXD, -1), be_const_int(76) }, + { be_const_key(A4988_ENA, -1), be_const_int(118) }, + { be_const_key(DHT22, -1), be_const_int(38) }, + { be_const_key(TASMOTACLIENT_TXD, -1), be_const_int(130) }, + { be_const_key(TELEINFO_ENABLE, 62), be_const_int(177) }, + { be_const_key(NRF24_CS, -1), be_const_int(197) }, + { be_const_key(HRE_CLOCK, -1), be_const_int(106) }, + { be_const_key(NEOPOOL_RX, 158), be_const_int(219) }, + { be_const_key(HIGH, 237), be_const_int(1) }, + { be_const_key(HLW_CF, 53), be_const_int(84) }, + { be_const_key(AZ_RXD, -1), be_const_int(77) }, + { be_const_key(HM10_TX, 167), be_const_int(139) }, + { be_const_key(LEDLNK, 155), be_const_int(17) }, + { be_const_key(PWM1, -1), be_const_int(13) }, + { be_const_key(BS814_CLK, -1), be_const_int(214) }, + { be_const_key(TFMINIPLUS_TX, 99), be_const_int(234) }, + { be_const_key(WEBCAM_PCLK, -1), be_const_int(162) }, + { be_const_key(DSB, -1), be_const_int(41) }, + { be_const_key(NONE, -1), be_const_int(0) }, + { be_const_key(pin, 19), be_const_func(gp_pin) }, + { be_const_key(PN532_TXD, -1), be_const_int(89) }, + { be_const_key(SENSOR_END, 222), be_const_int(250) }, + { be_const_key(SM2135_CLK, -1), be_const_int(126) }, + { be_const_key(TX2X_TXD_BLACK, -1), be_const_int(70) }, + { be_const_key(ZEROCROSS, -1), be_const_int(236) }, + { be_const_key(ADC_INPUT, -1), be_const_int(147) }, + { be_const_key(RC522_RST, -1), be_const_int(191) }, + { be_const_key(SSD1331_CS, -1), be_const_int(208) }, + { be_const_key(BS814_DAT, -1), be_const_int(215) }, + { be_const_key(PULLDOWN, -1), be_const_int(8) }, + { be_const_key(I2S_IN_SLCT, 105), be_const_int(248) }, + { be_const_key(OPTION_A, -1), be_const_int(194) }, + { be_const_key(DI, -1), be_const_int(94) }, + { be_const_key(PZEM004_RX, -1), be_const_int(47) }, + { be_const_key(SDCARD_CS, -1), be_const_int(210) }, + { be_const_key(ZIGBEE_TX, 94), be_const_int(111) }, + { be_const_key(ST7789_DC, 50), be_const_int(207) }, + { be_const_key(P9813_DAT, 214), be_const_int(193) }, + { be_const_key(EXS_ENABLE, 56), be_const_int(129) }, + { be_const_key(SSPI_MAX31865_CS1, 147), be_const_int(105) }, + { be_const_key(PMS5003_RX, -1), be_const_int(53) }, + { be_const_key(pin_mode, -1), be_const_func(gp_pin_mode) }, + { be_const_key(SAIR_TX, 4), be_const_int(50) }, + { be_const_key(CSE7761_RX, 102), be_const_int(229) }, + { be_const_key(SBR_RX, 47), be_const_int(57) }, + { be_const_key(SOLAXX1_RX, -1), be_const_int(110) }, + { be_const_key(KEY1, 5), be_const_int(1) }, + { be_const_key(GPS_TX, 227), be_const_int(137) }, + { be_const_key(EPD_DATA, -1), be_const_int(238) }, + { be_const_key(WS2812, -1), be_const_int(43) }, + { be_const_key(PZEM0XX_TX, -1), be_const_int(46) }, + { be_const_key(WINDMETER_SPEED, -1), be_const_int(168) }, + { be_const_key(TUYA_RX, 199), be_const_int(72) }, + { be_const_key(NRG_SEL, -1), be_const_int(81) }, + { be_const_key(PZEM016_RX, 13), be_const_int(48) }, + { be_const_key(KEY1_PD, -1), be_const_int(240) }, + { be_const_key(LE01MR_RX, -1), be_const_int(140) }, + { be_const_key(ADC_PH, -1), be_const_int(213) }, + { be_const_key(SDM120_TX, -1), be_const_int(60) }, + { be_const_key(HX711_DAT, -1), be_const_int(69) }, + { be_const_key(CNTR1, 132), be_const_int(11) }, + { be_const_key(PWM1_INV, 184), be_const_int(14) }, + { be_const_key(RFSEND, 182), be_const_int(35) }, + { be_const_key(RXD, 194), be_const_int(101) }, + { be_const_key(SDM120_RX, -1), be_const_int(61) }, + { be_const_key(SWT1_NP, -1), be_const_int(6) }, + { be_const_key(MAX31855CLK, -1), be_const_int(79) }, + { be_const_key(DDSU666_TX, -1), be_const_int(124) }, + { be_const_key(MHZ_TXD, -1), be_const_int(44) }, + { be_const_key(OUTPUT_HI, -1), be_const_int(120) }, + { be_const_key(SM16716_SEL, -1), be_const_int(93) }, + { be_const_key(KEY1_INV_PD, -1), be_const_int(241) }, + { be_const_key(BOILER_OT_RX, 9), be_const_int(166) }, + { be_const_key(WEBCAM_SIOD, 78), be_const_int(157) }, + { be_const_key(SI7021, -1), be_const_int(39) }, + { be_const_key(MIEL_HVAC_RX, -1), be_const_int(184) }, + { be_const_key(P9813_CLK, -1), be_const_int(192) }, + { be_const_key(NRG_SEL_INV, 232), be_const_int(82) }, + { be_const_key(INPUT, 85), be_const_int(239) }, + { be_const_key(AS608_RX, -1), be_const_int(188) }, + { be_const_key(SR04_ECHO, -1), be_const_int(59) }, + { be_const_key(CSE7761_TX, -1), be_const_int(228) }, + { be_const_key(digital_write, -1), be_const_func(gp_digital_write) }, + { be_const_key(MAX31855DO, -1), be_const_int(80) }, + { be_const_key(CC1101_GDO2, -1), be_const_int(143) }, + { be_const_key(ETH_PHY_POWER, -1), be_const_int(173) }, + { be_const_key(ILI9341_CS, -1), be_const_int(199) }, + { be_const_key(OUTPUT_OPEN_DRAIN, -1), be_const_int(18) }, + { be_const_key(TM1637CLK, -1), be_const_int(222) }, + { be_const_key(SPI_MISO, 176), be_const_int(21) }, + { be_const_key(KEY1_INV, -1), be_const_int(3) }, + { be_const_key(PMS5003_TX, 75), be_const_int(52) }, + { be_const_key(A4988_STP, -1), be_const_int(117) }, + { be_const_key(WEBCAM_VSYNC, -1), be_const_int(160) }, + { be_const_key(SWT1_PD, -1), be_const_int(242) }, + { be_const_key(AS3935, -1), be_const_int(146) }, + { be_const_key(CSE7766_TX, 100), be_const_int(96) }, + { be_const_key(NEOPOOL_TX, 148), be_const_int(218) }, + { be_const_key(ADC_RANGE, 72), be_const_int(152) }, + { be_const_key(ILI9341_DC, -1), be_const_int(200) }, + { be_const_key(DHT11, -1), be_const_int(37) }, + { be_const_key(SM2135_DAT, 238), be_const_int(127) }, + { be_const_key(MCP39F5_RX, 211), be_const_int(87) }, + { be_const_key(HX711_SCK, 7), be_const_int(68) }, + { be_const_key(SAIR_RX, -1), be_const_int(51) }, + { be_const_key(SDS0X1_RX, -1), be_const_int(55) }, + { be_const_key(ARIRFSEL, 266), be_const_int(99) }, + { be_const_key(WEBCAM_RESET, -1), be_const_int(155) }, + { be_const_key(BUZZER_INV, -1), be_const_int(16) }, + { be_const_key(DHT11_OUT, -1), be_const_int(40) }, + { be_const_key(FALLING, -1), be_const_int(2) }, + { be_const_key(MAX7219CS, -1), be_const_int(233) }, + { be_const_key(ARIRFRCV, -1), be_const_int(98) }, + { be_const_key(ADC_CT_POWER, -1), be_const_int(153) }, + { be_const_key(HRXL_RX, -1), be_const_int(144) }, + { be_const_key(WEBCAM_DATA, 58), be_const_int(159) }, + { be_const_key(TUYA_TX, -1), be_const_int(71) }, + { be_const_key(SPI_MOSI, -1), be_const_int(22) }, + { be_const_key(WIEGAND_D0, 33), be_const_int(216) }, + { be_const_key(digital_read, 137), be_const_func(gp_digital_read) }, + { be_const_key(ROT1B, -1), be_const_int(103) }, + { be_const_key(FTC532, -1), be_const_int(195) }, + { be_const_key(HRE_DATA, 35), be_const_int(107) }, + { be_const_key(I2S_IN_DATA, -1), be_const_int(246) }, + { be_const_key(TCP_TX, 26), be_const_int(171) }, + { be_const_key(ST7789_CS, -1), be_const_int(206) }, + { be_const_key(ADC_JOY, -1), be_const_int(104) }, + { be_const_key(OUTPUT, 229), be_const_int(2) }, + { be_const_key(NRF24_DC, -1), be_const_int(198) }, + { be_const_key(IRRECV, 27), be_const_int(34) }, + { be_const_key(MCP39F5_TX, 230), be_const_int(86) }, + { be_const_key(TELEINFO_RX, 52), be_const_int(176) }, + { be_const_key(SSD1351_DC, -1), be_const_int(226) }, + { be_const_key(TM1638DIO, -1), be_const_int(65) }, + { be_const_key(TXD, 139), be_const_int(100) }, + { be_const_key(XPT2046_CS, -1), be_const_int(227) }, + { be_const_key(LED1, 212), be_const_int(9) }, + { be_const_key(LEDLNK_INV, -1), be_const_int(18) }, + { be_const_key(SBR_TX, -1), be_const_int(56) }, + { be_const_key(RA8876_CS, -1), be_const_int(205) }, + { be_const_key(KEY1_TC, 180), be_const_int(169) }, + { be_const_key(INPUT_PULLUP, -1), be_const_int(5) }, + { be_const_key(EPAPER42_CS, -1), be_const_int(203) }, + { be_const_key(BUZZER, -1), be_const_int(15) }, + { be_const_key(WEBCAM_XCLK, -1), be_const_int(156) }, + { be_const_key(ADC_LIGHT, 134), be_const_int(149) }, + { be_const_key(SDM630_TX, 69), be_const_int(62) }, + { be_const_key(MGC3130_XFER, 260), be_const_int(73) }, + { be_const_key(MGC3130_RESET, 219), be_const_int(74) }, + { be_const_key(MAX31855CS, -1), be_const_int(78) }, + { be_const_key(LE01MR_TX, -1), be_const_int(141) }, }; static be_define_const_map( m_libgpio_map, - 258 + 268 ); static be_define_const_module( diff --git a/lib/libesp32/Berry/src/be_constobj.h b/lib/libesp32/Berry/src/be_constobj.h index 543d6b62a..d5d417161 100644 --- a/lib/libesp32/Berry/src/be_constobj.h +++ b/lib/libesp32/Berry/src/be_constobj.h @@ -37,12 +37,17 @@ extern "C" { .type = BE_FUNCTION \ } +#define be_const_nil() { \ + .v.i = 0, \ + .type = BE_NIL \ +} + #define be_const_int(_val) { \ .v.i = (bint)(_val), \ .type = BE_INT \ } -#define be_const_var(_val) { \ +#define be_const_index(_val) { \ .v.i = (bint)(_val), \ .type = BE_INDEX \ } @@ -52,6 +57,16 @@ extern "C" { .type = BE_REAL \ } +#define be_const_real_hex(_val) { \ + .v.p = (void*)(_val), \ + .type = BE_REAL \ +} + +#define be_const_bool(_val) { \ + .v.b = (bbool)(_val), \ + .type = BE_BOOL \ +} + #define be_const_str(_str) { \ .v.s = (bstring*)(_str), \ .type = BE_STRING \ @@ -88,7 +103,7 @@ const bmap _name = { \ const bclass _name = { \ be_const_header(BE_CLASS), \ .nvar = _nvar, \ - .super = (bclass*)_super, \ + .super = _super, \ .members = (bmap*)&_name##_map, \ .name = (bstring*)&be_const_str_##_name_ \ } @@ -127,6 +142,39 @@ const bntvmodule be_native_module(_module) = { \ .init = _init \ } +/* defines needed for solidified classes */ +#define be_local_class(_name, _nvar, _super, _map, _cname) \ + const bclass be_##_name##_class = { \ + be_const_header(BE_CLASS), \ + .nvar = _nvar, \ + .super = (bclass*)_super, \ + .members = (bmap*)_map, \ + .name = _cname \ +} + +#define be_nested_map(_size, _slots) \ + & (const bmap) { \ + be_const_header(BE_MAP), \ + .slots = _slots, \ + .lastfree = NULL, \ + .size = _size, \ + .count = _size \ + } + +#define be_nested_string(_str, _hash, _len) \ + { \ + { .s=(be_nested_const_str(_str, _hash, _len )) \ + }, \ + BE_STRING \ + } + +#define be_nested_key(_str, _hash, _len, _next) \ + { \ + { .s=(be_nested_const_str(_str, _hash, _len )) }, \ + BE_STRING, \ + (uint32_t)(_next) & 0xFFFFFF \ + } + #else #define be_const_key(_str, _next) { \ @@ -140,12 +188,22 @@ const bntvmodule be_native_module(_module) = { \ BE_FUNCTION \ } +#define be_const_nil() { \ + bvaldata(0), \ + BE_NIL \ +} + #define be_const_int(_val) { \ bvaldata(bint(_val)), \ BE_INT \ } -#define be_const_var(_val) { \ +#define be_const_bool(_val) { \ + bvaldata(bbool(_val)), \ + BE_BOOL \ +} + +#define be_const_index(_val) { \ bvaldata(bint(_val)), \ BE_INDEX \ } @@ -155,6 +213,11 @@ const bntvmodule be_native_module(_module) = { \ BE_REAL \ } +#define be_const_real_hex(_val) { \ + bvaldata((void*)(_val)), \ + BE_REAL \ +} + #define be_const_str(_string) { \ bvaldata(bstring(_string)), \ BE_STRING \ diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 744d9cecb..2c2928010 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -1235,7 +1235,24 @@ static void classvar_stmt(bparser *parser, bclass *c) } } -static void classstatic_stmt(bparser *parser, bclass *c) +static void class_static_assignment_expr(bparser *parser, bexpdesc *e, bstring *name) +{ + if (match_skip(parser, OptAssign)) { /* '=' */ + bexpdesc e1, e2; + /* parse the right expression */ + expr(parser, &e2); + + e1 = *e; /* copy the class description */ + bexpdesc key; /* build the member key */ + init_exp(&key, ETSTRING, 0); + key.v.s = name; + + be_code_member(parser->finfo, &e1, &key); /* compute member accessor */ + be_code_setvar(parser->finfo, &e1, &e2); /* set member */ + } +} + +static void classstatic_stmt(bparser *parser, bclass *c, bexpdesc *e) { bstring *name; /* 'static' ID {',' ID} */ @@ -1243,10 +1260,13 @@ static void classstatic_stmt(bparser *parser, bclass *c) if (match_id(parser, name) != NULL) { check_class_attr(parser, c, name); be_member_bind(parser->vm, c, name, bfalse); + class_static_assignment_expr(parser, e, name); + while (match_skip(parser, OptComma)) { /* ',' */ if (match_id(parser, name) != NULL) { check_class_attr(parser, c, name); be_member_bind(parser->vm, c, name, bfalse); + class_static_assignment_expr(parser, e, name); } else { parser_error(parser, "class static error"); } @@ -1281,13 +1301,13 @@ static void class_inherit(bparser *parser, bexpdesc *e) } } -static void class_block(bparser *parser, bclass *c) +static void class_block(bparser *parser, bclass *c, bexpdesc *e) { /* { [;] } */ while (block_follow(parser)) { switch (next_type(parser)) { case KeyVar: classvar_stmt(parser, c); break; - case KeyStatic: classstatic_stmt(parser, c); break; + case KeyStatic: classstatic_stmt(parser, c, e); break; case KeyDef: classdef_stmt(parser, c); break; case OptSemic: scan_next_token(parser); break; default: push_error(parser, @@ -1307,7 +1327,7 @@ static void class_stmt(bparser *parser) new_var(parser, name, &e); be_code_class(parser->finfo, &e, c); class_inherit(parser, &e); - class_block(parser, c); + class_block(parser, c, &e); be_class_compress(parser->vm, c); /* compress class size */ match_token(parser, KeyEnd); /* skip 'end' */ } else { diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index a6dec57ac..2a8880cdb 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -32,17 +32,49 @@ be_writestring(__lbuf); \ } while (0) -/* output only valid types for ktab, or NULL */ -static const char * m_type_ktab(int type) +static void m_solidify_bvalue(bvm *vm, bvalue * value) { - switch (type){ - case BE_NIL: return "BE_NIL"; - case BE_INT: return "BE_INT"; - case BE_INDEX: return "BE_INDEX"; - case BE_REAL: return "BE_REAL"; - case BE_BOOL: return "BE_BOOL"; - case BE_STRING: return "BE_STRING"; - default: return NULL; + int type = var_type(value); + switch (type) { + case BE_NIL: + logfmt("be_const_nil()"); + break; + case BE_BOOL: + logfmt("be_const_bool(%i)", var_tobool(value)); + break; + case BE_INT: + logfmt("be_const_int(%lli)", var_toint(value)); + break; + case BE_INDEX: + logfmt("be_const_index(%lli)", var_toint(value)); + break; + case BE_REAL: +#if BE_USE_SINGLE_FLOAT + logfmt("be_const_real_hex(0x%08X)", (uint32_t) var_toobj(value)); +#else + logfmt("be_const_real_hex(0x%016llX)", (uint64_t) var_toobj(value)); +#endif + break; + case BE_STRING: + { + logfmt("be_nested_string(\""); + be_writestring(str(var_tostr(value))); + size_t len = strlen(str(var_tostr(value))); + if (len >= 255) { + be_raise(vm, "internal_error", "Strings greater than 255 chars not supported yet"); + } + logfmt("\", %i, %zu)", be_strhash(var_tostr(value)), len >= 255 ? 255 : len); + } + break; + case BE_CLOSURE: + logfmt("be_const_closure(%s_closure)", str(((bclosure*) var_toobj(value))->proto->name)); + break; + default: + { + char error[64]; + snprintf(error, sizeof(error), "Unsupported type in function constants: %i", type); + be_raise(vm, "internal_error", error); + } } } @@ -85,32 +117,9 @@ static void m_solidify_proto(bvm *vm, bproto *pr, const char * func_name, int bu if (pr->nconst > 0) { logfmt("%*s( &(const bvalue[%2d]) { /* constants */\n", indent, "", pr->nconst); for (int k = 0; k < pr->nconst; k++) { - int type = pr->ktab[k].type; - const char *type_name = m_type_ktab(type); - if (type_name == NULL) { - char error[64]; - snprintf(error, sizeof(error), "Unsupported type in function constants: %i", type); - be_raise(vm, "internal_error", error); - } - if (type == BE_STRING) { - logfmt("%*s { { .s=be_nested_const_str(\"", indent, ""); - be_writestring(str(pr->ktab[k].v.s)); - size_t len = strlen(str(pr->ktab[k].v.s)); - if (len >= 255) { - be_raise(vm, "internal_error", "Strings greater than 255 chars not supported yet"); - } - logfmt("\", %i, %zu) }, %s},\n", be_strhash(pr->ktab[k].v.s), len >= 255 ? 255 : len, type_name); - } else if (type == BE_INT || type == BE_INDEX) { - logfmt("%*s { { .i=%" BE_INT_FMTLEN "i }, %s},\n", indent, "", pr->ktab[k].v.i, type_name); - } else if (type == BE_REAL) { - #if BE_USE_SINGLE_FLOAT - logfmt("%*s { { .p=(void*)0x%08X }, %s},\n", indent, "", (uint32_t) pr->ktab[k].v.p, type_name); - #else - logfmt("%*s { { .p=(void*)0x%016llX }, %s},\n", indent, "", (uint64_t) pr->ktab[k].v.p, type_name); - #endif - } else if (type == BE_BOOL) { - logfmt("%*s { { .b=%i }, %s},\n", indent, "", pr->ktab[k].v.b, type_name); - } + logfmt("%*s ", indent, ""); + m_solidify_bvalue(vm, &pr->ktab[k]); + logfmt(",\n"); } logfmt("%*s}),\n", indent, ""); } else { @@ -167,6 +176,75 @@ static void m_solidify_closure(bvm *vm, bclosure *cl, int builtins) logfmt("/*******************************************************************/\n\n"); } + +static void m_solidify_class(bvm *vm, bclass *cl, int builtins) +{ + const char * class_name = str(cl->name); + + /* iterate on members to dump closures */ + if (cl->members) { + bmapnode *node; + bmapiter iter = be_map_iter(); + while ((node = be_map_next(cl->members, &iter)) != NULL) { + if (var_isstr(&node->key) && var_isclosure(&node->value)) { + bclosure *f = var_toobj(&node->value); + m_solidify_closure(vm, f, builtins); + } + } + } + + + logfmt("\n"); + logfmt("/********************************************************************\n"); + logfmt("** Solidified class: %s\n", class_name); + logfmt("********************************************************************/\n"); + + + logfmt("be_local_class(%s,\n", class_name); + logfmt(" %i,\n", cl->nvar); + if (cl->super) { + logfmt(" &be_%s_class,\n", str(cl->super->name)); + } else { + logfmt(" NULL,\n"); + } + + if (cl->members) { + logfmt(" be_nested_map(%i,\n", cl->members->count); + + logfmt(" ( (struct bmapnode*) &(const bmapnode[]) {\n"); + for (int i = 0; i < cl->members->count; i++) { + bmapnode * node = &cl->members->slots[i]; + if (node->key.type != BE_STRING) { + char error[64]; + snprintf(error, sizeof(error), "Unsupported type in key: %i", node->key.type); + be_raise(vm, "internal_error", error); + } + int key_next = node->key.next; + size_t len = strlen(str(node->key.v.s)); + if (0xFFFFFF == key_next) { + key_next = -1; /* more readable */ + } + logfmt(" { be_nested_key(\"%s\", %i, %zu, %i), ", str(node->key.v.s), be_strhash(node->key.v.s), len >= 255 ? 255 : len, key_next); + m_solidify_bvalue(vm, &node->value); + + logfmt(" },\n"); + } + logfmt(" })),\n"); + } else { + logfmt(" NULL,\n"); + } + + logfmt(" (be_nested_const_str(\"%s\", %i, %i))\n", class_name, be_strhash(cl->name), str_len(cl->name)); + logfmt(");\n"); + logfmt("/*******************************************************************/\n\n"); + + logfmt("void be_load_%s_class(bvm *vm) {\n", class_name); + logfmt(" be_pushntvclass(vm, &be_%s_class);\n", class_name); + logfmt(" be_setglobal(vm, \"%s\");\n", class_name); + logfmt(" be_pop(vm, 1);\n"); + logfmt("}\n"); +} + #define be_builtin_count(vm) \ be_vector_count(&(vm)->gbldesc.builtin.vlist) @@ -176,6 +254,8 @@ static int m_dump(bvm *vm) bvalue *v = be_indexof(vm, 1); if (var_isclosure(v)) { m_solidify_closure(vm, var_toobj(v), be_builtin_count(vm)); + } else if (var_isclass(v)) { + m_solidify_class(vm, var_toobj(v), be_builtin_count(vm)); } } be_return_nil(vm); diff --git a/lib/libesp32/Berry/tools/coc/hash_map.cpp b/lib/libesp32/Berry/tools/coc/hash_map.cpp index e05ca4677..9d917a81c 100755 --- a/lib/libesp32/Berry/tools/coc/hash_map.cpp +++ b/lib/libesp32/Berry/tools/coc/hash_map.cpp @@ -128,7 +128,7 @@ hash_map::entry hash_map::entry_modify(entry entry, int *var_count) { entry.key = coc::escape_operator(entry.key); if (entry.value == "var") { - entry.value = "be_const_var(" + entry.value = "be_const_index(" + std::to_string(*var_count) + ")"; ++(*var_count); } else { diff --git a/tasmota/xdrv_52_3_berry_audio.ino b/tasmota/xdrv_52_3_berry_audio.ino new file mode 100644 index 000000000..d3e82b63a --- /dev/null +++ b/tasmota/xdrv_52_3_berry_audio.ino @@ -0,0 +1,185 @@ +/* + xdrv_52_3_berry_audio.ino - Berry scripting language, support for I2S audio + + Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 USE_BERRY + +#ifdef USE_I2S_AUDIO_BERRY + +// #include "AudioFileSourceSPIFFS.h" +// #include "AudioFileSourceID3.h" +#include "AudioOutputI2S.h" +#include "AudioGeneratorMP3.h" +#include "AudioFileSourceFS.h" + +#include + + +/*********************************************************************************************\ + * AudioOutput class + * +\*********************************************************************************************/ +extern "C" { + + // + // AudioOutputI2S(bclkPin: int, wclkPin: int, doutPin: int[, port:int, dmabuf:int, mode: int]) + // + int i2s_output_i2s_init(bvm *vm) { + int argc = be_top(vm); + if (argc > 3) { + int bclkPin = be_toint(vm, 2); + int wclkPin = be_toint(vm, 3); + int doutPin = be_toint(vm, 4); + int port = 0; + if (argc > 4) { + port = be_toint(vm, 5); + } + int dma_buf_count = 8; // number of dma buffers of 64 bytes + if (argc > 5) { + dma_buf_count = be_toint(vm, 6); + } + int mode = 0; // EXTERNAL_I2S + if (argc > 6) { + mode = be_toint(vm, 7); + } + // AudioOutputI2S(int port=0, int output_mode=EXTERNAL_I2S, int dma_buf_count = 8, int use_apll=APLL_DISABLE); + AudioOutputI2S * audio = new AudioOutputI2S(port, mode, dma_buf_count); + audio->SetPinout(bclkPin, wclkPin, doutPin); // return value has no useful information for us + be_pushcomptr(vm, (void*) audio); + be_setmember(vm, 1, ".p"); + be_return_nil(vm); + } + + be_raise(vm, kTypeError, nullptr); + } + + int i2s_output_i2s_deinit(bvm *vm) { + int argc = be_top(vm); + be_getmember(vm, 1, ".p"); + AudioOutputI2S * audio = (AudioOutputI2S *) be_tocomptr(vm, -1); + if (audio) { + delete audio; + // clear + be_pushcomptr(vm, (void*) NULL); + be_setmember(vm, 1, ".p"); + } + + be_return_nil(vm); + } + + // + // AudioGeneratorMP3() + // + int i2s_generator_mp3_init(bvm *vm) { + AudioGeneratorMP3 * mp3 = new AudioGeneratorMP3(); + be_pushcomptr(vm, (void*) mp3); + be_setmember(vm, 1, ".p"); + be_return_nil(vm); + } + + AudioGeneratorMP3 * i2s_generator_mp3_get(bvm *vm) { + be_getmember(vm, 1, ".p"); + AudioGeneratorMP3 * mp3 = (AudioGeneratorMP3 *) be_tocomptr(vm, -1); + return mp3; + } + + int i2s_generator_mp3_deinit(bvm *vm) { + int argc = be_top(vm); + AudioGeneratorMP3 * mp3 = i2s_generator_mp3_get(vm); + if (mp3) { + delete mp3; + // clear + be_pushcomptr(vm, (void*) NULL); + be_setmember(vm, 1, ".p"); + } + + be_return_nil(vm); + } + + int i2s_generator_mp3_begin(bvm *vm) { + int argc = be_top(vm); + if (argc > 2) { + AudioGeneratorMP3 * mp3 = i2s_generator_mp3_get(vm); + be_getmember(vm, 2, ".p"); + AudioFileSource * source = (AudioFileSource*) be_tocomptr(vm, -1); + be_getmember(vm, 3, ".p"); + AudioOutput * output = (AudioOutput*) be_tocomptr(vm, -1); + be_pop(vm, 2); + + bool ret = mp3->begin(source, output); + be_pushbool(vm, ret); + be_return(vm); + } + be_return_nil(vm); + } + + int i2s_generator_mp3_loop(bvm *vm) { + AudioGeneratorMP3 * mp3 = i2s_generator_mp3_get(vm); + bool ret = mp3->loop(); + be_pushbool(vm, ret); + be_return(vm); + } + + int i2s_generator_mp3_stop(bvm *vm) { + AudioGeneratorMP3 * mp3 = i2s_generator_mp3_get(vm); + bool ret = mp3->stop(); + be_pushbool(vm, ret); + be_return(vm); + } + + int i2s_generator_mp3_isrunning(bvm *vm) { + AudioGeneratorMP3 * mp3 = i2s_generator_mp3_get(vm); + bool ret = mp3->isRunning(); + be_pushbool(vm, ret); + be_return(vm); + } + + // File Source FS + // +#ifdef USE_UFILESYS + int i2s_file_source_fs_init(bvm *vm) { + int argc = be_top(vm); + if (argc > 1 && be_isstring(vm, 2)) { + const char * file_name = be_tostring(vm, 2); + AudioFileSourceFS * file_source = new AudioFileSourceFS(*ufsp, file_name); + be_pushcomptr(vm, (void*) file_source); + be_setmember(vm, 1, ".p"); + be_return_nil(vm); + } + be_raise(vm, kTypeError, nullptr); + } + + int i2s_file_source_fs_deinit(bvm *vm) { + int argc = be_top(vm); + be_getmember(vm, 1, ".p"); + AudioFileSourceFS * file_source = (AudioFileSourceFS *) be_tocomptr(vm, -1); + if (file_source) { + delete file_source; + // clear + be_pushcomptr(vm, (void*) NULL); + be_setmember(vm, 1, ".p"); + } + + be_return_nil(vm); + } +#endif // USE_UFILESYS +} + +#endif // USE_I2S_AUDIO_BERRY +#endif // USE_BERRY From 5f99d13718e14e2660f7e24c2a77c6b2f1456df8 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 20 Jul 2021 21:28:18 +0200 Subject: [PATCH 018/148] Update Berry VSCode plugin --- .../tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/Berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json b/lib/libesp32/Berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json index 1cd1d7cfd..661d969a5 100755 --- a/lib/libesp32/Berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json +++ b/lib/libesp32/Berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json @@ -67,7 +67,7 @@ "keywords": { "patterns": [{ "name": "keyword.berry", - "match": "\\b(var|def|class|true|false|nil|self|super|import|as)\\b" + "match": "\\b(var|static|def|class|true|false|nil|self|super|import|as)\\b" }] }, "identifier": { From acd9ea1661ceda475b90919d7892991ae00673df Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 20 Jul 2021 22:02:59 +0200 Subject: [PATCH 019/148] Update changelog --- CHANGELOG.md | 4 +++- RELEASENOTES.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c775e9a13..3c9e5995e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,10 @@ All notable changes to this project will be documented in this file. ### Added - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout (#12651) +- Berry ESP32 support for I2S audio mp3 playback + +### Changed - Disable PSRAM on unsupported hardware -- Berry add support for I2S audio mp3 playback ## [9.5.0.2] 20210714 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8eb3fae60..7d293427c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -105,6 +105,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939) - Berry ESP32 partition manager [#12465](https://github.com/arendst/Tasmota/issues/12465) +- Berry ESP32 support for I2S audio mp3 playback - Support for AM2320 Temperature and Humidity Sensor by Lars Wessels [#12485](https://github.com/arendst/Tasmota/issues/12485) - Rule event support as JSON payload [#12496](https://github.com/arendst/Tasmota/issues/12496) - MQTT minimum password length restriction in GUI [#12553](https://github.com/arendst/Tasmota/issues/12553) @@ -120,6 +121,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Enable UFILESYS, GUI_TRASH_FILE and GUI_EDIT_FILE for any device compiled with more than 1M flash size - ESP32 internal sensor driver id moved from 87 to 127 - Extended supported sensor driver range to 128 +- Disable PSRAM on unsupported hardware - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) - Allow buttons to work in AP normal mode [#12518](https://github.com/arendst/Tasmota/issues/12518) @@ -142,4 +144,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - ESP32 do not use chip temperature sensor as global temperature if external temperature sensor is used [#12630](https://github.com/arendst/Tasmota/issues/12630) ### Noted -- ESP32 single core **tasmota32solo1.bin** binary can only be uploaded using the GUI as OTA upload will trigger the watchdog timer \ No newline at end of file +- ESP32 single core **tasmota32solo1.bin** binary can only be uploaded using the GUI as OTA upload will trigger the watchdog timer. Fixed once https://github.com/espressif/arduino-esp32/pull/5426 is merged. \ No newline at end of file From 0539e8ec32d8f202c89af3e5731db11807970295 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 20 Jul 2021 22:31:22 +0200 Subject: [PATCH 020/148] Berry add tasmota.publish_result --- lib/libesp32/Berry/default/be_tasmotalib.c | 3 + lib/libesp32/Berry/generate/be_const_strtab.h | 1289 +++++------ .../Berry/generate/be_const_strtab_def.h | 1908 +++++++++-------- .../generate/be_fixed_be_class_tasmota.h | 107 +- tasmota/xdrv_52_3_berry_tasmota.ino | 16 + 5 files changed, 1673 insertions(+), 1650 deletions(-) diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index 5bff80d4f..6f8cb8bc4 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -7,6 +7,7 @@ extern int l_getFreeHeap(bvm *vm); extern int l_publish(bvm *vm); +extern int l_publish_result(bvm *vm); extern int l_cmd(bvm *vm); extern int l_get_cb(bvm *vm); extern int l_getoption(bvm *vm); @@ -2304,6 +2305,7 @@ void be_load_tasmota_ntvlib(bvm *vm) { "wire2", NULL }, { "get_free_heap", l_getFreeHeap }, { "publish", l_publish }, + { "publish_result", l_publish_result }, { "_cmd", l_cmd }, { "_get_cb", l_get_cb }, { "get_option", l_getoption }, @@ -2385,6 +2387,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { get_free_heap, func(l_getFreeHeap) publish, func(l_publish) + publish_result, func(l_publish_result) _cmd, func(l_cmd) _get_cb, func(l_get_cb) get_option, func(l_getoption) diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index ce34e8dd5..6eba22307 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,657 +1,658 @@ -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str_I2C_SCL; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_WEBCAM_PSCLK; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_BOILER_OT_TX; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_every_100ms; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str_WEBCAM_XCLK; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_web_add_config_button; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_display; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str_size; +extern const bcstring be_const_str_web_add_handler; +extern const bcstring be_const_str_CNTR1; extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_web_add_management_button; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_web_add_button; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_lv_draw_mask_radius_param; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str_KEY1_PD; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_ILI9341_CS; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_HRE_DATA; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_I2S_IN_CLK; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_get_tasmota; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_lv_gauge_format_cb; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_TELEINFO_ENABLE; extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_I2C_SDA; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_chars_in_string; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_SYMBOL_CHARGE; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_GPS_TX; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_seg7_font; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_BUZZER_INV; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_setbits; +extern const bcstring be_const_str_SWT1_PD; +extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_ADC_BUTTON; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_MGC3130_RESET; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_SYMBOL_MUTE; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str_SYMBOL_PAUSE; extern const bcstring be_const_str_SDM72_TX; extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_REL1_INV; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_json_append; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_web_add_main_button; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_I2S_OUT_CLK; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_save_before_restart; -extern const bcstring be_const_str_PN532_RXD; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_HLW_CF; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str_SYMBOL_PLAY; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_lv_cb; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_close; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_every_second; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_TASMOTACLIENT_RXD; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_MAX7219DIN; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_lv_draw_mask_saved; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_lv_sqrt_res; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_SYMBOL_CHARGE; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str_KEY1_INV; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_web_add_console_button; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_SR04_TRIG; -extern const bcstring be_const_str_SYMBOL_NEXT; -extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_WEBCAM_SIOC; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_WE517_RX; extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_tostring; +extern const bcstring be_const_str__buffer; +extern const bcstring be_const_str_button_pressed; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_AudioGeneratorMP3; extern const bcstring be_const_str_get; -extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_MIEL_HVAC_TX; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str_save_before_restart; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_json_append; +extern const bcstring be_const_str_DDS2382_TX; extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_ROT1A; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str_get_light; +extern const bcstring be_const_str_PWM1; extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_remove_cmd; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_publish_result; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_web_add_button; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_SYMBOL_RIGHT; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_add_cmd; +extern const bcstring be_const_str_add_rule; extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_SDM630_TX; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_lv_dropdown; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_SYMBOL_OK; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_web_add_management_button; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_wire2; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_REL1; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_web_add_main_button; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str_SR04_TRIG; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_LEDLNK_INV; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_reverse_gamma10; +extern const bcstring be_const_str_BUZZER; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_RDM6300_RX; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_get_tasmota; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_exec_rules; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_KEY1; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str_TXD; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_screenshot; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_SYMBOL_WIFI; +extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_SYMBOL_BATTERY_3; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_update; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_SSD1351_DC; +extern const bcstring be_const_str_display; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_AZ_RXD; +extern const bcstring be_const_str_SWT1_NP; +extern const bcstring be_const_str_millis; +extern const bcstring be_const_str_web_add_config_button; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_has_arg; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_TASMOTACLIENT_RST; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_SI7021; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_wire1; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_web_add_console_button; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_lv_signal_cb; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_lv_line; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str_close; +extern const bcstring be_const_str_SYMBOL_AUDIO; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_AS3935; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_every_50ms; +extern const bcstring be_const_str_SYMBOL_REFRESH; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_web_send; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_HX711_DAT; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str_SM16716_SEL; +extern const bcstring be_const_str_lv_tileview; +extern const bcstring be_const_str_class; +extern const bcstring be_const_str_HX711_SCK; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_every_100ms; +extern const bcstring be_const_str_SENSOR_END; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str_SDM72_RX; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_I2C_Driver; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_bytes; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_SYMBOL_SETTINGS; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_cmd; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_I2S_OUT_CLK; +extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_CSE7766_TX; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_SYMBOL_GPS; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_item; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_OPTION_A; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_read12; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_LE01MR_RX; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_lv_img; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_push; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_return; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_KEY1_TC; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_web_sensor; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_Driver; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_MAX31855DO; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_SYMBOL_SHUFFLE; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_MGC3130_XFER; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_loop; +extern const bcstring be_const_str_CNTR1_NP; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_NRG_CF1; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_lv_slider; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str_MD5; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_lv_draw_label_dsc; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; +extern const bcstring be_const_str_find_key_i; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_SYMBOL_LEFT; +extern const bcstring be_const_str_every_second; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_SYMBOL_USB; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_AZ_TXD; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str__end_transmission; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; +extern const bcstring be_const_str_load_font; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_WEBCAM_SIOD; extern const bcstring be_const_str___lower__; extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_AZ_RXD; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_HPMA_TX; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_INTERRUPT; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_WIEGAND_D1; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_I2S_OUT_SLCT; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_SYMBOL_BULLET; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str_Driver; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_SSPI_DC; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_web_add_handler; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_GPS_RX; extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str__ccmd; extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_SDM630_TX; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_NRG_SEL_INV; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_KEY1_INV_PD; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_SWT1_PD; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str_CNTR1_NP; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_update; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_every_50ms; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_button_pressed; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; -extern const bcstring be_const_str_I2S_IN_DATA; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_I2S_IN_SLCT; -extern const bcstring be_const_str_PWM1_INV; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_web_sensor; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_MGC3130_RESET; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_TM1637CLK; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_A4988_DIR; -extern const bcstring be_const_str_return; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str_OUTPUT_LO; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_RC522_CS; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_lv_signal_cb; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_SM16716_SEL; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_elif; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index c9df0c8c4..e0be7be64 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,983 +1,985 @@ -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_I2C_SCL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, NULL); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_PMS5003_TX); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_run_deferred); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_lv_draw_mask_angle_param_cfg); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_SYMBOL_FILE); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_lv_bar); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, NULL); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_lv_tabview); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_WEBCAM_PSCLK); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_TELEINFO_RX); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, NULL); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, NULL); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_read8); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_ceil); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_every_100ms); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_lv_linemeter); -be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, NULL); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_exec_rules); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_web_add_config_button); -be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_display); -be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_SYMBOL_SETTINGS); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, NULL); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_SYMBOL_VIDEO); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, &be_const_str__timers); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SYMBOL_LEFT); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, NULL); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_SYMBOL_CALL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str_resp_cmnd); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_SOLAXX1_TX); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_SYMBOL_PASTE); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_gc); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_isrunning); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, NULL); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str__rules); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_content_start); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_web_add_management_button); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_SDM120_TX); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_chars_in_string); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_wire2); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_lv_roller); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_SYMBOL_BATTERY_2); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, NULL); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_atan); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_pin); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_web_add_button); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); -be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_millis); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_montserrat_font); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_pin_mode); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_SYMBOL_MINUS); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_TFMINIPLUS_RX); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, &be_const_str_lv_list); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); -be_define_const_str(member, "member", 719708611u, 0, 6, NULL); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, NULL); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, NULL); -be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_SSD1351_DC); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_seg7_font); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_SENSOR_END); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, NULL); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_WEBCAM_DATA); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, NULL); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_SYMBOL_EDIT); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_ctypes_bytes); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str__request_from); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_acos); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_HJL_CF); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str__ccmd); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_clear); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_isinstance); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); -be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, NULL); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_get_tasmota); -be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, NULL); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_get_power); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_lv_gauge_format_cb); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, NULL); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SDM630_RX); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_SYMBOL_SAVE); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, NULL); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_asstring); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_count); -be_define_const_str(count, "count", 967958004u, 0, 5, NULL); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_lv_btnmatrix); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_MHZ_RXD); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SBR_RX); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_SYMBOL_IMAGE); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_iter); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_lv_draw_mask_common_dsc); -be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_def); -be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_add); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_lv_dropdown); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_format); -be_define_const_str(format, "format", 3114108242u, 0, 6, NULL); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_byte); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_content_send_style); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_MAX7219CLK); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_SDM72_TX); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str_lv_draw_mask_map_param_cfg); -be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_HM10_TX); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_ROT1B); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_bus); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_draw_img_dsc); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_setbits); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_HRXL_RX); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_codedump); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_write); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_SDCARD_CS); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, NULL); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_REL1_INV); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_msgbox); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_delay); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_json_append); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_lv_draw_mask_line_param_cfg); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_lv_led); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_MD5); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_SPI_CLK); -be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_SYMBOL_EYE_OPEN); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_SYMBOL_HOME); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_web_add_main_button); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL); -be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_lv_cont); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_save_before_restart); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_load_font); -be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, &be_const_str_lv_style); -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_LMT01); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_detect); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_input); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_tostring); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_HLW_CF); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_HPMA_RX); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_read12); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_chart); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_lv_indev); -be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, NULL); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_SYMBOL_DIRECTORY); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_erase); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_getbits); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, &be_const_str_save); -be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, NULL); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_name); -be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_LED1); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_SSPI_SCLK); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_set_timer); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_TM1638DIO); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_i2c_enabled); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, NULL); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_SAIR_RX); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_compile); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SYMBOL_PLAY); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_lv_img); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_super); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_SDM120_RX); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_attrdump); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_elif); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str__drivers); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_geti); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_lv_calendar); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_WINDMETER_SPEED); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_find); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_lv_cb); -be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, NULL); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, NULL); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, NULL); -be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_close); -be_define_const_str(close, "close", 667630371u, 0, 5, NULL); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_TCP_RX); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_every_second); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_lv_draw_rect_dsc); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_load_freetype_font); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_resize); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_scan); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MAX7219DIN); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SYMBOL_DUMMY); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, NULL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SPI_MOSI); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, NULL); -be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_AudioOutput); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_ETH_PHY_MDC); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_IEM3000_TX); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_imax); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_SYMBOL_BELL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_redirect); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_lv_draw_mask_saved); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_lv_canvas); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, &be_const_str_lv_sqrt_res); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_var); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_TASMOTACLIENT_TXD); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_lv_table); -be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_PROJECTOR_CTRL_RX); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_KEY1_INV); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_imin); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_lv_draw_mask_angle_param); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_ZIGBEE_TX); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_assert); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_resp_cmnd_failed); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_web_add_console_button); -be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, NULL); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_AudioOutputI2S); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_LE01MR_TX); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_ROT1B_NP); -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_TM1638STB); -be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, NULL); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str__read); -be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_PULLDOWN); -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_RF_SENSOR); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_KEY1_TC); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str__buffer); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_add_driver); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_find_op); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_rand); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_LEDLNK); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, NULL); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, NULL); -be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_SYMBOL_NEXT); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, &be_const_str_SYMBOL_USB); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, NULL); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_SPI_MISO); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_time_dump); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_SPI_CS); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_lv_line); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_write_bit); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_WEBCAM_SIOC); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_cosh); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_WE517_RX); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); -be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_ZEROCROSS); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_get); -be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_resp_cmnd_str); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_ROT1A); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_SYMBOL_UPLOAD); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_deinit); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); -be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_SSD1351_CS); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_SSPI_CS); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_BL0940_RX); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, NULL); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_yield); -be_define_const_str(yield, "yield", 1821831854u, 0, 5, &be_const_str_raise); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_size); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_SSD1331_CS); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_size); be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_SYMBOL_REFRESH); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_lv_draw_mask_fade_param); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_AZ_RXD); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SYMBOL_BACKSPACE); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_SYMBOL_DOWN); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_calldepth); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_true); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_lv_arc); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_SOLAXX1_RX); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SR04_ECHO); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_set_light); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_SYMBOL_UP); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_hex); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); -be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, NULL); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_event); -be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_lv_btn); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_lv_draw_label_dsc); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_try); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_lv_textarea); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_WEBCAM_PSRCS); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, NULL); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_WEBCAM_PWDN); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, NULL); -be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, &be_const_str_OLED_RESET); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SSPI_DC); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_SYMBOL_BATTERY_EMPTY); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str__write); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_web_add_handler); be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, &be_const_str_scale_uint); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_TX2X_TXD_BLACK); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_push); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_SYMBOL_EJECT); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_item); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_SSPI_MAX31865_CS1); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_for); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_ST7789_CS); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_while); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str__cb); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_arg_size); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_lv_keyboard); -be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, NULL); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_abs); -be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_SYMBOL_BLUETOOTH); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_WEBCAM_VSYNC); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, NULL); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_MAX31855CS); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_NRG_SEL_INV); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, NULL); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_bytes); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_gamma8); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_lv_spinbox); -be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_SDS0X1_RX); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_tolower); -be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); -be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_cmd); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_wire_scan); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, NULL); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, NULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_arg_name); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_start); -be_define_const_str(start, "start", 1697318111u, 0, 5, &be_const_str_except); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, NULL); -be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_add_cmd); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_int); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_lv_draw_mask_line_param); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); -be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_BS814_CLK); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_CNTR1_NP); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_MAX31855CLK); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_WEBCAM_SIOD); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str_exists); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); -be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_EXS_ENABLE); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_update); -be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_SDM72_RX); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_SYMBOL_PAUSE); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_every_50ms); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_get_option); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_button_pressed); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_set); -be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_end); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_lv_draw_mask_fade_param_cfg); -be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); -be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_lv_area); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, NULL); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_SBR_TX); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_char); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_lv_design_cb); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, NULL); -be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_PWM1_INV); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, NULL); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, &be_const_str_finish); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_remove_rule); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_digital_read); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_arg); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, NULL); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_wire1); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_AS608_TX); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_gen_cb); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_get_free_heap); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, &be_const_str_upper); -be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_web_sensor); -be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_lv_event_cb); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_write_bytes); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, NULL); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_dump); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_lv_draw_mask_radius_param_cfg); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, &be_const_str_lv_page); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, NULL); -be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_TM1637CLK); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_ZIGBEE_RST); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str__end_transmission); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_top); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_DHT22); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_INPUT_PULLDOWN); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_TELEINFO_ENABLE); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_ARIRFRCV); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, NULL); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_SYMBOL_EDIT); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ADC_RANGE); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_lv_sqrt_res); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, &be_const_str_atan); +be_define_const_str(atan, "atan", 108579519u, 0, 4, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_lv_roller); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, &be_const_str_top); be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_return); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_as); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_i2c_enabled); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, &be_const_str_chars_in_string); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_WE517_TX); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SR04_ECHO); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_SYMBOL_CHARGE); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_ceil); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_classname); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_NONE); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_TM1637DIO); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str__rules); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_SYMBOL_EYE_OPEN); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, NULL); +be_define_const_str(char, "char", 2823553821u, 0, 4, NULL); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, NULL); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_SYMBOL_DOWN); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, NULL); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_RA8876_CS); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_copy); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_exp); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_lv_design_cb); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_remove_rule); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_gen_cb); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_seg7_font); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(count, "count", 967958004u, 0, 5, NULL); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_redirect); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_lv_cpicker); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); +be_define_const_str(number, "number", 467038368u, 0, 6, NULL); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_SYMBOL_MINUS); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str__read); +be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_HALLEFFECT); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_SYMBOL_SAVE); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_getbits); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_SYMBOL_FILE); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, NULL); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_issubclass); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, NULL); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_name); +be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_split); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SPI_DC); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_SYMBOL_MUTE); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_SYMBOL_UPLOAD); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_ctypes_bytes); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_get_free_heap); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, NULL); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str_VL53L0X_XSHUT1); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, NULL); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_button_pressed); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, NULL); +be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_WEBCAM_PWDN); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_save_before_restart); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_IBEACON_RX); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_MCP39F5_RX); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_SDS0X1_RX); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_SYMBOL_KEYBOARD); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, NULL); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_json_append); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_DI); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, NULL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_NRF24_DC); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_SBR_RX); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_lv_draw_mask_line_param); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_content_send_style); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_lv_style); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_IEM3000_RX); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_Wire); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_get_light); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_SSD1351_CS); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_read24); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_try_rule); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_state); +be_define_const_str(state, "state", 2016490230u, 0, 5, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_LED1_INV); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_lv_group); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_resolvecmnd); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_lower); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_web_add_button); +be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, &be_const_str_def); +be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_IEM3000_TX); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_NEOPOOL_RX); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_detect); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, NULL); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_delay); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_imin); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_write8); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_add_cmd); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_add_rule); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_BOILER_OT_RX); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_SDM630_TX); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SWT1); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_lv_point); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_dropdown); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_lv_canvas); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_as); be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_NONE); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_P9813_CLK); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_SYMBOL_STOP); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, NULL); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_WIEGAND_D0); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_lv_spinner); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_seti); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_CC1101_GDO0); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_SYMBOL_VOLUME_MID); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, NULL); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_SYMBOL_CUT); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_try); +be_define_const_str(try, "try", 2887626766u, 68, 3, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_insert); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str___iterator__); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_get_option); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); +be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, NULL); +be_define_const_str(start, "start", 1697318111u, 0, 5, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_lv_label); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, &be_const_str_web_add_management_button); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, &be_const_str_for); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_RFSEND); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_P9813_CLK); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_linemeter); +be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_wire2); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_seti); be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str__available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_lv_objmask); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, &be_const_str_read_bytes); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_exec_cmd); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_web_send); -be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_WE517_TX); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_cos); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_SYMBOL_GPS); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_SYMBOL_VOLUME_MID); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_insert); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_real); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_content_send); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_real); be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, &be_const_str_IEM3000_RX); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_addr); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_check_privileged_access); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_signal_cb); -be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, NULL); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_cb_dispatch); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_LEDLNK_INV); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_NRG_CF1); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_SYMBOL_PREV); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_read32); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_RF_SENSOR); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_publish); +be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_web_add_main_button); +be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SR04_TRIG); +be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_SYMBOL_HOME); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, NULL); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_WE517_RX); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_ZEROCROSS); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, NULL); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, NULL); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_lv_draw_mask_fade_param_cfg); +be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_WEBCAM_HREF); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str_WEBCAM_VSYNC); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_lv_textarea); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_RFRECV); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_SYMBOL_UP); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_resize); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_SM16716_DAT); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_load_freetype_font); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_write); +be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_FALLING); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_ROT1B_NP); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_ZIGBEE_RX); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_get_tasmota); +be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, NULL); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_exec_rules); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_lv_tabview); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_SAIR_RX); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_TXD); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str__available); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_lv_obj); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_attrdump); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_TM1638CLK); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_lv_indev); +be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_INPUT_PULLUP); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_SYMBOL_WIFI); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_lv_gauge_format_cb); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_SYMBOL_BATTERY_3); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_input); +be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_lv_draw_mask_saved); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_Tasmota); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_read32); be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_SYMBOL_BATTERY_FULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); +be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_write_bit); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_DSB); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_MAX7219CS); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_WEBCAM_PCLK); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_tan); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_update); +be_define_const_str(update, "update", 672109684u, 0, 6, NULL); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_TELEINFO_RX); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_memory); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str_display); +be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_SSPI_SCLK); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SWT1_NP); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_millis); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_web_add_config_button); +be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_ETH_PHY_POWER); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, NULL); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, NULL); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, NULL); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_type); +be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_has_arg); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SYMBOL_BATTERY_EMPTY); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, NULL); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, NULL); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, NULL); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_TASMOTACLIENT_RST); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_set_power); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_content_button); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, NULL); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_SI7021); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_iter); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_setmember); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_pin_mode); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_ST7789_CS); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, NULL); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_lv_chart); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_web_add_console_button); +be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_response_append); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_SYMBOL_CALL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_deinit); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_lv_signal_cb); +be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_lv_color); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_NRG_SEL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_close); +be_define_const_str(close, "close", 667630371u, 0, 5, NULL); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_OLED_RESET); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, NULL); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_PWM1_INV); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_AS3935); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, NULL); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_read_bytes); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); +be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_CSE7766_RX); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, NULL); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_PMS5003_TX); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_SYMBOL_SD_CARD); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_classof); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_write_bytes); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str_SM16716_SEL); +be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_lv_tileview); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, &be_const_str_class); +be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_SYMBOL_LIST); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_lv_msgbox); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_floor); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); +be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_find_op); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_lv_table); +be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_MHZ_TXD); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, NULL); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_member); +be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, NULL); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, NULL); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_SYMBOL_CLOSE); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, NULL); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_stop); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_lv_group_focus_cb); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, &be_const_str_lv_list); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_I2C_Driver); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_TASMOTACLIENT_RXD); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, NULL); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, NULL); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_exists); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_SOLAXX1_TX); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_calldepth); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_bus); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_log); +be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); +be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_SYMBOL_STOP); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str__cmd); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_SYMBOL_VOLUME_MAX); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_cmd); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_NRG_SEL_INV); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_lv_spinner); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_SOLAXX1_RX); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_SYMBOL_GPS); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, NULL); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_init); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_module); +be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_PMS5003_RX); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_item); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_OUTPUT_OPEN_DRAIN); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, NULL); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_true); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_rtc); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_ZIGBEE_RST); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_digital_write); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_lv_cb); +be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_scale_uint); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_LE01MR_RX); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_ROT1A_NP); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_WEBCAM_DATA); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_erase); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_ETH_PHY_MDIO); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SPI_MOSI); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_fromstring); be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, NULL); -be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_SM16716_SEL); -be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_add_rule); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_setitem); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_lv_img); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, NULL); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str__request_from); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_lv_led); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, &be_const_str_time_dump); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, &be_const_str_return); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_ST7789_DC); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, NULL); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_WIEGAND_D0); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_add); +be_define_const_str(add, "add", 993596020u, 0, 3, NULL); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, NULL); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_geti); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_SHELLY_DIMMER_RST_INV); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_TCP_TX); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_codedump); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_web_sensor); +be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, NULL); +be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, &be_const_str_lv_draw_img_dsc); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_OUTPUT_HI); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_RC522_CS); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_SYMBOL_DRIVE); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_lv_switch); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_MP3_DFR562); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_WEBCAM_PSCLK); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, NULL); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_TFMINIPLUS_RX); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, NULL); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_call); +be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_int); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_lv_arc); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_concat); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_content_flush); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_bar); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_map); +be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_SYMBOL_BULLET); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, NULL); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_SYMBOL_SHUFFLE); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_hex); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_set_light); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_log10); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str_WEBCAM_XCLK); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str__drivers); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_lv_btnmatrix); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, &be_const_str_resp_cmnd_error); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_collect); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_loop); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, NULL); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_content_stop); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_lv_slider); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_lv_draw_mask_fade_param); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_MD5); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_lv_checkbox); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, &be_const_str_read); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_SHELLY_DIMMER_BOOT0); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_check_privileged_access); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, NULL); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_content_start); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, NULL); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_range); +be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_lv_area); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, NULL); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_lv_draw_label_dsc); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_lv_draw_mask_line_param_cfg); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_event_cb); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_every_second); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_tolower); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_TX2X_TXD_BLACK); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str__begin_transmission); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_TUYA_TX); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_lv_page); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_SYMBOL_VIDEO); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_I2C_SCL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_SYMBOL_PLUS); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_setitem); be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_MCP39F5_TX); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, NULL); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str__end_transmission); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str__timers); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_lv_spinbox); +be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, NULL); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_load_font); +be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_WEBCAM_SIOD); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str___lower__); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_yield); +be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_TUYA_RX); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str__ccmd); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_arg_size); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_lv_draw_mask_map_param_cfg); +be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_elif); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_get_light, - (const bstring *)&be_const_str_lv_tileview, - (const bstring *)&be_const_str_LE01MR_RX, - (const bstring *)&be_const_str_CSE7766_TX, - (const bstring *)&be_const_str_response_append, - (const bstring *)&be_const_str_NRF24_CS, - (const bstring *)&be_const_str_read, - (const bstring *)&be_const_str_Wire, - (const bstring *)&be_const_str_copy, - (const bstring *)&be_const_str_P9813_DAT, + (const bstring *)&be_const_str_PULLDOWN, NULL, - (const bstring *)&be_const_str_TXD, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_KEY1, - (const bstring *)&be_const_str_SYMBOL_TRASH, - (const bstring *)&be_const_str_split, - (const bstring *)&be_const_str_module, - NULL, - (const bstring *)&be_const_str_BOILER_OT_TX, - (const bstring *)&be_const_str_PZEM017_RX, - (const bstring *)&be_const_str_AS608_RX, - NULL, - NULL, - (const bstring *)&be_const_str_WEBCAM_XCLK, - (const bstring *)&be_const_str_floor, - (const bstring *)&be_const_str_lv_point, - (const bstring *)&be_const_str_WS2812, - (const bstring *)&be_const_str_ADC_RANGE, - (const bstring *)&be_const_str_REL1, - (const bstring *)&be_const_str_SYMBOL_SD_CARD, - (const bstring *)&be_const_str_continue, - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_MAX7219CS, - (const bstring *)&be_const_str_lv_switch, - (const bstring *)&be_const_str_HX711_DAT, - (const bstring *)&be_const_str_ZIGBEE_RX, - (const bstring *)&be_const_str_ROT1A_NP, - NULL, - NULL, - (const bstring *)&be_const_str_DHT22, - (const bstring *)&be_const_str_DYP_RX, - (const bstring *)&be_const_str_SYMBOL_DOWNLOAD, - (const bstring *)&be_const_str_SYMBOL_SHUFFLE, - (const bstring *)&be_const_str_DHT11_OUT, - (const bstring *)&be_const_str_RDM6300_RX, - (const bstring *)&be_const_str_SYMBOL_WARNING, - (const bstring *)&be_const_str_stop, - (const bstring *)&be_const_str_TFMINIPLUS_TX, - (const bstring *)&be_const_str_classname, - (const bstring *)&be_const_str_SWT1, - (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV, - NULL, - NULL, - (const bstring *)&be_const_str_member, - NULL, - (const bstring *)&be_const_str_SYMBOL_COPY, - (const bstring *)&be_const_str___iterator__, - NULL, - (const bstring *)&be_const_str_SYMBOL_CUT, - (const bstring *)&be_const_str_KEY1_PD, - (const bstring *)&be_const_str_static, - NULL, - (const bstring *)&be_const_str_lv_label, - (const bstring *)&be_const_str_SI7021, - (const bstring *)&be_const_str_HIGH, - (const bstring *)&be_const_str_DDSU666_TX, - NULL, - (const bstring *)&be_const_str_ILI9341_CS, - (const bstring *)&be_const_str_CC1101_GDO0, - (const bstring *)&be_const_str_ILI9488_CS, - (const bstring *)&be_const_str_SYMBOL_PLUS, - (const bstring *)&be_const_str_HRE_DATA, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_I2S_IN_CLK, - (const bstring *)&be_const_str_WEBCAM_PCLK, - (const bstring *)&be_const_str_RA8876_CS, - (const bstring *)&be_const_str_WEBCAM_RESET, - (const bstring *)&be_const_str_SM16716_CLK, - (const bstring *)&be_const_str_KEY1_NP, - NULL, - (const bstring *)&be_const_str_SM16716_DAT, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str_INPUT, - NULL, - (const bstring *)&be_const_str_ARIRFSEL, - NULL, - (const bstring *)&be_const_str_begin, - NULL, - (const bstring *)&be_const_str_NEOPOOL_TX, - (const bstring *)&be_const_str_SSD1331_DC, - (const bstring *)&be_const_str_TUYA_RX, - (const bstring *)&be_const_str_FTC532, - (const bstring *)&be_const_str_BS814_DAT, - (const bstring *)&be_const_str_setrange, - (const bstring *)&be_const_str_concat, - (const bstring *)&be_const_str_SYMBOL_MUTE, - (const bstring *)&be_const_str_ST7789_DC, - (const bstring *)&be_const_str_SYMBOL_WIFI, - (const bstring *)&be_const_str_lv_obj, - (const bstring *)&be_const_str_DSB_OUT, - (const bstring *)&be_const_str_has_arg, - (const bstring *)&be_const_str_I2C_SDA, - (const bstring *)&be_const_str_find_key_i, - (const bstring *)&be_const_str__begin_transmission, - (const bstring *)&be_const_str_DHT11, - (const bstring *)&be_const_str_VL53L0X_XSHUT1, - NULL, - NULL, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_BACKLIGHT, - (const bstring *)&be_const_str_DSB, - (const bstring *)&be_const_str_NRF24_DC, - (const bstring *)&be_const_str_type, - (const bstring *)&be_const_str_KEY1_INV_NP, - NULL, - (const bstring *)&be_const_str_GPS_TX, - (const bstring *)&be_const_str_SYMBOL_POWER, - (const bstring *)&be_const_str_tan, - NULL, - (const bstring *)&be_const_str_SYMBOL_BATTERY_3, - (const bstring *)&be_const_str_SSD1331_CS, - (const bstring *)&be_const_str_ADC_BUTTON, - (const bstring *)&be_const_str_opt_call, - NULL, - (const bstring *)&be_const_str_OPEN_DRAIN, - (const bstring *)&be_const_str_I2S_OUT_CLK, - (const bstring *)&be_const_str_PN532_RXD, - (const bstring *)&be_const_str_ADC_BUTTON_INV, - NULL, - (const bstring *)&be_const_str_FALLING, - (const bstring *)&be_const_str_DDS2382_TX, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_memory, - (const bstring *)&be_const_str_DDS2382_RX, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str_SYMBOL_CLOSE, - (const bstring *)&be_const_str_CHANGE, - (const bstring *)&be_const_str_PN532_TXD, - (const bstring *)&be_const_str_SSPI_MOSI, - NULL, - (const bstring *)&be_const_str_resolvecmnd, - (const bstring *)&be_const_str_exp, - (const bstring *)&be_const_str_collect, - (const bstring *)&be_const_str_SWT1_NP, - (const bstring *)&be_const_str_PZEM016_RX, - (const bstring *)&be_const_str_lv_group_focus_cb, - (const bstring *)&be_const_str_RFRECV, + (const bstring *)&be_const_str_web_add_handler, + (const bstring *)&be_const_str_CNTR1, + (const bstring *)&be_const_str_A4988_ENA, + (const bstring *)&be_const_str_lv_draw_mask_radius_param_cfg, + (const bstring *)&be_const_str_I2S_IN_DATA, (const bstring *)&be_const_str_A4988_MS1, NULL, - (const bstring *)&be_const_str_RXD, - (const bstring *)&be_const_str_SAIR_TX, - (const bstring *)&be_const_str_WEBCAM_HREF, - (const bstring *)&be_const_str_SYMBOL_OK, - (const bstring *)&be_const_str_CSE7761_RX, - (const bstring *)&be_const_str_WEBCAM_HSD, - (const bstring *)&be_const_str_SYMBOL_KEYBOARD, - (const bstring *)&be_const_str_SYMBOL_DRIVE, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_BOILER_OT_RX, - (const bstring *)&be_const_str_ADC_CT_POWER, - (const bstring *)&be_const_str_asin, - (const bstring *)&be_const_str_TASMOTACLIENT_RXD, - NULL, - (const bstring *)&be_const_str_HRE_CLOCK, - (const bstring *)&be_const_str_NRG_SEL, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, - (const bstring *)&be_const_str_SPI_DC, - (const bstring *)&be_const_str_TASMOTACLIENT_RST, - (const bstring *)&be_const_str_MHZ_TXD, - (const bstring *)&be_const_str_resp_cmnd_error, - (const bstring *)&be_const_str_AS3935, - (const bstring *)&be_const_str_SYMBOL_CHARGE, - (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_DCKI, - (const bstring *)&be_const_str_PWM1, - (const bstring *)&be_const_str_PULLUP, - (const bstring *)&be_const_str_ARIRFRCV, - (const bstring *)&be_const_str_MCP39F5_RX, - (const bstring *)&be_const_str_SM2135_CLK, - (const bstring *)&be_const_str_SYMBOL_AUDIO, - (const bstring *)&be_const_str_IBEACON_TX, - (const bstring *)&be_const_str_ILI9341_DC, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_IBEACON_RX, - (const bstring *)&be_const_str_HALLEFFECT, - (const bstring *)&be_const_str_SR04_TRIG, - (const bstring *)&be_const_str_OUTPUT_HI, - (const bstring *)&be_const_str_CSE7766_RX, - (const bstring *)&be_const_str_class, - (const bstring *)&be_const_str_SYMBOL_LOOP, - NULL, - (const bstring *)&be_const_str_INPUT_PULLDOWN, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_DI, - (const bstring *)&be_const_str_write8, - (const bstring *)&be_const_str_I2S_OUT_DATA, - NULL, - (const bstring *)&be_const_str_PZEM004_RX, - (const bstring *)&be_const_str_loop, - (const bstring *)&be_const_str_ADC_TEMP, - NULL, - (const bstring *)&be_const_str___lower__, - NULL, - (const bstring *)&be_const_str_lv_group, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_range, - NULL, + (const bstring *)&be_const_str__cb, (const bstring *)&be_const_str_ADE7953_IRQ, - (const bstring *)&be_const_str_NEOPOOL_RX, - (const bstring *)&be_const_str_MCP39F5_TX, - (const bstring *)&be_const_str_HPMA_TX, - (const bstring *)&be_const_str_ETH_PHY_MDIO, - (const bstring *)&be_const_str_AZ_TXD, - (const bstring *)&be_const_str_lv_cpicker, - (const bstring *)&be_const_str_MP3_DFR562, - (const bstring *)&be_const_str_log10, - (const bstring *)&be_const_str_INTERRUPT, - (const bstring *)&be_const_str_SYMBOL_VOLUME_MAX, - (const bstring *)&be_const_str_HX711_SCK, - (const bstring *)&be_const_str_WIEGAND_D1, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_I2S_OUT_SLCT, - (const bstring *)&be_const_str_A4988_ENA, - (const bstring *)&be_const_str_publish, - (const bstring *)&be_const_str_SYMBOL_BULLET, - NULL, - (const bstring *)&be_const_str_Driver, - (const bstring *)&be_const_str_RFSEND, - (const bstring *)&be_const_str_HM10_RX, - NULL, - (const bstring *)&be_const_str_TUYA_TX, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_DEEPSLEEP, - NULL, - (const bstring *)&be_const_str_TELEINFO_ENABLE, - (const bstring *)&be_const_str_TM1637DIO, - NULL, - (const bstring *)&be_const_str_SDM630_TX, - (const bstring *)&be_const_str_RC522_RST, - NULL, - (const bstring *)&be_const_str_set_power, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str_TM1638CLK, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_content_stop, - (const bstring *)&be_const_str_KEY1_INV_PD, - (const bstring *)&be_const_str_SDS0X1_TX, - (const bstring *)&be_const_str_init, - (const bstring *)&be_const_str_digital_write, - NULL, - (const bstring *)&be_const_str_SYMBOL_RIGHT, - (const bstring *)&be_const_str_ETH_PHY_POWER, - (const bstring *)&be_const_str_SYMBOL_BATTERY_FULL, - (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, - (const bstring *)&be_const_str_SWT1_PD, - (const bstring *)&be_const_str_AudioGenerator, - (const bstring *)&be_const_str_map, - (const bstring *)&be_const_str_ADC_INPUT, - (const bstring *)&be_const_str_LOW, - (const bstring *)&be_const_str_LED1_INV, - (const bstring *)&be_const_str_EPAPER29_CS, - (const bstring *)&be_const_str_OUTPUT, - (const bstring *)&be_const_str_I2S_IN_DATA, - (const bstring *)&be_const_str_SM2135_DAT, - (const bstring *)&be_const_str_INPUT_PULLUP, - (const bstring *)&be_const_str_I2S_IN_SLCT, - (const bstring *)&be_const_str_TCP_TX, - (const bstring *)&be_const_str_content_button, - NULL, - (const bstring *)&be_const_str_BUZZER, - (const bstring *)&be_const_str_lv_slider, - NULL, - (const bstring *)&be_const_str_MIEL_HVAC_TX, - (const bstring *)&be_const_str_content_send, - (const bstring *)&be_const_str_opt_add, - (const bstring *)&be_const_str_content_flush, - (const bstring *)&be_const_str_rtc, - (const bstring *)&be_const_str_ADC_PH, - (const bstring *)&be_const_str_SYMBOL_LIST, - (const bstring *)&be_const_str_SYMBOL_BATTERY_1, + (const bstring *)&be_const_str_SM2135_CLK, (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, + (const bstring *)&be_const_str_ILI9488_CS, + (const bstring *)&be_const_str_OUTPUT, + NULL, + (const bstring *)&be_const_str_HM10_RX, + (const bstring *)&be_const_str_LED1, + (const bstring *)&be_const_str_pin, + (const bstring *)&be_const_str_HIGH, + (const bstring *)&be_const_str_SM2135_DAT, + (const bstring *)&be_const_str_char, + (const bstring *)&be_const_str_GPS_TX, + (const bstring *)&be_const_str_deg, + (const bstring *)&be_const_str_IRSEND, + (const bstring *)&be_const_str_lv_draw_mask_angle_param, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_MAX7219DIN, + (const bstring *)&be_const_str_isinstance, + (const bstring *)&be_const_str_ADC_CT_POWER, + (const bstring *)&be_const_str_count, + NULL, + NULL, + (const bstring *)&be_const_str_SDM120_RX, + (const bstring *)&be_const_str_rand, + (const bstring *)&be_const_str_cb_dispatch, + (const bstring *)&be_const_str_number, + NULL, + (const bstring *)&be_const_str_lv_calendar, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_NRF24_CS, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_setbits, + NULL, + (const bstring *)&be_const_str_SWT1_PD, NULL, (const bstring *)&be_const_str_SSPI_MISO, - (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, - (const bstring *)&be_const_str_try_rule, + (const bstring *)&be_const_str_resp_cmnd_str, NULL, + (const bstring *)&be_const_str_PZEM017_RX, + (const bstring *)&be_const_str_acos, + (const bstring *)&be_const_str_ADC_BUTTON, (const bstring *)&be_const_str_MGC3130_RESET, - (const bstring *)&be_const_str_state, - (const bstring *)&be_const_str_MAX31855DO, - (const bstring *)&be_const_str_SYMBOL_NEW_LINE, - (const bstring *)&be_const_str_A4988_DIR, - (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, + (const bstring *)&be_const_str_lv_draw_mask_angle_param_cfg, + (const bstring *)&be_const_str_set, + (const bstring *)&be_const_str_SYMBOL_PAUSE, + (const bstring *)&be_const_str_SDM72_TX, NULL, - (const bstring *)&be_const_str_dot_p, - (const bstring *)&be_const_str_OUTPUT_LO, - (const bstring *)&be_const_str_PMS5003_RX, - (const bstring *)&be_const_str_BUZZER_INV, - (const bstring *)&be_const_str_call, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_HPMA_TX, + (const bstring *)&be_const_str_tostring, + (const bstring *)&be_const_str__buffer, + (const bstring *)&be_const_str_KEY1_INV, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_get, + (const bstring *)&be_const_str_MIEL_HVAC_TX, + (const bstring *)&be_const_str_ETH_PHY_MDC, + (const bstring *)&be_const_str_format, + NULL, + (const bstring *)&be_const_str_DDS2382_TX, + (const bstring *)&be_const_str_ARIRFSEL, + (const bstring *)&be_const_str_WEBCAM_HSD, + (const bstring *)&be_const_str__write, + (const bstring *)&be_const_str_EPAPER29_CS, + NULL, + (const bstring *)&be_const_str_PWM1, + (const bstring *)&be_const_str_lv_keyboard, + (const bstring *)&be_const_str_publish_result, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_INTERRUPT, + (const bstring *)&be_const_str_RC522_RST, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str_SBR_TX, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_read8, + (const bstring *)&be_const_str_ADC_BUTTON_INV, + NULL, + (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, + (const bstring *)&be_const_str_add_driver, + (const bstring *)&be_const_str_SYMBOL_RIGHT, + (const bstring *)&be_const_str_MAX31855CLK, + NULL, + (const bstring *)&be_const_str_BL0940_RX, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str_REL1_INV, + (const bstring *)&be_const_str_FTC532, + (const bstring *)&be_const_str_LMT01, + NULL, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_SYMBOL_BLUETOOTH, + (const bstring *)&be_const_str_gc, + (const bstring *)&be_const_str_begin, + (const bstring *)&be_const_str_SYMBOL_NEXT, + (const bstring *)&be_const_str_SYMBOL_OK, + (const bstring *)&be_const_str_BOILER_OT_TX, + (const bstring *)&be_const_str_SPI_CLK, + (const bstring *)&be_const_str_start, (const bstring *)&be_const_str_MIEL_HVAC_RX, + (const bstring *)&be_const_str_dot_p, NULL, - (const bstring *)&be_const_str_RC522_CS, - (const bstring *)&be_const_str_EPAPER42_CS, - NULL, + (const bstring *)&be_const_str_EXS_ENABLE, + (const bstring *)&be_const_str_ROT1A, (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_CNTR1, - (const bstring *)&be_const_str_IRRECV, - (const bstring *)&be_const_str_read24, - (const bstring *)&be_const_str_MCP39F5_RST, - (const bstring *)&be_const_str_A4988_STP, - (const bstring *)&be_const_str_fromstring, + (const bstring *)&be_const_str_SYMBOL_DOWNLOAD, + (const bstring *)&be_const_str_REL1, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_MHZ_RXD, + (const bstring *)&be_const_str_ZIGBEE_TX, + (const bstring *)&be_const_str_LEDLNK, + (const bstring *)&be_const_str_lv_draw_rect_dsc, + (const bstring *)&be_const_str_SYMBOL_BELL, + (const bstring *)&be_const_str_addr, + (const bstring *)&be_const_str_LEDLNK_INV, + (const bstring *)&be_const_str_AudioFileSource, + NULL, + (const bstring *)&be_const_str_gamma8, + (const bstring *)&be_const_str_BUZZER, + (const bstring *)&be_const_str_RDM6300_RX, + NULL, + (const bstring *)&be_const_str_BACKLIGHT, + (const bstring *)&be_const_str_ILI9341_CS, + (const bstring *)&be_const_str_SYMBOL_WARNING, + (const bstring *)&be_const_str_KEY1, + (const bstring *)&be_const_str_SSPI_MAX31865_CS1, + NULL, + (const bstring *)&be_const_str_SYMBOL_TRASH, + NULL, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_SDM120_TX, + (const bstring *)&be_const_str_TASMOTACLIENT_TXD, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_SYMBOL_PLAY, + (const bstring *)&be_const_str_SSD1331_DC, + (const bstring *)&be_const_str_save, + NULL, + (const bstring *)&be_const_str_opt_call, + (const bstring *)&be_const_str_SYMBOL_POWER, + (const bstring *)&be_const_str_AS608_TX, + NULL, + (const bstring *)&be_const_str_SPI_MISO, + (const bstring *)&be_const_str_SSD1351_DC, + (const bstring *)&be_const_str_KEY1_INV_NP, + (const bstring *)&be_const_str_AZ_RXD, + (const bstring *)&be_const_str_CSE7761_RX, + NULL, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_SYMBOL_IMAGE, + (const bstring *)&be_const_str_ILI9341_DC, + (const bstring *)&be_const_str_HJL_CF, + (const bstring *)&be_const_str_SSPI_DC, + (const bstring *)&be_const_str_RXD, + (const bstring *)&be_const_str_P9813_DAT, + (const bstring *)&be_const_str_TFMINIPLUS_TX, + (const bstring *)&be_const_str_cosh, + (const bstring *)&be_const_str_DSB_OUT, + NULL, + (const bstring *)&be_const_str_SDS0X1_TX, + (const bstring *)&be_const_str_DDSU666_TX, + (const bstring *)&be_const_str_PULLUP, + (const bstring *)&be_const_str_DDS2382_RX, + NULL, + (const bstring *)&be_const_str_OUTPUT_LO, + (const bstring *)&be_const_str_wire1, + (const bstring *)&be_const_str_resp_cmnd_failed, + NULL, + (const bstring *)&be_const_str_I2S_IN_CLK, + (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str___upper__, + (const bstring *)&be_const_str_lv_line, + (const bstring *)&be_const_str_I2S_OUT_SLCT, + (const bstring *)&be_const_str_digital_read, + (const bstring *)&be_const_str_TM1637CLK, + (const bstring *)&be_const_str_SYMBOL_AUDIO, + (const bstring *)&be_const_str_EPD_DATA, + (const bstring *)&be_const_str_PN532_TXD, + (const bstring *)&be_const_str_opt_neq, + (const bstring *)&be_const_str_every_50ms, + (const bstring *)&be_const_str_SYMBOL_REFRESH, + (const bstring *)&be_const_str_web_send, + (const bstring *)&be_const_str_CHANGE, + (const bstring *)&be_const_str_HX711_DAT, + (const bstring *)&be_const_str_SDCARD_CS, + (const bstring *)&be_const_str_HX711_SCK, + (const bstring *)&be_const_str_PZEM016_RX, + (const bstring *)&be_const_str_ADC_TEMP, + (const bstring *)&be_const_str_EPAPER42_CS, + (const bstring *)&be_const_str_every_100ms, + (const bstring *)&be_const_str_SENSOR_END, + (const bstring *)&be_const_str_WEBCAM_RESET, + (const bstring *)&be_const_str_SDM72_RX, + (const bstring *)&be_const_str_SYMBOL_BATTERY_2, + (const bstring *)&be_const_str_SYMBOL_NEW_LINE, + (const bstring *)&be_const_str_WINDMETER_SPEED, + NULL, + (const bstring *)&be_const_str_HLW_CF, + NULL, + (const bstring *)&be_const_str_DCKI, + (const bstring *)&be_const_str_SYMBOL_BACKSPACE, + (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, + (const bstring *)&be_const_str_SYMBOL_COPY, + (const bstring *)&be_const_str_HM10_TX, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_bytes, + (const bstring *)&be_const_str_TM1638STB, + (const bstring *)&be_const_str_DHT11_OUT, + (const bstring *)&be_const_str_SYMBOL_SETTINGS, + (const bstring *)&be_const_str_MAX7219CLK, + (const bstring *)&be_const_str_SYMBOL_DIRECTORY, + (const bstring *)&be_const_str_WS2812, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_except, + (const bstring *)&be_const_str_CSE7766_TX, + (const bstring *)&be_const_str_DEEPSLEEP, + (const bstring *)&be_const_str_SM16716_CLK, + (const bstring *)&be_const_str_KEY1_INV_PD, + (const bstring *)&be_const_str_DYP_RX, + (const bstring *)&be_const_str_OPTION_A, + (const bstring *)&be_const_str_byte, + NULL, + (const bstring *)&be_const_str_BS814_DAT, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_SAIR_TX, + (const bstring *)&be_const_str_read12, + (const bstring *)&be_const_str_exec_cmd, + (const bstring *)&be_const_str_HRXL_RX, + NULL, + (const bstring *)&be_const_str_break, + NULL, + NULL, + (const bstring *)&be_const_str_A4988_DIR, + (const bstring *)&be_const_str_ADC_INPUT, + (const bstring *)&be_const_str_SYMBOL_PASTE, + (const bstring *)&be_const_str_BS814_CLK, + (const bstring *)&be_const_str_SSPI_MOSI, + (const bstring *)&be_const_str_SYMBOL_DUMMY, + (const bstring *)&be_const_str_ROT1B, + (const bstring *)&be_const_str_PZEM0XX_TX, + (const bstring *)&be_const_str_KEY1_TC, + (const bstring *)&be_const_str_I2S_IN_SLCT, + (const bstring *)&be_const_str_I2S_OUT_DATA, + (const bstring *)&be_const_str_compile, + (const bstring *)&be_const_str_LE01MR_TX, + (const bstring *)&be_const_str_PN532_RXD, + NULL, + (const bstring *)&be_const_str_lv_cont, + (const bstring *)&be_const_str_Driver, + (const bstring *)&be_const_str_MAX31855DO, + NULL, + NULL, + (const bstring *)&be_const_str_MAX31855CS, + (const bstring *)&be_const_str_KEY1_NP, + (const bstring *)&be_const_str_SYMBOL_BATTERY_1, + (const bstring *)&be_const_str_asstring, + (const bstring *)&be_const_str_LOW, + (const bstring *)&be_const_str_PZEM004_RX, + (const bstring *)&be_const_str_SDM630_RX, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_DHT11, + NULL, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_SPI_CS, + NULL, + (const bstring *)&be_const_str_opt_add, + NULL, + (const bstring *)&be_const_str_OPEN_DRAIN, (const bstring *)&be_const_str_MGC3130_XFER, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_PZEM0XX_TX + NULL, + (const bstring *)&be_const_str_arg, + (const bstring *)&be_const_str_CNTR1_NP, + (const bstring *)&be_const_str_NRG_CF1, + (const bstring *)&be_const_str_NEOPOOL_TX, + (const bstring *)&be_const_str_arg_name, + (const bstring *)&be_const_str_AS608_RX, + (const bstring *)&be_const_str_IBEACON_TX, + (const bstring *)&be_const_str_IRRECV, + (const bstring *)&be_const_str_SYMBOL_PREV, + (const bstring *)&be_const_str_AudioGenerator, + NULL, + (const bstring *)&be_const_str_SYMBOL_LOOP, + (const bstring *)&be_const_str_get_power, + (const bstring *)&be_const_str_finish, + NULL, + (const bstring *)&be_const_str_TM1638DIO, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_find_key_i, + (const bstring *)&be_const_str_SYMBOL_LEFT, + (const bstring *)&be_const_str_montserrat_font, + NULL, + (const bstring *)&be_const_str_resp_cmnd, + (const bstring *)&be_const_str_WEBCAM_SIOC, + (const bstring *)&be_const_str_SYMBOL_USB, + (const bstring *)&be_const_str_SSPI_CS, + NULL, + NULL, + NULL, + (const bstring *)&be_const_str_A4988_STP, + (const bstring *)&be_const_str_HPMA_RX, + (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str_WIEGAND_D1, + (const bstring *)&be_const_str_INPUT, + (const bstring *)&be_const_str_KEY1_PD, + (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, + (const bstring *)&be_const_str_WEBCAM_PSRCS, + (const bstring *)&be_const_str_SYMBOL_EJECT, + (const bstring *)&be_const_str_imax, + (const bstring *)&be_const_str_HRE_DATA }; static const struct bconststrtab m_const_string_table = { - .size = 317, - .count = 635, + .size = 318, + .count = 636, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h index 61b0d7716..7e087db7f 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h @@ -1,68 +1,69 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_tasmota_map) { - { be_const_key(millis, 52), be_const_func(l_millis) }, - { be_const_key(gc, -1), be_const_closure(gc_closure) }, - { be_const_key(scale_uint, -1), be_const_func(l_scaleuint) }, - { be_const_key(log, -1), be_const_func(l_logInfo) }, - { be_const_key(add_rule, -1), be_const_closure(add_rule_closure) }, - { be_const_key(get_free_heap, -1), be_const_func(l_getFreeHeap) }, + { be_const_key(publish, -1), be_const_func(l_publish) }, + { be_const_key(wire2, -1), be_const_index(0) }, + { be_const_key(yield, 14), be_const_func(l_yield) }, + { be_const_key(log, 34), be_const_func(l_logInfo) }, + { be_const_key(find_op, -1), be_const_closure(find_op_closure) }, + { be_const_key(i2c_enabled, 24), be_const_func(l_i2cenabled) }, + { be_const_key(run_deferred, -1), be_const_closure(run_deferred_closure) }, { be_const_key(_cmd, -1), be_const_func(l_cmd) }, - { be_const_key(web_send, 16), be_const_func(l_webSend) }, - { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) }, - { be_const_key(_cb, -1), be_const_index(0) }, - { be_const_key(exec_cmd, -1), be_const_closure(exec_cmd_closure) }, - { be_const_key(i2c_enabled, 42), be_const_func(l_i2cenabled) }, - { be_const_key(cmd, -1), be_const_closure(cmd_closure) }, - { be_const_key(resp_cmnd_done, 28), be_const_func(l_respCmndDone) }, - { be_const_key(set_light, 1), be_const_closure(set_light_closure) }, + { be_const_key(save, 30), be_const_func(l_save) }, + { be_const_key(resolvecmnd, 51), be_const_func(l_resolveCmnd) }, + { be_const_key(memory, -1), be_const_func(l_memory) }, + { be_const_key(_ccmd, -1), be_const_index(1) }, { be_const_key(get_light, -1), be_const_closure(get_light_closure) }, - { be_const_key(_rules, 50), be_const_index(1) }, - { be_const_key(time_reached, -1), be_const_func(l_timereached) }, - { be_const_key(web_send_decimal, -1), be_const_func(l_webSendDecimal) }, - { be_const_key(load, 22), be_const_closure(load_closure) }, - { be_const_key(yield, -1), be_const_func(l_yield) }, - { be_const_key(event, -1), be_const_closure(event_closure) }, - { be_const_key(add_cmd, 40), be_const_closure(add_cmd_closure) }, - { be_const_key(find_key_i, -1), be_const_closure(find_key_i_closure) }, - { be_const_key(delay, 43), be_const_func(l_delay) }, - { be_const_key(remove_cmd, -1), be_const_closure(remove_cmd_closure) }, - { be_const_key(remove_rule, 56), be_const_closure(remove_rule_closure) }, - { be_const_key(resolvecmnd, 29), be_const_func(l_resolveCmnd) }, - { be_const_key(get_option, -1), be_const_func(l_getoption) }, + { be_const_key(add_rule, 56), be_const_closure(add_rule_closure) }, + { be_const_key(exec_rules, -1), be_const_closure(exec_rules_closure) }, + { be_const_key(get_power, -1), be_const_func(l_getpower) }, + { be_const_key(_get_cb, -1), be_const_func(l_get_cb) }, + { be_const_key(_cb, -1), be_const_index(2) }, + { be_const_key(time_str, -1), be_const_closure(time_str_closure) }, + { be_const_key(add_driver, 21), be_const_closure(add_driver_closure) }, + { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) }, + { be_const_key(_rules, -1), be_const_index(3) }, + { be_const_key(rtc, -1), be_const_func(l_rtc) }, + { be_const_key(set_light, -1), be_const_closure(set_light_closure) }, + { be_const_key(add_cmd, 25), be_const_closure(add_cmd_closure) }, + { be_const_key(event, 49), be_const_closure(event_closure) }, + { be_const_key(scale_uint, -1), be_const_func(l_scaleuint) }, + { be_const_key(millis, -1), be_const_func(l_millis) }, + { be_const_key(remove_rule, -1), be_const_closure(remove_rule_closure) }, + { be_const_key(publish_result, -1), be_const_func(l_publish_result) }, + { be_const_key(_timers, -1), be_const_index(4) }, { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) }, { be_const_key(response_append, -1), be_const_func(l_respAppend) }, - { be_const_key(_timers, -1), be_const_index(2) }, - { be_const_key(try_rule, -1), be_const_closure(try_rule_closure) }, - { be_const_key(set_power, 45), be_const_func(l_setpower) }, - { be_const_key(resp_cmnd_error, -1), be_const_func(l_respCmndError) }, - { be_const_key(publish, -1), be_const_func(l_publish) }, - { be_const_key(_ccmd, 13), be_const_index(3) }, - { be_const_key(_get_cb, -1), be_const_func(l_get_cb) }, - { be_const_key(wire1, 15), be_const_index(4) }, - { be_const_key(gen_cb, 6), be_const_closure(gen_cb_closure) }, - { be_const_key(rtc, -1), be_const_func(l_rtc) }, - { be_const_key(time_dump, -1), be_const_func(l_time_dump) }, - { be_const_key(run_deferred, -1), be_const_closure(run_deferred_closure) }, - { be_const_key(memory, 47), be_const_func(l_memory) }, - { be_const_key(time_str, 53), be_const_closure(time_str_closure) }, - { be_const_key(save, -1), be_const_func(l_save) }, - { be_const_key(find_op, 25), be_const_closure(find_op_closure) }, - { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) }, - { be_const_key(get_power, -1), be_const_func(l_getpower) }, - { be_const_key(wire2, 8), be_const_index(5) }, - { be_const_key(wire_scan, 55), be_const_closure(wire_scan_closure) }, - { be_const_key(resp_cmnd_failed, -1), be_const_func(l_respCmndFailed) }, - { be_const_key(exec_rules, -1), be_const_closure(exec_rules_closure) }, + { be_const_key(set_power, -1), be_const_func(l_setpower) }, + { be_const_key(get_option, -1), be_const_func(l_getoption) }, + { be_const_key(wire1, 32), be_const_index(5) }, + { be_const_key(web_send, 29), be_const_func(l_webSend) }, + { be_const_key(resp_cmnd_done, -1), be_const_func(l_respCmndDone) }, + { be_const_key(remove_cmd, 23), be_const_closure(remove_cmd_closure) }, + { be_const_key(try_rule, 46), be_const_closure(try_rule_closure) }, + { be_const_key(wire_scan, 31), be_const_closure(wire_scan_closure) }, + { be_const_key(_drivers, 15), be_const_index(6) }, + { be_const_key(resp_cmnd_failed, 7), be_const_func(l_respCmndFailed) }, + { be_const_key(exec_cmd, -1), be_const_closure(exec_cmd_closure) }, + { be_const_key(find_key_i, -1), be_const_closure(find_key_i_closure) }, + { be_const_key(get_free_heap, -1), be_const_func(l_getFreeHeap) }, + { be_const_key(load, -1), be_const_closure(load_closure) }, + { be_const_key(cmd, -1), be_const_closure(cmd_closure) }, + { be_const_key(resp_cmnd, 20), be_const_func(l_respCmnd) }, { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) }, - { be_const_key(resp_cmnd, -1), be_const_func(l_respCmnd) }, - { be_const_key(_drivers, -1), be_const_index(6) }, - { be_const_key(add_driver, -1), be_const_closure(add_driver_closure) }, + { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) }, + { be_const_key(gen_cb, -1), be_const_closure(gen_cb_closure) }, + { be_const_key(web_send_decimal, 1), be_const_func(l_webSendDecimal) }, + { be_const_key(gc, -1), be_const_closure(gc_closure) }, + { be_const_key(delay, -1), be_const_func(l_delay) }, + { be_const_key(time_dump, 50), be_const_func(l_time_dump) }, + { be_const_key(time_reached, -1), be_const_func(l_timereached) }, + { be_const_key(resp_cmnd_error, -1), be_const_func(l_respCmndError) }, }; static be_define_const_map( be_class_tasmota_map, - 57 + 58 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/tasmota/xdrv_52_3_berry_tasmota.ino b/tasmota/xdrv_52_3_berry_tasmota.ino index a35319ca7..734a571c7 100644 --- a/tasmota/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/xdrv_52_3_berry_tasmota.ino @@ -87,6 +87,22 @@ extern "C" { } be_raise(vm, kTypeError, nullptr); } + + // Berry: `tasmota.publish_result(payload:string, subtopic:string) -> nil`` + // + int32_t l_publish_result(struct bvm *vm); + int32_t l_publish_result(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top >= 3 && be_isstring(vm, 2) && be_isstring(vm, 3)) { // 2 mandatory string arguments + const char * payload = be_tostring(vm, 2); + const char * subtopic = be_tostring(vm, 3); + Response_P(PSTR("%s"), payload); + be_pop(vm, top); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, subtopic); + be_return_nil(vm); // Return + } + be_raise(vm, kTypeError, nullptr); + } // Berry: `tasmota.cmd(command:string) -> string` // From 520612b67c8f7c51aadf8697fbbf74740477dc32 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 21 Jul 2021 11:41:31 +0200 Subject: [PATCH 021/148] Fix discovery fails when using ``%hostname%`` in a topic (#12710) --- CHANGELOG.md | 4 ++++ RELEASENOTES.md | 2 ++ tasmota/support_tasmota.ino | 10 ++++++++-- tasmota/tasmota.ino | 6 ++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c9e5995e..0b9267cb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ All notable changes to this project will be documented in this file. ### Changed - Disable PSRAM on unsupported hardware +- Replace spaces by hyphens in final hostname (#12710) + +### Fixed +- Discovery fails when using ``%hostname%`` in a topic (#12710) ## [9.5.0.2] 20210714 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7d293427c..c93f3ae44 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -126,6 +126,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) - Allow buttons to work in AP normal mode [#12518](https://github.com/arendst/Tasmota/issues/12518) - Enable Ping and rule features for any device compiled with more than 1M flash size [#12539](https://github.com/arendst/Tasmota/issues/12539) +- Replace spaces by hyphens in final hostname [#12710](https://github.com/arendst/Tasmota/issues/12710) ### Fixed - ESP32 core v2.0.0 setting hostname @@ -142,6 +143,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Exception 28 when unable to send MQTT message and a topic name without a slash '/' [#12555](https://github.com/arendst/Tasmota/issues/12555) - Wi-Fi initial setup workaround for 11n only routers [#12566](https://github.com/arendst/Tasmota/issues/12566) - ESP32 do not use chip temperature sensor as global temperature if external temperature sensor is used [#12630](https://github.com/arendst/Tasmota/issues/12630) +- Discovery fails when using ``%hostname%`` in a topic [#12710](https://github.com/arendst/Tasmota/issues/12710) ### Noted - ESP32 single core **tasmota32solo1.bin** binary can only be uploaded using the GUI as OTA upload will trigger the watchdog timer. Fixed once https://github.com/espressif/arduino-esp32/pull/5426 is merged. \ No newline at end of file diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 621881439..7c74aa479 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -77,6 +77,13 @@ char* GetOtaUrl(char *otaurl, size_t otaurl_size) return otaurl; } +String ResolveToken(const char* input) { + String resolved = input; + resolved.replace(F("%hostname%"), TasmotaGlobal.hostname); + resolved.replace(F("%id%"), NetworkUniqueId()); + return resolved; +} + char* GetTopic_P(char *stopic, uint32_t prefix, char *topic, const char* subtopic) { /* prefix 0 = Cmnd @@ -120,8 +127,7 @@ char* GetTopic_P(char *stopic, uint32_t prefix, char *topic, const char* subtopi fulltopic.replace(FPSTR(MQTT_TOKEN_PREFIX), SettingsText(SET_MQTTPREFIX1 + prefix)); fulltopic.replace(FPSTR(MQTT_TOKEN_TOPIC), (const __FlashStringHelper *)topic); - fulltopic.replace(F("%hostname%"), TasmotaGlobal.hostname); - fulltopic.replace(F("%id%"), NetworkUniqueId()); + fulltopic = ResolveToken(fulltopic.c_str()); } fulltopic.replace(F("#"), ""); fulltopic.replace(F("//"), "/"); diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 1c6e351e1..aeab9e8ed 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -380,6 +380,12 @@ void setup(void) { } else { snprintf_P(TasmotaGlobal.hostname, sizeof(TasmotaGlobal.hostname)-1, SettingsText(SET_HOSTNAME)); } + char *s = TasmotaGlobal.hostname; + while (*s) { + if (' ' == *s) { *s = '_'; } + s++; + } + snprintf_P(TasmotaGlobal.mqtt_topic, sizeof(TasmotaGlobal.mqtt_topic), ResolveToken(TasmotaGlobal.mqtt_topic).c_str()); RtcInit(); GpioInit(); From 9cc657452f43c63b4fe588bdb7ae746ae2322c06 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 21 Jul 2021 12:23:15 +0200 Subject: [PATCH 022/148] core 1.0.7.3 --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index d3a5b7743..4cbde3b76 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -27,7 +27,7 @@ build_flags = ${esp_defaults.build_flags} [core32] platform = espressif32 @ 3.3.0 -platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.2/tasmota-arduinoespressif32-release_v3.3.5.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.3/tasmota-arduinoespressif32-release_v3.3.5.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 2e35af5c97ade47236409ea20c62875f0210cb92 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 21 Jul 2021 12:23:46 +0200 Subject: [PATCH 023/148] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index dc9395db5..a217911ee 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - - [ ] The code change is tested and works with Tasmota core ESP32 V.1.0.7.2 + - [ ] The code change is tested and works with Tasmota core ESP32 V.1.0.7.3 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ From 7d26370d9e8c4d371a6ab28d707348f3fa7b3b41 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 21 Jul 2021 12:25:26 +0200 Subject: [PATCH 024/148] Fix wrong gc count for instances --- lib/libesp32/Berry/src/be_gc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/libesp32/Berry/src/be_gc.c b/lib/libesp32/Berry/src/be_gc.c index fca6ad45d..8e6ac005e 100644 --- a/lib/libesp32/Berry/src/be_gc.c +++ b/lib/libesp32/Berry/src/be_gc.c @@ -339,12 +339,19 @@ static void free_lstring(bvm *vm, bgcobject *obj) } } +static void free_instance(bvm *vm, bgcobject *obj) +{ + binstance *o = cast_instance(obj); + int nvar = be_instance_member_count(o); + be_free(vm, obj, sizeof(binstance) + sizeof(bvalue) * (nvar - 1)); +} + static void free_object(bvm *vm, bgcobject *obj) { switch (obj->type) { case BE_STRING: free_lstring(vm, obj); break; /* long string */ case BE_CLASS: be_free(vm, obj, sizeof(bclass)); break; - case BE_INSTANCE: be_free(vm, obj, sizeof(binstance)); break; + case BE_INSTANCE: free_instance(vm, obj); break; case BE_MAP: be_map_delete(vm, cast_map(obj)); break; case BE_LIST: be_list_delete(vm, cast_list(obj)); break; case BE_CLOSURE: free_closure(vm, obj); break; From cd228d2f84d1ef0fd07e99ce997daec79e140b36 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 21 Jul 2021 13:26:32 +0200 Subject: [PATCH 025/148] Fix ESP32-Solo OTA upgrade --- CHANGELOG.md | 2 ++ RELEASENOTES.md | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b9267cb7..cda24d857 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,13 @@ All notable changes to this project will be documented in this file. - Berry ESP32 support for I2S audio mp3 playback ### Changed +- ESP32 core library from v1.0.7.1 to v1.0.7.3 - Disable PSRAM on unsupported hardware - Replace spaces by hyphens in final hostname (#12710) ### Fixed - Discovery fails when using ``%hostname%`` in a topic (#12710) +- ESP32-Solo OTA upgrade ## [9.5.0.2] 20210714 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c93f3ae44..af4b7db84 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -69,7 +69,7 @@ Historical binaries can be downloaded from The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` ### ESP32 based -The following binary downloads have been compiled with ESP32/Arduino library core version **1.0.6**. +The following binary downloads have been compiled with ESP32/Arduino library core version **1.0.7.3**. - **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY** - **tasmota32_8M.bin** = The Tasmota version with most drivers including additional sensors and KNX for 8M+ flash. @@ -114,7 +114,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) ### Changed -- ESP32 core library from v1.0.6 to v1.0.7.1 +- ESP32 core library from v1.0.6 to v1.0.7.3 - IRremoteESP8266 library from v2.7.18 to v2.7.19 - ESP32 Ethernet Phy Type information to IDF v3+ - Speed up initial GUI console refresh @@ -131,6 +131,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Fixed - ESP32 core v2.0.0 setting hostname - ESP32-C3 settings layout for configuration backup and restore +- ESP32-Solo OTA upgrade - DDS238-2 wrong reactive power value [#12283](https://github.com/arendst/Tasmota/issues/12283) - ESP32 Webcam add boundary marker before sending mjpeg image [#12376](https://github.com/arendst/Tasmota/issues/12376) - NO VALID JSON regression from may 4th [#12440](https://github.com/arendst/Tasmota/issues/12440) @@ -144,6 +145,3 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Wi-Fi initial setup workaround for 11n only routers [#12566](https://github.com/arendst/Tasmota/issues/12566) - ESP32 do not use chip temperature sensor as global temperature if external temperature sensor is used [#12630](https://github.com/arendst/Tasmota/issues/12630) - Discovery fails when using ``%hostname%`` in a topic [#12710](https://github.com/arendst/Tasmota/issues/12710) - -### Noted -- ESP32 single core **tasmota32solo1.bin** binary can only be uploaded using the GUI as OTA upload will trigger the watchdog timer. Fixed once https://github.com/espressif/arduino-esp32/pull/5426 is merged. \ No newline at end of file From 620fbbb9c0c48e7785bbc8a1b9a590ba4e06b4b5 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Wed, 21 Jul 2021 21:10:18 +0200 Subject: [PATCH 026/148] prometheus: Fix typo in comment The sentinel value is meant to be used for unknown memory values, not known values of course. Signed-off-by: Michael Hanselmann --- tasmota/xsns_75_prometheus.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index b4a3e602c..6d55e9057 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -164,7 +164,7 @@ void WritePromMetricStr(const char *name, uint8_t flags, const char *value, ...) va_end(labels); } -// Sentinel value for known memory metrics, chosen to unlikely match actual +// Sentinel value for unknown memory metrics, chosen to unlikely match actual // values. const uint32_t kPromMemoryUnknown = 0xFFFFFFFF - 1; From 749d30a14f551cd05bef678f838f4c5df971b4af Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 21 Jul 2021 23:17:53 +0200 Subject: [PATCH 027/148] LVGL fixes and examples --- .../Berry/default/be_lv_lvgl_module.c | 28 +++++++- .../Berry/default/be_lvgl_widgets_lib.c | 1 + lib/libesp32/Berry/default/berry_conf.h | 2 +- lib/libesp32/Berry/src/be_object.c | 2 +- lib/libesp32/Berry/src/be_parser.c | 2 +- lib/libesp32/Berry/src/be_solidifylib.c | 4 +- tasmota/berry/lvgl_examples/drawing_1.be | 67 +++++++++++++++++++ tasmota/berry/lvgl_examples/drawing_2.be | 58 ++++++++++++++++ tasmota/berry/lvgl_examples/signal_bars.be | 65 ++++++++++++++++++ tasmota/berry/modules/partition.be | 1 + tasmota/lvgl_berry/be_lv_c_mapping.h | 15 +++-- tasmota/xdrv_52_2_berry_native.ino | 15 ++++- tasmota/xdrv_52_3_berry_lvgl.ino | 13 ++-- tools/lv_berry/convert.py | 4 ++ tools/lv_berry/lv_module.h | 34 ++++++++++ tools/lv_berry/lv_widgets.h | 6 ++ 16 files changed, 294 insertions(+), 23 deletions(-) create mode 100644 tasmota/berry/lvgl_examples/drawing_1.be create mode 100644 tasmota/berry/lvgl_examples/drawing_2.be create mode 100644 tasmota/berry/lvgl_examples/signal_bars.be diff --git a/lib/libesp32/Berry/default/be_lv_lvgl_module.c b/lib/libesp32/Berry/default/be_lv_lvgl_module.c index 0e5db42fc..6d47ffbb9 100644 --- a/lib/libesp32/Berry/default/be_lv_lvgl_module.c +++ b/lib/libesp32/Berry/default/be_lv_lvgl_module.c @@ -45,8 +45,8 @@ const lvbe_call_c_t lv_func[] = { { "draw_mask_angle_init", (void*) &lv_draw_mask_angle_init, "", "(lv_draw_mask_angle_param)iiii" }, { "draw_mask_fade_init", (void*) &lv_draw_mask_fade_init, "", "(lv_draw_mask_fade_param)(lv_area)iiii" }, { "draw_mask_get_cnt", (void*) &lv_draw_mask_get_cnt, "i", "" }, - { "draw_mask_line_angle_init", (void*) &lv_draw_mask_line_angle_init, "", "(lv_draw_mask_line_param)iii(lv_draw_mask_line_side)" }, - { "draw_mask_line_points_init", (void*) &lv_draw_mask_line_points_init, "", "(lv_draw_mask_line_param)iiii(lv_draw_mask_line_side)" }, + { "draw_mask_line_angle_init", (void*) &lv_draw_mask_line_angle_init, "", "(lv_draw_mask_line_param)iiii" }, + { "draw_mask_line_points_init", (void*) &lv_draw_mask_line_points_init, "", "(lv_draw_mask_line_param)iiiii" }, { "draw_mask_map_init", (void*) &lv_draw_mask_map_init, "", "(lv_draw_mask_map_param)(lv_area)(lv_opa)" }, { "draw_mask_radius_init", (void*) &lv_draw_mask_radius_init, "", "(lv_draw_mask_radius_param)(lv_area)ib" }, { "draw_mask_remove_custom", (void*) &lv_draw_mask_remove_custom, ".", "." }, @@ -63,6 +63,7 @@ const lvbe_call_c_t lv_func[] = { { "get_ver_res", (void*) &lv_get_ver_res, "i", "" }, { "layer_sys", (void*) &lv_layer_sys, "lv_obj", "" }, { "layer_top", (void*) &lv_layer_top, "lv_obj", "" }, + { "refr_now", (void*) &lv_refr_now, "", "" }, { "scr_act", (void*) &lv_scr_act, "lv_obj", "" }, { "scr_load", (void*) &lv_scr_load, "", "(lv_obj)" }, { "scr_load_anim", (void*) &lv_scr_load_anim, "", "(lv_obj)(lv_scr_load_anim)iib" }, @@ -171,6 +172,13 @@ const be_constint_t lv0_constants[] = { { "CPICKER_TYPE_DISC", LV_CPICKER_TYPE_DISC }, { "CPICKER_TYPE_RECT", LV_CPICKER_TYPE_RECT }, { "CYAN", 65535 }, + { "DESIGN_COVER_CHK", LV_DESIGN_COVER_CHK }, + { "DESIGN_DRAW_MAIN", LV_DESIGN_DRAW_MAIN }, + { "DESIGN_DRAW_POST", LV_DESIGN_DRAW_POST }, + { "DESIGN_RES_COVER", LV_DESIGN_RES_COVER }, + { "DESIGN_RES_MASKED", LV_DESIGN_RES_MASKED }, + { "DESIGN_RES_NOT_COVER", LV_DESIGN_RES_NOT_COVER }, + { "DESIGN_RES_OK", LV_DESIGN_RES_OK }, { "DISP_ROT_180", LV_DISP_ROT_180 }, { "DISP_ROT_270", LV_DISP_ROT_270 }, { "DISP_ROT_90", LV_DISP_ROT_90 }, @@ -257,6 +265,21 @@ const be_constint_t lv0_constants[] = { { "GRAD_DIR_VER", LV_GRAD_DIR_VER }, { "GRAY", 8421504 }, { "GREEN", 32768 }, + { "IMG_CF_ALPHA_1BIT", LV_IMG_CF_ALPHA_1BIT }, + { "IMG_CF_ALPHA_2BIT", LV_IMG_CF_ALPHA_2BIT }, + { "IMG_CF_ALPHA_4BIT", LV_IMG_CF_ALPHA_4BIT }, + { "IMG_CF_ALPHA_8BIT", LV_IMG_CF_ALPHA_8BIT }, + { "IMG_CF_INDEXED_1BIT", LV_IMG_CF_INDEXED_1BIT }, + { "IMG_CF_INDEXED_2BIT", LV_IMG_CF_INDEXED_2BIT }, + { "IMG_CF_INDEXED_4BIT", LV_IMG_CF_INDEXED_4BIT }, + { "IMG_CF_INDEXED_8BIT", LV_IMG_CF_INDEXED_8BIT }, + { "IMG_CF_RAW", LV_IMG_CF_RAW }, + { "IMG_CF_RAW_ALPHA", LV_IMG_CF_RAW_ALPHA }, + { "IMG_CF_RAW_CHROMA_KEYED", LV_IMG_CF_RAW_CHROMA_KEYED }, + { "IMG_CF_TRUE_COLOR", LV_IMG_CF_TRUE_COLOR }, + { "IMG_CF_TRUE_COLOR_ALPHA", LV_IMG_CF_TRUE_COLOR_ALPHA }, + { "IMG_CF_TRUE_COLOR_CHROMA_KEYED", LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED }, + { "IMG_CF_UNKNOWN", LV_IMG_CF_UNKNOWN }, { "INDEV_STATE_PR", LV_INDEV_STATE_PR }, { "INDEV_STATE_REL", LV_INDEV_STATE_REL }, { "KEYBOARD_MODE_NUM", LV_KEYBOARD_MODE_NUM }, @@ -345,6 +368,7 @@ const be_constint_t lv0_constants[] = { { "PROTECT_POS", LV_PROTECT_POS }, { "PROTECT_PRESS_LOST", LV_PROTECT_PRESS_LOST }, { "PURPLE", 8388736 }, + { "RADIUS_CIRCLE", 32767 }, { "RED", 16711680 }, { "ROLLER_MODE_INFINITE", LV_ROLLER_MODE_INFINITE }, { "ROLLER_MODE_NORMAL", LV_ROLLER_MODE_NORMAL }, diff --git a/lib/libesp32/Berry/default/be_lvgl_widgets_lib.c b/lib/libesp32/Berry/default/be_lvgl_widgets_lib.c index 5c2161432..9bf31a2ca 100644 --- a/lib/libesp32/Berry/default/be_lvgl_widgets_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_widgets_lib.c @@ -852,6 +852,7 @@ extern int lvbe_msgbox_get_btnmatrix(bvm *vm); /* `lv_objmask` external functions definitions */ extern int lvbe_objmask_create(bvm *vm); +extern int lvbe_objmask_add_mask(bvm *vm); extern int lvbe_objmask_update_mask(bvm *vm); extern int lvbe_objmask_remove_mask(bvm *vm); diff --git a/lib/libesp32/Berry/default/berry_conf.h b/lib/libesp32/Berry/default/berry_conf.h index c13952e58..e39a7fbd2 100644 --- a/lib/libesp32/Berry/default/berry_conf.h +++ b/lib/libesp32/Berry/default/berry_conf.h @@ -83,7 +83,7 @@ * expanded if the number of free is less than BE_STACK_FREE_MIN. * Default: 10 **/ -#define BE_STACK_FREE_MIN 10 +#define BE_STACK_FREE_MIN 25 /* Macro: BE_STACK_FREE_MIN * The short string will hold the hash value when the value is diff --git a/lib/libesp32/Berry/src/be_object.c b/lib/libesp32/Berry/src/be_object.c index 1162cdf8a..c34df0e9a 100644 --- a/lib/libesp32/Berry/src/be_object.c +++ b/lib/libesp32/Berry/src/be_object.c @@ -29,7 +29,7 @@ const char* be_vtype2str(bvalue *v) case BE_MAP: return "map"; case BE_INSTANCE: return "instance"; case BE_MODULE: return "module"; - case BE_INDEX: return "index"; + case BE_INDEX: return "var"; default: return "invalid type"; } } diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 2c2928010..8f1b0f3e4 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -1255,7 +1255,7 @@ static void class_static_assignment_expr(bparser *parser, bexpdesc *e, bstring * static void classstatic_stmt(bparser *parser, bclass *c, bexpdesc *e) { bstring *name; - /* 'static' ID {',' ID} */ + /* 'static' ID ['=' expr] {',' ID ['=' expr] } */ scan_next_token(parser); /* skip 'static' */ if (match_id(parser, name) != NULL) { check_class_attr(parser, c, name); diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index 2a8880cdb..f549604e0 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -43,10 +43,10 @@ static void m_solidify_bvalue(bvm *vm, bvalue * value) logfmt("be_const_bool(%i)", var_tobool(value)); break; case BE_INT: - logfmt("be_const_int(%lli)", var_toint(value)); + logfmt("be_const_int(%i)", var_toint(value)); break; case BE_INDEX: - logfmt("be_const_index(%lli)", var_toint(value)); + logfmt("be_const_index(%i)", var_toint(value)); break; case BE_REAL: #if BE_USE_SINGLE_FLOAT diff --git a/tasmota/berry/lvgl_examples/drawing_1.be b/tasmota/berry/lvgl_examples/drawing_1.be new file mode 100644 index 000000000..ccefbc731 --- /dev/null +++ b/tasmota/berry/lvgl_examples/drawing_1.be @@ -0,0 +1,67 @@ +#- LVGL Examples + - + - drawing example #1 from https://docs.lvgl.io/latest/en/html/overview/drawing.html +--# +lv.start() + +lv.scr_act().set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0xFF3333)) + +om = lv_objmask(lv.scr_act()) +om.set_size(200, 200) +om.align(0, lv.ALIGN_CENTER, 0, 0) +label = lv_label(om) +label.set_long_mode(lv.LABEL_LONG_BREAK) +label.set_align(lv.LABEL_ALIGN_CENTER) +label.set_width(180) +label.set_text("This label will be masked out. See how it works.") +label.align(0, lv.ALIGN_IN_TOP_MID, 0, 20) + +cont = lv_cont(om) +cont.set_size(180, 100) +cont.set_drag(true) +cont.align(0, lv.ALIGN_IN_BOTTOM_MID, 0, -10) + +btn = lv_btn(cont) +btn.align(0, lv.ALIGN_CENTER, 0, 0) +btn.set_style_local_value_str(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, "Button") + +lv.refr_now() +tasmota.delay(1000) + +a=lv_area() +r1 = lv_draw_mask_radius_param() + +a.x1 = 10 +a.y1 = 10 +a.x2 = 190 +a.y2 = 190 +lv.draw_mask_radius_init(r1, a, lv.RADIUS_CIRCLE, false) +om.add_mask(r1) + +lv.refr_now() +tasmota.delay(1000) + +a.x1 = 100 +a.y1 = 100 +a.x2 = 150 +a.y2 = 150 +lv.draw_mask_radius_init(r1, a, lv.RADIUS_CIRCLE, true) +om.add_mask(r1) + +lv.refr_now() +tasmota.delay(1000) + +l1 = lv_draw_mask_line_param() +lv.draw_mask_line_points_init(l1, 0, 0, 100, 200, lv.DRAW_MASK_LINE_SIDE_TOP) +om.add_mask(l1) + +lv.refr_now() +tasmota.delay(1000) + +f1= lv_draw_mask_fade_param() +a.x1 = 100 +a.y1 = 0 +a.x2 = 200 +a.y2 = 200 +lv.draw_mask_fade_init(f1, a, lv.OPA_TRANSP, 0, lv.OPA_COVER, 150) +om.add_mask(f1) \ No newline at end of file diff --git a/tasmota/berry/lvgl_examples/drawing_2.be b/tasmota/berry/lvgl_examples/drawing_2.be new file mode 100644 index 000000000..8903b389d --- /dev/null +++ b/tasmota/berry/lvgl_examples/drawing_2.be @@ -0,0 +1,58 @@ +#- LVGL Examples + - + - drawing example #2 from https://docs.lvgl.io/latest/en/html/overview/drawing.html +--# +lv.start() + +lv.scr_act().set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0xAAAAAA)) + +MASK_WIDTH=100 +MASK_HEIGHT=50 + +# Create the mask of a text by drawing it to a canvas +mask_map = bytes() +mask_map.resize(MASK_WIDTH * MASK_HEIGHT * 4) + +# Create a "8 bit alpha" canvas and clear it +canvas = lv_canvas(lv.scr_act()) +canvas.set_buffer(mask_map, MASK_WIDTH, MASK_HEIGHT, lv.IMG_CF_ALPHA_8BIT) +canvas.fill_bg(lv_color(lv.BLACK), lv.OPA_TRANSP) +canvas.fill_bg(lv_color(lv.BLACK), lv.OPA_50) + +# Draw a label to the canvas. The result "image" will be used as mask +label_dsc = lv_draw_label_dsc() +lv.draw_label_dsc_init(label_dsc) +label_dsc.color = lv_color(lv.WHITE) +canvas.draw_text(5, 5, MASK_WIDTH, label_dsc, "Text with gradient", lv.LABEL_ALIGN_CENTER) + +# The mask is read, the canvas is not required anymore +canvas.del() + +# Create an object mask which will use the created mask +om = lv_objmask(lv.scr_act()) +om.set_size(MASK_WIDTH, MASK_HEIGHT) +om.align(0, lv.ALIGN_CENTER, 0, 0) + +# Add the created mask map to the object mask +m = lv_draw_mask_map_param() +a = lv_area() +a.x1 = 0 +a.y1 = 0 +a.x2 = MASK_WIDTH - 1 +a.y2 = MASK_HEIGHT - 1 +lv.draw_mask_map_init(m, a, mask_map) +om.add_mask(m) + +# Create a style with gradient +style_bg = lv_style() +style_bg.set_bg_opa(lv.STATE_DEFAULT, lv.OPA_COVER) +style_bg.set_bg_color(lv.STATE_DEFAULT, lv_color(lv.RED)) +style_bg.set_bg_grad_color(lv.STATE_DEFAULT, lv_color(lv.BLUE)) +style_bg.set_bg_grad_dir(lv.STATE_DEFAULT, lv.GRAD_DIR_HOR) + +# Create and object with the gradient style on the object mask. +# The text will be masked from the gradient +bg = lv_obj(om) +bg.reset_style_list(lv.OBJ_PART_MAIN) +bg.add_style(lv.OBJ_PART_MAIN, style_bg) +bg.set_size(MASK_WIDTH, MASK_HEIGHT) diff --git a/tasmota/berry/lvgl_examples/signal_bars.be b/tasmota/berry/lvgl_examples/signal_bars.be new file mode 100644 index 000000000..4d4a058d2 --- /dev/null +++ b/tasmota/berry/lvgl_examples/signal_bars.be @@ -0,0 +1,65 @@ +#- LVGL Examples + - + - drawing example #1 from https://docs.lvgl.io/latest/en/html/overview/drawing.html +--# + +lv.start() + +def max(a,b) if a > b return a else return b end end + +class lv_signal_bars : lv_obj + var ancestor_design # previous design_cb + var percentage + + def init(parent, copy) + # init parent object + super(self, lv_obj).init(parent, copy) + # keep a copy of + self.ancestor_design = self.get_design_cb() + self.set_design_cb(self.my_design_cb) + # own values + self.percentage = 100 + # set default style + self.set_style_local_bg_opa(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv.OPA_TRANSP) + end + + def my_design_cb(area, mode) + # the model is that we have 4 bars and inter-bar (1/4 of width) + var height = self.get_height() + var width = self.get_width() + + var inter_bar = max(width / 15, 1) + var bar = max((width - inter_bar * 3) / 4, 1) + var bar_offset = bar / 2 + + if mode == lv.DESIGN_COVER_CHK + #- Return false if the object is not covers the clip_area area -# + return self.ancestor_design.call(self, area, mode) + + elif mode == lv.DESIGN_DRAW_MAIN + self.ancestor_design.call(self, area, mode) + var line_dsc = lv_draw_line_dsc() + lv.draw_line_dsc_init(line_dsc) + + line_dsc.round_start = 1 + line_dsc.round_end = 1 + line_dsc.width = bar + line_dsc.color = 0xF0F + var p1 = lv_point() + var p2 = lv_point() + + for i:0..3 + p1.y = height - 1 - bar_offset + p1.x = i * (bar + inter_bar) + bar_offset + p2.y = ((3 - i) * (height - bar)) / 4 + bar_offset + p2.x = p1.x + lv.draw_line(p1, p2, area, line_dsc) + end + #elif mode == lv.DESIGN_DRAW_POST # we don't want a frame around this object + #self.ancestor_design.call(self, area, mode) + end + return lv.DESIGN_RES_OK + end +end + +bars = lv_signal_bars(lv.scr_act()) diff --git a/tasmota/berry/modules/partition.be b/tasmota/berry/modules/partition.be index 818c4aa4e..364ad636d 100644 --- a/tasmota/berry/modules/partition.be +++ b/tasmota/berry/modules/partition.be @@ -160,6 +160,7 @@ class Partition_info end def tostring() + import string var type_s = "" var subtype_s = "" if self.type == 0 type_s = "app" diff --git a/tasmota/lvgl_berry/be_lv_c_mapping.h b/tasmota/lvgl_berry/be_lv_c_mapping.h index 2ffb0a49d..fe07625bf 100644 --- a/tasmota/lvgl_berry/be_lv_c_mapping.h +++ b/tasmota/lvgl_berry/be_lv_c_mapping.h @@ -13,15 +13,15 @@ extern "C" { #if BE_LV_WIDGET_IMG const lvbe_call_c_t lv_img_func[] = { { "buf_free", (void*) &lv_img_buf_free, "", "(lv_img_dsc)" }, - { "buf_get_img_size", (void*) &lv_img_buf_get_img_size, "i", "ii(lv_img_cf)" }, + { "buf_get_img_size", (void*) &lv_img_buf_get_img_size, "i", "iii" }, { "buf_get_px_alpha", (void*) &lv_img_buf_get_px_alpha, "i", "(lv_img_dsc)ii" }, { "buf_get_px_color", (void*) &lv_img_buf_get_px_color, "lv_color", "(lv_img_dsc)ii(lv_color)" }, { "buf_set_palette", (void*) &lv_img_buf_set_palette, "", "(lv_img_dsc)i(lv_color)" }, { "buf_set_px_alpha", (void*) &lv_img_buf_set_px_alpha, "", "(lv_img_dsc)iii" }, { "buf_set_px_color", (void*) &lv_img_buf_set_px_color, "", "(lv_img_dsc)ii(lv_color)" }, - { "cf_get_px_size", (void*) &lv_img_cf_get_px_size, "i", "(lv_img_cf)" }, - { "cf_has_alpha", (void*) &lv_img_cf_has_alpha, "b", "(lv_img_cf)" }, - { "cf_is_chroma_keyed", (void*) &lv_img_cf_is_chroma_keyed, "b", "(lv_img_cf)" }, + { "cf_get_px_size", (void*) &lv_img_cf_get_px_size, "i", "i" }, + { "cf_has_alpha", (void*) &lv_img_cf_has_alpha, "b", "i" }, + { "cf_is_chroma_keyed", (void*) &lv_img_cf_is_chroma_keyed, "b", "i" }, { "create", (void*) &lv_img_create, "+lv_img", "(lv_obj)(lv_obj)" }, { "get_angle", (void*) &lv_img_get_angle, "i", "(lv_obj)" }, { "get_antialias", (void*) &lv_img_get_antialias, "b", "(lv_obj)" }, @@ -612,7 +612,7 @@ const lvbe_call_c_t lv_canvas_func[] = { { "draw_text", (void*) &lv_canvas_draw_text, "", "(lv_obj)iii(lv_draw_label_dsc)si" }, { "fill_bg", (void*) &lv_canvas_fill_bg, "", "(lv_obj)(lv_color)i" }, { "get_px", (void*) &lv_canvas_get_px, "lv_color", "(lv_obj)ii" }, - { "set_buffer", (void*) &lv_canvas_set_buffer, "", "(lv_obj).ii(lv_img_cf)" }, + { "set_buffer", (void*) &lv_canvas_set_buffer, "", "(lv_obj).iii" }, { "set_palette", (void*) &lv_canvas_set_palette, "", "(lv_obj)i(lv_color)" }, { "set_px", (void*) &lv_canvas_set_px, "", "(lv_obj)ii(lv_color)" }, { "transform", (void*) &lv_canvas_transform, "", "(lv_obj)(lv_img_dsc)iiiiiib" }, @@ -927,9 +927,10 @@ const lvbe_call_c_t lv_msgbox_func[] = { /* `lv_objmask` methods */ #if BE_LV_WIDGET_OBJMASK const lvbe_call_c_t lv_objmask_func[] = { + { "add_mask", (void*) &lv_objmask_add_mask, ".", "(lv_obj)." }, { "create", (void*) &lv_objmask_create, "+lv_objmask", "(lv_obj)(lv_obj)" }, - { "remove_mask", (void*) &lv_objmask_remove_mask, "", "(lv_obj)(lv_objmask_mask)" }, - { "update_mask", (void*) &lv_objmask_update_mask, "", "(lv_obj)(lv_objmask_mask)." }, + { "remove_mask", (void*) &lv_objmask_remove_mask, "", "(lv_obj)." }, + { "update_mask", (void*) &lv_objmask_update_mask, "", "(lv_obj).." }, }; #endif // BE_LV_WIDGET_OBJMASK diff --git a/tasmota/xdrv_52_2_berry_native.ino b/tasmota/xdrv_52_2_berry_native.ino index 2f07aacca..e900ce6ac 100644 --- a/tasmota/xdrv_52_2_berry_native.ino +++ b/tasmota/xdrv_52_2_berry_native.ino @@ -209,6 +209,7 @@ extern "C" { extern "C" { typedef int32_t (*berry_callback_t)(int32_t v0, int32_t v1, int32_t v2, int32_t v3); + extern void BerryDumpErrorAndClear(bvm *vm, bool berry_console); int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, int32_t v3) { // call berry cb dispatcher @@ -227,7 +228,11 @@ extern "C" { be_pushint(berry.vm, v2); be_pushint(berry.vm, v3); - be_pcall(berry.vm, 6); // 5 arguments + ret = be_pcall(berry.vm, 6); // 5 arguments + if (ret != 0) { + BerryDumpErrorAndClear(berry.vm, false); // log in Tasmota console only + return 0; + } be_pop(berry.vm, 6); if (be_isint(berry.vm, -1) || be_isnil(berry.vm, -1)) { // sanity check @@ -381,8 +386,12 @@ int32_t lvbe_callback_x(uint32_t n, struct _lv_obj_t * obj, int32_t v1, int32_t be_pushint(berry.vm, v2); be_pushint(berry.vm, v3); be_pushint(berry.vm, v4); - be_pcall(berry.vm, 6); - int32_t ret = be_toint(berry.vm, -7); + int32_t ret = be_pcall(berry.vm, 6); + if (ret != 0) { + BerryDumpErrorAndClear(berry.vm, false); // log in Tasmota console only + return 0; + } + ret = be_toint(berry.vm, -7); be_pop(berry.vm, 7); // berry_log_P(">>>: Callback called out %d ret=%i", n, ret); return ret; diff --git a/tasmota/xdrv_52_3_berry_lvgl.ino b/tasmota/xdrv_52_3_berry_lvgl.ino index 85e66aaba..d7fe05485 100644 --- a/tasmota/xdrv_52_3_berry_lvgl.ino +++ b/tasmota/xdrv_52_3_berry_lvgl.ino @@ -226,8 +226,8 @@ extern void lv_ex_get_started_1(void); // - a callback, only 6 callbacks supported 0..5 // - '&1' callback 1 // -void be_check_arg_type(bvm *vm, int32_t argc, const char * arg_type, int32_t p[5]); -void be_check_arg_type(bvm *vm, int32_t argc, const char * arg_type, int32_t p[5]) { +void be_check_arg_type(bvm *vm, int32_t argc, const char * arg_type, int32_t p[8]); +void be_check_arg_type(bvm *vm, int32_t argc, const char * arg_type, int32_t p[8]) { bool arg_type_check = (arg_type != nullptr); // is type checking activated int32_t arg_idx = 0; // position in arg_type string char type_short_name[32]; @@ -278,7 +278,8 @@ void be_check_arg_type(bvm *vm, int32_t argc, const char * arg_type, int32_t p[5 } } -typedef int32_t (*fn_any_callable)(int32_t p0, int32_t p1, int32_t p2, int32_t p3, int32_t p4); +typedef int32_t (*fn_any_callable)(int32_t p0, int32_t p1, int32_t p2, int32_t p3, + int32_t p4, int32_t p5, int32_t p6, int32_t p7); extern "C" { void lv_init_set_member(bvm *vm, int index, void * ptr); @@ -303,7 +304,7 @@ extern "C" { if ((int32_t)obj2 == -1) { // special semantics if second ptr is -1, then just encapsulate obj = obj1; } else { // otherwise call the LVGL creator - obj = (lv_obj_t*) (*f)((int32_t)obj1, (int32_t)obj2, 0, 0, 0); + obj = (lv_obj_t*) (*f)((int32_t)obj1, (int32_t)obj2, 0, 0, 0, 0, 0, 0); } lv_init_set_member(vm, 1, obj); be_return_nil(vm); @@ -379,7 +380,7 @@ extern "C" { } int be_call_c_func(bvm *vm, void * func, const char * return_type, const char * arg_type) { - int32_t p[5] = {0,0,0,0,0}; + int32_t p[8] = {0,0,0,0,0,0,0,0}; int32_t argc = be_top(vm); // Get the number of arguments // check if we call a constructor @@ -391,7 +392,7 @@ extern "C" { fn_any_callable f = (fn_any_callable) func; be_check_arg_type(vm, argc, arg_type, p); // berry_log_C(">> be_call_c_func(%p) - %p,%p,%p,%p,%p - %s", f, p[0], p[1], p[2], p[3], p[4], return_type ? return_type : "NULL"); - int32_t ret = (*f)(p[0], p[1], p[2], p[3], p[4]); + int32_t ret = (*f)(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); // AddLog(LOG_LEVEL_INFO, ">> be_call_c_func, ret = %p", ret); if ((return_type == nullptr) || (strlen(return_type) == 0)) { be_return_nil(vm); } // does not return else if (strlen(return_type) == 1) { diff --git a/tools/lv_berry/convert.py b/tools/lv_berry/convert.py index 8b35f32ad..62e022ac4 100644 --- a/tools/lv_berry/convert.py +++ b/tools/lv_berry/convert.py @@ -39,6 +39,8 @@ return_types = { "const char *": "s", "lv_obj_user_data_t": "i", + "lv_objmask_mask_t *": ".", + "lv_coord_t": "i", "lv_res_t": "i", "lv_style_int_t": "i", @@ -78,6 +80,8 @@ return_types = { "lv_indev_type_t": "i", "lv_event_t": "i", "lv_signal_t": "i", + "lv_img_cf_t": "i", + "lv_draw_mask_line_side_t": "i", # "lv_signal_cb_t": "c", # "lv_design_cb_t": "c", diff --git a/tools/lv_berry/lv_module.h b/tools/lv_berry/lv_module.h index fa4fb8b7f..8874892ec 100644 --- a/tools/lv_berry/lv_module.h +++ b/tools/lv_berry/lv_module.h @@ -18,6 +18,7 @@ NAVY=0x000080 MAGENTA=0xFF00FF PURPLE=0x800080 +LV_RADIUS_CIRCLE=0x7FFF // LV_SCR_LOAD_ANIM_NONE LV_SCR_LOAD_ANIM_OVER_LEFT @@ -633,3 +634,36 @@ LV_DRAW_MASK_LINE_SIDE_LEFT LV_DRAW_MASK_LINE_SIDE_RIGHT LV_DRAW_MASK_LINE_SIDE_TOP LV_DRAW_MASK_LINE_SIDE_BOTTOM + +// LV IMG + +LV_IMG_CF_UNKNOWN + +LV_IMG_CF_RAW +LV_IMG_CF_RAW_ALPHA +LV_IMG_CF_RAW_CHROMA_KEYED + +LV_IMG_CF_TRUE_COLOR +LV_IMG_CF_TRUE_COLOR_ALPHA +LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED + +LV_IMG_CF_INDEXED_1BIT +LV_IMG_CF_INDEXED_2BIT +LV_IMG_CF_INDEXED_4BIT +LV_IMG_CF_INDEXED_8BIT + +LV_IMG_CF_ALPHA_1BIT +LV_IMG_CF_ALPHA_2BIT +LV_IMG_CF_ALPHA_4BIT +LV_IMG_CF_ALPHA_8BIT + +// Design modes + +LV_DESIGN_DRAW_MAIN +LV_DESIGN_DRAW_POST +LV_DESIGN_COVER_CHK + +LV_DESIGN_RES_OK +LV_DESIGN_RES_COVER +LV_DESIGN_RES_NOT_COVER +LV_DESIGN_RES_MASKED diff --git a/tools/lv_berry/lv_widgets.h b/tools/lv_berry/lv_widgets.h index 3e709a6ef..4ec2a10ec 100644 --- a/tools/lv_berry/lv_widgets.h +++ b/tools/lv_berry/lv_widgets.h @@ -1241,3 +1241,9 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); // void lv_img_cache_set_size(uint16_t new_slot_num); // void lv_img_cache_invalidate_src(const void * src); + +// ====================================================================== +// Artificial +// ====================================================================== + +void lv_refr_now(void); From 200b34a2082da268f9764f35ed361a18afbc0590 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 21 Jul 2021 23:37:03 +0200 Subject: [PATCH 028/148] Change Berry stack buffer to 20 --- lib/libesp32/Berry/default/berry_conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/Berry/default/berry_conf.h b/lib/libesp32/Berry/default/berry_conf.h index e39a7fbd2..c50cc281a 100644 --- a/lib/libesp32/Berry/default/berry_conf.h +++ b/lib/libesp32/Berry/default/berry_conf.h @@ -83,7 +83,7 @@ * expanded if the number of free is less than BE_STACK_FREE_MIN. * Default: 10 **/ -#define BE_STACK_FREE_MIN 25 +#define BE_STACK_FREE_MIN 20 /* Macro: BE_STACK_FREE_MIN * The short string will hold the hash value when the value is From 3d37712b2741004c51677d31d66697cbd81c2c3b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 22 Jul 2021 15:14:58 +0200 Subject: [PATCH 029/148] Change message ``Upload buffer miscompare`` into ``Not enough space`` --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xdrv_01_webserver.ino | 12 +++++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cda24d857..11c1dd36e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - ESP32 core library from v1.0.7.1 to v1.0.7.3 - Disable PSRAM on unsupported hardware - Replace spaces by hyphens in final hostname (#12710) +- Message ``Upload buffer miscompare`` into ``Not enough space`` ### Fixed - Discovery fails when using ``%hostname%`` in a topic (#12710) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index af4b7db84..4bbffb3b6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,6 +116,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Changed - ESP32 core library from v1.0.6 to v1.0.7.3 - IRremoteESP8266 library from v2.7.18 to v2.7.19 +- Message ``Upload buffer miscompare`` into ``Not enough space`` - ESP32 Ethernet Phy Type information to IDF v3+ - Speed up initial GUI console refresh - Enable UFILESYS, GUI_TRASH_FILE and GUI_EDIT_FILE for any device compiled with more than 1M flash size diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 2705db6ab..c25c62f33 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -390,7 +390,8 @@ const char kLoggingLevels[] PROGMEM = D_NONE "|" D_ERROR "|" D_INFO "|" D_DEBUG const char kEmulationOptions[] PROGMEM = D_NONE "|" D_BELKIN_WEMO "|" D_HUE_BRIDGE; const char kUploadErrors[] PROGMEM = - D_UPLOAD_ERR_1 "|" D_UPLOAD_ERR_2 "|" D_UPLOAD_ERR_3 "|" D_UPLOAD_ERR_4 "|" D_UPLOAD_ERR_5 "|" D_UPLOAD_ERR_6 "|" D_UPLOAD_ERR_7 "|" D_UPLOAD_ERR_8 "|" D_UPLOAD_ERR_9; +// D_UPLOAD_ERR_1 "|" D_UPLOAD_ERR_2 "|" D_UPLOAD_ERR_3 "|" D_UPLOAD_ERR_4 "|" D_UPLOAD_ERR_5 "|" D_UPLOAD_ERR_6 "|" D_UPLOAD_ERR_7 "|" D_UPLOAD_ERR_8 "|" D_UPLOAD_ERR_9; + D_UPLOAD_ERR_1 "|" D_UPLOAD_ERR_2 "|" D_UPLOAD_ERR_3 "|" D_UPLOAD_ERR_4 "| |" D_UPLOAD_ERR_6 "|" D_UPLOAD_ERR_7 "|" D_UPLOAD_ERR_8 "|" D_UPLOAD_ERR_9; const uint16_t DNS_PORT = 53; enum HttpOptions {HTTP_OFF, HTTP_USER, HTTP_ADMIN, HTTP_MANAGER, HTTP_MANAGER_RESET_ONLY}; @@ -1830,8 +1831,8 @@ void HandleWifiConfiguration(void) { if ( WIFI_TEST_FINISHED == Web.wifiTest ) { Web.wifiTest = WIFI_NOT_TESTING; - if (Web.wifi_test_AP_TIMEOUT) { - WebRestart(1); // Save credentials and Force Restart in STA only mode (11n-only routers) + if (Web.wifi_test_AP_TIMEOUT) { + WebRestart(1); // Save credentials and Force Restart in STA only mode (11n-only routers) } else { #if (RESTART_AFTER_INITIAL_WIFI_CONFIG) WebRestart(3); @@ -2722,7 +2723,8 @@ void HandleUploadLoop(void) { } #endif // USE_WEB_FW_UPGRADE else if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { - Web.upload_error = 5; // Upload buffer miscompare +// Web.upload_error = 5; // Upload buffer miscompare + Web.upload_error = 2; // Not enough space return; } if (upload.totalSize && !(upload.totalSize % 102400)) { @@ -3329,7 +3331,7 @@ bool Xdrv01(uint8_t function) // // If it fails again, depending on the WIFICONFIG settings, the user will need to wait or will need to // push 6 times the button to enable Tasmota AP mode again. - if (Web.wifi_test_AP_TIMEOUT) { + if (Web.wifi_test_AP_TIMEOUT) { Web.wifiTest = WIFI_TEST_FINISHED; AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CMND_SSID "1 %s: " D_ATTEMPTING_CONNECTION), SettingsText(SET_STASSID1) ); if (MAX_WIFI_OPTION != Web.old_wificonfig) { From 6cd3e37ed588d3c1341358200b555b4355468224 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 22 Jul 2021 20:21:18 +0200 Subject: [PATCH 030/148] Berry LVGL improvements to allow custom widgets --- lib/libesp32/Berry/default/be_i2c_driverlib.c | 667 +++++++++--------- .../Berry/default/be_lv_lvgl_module.c | 2 + .../Berry/default/be_lvgl_color_lib.c | 3 + lib/libesp32/Berry/default/be_lvgl_ctypes.c | 45 +- .../default/be_lvgl_ctypes_definitions.c | 451 ++++++------ .../Berry/default/be_lvgl_signal_bars_lib.c | 369 ++++++++++ lib/libesp32/Berry/default/be_modtab.c | 4 + lib/libesp32/Berry/default/be_tasmotalib.c | 288 ++++---- lib/libesp32/Berry/generate/be_const_strtab.h | 1 + .../Berry/generate/be_const_strtab_def.h | 5 +- .../generate/be_fixed_be_class_lv_color.h | 5 +- lib/libesp32/Berry/src/be_solidifylib.c | 13 +- lib/libesp32/Berry/src/berry.h | 13 +- tasmota/berry/lvgl_examples/lvgl_demo.be | 159 +++++ tasmota/berry/lvgl_examples/signal_bars.be | 73 +- tasmota/berry/modules/ctypes.be | 209 +++--- tasmota/berry/modules/lvgl_ctypes.be | 2 +- tasmota/xdrv_52_3_berry_lvgl.ino | 26 +- tools/lv_berry/lv_widgets.h | 2 + 19 files changed, 1450 insertions(+), 887 deletions(-) create mode 100644 lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c create mode 100644 tasmota/berry/lvgl_examples/lvgl_demo.be diff --git a/lib/libesp32/Berry/default/be_i2c_driverlib.c b/lib/libesp32/Berry/default/be_i2c_driverlib.c index 2f9faf038..3b44bc6df 100644 --- a/lib/libesp32/Berry/default/be_i2c_driverlib.c +++ b/lib/libesp32/Berry/default/be_i2c_driverlib.c @@ -14,379 +14,370 @@ extern bclass* be_class_tasmota_driver; // Parent class /******************************************************************** ** Solidified function: init ********************************************************************/ - -/********** Solidified proto: init */ -be_define_local_const_str(init_str_name, "init", 380752755, 4); -be_define_local_const_str(init_str_source, "input", -103256197, 5); -be_define_local_const_str(init_str_0, "get_tasmota", 334356779, 11); -be_define_local_const_str(init_str_1, "i2c_enabled", 218388101, 11); -be_define_local_const_str(init_str_2, "addr", 1087856498, 4); -be_define_local_const_str(init_str_3, "wire", -212213352, 4); -be_define_local_const_str(init_str_4, "wire_scan", -1623691416, 9); -be_define_local_const_str(init_str_5, "function", -1630125495, 8); -be_define_local_const_str(init_str_6, "name", -1925595674, 4); -be_define_local_const_str(init_str_7, "I2C:", 813483371, 4); -be_define_local_const_str(init_str_8, "detected on bus", 1432002650, 15); -be_define_local_const_str(init_str_9, "bus", 1607822841, 3); - -static const bvalue init_ktab[10] = { - { { .s=be_local_const_str(init_str_0) }, BE_STRING}, - { { .s=be_local_const_str(init_str_1) }, BE_STRING}, - { { .s=be_local_const_str(init_str_2) }, BE_STRING}, - { { .s=be_local_const_str(init_str_3) }, BE_STRING}, - { { .s=be_local_const_str(init_str_4) }, BE_STRING}, - { { .s=be_local_const_str(init_str_5) }, BE_STRING}, - { { .s=be_local_const_str(init_str_6) }, BE_STRING}, - { { .s=be_local_const_str(init_str_7) }, BE_STRING}, - { { .s=be_local_const_str(init_str_8) }, BE_STRING}, - { { .s=be_local_const_str(init_str_9) }, BE_STRING}, -}; - -static const uint32_t init_code[44] = { - 0x8C100100, // 0000 GETMET R4 R0 R256 - 0x7C100200, // 0001 CALL R4 1 - 0x4C140000, // 0002 LDNIL 5 - 0x20140605, // 0003 NE R5 R3 R5 - 0x78160004, // 0004 JMPF R5 #000A - 0x8C140901, // 0005 GETMET R5 R4 R257 - 0x5C1C0600, // 0006 MOVE R7 R3 - 0x7C140400, // 0007 CALL R5 2 - 0x74160000, // 0008 JMPT R5 #000A - 0x80000A00, // 0009 RET 0 R5 - 0x90020402, // 000A SETMBR R0 R258 R2 - 0x8C140904, // 000B GETMET R5 R4 R260 - 0x881C0102, // 000C GETMBR R7 R0 R258 - 0x7C140400, // 000D CALL R5 2 - 0x90020605, // 000E SETMBR R0 R259 R5 - 0x88140103, // 000F GETMBR R5 R0 R259 - 0x78160019, // 0010 JMPF R5 #002B - 0x60140015, // 0011 GETGBL R5 G21 - 0x5C180200, // 0012 MOVE R6 R1 - 0x7C140200, // 0013 CALL R5 1 - 0x1C140B05, // 0014 EQ R5 R5 R261 - 0x78160004, // 0015 JMPF R5 #001B - 0x5C140200, // 0016 MOVE R5 R1 - 0x5C180000, // 0017 MOVE R6 R0 - 0x7C140200, // 0018 CALL R5 1 - 0x90020C05, // 0019 SETMBR R0 R262 R5 - 0x70020000, // 001A JMP #001C - 0x90020C01, // 001B SETMBR R0 R262 R1 - 0x88140106, // 001C GETMBR R5 R0 R262 - 0x4C180000, // 001D LDNIL 6 - 0x1C140A06, // 001E EQ R5 R5 R6 - 0x78160001, // 001F JMPF R5 #0022 - 0x4C140000, // 0020 LDNIL 5 - 0x90020605, // 0021 SETMBR R0 R259 R5 - 0x88140103, // 0022 GETMBR R5 R0 R259 - 0x78160006, // 0023 JMPF R5 #002B - 0x6014000F, // 0024 GETGBL R5 G15 - 0x58180007, // 0025 LDCONST R6 K7 - 0x881C0106, // 0026 GETMBR R7 R0 R262 - 0x58200008, // 0027 LDCONST R8 K8 - 0x88240103, // 0028 GETMBR R9 R0 R259 - 0x88241309, // 0029 GETMBR R9 R9 R265 - 0x7C140800, // 002A CALL R5 4 - 0x80000000, // 002B RET 0 R0 -}; - -be_define_local_proto(init, 10, 4, 1, 0, 0); -be_define_local_closure(init); - +be_local_closure(init, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + be_nested_string("get_tasmota", 334356779, 11), + be_nested_string("i2c_enabled", 218388101, 11), + be_nested_string("addr", 1087856498, 4), + be_nested_string("wire", -212213352, 4), + be_nested_string("wire_scan", -1623691416, 9), + be_nested_string("function", -1630125495, 8), + be_nested_string("name", -1925595674, 4), + be_nested_string("I2C:", 813483371, 4), + be_nested_string("detected on bus", 1432002650, 15), + be_nested_string("bus", 1607822841, 3), + }), + (be_nested_const_str("init", 380752755, 4)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[44]) { /* code */ + 0x8C100100, // 0000 GETMET R4 R0 R256 + 0x7C100200, // 0001 CALL R4 1 + 0x4C140000, // 0002 LDNIL 5 + 0x20140605, // 0003 NE R5 R3 R5 + 0x78160004, // 0004 JMPF R5 #000A + 0x8C140901, // 0005 GETMET R5 R4 R257 + 0x5C1C0600, // 0006 MOVE R7 R3 + 0x7C140400, // 0007 CALL R5 2 + 0x74160000, // 0008 JMPT R5 #000A + 0x80000A00, // 0009 RET 0 R5 + 0x90020402, // 000A SETMBR R0 R258 R2 + 0x8C140904, // 000B GETMET R5 R4 R260 + 0x881C0102, // 000C GETMBR R7 R0 R258 + 0x7C140400, // 000D CALL R5 2 + 0x90020605, // 000E SETMBR R0 R259 R5 + 0x88140103, // 000F GETMBR R5 R0 R259 + 0x78160019, // 0010 JMPF R5 #002B + 0x60140015, // 0011 GETGBL R5 G21 + 0x5C180200, // 0012 MOVE R6 R1 + 0x7C140200, // 0013 CALL R5 1 + 0x1C140B05, // 0014 EQ R5 R5 R261 + 0x78160004, // 0015 JMPF R5 #001B + 0x5C140200, // 0016 MOVE R5 R1 + 0x5C180000, // 0017 MOVE R6 R0 + 0x7C140200, // 0018 CALL R5 1 + 0x90020C05, // 0019 SETMBR R0 R262 R5 + 0x70020000, // 001A JMP #001C + 0x90020C01, // 001B SETMBR R0 R262 R1 + 0x88140106, // 001C GETMBR R5 R0 R262 + 0x4C180000, // 001D LDNIL 6 + 0x1C140A06, // 001E EQ R5 R5 R6 + 0x78160001, // 001F JMPF R5 #0022 + 0x4C140000, // 0020 LDNIL 5 + 0x90020605, // 0021 SETMBR R0 R259 R5 + 0x88140103, // 0022 GETMBR R5 R0 R259 + 0x78160006, // 0023 JMPF R5 #002B + 0x6014000F, // 0024 GETGBL R5 G15 + 0x58180007, // 0025 LDCONST R6 K7 + 0x881C0106, // 0026 GETMBR R7 R0 R262 + 0x58200008, // 0027 LDCONST R8 K8 + 0x88240103, // 0028 GETMBR R9 R0 R259 + 0x88241309, // 0029 GETMBR R9 R9 R265 + 0x7C140800, // 002A CALL R5 4 + 0x80000000, // 002B RET 0 R0 + }) + ) +); /*******************************************************************/ /******************************************************************** ** Solidified function: write8 ********************************************************************/ - -/********** Solidified proto: write8 */ -be_define_local_const_str(write8_str_name, "write8", -1160975764, 6); -be_define_local_const_str(write8_str_source, "input", -103256197, 5); -be_define_local_const_str(write8_str_0, "wire", -212213352, 4); -be_define_local_const_str(write8_str_1, "write", -1104765092, 5); -be_define_local_const_str(write8_str_2, "addr", 1087856498, 4); - -static const bvalue write8_ktab[4] = { - { { .s=be_local_const_str(write8_str_0) }, BE_STRING}, - { { .s=be_local_const_str(write8_str_1) }, BE_STRING}, - { { .s=be_local_const_str(write8_str_2) }, BE_STRING}, - { { .i=1 }, BE_INT}, -}; - -static const uint32_t write8_code[8] = { - 0x880C0100, // 0000 GETMBR R3 R0 R256 - 0x8C0C0701, // 0001 GETMET R3 R3 R257 - 0x88140102, // 0002 GETMBR R5 R0 R258 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x58200003, // 0005 LDCONST R8 K3 - 0x7C0C0A00, // 0006 CALL R3 5 - 0x80040600, // 0007 RET 1 R3 -}; - -be_define_local_proto(write8, 9, 3, 1, 0, 0); -be_define_local_closure(write8); - +be_local_closure(write8, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + be_nested_string("wire", -212213352, 4), + be_nested_string("write", -1104765092, 5), + be_nested_string("addr", 1087856498, 4), + be_const_int(1), + }), + (be_nested_const_str("write8", -1160975764, 6)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 8]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 R256 + 0x8C0C0701, // 0001 GETMET R3 R3 R257 + 0x88140102, // 0002 GETMBR R5 R0 R258 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x58200003, // 0005 LDCONST R8 K3 + 0x7C0C0A00, // 0006 CALL R3 5 + 0x80040600, // 0007 RET 1 R3 + }) + ) +); /*******************************************************************/ /******************************************************************** ** Solidified function: write_bit ********************************************************************/ - -/********** Solidified proto: write_bit */ -be_define_local_const_str(write_bit_str_name, "write_bit", -1633976860, 9); -be_define_local_const_str(write_bit_str_source, "input", -103256197, 5); -be_define_local_const_str(write_bit_str_2, "write8", -1160975764, 6); -be_define_local_const_str(write_bit_str_3, "read8", -1492179129, 5); - -static const bvalue write_bit_ktab[4] = { - { { .i=0 }, BE_INT}, - { { .i=1 }, BE_INT}, - { { .s=be_local_const_str(write_bit_str_2) }, BE_STRING}, - { { .s=be_local_const_str(write_bit_str_3) }, BE_STRING}, -}; - -static const uint32_t write_bit_code[26] = { - 0x14100500, // 0000 LT R4 R2 R256 - 0x74120002, // 0001 JMPT R4 #0005 - 0x54120006, // 0002 LDINT R4 7 - 0x24100404, // 0003 GT R4 R2 R4 - 0x78120000, // 0004 JMPF R4 #0006 - 0x80000800, // 0005 RET 0 R4 - 0x38120202, // 0006 SHL R4 R257 R2 - 0x780E0007, // 0007 JMPF R3 #0010 - 0x8C140102, // 0008 GETMET R5 R0 R258 - 0x5C1C0200, // 0009 MOVE R7 R1 - 0x8C200103, // 000A GETMET R8 R0 R259 - 0x5C280200, // 000B MOVE R10 R1 - 0x7C200400, // 000C CALL R8 2 - 0x30201004, // 000D OR R8 R8 R4 - 0x7C140600, // 000E CALL R5 3 - 0x70020008, // 000F JMP #0019 - 0x8C140102, // 0010 GETMET R5 R0 R258 - 0x5C1C0200, // 0011 MOVE R7 R1 - 0x8C200103, // 0012 GETMET R8 R0 R259 - 0x5C280200, // 0013 MOVE R10 R1 - 0x7C200400, // 0014 CALL R8 2 - 0x542600FE, // 0015 LDINT R9 255 - 0x4241204, // 0016 SUB R9 R9 R4 - 0x2C201009, // 0017 AND R8 R8 R9 - 0x7C140600, // 0018 CALL R5 3 - 0x80000000, // 0019 RET 0 R0 -}; - -be_define_local_proto(write_bit, 11, 4, 1, 0, 0); -be_define_local_closure(write_bit); - +be_local_closure(write_bit, /* name */ + be_nested_proto( + 11, /* nstack */ + 4, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + be_const_int(0), + be_const_int(1), + be_nested_string("write8", -1160975764, 6), + be_nested_string("read8", -1492179129, 5), + }), + (be_nested_const_str("write_bit", -1633976860, 9)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[26]) { /* code */ + 0x14100500, // 0000 LT R4 R2 R256 + 0x74120002, // 0001 JMPT R4 #0005 + 0x54120006, // 0002 LDINT R4 7 + 0x24100404, // 0003 GT R4 R2 R4 + 0x78120000, // 0004 JMPF R4 #0006 + 0x80000800, // 0005 RET 0 R4 + 0x38120202, // 0006 SHL R4 R257 R2 + 0x780E0007, // 0007 JMPF R3 #0010 + 0x8C140102, // 0008 GETMET R5 R0 R258 + 0x5C1C0200, // 0009 MOVE R7 R1 + 0x8C200103, // 000A GETMET R8 R0 R259 + 0x5C280200, // 000B MOVE R10 R1 + 0x7C200400, // 000C CALL R8 2 + 0x30201004, // 000D OR R8 R8 R4 + 0x7C140600, // 000E CALL R5 3 + 0x70020008, // 000F JMP #0019 + 0x8C140102, // 0010 GETMET R5 R0 R258 + 0x5C1C0200, // 0011 MOVE R7 R1 + 0x8C200103, // 0012 GETMET R8 R0 R259 + 0x5C280200, // 0013 MOVE R10 R1 + 0x7C200400, // 0014 CALL R8 2 + 0x542600FE, // 0015 LDINT R9 255 + 0x04241204, // 0016 SUB R9 R9 R4 + 0x2C201009, // 0017 AND R8 R8 R9 + 0x7C140600, // 0018 CALL R5 3 + 0x80000000, // 0019 RET 0 R0 + }) + ) +); /*******************************************************************/ - /******************************************************************** ** Solidified function: read8 ********************************************************************/ - -/********** Solidified proto: read8 */ -be_define_local_const_str(read8_str_name, "read8", -1492179129, 5); -be_define_local_const_str(read8_str_source, "input", -103256197, 5); -be_define_local_const_str(read8_str_0, "wire", -212213352, 4); -be_define_local_const_str(read8_str_1, "read", -824204347, 4); -be_define_local_const_str(read8_str_2, "addr", 1087856498, 4); - -static const bvalue read8_ktab[4] = { - { { .s=be_local_const_str(read8_str_0) }, BE_STRING}, - { { .s=be_local_const_str(read8_str_1) }, BE_STRING}, - { { .s=be_local_const_str(read8_str_2) }, BE_STRING}, - { { .i=1 }, BE_INT}, -}; - -static const uint32_t read8_code[7] = { - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x8C080501, // 0001 GETMET R2 R2 R257 - 0x88100102, // 0002 GETMBR R4 R0 R258 - 0x5C140200, // 0003 MOVE R5 R1 - 0x58180003, // 0004 LDCONST R6 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x80040400, // 0006 RET 1 R2 -}; - -be_define_local_proto(read8, 7, 2, 1, 0, 0); -be_define_local_closure(read8); - +be_local_closure(read8, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + be_nested_string("wire", -212213352, 4), + be_nested_string("read", -824204347, 4), + be_nested_string("addr", 1087856498, 4), + be_const_int(1), + }), + (be_nested_const_str("read8", -1492179129, 5)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x8C080501, // 0001 GETMET R2 R2 R257 + 0x88100102, // 0002 GETMBR R4 R0 R258 + 0x5C140200, // 0003 MOVE R5 R1 + 0x58180003, // 0004 LDCONST R6 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); /*******************************************************************/ /******************************************************************** ** Solidified function: read12 ********************************************************************/ - -/********** Solidified proto: read12 */ -be_define_local_const_str(read12_str_name, "read12", -3890326, 6); -be_define_local_const_str(read12_str_source, "input", -103256197, 5); -be_define_local_const_str(read12_str_0, "wire", -212213352, 4); -be_define_local_const_str(read12_str_1, "read_bytes", -718234123, 10); -be_define_local_const_str(read12_str_2, "addr", 1087856498, 4); - -static const bvalue read12_ktab[6] = { - { { .s=be_local_const_str(read12_str_0) }, BE_STRING}, - { { .s=be_local_const_str(read12_str_1) }, BE_STRING}, - { { .s=be_local_const_str(read12_str_2) }, BE_STRING}, - { { .i=2 }, BE_INT}, - { { .i=0 }, BE_INT}, - { { .i=1 }, BE_INT}, -}; - -static const uint32_t read12_code[12] = { - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x8C080501, // 0001 GETMET R2 R2 R257 - 0x88100102, // 0002 GETMBR R4 R0 R258 - 0x5C140200, // 0003 MOVE R5 R1 - 0x58180003, // 0004 LDCONST R6 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x940C0504, // 0006 GETIDX R3 R2 R260 - 0x54120003, // 0007 LDINT R4 4 - 0x380C0604, // 0008 SHL R3 R3 R4 - 0x94100505, // 0009 GETIDX R4 R2 R261 - 0xC0604, // 000A ADD R3 R3 R4 - 0x80040600, // 000B RET 1 R3 -}; - -be_define_local_proto(read12, 7, 2, 1, 0, 0); -be_define_local_closure(read12); - +be_local_closure(read12, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + be_nested_string("wire", -212213352, 4), + be_nested_string("read_bytes", -718234123, 10), + be_nested_string("addr", 1087856498, 4), + be_const_int(2), + be_const_int(0), + be_const_int(1), + }), + (be_nested_const_str("read12", -3890326, 6)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[12]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x8C080501, // 0001 GETMET R2 R2 R257 + 0x88100102, // 0002 GETMBR R4 R0 R258 + 0x5C140200, // 0003 MOVE R5 R1 + 0x58180003, // 0004 LDCONST R6 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x940C0504, // 0006 GETIDX R3 R2 R260 + 0x54120003, // 0007 LDINT R4 4 + 0x380C0604, // 0008 SHL R3 R3 R4 + 0x94100505, // 0009 GETIDX R4 R2 R261 + 0x000C0604, // 000A ADD R3 R3 R4 + 0x80040600, // 000B RET 1 R3 + }) + ) +); /*******************************************************************/ - /******************************************************************** ** Solidified function: read13 ********************************************************************/ - -/********** Solidified proto: read13 */ -be_define_local_const_str(read13_str_name, "read13", 12887293, 6); -be_define_local_const_str(read13_str_source, "input", -103256197, 5); -be_define_local_const_str(read13_str_0, "wire", -212213352, 4); -be_define_local_const_str(read13_str_1, "read_bytes", -718234123, 10); -be_define_local_const_str(read13_str_2, "addr", 1087856498, 4); - -static const bvalue read13_ktab[6] = { - { { .s=be_local_const_str(read13_str_0) }, BE_STRING}, - { { .s=be_local_const_str(read13_str_1) }, BE_STRING}, - { { .s=be_local_const_str(read13_str_2) }, BE_STRING}, - { { .i=2 }, BE_INT}, - { { .i=0 }, BE_INT}, - { { .i=1 }, BE_INT}, -}; - -static const uint32_t read13_code[12] = { - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x8C080501, // 0001 GETMET R2 R2 R257 - 0x88100102, // 0002 GETMBR R4 R0 R258 - 0x5C140200, // 0003 MOVE R5 R1 - 0x58180003, // 0004 LDCONST R6 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x940C0504, // 0006 GETIDX R3 R2 R260 - 0x54120004, // 0007 LDINT R4 5 - 0x380C0604, // 0008 SHL R3 R3 R4 - 0x94100505, // 0009 GETIDX R4 R2 R261 - 0xC0604, // 000A ADD R3 R3 R4 - 0x80040600, // 000B RET 1 R3 -}; - -be_define_local_proto(read13, 7, 2, 1, 0, 0); -be_define_local_closure(read13); - +be_local_closure(read13, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + be_nested_string("wire", -212213352, 4), + be_nested_string("read_bytes", -718234123, 10), + be_nested_string("addr", 1087856498, 4), + be_const_int(2), + be_const_int(0), + be_const_int(1), + }), + (be_nested_const_str("read13", 12887293, 6)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[12]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x8C080501, // 0001 GETMET R2 R2 R257 + 0x88100102, // 0002 GETMBR R4 R0 R258 + 0x5C140200, // 0003 MOVE R5 R1 + 0x58180003, // 0004 LDCONST R6 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x940C0504, // 0006 GETIDX R3 R2 R260 + 0x54120004, // 0007 LDINT R4 5 + 0x380C0604, // 0008 SHL R3 R3 R4 + 0x94100505, // 0009 GETIDX R4 R2 R261 + 0x000C0604, // 000A ADD R3 R3 R4 + 0x80040600, // 000B RET 1 R3 + }) + ) +); /*******************************************************************/ - /******************************************************************** ** Solidified function: read24 ********************************************************************/ - -/********** Solidified proto: read24 */ -be_define_local_const_str(read24_str_name, "read24", 1808533811, 6); -be_define_local_const_str(read24_str_source, "input", -103256197, 5); -be_define_local_const_str(read24_str_0, "wire", -212213352, 4); -be_define_local_const_str(read24_str_1, "read_bytes", -718234123, 10); -be_define_local_const_str(read24_str_2, "addr", 1087856498, 4); - -static const bvalue read24_ktab[7] = { - { { .s=be_local_const_str(read24_str_0) }, BE_STRING}, - { { .s=be_local_const_str(read24_str_1) }, BE_STRING}, - { { .s=be_local_const_str(read24_str_2) }, BE_STRING}, - { { .i=3 }, BE_INT}, - { { .i=0 }, BE_INT}, - { { .i=1 }, BE_INT}, - { { .i=2 }, BE_INT}, -}; - -static const uint32_t read24_code[16] = { - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x8C080501, // 0001 GETMET R2 R2 R257 - 0x88100102, // 0002 GETMBR R4 R0 R258 - 0x5C140200, // 0003 MOVE R5 R1 - 0x58180003, // 0004 LDCONST R6 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x940C0504, // 0006 GETIDX R3 R2 R260 - 0x5412000F, // 0007 LDINT R4 16 - 0x380C0604, // 0008 SHL R3 R3 R4 - 0x94100505, // 0009 GETIDX R4 R2 R261 - 0x54160007, // 000A LDINT R5 8 - 0x38100805, // 000B SHL R4 R4 R5 - 0xC0604, // 000C ADD R3 R3 R4 - 0x94100506, // 000D GETIDX R4 R2 R262 - 0xC0604, // 000E ADD R3 R3 R4 - 0x80040600, // 000F RET 1 R3 -}; - -be_define_local_proto(read24, 7, 2, 1, 0, 0); -be_define_local_closure(read24); - +be_local_closure(read24, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + be_nested_string("wire", -212213352, 4), + be_nested_string("read_bytes", -718234123, 10), + be_nested_string("addr", 1087856498, 4), + be_const_int(3), + be_const_int(0), + be_const_int(1), + be_const_int(2), + }), + (be_nested_const_str("read24", 1808533811, 6)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[16]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x8C080501, // 0001 GETMET R2 R2 R257 + 0x88100102, // 0002 GETMBR R4 R0 R258 + 0x5C140200, // 0003 MOVE R5 R1 + 0x58180003, // 0004 LDCONST R6 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x940C0504, // 0006 GETIDX R3 R2 R260 + 0x5412000F, // 0007 LDINT R4 16 + 0x380C0604, // 0008 SHL R3 R3 R4 + 0x94100505, // 0009 GETIDX R4 R2 R261 + 0x54160007, // 000A LDINT R5 8 + 0x38100805, // 000B SHL R4 R4 R5 + 0x000C0604, // 000C ADD R3 R3 R4 + 0x94100506, // 000D GETIDX R4 R2 R262 + 0x000C0604, // 000E ADD R3 R3 R4 + 0x80040600, // 000F RET 1 R3 + }) + ) +); /*******************************************************************/ /******************************************************************** ** Solidified function: read32 ********************************************************************/ - -/********** Solidified proto: read32 */ -be_define_local_const_str(read32_str_name, "read32", 1741276240, 6); -be_define_local_const_str(read32_str_source, "input", -103256197, 5); -be_define_local_const_str(read32_str_0, "wire", -212213352, 4); -be_define_local_const_str(read32_str_1, "read_bytes", -718234123, 10); -be_define_local_const_str(read32_str_2, "addr", 1087856498, 4); - -static const bvalue read32_ktab[7] = { - { { .s=be_local_const_str(read32_str_0) }, BE_STRING}, - { { .s=be_local_const_str(read32_str_1) }, BE_STRING}, - { { .s=be_local_const_str(read32_str_2) }, BE_STRING}, - { { .i=0 }, BE_INT}, - { { .i=1 }, BE_INT}, - { { .i=2 }, BE_INT}, - { { .i=3 }, BE_INT}, -}; - -static const uint32_t read32_code[20] = { - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x8C080501, // 0001 GETMET R2 R2 R257 - 0x88100102, // 0002 GETMBR R4 R0 R258 - 0x5C140200, // 0003 MOVE R5 R1 - 0x541A0003, // 0004 LDINT R6 4 - 0x7C080800, // 0005 CALL R2 4 - 0x940C0503, // 0006 GETIDX R3 R2 R259 - 0x54120017, // 0007 LDINT R4 24 - 0x380C0604, // 0008 SHL R3 R3 R4 - 0x94100504, // 0009 GETIDX R4 R2 R260 - 0x5416000F, // 000A LDINT R5 16 - 0x38100805, // 000B SHL R4 R4 R5 - 0xC0604, // 000C ADD R3 R3 R4 - 0x94100505, // 000D GETIDX R4 R2 R261 - 0x54160007, // 000E LDINT R5 8 - 0x38100805, // 000F SHL R4 R4 R5 - 0xC0604, // 0010 ADD R3 R3 R4 - 0x94100506, // 0011 GETIDX R4 R2 R262 - 0xC0604, // 0012 ADD R3 R3 R4 - 0x80040600, // 0013 RET 1 R3 -}; - -be_define_local_proto(read32, 7, 2, 1, 0, 0); -be_define_local_closure(read32); - +be_local_closure(read32, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + be_nested_string("wire", -212213352, 4), + be_nested_string("read_bytes", -718234123, 10), + be_nested_string("addr", 1087856498, 4), + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(3), + }), + (be_nested_const_str("read32", 1741276240, 6)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[20]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x8C080501, // 0001 GETMET R2 R2 R257 + 0x88100102, // 0002 GETMBR R4 R0 R258 + 0x5C140200, // 0003 MOVE R5 R1 + 0x541A0003, // 0004 LDINT R6 4 + 0x7C080800, // 0005 CALL R2 4 + 0x940C0503, // 0006 GETIDX R3 R2 R259 + 0x54120017, // 0007 LDINT R4 24 + 0x380C0604, // 0008 SHL R3 R3 R4 + 0x94100504, // 0009 GETIDX R4 R2 R260 + 0x5416000F, // 000A LDINT R5 16 + 0x38100805, // 000B SHL R4 R4 R5 + 0x000C0604, // 000C ADD R3 R3 R4 + 0x94100505, // 000D GETIDX R4 R2 R261 + 0x54160007, // 000E LDINT R5 8 + 0x38100805, // 000F SHL R4 R4 R5 + 0x000C0604, // 0010 ADD R3 R3 R4 + 0x94100506, // 0011 GETIDX R4 R2 R262 + 0x000C0604, // 0012 ADD R3 R3 R4 + 0x80040600, // 0013 RET 1 R3 + }) + ) +); /*******************************************************************/ diff --git a/lib/libesp32/Berry/default/be_lv_lvgl_module.c b/lib/libesp32/Berry/default/be_lv_lvgl_module.c index 6d47ffbb9..4785b3621 100644 --- a/lib/libesp32/Berry/default/be_lv_lvgl_module.c +++ b/lib/libesp32/Berry/default/be_lv_lvgl_module.c @@ -34,6 +34,7 @@ static int lv_get_ver_res(void) { /* `lv` methods */ const lvbe_call_c_t lv_func[] = { + { "color_mix", (void*) &lv_color_mix, "lv_color", "(lv_color)(lv_color)i" }, { "draw_arc", (void*) &lv_draw_arc, "", "iiiii(lv_area)(lv_draw_line_dsc)" }, { "draw_img", (void*) &lv_draw_img, "", "(lv_area)(lv_area).(lv_draw_img_dsc)" }, { "draw_img_dsc_init", (void*) &lv_draw_img_dsc_init, "", "(lv_draw_img_dsc)" }, @@ -54,6 +55,7 @@ const lvbe_call_c_t lv_func[] = { { "draw_polygon", (void*) &lv_draw_polygon, "", "ii(lv_area)(lv_draw_rect_dsc)" }, { "draw_px", (void*) &lv_draw_px, "", "(lv_point)(lv_area)(lv_style)" }, { "draw_rect", (void*) &lv_draw_rect, "", "(lv_area)(lv_area)(lv_draw_rect_dsc)" }, + { "draw_rect_dsc_init", (void*) &lv_draw_rect_dsc_init, "", "(lv_draw_rect_dsc)" }, { "draw_triangle", (void*) &lv_draw_triangle, "", "i(lv_area)(lv_draw_rect_dsc)" }, { "event_get_data", (void*) &lv_event_get_data, ".", "" }, { "event_send", (void*) &lv_event_send, "i", "(lv_obj)i." }, diff --git a/lib/libesp32/Berry/default/be_lvgl_color_lib.c b/lib/libesp32/Berry/default/be_lvgl_color_lib.c index d76fd8ced..27eabbbd1 100644 --- a/lib/libesp32/Berry/default/be_lvgl_color_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_color_lib.c @@ -9,6 +9,7 @@ extern int lco_init(bvm *vm); // generic function extern int lco_tostring(bvm *vm); // generic function +extern int lco_toint(bvm *vm); // generic function #if BE_USE_PRECOMPILED_OBJECT @@ -21,6 +22,7 @@ void be_load_lvgl_color_lib(bvm *vm) { { ".p", NULL }, // keeping track of styles to avoid GC { "init", lco_init }, { "tostring", lco_tostring }, + { "toint", lco_toint }, // { NULL, (bntvfunc) BE_CLOSURE }, /* mark section for berry closures */ @@ -39,6 +41,7 @@ class be_class_lv_color (scope: global, name: lv_color) { .p, var init, func(lco_init) tostring, func(lco_tostring) + toint, func(lco_toint) } @const_object_info_end */ diff --git a/lib/libesp32/Berry/default/be_lvgl_ctypes.c b/lib/libesp32/Berry/default/be_lvgl_ctypes.c index a3b50440d..a8932a39f 100644 --- a/lib/libesp32/Berry/default/be_lvgl_ctypes.c +++ b/lib/libesp32/Berry/default/be_lvgl_ctypes.c @@ -38,7 +38,6 @@ int32_t bin_search_ctypes(const char * needle, const void * table, size_t elt_si enum { - ctypes_i32 = 14, ctypes_i16 = 12, ctypes_i8 = 11, @@ -62,7 +61,8 @@ typedef struct be_ctypes_structure_item_t { uint16_t offset_bytes; uint8_t offset_bits : 3; uint8_t len_bits : 5; - int8_t type; + int8_t type : 5; + uint8_t mapping : 3; } be_ctypes_structure_item_t; typedef struct be_ctypes_structure_t { @@ -78,6 +78,7 @@ typedef struct be_ctypes_class_t { typedef struct be_ctypes_classes_t { uint16_t size; + const char **instance_mapping; /* array of instance class names for automatic instanciation of class */ const be_ctypes_class_t * classes; } be_ctypes_classes_t; @@ -176,7 +177,7 @@ int be_ctypes_member(bvm *vm) { be_pushint(vm, member->len_bits); be_call(vm, 3); be_pop(vm, 3); - be_return(vm); + // int result at top of stack } else { // general int support int size = member->type; // eventually 1/2/4, positive if little endian, negative if big endian @@ -196,8 +197,28 @@ int be_ctypes_member(bvm *vm) { be_pushint(vm, size); be_call(vm, 3); be_pop(vm, 3); - be_return(vm); + // int result at top of stack } + // the int result is at top of the stack + // check if we need an instance mapping + if (member->mapping > 0) { + // find the name of the class + + // get global array of classes from global variable '.ctypes_classes' + be_getglobal(vm, ".ctypes_classes"); + const be_ctypes_classes_t * be_ctypes_classes = (const be_ctypes_classes_t *) be_tocomptr(vm, -1); + be_pop(vm, 1); + + const char * mapping_name = be_ctypes_classes->instance_mapping[member->mapping - 1]; + if (mapping_name) { + be_getglobal(vm, mapping_name); // stack: class + be_pushvalue(vm, -2); // stack: class, value + be_pushint(vm, -1); // stack; class, value, -1 + be_call(vm, 2); // call constructor with 2 parameters + be_pop(vm, 2); // leave new instance on top of stack + } + } + be_return(vm); } be_return_nil(vm); @@ -209,6 +230,22 @@ int be_ctypes_member(bvm *vm) { // 3: value int be_ctypes_setmember(bvm *vm) { int argc = be_top(vm); + + // If the value is an instance, we call 'toint()' and replace the value + if (be_isinstance(vm, 3)) { + + be_getmember(vm, 3, "toint"); + if (!be_isnil(vm, -1)) { + be_pushvalue(vm, 3); + be_call(vm, 1); + be_pop(vm, 1); + be_moveto(vm, -1, 3); + } else { + be_raise(vm, "value_error", "Value is an instance without 'toint()' method"); + } + be_pop(vm, 1); + } + be_getmember(vm, 1, ".def"); const be_ctypes_structure_t *definitions; definitions = (const be_ctypes_structure_t *) be_tocomptr(vm, -1); diff --git a/lib/libesp32/Berry/default/be_lvgl_ctypes_definitions.c b/lib/libesp32/Berry/default/be_lvgl_ctypes_definitions.c index 767e3830e..e40f4edde 100644 --- a/lib/libesp32/Berry/default/be_lvgl_ctypes_definitions.c +++ b/lib/libesp32/Berry/default/be_lvgl_ctypes_definitions.c @@ -7,8 +7,11 @@ #include "lvgl.h" -enum { +/******************************************************************** + * Generated code, don't edit + *******************************************************************/ +enum { ctypes_i32 = 14, ctypes_i16 = 12, ctypes_i8 = 11, @@ -32,7 +35,8 @@ typedef struct be_ctypes_structure_item_t { uint16_t offset_bytes; uint8_t offset_bits : 3; uint8_t len_bits : 5; - int8_t type; + int8_t type : 5; + uint8_t mapping : 3; } be_ctypes_structure_item_t; typedef struct be_ctypes_structure_t { @@ -48,368 +52,337 @@ typedef struct be_ctypes_class_t { typedef struct be_ctypes_classes_t { uint16_t size; + const char **instance_mapping; /* array of instance class names for automatic instanciation of class */ const be_ctypes_class_t * classes; } be_ctypes_classes_t; -// extern const be_ctypes_class_t *g_ctypes_classes; - - BE_EXPORT_VARIABLE extern const bclass be_class_lv_ctypes; - - -// const be_ctypes_structure_t be_lv_area_t = { -// 4, -// (const be_ctypes_structure_item_t[4]) { -// { "x1", 0, 16, ctypes_int }, -// { "x2", 32, 16, ctypes_int }, -// { "y1", 16, 16, ctypes_int }, -// { "y2", 48, 16, ctypes_int }, -// // }}; - -// #if BE_USE_PRECOMPILED_OBJECT -// #include "../generate/be_fixed_be_class_lv_area_t.h" -// #endif - -// void be_load_lvgl_lv_area_t_lib(bvm *vm) { -// #if !BE_USE_PRECOMPILED_OBJECT -// static const bnfuncinfo members[] = { -// { NULL, NULL } -// }; -// be_regclass(vm, "lv_area_t", members); - -// be_getglobal(vm, "lv_area_t"); -// be_getglobal(vm, "lv_ctypes"); -// be_setsuper(vm, -2); -// be_pop(vm, 2); -// #else -// be_pushntvclass(vm, &be_class_lv_area_t); -// be_setglobal(vm, "lv_area_t"); -// be_pop(vm, 1); -// #endif -// } - void ctypes_register_class(bvm *vm, const bclass * ctypes_class, const be_ctypes_structure_t * definitions) { be_pushntvclass(vm, ctypes_class); be_setglobal(vm, str(ctypes_class->name)); be_pop(vm, 1); } -/******************************************************************** - * Generated code, don't edit - *******************************************************************/ +/********************************************************************/ const be_ctypes_structure_t be_lv_point = { 4, /* size in bytes */ 2, /* number of elements */ (const be_ctypes_structure_item_t[2]) { - { "x", 0, 0, 0, 12 }, - { "y", 2, 0, 0, 12 }, + { "x", 0, 0, 0, 12, 0 }, + { "y", 2, 0, 0, 12, 0 }, }}; const be_ctypes_structure_t be_lv_area = { 8, /* size in bytes */ 4, /* number of elements */ (const be_ctypes_structure_item_t[4]) { - { "x1", 0, 0, 0, 12 }, - { "x2", 4, 0, 0, 12 }, - { "y1", 2, 0, 0, 12 }, - { "y2", 6, 0, 0, 12 }, + { "x1", 0, 0, 0, 12, 0 }, + { "x2", 4, 0, 0, 12, 0 }, + { "y1", 2, 0, 0, 12, 0 }, + { "y2", 6, 0, 0, 12, 0 }, }}; const be_ctypes_structure_t be_lv_draw_rect_dsc = { 77, /* size in bytes */ 43, /* number of elements */ (const be_ctypes_structure_item_t[43]) { - { "bg_blend_mode", 12, 0, 0, 1 }, - { "bg_color", 2, 0, 0, 2 }, - { "bg_grad_color", 4, 0, 0, 2 }, - { "bg_grad_color_stop", 9, 0, 0, 12 }, - { "bg_grad_dir", 6, 0, 0, 1 }, - { "bg_main_color_stop", 7, 0, 0, 12 }, - { "bg_opa", 11, 0, 0, 1 }, - { "border_blend_mode", 20, 0, 0, 1 }, - { "border_color", 13, 0, 0, 2 }, - { "border_opa", 19, 0, 0, 1 }, - { "border_post", 21, 0, 1, 0 }, - { "border_side", 17, 0, 0, 12 }, - { "border_width", 15, 0, 0, 12 }, - { "outline_blend_mode", 29, 0, 0, 1 }, - { "outline_color", 22, 0, 0, 2 }, - { "outline_opa", 28, 0, 0, 1 }, - { "outline_pad", 26, 0, 0, 12 }, - { "outline_width", 24, 0, 0, 12 }, - { "pattern_blend_mode", 55, 0, 0, 1 }, - { "pattern_font", 46, 0, 0, 4 }, - { "pattern_image", 42, 0, 0, 4 }, - { "pattern_opa", 52, 0, 0, 1 }, - { "pattern_recolor", 50, 0, 0, 2 }, - { "pattern_recolor_opa", 53, 0, 0, 1 }, - { "pattern_repeat", 54, 0, 1, 0 }, - { "radius", 0, 0, 0, 12 }, - { "shadow_blend_mode", 41, 0, 0, 1 }, - { "shadow_color", 30, 0, 0, 2 }, - { "shadow_ofs_x", 34, 0, 0, 12 }, - { "shadow_ofs_y", 36, 0, 0, 12 }, - { "shadow_opa", 40, 0, 0, 1 }, - { "shadow_spread", 38, 0, 0, 12 }, - { "shadow_width", 32, 0, 0, 12 }, - { "value_align", 75, 0, 0, 1 }, - { "value_blend_mode", 76, 0, 0, 1 }, - { "value_color", 65, 0, 0, 2 }, - { "value_font", 60, 0, 0, 4 }, - { "value_letter_space", 71, 0, 0, 12 }, - { "value_line_space", 73, 0, 0, 12 }, - { "value_ofs_x", 67, 0, 0, 12 }, - { "value_ofs_y", 69, 0, 0, 12 }, - { "value_opa", 64, 0, 0, 1 }, - { "value_str", 56, 0, 0, 4 }, + { "bg_blend_mode", 12, 0, 0, 1, 0 }, + { "bg_color", 2, 0, 0, 2, 1 }, + { "bg_grad_color", 4, 0, 0, 2, 1 }, + { "bg_grad_color_stop", 9, 0, 0, 12, 0 }, + { "bg_grad_dir", 6, 0, 0, 1, 0 }, + { "bg_main_color_stop", 7, 0, 0, 12, 0 }, + { "bg_opa", 11, 0, 0, 1, 0 }, + { "border_blend_mode", 20, 0, 0, 1, 0 }, + { "border_color", 13, 0, 0, 2, 1 }, + { "border_opa", 19, 0, 0, 1, 0 }, + { "border_post", 21, 0, 1, 0, 0 }, + { "border_side", 17, 0, 0, 12, 0 }, + { "border_width", 15, 0, 0, 12, 0 }, + { "outline_blend_mode", 29, 0, 0, 1, 0 }, + { "outline_color", 22, 0, 0, 2, 1 }, + { "outline_opa", 28, 0, 0, 1, 0 }, + { "outline_pad", 26, 0, 0, 12, 0 }, + { "outline_width", 24, 0, 0, 12, 0 }, + { "pattern_blend_mode", 55, 0, 0, 1, 0 }, + { "pattern_font", 46, 0, 0, 4, 0 }, + { "pattern_image", 42, 0, 0, 4, 0 }, + { "pattern_opa", 52, 0, 0, 1, 0 }, + { "pattern_recolor", 50, 0, 0, 2, 1 }, + { "pattern_recolor_opa", 53, 0, 0, 1, 0 }, + { "pattern_repeat", 54, 0, 1, 0, 0 }, + { "radius", 0, 0, 0, 12, 0 }, + { "shadow_blend_mode", 41, 0, 0, 1, 0 }, + { "shadow_color", 30, 0, 0, 2, 1 }, + { "shadow_ofs_x", 34, 0, 0, 12, 0 }, + { "shadow_ofs_y", 36, 0, 0, 12, 0 }, + { "shadow_opa", 40, 0, 0, 1, 0 }, + { "shadow_spread", 38, 0, 0, 12, 0 }, + { "shadow_width", 32, 0, 0, 12, 0 }, + { "value_align", 75, 0, 0, 1, 0 }, + { "value_blend_mode", 76, 0, 0, 1, 0 }, + { "value_color", 65, 0, 0, 2, 1 }, + { "value_font", 60, 0, 0, 4, 0 }, + { "value_letter_space", 71, 0, 0, 12, 0 }, + { "value_line_space", 73, 0, 0, 12, 0 }, + { "value_ofs_x", 67, 0, 0, 12, 0 }, + { "value_ofs_y", 69, 0, 0, 12, 0 }, + { "value_opa", 64, 0, 0, 1, 0 }, + { "value_str", 56, 0, 0, 4, 0 }, }}; const be_ctypes_structure_t be_lv_draw_line_dsc = { 10, /* size in bytes */ 9, /* number of elements */ (const be_ctypes_structure_item_t[9]) { - { "blend_mode", 9, 0, 2, 0 }, - { "color", 0, 0, 0, 2 }, - { "dash_gap", 6, 0, 0, 12 }, - { "dash_width", 4, 0, 0, 12 }, - { "opa", 8, 0, 0, 1 }, - { "raw_end", 9, 4, 1, 0 }, - { "round_end", 9, 3, 1, 0 }, - { "round_start", 9, 2, 1, 0 }, - { "width", 2, 0, 0, 12 }, + { "blend_mode", 9, 0, 2, 0, 0 }, + { "color", 0, 0, 0, 2, 1 }, + { "dash_gap", 6, 0, 0, 12, 0 }, + { "dash_width", 4, 0, 0, 12, 0 }, + { "opa", 8, 0, 0, 1, 0 }, + { "raw_end", 9, 4, 1, 0, 0 }, + { "round_end", 9, 3, 1, 0, 0 }, + { "round_start", 9, 2, 1, 0, 0 }, + { "width", 2, 0, 0, 12, 0 }, }}; const be_ctypes_structure_t be_lv_draw_img_dsc = { 14, /* size in bytes */ 9, /* number of elements */ (const be_ctypes_structure_item_t[9]) { - { "angle", 1, 0, 0, 2 }, - { "antialias", 13, 0, 1, 0 }, - { "blend_mode", 12, 0, 0, 1 }, - { "opa", 0, 0, 0, 1 }, - { "pivot_x", 3, 0, 0, 12 }, - { "pivot_y", 5, 0, 0, 12 }, - { "recolor", 10, 0, 0, 2 }, - { "recolor_opa", 9, 0, 0, 1 }, - { "zoom", 7, 0, 0, 2 }, + { "angle", 1, 0, 0, 2, 0 }, + { "antialias", 13, 0, 1, 0, 0 }, + { "blend_mode", 12, 0, 0, 1, 0 }, + { "opa", 0, 0, 0, 1, 0 }, + { "pivot_x", 3, 0, 0, 12, 0 }, + { "pivot_y", 5, 0, 0, 12, 0 }, + { "recolor", 10, 0, 0, 2, 1 }, + { "recolor_opa", 9, 0, 0, 1, 0 }, + { "zoom", 7, 0, 0, 2, 0 }, }}; const be_ctypes_structure_t be_lv_draw_label_dsc = { 31, /* size in bytes */ 15, /* number of elements */ (const be_ctypes_structure_item_t[15]) { - { "bidi_dir", 27, 0, 0, 1 }, - { "blend_mode", 30, 0, 0, 1 }, - { "color", 0, 0, 0, 2 }, - { "decor", 29, 0, 0, 1 }, - { "flag", 28, 0, 0, 1 }, - { "font", 6, 0, 0, 4 }, - { "letter_space", 13, 0, 0, 12 }, - { "line_space", 11, 0, 0, 12 }, - { "ofs_x", 23, 0, 0, 12 }, - { "ofs_y", 25, 0, 0, 12 }, - { "opa", 10, 0, 0, 1 }, - { "sel_bg_color", 4, 0, 0, 2 }, - { "sel_color", 2, 0, 0, 2 }, - { "sel_end", 19, 0, 0, 4 }, - { "sel_start", 15, 0, 0, 4 }, + { "bidi_dir", 27, 0, 0, 1, 0 }, + { "blend_mode", 30, 0, 0, 1, 0 }, + { "color", 0, 0, 0, 2, 1 }, + { "decor", 29, 0, 0, 1, 0 }, + { "flag", 28, 0, 0, 1, 0 }, + { "font", 6, 0, 0, 4, 0 }, + { "letter_space", 13, 0, 0, 12, 0 }, + { "line_space", 11, 0, 0, 12, 0 }, + { "ofs_x", 23, 0, 0, 12, 0 }, + { "ofs_y", 25, 0, 0, 12, 0 }, + { "opa", 10, 0, 0, 1, 0 }, + { "sel_bg_color", 4, 0, 0, 2, 1 }, + { "sel_color", 2, 0, 0, 2, 1 }, + { "sel_end", 19, 0, 0, 4, 0 }, + { "sel_start", 15, 0, 0, 4, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_common_dsc = { 5, /* size in bytes */ 2, /* number of elements */ (const be_ctypes_structure_item_t[2]) { - { "cb", 0, 0, 0, 4 }, - { "type", 4, 0, 0, 1 }, + { "cb", 0, 0, 0, 4, 0 }, + { "type", 4, 0, 0, 1, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_line_param_cfg = { 9, /* size in bytes */ 5, /* number of elements */ (const be_ctypes_structure_item_t[5]) { - { "p1_x", 0, 0, 0, 12 }, - { "p1_y", 2, 0, 0, 12 }, - { "p2_x", 4, 0, 0, 12 }, - { "p2_y", 6, 0, 0, 12 }, - { "side", 8, 0, 2, 0 }, + { "p1_x", 0, 0, 0, 12, 0 }, + { "p1_y", 2, 0, 0, 12, 0 }, + { "p2_x", 4, 0, 0, 12, 0 }, + { "p2_y", 6, 0, 0, 12, 0 }, + { "side", 8, 0, 2, 0, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_line_param = { 35, /* size in bytes */ 15, /* number of elements */ (const be_ctypes_structure_item_t[15]) { - { "cfg_p1_x", 5, 0, 0, 12 }, - { "cfg_p1_y", 7, 0, 0, 12 }, - { "cfg_p2_x", 9, 0, 0, 12 }, - { "cfg_p2_y", 11, 0, 0, 12 }, - { "cfg_side", 13, 0, 2, 0 }, - { "dsc_cb", 0, 0, 0, 4 }, - { "dsc_type", 4, 0, 0, 1 }, - { "flat", 34, 0, 1, 0 }, - { "inv", 34, 1, 1, 0 }, - { "origo_x", 14, 0, 0, 12 }, - { "origo_y", 16, 0, 0, 12 }, - { "spx", 30, 0, 0, 14 }, - { "steep", 26, 0, 0, 14 }, - { "xy_steep", 18, 0, 0, 14 }, - { "yx_steep", 22, 0, 0, 14 }, + { "cfg_p1_x", 5, 0, 0, 12, 0 }, + { "cfg_p1_y", 7, 0, 0, 12, 0 }, + { "cfg_p2_x", 9, 0, 0, 12, 0 }, + { "cfg_p2_y", 11, 0, 0, 12, 0 }, + { "cfg_side", 13, 0, 2, 0, 0 }, + { "dsc_cb", 0, 0, 0, 4, 0 }, + { "dsc_type", 4, 0, 0, 1, 0 }, + { "flat", 34, 0, 1, 0, 0 }, + { "inv", 34, 1, 1, 0, 0 }, + { "origo_x", 14, 0, 0, 12, 0 }, + { "origo_y", 16, 0, 0, 12, 0 }, + { "spx", 30, 0, 0, 14, 0 }, + { "steep", 26, 0, 0, 14, 0 }, + { "xy_steep", 18, 0, 0, 14, 0 }, + { "yx_steep", 22, 0, 0, 14, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_angle_param_cfg = { 8, /* size in bytes */ 4, /* number of elements */ (const be_ctypes_structure_item_t[4]) { - { "end_angle", 6, 0, 0, 12 }, - { "start_angle", 4, 0, 0, 12 }, - { "vertex_p_x", 0, 0, 0, 12 }, - { "vertex_p_y", 2, 0, 0, 12 }, + { "end_angle", 6, 0, 0, 12, 0 }, + { "start_angle", 4, 0, 0, 12, 0 }, + { "vertex_p_x", 0, 0, 0, 12, 0 }, + { "vertex_p_y", 2, 0, 0, 12, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_angle_param = { 85, /* size in bytes */ 37, /* number of elements */ (const be_ctypes_structure_item_t[37]) { - { "cfg_end_angle", 11, 0, 0, 12 }, - { "cfg_start_angle", 9, 0, 0, 12 }, - { "cfg_vertex_p_x", 5, 0, 0, 12 }, - { "cfg_vertex_p_y", 7, 0, 0, 12 }, - { "delta_deg", 83, 0, 0, 2 }, - { "dsc_cb", 0, 0, 0, 4 }, - { "dsc_type", 4, 0, 0, 1 }, - { "end_line_cfg_p1_x", 53, 0, 0, 12 }, - { "end_line_cfg_p1_y", 55, 0, 0, 12 }, - { "end_line_cfg_p2_x", 57, 0, 0, 12 }, - { "end_line_cfg_p2_y", 59, 0, 0, 12 }, - { "end_line_cfg_side", 61, 0, 2, 0 }, - { "end_line_dsc_cb", 48, 0, 0, 4 }, - { "end_line_dsc_type", 52, 0, 0, 1 }, - { "end_line_flat", 82, 0, 1, 0 }, - { "end_line_inv", 82, 1, 1, 0 }, - { "end_line_origo_x", 62, 0, 0, 12 }, - { "end_line_origo_y", 64, 0, 0, 12 }, - { "end_line_spx", 78, 0, 0, 14 }, - { "end_line_steep", 74, 0, 0, 14 }, - { "end_line_xy_steep", 66, 0, 0, 14 }, - { "end_line_yx_steep", 70, 0, 0, 14 }, - { "start_line_cfg_p1_x", 18, 0, 0, 12 }, - { "start_line_cfg_p1_y", 20, 0, 0, 12 }, - { "start_line_cfg_p2_x", 22, 0, 0, 12 }, - { "start_line_cfg_p2_y", 24, 0, 0, 12 }, - { "start_line_cfg_side", 26, 0, 2, 0 }, - { "start_line_dsc_cb", 13, 0, 0, 4 }, - { "start_line_dsc_type", 17, 0, 0, 1 }, - { "start_line_flat", 47, 0, 1, 0 }, - { "start_line_inv", 47, 1, 1, 0 }, - { "start_line_origo_x", 27, 0, 0, 12 }, - { "start_line_origo_y", 29, 0, 0, 12 }, - { "start_line_spx", 43, 0, 0, 14 }, - { "start_line_steep", 39, 0, 0, 14 }, - { "start_line_xy_steep", 31, 0, 0, 14 }, - { "start_line_yx_steep", 35, 0, 0, 14 }, + { "cfg_end_angle", 11, 0, 0, 12, 0 }, + { "cfg_start_angle", 9, 0, 0, 12, 0 }, + { "cfg_vertex_p_x", 5, 0, 0, 12, 0 }, + { "cfg_vertex_p_y", 7, 0, 0, 12, 0 }, + { "delta_deg", 83, 0, 0, 2, 0 }, + { "dsc_cb", 0, 0, 0, 4, 0 }, + { "dsc_type", 4, 0, 0, 1, 0 }, + { "end_line_cfg_p1_x", 53, 0, 0, 12, 0 }, + { "end_line_cfg_p1_y", 55, 0, 0, 12, 0 }, + { "end_line_cfg_p2_x", 57, 0, 0, 12, 0 }, + { "end_line_cfg_p2_y", 59, 0, 0, 12, 0 }, + { "end_line_cfg_side", 61, 0, 2, 0, 0 }, + { "end_line_dsc_cb", 48, 0, 0, 4, 0 }, + { "end_line_dsc_type", 52, 0, 0, 1, 0 }, + { "end_line_flat", 82, 0, 1, 0, 0 }, + { "end_line_inv", 82, 1, 1, 0, 0 }, + { "end_line_origo_x", 62, 0, 0, 12, 0 }, + { "end_line_origo_y", 64, 0, 0, 12, 0 }, + { "end_line_spx", 78, 0, 0, 14, 0 }, + { "end_line_steep", 74, 0, 0, 14, 0 }, + { "end_line_xy_steep", 66, 0, 0, 14, 0 }, + { "end_line_yx_steep", 70, 0, 0, 14, 0 }, + { "start_line_cfg_p1_x", 18, 0, 0, 12, 0 }, + { "start_line_cfg_p1_y", 20, 0, 0, 12, 0 }, + { "start_line_cfg_p2_x", 22, 0, 0, 12, 0 }, + { "start_line_cfg_p2_y", 24, 0, 0, 12, 0 }, + { "start_line_cfg_side", 26, 0, 2, 0, 0 }, + { "start_line_dsc_cb", 13, 0, 0, 4, 0 }, + { "start_line_dsc_type", 17, 0, 0, 1, 0 }, + { "start_line_flat", 47, 0, 1, 0, 0 }, + { "start_line_inv", 47, 1, 1, 0, 0 }, + { "start_line_origo_x", 27, 0, 0, 12, 0 }, + { "start_line_origo_y", 29, 0, 0, 12, 0 }, + { "start_line_spx", 43, 0, 0, 14, 0 }, + { "start_line_steep", 39, 0, 0, 14, 0 }, + { "start_line_xy_steep", 31, 0, 0, 14, 0 }, + { "start_line_yx_steep", 35, 0, 0, 14, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_radius_param_cfg = { 11, /* size in bytes */ 6, /* number of elements */ (const be_ctypes_structure_item_t[6]) { - { "outer", 10, 0, 1, 0 }, - { "radius", 8, 0, 0, 12 }, - { "rect_x1", 0, 0, 0, 12 }, - { "rect_x2", 4, 0, 0, 12 }, - { "rect_y1", 2, 0, 0, 12 }, - { "rect_y2", 6, 0, 0, 12 }, + { "outer", 10, 0, 1, 0, 0 }, + { "radius", 8, 0, 0, 12, 0 }, + { "rect_x1", 0, 0, 0, 12, 0 }, + { "rect_x2", 4, 0, 0, 12, 0 }, + { "rect_y1", 2, 0, 0, 12, 0 }, + { "rect_y2", 6, 0, 0, 12, 0 }, }}; const be_ctypes_structure_t be_lv_sqrt_res = { 4, /* size in bytes */ 2, /* number of elements */ (const be_ctypes_structure_item_t[2]) { - { "f", 2, 0, 0, 2 }, - { "i", 0, 0, 0, 2 }, + { "f", 2, 0, 0, 2, 0 }, + { "i", 0, 0, 0, 2, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_radius_param = { 24, /* size in bytes */ 11, /* number of elements */ (const be_ctypes_structure_item_t[11]) { - { "cfg_outer", 15, 0, 1, 0 }, - { "cfg_radius", 13, 0, 0, 12 }, - { "cfg_rect_x1", 5, 0, 0, 12 }, - { "cfg_rect_x2", 9, 0, 0, 12 }, - { "cfg_rect_y1", 7, 0, 0, 12 }, - { "cfg_rect_y2", 11, 0, 0, 12 }, - { "dsc_cb", 0, 0, 0, 4 }, - { "dsc_type", 4, 0, 0, 1 }, - { "y_prev", 16, 0, 0, 14 }, - { "y_prev_x_f", 22, 0, 0, 2 }, - { "y_prev_x_i", 20, 0, 0, 2 }, + { "cfg_outer", 15, 0, 1, 0, 0 }, + { "cfg_radius", 13, 0, 0, 12, 0 }, + { "cfg_rect_x1", 5, 0, 0, 12, 0 }, + { "cfg_rect_x2", 9, 0, 0, 12, 0 }, + { "cfg_rect_y1", 7, 0, 0, 12, 0 }, + { "cfg_rect_y2", 11, 0, 0, 12, 0 }, + { "dsc_cb", 0, 0, 0, 4, 0 }, + { "dsc_type", 4, 0, 0, 1, 0 }, + { "y_prev", 16, 0, 0, 14, 0 }, + { "y_prev_x_f", 22, 0, 0, 2, 0 }, + { "y_prev_x_i", 20, 0, 0, 2, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_fade_param_cfg = { 14, /* size in bytes */ 8, /* number of elements */ (const be_ctypes_structure_item_t[8]) { - { "coords_x1", 0, 0, 0, 12 }, - { "coords_x2", 4, 0, 0, 12 }, - { "coords_y1", 2, 0, 0, 12 }, - { "coords_y2", 6, 0, 0, 12 }, - { "opa_bottom", 13, 0, 0, 1 }, - { "opa_top", 12, 0, 0, 1 }, - { "y_bottom", 10, 0, 0, 12 }, - { "y_top", 8, 0, 0, 12 }, + { "coords_x1", 0, 0, 0, 12, 0 }, + { "coords_x2", 4, 0, 0, 12, 0 }, + { "coords_y1", 2, 0, 0, 12, 0 }, + { "coords_y2", 6, 0, 0, 12, 0 }, + { "opa_bottom", 13, 0, 0, 1, 0 }, + { "opa_top", 12, 0, 0, 1, 0 }, + { "y_bottom", 10, 0, 0, 12, 0 }, + { "y_top", 8, 0, 0, 12, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_fade_param = { 19, /* size in bytes */ 10, /* number of elements */ (const be_ctypes_structure_item_t[10]) { - { "cfg_coords_x1", 5, 0, 0, 12 }, - { "cfg_coords_x2", 9, 0, 0, 12 }, - { "cfg_coords_y1", 7, 0, 0, 12 }, - { "cfg_coords_y2", 11, 0, 0, 12 }, - { "cfg_opa_bottom", 18, 0, 0, 1 }, - { "cfg_opa_top", 17, 0, 0, 1 }, - { "cfg_y_bottom", 15, 0, 0, 12 }, - { "cfg_y_top", 13, 0, 0, 12 }, - { "dsc_cb", 0, 0, 0, 4 }, - { "dsc_type", 4, 0, 0, 1 }, + { "cfg_coords_x1", 5, 0, 0, 12, 0 }, + { "cfg_coords_x2", 9, 0, 0, 12, 0 }, + { "cfg_coords_y1", 7, 0, 0, 12, 0 }, + { "cfg_coords_y2", 11, 0, 0, 12, 0 }, + { "cfg_opa_bottom", 18, 0, 0, 1, 0 }, + { "cfg_opa_top", 17, 0, 0, 1, 0 }, + { "cfg_y_bottom", 15, 0, 0, 12, 0 }, + { "cfg_y_top", 13, 0, 0, 12, 0 }, + { "dsc_cb", 0, 0, 0, 4, 0 }, + { "dsc_type", 4, 0, 0, 1, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_map_param_cfg = { 12, /* size in bytes */ 5, /* number of elements */ (const be_ctypes_structure_item_t[5]) { - { "coords_x1", 0, 0, 0, 12 }, - { "coords_x2", 4, 0, 0, 12 }, - { "coords_y1", 2, 0, 0, 12 }, - { "coords_y2", 6, 0, 0, 12 }, - { "map", 8, 0, 0, 4 }, + { "coords_x1", 0, 0, 0, 12, 0 }, + { "coords_x2", 4, 0, 0, 12, 0 }, + { "coords_y1", 2, 0, 0, 12, 0 }, + { "coords_y2", 6, 0, 0, 12, 0 }, + { "map", 8, 0, 0, 4, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_map_param = { 17, /* size in bytes */ 7, /* number of elements */ (const be_ctypes_structure_item_t[7]) { - { "cfg_coords_x1", 5, 0, 0, 12 }, - { "cfg_coords_x2", 9, 0, 0, 12 }, - { "cfg_coords_y1", 7, 0, 0, 12 }, - { "cfg_coords_y2", 11, 0, 0, 12 }, - { "cfg_map", 13, 0, 0, 4 }, - { "dsc_cb", 0, 0, 0, 4 }, - { "dsc_type", 4, 0, 0, 1 }, + { "cfg_coords_x1", 5, 0, 0, 12, 0 }, + { "cfg_coords_x2", 9, 0, 0, 12, 0 }, + { "cfg_coords_y1", 7, 0, 0, 12, 0 }, + { "cfg_coords_y2", 11, 0, 0, 12, 0 }, + { "cfg_map", 13, 0, 0, 4, 0 }, + { "dsc_cb", 0, 0, 0, 4, 0 }, + { "dsc_type", 4, 0, 0, 1, 0 }, }}; const be_ctypes_structure_t be_lv_draw_mask_saved = { 8, /* size in bytes */ 2, /* number of elements */ (const be_ctypes_structure_item_t[2]) { - { "custom_id", 4, 0, 0, 4 }, - { "param", 0, 0, 0, 4 }, + { "custom_id", 4, 0, 0, 4, 0 }, + { "param", 0, 0, 0, 4, 0 }, }}; +const char * be_ctypes_instance_mappings[] = { + "lv_color", + NULL +}; + const be_ctypes_classes_t be_ctypes_classes[] = { 19, + be_ctypes_instance_mappings, (const be_ctypes_class_t[19]) { { "lv_area", &be_lv_area }, { "lv_draw_img_dsc", &be_lv_draw_img_dsc }, @@ -500,8 +473,6 @@ void be_load_ctypes_definitions_lib(bvm *vm) { static be_define_const_empty_class(be_class_lv_sqrt_res, &be_class_lv_ctypes, lv_sqrt_res); ctypes_register_class(vm, &be_class_lv_sqrt_res, &be_lv_sqrt_res); } - -/*******************************************************************/ - +/********************************************************************/ #endif // USE_LVGL \ No newline at end of file diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c new file mode 100644 index 000000000..14c1e197a --- /dev/null +++ b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c @@ -0,0 +1,369 @@ +/******************************************************************** + * Tasmota LVGL lv_signal_bars widget + *******************************************************************/ +#include "be_constobj.h" + +#ifdef USE_LVGL + +#include "lvgl.h" + +/******************************************************************** +** Solidified function: my_design_cb +********************************************************************/ +be_local_closure(my_design_cb, /* name */ + be_nested_proto( + 23, /* nstack */ + 3, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + be_const_int(1), + }), + (be_nested_const_str("atleast1", 1956331672, 8)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 6]) { /* code */ + 0x28040100, // 0000 GE R1 R0 R256 + 0x78060001, // 0001 JMPF R1 #0004 + 0x80040000, // 0002 RET 1 R0 + 0x70020000, // 0003 JMP #0005 + 0x80060000, // 0004 RET 1 R256 + 0x80000000, // 0005 RET 0 R0 + }) + ), + 1, /* has constants */ + ( &(const bvalue[34]) { /* constants */ + be_nested_string("global", 503252654, 6), + be_nested_string("lv", 1529997255, 2), + be_nested_string("get_height", -723211773, 10), + be_nested_string("get_width", -1001549996, 9), + be_const_int(3), + be_const_int(2), + be_nested_string("DESIGN_COVER_CHK", -1298406708, 16), + be_nested_string("ancestor_design", 421545719, 15), + be_nested_string("call", -1276017495, 4), + be_nested_string("DESIGN_DRAW_MAIN", -904475754, 16), + be_nested_string("get_coords", 1044089006, 10), + be_nested_string("x1", 274927234, 2), + be_nested_string("y1", -1939865569, 2), + be_nested_string("draw_line_dsc_init", -428273650, 18), + be_nested_string("line_dsc", -200476318, 8), + be_nested_string("init_draw_line_dsc", -1787031256, 18), + be_nested_string("OBJ_PART_MAIN", 658062838, 13), + be_nested_string("round_start", -1345482912, 11), + be_const_int(1), + be_nested_string("round_end", 985288225, 9), + be_nested_string("width", -1786286561, 5), + be_nested_string("get_style_line_color", 805371932, 20), + be_nested_string("STATE_DEFAULT", 712406428, 13), + be_nested_string("get_style_bg_color", 964794381, 18), + be_const_int(0), + be_nested_string("color", 1031692888, 5), + be_nested_string("percentage", -1756136011, 10), + be_nested_string("p1", -1605446022, 2), + be_nested_string("y", -66302220, 1), + be_nested_string("x", -49524601, 1), + be_nested_string("p2", -1622223641, 2), + be_nested_string("draw_line", 1634465686, 9), + be_nested_string("stop_iteration", -121173395, 14), + be_nested_string("DESIGN_RES_OK", -1265307123, 13), + }), + (be_nested_const_str("my_design_cb", -1173588798, 12)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[111]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 R256 + 0x88100701, // 0001 GETMBR R4 R3 R257 + 0x84140000, // 0002 CLOSURE R5 P0 + 0x8C180102, // 0003 GETMET R6 R0 R258 + 0x7C180200, // 0004 CALL R6 1 + 0x8C1C0103, // 0005 GETMET R7 R0 R259 + 0x7C1C0200, // 0006 CALL R7 1 + 0x5C200A00, // 0007 MOVE R8 R5 + 0x5426000E, // 0008 LDINT R9 15 + 0x0C240E09, // 0009 DIV R9 R7 R9 + 0x7C200200, // 000A CALL R8 1 + 0x5C240A00, // 000B MOVE R9 R5 + 0x08281104, // 000C MUL R10 R8 R260 + 0x04280E0A, // 000D SUB R10 R7 R10 + 0x542E0003, // 000E LDINT R11 4 + 0x0C28140B, // 000F DIV R10 R10 R11 + 0x7C240200, // 0010 CALL R9 1 + 0x0C281305, // 0011 DIV R10 R9 R261 + 0x882C0906, // 0012 GETMBR R11 R4 R262 + 0x1C2C040B, // 0013 EQ R11 R2 R11 + 0x782E0007, // 0014 JMPF R11 #001D + 0x882C0107, // 0015 GETMBR R11 R0 R263 + 0x8C2C1708, // 0016 GETMET R11 R11 R264 + 0x5C340000, // 0017 MOVE R13 R0 + 0x5C380200, // 0018 MOVE R14 R1 + 0x5C3C0400, // 0019 MOVE R15 R2 + 0x7C2C0800, // 001A CALL R11 4 + 0x80041600, // 001B RET 1 R11 + 0x7002004F, // 001C JMP #006D + 0x882C0909, // 001D GETMBR R11 R4 R265 + 0x1C2C040B, // 001E EQ R11 R2 R11 + 0x782E004C, // 001F JMPF R11 #006D + 0x8C2C010A, // 0020 GETMET R11 R0 R266 + 0x5C340200, // 0021 MOVE R13 R1 + 0x7C2C0400, // 0022 CALL R11 2 + 0x882C030B, // 0023 GETMBR R11 R1 R267 + 0x8830030C, // 0024 GETMBR R12 R1 R268 + 0x8C34090D, // 0025 GETMET R13 R4 R269 + 0x883C010E, // 0026 GETMBR R15 R0 R270 + 0x7C340400, // 0027 CALL R13 2 + 0x8C34010F, // 0028 GETMET R13 R0 R271 + 0x883C0910, // 0029 GETMBR R15 R4 R272 + 0x8840010E, // 002A GETMBR R16 R0 R270 + 0x7C340600, // 002B CALL R13 3 + 0x8834010E, // 002C GETMBR R13 R0 R270 + 0x90362312, // 002D SETMBR R13 R273 R274 + 0x8834010E, // 002E GETMBR R13 R0 R270 + 0x90362712, // 002F SETMBR R13 R275 R274 + 0x8834010E, // 0030 GETMBR R13 R0 R270 + 0x90362809, // 0031 SETMBR R13 R276 R9 + 0x8C340115, // 0032 GETMET R13 R0 R277 + 0x883C0910, // 0033 GETMBR R15 R4 R272 + 0x88400916, // 0034 GETMBR R16 R4 R278 + 0x7C340600, // 0035 CALL R13 3 + 0x8C380117, // 0036 GETMET R14 R0 R279 + 0x88400910, // 0037 GETMBR R16 R4 R272 + 0x88440916, // 0038 GETMBR R17 R4 R278 + 0x7C380600, // 0039 CALL R14 3 + 0x603C0000, // 003A GETGBL R15 G0 + 0x40423104, // 003B CONNECT R16 R280 R260 + 0x7C3C0200, // 003C CALL R15 1 + 0xA802002B, // 003D EXBLK 0 #006A + 0x5C401E00, // 003E MOVE R16 R15 + 0x7C400000, // 003F CALL R16 0 + 0x8844010E, // 0040 GETMBR R17 R0 R270 + 0x8848011A, // 0041 GETMBR R18 R0 R282 + 0x004C2112, // 0042 ADD R19 R16 R274 + 0x54520013, // 0043 LDINT R20 20 + 0x084C2614, // 0044 MUL R19 R19 R20 + 0x28482413, // 0045 GE R18 R18 R19 + 0x784A0001, // 0046 JMPF R18 #0049 + 0x5C481A00, // 0047 MOVE R18 R13 + 0x70020000, // 0048 JMP #004A + 0x5C481C00, // 0049 MOVE R18 R14 + 0x90463212, // 004A SETMBR R17 R281 R18 + 0x8844011B, // 004B GETMBR R17 R0 R283 + 0x00481806, // 004C ADD R18 R12 R6 + 0x04482512, // 004D SUB R18 R18 R274 + 0x0448240A, // 004E SUB R18 R18 R10 + 0x90463812, // 004F SETMBR R17 R284 R18 + 0x8844011B, // 0050 GETMBR R17 R0 R283 + 0x00481208, // 0051 ADD R18 R9 R8 + 0x08482012, // 0052 MUL R18 R16 R18 + 0x00481612, // 0053 ADD R18 R11 R18 + 0x0048240A, // 0054 ADD R18 R18 R10 + 0x90463A12, // 0055 SETMBR R17 R285 R18 + 0x8844011E, // 0056 GETMBR R17 R0 R286 + 0x044A0810, // 0057 SUB R18 R260 R16 + 0x044C0C09, // 0058 SUB R19 R6 R9 + 0x08482413, // 0059 MUL R18 R18 R19 + 0x544E0003, // 005A LDINT R19 4 + 0x0C482413, // 005B DIV R18 R18 R19 + 0x00481812, // 005C ADD R18 R12 R18 + 0x0048240A, // 005D ADD R18 R18 R10 + 0x90463812, // 005E SETMBR R17 R284 R18 + 0x8844011E, // 005F GETMBR R17 R0 R286 + 0x8848011B, // 0060 GETMBR R18 R0 R283 + 0x8848251D, // 0061 GETMBR R18 R18 R285 + 0x90463A12, // 0062 SETMBR R17 R285 R18 + 0x8C44091F, // 0063 GETMET R17 R4 R287 + 0x884C011B, // 0064 GETMBR R19 R0 R283 + 0x8850011E, // 0065 GETMBR R20 R0 R286 + 0x5C540200, // 0066 MOVE R21 R1 + 0x8858010E, // 0067 GETMBR R22 R0 R270 + 0x7C440A00, // 0068 CALL R17 5 + 0x7001FFD3, // 0069 JMP #003E + 0x583C0020, // 006A LDCONST R15 K32 + 0xAC3C0200, // 006B CATCH R15 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x882C0921, // 006D GETMBR R11 R4 R289 + 0x80041600, // 006E RET 1 R11 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_percentage +********************************************************************/ +be_local_closure(get_percentage, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + be_nested_string("percentage", -1756136011, 10), + }), + (be_nested_const_str("get_percentage", -1414483304, 14)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 R256 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(init, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + be_nested_string("global", 503252654, 6), + be_nested_string("lv", 1529997255, 2), + be_nested_string("lv_obj", -37134147, 6), + be_nested_string("init", 380752755, 4), + be_nested_string("ancestor_design", 421545719, 15), + be_nested_string("get_design_cb", -825649242, 13), + be_nested_string("set_design_cb", 1469311634, 13), + be_nested_string("my_design_cb", -1173588798, 12), + be_nested_string("percentage", -1756136011, 10), + be_nested_string("p1", -1605446022, 2), + be_nested_string("lv_point", -174745506, 8), + be_nested_string("p2", -1622223641, 2), + be_nested_string("line_dsc", -200476318, 8), + be_nested_string("lv_draw_line_dsc", -1872162060, 16), + be_nested_string("area", -1693507260, 4), + be_nested_string("lv_area", -1773816895, 7), + }), + (be_nested_const_str("init", 380752755, 4)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[31]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 R256 + 0x88100701, // 0001 GETMBR R4 R3 R257 + 0x60140014, // 0002 GETGBL R5 G20 + 0x5C180000, // 0003 MOVE R6 R0 + 0x881C0702, // 0004 GETMBR R7 R3 R258 + 0x7C140400, // 0005 CALL R5 2 + 0x8C140B03, // 0006 GETMET R5 R5 R259 + 0x5C1C0200, // 0007 MOVE R7 R1 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C140600, // 0009 CALL R5 3 + 0x8C140105, // 000A GETMET R5 R0 R261 + 0x7C140200, // 000B CALL R5 1 + 0x90020805, // 000C SETMBR R0 R260 R5 + 0x8C140106, // 000D GETMET R5 R0 R262 + 0x881C0107, // 000E GETMBR R7 R0 R263 + 0x7C140400, // 000F CALL R5 2 + 0x54160063, // 0010 LDINT R5 100 + 0x90021005, // 0011 SETMBR R0 R264 R5 + 0x8C14070A, // 0012 GETMET R5 R3 R266 + 0x7C140200, // 0013 CALL R5 1 + 0x90021205, // 0014 SETMBR R0 R265 R5 + 0x8C14070A, // 0015 GETMET R5 R3 R266 + 0x7C140200, // 0016 CALL R5 1 + 0x90021605, // 0017 SETMBR R0 R267 R5 + 0x8C14070D, // 0018 GETMET R5 R3 R269 + 0x7C140200, // 0019 CALL R5 1 + 0x90021805, // 001A SETMBR R0 R268 R5 + 0x8C14070F, // 001B GETMET R5 R3 R271 + 0x7C140200, // 001C CALL R5 1 + 0x90021C05, // 001D SETMBR R0 R270 R5 + 0x80000000, // 001E RET 0 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_percentage +********************************************************************/ +be_local_closure(set_percentage, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + be_nested_string("percentage", -1756136011, 10), + be_const_int(0), + be_nested_string("invalidate", -1645232368, 10), + }), + (be_nested_const_str("set_percentage", -1342944572, 14)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[18]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x540E0004, // 0001 LDINT R3 5 + 0x0C080403, // 0002 DIV R2 R2 R3 + 0x540E0063, // 0003 LDINT R3 100 + 0x240C0203, // 0004 GT R3 R1 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x54060063, // 0006 LDINT R1 100 + 0x140C0301, // 0007 LT R3 R1 R257 + 0x780E0000, // 0008 JMPF R3 #000A + 0x58040001, // 0009 LDCONST R1 K1 + 0x90020001, // 000A SETMBR R0 R256 R1 + 0x540E0004, // 000B LDINT R3 5 + 0x0C0C0203, // 000C DIV R3 R1 R3 + 0x200C0403, // 000D NE R3 R2 R3 + 0x780E0001, // 000E JMPF R3 #0011 + 0x8C0C0102, // 000F GETMET R3 R0 R258 + 0x7C0C0200, // 0010 CALL R3 1 + 0x80000000, // 0011 RET 0 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: lv_signal_bars +********************************************************************/ +extern const bclass be_class_lv_obj; +be_local_class(lv_signal_bars, + 6, + &be_class_lv_obj, + be_nested_map(10, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_nested_key("p1", -1605446022, 2, -1), be_const_index(2) }, + { be_nested_key("my_design_cb", -1173588798, 12, -1), be_const_closure(my_design_cb_closure) }, + { be_nested_key("get_percentage", -1414483304, 14, -1), be_const_closure(get_percentage_closure) }, + { be_nested_key("init", 380752755, 4, 7), be_const_closure(init_closure) }, + { be_nested_key("set_percentage", -1342944572, 14, 0), be_const_closure(set_percentage_closure) }, + { be_nested_key("percentage", -1756136011, 10, 3), be_const_index(1) }, + { be_nested_key("area", -1693507260, 4, -1), be_const_index(5) }, + { be_nested_key("p2", -1622223641, 2, -1), be_const_index(3) }, + { be_nested_key("line_dsc", -200476318, 8, 1), be_const_index(4) }, + { be_nested_key("ancestor_design", 421545719, 15, -1), be_const_index(0) }, + })), + (be_nested_const_str("lv_signal_bars", -780994737, 14)) +); +/*******************************************************************/ + +void be_load_lv_signal_bars_class(bvm *vm) { + be_pushntvclass(vm, &be_lv_signal_bars_class); + be_setglobal(vm, "lv_signal_bars"); + be_pop(vm, 1); +} + +#endif // USE_LVGL \ No newline at end of file diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index 1654aa804..103a2d536 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -112,6 +112,8 @@ extern void be_load_lvgl_cb_lib(bvm *vm); extern void be_load_lvgl_cb_all_lib(bvm *vm); extern void be_load_lvgl_ctypes_lib(bvm *vm); extern void be_load_ctypes_definitions_lib(bvm *vm); +// custom widgets +extern void be_load_lv_signal_bars_class(bvm *vm); #endif// USE_LVGL /* this code loads the native class definitions */ @@ -143,6 +145,8 @@ BERRY_API void be_load_custom_libs(bvm *vm) be_load_lvgl_cb_all_lib(vm); be_load_lvgl_ctypes_lib(vm); be_load_ctypes_definitions_lib(vm); + // custom widgets + be_load_lv_signal_bars_class(vm); #endif // USE_LVGL } #endif diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index 6f8cb8bc4..40f4ac14b 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -1851,54 +1851,47 @@ static const bclosure wire_scan_closure = { /******************************************************************** ** Solidified function: time_str ********************************************************************/ - -/********** Solidified proto: time_str */ -be_define_local_const_str(time_str_str_name, "time_str", -1681139684, 8); -be_define_local_const_str(time_str_str_source, "input", -103256197, 5); -be_define_local_const_str(time_str_str_0, "string", 398550328, 6); -be_define_local_const_str(time_str_str_1, "time_dump", -964556549, 9); -be_define_local_const_str(time_str_str_2, "format", -1180859054, 6); -be_define_local_const_str(time_str_str_3, "%04d-%02d-%02dT%02d:%02d:%02d", -869438695, 29); -be_define_local_const_str(time_str_str_4, "year", -1367388900, 4); -be_define_local_const_str(time_str_str_5, "month", -696646139, 5); -be_define_local_const_str(time_str_str_6, "day", -464576003, 3); -be_define_local_const_str(time_str_str_7, "hour", -1241306097, 4); -be_define_local_const_str(time_str_str_8, "min", -913357481, 3); -be_define_local_const_str(time_str_str_9, "sec", -1155074638, 3); - -static const bvalue time_str_ktab[10] = { - { { .s=be_local_const_str(time_str_str_0) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_1) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_2) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_3) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_4) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_5) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_6) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_7) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_8) }, BE_STRING}, - { { .s=be_local_const_str(time_str_str_9) }, BE_STRING}, -}; - -static const uint32_t time_str_code[14] = { - 0xA40A0000, // 0000 IMPORT R2 R256 - 0x8C0C0101, // 0001 GETMET R3 R0 R257 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x8C100502, // 0004 GETMET R4 R2 R258 - 0x58180003, // 0005 LDCONST R6 K3 - 0x941C0704, // 0006 GETIDX R7 R3 R260 - 0x94200705, // 0007 GETIDX R8 R3 R261 - 0x94240706, // 0008 GETIDX R9 R3 R262 - 0x94280707, // 0009 GETIDX R10 R3 R263 - 0x942C0708, // 000A GETIDX R11 R3 R264 - 0x94300709, // 000B GETIDX R12 R3 R265 - 0x7C101000, // 000C CALL R4 8 - 0x80040800, // 000D RET 1 R4 -}; - -be_define_local_proto(time_str, 13, 2, 1, 0, 0); -be_define_local_closure(time_str); - +be_local_closure(time_str, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + be_nested_string("string", 398550328, 6), + be_nested_string("time_dump", -964556549, 9), + be_nested_string("format", -1180859054, 6), + be_nested_string("%04d-%02d-%02dT%02d:%02d:%02d", -869438695, 29), + be_nested_string("year", -1367388900, 4), + be_nested_string("month", -696646139, 5), + be_nested_string("day", -464576003, 3), + be_nested_string("hour", -1241306097, 4), + be_nested_string("min", -913357481, 3), + be_nested_string("sec", -1155074638, 3), + }), + (be_nested_const_str("time_str", -1681139684, 8)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[14]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 R256 + 0x8C0C0101, // 0001 GETMET R3 R0 R257 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x8C100502, // 0004 GETMET R4 R2 R258 + 0x58180003, // 0005 LDCONST R6 K3 + 0x941C0704, // 0006 GETIDX R7 R3 R260 + 0x94200705, // 0007 GETIDX R8 R3 R261 + 0x94240706, // 0008 GETIDX R9 R3 R262 + 0x94280707, // 0009 GETIDX R10 R3 R263 + 0x942C0708, // 000A GETIDX R11 R3 R264 + 0x94300709, // 000B GETIDX R12 R3 R265 + 0x7C101000, // 000C CALL R4 8 + 0x80040800, // 000D RET 1 R4 + }) + ) +); /*******************************************************************/ /******************************************************************** @@ -2174,115 +2167,112 @@ static const bclosure set_light_closure = { /*******************************************************************/ - /******************************************************************** ** Solidified function: cb_dispatch ********************************************************************/ - -/********** Solidified proto: cb_dispatch */ -be_define_local_const_str(cb_dispatch_str_name, "cb_dispatch", 1741510499, 11); -be_define_local_const_str(cb_dispatch_str_source, "input", -103256197, 5); -be_define_local_const_str(cb_dispatch_str_0, "_cb", -251666929, 3); -be_define_local_const_str(cb_dispatch_str_2, "find", -1108310694, 4); - -static const bvalue cb_dispatch_ktab[3] = { - { { .s=be_local_const_str(cb_dispatch_str_0) }, BE_STRING}, - { { .i=0 }, BE_INT}, - { { .s=be_local_const_str(cb_dispatch_str_2) }, BE_STRING}, -}; - -static const uint32_t cb_dispatch_code[20] = { - 0x88180100, // 0000 GETMBR R6 R0 R256 - 0x4C1C0000, // 0001 LDNIL 7 - 0x1C180C07, // 0002 EQ R6 R6 R7 - 0x781A0000, // 0003 JMPF R6 #0005 - 0x80060200, // 0004 RET 1 R257 - 0x88180100, // 0005 GETMBR R6 R0 R256 - 0x8C180D02, // 0006 GETMET R6 R6 R258 - 0x5C200200, // 0007 MOVE R8 R1 - 0x7C180400, // 0008 CALL R6 2 - 0x4C1C0000, // 0009 LDNIL 7 - 0x201C0C07, // 000A NE R7 R6 R7 - 0x781E0006, // 000B JMPF R7 #0013 - 0x5C1C0C00, // 000C MOVE R7 R6 - 0x5C200400, // 000D MOVE R8 R2 - 0x5C240600, // 000E MOVE R9 R3 - 0x5C280800, // 000F MOVE R10 R4 - 0x5C2C0A00, // 0010 MOVE R11 R5 - 0x7C1C0800, // 0011 CALL R7 4 - 0x80040E00, // 0012 RET 1 R7 - 0x80060200, // 0013 RET 1 R257 -}; - -be_define_local_proto(cb_dispatch, 12, 6, 1, 0, 0); -be_define_local_closure(cb_dispatch); - +be_local_closure(cb_dispatch, /* name */ + be_nested_proto( + 12, /* nstack */ + 6, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + be_nested_string("_cb", -251666929, 3), + be_const_int(0), + be_nested_string("find", -1108310694, 4), + }), + (be_nested_const_str("cb_dispatch", 1741510499, 11)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[20]) { /* code */ + 0x88180100, // 0000 GETMBR R6 R0 R256 + 0x4C1C0000, // 0001 LDNIL 7 + 0x1C180C07, // 0002 EQ R6 R6 R7 + 0x781A0000, // 0003 JMPF R6 #0005 + 0x80060200, // 0004 RET 1 R257 + 0x88180100, // 0005 GETMBR R6 R0 R256 + 0x8C180D02, // 0006 GETMET R6 R6 R258 + 0x5C200200, // 0007 MOVE R8 R1 + 0x7C180400, // 0008 CALL R6 2 + 0x4C1C0000, // 0009 LDNIL 7 + 0x201C0C07, // 000A NE R7 R6 R7 + 0x781E0006, // 000B JMPF R7 #0013 + 0x5C1C0C00, // 000C MOVE R7 R6 + 0x5C200400, // 000D MOVE R8 R2 + 0x5C240600, // 000E MOVE R9 R3 + 0x5C280800, // 000F MOVE R10 R4 + 0x5C2C0A00, // 0010 MOVE R11 R5 + 0x7C1C0800, // 0011 CALL R7 4 + 0x80040E00, // 0012 RET 1 R7 + 0x80060200, // 0013 RET 1 R257 + }) + ) +); /*******************************************************************/ /******************************************************************** ** Solidified function: gen_cb ********************************************************************/ - -/********** Solidified proto: gen_cb */ -be_define_local_const_str(gen_cb_str_name, "gen_cb", -1049739745, 6); -be_define_local_const_str(gen_cb_str_source, "input", -103256197, 5); -be_define_local_const_str(gen_cb_str_0, "_cb", -251666929, 3); -be_define_local_const_str(gen_cb_str_2, "find", -1108310694, 4); -be_define_local_const_str(gen_cb_str_3, "_get_cb", 1448849122, 7); -be_define_local_const_str(gen_cb_str_4, "stop_iteration", -121173395, 14); -be_define_local_const_str(gen_cb_str_5, "internal_error", -1775809127, 14); -be_define_local_const_str(gen_cb_str_6, "No callback available", 633786138, 21); - -static const bvalue gen_cb_ktab[7] = { - { { .s=be_local_const_str(gen_cb_str_0) }, BE_STRING}, - { { .i=0 }, BE_INT}, - { { .s=be_local_const_str(gen_cb_str_2) }, BE_STRING}, - { { .s=be_local_const_str(gen_cb_str_3) }, BE_STRING}, - { { .s=be_local_const_str(gen_cb_str_4) }, BE_STRING}, - { { .s=be_local_const_str(gen_cb_str_5) }, BE_STRING}, - { { .s=be_local_const_str(gen_cb_str_6) }, BE_STRING}, -}; - -static const uint32_t gen_cb_code[34] = { - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x4C0C0000, // 0001 LDNIL 3 - 0x1C080403, // 0002 EQ R2 R2 R3 - 0x780A0002, // 0003 JMPF R2 #0007 - 0x6008000B, // 0004 GETGBL R2 G11 - 0x7C080000, // 0005 CALL R2 0 - 0x90020002, // 0006 SETMBR R0 R256 R2 - 0x60080000, // 0007 GETGBL R2 G0 - 0x540E0012, // 0008 LDINT R3 19 - 0x400E0203, // 0009 CONNECT R3 R257 R3 - 0x7C080200, // 000A CALL R2 1 - 0xA8020010, // 000B EXBLK 0 #001D - 0x5C0C0400, // 000C MOVE R3 R2 - 0x7C0C0000, // 000D CALL R3 0 - 0x88100100, // 000E GETMBR R4 R0 R256 - 0x8C100902, // 000F GETMET R4 R4 R258 - 0x5C180600, // 0010 MOVE R6 R3 - 0x7C100400, // 0011 CALL R4 2 - 0x4C140000, // 0012 LDNIL 5 - 0x1C100805, // 0013 EQ R4 R4 R5 - 0x78120006, // 0014 JMPF R4 #001C - 0x88100100, // 0015 GETMBR R4 R0 R256 - 0x98100601, // 0016 SETIDX R4 R3 R1 - 0x8C100103, // 0017 GETMET R4 R0 R259 - 0x5C180600, // 0018 MOVE R6 R3 - 0x7C100400, // 0019 CALL R4 2 - 0xA8040001, // 001A EXBLK 1 1 - 0x80040800, // 001B RET 1 R4 - 0x7001FFEE, // 001C JMP #000C - 0x58080004, // 001D LDCONST R2 K4 - 0xAC080200, // 001E CATCH R2 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0xB0060B06, // 0020 RAISE 1 R261 R262 - 0x80000000, // 0021 RET 0 R0 -}; - -be_define_local_proto(gen_cb, 7, 2, 1, 0, 0); -be_define_local_closure(gen_cb); - +be_local_closure(gen_cb, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + be_nested_string("_cb", -251666929, 3), + be_const_int(0), + be_nested_string("find", -1108310694, 4), + be_nested_string("_get_cb", 1448849122, 7), + be_nested_string("stop_iteration", -121173395, 14), + be_nested_string("internal_error", -1775809127, 14), + be_nested_string("No callback available", 633786138, 21), + }), + (be_nested_const_str("gen_cb", -1049739745, 6)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[34]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x4C0C0000, // 0001 LDNIL 3 + 0x1C080403, // 0002 EQ R2 R2 R3 + 0x780A0002, // 0003 JMPF R2 #0007 + 0x6008000B, // 0004 GETGBL R2 G11 + 0x7C080000, // 0005 CALL R2 0 + 0x90020002, // 0006 SETMBR R0 R256 R2 + 0x60080000, // 0007 GETGBL R2 G0 + 0x540E0012, // 0008 LDINT R3 19 + 0x400E0203, // 0009 CONNECT R3 R257 R3 + 0x7C080200, // 000A CALL R2 1 + 0xA8020010, // 000B EXBLK 0 #001D + 0x5C0C0400, // 000C MOVE R3 R2 + 0x7C0C0000, // 000D CALL R3 0 + 0x88100100, // 000E GETMBR R4 R0 R256 + 0x8C100902, // 000F GETMET R4 R4 R258 + 0x5C180600, // 0010 MOVE R6 R3 + 0x7C100400, // 0011 CALL R4 2 + 0x4C140000, // 0012 LDNIL 5 + 0x1C100805, // 0013 EQ R4 R4 R5 + 0x78120006, // 0014 JMPF R4 #001C + 0x88100100, // 0015 GETMBR R4 R0 R256 + 0x98100601, // 0016 SETIDX R4 R3 R1 + 0x8C100103, // 0017 GETMET R4 R0 R259 + 0x5C180600, // 0018 MOVE R6 R3 + 0x7C100400, // 0019 CALL R4 2 + 0xA8040001, // 001A EXBLK 1 1 + 0x80040800, // 001B RET 1 R4 + 0x7001FFEE, // 001C JMP #000C + 0x58080004, // 001D LDCONST R2 K4 + 0xAC080200, // 001E CATCH R2 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB0060B06, // 0020 RAISE 1 R261 R262 + 0x80000000, // 0021 RET 0 R0 + }) + ) +); /*******************************************************************/ diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 6eba22307..98b95544e 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -266,6 +266,7 @@ extern const bcstring be_const_str_load_freetype_font; extern const bcstring be_const_str_lv_draw_mask_map_param; extern const bcstring be_const_str_lv_draw_mask_radius_param; extern const bcstring be_const_str_write; +extern const bcstring be_const_str_toint; extern const bcstring be_const_str_BACKLIGHT; extern const bcstring be_const_str_FALLING; extern const bcstring be_const_str_ROT1B_NP; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index e0be7be64..ed636ab69 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -266,6 +266,7 @@ be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18 be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_lv_draw_mask_radius_param); be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_write); be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_FALLING); be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_ROT1B_NP); be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_ZIGBEE_RX); @@ -787,7 +788,7 @@ static const bstring* const m_string_table[] = { (const bstring *)&be_const_str_gamma8, (const bstring *)&be_const_str_BUZZER, (const bstring *)&be_const_str_RDM6300_RX, - NULL, + (const bstring *)&be_const_str_toint, (const bstring *)&be_const_str_BACKLIGHT, (const bstring *)&be_const_str_ILI9341_CS, (const bstring *)&be_const_str_SYMBOL_WARNING, @@ -980,6 +981,6 @@ static const bstring* const m_string_table[] = { static const struct bconststrtab m_const_string_table = { .size = 318, - .count = 636, + .count = 637, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h index fb031e934..e688d2573 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_color.h @@ -3,12 +3,13 @@ static be_define_const_map_slots(be_class_lv_color_map) { { be_const_key(init, -1), be_const_func(lco_init) }, { be_const_key(tostring, 2), be_const_func(lco_tostring) }, - { be_const_key(dot_p, -1), be_const_index(0) }, + { be_const_key(toint, -1), be_const_func(lco_toint) }, + { be_const_key(dot_p, 0), be_const_index(0) }, }; static be_define_const_map( be_class_lv_color_map, - 3 + 4 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index f549604e0..262933de0 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -43,10 +43,18 @@ static void m_solidify_bvalue(bvm *vm, bvalue * value) logfmt("be_const_bool(%i)", var_tobool(value)); break; case BE_INT: +#if BE_INTGER_TYPE == 2 + logfmt("be_const_int(%lli)", var_toint(value)); +#else logfmt("be_const_int(%i)", var_toint(value)); +#endif break; case BE_INDEX: +#if BE_INTGER_TYPE == 2 + logfmt("be_const_index(%lli)", var_toint(value)); +#else logfmt("be_const_index(%i)", var_toint(value)); +#endif break; case BE_REAL: #if BE_USE_SINGLE_FLOAT @@ -199,11 +207,14 @@ static void m_solidify_class(bvm *vm, bclass *cl, int builtins) logfmt("** Solidified class: %s\n", class_name); logfmt("********************************************************************/\n"); + if (cl->super) { + logfmt("extern const bclass be_class_%s;\n", str(cl->super->name)); + } logfmt("be_local_class(%s,\n", class_name); logfmt(" %i,\n", cl->nvar); if (cl->super) { - logfmt(" &be_%s_class,\n", str(cl->super->name)); + logfmt(" &be_class_%s,\n", str(cl->super->name)); } else { logfmt(" NULL,\n"); } diff --git a/lib/libesp32/Berry/src/berry.h b/lib/libesp32/Berry/src/berry.h index ab301a2ea..d71d015f4 100644 --- a/lib/libesp32/Berry/src/berry.h +++ b/lib/libesp32/Berry/src/berry.h @@ -352,20 +352,9 @@ typedef struct bntvmodule { PROTO_VAR_INFO_BLOCK \ } -#define be_define_local_closure(_name) \ - const bclosure _name##_closure = { \ - NULL, /* bgcobject *next */ \ - BE_CLOSURE, /* type BE_CLOSURE */ \ - GC_CONST, /* marked GC_CONST */ \ - 0, /* nupvals */ \ - NULL, /* bgcobject *gray */ \ - (bproto*) &_name##_proto, /* proto */ \ - { NULL } /* upvals */ \ - } - /* new version for more compact literals */ #define be_local_closure(_name, _proto) \ - const bclosure _name##_closure = { \ + static const bclosure _name##_closure = { \ NULL, /* bgcobject *next */ \ BE_CLOSURE, /* type BE_CLOSURE */ \ GC_CONST, /* marked GC_CONST */ \ diff --git a/tasmota/berry/lvgl_examples/lvgl_demo.be b/tasmota/berry/lvgl_examples/lvgl_demo.be new file mode 100644 index 000000000..34b0a735d --- /dev/null +++ b/tasmota/berry/lvgl_examples/lvgl_demo.be @@ -0,0 +1,159 @@ +lv.start() + +hres = lv.get_hor_res() +vres = lv.get_ver_res() + +scr = lv.scr_act() +f20 = lv.montserrat_font(20) + +scr.set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0x0000A0)) +scr.set_style_local_bg_grad_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0x000000)) +scr.set_style_local_bg_grad_dir(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv.GRAD_DIR_VER) + +log = lv_label(scr) +if f20 != nil log.set_style_local_text_font(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, f20) end +log.set_long_mode(lv.LABEL_LONG_SROLL) +log.set_width(hres) +log.set_align(lv.LABEL_ALIGN_LEFT) +log.set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0xD00000)) +log.set_style_local_bg_opa(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv.OPA_COVER) +log.set_style_local_text_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0xFFFFFF)) +log.set_text("Welcome to Tasmota") + +tastyle = lv_style() +tastyle.set_bg_color(lv.STATE_DEFAULT, lv_color(0x1fa3ec)) +tastyle.set_border_color(lv.STATE_DEFAULT, lv_color(0x0000FF)) +tastyle.set_bg_color(lv.STATE_FOCUSED, lv_color(0x0000FF)) +tastyle.set_border_color(lv.STATE_FOCUSED, lv_color(0xFFFFFF)) +tastyle.set_text_color(lv.STATE_DEFAULT, lv_color(0xFFFFFF)) +tastyle.set_radius(lv.STATE_DEFAULT, 10) +tastyle.set_bg_opa(lv.STATE_DEFAULT, lv.OPA_COVER) +if f20 != nil tastyle.set_text_font(lv.STATE_DEFAULT, f20) end + +prev_btn = lv_btn(scr) +prev_btn.set_pos(20,vres-40) +prev_btn.set_size(80, 30) +prev_btn.add_style(lv.OBJ_PART_MAIN, tastyle) +prev_label = lv_label(prev_btn) +prev_label.set_text("<") + +next_btn = lv_btn(scr) +next_btn.set_pos(220,vres-40) +next_btn.set_size(80, 30) +next_btn.add_style(lv.OBJ_PART_MAIN, tastyle) +next_label = lv_label(next_btn) +next_label.set_text(">") + +home_btn = lv_btn(scr) +home_btn.set_pos(120,vres-40) +home_btn.set_size(80, 30) +home_btn.add_style(lv.OBJ_PART_MAIN, tastyle) +home_label = lv_label(home_btn) +home_label.set_text(lv.SYMBOL_OK) + + + + +class lv_signal_bars : lv_obj + var ancestor_design # previous design_cb + var percentage + var p1, p2, line_dsc, area + + def init(parent, copy) + import global + var lv = global.lv + # init parent object + super(self, global.lv_obj).init(parent, copy) + # keep a copy of + self.ancestor_design = self.get_design_cb() + self.set_design_cb(self.my_design_cb) + # own values + self.percentage = 100 + # pre-allocate buffers + self.p1 = global.lv_point() + self.p2 = global.lv_point() + self.line_dsc = global.lv_draw_line_dsc() + self.area = global.lv_area() + end + + def my_design_cb(area, mode) + import global + var lv = global.lv + def atleast1(x) if x >= 1 return x else return 1 end end + # the model is that we have 4 bars and inter-bar (1/4 of width) + var height = self.get_height() + var width = self.get_width() + + var inter_bar = atleast1(width / 15) + var bar = atleast1((width - inter_bar * 3) / 4) + var bar_offset = bar / 2 + + if mode == lv.DESIGN_COVER_CHK + #- Return false if the object is not covers the clip_area area -# + return self.ancestor_design.call(self, area, mode) + + elif mode == lv.DESIGN_DRAW_MAIN + #self.ancestor_design.call(self, area, mode) - don't draw a background + + # get coordinates of area + self.get_coords(area) + var x_ofs = area.x1 + var y_ofs = area.y1 + + lv.draw_line_dsc_init(self.line_dsc) + self.init_draw_line_dsc(lv.OBJ_PART_MAIN, self.line_dsc) + + self.line_dsc.round_start = 1 + self.line_dsc.round_end = 1 + self.line_dsc.width = bar + var on_color = self.get_style_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) + var off_color = self.get_style_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) + + for i:0..3 + self.line_dsc.color = self.percentage >= (i+1)*20 ? on_color : off_color + self.p1.y = y_ofs + height - 1 - bar_offset + self.p1.x = x_ofs + i * (bar + inter_bar) + bar_offset + self.p2.y = y_ofs + ((3 - i) * (height - bar)) / 4 + bar_offset + self.p2.x = self.p1.x + lv.draw_line(self.p1, self.p2, area, self.line_dsc) + end + #elif mode == lv.DESIGN_DRAW_POST # we don't want a frame around this object + #self.ancestor_design.call(self, area, mode) + end + return lv.DESIGN_RES_OK + end + + def set_percentage(v) + var old_bars = self.percentage / 5 + if v > 100 v = 100 end + if v < 0 v = 0 end + self.percentage = v + if old_bars != v / 5 + self.invalidate() # be frugal and avoid updating the widget if it's not needed + end + end + + def get_percentage() + return self.percentage + end +end + + + + + +log_height = log.get_height() + +# log.get_style_pad_right(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) +log.set_style_local_pad_right(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, log_height+1) + +bars = lv_signal_bars(log) + +bars.set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(lv.BLACK)) + +bars.set_height(log_height) +bars.set_width(log_height) +bars.set_x(log.get_width() - log_height) + +#bars.get_style_transform_width(lv.OBJ_PART_MAIN) +#bars.get_style_transform_height(lv.OBJ_PART_MAIN) \ No newline at end of file diff --git a/tasmota/berry/lvgl_examples/signal_bars.be b/tasmota/berry/lvgl_examples/signal_bars.be index 4d4a058d2..be108e7b3 100644 --- a/tasmota/berry/lvgl_examples/signal_bars.be +++ b/tasmota/berry/lvgl_examples/signal_bars.be @@ -5,31 +5,38 @@ lv.start() -def max(a,b) if a > b return a else return b end end - class lv_signal_bars : lv_obj var ancestor_design # previous design_cb var percentage + var p1, p2, line_dsc, area def init(parent, copy) + import global + var lv = global.lv # init parent object - super(self, lv_obj).init(parent, copy) + super(self, global.lv_obj).init(parent, copy) # keep a copy of self.ancestor_design = self.get_design_cb() self.set_design_cb(self.my_design_cb) # own values self.percentage = 100 - # set default style - self.set_style_local_bg_opa(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv.OPA_TRANSP) + # pre-allocate buffers + self.p1 = global.lv_point() + self.p2 = global.lv_point() + self.line_dsc = global.lv_draw_line_dsc() + self.area = global.lv_area() end def my_design_cb(area, mode) + import global + var lv = global.lv + def atleast1(x) if x >= 1 return x else return 1 end end # the model is that we have 4 bars and inter-bar (1/4 of width) var height = self.get_height() var width = self.get_width() - var inter_bar = max(width / 15, 1) - var bar = max((width - inter_bar * 3) / 4, 1) + var inter_bar = atleast1(width / 15) + var bar = atleast1((width - inter_bar * 3) / 4) var bar_offset = bar / 2 if mode == lv.DESIGN_COVER_CHK @@ -37,29 +44,53 @@ class lv_signal_bars : lv_obj return self.ancestor_design.call(self, area, mode) elif mode == lv.DESIGN_DRAW_MAIN - self.ancestor_design.call(self, area, mode) - var line_dsc = lv_draw_line_dsc() - lv.draw_line_dsc_init(line_dsc) + #self.ancestor_design.call(self, area, mode) - don't draw a background + + # get coordinates of area + self.get_coords(area) + var x_ofs = area.x1 + var y_ofs = area.y1 - line_dsc.round_start = 1 - line_dsc.round_end = 1 - line_dsc.width = bar - line_dsc.color = 0xF0F - var p1 = lv_point() - var p2 = lv_point() + lv.draw_line_dsc_init(self.line_dsc) + self.init_draw_line_dsc(lv.OBJ_PART_MAIN, self.line_dsc) + + self.line_dsc.round_start = 1 + self.line_dsc.round_end = 1 + self.line_dsc.width = bar + var on_color = self.get_style_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) + var off_color = self.get_style_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) for i:0..3 - p1.y = height - 1 - bar_offset - p1.x = i * (bar + inter_bar) + bar_offset - p2.y = ((3 - i) * (height - bar)) / 4 + bar_offset - p2.x = p1.x - lv.draw_line(p1, p2, area, line_dsc) + self.line_dsc.color = self.percentage >= (i+1)*20 ? on_color : off_color + self.p1.y = y_ofs + height - 1 - bar_offset + self.p1.x = x_ofs + i * (bar + inter_bar) + bar_offset + self.p2.y = y_ofs + ((3 - i) * (height - bar)) / 4 + bar_offset + self.p2.x = self.p1.x + lv.draw_line(self.p1, self.p2, area, self.line_dsc) end #elif mode == lv.DESIGN_DRAW_POST # we don't want a frame around this object #self.ancestor_design.call(self, area, mode) end return lv.DESIGN_RES_OK end + + def set_percentage(v) + var old_bars = self.percentage / 5 + if v > 100 v = 100 end + if v < 0 v = 0 end + self.percentage = v + if old_bars != v / 5 + self.invalidate() # be frugal and avoid updating the widget if it's not needed + end + end + + def get_percentage() + return self.percentage + end end bars = lv_signal_bars(lv.scr_act()) +bars.set_height(16) +bars.set_width(16) +bars.set_percentage(45) +bars.set_style_local_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0xFF8000)) \ No newline at end of file diff --git a/tasmota/berry/modules/ctypes.be b/tasmota/berry/modules/ctypes.be index 5898a4690..15ec12853 100644 --- a/tasmota/berry/modules/ctypes.be +++ b/tasmota/berry/modules/ctypes.be @@ -59,6 +59,13 @@ ctypes.bf_13 = 113 ctypes.bf_14 = 114 ctypes.bf_15 = 115 +def findinlist(l, x) + for i:0..size(l)-1 + if l[i] == x + return i + end + end +end #------------------------------------------------------------- #- 'get_bits' function @@ -151,34 +158,87 @@ end #- print the C types -#1 ctypes.print_types = def () + print("/********************************************************************") + print(" * Generated code, don't edit") + print(" *******************************************************************/") + print() print("enum {") - print(" ctypes_ptr = 0,") - print(" ctypes_uint = 1,") - print(" ctypes_int = 2,") - print(" ctypes_str = 3,") + print(" ctypes_i32 = 14,") + print(" ctypes_i16 = 12,") + print(" ctypes_i8 = 11,") + print(" ctypes_u32 = 4,") + print(" ctypes_u16 = 2,") + print(" ctypes_u8 = 1,") + print("") + print(" // big endian") + print(" ctypes_be_i32 = -14,") + print(" ctypes_be_i16 = -12,") + print(" ctypes_be_i8 = -11,") + print(" ctypes_be_u32 = -4,") + print(" ctypes_be_u16 = -2,") + print(" ctypes_be_u8 = -1,") + print() + print(" ctypes_bf = 0, //bif-field") print("};") print() print("typedef struct be_ctypes_structure_item_t {") - print(" const char * name;") - print(" uint16_t offset_bits;") - print(" uint16_t len_bits : 13;") - print(" uint16_t type : 3;") + print(" const char * name;") + print(" uint16_t offset_bytes;") + print(" uint8_t offset_bits : 3;") + print(" uint8_t len_bits : 5;") + print(" int8_t type : 5;") + print(" uint8_t mapping : 3;") print("} be_ctypes_structure_item_t;") print() print("typedef struct be_ctypes_structure_t {") - print(" uint16_t size_bytes; /* size in bytes */") - print(" uint16_t size_elt; /* number of elements */") - print(" const be_ctypes_structure_item_t * items;") + print(" uint16_t size_bytes; /* size in bytes */") + print(" uint16_t size_elt; /* number of elements */") + print(" const be_ctypes_structure_item_t * items;") print("} be_ctypes_structure_t;") print() + print("typedef struct be_ctypes_class_t {") + print(" const char * name;") + print(" const be_ctypes_structure_t * definitions;") + print("} be_ctypes_class_t;") + print("") + print("typedef struct be_ctypes_classes_t {") + print(" uint16_t size;") + print(" const char **instance_mapping; /* array of instance class names for automatic instanciation of class */") + print(" const be_ctypes_class_t * classes;") + print("} be_ctypes_classes_t;") + print() + print("BE_EXPORT_VARIABLE extern const bclass be_class_lv_ctypes;") + print() + print("void ctypes_register_class(bvm *vm, const bclass * ctypes_class, const be_ctypes_structure_t * definitions) {") + print(" be_pushntvclass(vm, ctypes_class);") + print(" be_setglobal(vm, str(ctypes_class->name));") + print(" be_pop(vm, 1);") + print("}") + print() + print("/********************************************************************/") end -global_classes = [] # track the list of all classes and +global_classes = [] # track the list of all classes and +global_mappings = [] # mapping to Berry classes, ex: lv_color + ctypes.print_classes = def () + # print mappings + if size(global_mappings) > 7 + raise "internal_error", "too many mappings, 7 max" + end + print("const char * be_ctypes_instance_mappings[] = {") + for n:global_mappings.iter() + print(string.format(" \"%s\",", n)) + end + print(" NULL") + print("};") + print() + ctypes.sort(global_classes) print("const be_ctypes_classes_t be_ctypes_classes[] = {") print(string.format(" %i,", size(global_classes))) + print(string.format(" be_ctypes_instance_mappings,")) print(string.format(" (const be_ctypes_class_t[%i]) {", size(global_classes))) for elt:global_classes @@ -207,6 +267,8 @@ ctypes.print_classes = def () end print("}") + print("/********************************************************************/") + print() end #------------------------------------------------------------- @@ -261,7 +323,7 @@ class structure ctypes.sort(names) for n:names var args = self.mapping[n] - print(string.format(" { \"%s\", %i, %i, %i, %i },", n, args[0], args[1], args[2], args[3])) + print(string.format(" { \"%s\", %i, %i, %i, %i, %i },", n, args[0], args[1], args[2], args[3], args[4])) end print("}};") print() @@ -285,14 +347,29 @@ class structure if isinstance(type_obj, ctypes.structure) # nested structure self.nested(name, type_obj) - elif type(type_obj) == 'int' + end + + var mapping_idx = 0 # mapping starts at 1 + if isinstance(type_obj, list) + # it may be a list to denote a mapping to an instance + var mapping_name = type_obj[1] + if findinlist(global_mappings, mapping_name) == nil + global_mappings.push(mapping_name) + end + mapping_idx = findinlist(global_mappings, mapping_name) + 1 + + type_obj = type_obj[0] # take the simple value of first element in the list + end + + if type(type_obj) == 'int' + # simple attibute # TODO check actual type if type_obj > ctypes.bf_0 # bit field - self.get_bitfield_closure(name, type_obj - ctypes.bf_0) + self.get_bitfield_closure(name, type_obj - ctypes.bf_0, mapping_idx) else # multi-bytes - self.get_int_closure(name, type_obj) + self.get_int_closure(name, type_obj, mapping_idx) end end end @@ -329,7 +406,7 @@ class structure # include nested for subname:type_obj.mapping.keys() var val = type_obj.mapping[subname] - self.mapping[name+"_"+subname] = [val[0] + offset, val[1], val[2], val[3]] + self.mapping[name+"_"+subname] = [val[0] + offset, val[1], val[2], val[3], val[4]] end # self.mapping[name] = [offset << 3, sub_size << 3] @@ -339,7 +416,7 @@ class structure self.cur_offset += sub_size end - def get_int_closure(name, type) # can be 1/2/4 + def get_int_closure(name, type, instance_mapping) # can be 1/2/4 #- abs size -# var size_in_bytes = type < 0 ? - type : type var signed = size_in_bytes > 10 @@ -349,7 +426,7 @@ class structure self.align(size_in_bytes) # force alignment var offset = self.cur_offset # prepare variable for capture in closure - self.mapping[name] = [offset, 0, 0, type] + self.mapping[name] = [offset, 0, 0, type, instance_mapping] #- add closures -# if signed @@ -363,10 +440,10 @@ class structure end - def get_bitfield_closure(name, size_in_bits) # can be 1..32 + def get_bitfield_closure(name, size_in_bits, instance_mapping) # can be 1..32 var cur_offset = self.cur_offset # prepare variable for capture in closure var bit_offset = self.bit_offset - self.mapping[name] = [cur_offset, bit_offset, size_in_bits, 0] + self.mapping[name] = [cur_offset, bit_offset, size_in_bits, 0, instance_mapping] self.get_closures[name] = def (b, p) return ctypes.get_bits(b, cur_offset + p, bit_offset, size_in_bits) end self.set_closures[name] = def (b, p, v) return ctypes.set_bits(b, cur_offset+ p, bit_offset, size_in_bits, v) end @@ -520,93 +597,3 @@ return ctypes 16777472 -# - -# def get_bits(b, offset_bytes, offset_bits, len_bits) -# if !isinstance(b, bytes) raise "value_error", "first argument must be of type 'bytes'" end -# if offset_bits < 0 || offset_bits > 7 raise "value_error", "offset_bits must be between 0 and 7" end -# if len_bits <= 0 || len_bits > 32 raise "value_error", "length in bits must be between 0 and 32" end -# var ret = 0 - -# var bit_shift = 0 # bit number to wrtie to - -# while (len_bits > 0) -# var block_bits = 8 - offset_bits # bit number to read in current block (block = byte) -# if block_bits > len_bits block_bits = len_bits end - -# var mask = ( (1<> offset_bits) << bit_shift) - -# # move the input window -# bit_shift += block_bits -# len_bits -= block_bits -# offset_bits = 0 # start at full next byte -# offset_bytes += 1 -# end - -# return ret -# end - -# Test - -# b=bytes("AAFF10") -# assert(get_bits(b, 0, 0, 1) == 0) -# assert(get_bits(b, 0, 1, 1) == 1) -# assert(get_bits(b, 0, 2, 1) == 0) -# assert(get_bits(b, 0, 3, 1) == 1) - -# assert(get_bits(b, 0, 0, 2) == 2) -# assert(get_bits(b, 0, 1, 2) == 1) -# assert(get_bits(b, 0, 2, 2) == 2) - -# assert(get_bits(b, 0, 0, 8) == 0xAA) -# assert(get_bits(b, 0, 0, 10) == 0x3AA) -# assert(get_bits(b, 0, 2, 8) == 0xEA) - -# assert(get_bits(b, 1, 0, 8) == 0xFF) -# assert(get_bits(b, 1, 0, 10) == 0x0FF) - -# assert(get_bits(b, 1, 0, 16) == 0x10FF) - - -# assert(get_bits(b, 1, 7, 4) == 0x01) -# assert(get_bits(b, 1, 7, 6) == 0x21) - -# def set_bits(b, offset_bytes, offset_bits, len_bits, val) -# if !isinstance(b, bytes) raise "value_error", "first argument must be of type 'bytes'" end -# if offset_bits < 0 || offset_bits > 7 raise "value_error", "offset_bits must be between 0 and 7" end -# if len_bits <= 0 || len_bits > 32 raise "value_error", "length in bits must be between 0 and 32" end - -# while (len_bits > 0) -# var block_bits = 8 - offset_bits # how many bits to write in the current block (block = byte) -# if block_bits > len_bits block_bits = len_bits end - -# var mask_val = (1<>= block_bits -# len_bits -= block_bits -# offset_bits = 0 # start at full next byte -# offset_bytes += 1 -# end -# return b -# end - -# b=bytes("00000000") - -# assert(set_bits(b,0,0,1,1) == bytes('01000000')) -# assert(set_bits(b,1,0,1,1) == bytes('01010000')) -# assert(set_bits(b,0,0,1,2) == bytes('00010000')) -# assert(set_bits(b,0,4,1,1) == bytes('10010000')) -# assert(set_bits(b,0,4,1,0) == bytes('00010000')) - -# b=bytes("FF000000") -# assert(set_bits(b,0,4,1,0) == bytes('EF000000')) -# assert(set_bits(b,0,4,1,1) == bytes('FF000000')) - -# b=bytes("00000000") -# assert(set_bits(b,2,6,1,-1) == bytes('00004000')) -# b=bytes("00000000") -# assert(set_bits(b,2,1,6,-1) == bytes('00007E00')) \ No newline at end of file diff --git a/tasmota/berry/modules/lvgl_ctypes.be b/tasmota/berry/modules/lvgl_ctypes.be index 61b3fdf7c..7238ad621 100644 --- a/tasmota/berry/modules/lvgl_ctypes.be +++ b/tasmota/berry/modules/lvgl_ctypes.be @@ -11,7 +11,7 @@ import ctypes ctypes.print_types() lv_style_int = ctypes.i16 -lv_color = ctypes.u16 # depends on colors +lv_color = [ctypes.u16, "lv_color"] # cast to the class instance, constructor is called with 2 args: (nil, value) lv_grad_dir = ctypes.u8 lv_opa = ctypes.u8 lv_blend_mode = ctypes.u8 diff --git a/tasmota/xdrv_52_3_berry_lvgl.ino b/tasmota/xdrv_52_3_berry_lvgl.ino index d7fe05485..2e6c302c3 100644 --- a/tasmota/xdrv_52_3_berry_lvgl.ino +++ b/tasmota/xdrv_52_3_berry_lvgl.ino @@ -439,18 +439,24 @@ extern "C" { return *col; } inline uint32_t lv_color_to_uint32(lv_color_t col) { - uint32_t *p = (uint32_t*) &col; + uint16_t *p = (uint16_t*) &col; return *p; } // lv_color + // First arg is a 24 bits RGB color + // If first arg is `nil` second arg is the native value of color int lco_init(bvm *vm) { int argc = be_top(vm); - uint32_t color = 0x0000; // default to black - if (argc > 1 && be_isint(vm, 2)) { - color = be_toint(vm, 2); + uint32_t color32 = 0x000000; // default to black + + if (argc > 1) { + color32 = be_toint(vm, 2); + } + lv_color_t lv_color = lv_color_hex(color32); + if (argc > 2 && be_toint(vm, 3) == -1) { + lv_color.full = be_toint(vm, 2); } - lv_color_t lv_color = lv_color_hex(color); be_pushint(vm, lv_color_to_uint32(lv_color)); be_setmember(vm, 1, ".p"); be_return_nil(vm); @@ -461,7 +467,7 @@ extern "C" { be_getmember(vm, 1, ".p"); uint32_t ntv_color = be_toint(vm, -1); lv_color = lv_color_from_uint32(ntv_color); - uint32_t color = lv_color_to32(lv_color); + uint32_t color = lv_color_to32(lv_color) & 0xFFFFFF; be_pop(vm, 1); // remove attribute char s[48]; snprintf(s, sizeof(s), "lv_color(0x%06x - native:0x%04x)", color, ntv_color); @@ -469,6 +475,14 @@ extern "C" { be_return(vm); } + int lco_toint(bvm *vm) { + lv_color_t lv_color = {}; + be_getmember(vm, 1, ".p"); + uint32_t ntv_color = be_toint(vm, -1); + be_pushint(vm, ntv_color); + be_return(vm); + } + /*********************************************************************************************\ * Support for lv diff --git a/tools/lv_berry/lv_widgets.h b/tools/lv_berry/lv_widgets.h index 4ec2a10ec..c88a69255 100644 --- a/tools/lv_berry/lv_widgets.h +++ b/tools/lv_berry/lv_widgets.h @@ -1223,6 +1223,7 @@ void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area void lv_draw_mask_fade_init(lv_draw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, lv_coord_t y_top, lv_opa_t opa_bottom, lv_coord_t y_bottom); void lv_draw_mask_map_init(lv_draw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map); +LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); void lv_draw_rect(const lv_area_t * coords, const lv_area_t * mask, const lv_draw_rect_dsc_t * dsc); void lv_draw_px(const lv_point_t * point, const lv_area_t * clip_area, const lv_style_t * style); @@ -1247,3 +1248,4 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); // ====================================================================== void lv_refr_now(void); +lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix); \ No newline at end of file From 392d580a97d3c886762022eae5a06a4207f5c078 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 22 Jul 2021 22:36:18 +0200 Subject: [PATCH 031/148] Berry add module ``introspect`` (#12728) * Berry add module ``introspect`` * Rename `members` --- CHANGELOG.md | 1 + lib/libesp32/Berry/default/be_modtab.c | 4 + lib/libesp32/Berry/default/berry_conf.h | 1 + lib/libesp32/Berry/generate/be_const_strtab.h | 1285 +++++------ .../Berry/generate/be_const_strtab_def.h | 1936 +++++++++-------- .../Berry/generate/be_fixed_introspect.h | 19 + lib/libesp32/Berry/src/be_api.c | 6 + lib/libesp32/Berry/src/be_introspectlib.c | 100 + lib/libesp32/Berry/src/berry.h | 1 + 9 files changed, 1744 insertions(+), 1609 deletions(-) create mode 100644 lib/libesp32/Berry/generate/be_fixed_introspect.h create mode 100644 lib/libesp32/Berry/src/be_introspectlib.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 11c1dd36e..28c5bbcde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout (#12651) - Berry ESP32 support for I2S audio mp3 playback +- Berry add module ``introspect`` ### Changed - ESP32 core library from v1.0.7.1 to v1.0.7.3 diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index 103a2d536..5991b1ba2 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -20,6 +20,7 @@ be_extern_native_module(sys); be_extern_native_module(debug); be_extern_native_module(gc); be_extern_native_module(solidify); +be_extern_native_module(introspect); /* Tasmota specific */ be_extern_native_module(light); @@ -68,6 +69,9 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { #endif #if BE_USE_SOLIDIFY_MODULE &be_native_module(solidify), +#endif +#if BE_USE_INTROSPECT_MODULE + &be_native_module(introspect), #endif /* user-defined modules register start */ diff --git a/lib/libesp32/Berry/default/berry_conf.h b/lib/libesp32/Berry/default/berry_conf.h index c50cc281a..aaa244434 100644 --- a/lib/libesp32/Berry/default/berry_conf.h +++ b/lib/libesp32/Berry/default/berry_conf.h @@ -158,6 +158,7 @@ #define BE_USE_DEBUG_MODULE 1 #define BE_USE_GC_MODULE 1 #define BE_USE_SOLIDIFY_MODULE 1 +#define BE_USE_INTROSPECT_MODULE 1 /* Macro: BE_EXPLICIT_XXX * If these macros are defined, the corresponding function will diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 98b95544e..963456f4f 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,659 +1,660 @@ -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_web_add_handler; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_I2S_IN_DATA; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_lv_sqrt_res; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_SYMBOL_CHARGE; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_TM1637DIO; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_MAX7219DIN; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_SWT1_PD; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_MGC3130_RESET; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_SDM72_TX; -extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_lv_line; extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_button_pressed; -extern const bcstring be_const_str_KEY1_INV; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str_save_before_restart; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_json_append; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_publish_result; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_INTERRUPT; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_web_add_button; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_isrunning; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_BL0940_RX; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_SDM630_TX; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_REL1_INV; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_SYMBOL_LEFT; extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_wire1; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_SDM72_TX; +extern const bcstring be_const_str___lower__; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_SSD1351_DC; extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_web_add_management_button; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_ROT1A; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_SYMBOL_MUTE; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_SM16716_SEL; extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_GPS_RX; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_web_add_main_button; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str_SR04_TRIG; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_WE517_RX; -extern const bcstring be_const_str_ZEROCROSS; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_MAX31855DO; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_web_add_console_button; +extern const bcstring be_const_str_web_sensor; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_PWM1; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_arg_size; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_screenshot; +extern const bcstring be_const_str_has_arg; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_SDM72_RX; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_SDM630_TX; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str_lv_signal_cb; +extern const bcstring be_const_str_push; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str_AudioFileSourceFS; +extern const bcstring be_const_str_LE01MR_RX; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str_AZ_TXD; extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_members; +extern const bcstring be_const_str_AS3935; +extern const bcstring be_const_str_close; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_toint; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_web_send; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_KEY1; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_get_light; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_load_font; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_SSD1351_CS; extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_lv_dropdown; extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_SYMBOL_REFRESH; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_display; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_class; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str__ccmd; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_DHT22; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_Driver; +extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_lv_obj; extern const bcstring be_const_str_reverse_gamma10; extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_lv_draw_mask_radius_param; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_toint; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str_ILI9341_CS; -extern const bcstring be_const_str_get_tasmota; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str_lv_gauge_format_cb; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_lv_draw_mask_saved; -extern const bcstring be_const_str_SYMBOL_PLAY; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_update; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str_display; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_AZ_RXD; extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_web_add_config_button; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_SSPI_DC; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_OUTPUT_LO; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_I2S_IN_CLK; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_web_add_console_button; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_I2C_SDA; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_lv_signal_cb; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_I2S_OUT_SLCT; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_TM1637CLK; -extern const bcstring be_const_str_close; -extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_PWM1_INV; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_every_50ms; -extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str_SM16716_SEL; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_ADC_TEMP; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_every_100ms; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_tan; extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str_TASMOTACLIENT_RXD; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_MAX7219CLK; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_I2S_OUT_CLK; -extern const bcstring be_const_str_NRG_SEL_INV; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_KEY1_INV_PD; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_lv_cb; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_A4988_DIR; -extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_return; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_I2S_IN_SLCT; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_I2S_OUT_DATA; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_RDM6300_RX; extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_web_sensor; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_Driver; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_RC522_CS; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_WEBCAM_PSCLK; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_SYMBOL_BULLET; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str_WEBCAM_XCLK; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_CNTR1_NP; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_CSE7766_TX; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_SYMBOL_RIGHT; extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_every_second; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_millis; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_return; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_every_100ms; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_get_tasmota; extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_I2C_SCL; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_TASMOTACLIENT_RST; extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_KEY1_PD; -extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_arg_size; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str_SYMBOL_SETTINGS; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_DI; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str_find_key_i; extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_SR04_TRIG; +extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str_SYMBOL_SHUFFLE; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_web_add_button; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_wire2; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_every_second; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_SYMBOL_PAUSE; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_web_add_handler; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_I2S_OUT_CLK; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str_DDS2382_TX; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_get; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str_SENSOR_END; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_size; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_gamma8; extern const bcstring be_const_str_elif; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str_SYMBOL_CHARGE; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_NRG_CF1; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_KEY1_TC; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_SWT1_PD; +extern const bcstring be_const_str_SYMBOL_EJECT; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_MGC3130_RESET; +extern const bcstring be_const_str_TXD; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_MGC3130_XFER; +extern const bcstring be_const_str_every_50ms; +extern const bcstring be_const_str_SI7021; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_VL53L0X_XSHUT1; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_exec_rules; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_HX711_DAT; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str_lv_draw_label_dsc; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_web_add_main_button; +extern const bcstring be_const_str_CNTR1_NP; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_web_add_config_button; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_add_rule; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_bytes; +extern const bcstring be_const_str_SYMBOL_AUDIO; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_loop; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_lv_tileview; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_SYMBOL_BATTERY_3; +extern const bcstring be_const_str_AudioGeneratorMP3; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_setbits; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_json_append; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_GPS_TX; +extern const bcstring be_const_str_SYMBOL_GPS; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_chars_in_string; +extern const bcstring be_const_str_CNTR1; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_MD5; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_OPTION_A; +extern const bcstring be_const_str_item; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_AZ_RXD; +extern const bcstring be_const_str_MIEL_HVAC_TX; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_add_cmd; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_TELEINFO_ENABLE; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_remove_cmd; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str_cmd; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_web_add_management_button; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_update; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_lv_img; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str_button_pressed; +extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_publish_result; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_read12; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_seg7_font; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_BUZZER_INV; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_save_before_restart; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_WEBCAM_SIOD; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_SYMBOL_WIFI; +extern const bcstring be_const_str__buffer; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_HX711_SCK; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_ADC_BUTTON; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_lv_spinbox; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index ed636ab69..1a2307703 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,986 +1,988 @@ -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_SSD1331_CS); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_DHT22); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_INPUT_PULLDOWN); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_TELEINFO_ENABLE); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_ARIRFRCV); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, NULL); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); -be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_SYMBOL_EDIT); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ADC_RANGE); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_lv_sqrt_res); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, &be_const_str_atan); -be_define_const_str(atan, "atan", 108579519u, 0, 4, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_lv_roller); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, &be_const_str_top); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_i2c_enabled); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, &be_const_str_chars_in_string); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_WE517_TX); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_set_timer); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SR04_ECHO); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_SYMBOL_CHARGE); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_ceil); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_clear); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_classname); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_NONE); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_TM1637DIO); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str__rules); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_SYMBOL_EYE_OPEN); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, NULL); -be_define_const_str(char, "char", 2823553821u, 0, 4, NULL); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, NULL); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_SYMBOL_DOWN); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, NULL); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_RA8876_CS); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_copy); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_exp); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_lv_design_cb); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_remove_rule); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_gen_cb); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_seg7_font); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(count, "count", 967958004u, 0, 5, NULL); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_redirect); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_lv_cpicker); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); -be_define_const_str(number, "number", 467038368u, 0, 6, NULL); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_SYMBOL_MINUS); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str__read); -be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_HALLEFFECT); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_SYMBOL_SAVE); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_TCP_RX); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_getbits); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_SYMBOL_FILE); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, NULL); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, NULL); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_name); -be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_split); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_super); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SPI_DC); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_SYMBOL_MUTE); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_SYMBOL_UPLOAD); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_ctypes_bytes); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_get_free_heap); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); -be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, NULL); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str_VL53L0X_XSHUT1); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); -be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, NULL); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_attrdump); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, NULL); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str___upper__); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_lv_line); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_tostring); be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_button_pressed); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, NULL); -be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, NULL); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_WEBCAM_PWDN); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_save_before_restart); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_IBEACON_RX); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_MCP39F5_RX); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_SDS0X1_RX); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_SYMBOL_KEYBOARD); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_json_append); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_DI); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_NRF24_DC); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_SBR_RX); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_lv_draw_mask_line_param); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_content_send_style); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_lv_style); -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_IEM3000_RX); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_Wire); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_get_light); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_SSD1351_CS); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); -be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_read24); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_try_rule); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_state); -be_define_const_str(state, "state", 2016490230u, 0, 5, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_LED1_INV); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_lv_group); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); -be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_resolvecmnd); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_web_add_button); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, &be_const_str_def); -be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_IEM3000_TX); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_NEOPOOL_RX); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_detect); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_isrunning); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, NULL); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_delay); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_imin); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_write8); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_add_cmd); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_add_rule); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_BOILER_OT_RX); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_SDM630_TX); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_upper); -be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SWT1); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_lv_point); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_dropdown); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_lv_canvas); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_as); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_CC1101_GDO0); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_SYMBOL_VOLUME_MID); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, NULL); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_SYMBOL_CUT); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_try); -be_define_const_str(try, "try", 2887626766u, 68, 3, &be_const_str_while); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_lv_draw_mask_common_dsc); -be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_insert); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str___iterator__); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_get_option); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); -be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(start, "start", 1697318111u, 0, 5, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_lv_label); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, &be_const_str_web_add_management_button); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, &be_const_str_for); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_RFSEND); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_P9813_CLK); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_linemeter); -be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_lv_btn); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_wire2); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_seti); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_content_send); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_real); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_RF_SENSOR); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_publish); -be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_web_add_main_button); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SR04_TRIG); -be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_SYMBOL_HOME); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, NULL); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_WE517_RX); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_ZEROCROSS); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, NULL); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, NULL); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_lv_draw_mask_fade_param_cfg); -be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); -be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_WEBCAM_HREF); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str_WEBCAM_VSYNC); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_lv_textarea); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_RFRECV); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_SYMBOL_UP); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_resize); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_SM16716_DAT); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_load_freetype_font); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_write); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_FALLING); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_ROT1B_NP); -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_ZIGBEE_RX); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_get_tasmota); -be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, NULL); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_exec_rules); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_lv_tabview); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_SAIR_RX); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_TXD); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str__available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_lv_obj); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_attrdump); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_TM1638CLK); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_lv_indev); -be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_INPUT_PULLUP); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_SYMBOL_WIFI); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_lv_gauge_format_cb); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_SYMBOL_BATTERY_3); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_input); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_lv_draw_mask_saved); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_Tasmota); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_read32); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_SYMBOL_BATTERY_FULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); -be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_write_bit); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_DSB); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_MAX7219CS); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_setrange); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_var); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_WEBCAM_PCLK); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_tan); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_update); -be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_TELEINFO_RX); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_memory); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str_display); -be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_SSPI_SCLK); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SWT1_NP); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_millis); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_web_add_config_button); -be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_ETH_PHY_POWER); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, NULL); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, NULL); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, NULL); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_type); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_has_arg); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SYMBOL_BATTERY_EMPTY); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, NULL); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, NULL); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, NULL); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_TASMOTACLIENT_RST); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_set_power); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_content_button); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, NULL); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_SI7021); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_iter); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_pin_mode); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_ST7789_CS); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, NULL); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); -be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_lv_chart); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_web_add_console_button); -be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); -be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_response_append); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_SYMBOL_CALL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_deinit); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_lv_signal_cb); -be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_end); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); -be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_NRG_SEL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_lv_objmask); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_close); -be_define_const_str(close, "close", 667630371u, 0, 5, NULL); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_OLED_RESET); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, NULL); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_PWM1_INV); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_AS3935); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_assert); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, NULL); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_read_bytes); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_CSE7766_RX); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, NULL); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_PMS5003_TX); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_SYMBOL_SD_CARD); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_cos); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_write_bytes); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str_SM16716_SEL); -be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_lv_tileview); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, &be_const_str_class); -be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_SYMBOL_LIST); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_lv_msgbox); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_floor); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); -be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_find_op); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_lv_table); -be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, &be_const_str_wire_scan); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_MHZ_TXD); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, NULL); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_member); -be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_static); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, NULL); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, NULL); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_SYMBOL_CLOSE); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, NULL); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_stop); -be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_lv_group_focus_cb); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, &be_const_str_lv_list); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_I2C_Driver); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_TASMOTACLIENT_RXD); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, NULL); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, NULL); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_exists); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_SOLAXX1_TX); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_calldepth); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_bus); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_raise); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); -be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_SYMBOL_STOP); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_SYMBOL_VOLUME_MAX); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_cmd); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); -be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_NRG_SEL_INV); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_lv_spinner); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_SOLAXX1_RX); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_SYMBOL_GPS); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, NULL); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_init); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_module); -be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_PMS5003_RX); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_find); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_item); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_OUTPUT_OPEN_DRAIN); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, NULL); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_true); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_rtc); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_ZIGBEE_RST); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_digital_write); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_lv_cb); -be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_scale_uint); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_LE01MR_RX); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_ROT1A_NP); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_WEBCAM_DATA); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_erase); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_ETH_PHY_MDIO); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SPI_MOSI); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_fromstring); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, NULL); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_lv_img); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, NULL); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str__request_from); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_dump); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_lv_led); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_push); -be_define_const_str(push, "push", 2272264157u, 0, 4, &be_const_str_time_dump); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, &be_const_str_return); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_ST7789_DC); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, NULL); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_run_deferred); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_WIEGAND_D0); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); -be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_add); -be_define_const_str(add, "add", 993596020u, 0, 3, NULL); -be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, NULL); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_geti); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_SHELLY_DIMMER_RST_INV); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_TCP_TX); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_codedump); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_web_sensor); -be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, NULL); -be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, &be_const_str_lv_draw_img_dsc); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_OUTPUT_HI); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_RC522_CS); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_SYMBOL_DRIVE); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_lv_switch); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_MP3_DFR562); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_WEBCAM_PSCLK); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, NULL); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_TFMINIPLUS_RX); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, NULL); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_call); -be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_int); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_lv_arc); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_concat); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_content_flush); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_bar); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_map); -be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_SYMBOL_BULLET); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, NULL); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_SYMBOL_SHUFFLE); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_hex); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_set_light); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_log10); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_SYMBOL_OK); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_log10); be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); -be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str_WEBCAM_XCLK); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str__drivers); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_lv_btnmatrix); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, &be_const_str_resp_cmnd_error); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_collect); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_loop); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, NULL); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_scan); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_content_stop); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_lv_slider); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_lv_draw_mask_fade_param); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_MD5); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, &be_const_str_read); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_SHELLY_DIMMER_BOOT0); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_check_privileged_access); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, NULL); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_content_start); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); -be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, NULL); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_range); -be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_lv_area); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, NULL); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_lv_draw_label_dsc); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_lv_draw_mask_line_param_cfg); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_event_cb); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_every_second); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_tolower); -be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_TM1638STB); +be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_IEM3000_RX); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_SSPI_SCLK); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_WEBCAM_XCLK); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_lv_keyboard); +be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_wire1); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_ST7789_CS); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_lv_draw_mask_radius_param_cfg); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_lv_list); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, NULL); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_SDM72_TX); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str___lower__); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str__drivers); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, NULL); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_SSD1351_DC); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, NULL); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_WEBCAM_RESET); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_pin); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_add); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_lv_design_cb); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, NULL); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_SM16716_DAT); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, NULL); +be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, NULL); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, NULL); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_SSPI_MOSI); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_web_add_console_button); +be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, &be_const_str_web_sensor); +be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_time_dump); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, NULL); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_SM16716_CLK); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, NULL); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_TFMINIPLUS_TX); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_begin); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_lv_roller); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, &be_const_str_seti); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, NULL); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_arg_size); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_count); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_response_append); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_number); +be_define_const_str(number, "number", 467038368u, 0, 6, NULL); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_asstring); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_try_rule); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_setmember); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_PN532_TXD); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_SDM630_TX); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_SPI_MOSI); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str__available); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_lv_draw_mask_line_param); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); +be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, NULL); +be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, NULL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_MCP39F5_TX); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_SDCARD_CS); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_LE01MR_RX); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_LOW); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, NULL); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_LEDLNK_INV); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, NULL); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, &be_const_str_def); +be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, NULL); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_rtc); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, NULL); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_NEOPOOL_RX); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_OUTPUT_HI); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_content_flush); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_TFMINIPLUS_RX); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ARIRFRCV); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_members); +be_define_const_str(members, "members", 937576464u, 0, 7, NULL); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_close); +be_define_const_str(close, "close", 667630371u, 0, 5, NULL); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_input); +be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_INPUT_PULLUP); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_toint); +be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_lv_draw_mask_angle_param_cfg); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, &be_const_str_web_send); +be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_ILI9341_DC); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_classof); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_PMS5003_RX); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_PZEM016_RX); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SPI_DC); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_map); +be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_memory); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_SYMBOL_BELL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_IBEACON_RX); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_SYMBOL_BATTERY_FULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_get_light); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_ceil); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, NULL); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_load_font); +be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_SYMBOL_SD_CARD); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str__read); +be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_resp_cmnd); be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_TX2X_TXD_BLACK); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str__begin_transmission); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_TUYA_TX); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_lv_page); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_SYMBOL_VIDEO); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_I2C_SCL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_SYMBOL_PLUS); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_MCP39F5_TX); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, NULL); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str__end_transmission); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str__timers); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_lv_spinbox); -be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); -be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, NULL); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_load_font); -be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_WEBCAM_SIOD); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str___lower__); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_yield); -be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_TUYA_RX); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str__ccmd); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_arg_size); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_lv_draw_mask_map_param_cfg); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_BACKLIGHT); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, NULL); +be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_lv_textarea); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_SSPI_MAX31865_CS1); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_SYMBOL_DIRECTORY); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_lv_event_cb); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_lv_dropdown); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_rand); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_I2S_IN_CLK); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_SYMBOL_EYE_OPEN); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_lv_style); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_IRRECV); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_OLED_RESET); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_TELEINFO_RX); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_remove_rule); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_set); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_digital_read); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_int); +be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_SYMBOL_REFRESH); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_stop); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_class); +be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_imax); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_init); +be_define_const_str(init, "init", 380752755u, 0, 4, NULL); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_RXD); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str__ccmd); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, NULL); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_SYMBOL_PASTE); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_SYMBOL_PLAY); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, NULL); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_get_free_heap); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_SBR_TX); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_type); +be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_Driver); +be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, &be_const_str_MAX7219DIN); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_TASMOTACLIENT_RXD); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_compile); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str__rules); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_SYMBOL_CUT); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str_lv_draw_mask_angle_param); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_SWT1_NP); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, NULL); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_RDM6300_RX); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_codedump); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_exp); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_gc); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_CSE7766_TX); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_NONE); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SYMBOL_EYE_CLOSE); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_millis); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_module); +be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_return); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_every_100ms); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_lv_arc); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_ctypes_bytes); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_get_tasmota); +be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, NULL); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_TASMOTACLIENT_RST); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, NULL); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_content_start); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, NULL); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_save); +be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, NULL); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SYMBOL_DRIVE); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_resp_cmnd_failed); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_cosh); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_lv_btnmatrix); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, &be_const_str_lv_checkbox); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, &be_const_str_for); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_find_key_i); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_draw_mask_map_param_cfg); be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_elif); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_REL1_INV); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lower); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); +be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_lv_cb); +be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_ZIGBEE_RST); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, NULL); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_web_add_button); +be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_lv_switch); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_start); +be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_KEY1_PD); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_OUTPUT_OPEN_DRAIN); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_SDS0X1_RX); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_SYMBOL_PAUSE); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_WS2812); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_publish); +be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_addr); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_lv_draw_img_dsc); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); +be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_top); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SYMBOL_PREV); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_set_power); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_DDS2382_TX); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, NULL); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_indev); +be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_call); +be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_copy); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_fromstring); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, NULL); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_NRG_SEL_INV); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_SYMBOL_VOLUME_MAX); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_lv_draw_mask_line_param_cfg); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_get); +be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, NULL); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_collect); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, NULL); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_lv_linemeter); +be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_try); +be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SPI_CLK); +be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_size); +be_define_const_str(size, "size", 597743964u, 0, 4, NULL); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_gamma8); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, NULL); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, NULL); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_TASMOTACLIENT_TXD); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_DHT11_OUT); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_KEY1_NP); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_SPI_CS); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, NULL); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, NULL); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_cb_dispatch); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_lv_group_focus_cb); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_NRG_CF1); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_SBR_RX); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str__timers); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_deg); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_set_light); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); +be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, &be_const_str_resp_cmnd_str); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_HLW_CF); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_KEY1_TC); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_ROT1B); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, NULL); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_SYMBOL_POWER); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str__cmd); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_SYMBOL_EJECT); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_lv_page); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_MGC3130_RESET); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_TXD); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, NULL); +be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, NULL); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_arg_name); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, NULL); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SHELLY_DIMMER_RST_INV); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_SYMBOL_NEW_LINE); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_AudioOutputI2S); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_I2S_IN_SLCT); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_read); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, NULL); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_setitem); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_yield); +be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_SYMBOL_NEXT); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_event); +be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SYMBOL_BATTERY_EMPTY); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str_lv_draw_label_dsc); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_web_add_main_button); +be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_SAIR_TX); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_SYMBOL_EDIT); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_TX2X_TXD_BLACK); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, NULL); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, NULL); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_HJL_CF); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_atan); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_web_add_config_button); +be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); +be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, NULL); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_lv_label); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_WEBCAM_HSD); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, NULL); +be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, NULL); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, NULL); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_loop); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); +be_define_const_str(upper, "upper", 176974407u, 0, 5, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_acos); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_lv_tileview); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SYMBOL_BATTERY_3); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_ETH_PHY_MDIO); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, NULL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_resp_cmnd_error); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_setbits); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, &be_const_str_except); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_SM2135_CLK); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_log); +be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_MAX31855CS); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_WEBCAM_PWDN); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_ZIGBEE_TX); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_lv_cont); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_lv_point); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, NULL); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_SYMBOL_GPS); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_SYMBOL_KEYBOARD); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SDM120_RX); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_chars_in_string); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_TUYA_RX); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_lv_area); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_opt_connect); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_SYMBOL_HOME); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_format); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_hex); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_read8); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_NRF24_CS); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_write_bit); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_color); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_SDM120_TX); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_imin); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, NULL); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_MIEL_HVAC_TX); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_MP3_DFR562); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_RC522_CS); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_add_cmd); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_ILI9488_CS); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_SYMBOL_STOP); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_SYMBOL_UP); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_WEBCAM_VSYNC); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_byte); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); +be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_resolvecmnd); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_SYMBOL_CALL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_true); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_SYMBOL_BACKSPACE); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_calldepth); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_write); +be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_cmd); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_add_driver); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_content_button); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); +be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_resize); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_MHZ_RXD); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SYMBOL_BATTERY_1); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_WEBCAM_PCLK); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, NULL); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_WE517_TX); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_char); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_lv_cpicker); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_LE01MR_TX); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_WEBCAM_SIOC); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_web_add_management_button); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, NULL); +be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_PN532_RXD); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_update); +be_define_const_str(update, "update", 672109684u, 0, 6, NULL); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, NULL); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_redirect); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_WE517_RX); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_lv_img); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_tolower); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_button_pressed); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_issubclass); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_publish_result); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_range); +be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_lv_gauge_format_cb); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_read12); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_EPAPER42_CS); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_content_send); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_seg7_font); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, NULL); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_SYMBOL_VIDEO); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, &be_const_str_content_stop); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_lv_canvas); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_save_before_restart); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_SSPI_MISO); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_erase); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_TM1638DIO); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, NULL); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_SYMBOL_FILE); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, NULL); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_PZEM017_RX); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_read24); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_state); +be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str__buffer); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_scale_uint); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_WINDMETER_SPEED); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_Wire); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_bus); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_ADC_INPUT); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_lv_spinbox); +be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_PULLDOWN, - NULL, - (const bstring *)&be_const_str_web_add_handler, - (const bstring *)&be_const_str_CNTR1, - (const bstring *)&be_const_str_A4988_ENA, - (const bstring *)&be_const_str_lv_draw_mask_radius_param_cfg, - (const bstring *)&be_const_str_I2S_IN_DATA, - (const bstring *)&be_const_str_A4988_MS1, - NULL, - (const bstring *)&be_const_str__cb, - (const bstring *)&be_const_str_ADE7953_IRQ, - (const bstring *)&be_const_str_SM2135_CLK, - (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, - (const bstring *)&be_const_str_ILI9488_CS, - (const bstring *)&be_const_str_OUTPUT, - NULL, - (const bstring *)&be_const_str_HM10_RX, - (const bstring *)&be_const_str_LED1, - (const bstring *)&be_const_str_pin, - (const bstring *)&be_const_str_HIGH, - (const bstring *)&be_const_str_SM2135_DAT, - (const bstring *)&be_const_str_char, - (const bstring *)&be_const_str_GPS_TX, - (const bstring *)&be_const_str_deg, - (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_lv_draw_mask_angle_param, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_MAX7219DIN, - (const bstring *)&be_const_str_isinstance, - (const bstring *)&be_const_str_ADC_CT_POWER, - (const bstring *)&be_const_str_count, - NULL, - NULL, - (const bstring *)&be_const_str_SDM120_RX, - (const bstring *)&be_const_str_rand, - (const bstring *)&be_const_str_cb_dispatch, - (const bstring *)&be_const_str_number, - NULL, - (const bstring *)&be_const_str_lv_calendar, - (const bstring *)&be_const_str_BUZZER_INV, - (const bstring *)&be_const_str_NRF24_CS, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_MCP39F5_RST, - (const bstring *)&be_const_str_setbits, - NULL, - (const bstring *)&be_const_str_SWT1_PD, - NULL, - (const bstring *)&be_const_str_SSPI_MISO, - (const bstring *)&be_const_str_resp_cmnd_str, - NULL, - (const bstring *)&be_const_str_PZEM017_RX, - (const bstring *)&be_const_str_acos, - (const bstring *)&be_const_str_ADC_BUTTON, - (const bstring *)&be_const_str_MGC3130_RESET, - (const bstring *)&be_const_str_lv_draw_mask_angle_param_cfg, - (const bstring *)&be_const_str_set, - (const bstring *)&be_const_str_SYMBOL_PAUSE, - (const bstring *)&be_const_str_SDM72_TX, - NULL, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_HPMA_TX, - (const bstring *)&be_const_str_tostring, - (const bstring *)&be_const_str__buffer, - (const bstring *)&be_const_str_KEY1_INV, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_get, - (const bstring *)&be_const_str_MIEL_HVAC_TX, - (const bstring *)&be_const_str_ETH_PHY_MDC, - (const bstring *)&be_const_str_format, - NULL, - (const bstring *)&be_const_str_DDS2382_TX, - (const bstring *)&be_const_str_ARIRFSEL, - (const bstring *)&be_const_str_WEBCAM_HSD, - (const bstring *)&be_const_str__write, - (const bstring *)&be_const_str_EPAPER29_CS, - NULL, - (const bstring *)&be_const_str_PWM1, - (const bstring *)&be_const_str_lv_keyboard, - (const bstring *)&be_const_str_publish_result, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_INTERRUPT, - (const bstring *)&be_const_str_RC522_RST, - (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str_SBR_TX, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_read8, - (const bstring *)&be_const_str_ADC_BUTTON_INV, - NULL, - (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, - (const bstring *)&be_const_str_add_driver, - (const bstring *)&be_const_str_SYMBOL_RIGHT, - (const bstring *)&be_const_str_MAX31855CLK, - NULL, - (const bstring *)&be_const_str_BL0940_RX, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str_REL1_INV, - (const bstring *)&be_const_str_FTC532, - (const bstring *)&be_const_str_LMT01, - NULL, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str_SYMBOL_BLUETOOTH, - (const bstring *)&be_const_str_gc, - (const bstring *)&be_const_str_begin, - (const bstring *)&be_const_str_SYMBOL_NEXT, - (const bstring *)&be_const_str_SYMBOL_OK, - (const bstring *)&be_const_str_BOILER_OT_TX, - (const bstring *)&be_const_str_SPI_CLK, - (const bstring *)&be_const_str_start, - (const bstring *)&be_const_str_MIEL_HVAC_RX, - (const bstring *)&be_const_str_dot_p, - NULL, - (const bstring *)&be_const_str_EXS_ENABLE, - (const bstring *)&be_const_str_ROT1A, - (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_SYMBOL_DOWNLOAD, - (const bstring *)&be_const_str_REL1, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_MHZ_RXD, - (const bstring *)&be_const_str_ZIGBEE_TX, - (const bstring *)&be_const_str_LEDLNK, - (const bstring *)&be_const_str_lv_draw_rect_dsc, - (const bstring *)&be_const_str_SYMBOL_BELL, - (const bstring *)&be_const_str_addr, - (const bstring *)&be_const_str_LEDLNK_INV, - (const bstring *)&be_const_str_AudioFileSource, - NULL, - (const bstring *)&be_const_str_gamma8, - (const bstring *)&be_const_str_BUZZER, - (const bstring *)&be_const_str_RDM6300_RX, - (const bstring *)&be_const_str_toint, - (const bstring *)&be_const_str_BACKLIGHT, - (const bstring *)&be_const_str_ILI9341_CS, - (const bstring *)&be_const_str_SYMBOL_WARNING, - (const bstring *)&be_const_str_KEY1, - (const bstring *)&be_const_str_SSPI_MAX31865_CS1, - NULL, - (const bstring *)&be_const_str_SYMBOL_TRASH, - NULL, - (const bstring *)&be_const_str_ADC_PH, - (const bstring *)&be_const_str_SDM120_TX, - (const bstring *)&be_const_str_TASMOTACLIENT_TXD, - (const bstring *)&be_const_str_HRE_CLOCK, - (const bstring *)&be_const_str_SYMBOL_PLAY, - (const bstring *)&be_const_str_SSD1331_DC, - (const bstring *)&be_const_str_save, - NULL, - (const bstring *)&be_const_str_opt_call, - (const bstring *)&be_const_str_SYMBOL_POWER, - (const bstring *)&be_const_str_AS608_TX, - NULL, - (const bstring *)&be_const_str_SPI_MISO, - (const bstring *)&be_const_str_SSD1351_DC, - (const bstring *)&be_const_str_KEY1_INV_NP, - (const bstring *)&be_const_str_AZ_RXD, - (const bstring *)&be_const_str_CSE7761_RX, - NULL, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_SYMBOL_IMAGE, - (const bstring *)&be_const_str_ILI9341_DC, - (const bstring *)&be_const_str_HJL_CF, - (const bstring *)&be_const_str_SSPI_DC, - (const bstring *)&be_const_str_RXD, - (const bstring *)&be_const_str_P9813_DAT, - (const bstring *)&be_const_str_TFMINIPLUS_TX, - (const bstring *)&be_const_str_cosh, - (const bstring *)&be_const_str_DSB_OUT, - NULL, - (const bstring *)&be_const_str_SDS0X1_TX, - (const bstring *)&be_const_str_DDSU666_TX, - (const bstring *)&be_const_str_PULLUP, - (const bstring *)&be_const_str_DDS2382_RX, - NULL, - (const bstring *)&be_const_str_OUTPUT_LO, - (const bstring *)&be_const_str_wire1, - (const bstring *)&be_const_str_resp_cmnd_failed, - NULL, - (const bstring *)&be_const_str_I2S_IN_CLK, - (const bstring *)&be_const_str_event, - (const bstring *)&be_const_str_I2C_SDA, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_lv_line, - (const bstring *)&be_const_str_I2S_OUT_SLCT, - (const bstring *)&be_const_str_digital_read, - (const bstring *)&be_const_str_TM1637CLK, - (const bstring *)&be_const_str_SYMBOL_AUDIO, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_PN532_TXD, - (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_every_50ms, - (const bstring *)&be_const_str_SYMBOL_REFRESH, - (const bstring *)&be_const_str_web_send, - (const bstring *)&be_const_str_CHANGE, - (const bstring *)&be_const_str_HX711_DAT, - (const bstring *)&be_const_str_SDCARD_CS, - (const bstring *)&be_const_str_HX711_SCK, - (const bstring *)&be_const_str_PZEM016_RX, - (const bstring *)&be_const_str_ADC_TEMP, - (const bstring *)&be_const_str_EPAPER42_CS, - (const bstring *)&be_const_str_every_100ms, - (const bstring *)&be_const_str_SENSOR_END, - (const bstring *)&be_const_str_WEBCAM_RESET, - (const bstring *)&be_const_str_SDM72_RX, - (const bstring *)&be_const_str_SYMBOL_BATTERY_2, - (const bstring *)&be_const_str_SYMBOL_NEW_LINE, - (const bstring *)&be_const_str_WINDMETER_SPEED, - NULL, - (const bstring *)&be_const_str_HLW_CF, - NULL, - (const bstring *)&be_const_str_DCKI, - (const bstring *)&be_const_str_SYMBOL_BACKSPACE, - (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, - (const bstring *)&be_const_str_SYMBOL_COPY, - (const bstring *)&be_const_str_HM10_TX, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str_bytes, - (const bstring *)&be_const_str_TM1638STB, - (const bstring *)&be_const_str_DHT11_OUT, - (const bstring *)&be_const_str_SYMBOL_SETTINGS, - (const bstring *)&be_const_str_MAX7219CLK, - (const bstring *)&be_const_str_SYMBOL_DIRECTORY, - (const bstring *)&be_const_str_WS2812, - (const bstring *)&be_const_str_I2S_OUT_CLK, - (const bstring *)&be_const_str_except, - (const bstring *)&be_const_str_CSE7766_TX, - (const bstring *)&be_const_str_DEEPSLEEP, - (const bstring *)&be_const_str_SM16716_CLK, - (const bstring *)&be_const_str_KEY1_INV_PD, - (const bstring *)&be_const_str_DYP_RX, - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_byte, - NULL, - (const bstring *)&be_const_str_BS814_DAT, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_SAIR_TX, - (const bstring *)&be_const_str_read12, - (const bstring *)&be_const_str_exec_cmd, - (const bstring *)&be_const_str_HRXL_RX, - NULL, - (const bstring *)&be_const_str_break, - NULL, - NULL, - (const bstring *)&be_const_str_A4988_DIR, - (const bstring *)&be_const_str_ADC_INPUT, - (const bstring *)&be_const_str_SYMBOL_PASTE, - (const bstring *)&be_const_str_BS814_CLK, - (const bstring *)&be_const_str_SSPI_MOSI, - (const bstring *)&be_const_str_SYMBOL_DUMMY, - (const bstring *)&be_const_str_ROT1B, - (const bstring *)&be_const_str_PZEM0XX_TX, - (const bstring *)&be_const_str_KEY1_TC, - (const bstring *)&be_const_str_I2S_IN_SLCT, - (const bstring *)&be_const_str_I2S_OUT_DATA, - (const bstring *)&be_const_str_compile, - (const bstring *)&be_const_str_LE01MR_TX, - (const bstring *)&be_const_str_PN532_RXD, - NULL, - (const bstring *)&be_const_str_lv_cont, - (const bstring *)&be_const_str_Driver, - (const bstring *)&be_const_str_MAX31855DO, - NULL, - NULL, - (const bstring *)&be_const_str_MAX31855CS, - (const bstring *)&be_const_str_KEY1_NP, - (const bstring *)&be_const_str_SYMBOL_BATTERY_1, - (const bstring *)&be_const_str_asstring, - (const bstring *)&be_const_str_LOW, - (const bstring *)&be_const_str_PZEM004_RX, - (const bstring *)&be_const_str_SDM630_RX, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_DHT11, - NULL, - (const bstring *)&be_const_str_abs, - (const bstring *)&be_const_str_SPI_CS, - NULL, - (const bstring *)&be_const_str_opt_add, - NULL, - (const bstring *)&be_const_str_OPEN_DRAIN, - (const bstring *)&be_const_str_MGC3130_XFER, - NULL, - (const bstring *)&be_const_str_arg, - (const bstring *)&be_const_str_CNTR1_NP, - (const bstring *)&be_const_str_NRG_CF1, - (const bstring *)&be_const_str_NEOPOOL_TX, - (const bstring *)&be_const_str_arg_name, - (const bstring *)&be_const_str_AS608_RX, - (const bstring *)&be_const_str_IBEACON_TX, - (const bstring *)&be_const_str_IRRECV, - (const bstring *)&be_const_str_SYMBOL_PREV, - (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_ROT1B_NP, NULL, (const bstring *)&be_const_str_SYMBOL_LOOP, - (const bstring *)&be_const_str_get_power, - (const bstring *)&be_const_str_finish, - NULL, - (const bstring *)&be_const_str_TM1638DIO, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_find_key_i, + (const bstring *)&be_const_str_DCKI, (const bstring *)&be_const_str_SYMBOL_LEFT, - (const bstring *)&be_const_str_montserrat_font, + (const bstring *)&be_const_str_SR04_ECHO, + (const bstring *)&be_const_str_CHANGE, NULL, - (const bstring *)&be_const_str_resp_cmnd, - (const bstring *)&be_const_str_WEBCAM_SIOC, - (const bstring *)&be_const_str_SYMBOL_USB, + (const bstring *)&be_const_str_LED1_INV, + (const bstring *)&be_const_str_lv_calendar, + (const bstring *)&be_const_str_arg, + (const bstring *)&be_const_str_TUYA_TX, + (const bstring *)&be_const_str_ADC_CT_POWER, + (const bstring *)&be_const_str_SDM630_RX, + NULL, + (const bstring *)&be_const_str_HALLEFFECT, + (const bstring *)&be_const_str___iterator__, + (const bstring *)&be_const_str_SYMBOL_MUTE, + NULL, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_PULLUP, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_AS608_TX, + (const bstring *)&be_const_str_SM16716_SEL, + (const bstring *)&be_const_str_REL1, + (const bstring *)&be_const_str_MAX31855DO, + (const bstring *)&be_const_str_iter, + (const bstring *)&be_const_str_lv_bar, + (const bstring *)&be_const_str_floor, + NULL, + (const bstring *)&be_const_str_PWM1, (const bstring *)&be_const_str_SSPI_CS, + (const bstring *)&be_const_str_MAX7219CS, NULL, - NULL, - NULL, - (const bstring *)&be_const_str_A4988_STP, - (const bstring *)&be_const_str_HPMA_RX, - (const bstring *)&be_const_str_AZ_TXD, - (const bstring *)&be_const_str_WIEGAND_D1, - (const bstring *)&be_const_str_INPUT, - (const bstring *)&be_const_str_KEY1_PD, - (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, (const bstring *)&be_const_str_WEBCAM_PSRCS, - (const bstring *)&be_const_str_SYMBOL_EJECT, - (const bstring *)&be_const_str_imax, - (const bstring *)&be_const_str_HRE_DATA + (const bstring *)&be_const_str_LMT01, + (const bstring *)&be_const_str_has_arg, + (const bstring *)&be_const_str_I2S_OUT_DATA, + (const bstring *)&be_const_str_gen_cb, + (const bstring *)&be_const_str_SYMBOL_BLUETOOTH, + (const bstring *)&be_const_str_SDM72_RX, + (const bstring *)&be_const_str_MIEL_HVAC_RX, + (const bstring *)&be_const_str_lv_signal_cb, + (const bstring *)&be_const_str_SSPI_DC, + (const bstring *)&be_const_str_ADC_TEMP, + (const bstring *)&be_const_str_I2C_SCL, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_IBEACON_TX, + (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str_lv_sqrt_res, + (const bstring *)&be_const_str_opt_call, + (const bstring *)&be_const_str_isinstance, + (const bstring *)&be_const_str_WEBCAM_DATA, + (const bstring *)&be_const_str_KEY1_INV_NP, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_A4988_MS1, + (const bstring *)&be_const_str_AS3935, + NULL, + (const bstring *)&be_const_str_lv_draw_rect_dsc, + (const bstring *)&be_const_str_SOLAXX1_RX, + (const bstring *)&be_const_str_geti, + (const bstring *)&be_const_str_DHT11, + NULL, + (const bstring *)&be_const_str_i2c_enabled, + (const bstring *)&be_const_str_PZEM004_RX, + (const bstring *)&be_const_str_TM1637CLK, + (const bstring *)&be_const_str_read32, + (const bstring *)&be_const_str_EPAPER29_CS, + (const bstring *)&be_const_str_KEY1, + (const bstring *)&be_const_str_LEDLNK, + (const bstring *)&be_const_str_EPD_DATA, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_exec_cmd, + NULL, + NULL, + (const bstring *)&be_const_str_KEY1_INV, + (const bstring *)&be_const_str_FTC532, + (const bstring *)&be_const_str_SSD1331_DC, + (const bstring *)&be_const_str_ADC_BUTTON_INV, + (const bstring *)&be_const_str_name, + (const bstring *)&be_const_str_classname, + (const bstring *)&be_const_str_SSD1351_CS, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_while, + (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str_ADE7953_IRQ, + (const bstring *)&be_const_str_DSB_OUT, + (const bstring *)&be_const_str_RA8876_CS, + (const bstring *)&be_const_str_getbits, + (const bstring *)&be_const_str_SSD1331_CS, + (const bstring *)&be_const_str_SYMBOL_DUMMY, + (const bstring *)&be_const_str_MAX31855CLK, + NULL, + (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, + (const bstring *)&be_const_str_display, + (const bstring *)&be_const_str_DYP_RX, + (const bstring *)&be_const_str_SYMBOL_BATTERY_2, + (const bstring *)&be_const_str_TM1637DIO, + (const bstring *)&be_const_str_PWM1_INV, + NULL, + NULL, + (const bstring *)&be_const_str_INPUT_PULLDOWN, + NULL, + (const bstring *)&be_const_str_PZEM0XX_TX, + (const bstring *)&be_const_str_DHT22, + (const bstring *)&be_const_str_BS814_DAT, + (const bstring *)&be_const_str_ROT1A, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_lv_obj, + (const bstring *)&be_const_str_BUZZER, + (const bstring *)&be_const_str_tan, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_SYMBOL_RIGHT, + (const bstring *)&be_const_str_lv_slider, + NULL, + (const bstring *)&be_const_str_digital_write, + (const bstring *)&be_const_str_WIEGAND_D0, + NULL, + (const bstring *)&be_const_str_SYMBOL_DOWN, + (const bstring *)&be_const_str_SYMBOL_USB, + (const bstring *)&be_const_str__end_transmission, + (const bstring *)&be_const_str_BOILER_OT_TX, + (const bstring *)&be_const_str_deinit, + (const bstring *)&be_const_str_AudioGenerator, + NULL, + (const bstring *)&be_const_str_ETH_PHY_MDC, + (const bstring *)&be_const_str_RFRECV, + (const bstring *)&be_const_str_SYMBOL_SETTINGS, + (const bstring *)&be_const_str_DI, + (const bstring *)&be_const_str_NEOPOOL_TX, + (const bstring *)&be_const_str_HM10_RX, + (const bstring *)&be_const_str_P9813_DAT, + (const bstring *)&be_const_str_SR04_TRIG, + (const bstring *)&be_const_str_SYMBOL_IMAGE, + (const bstring *)&be_const_str_SYMBOL_SHUFFLE, + (const bstring *)&be_const_str_lv_group, + (const bstring *)&be_const_str_SOLAXX1_TX, + NULL, + (const bstring *)&be_const_str_wire2, + (const bstring *)&be_const_str__begin_transmission, + (const bstring *)&be_const_str_delay, + (const bstring *)&be_const_str_every_second, + NULL, + NULL, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_HIGH, + (const bstring *)&be_const_str_web_add_handler, + (const bstring *)&be_const_str_SYMBOL_MINUS, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_BS814_CLK, + (const bstring *)&be_const_str_P9813_CLK, + (const bstring *)&be_const_str_TM1638CLK, + (const bstring *)&be_const_str_DEEPSLEEP, + (const bstring *)&be_const_str_HPMA_TX, + NULL, + NULL, + (const bstring *)&be_const_str_SYMBOL_BULLET, + (const bstring *)&be_const_str_ILI9341_CS, + (const bstring *)&be_const_str_ETH_PHY_POWER, + (const bstring *)&be_const_str_OPEN_DRAIN, + (const bstring *)&be_const_str_ZIGBEE_RX, + (const bstring *)&be_const_str_SENSOR_END, + (const bstring *)&be_const_str_check_privileged_access, + (const bstring *)&be_const_str_lv_spinner, + (const bstring *)&be_const_str_SWT1, + NULL, + (const bstring *)&be_const_str_WEBCAM_PSCLK, + (const bstring *)&be_const_str_SDS0X1_TX, + (const bstring *)&be_const_str__write, + (const bstring *)&be_const_str_I2S_OUT_SLCT, + (const bstring *)&be_const_str_elif, + (const bstring *)&be_const_str_SYMBOL_VOLUME_MID, + (const bstring *)&be_const_str_DDS2382_RX, + NULL, + (const bstring *)&be_const_str_SYMBOL_CHARGE, + (const bstring *)&be_const_str_CSE7761_RX, + (const bstring *)&be_const_str_RF_SENSOR, + (const bstring *)&be_const_str_TCP_TX, + (const bstring *)&be_const_str_RC522_RST, + (const bstring *)&be_const_str_pin_mode, + (const bstring *)&be_const_str_SYMBOL_UPLOAD, + (const bstring *)&be_const_str_INPUT, + (const bstring *)&be_const_str_SM2135_DAT, + (const bstring *)&be_const_str_MHZ_TXD, + (const bstring *)&be_const_str_lv_draw_mask_fade_param_cfg, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_SAIR_RX, + (const bstring *)&be_const_str_SWT1_PD, + NULL, + NULL, + (const bstring *)&be_const_str_SYMBOL_PLUS, + (const bstring *)&be_const_str_load_freetype_font, + NULL, + (const bstring *)&be_const_str_ADC_RANGE, + (const bstring *)&be_const_str_dot_p, + (const bstring *)&be_const_str_MGC3130_XFER, + NULL, + (const bstring *)&be_const_str_every_50ms, + (const bstring *)&be_const_str_SI7021, + (const bstring *)&be_const_str_BOILER_OT_RX, + (const bstring *)&be_const_str_VL53L0X_XSHUT1, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str_AS608_RX, + (const bstring *)&be_const_str_Tasmota, + (const bstring *)&be_const_str_exec_rules, + NULL, + (const bstring *)&be_const_str_HX711_DAT, + (const bstring *)&be_const_str_HM10_TX, + (const bstring *)&be_const_str_OUTPUT, + (const bstring *)&be_const_str_CNTR1_NP, + (const bstring *)&be_const_str_write_bytes, + (const bstring *)&be_const_str_lv_chart, + (const bstring *)&be_const_str_DSB, + (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, + (const bstring *)&be_const_str_PULLDOWN, + (const bstring *)&be_const_str_add_rule, + (const bstring *)&be_const_str_opt_neq, + (const bstring *)&be_const_str_bytes, + (const bstring *)&be_const_str_SYMBOL_AUDIO, + (const bstring *)&be_const_str_detect, + (const bstring *)&be_const_str_lv_led, + (const bstring *)&be_const_str_read_bytes, + (const bstring *)&be_const_str_A4988_ENA, + (const bstring *)&be_const_str_MCP39F5_RX, + (const bstring *)&be_const_str_upper, + (const bstring *)&be_const_str_lv_draw_mask_saved, + (const bstring *)&be_const_str_lv_msgbox, + (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, + (const bstring *)&be_const_str_KEY1_INV_PD, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_ARIRFSEL, + NULL, + (const bstring *)&be_const_str_SPI_MISO, + (const bstring *)&be_const_str_SYMBOL_LIST, + (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_SYMBOL_SAVE, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_INTERRUPT, + (const bstring *)&be_const_str_SYMBOL_DOWNLOAD, + NULL, + (const bstring *)&be_const_str_lv_draw_mask_fade_param, + (const bstring *)&be_const_str_json_append, + NULL, + (const bstring *)&be_const_str_get_power, + (const bstring *)&be_const_str_FALLING, + (const bstring *)&be_const_str_PMS5003_TX, + (const bstring *)&be_const_str_IEM3000_TX, + (const bstring *)&be_const_str_GPS_TX, + (const bstring *)&be_const_str__cb, + NULL, + (const bstring *)&be_const_str_NRG_SEL, + (const bstring *)&be_const_str_CNTR1, + (const bstring *)&be_const_str_OUTPUT_LO, + (const bstring *)&be_const_str_MD5, + (const bstring *)&be_const_str_content_send_style, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_CSE7766_RX, + (const bstring *)&be_const_str_RFSEND, + (const bstring *)&be_const_str_I2S_IN_DATA, + (const bstring *)&be_const_str_DDSU666_TX, + (const bstring *)&be_const_str_ST7789_DC, + (const bstring *)&be_const_str_OPTION_A, + (const bstring *)&be_const_str_item, + (const bstring *)&be_const_str_ZEROCROSS, + NULL, + (const bstring *)&be_const_str_AZ_RXD, + (const bstring *)&be_const_str_A4988_STP, + NULL, + (const bstring *)&be_const_str_TELEINFO_ENABLE, + (const bstring *)&be_const_str_member, + (const bstring *)&be_const_str_exists, + (const bstring *)&be_const_str_EXS_ENABLE, + NULL, + (const bstring *)&be_const_str_montserrat_font, + (const bstring *)&be_const_str_ROT1A_NP, + (const bstring *)&be_const_str_write8, + (const bstring *)&be_const_str_IRSEND, + (const bstring *)&be_const_str_concat, + (const bstring *)&be_const_str_BL0940_RX, + (const bstring *)&be_const_str_HPMA_RX, + (const bstring *)&be_const_str_open, + (const bstring *)&be_const_str_A4988_DIR, + NULL, + (const bstring *)&be_const_str_split, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_opt_add, + (const bstring *)&be_const_str_HRXL_RX, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_lv_table, + (const bstring *)&be_const_str_CC1101_GDO0, + (const bstring *)&be_const_str_SYMBOL_TRASH, + (const bstring *)&be_const_str_as, + (const bstring *)&be_const_str_get_option, + (const bstring *)&be_const_str_find_op, + (const bstring *)&be_const_str_SYMBOL_WARNING, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str_SYMBOL_CLOSE, + NULL, + NULL, + (const bstring *)&be_const_str_NRF24_DC, + (const bstring *)&be_const_str_finish, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_WIEGAND_D1, + (const bstring *)&be_const_str_WEBCAM_HREF, + (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_insert, + (const bstring *)&be_const_str_lv_tabview, + (const bstring *)&be_const_str_MAX7219CLK, + (const bstring *)&be_const_str_real, + (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, + (const bstring *)&be_const_str_SYMBOL_COPY, + (const bstring *)&be_const_str_LED1, + (const bstring *)&be_const_str_WEBCAM_SIOD, + (const bstring *)&be_const_str_HRE_DATA, + (const bstring *)&be_const_str_SYMBOL_WIFI, + (const bstring *)&be_const_str_HX711_SCK, + (const bstring *)&be_const_str_ADC_BUTTON }; static const struct bconststrtab m_const_string_table = { - .size = 318, - .count = 637, + .size = 319, + .count = 638, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_introspect.h b/lib/libesp32/Berry/generate/be_fixed_introspect.h new file mode 100644 index 000000000..78b840ab6 --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_introspect.h @@ -0,0 +1,19 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(m_libintrospect_map) { + { be_const_key(members, -1), be_const_func(m_attrlist) }, + { be_const_key(set, -1), be_const_func(m_setmember) }, + { be_const_key(get, -1), be_const_func(m_findmember) }, +}; + +static be_define_const_map( + m_libintrospect_map, + 3 +); + +static be_define_const_module( + m_libintrospect, + "introspect" +); + +BE_EXPORT_VARIABLE be_define_const_native_module(introspect, NULL); diff --git a/lib/libesp32/Berry/src/be_api.c b/lib/libesp32/Berry/src/be_api.c index aeb348bbb..28323c04c 100644 --- a/lib/libesp32/Berry/src/be_api.c +++ b/lib/libesp32/Berry/src/be_api.c @@ -208,6 +208,12 @@ BERRY_API bbool be_isinstance(bvm *vm, int index) return var_isinstance(v); } +BERRY_API bbool be_ismodule(bvm *vm, int index) +{ + bvalue *v = be_indexof(vm, index); + return var_ismodule(v); +} + BERRY_API bbool be_islist(bvm *vm, int index) { bvalue *v = be_indexof(vm, index); diff --git a/lib/libesp32/Berry/src/be_introspectlib.c b/lib/libesp32/Berry/src/be_introspectlib.c new file mode 100644 index 000000000..fc9dac898 --- /dev/null +++ b/lib/libesp32/Berry/src/be_introspectlib.c @@ -0,0 +1,100 @@ +/******************************************************************** +** Copyright (c) 2018-2020 Guan Wenliang +** This file is part of the Berry default interpreter. +** skiars@qq.com, https://github.com/Skiars/berry +** See Copyright Notice in the LICENSE file or at +** https://github.com/Skiars/berry/blob/master/LICENSE +********************************************************************/ +#include "be_object.h" +#include "be_module.h" +#include "be_string.h" +#include "be_vector.h" +#include "be_class.h" +#include "be_debug.h" +#include "be_map.h" +#include "be_vm.h" +#include + +#if BE_USE_INTROSPECT_MODULE + +#define global(vm) ((vm)->gbldesc.global) +#define builtin(vm) ((vm)->gbldesc.builtin) + +static void dump_map_keys(bvm *vm, bmap *map) +{ + if (!map) { return; } /* protect agains potential null pointer */ + bmapnode *node; + bmapiter iter = be_map_iter(); + while ((node = be_map_next(map, &iter)) != NULL) { + if (var_isstr(&node->key)) { + bstring *s = var_tostr(&node->key); + be_pushstring(vm, str(s)); + be_data_push(vm, -2); + be_pop(vm, 1); + } + } +} + +static int m_attrlist(bvm *vm) +{ + int top = be_top(vm); + be_newobject(vm, "list"); + if (top >= 1) { + bvalue *v = be_indexof(vm, 1); + void *obj = var_toobj(v); + switch (var_type(v)) { + case BE_NIL: dump_map_keys(vm, global(vm).vtab); break; + case BE_MODULE: dump_map_keys(vm, ((bmodule*)obj)->table); break; + case BE_CLASS: dump_map_keys(vm, ((bclass*)obj)->members); break; + case BE_INSTANCE: dump_map_keys(vm, ((binstance*)obj)->_class->members); break; + default: break; + } + } else { /* if no parameter, then dump globals */ + dump_map_keys(vm, global(vm).vtab); + } + be_pop(vm, 1); + be_return(vm); +} + +static int m_findmember(bvm *vm) +{ + int top = be_top(vm); + if (top >= 2 && (be_isinstance(vm, 1) || be_ismodule(vm, 1) || be_isclass(vm, 1)) && be_isstring(vm, 2)) { + be_getmember(vm, 1, be_tostring(vm, 2)); + be_return(vm); + } + be_return_nil(vm); +} + +static int m_setmember(bvm *vm) +{ + int top = be_top(vm); + if (top >= 3 && (be_isinstance(vm, 1) || be_ismodule(vm, 1)) && be_isstring(vm, 2)) { + be_setmember(vm, 1, be_tostring(vm, 2)); + be_return(vm); + } + be_return_nil(vm); +} + +#if !BE_USE_PRECOMPILED_OBJECT +be_native_module_attr_table(introspect) { + be_native_module_function("members", m_attrlist), + + be_native_module_function("get", m_findmember), + be_native_module_function("set", m_setmember), +}; + +be_define_native_module(introspect, NULL); +#else +/* @const_object_info_begin +module introspect (scope: global, depend: BE_USE_INTROSPECT_MODULE) { + members, func(m_attrlist) + + get, func(m_findmember) + set, func(m_setmember) +} +@const_object_info_end */ +#include "../generate/be_fixed_introspect.h" +#endif + +#endif /* BE_USE_INTROSPECT_MODULE */ diff --git a/lib/libesp32/Berry/src/berry.h b/lib/libesp32/Berry/src/berry.h index d71d015f4..e2d8270e1 100644 --- a/lib/libesp32/Berry/src/berry.h +++ b/lib/libesp32/Berry/src/berry.h @@ -438,6 +438,7 @@ BERRY_API bbool be_isfunction(bvm *vm, int index); BERRY_API bbool be_isproto(bvm *vm, int index); BERRY_API bbool be_isclass(bvm *vm, int index); BERRY_API bbool be_isinstance(bvm *vm, int index); +BERRY_API bbool be_ismodule(bvm *vm, int index); BERRY_API bbool be_islist(bvm *vm, int index); BERRY_API bbool be_ismap(bvm *vm, int index); BERRY_API bbool be_iscomptr(bvm *vm, int index); From 923be119a2d9479696e883b23bcc130fe1b3778b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 23 Jul 2021 11:34:14 +0200 Subject: [PATCH 032/148] No LITTLEFS, always LittleFS --- tasmota/xdrv_10_scripter.ino | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 4485ea6f7..62eb0ddb7 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -2224,12 +2224,7 @@ chknext: if (!strncmp(vname, "fmt(", 4)) { lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); if (!fvar) { -#ifdef ESP8266 LittleFS.format(); -#endif -#ifdef ESP32 - LITTLEFS.format(); -#endif } else { //SD.format(); } From 8dccf2767e0b7e448a6af050947d50320df4686b Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 23 Jul 2021 15:22:54 +0200 Subject: [PATCH 033/148] LVGL Fix solidified class lv_signal_bars --- .../Berry/default/be_lvgl_signal_bars_lib.c | 402 +++++++++--------- tasmota/berry/lvgl_examples/lvgl_demo.be | 90 ---- tasmota/berry/lvgl_examples/signal_bars.be | 8 +- 3 files changed, 211 insertions(+), 289 deletions(-) diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c index 14c1e197a..1784493a0 100644 --- a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c @@ -7,44 +7,94 @@ #include "lvgl.h" +/******************************************************************** +** Solidified function: get_percentage +********************************************************************/ +be_local_closure(get_percentage, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + be_nested_string("percentage", -1756136011, 10), + }), + (be_nested_const_str("get_percentage", -1414483304, 14)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 R256 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_percentage +********************************************************************/ +be_local_closure(set_percentage, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + be_nested_string("percentage", -1756136011, 10), + be_const_int(0), + be_nested_string("invalidate", -1645232368, 10), + }), + (be_nested_const_str("set_percentage", -1342944572, 14)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[18]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x540E0004, // 0001 LDINT R3 5 + 0x0C080403, // 0002 DIV R2 R2 R3 + 0x540E0063, // 0003 LDINT R3 100 + 0x240C0203, // 0004 GT R3 R1 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x54060063, // 0006 LDINT R1 100 + 0x140C0301, // 0007 LT R3 R1 R257 + 0x780E0000, // 0008 JMPF R3 #000A + 0x58040001, // 0009 LDCONST R1 K1 + 0x90020001, // 000A SETMBR R0 R256 R1 + 0x540E0004, // 000B LDINT R3 5 + 0x0C0C0203, // 000C DIV R3 R1 R3 + 0x200C0403, // 000D NE R3 R2 R3 + 0x780E0001, // 000E JMPF R3 #0011 + 0x8C0C0102, // 000F GETMET R3 R0 R258 + 0x7C0C0200, // 0010 CALL R3 1 + 0x80000000, // 0011 RET 0 R0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: my_design_cb ********************************************************************/ be_local_closure(my_design_cb, /* name */ be_nested_proto( - 23, /* nstack */ + 22, /* nstack */ 3, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - be_const_int(1), - }), - (be_nested_const_str("atleast1", 1956331672, 8)), - (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[ 6]) { /* code */ - 0x28040100, // 0000 GE R1 R0 R256 - 0x78060001, // 0001 JMPF R1 #0004 - 0x80040000, // 0002 RET 1 R0 - 0x70020000, // 0003 JMP #0005 - 0x80060000, // 0004 RET 1 R256 - 0x80000000, // 0005 RET 0 R0 - }) - ), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ + ( &(const bvalue[35]) { /* constants */ be_nested_string("global", 503252654, 6), be_nested_string("lv", 1529997255, 2), be_nested_string("get_height", -723211773, 10), be_nested_string("get_width", -1001549996, 9), + be_nested_string("atleast1", 1956331672, 8), be_const_int(3), be_const_int(2), be_nested_string("DESIGN_COVER_CHK", -1298406708, 16), @@ -78,118 +128,117 @@ be_local_closure(my_design_cb, /* name */ }), (be_nested_const_str("my_design_cb", -1173588798, 12)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[111]) { /* code */ + ( &(const binstruction[110]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 R256 0x88100701, // 0001 GETMBR R4 R3 R257 - 0x84140000, // 0002 CLOSURE R5 P0 - 0x8C180102, // 0003 GETMET R6 R0 R258 - 0x7C180200, // 0004 CALL R6 1 - 0x8C1C0103, // 0005 GETMET R7 R0 R259 - 0x7C1C0200, // 0006 CALL R7 1 - 0x5C200A00, // 0007 MOVE R8 R5 - 0x5426000E, // 0008 LDINT R9 15 - 0x0C240E09, // 0009 DIV R9 R7 R9 - 0x7C200200, // 000A CALL R8 1 - 0x5C240A00, // 000B MOVE R9 R5 - 0x08281104, // 000C MUL R10 R8 R260 - 0x04280E0A, // 000D SUB R10 R7 R10 - 0x542E0003, // 000E LDINT R11 4 - 0x0C28140B, // 000F DIV R10 R10 R11 - 0x7C240200, // 0010 CALL R9 1 - 0x0C281305, // 0011 DIV R10 R9 R261 - 0x882C0906, // 0012 GETMBR R11 R4 R262 - 0x1C2C040B, // 0013 EQ R11 R2 R11 - 0x782E0007, // 0014 JMPF R11 #001D - 0x882C0107, // 0015 GETMBR R11 R0 R263 - 0x8C2C1708, // 0016 GETMET R11 R11 R264 - 0x5C340000, // 0017 MOVE R13 R0 - 0x5C380200, // 0018 MOVE R14 R1 - 0x5C3C0400, // 0019 MOVE R15 R2 - 0x7C2C0800, // 001A CALL R11 4 - 0x80041600, // 001B RET 1 R11 - 0x7002004F, // 001C JMP #006D - 0x882C0909, // 001D GETMBR R11 R4 R265 - 0x1C2C040B, // 001E EQ R11 R2 R11 - 0x782E004C, // 001F JMPF R11 #006D - 0x8C2C010A, // 0020 GETMET R11 R0 R266 - 0x5C340200, // 0021 MOVE R13 R1 - 0x7C2C0400, // 0022 CALL R11 2 - 0x882C030B, // 0023 GETMBR R11 R1 R267 - 0x8830030C, // 0024 GETMBR R12 R1 R268 - 0x8C34090D, // 0025 GETMET R13 R4 R269 - 0x883C010E, // 0026 GETMBR R15 R0 R270 - 0x7C340400, // 0027 CALL R13 2 - 0x8C34010F, // 0028 GETMET R13 R0 R271 - 0x883C0910, // 0029 GETMBR R15 R4 R272 - 0x8840010E, // 002A GETMBR R16 R0 R270 - 0x7C340600, // 002B CALL R13 3 - 0x8834010E, // 002C GETMBR R13 R0 R270 - 0x90362312, // 002D SETMBR R13 R273 R274 - 0x8834010E, // 002E GETMBR R13 R0 R270 - 0x90362712, // 002F SETMBR R13 R275 R274 - 0x8834010E, // 0030 GETMBR R13 R0 R270 - 0x90362809, // 0031 SETMBR R13 R276 R9 - 0x8C340115, // 0032 GETMET R13 R0 R277 - 0x883C0910, // 0033 GETMBR R15 R4 R272 - 0x88400916, // 0034 GETMBR R16 R4 R278 - 0x7C340600, // 0035 CALL R13 3 - 0x8C380117, // 0036 GETMET R14 R0 R279 - 0x88400910, // 0037 GETMBR R16 R4 R272 - 0x88440916, // 0038 GETMBR R17 R4 R278 - 0x7C380600, // 0039 CALL R14 3 - 0x603C0000, // 003A GETGBL R15 G0 - 0x40423104, // 003B CONNECT R16 R280 R260 - 0x7C3C0200, // 003C CALL R15 1 - 0xA802002B, // 003D EXBLK 0 #006A - 0x5C401E00, // 003E MOVE R16 R15 - 0x7C400000, // 003F CALL R16 0 - 0x8844010E, // 0040 GETMBR R17 R0 R270 - 0x8848011A, // 0041 GETMBR R18 R0 R282 - 0x004C2112, // 0042 ADD R19 R16 R274 - 0x54520013, // 0043 LDINT R20 20 - 0x084C2614, // 0044 MUL R19 R19 R20 - 0x28482413, // 0045 GE R18 R18 R19 - 0x784A0001, // 0046 JMPF R18 #0049 - 0x5C481A00, // 0047 MOVE R18 R13 - 0x70020000, // 0048 JMP #004A - 0x5C481C00, // 0049 MOVE R18 R14 - 0x90463212, // 004A SETMBR R17 R281 R18 - 0x8844011B, // 004B GETMBR R17 R0 R283 - 0x00481806, // 004C ADD R18 R12 R6 - 0x04482512, // 004D SUB R18 R18 R274 - 0x0448240A, // 004E SUB R18 R18 R10 - 0x90463812, // 004F SETMBR R17 R284 R18 - 0x8844011B, // 0050 GETMBR R17 R0 R283 - 0x00481208, // 0051 ADD R18 R9 R8 - 0x08482012, // 0052 MUL R18 R16 R18 - 0x00481612, // 0053 ADD R18 R11 R18 - 0x0048240A, // 0054 ADD R18 R18 R10 - 0x90463A12, // 0055 SETMBR R17 R285 R18 - 0x8844011E, // 0056 GETMBR R17 R0 R286 - 0x044A0810, // 0057 SUB R18 R260 R16 - 0x044C0C09, // 0058 SUB R19 R6 R9 - 0x08482413, // 0059 MUL R18 R18 R19 - 0x544E0003, // 005A LDINT R19 4 - 0x0C482413, // 005B DIV R18 R18 R19 - 0x00481812, // 005C ADD R18 R12 R18 - 0x0048240A, // 005D ADD R18 R18 R10 - 0x90463812, // 005E SETMBR R17 R284 R18 - 0x8844011E, // 005F GETMBR R17 R0 R286 - 0x8848011B, // 0060 GETMBR R18 R0 R283 - 0x8848251D, // 0061 GETMBR R18 R18 R285 - 0x90463A12, // 0062 SETMBR R17 R285 R18 - 0x8C44091F, // 0063 GETMET R17 R4 R287 - 0x884C011B, // 0064 GETMBR R19 R0 R283 - 0x8850011E, // 0065 GETMBR R20 R0 R286 - 0x5C540200, // 0066 MOVE R21 R1 - 0x8858010E, // 0067 GETMBR R22 R0 R270 - 0x7C440A00, // 0068 CALL R17 5 - 0x7001FFD3, // 0069 JMP #003E - 0x583C0020, // 006A LDCONST R15 K32 - 0xAC3C0200, // 006B CATCH R15 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x882C0921, // 006D GETMBR R11 R4 R289 - 0x80041600, // 006E RET 1 R11 + 0x8C140102, // 0002 GETMET R5 R0 R258 + 0x7C140200, // 0003 CALL R5 1 + 0x8C180103, // 0004 GETMET R6 R0 R259 + 0x7C180200, // 0005 CALL R6 1 + 0x8C1C0104, // 0006 GETMET R7 R0 R260 + 0x5426000E, // 0007 LDINT R9 15 + 0x0C240C09, // 0008 DIV R9 R6 R9 + 0x7C1C0400, // 0009 CALL R7 2 + 0x8C200104, // 000A GETMET R8 R0 R260 + 0x08280F05, // 000B MUL R10 R7 R261 + 0x04280C0A, // 000C SUB R10 R6 R10 + 0x542E0003, // 000D LDINT R11 4 + 0x0C28140B, // 000E DIV R10 R10 R11 + 0x7C200400, // 000F CALL R8 2 + 0x0C241106, // 0010 DIV R9 R8 R262 + 0x88280907, // 0011 GETMBR R10 R4 R263 + 0x1C28040A, // 0012 EQ R10 R2 R10 + 0x782A0007, // 0013 JMPF R10 #001C + 0x88280108, // 0014 GETMBR R10 R0 R264 + 0x8C281509, // 0015 GETMET R10 R10 R265 + 0x5C300000, // 0016 MOVE R12 R0 + 0x5C340200, // 0017 MOVE R13 R1 + 0x5C380400, // 0018 MOVE R14 R2 + 0x7C280800, // 0019 CALL R10 4 + 0x80041400, // 001A RET 1 R10 + 0x7002004F, // 001B JMP #006C + 0x8828090A, // 001C GETMBR R10 R4 R266 + 0x1C28040A, // 001D EQ R10 R2 R10 + 0x782A004C, // 001E JMPF R10 #006C + 0x8C28010B, // 001F GETMET R10 R0 R267 + 0x5C300200, // 0020 MOVE R12 R1 + 0x7C280400, // 0021 CALL R10 2 + 0x8828030C, // 0022 GETMBR R10 R1 R268 + 0x882C030D, // 0023 GETMBR R11 R1 R269 + 0x8C30090E, // 0024 GETMET R12 R4 R270 + 0x8838010F, // 0025 GETMBR R14 R0 R271 + 0x7C300400, // 0026 CALL R12 2 + 0x8C300110, // 0027 GETMET R12 R0 R272 + 0x88380911, // 0028 GETMBR R14 R4 R273 + 0x883C010F, // 0029 GETMBR R15 R0 R271 + 0x7C300600, // 002A CALL R12 3 + 0x8830010F, // 002B GETMBR R12 R0 R271 + 0x90322513, // 002C SETMBR R12 R274 R275 + 0x8830010F, // 002D GETMBR R12 R0 R271 + 0x90322913, // 002E SETMBR R12 R276 R275 + 0x8830010F, // 002F GETMBR R12 R0 R271 + 0x90322A08, // 0030 SETMBR R12 R277 R8 + 0x8C300116, // 0031 GETMET R12 R0 R278 + 0x88380911, // 0032 GETMBR R14 R4 R273 + 0x883C0917, // 0033 GETMBR R15 R4 R279 + 0x7C300600, // 0034 CALL R12 3 + 0x8C340118, // 0035 GETMET R13 R0 R280 + 0x883C0911, // 0036 GETMBR R15 R4 R273 + 0x88400917, // 0037 GETMBR R16 R4 R279 + 0x7C340600, // 0038 CALL R13 3 + 0x60380000, // 0039 GETGBL R14 G0 + 0x403E3305, // 003A CONNECT R15 R281 R261 + 0x7C380200, // 003B CALL R14 1 + 0xA802002B, // 003C EXBLK 0 #0069 + 0x5C3C1C00, // 003D MOVE R15 R14 + 0x7C3C0000, // 003E CALL R15 0 + 0x8840010F, // 003F GETMBR R16 R0 R271 + 0x8844011B, // 0040 GETMBR R17 R0 R283 + 0x00481F13, // 0041 ADD R18 R15 R275 + 0x544E0013, // 0042 LDINT R19 20 + 0x08482413, // 0043 MUL R18 R18 R19 + 0x28442212, // 0044 GE R17 R17 R18 + 0x78460001, // 0045 JMPF R17 #0048 + 0x5C441800, // 0046 MOVE R17 R12 + 0x70020000, // 0047 JMP #0049 + 0x5C441A00, // 0048 MOVE R17 R13 + 0x90423411, // 0049 SETMBR R16 R282 R17 + 0x8840011C, // 004A GETMBR R16 R0 R284 + 0x00441605, // 004B ADD R17 R11 R5 + 0x04442313, // 004C SUB R17 R17 R275 + 0x04442209, // 004D SUB R17 R17 R9 + 0x90423A11, // 004E SETMBR R16 R285 R17 + 0x8840011C, // 004F GETMBR R16 R0 R284 + 0x00441007, // 0050 ADD R17 R8 R7 + 0x08441E11, // 0051 MUL R17 R15 R17 + 0x00441411, // 0052 ADD R17 R10 R17 + 0x00442209, // 0053 ADD R17 R17 R9 + 0x90423C11, // 0054 SETMBR R16 R286 R17 + 0x8840011F, // 0055 GETMBR R16 R0 R287 + 0x04460A0F, // 0056 SUB R17 R261 R15 + 0x04480A08, // 0057 SUB R18 R5 R8 + 0x08442212, // 0058 MUL R17 R17 R18 + 0x544A0003, // 0059 LDINT R18 4 + 0x0C442212, // 005A DIV R17 R17 R18 + 0x00441611, // 005B ADD R17 R11 R17 + 0x00442209, // 005C ADD R17 R17 R9 + 0x90423A11, // 005D SETMBR R16 R285 R17 + 0x8840011F, // 005E GETMBR R16 R0 R287 + 0x8844011C, // 005F GETMBR R17 R0 R284 + 0x8844231E, // 0060 GETMBR R17 R17 R286 + 0x90423C11, // 0061 SETMBR R16 R286 R17 + 0x8C400920, // 0062 GETMET R16 R4 R288 + 0x8848011C, // 0063 GETMBR R18 R0 R284 + 0x884C011F, // 0064 GETMBR R19 R0 R287 + 0x5C500200, // 0065 MOVE R20 R1 + 0x8854010F, // 0066 GETMBR R21 R0 R271 + 0x7C400A00, // 0067 CALL R16 5 + 0x7001FFD3, // 0068 JMP #003D + 0x58380021, // 0069 LDCONST R14 K33 + 0xAC380200, // 006A CATCH R14 1 0 + 0xB0080000, // 006B RAISE 2 R0 R0 + 0x88280922, // 006C GETMBR R10 R4 R290 + 0x80041400, // 006D RET 1 R10 }) ) ); @@ -197,25 +246,29 @@ be_local_closure(my_design_cb, /* name */ /******************************************************************** -** Solidified function: get_percentage +** Solidified function: atleast1 ********************************************************************/ -be_local_closure(get_percentage, /* name */ +be_local_closure(atleast1, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 3, /* nstack */ + 2, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - be_nested_string("percentage", -1756136011, 10), + be_const_int(1), }), - (be_nested_const_str("get_percentage", -1414483304, 14)), + (be_nested_const_str("atleast1", 1956331672, 8)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 R256 - 0x80040200, // 0001 RET 1 R1 + ( &(const binstruction[ 6]) { /* code */ + 0x28080300, // 0000 GE R2 R1 R256 + 0x780A0001, // 0001 JMPF R2 #0004 + 0x80040200, // 0002 RET 1 R1 + 0x70020000, // 0003 JMP #0005 + 0x80060000, // 0004 RET 1 R256 + 0x80000000, // 0005 RET 0 R0 }) ) ); @@ -292,50 +345,6 @@ be_local_closure(init, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_percentage -********************************************************************/ -be_local_closure(set_percentage, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - be_nested_string("percentage", -1756136011, 10), - be_const_int(0), - be_nested_string("invalidate", -1645232368, 10), - }), - (be_nested_const_str("set_percentage", -1342944572, 14)), - (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[18]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x540E0004, // 0001 LDINT R3 5 - 0x0C080403, // 0002 DIV R2 R2 R3 - 0x540E0063, // 0003 LDINT R3 100 - 0x240C0203, // 0004 GT R3 R1 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x54060063, // 0006 LDINT R1 100 - 0x140C0301, // 0007 LT R3 R1 R257 - 0x780E0000, // 0008 JMPF R3 #000A - 0x58040001, // 0009 LDCONST R1 K1 - 0x90020001, // 000A SETMBR R0 R256 R1 - 0x540E0004, // 000B LDINT R3 5 - 0x0C0C0203, // 000C DIV R3 R1 R3 - 0x200C0403, // 000D NE R3 R2 R3 - 0x780E0001, // 000E JMPF R3 #0011 - 0x8C0C0102, // 000F GETMET R3 R0 R258 - 0x7C0C0200, // 0010 CALL R3 1 - 0x80000000, // 0011 RET 0 R0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: lv_signal_bars ********************************************************************/ @@ -343,18 +352,19 @@ extern const bclass be_class_lv_obj; be_local_class(lv_signal_bars, 6, &be_class_lv_obj, - be_nested_map(10, + be_nested_map(11, ( (struct bmapnode*) &(const bmapnode[]) { { be_nested_key("p1", -1605446022, 2, -1), be_const_index(2) }, - { be_nested_key("my_design_cb", -1173588798, 12, -1), be_const_closure(my_design_cb_closure) }, - { be_nested_key("get_percentage", -1414483304, 14, -1), be_const_closure(get_percentage_closure) }, - { be_nested_key("init", 380752755, 4, 7), be_const_closure(init_closure) }, - { be_nested_key("set_percentage", -1342944572, 14, 0), be_const_closure(set_percentage_closure) }, - { be_nested_key("percentage", -1756136011, 10, 3), be_const_index(1) }, - { be_nested_key("area", -1693507260, 4, -1), be_const_index(5) }, + { be_nested_key("get_percentage", -1414483304, 14, 5), be_const_closure(get_percentage_closure) }, + { be_nested_key("set_percentage", -1342944572, 14, -1), be_const_closure(set_percentage_closure) }, { be_nested_key("p2", -1622223641, 2, -1), be_const_index(3) }, - { be_nested_key("line_dsc", -200476318, 8, 1), be_const_index(4) }, { be_nested_key("ancestor_design", 421545719, 15, -1), be_const_index(0) }, + { be_nested_key("percentage", -1756136011, 10, 4), be_const_index(1) }, + { be_nested_key("line_dsc", -200476318, 8, -1), be_const_index(4) }, + { be_nested_key("my_design_cb", -1173588798, 12, -1), be_const_closure(my_design_cb_closure) }, + { be_nested_key("atleast1", 1956331672, 8, -1), be_const_closure(atleast1_closure) }, + { be_nested_key("init", 380752755, 4, 8), be_const_closure(init_closure) }, + { be_nested_key("area", -1693507260, 4, 3), be_const_index(5) }, })), (be_nested_const_str("lv_signal_bars", -780994737, 14)) ); diff --git a/tasmota/berry/lvgl_examples/lvgl_demo.be b/tasmota/berry/lvgl_examples/lvgl_demo.be index 34b0a735d..1f995772d 100644 --- a/tasmota/berry/lvgl_examples/lvgl_demo.be +++ b/tasmota/berry/lvgl_examples/lvgl_demo.be @@ -52,96 +52,6 @@ home_label = lv_label(home_btn) home_label.set_text(lv.SYMBOL_OK) - - -class lv_signal_bars : lv_obj - var ancestor_design # previous design_cb - var percentage - var p1, p2, line_dsc, area - - def init(parent, copy) - import global - var lv = global.lv - # init parent object - super(self, global.lv_obj).init(parent, copy) - # keep a copy of - self.ancestor_design = self.get_design_cb() - self.set_design_cb(self.my_design_cb) - # own values - self.percentage = 100 - # pre-allocate buffers - self.p1 = global.lv_point() - self.p2 = global.lv_point() - self.line_dsc = global.lv_draw_line_dsc() - self.area = global.lv_area() - end - - def my_design_cb(area, mode) - import global - var lv = global.lv - def atleast1(x) if x >= 1 return x else return 1 end end - # the model is that we have 4 bars and inter-bar (1/4 of width) - var height = self.get_height() - var width = self.get_width() - - var inter_bar = atleast1(width / 15) - var bar = atleast1((width - inter_bar * 3) / 4) - var bar_offset = bar / 2 - - if mode == lv.DESIGN_COVER_CHK - #- Return false if the object is not covers the clip_area area -# - return self.ancestor_design.call(self, area, mode) - - elif mode == lv.DESIGN_DRAW_MAIN - #self.ancestor_design.call(self, area, mode) - don't draw a background - - # get coordinates of area - self.get_coords(area) - var x_ofs = area.x1 - var y_ofs = area.y1 - - lv.draw_line_dsc_init(self.line_dsc) - self.init_draw_line_dsc(lv.OBJ_PART_MAIN, self.line_dsc) - - self.line_dsc.round_start = 1 - self.line_dsc.round_end = 1 - self.line_dsc.width = bar - var on_color = self.get_style_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) - var off_color = self.get_style_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) - - for i:0..3 - self.line_dsc.color = self.percentage >= (i+1)*20 ? on_color : off_color - self.p1.y = y_ofs + height - 1 - bar_offset - self.p1.x = x_ofs + i * (bar + inter_bar) + bar_offset - self.p2.y = y_ofs + ((3 - i) * (height - bar)) / 4 + bar_offset - self.p2.x = self.p1.x - lv.draw_line(self.p1, self.p2, area, self.line_dsc) - end - #elif mode == lv.DESIGN_DRAW_POST # we don't want a frame around this object - #self.ancestor_design.call(self, area, mode) - end - return lv.DESIGN_RES_OK - end - - def set_percentage(v) - var old_bars = self.percentage / 5 - if v > 100 v = 100 end - if v < 0 v = 0 end - self.percentage = v - if old_bars != v / 5 - self.invalidate() # be frugal and avoid updating the widget if it's not needed - end - end - - def get_percentage() - return self.percentage - end -end - - - - - log_height = log.get_height() # log.get_style_pad_right(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) diff --git a/tasmota/berry/lvgl_examples/signal_bars.be b/tasmota/berry/lvgl_examples/signal_bars.be index be108e7b3..d66c05c36 100644 --- a/tasmota/berry/lvgl_examples/signal_bars.be +++ b/tasmota/berry/lvgl_examples/signal_bars.be @@ -27,16 +27,18 @@ class lv_signal_bars : lv_obj self.area = global.lv_area() end + def atleast1(x) if x >= 1 return x else return 1 end end + def my_design_cb(area, mode) import global var lv = global.lv - def atleast1(x) if x >= 1 return x else return 1 end end + #def atleast1(x) if x >= 1 return x else return 1 end end # the model is that we have 4 bars and inter-bar (1/4 of width) var height = self.get_height() var width = self.get_width() - var inter_bar = atleast1(width / 15) - var bar = atleast1((width - inter_bar * 3) / 4) + var inter_bar = self.atleast1(width / 15) + var bar = self.atleast1((width - inter_bar * 3) / 4) var bar_offset = bar / 2 if mode == lv.DESIGN_COVER_CHK From 669bbf0f5613a6a9116b2a8e4ea3a23365416e75 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 24 Jul 2021 13:45:07 +0200 Subject: [PATCH 034/148] OpenOCD --- boards/esp32-m5core2.json | 3 +++ boards/esp32-odroid.json | 3 +++ boards/esp32c3.json | 8 ++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/boards/esp32-m5core2.json b/boards/esp32-m5core2.json index c5055333a..73ad9d913 100644 --- a/boards/esp32-m5core2.json +++ b/boards/esp32-m5core2.json @@ -18,6 +18,9 @@ "ethernet", "can" ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, "frameworks": [ "arduino", "espidf" diff --git a/boards/esp32-odroid.json b/boards/esp32-odroid.json index 690119675..37c1a4ffa 100644 --- a/boards/esp32-odroid.json +++ b/boards/esp32-odroid.json @@ -18,6 +18,9 @@ "ethernet", "can" ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, "frameworks": [ "arduino", "espidf" diff --git a/boards/esp32c3.json b/boards/esp32c3.json index e4ce02579..cedcf1500 100644 --- a/boards/esp32c3.json +++ b/boards/esp32c3.json @@ -14,8 +14,12 @@ "connectivity": [ "wifi" ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, "frameworks": [ - "arduino" + "arduino", + "espidf" ], "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 1856k Code/OTA, 320k SPIFFS", "upload": { @@ -25,6 +29,6 @@ "require_upload_port": true, "speed": 460800 }, - "url": "https://docs.espressif.com/projects/esp-idf/en/latest", + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html", "vendor": "Espressif" } From 756fdcf5909db6515296d65b0517ab3ee655585a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 24 Jul 2021 13:51:00 +0200 Subject: [PATCH 035/148] Use latest OpenOCD def files --- boards/esp32-cam.json | 2 +- boards/esp32-m5core2.json | 2 +- boards/esp32-odroid.json | 2 +- boards/esp32_16M.json | 2 +- boards/esp32_4M.json | 2 +- boards/esp32_8M.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/boards/esp32-cam.json b/boards/esp32-cam.json index ce02822f5..563f6edd0 100644 --- a/boards/esp32-cam.json +++ b/boards/esp32-cam.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp-wroom-32.cfg" + "openocd_board": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32-m5core2.json b/boards/esp32-m5core2.json index 73ad9d913..a8624c04f 100644 --- a/boards/esp32-m5core2.json +++ b/boards/esp32-m5core2.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp-wroom-32.cfg" + "openocd_board": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32-odroid.json b/boards/esp32-odroid.json index 37c1a4ffa..76ba5ed47 100644 --- a/boards/esp32-odroid.json +++ b/boards/esp32-odroid.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp-wroom-32.cfg" + "openocd_board": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32_16M.json b/boards/esp32_16M.json index 6ebd73c76..ce7189206 100644 --- a/boards/esp32_16M.json +++ b/boards/esp32_16M.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp-wroom-32.cfg" + "openocd_board": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json index 91ee508ea..f6cd41545 100644 --- a/boards/esp32_4M.json +++ b/boards/esp32_4M.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp-wroom-32.cfg" + "openocd_board": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32_8M.json b/boards/esp32_8M.json index ad13a394f..673d21427 100644 --- a/boards/esp32_8M.json +++ b/boards/esp32_8M.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp-wroom-32.cfg" + "openocd_board": "esp32.cfg" }, "frameworks": [ "arduino", From 9eab9c64760da5bef589eb9564f6995d1a548025 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 24 Jul 2021 18:03:13 +0200 Subject: [PATCH 036/148] openocd_target --- boards/esp32-cam.json | 2 +- boards/esp32-m5core2.json | 2 +- boards/esp32-odroid.json | 2 +- boards/esp32_16M.json | 2 +- boards/esp32_4M.json | 2 +- boards/esp32_8M.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/boards/esp32-cam.json b/boards/esp32-cam.json index 563f6edd0..e9b30d24f 100644 --- a/boards/esp32-cam.json +++ b/boards/esp32-cam.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp32.cfg" + "openocd_target": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32-m5core2.json b/boards/esp32-m5core2.json index a8624c04f..0170649fa 100644 --- a/boards/esp32-m5core2.json +++ b/boards/esp32-m5core2.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp32.cfg" + "openocd_target": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32-odroid.json b/boards/esp32-odroid.json index 76ba5ed47..28b82ba29 100644 --- a/boards/esp32-odroid.json +++ b/boards/esp32-odroid.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp32.cfg" + "openocd_target": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32_16M.json b/boards/esp32_16M.json index ce7189206..7bcc0db53 100644 --- a/boards/esp32_16M.json +++ b/boards/esp32_16M.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp32.cfg" + "openocd_target": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json index f6cd41545..4f549bb3e 100644 --- a/boards/esp32_4M.json +++ b/boards/esp32_4M.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp32.cfg" + "openocd_target": "esp32.cfg" }, "frameworks": [ "arduino", diff --git a/boards/esp32_8M.json b/boards/esp32_8M.json index 673d21427..616eb16d3 100644 --- a/boards/esp32_8M.json +++ b/boards/esp32_8M.json @@ -19,7 +19,7 @@ "can" ], "debug": { - "openocd_board": "esp32.cfg" + "openocd_target": "esp32.cfg" }, "frameworks": [ "arduino", From 21c3ac67275373a6dabbf1fb891ff33376454787 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 25 Jul 2021 12:50:58 +0200 Subject: [PATCH 037/148] Berry add ``tasmota.wifi()`` and ``tasmota.eth()`` --- CHANGELOG.md | 1 + lib/libesp32/Berry/default/be_tasmotalib.c | 6 + lib/libesp32/Berry/generate/be_const_strtab.h | 1294 +++++------ .../Berry/generate/be_const_strtab_def.h | 1919 +++++++++-------- .../generate/be_fixed_be_class_tasmota.h | 116 +- tasmota/xdrv_52_3_berry_tasmota.ino | 49 +- 6 files changed, 1723 insertions(+), 1662 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28c5bbcde..3c02dacaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout (#12651) - Berry ESP32 support for I2S audio mp3 playback - Berry add module ``introspect`` +- Berry add ``tasmota.wifi()`` and ``tasmota.eth()`` ### Changed - ESP32 core library from v1.0.7.1 to v1.0.7.3 diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index 40f4ac14b..4a853087a 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -16,6 +16,8 @@ extern int l_timereached(bvm *vm); extern int l_rtc(bvm *vm); extern int l_time_dump(bvm *vm); extern int l_memory(bvm *vm); +extern int l_wifi(bvm *vm); +extern int l_eth(bvm *vm); extern int l_yield(bvm *vm); extern int l_delay(bvm *vm); extern int l_scaleuint(bvm *vm); @@ -2304,6 +2306,8 @@ void be_load_tasmota_ntvlib(bvm *vm) { "rtc", l_rtc }, { "time_dump", l_time_dump }, { "memory", l_memory }, + { "wifi", l_wifi }, + { "eth", l_eth }, { "yield", l_yield }, { "delay", l_delay }, { "scale_uint", l_scaleuint }, @@ -2386,6 +2390,8 @@ class be_class_tasmota (scope: global, name: Tasmota) { rtc, func(l_rtc) time_dump, func(l_time_dump) memory, func(l_memory) + wifi, func(l_wifi) + eth, func(l_eth) yield, func(l_yield) delay, func(l_delay) scale_uint, func(l_scaleuint) diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 963456f4f..c25261edc 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,660 +1,662 @@ -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_WEBCAM_XCLK; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_SDM72_TX; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_SM16716_SEL; -extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_web_add_console_button; -extern const bcstring be_const_str_web_sensor; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_I2S_OUT_DATA; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_SDM630_TX; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str_lv_signal_cb; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_SSPI_DC; extern const bcstring be_const_str_ADC_TEMP; -extern const bcstring be_const_str_I2C_SCL; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_lv_sqrt_res; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_members; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_close; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_toint; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str_TM1637CLK; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_KEY1_INV; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_I2C_SDA; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_I2S_IN_CLK; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_MGC3130_RESET; extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_display; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_TM1637DIO; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_PWM1_INV; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_SYMBOL_PLAY; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_Driver; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_CNTR1; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_SYMBOL_EJECT; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_GPS_TX; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_web_send; extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_web_sensor; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_SYMBOL_SETTINGS; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_button_pressed; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_load_font; +extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_millis; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_RDM6300_RX; +extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_web_add_console_button; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_SYMBOL_AUDIO; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_NRG_CF1; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_TASMOTACLIENT_RST; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str_arg_size; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_SYMBOL_OK; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_LEDLNK_INV; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_Driver; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_web_add_management_button; +extern const bcstring be_const_str_I2S_OUT_CLK; +extern const bcstring be_const_str_SYMBOL_SHUFFLE; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str_elif; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str__end_transmission; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_json_append; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; +extern const bcstring be_const_str_web_add_config_button; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_find_key_i; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_SYMBOL_RIGHT; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_LE01MR_RX; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_SYMBOL_PAUSE; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_AZ_RXD; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_SM16716_SEL; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_TELEINFO_ENABLE; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_VL53L0X_XSHUT1; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_DDS2382_TX; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_PWM1; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_lv_line; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_SSD1351_CS; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_every_100ms; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_REL1; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_return; +extern const bcstring be_const_str_MAX31855DO; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_seg7_font; +extern const bcstring be_const_str_SYMBOL_GPS; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_AudioFileSourceFS; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_MIEL_HVAC_TX; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_KEY1; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_SYMBOL_LEFT; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_wire1; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_members; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_push; extern const bcstring be_const_str_TASMOTACLIENT_RXD; extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_ROT1A; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_return; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_every_100ms; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_get_tasmota; -extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_BOILER_OT_TX; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_REL1_INV; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_SR04_TRIG; -extern const bcstring be_const_str_lv_cb; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_isrunning; -extern const bcstring be_const_str_web_add_button; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str_start; extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_every_second; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_KEY1_PD; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_web_add_handler; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_I2S_OUT_CLK; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_HPMA_TX; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_SYMBOL_BULLET; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_ILI9341_CS; -extern const bcstring be_const_str_NRG_SEL_INV; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_WEBCAM_PSCLK; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_I2S_OUT_SLCT; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str_SYMBOL_CHARGE; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_HLW_CF; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_SWT1_PD; -extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_MGC3130_RESET; extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str_lv_draw_mask_radius_param; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str_every_50ms; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_I2S_IN_SLCT; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_SYMBOL_NEXT; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_web_add_main_button; -extern const bcstring be_const_str_CNTR1_NP; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_web_add_config_button; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_lv_draw_mask_saved; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_KEY1_INV_PD; -extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_INTERRUPT; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_json_append; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str_OUTPUT_LO; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_I2S_IN_DATA; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_ZEROCROSS; -extern const bcstring be_const_str_AZ_RXD; -extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_RC522_CS; extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_BL0940_RX; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_A4988_DIR; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_GPS_RX; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_WEBCAM_SIOC; -extern const bcstring be_const_str_web_add_management_button; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_PN532_RXD; -extern const bcstring be_const_str_update; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_WE517_RX; -extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_tostring; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_item; extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_button_pressed; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_publish_result; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_setbits; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_every_50ms; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_HX711_DAT; extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_WIEGAND_D1; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_chars_in_string; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_DI; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_yield; extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_save_before_restart; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_MAX7219CLK; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str_HRE_DATA; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_state; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_web_add_button; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_CSE7766_TX; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str_lv_dropdown; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_remove_cmd; extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_toint; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_WEBCAM_SIOD; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_SYMBOL_MUTE; extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_CNTR1_NP; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_publish_result; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_get; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_I2C_Driver; +extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str_SWT1_NP; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_SR04_TRIG; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_AZ_TXD; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_SDM72_TX; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str___lower__; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_SYMBOL_USB; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_SWT1_PD; +extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_get_light; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str_OPTION_A; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_screenshot; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str_lv_draw_label_dsc; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_web_add_handler; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_lv_signal_cb; +extern const bcstring be_const_str_update; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_AudioGeneratorMP3; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str__buffer; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_BUZZER; +extern const bcstring be_const_str_MGC3130_XFER; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str_SENSOR_END; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_bytes; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_SYMBOL_BATTERY_3; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_reverse_gamma10; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_add_rule; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_wifi; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_every_second; +extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; +extern const bcstring be_const_str_SYMBOL_CHARGE; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_SSD1351_DC; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_SDM630_TX; +extern const bcstring be_const_str_SDM72_RX; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str_display; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_size; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_has_arg; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_resize; extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_close; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_exec_rules; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str__ccmd; +extern const bcstring be_const_str_lv_tileview; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_save_before_restart; +extern const bcstring be_const_str_cmd; +extern const bcstring be_const_str_get_tasmota; +extern const bcstring be_const_str_loop; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_lv_slider; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str_DHT22; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_web_add_main_button; +extern const bcstring be_const_str_AS3935; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_MD5; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_KEY1_TC; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_SI7021; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_eth; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_class; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index 1a2307703..5c2fa593f 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,988 +1,991 @@ -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_attrdump); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, NULL); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str___upper__); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_lv_line); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_tostring); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_SYMBOL_OK); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_log10); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_TM1638STB); -be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_IEM3000_RX); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_SSPI_SCLK); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_WEBCAM_XCLK); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_lv_keyboard); -be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_wire1); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_ST7789_CS); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_lv_draw_mask_radius_param_cfg); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_lv_list); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_SDM72_TX); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str___lower__); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str__drivers); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, NULL); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_SSD1351_DC); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, NULL); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_WEBCAM_RESET); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_pin); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_add); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_lv_design_cb); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, NULL); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_SM16716_DAT); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, NULL); -be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, NULL); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, NULL); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_SSPI_MOSI); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_web_add_console_button); -be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, &be_const_str_web_sensor); -be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_time_dump); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, NULL); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_SM16716_CLK); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, NULL); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_TFMINIPLUS_TX); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_begin); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_lv_roller); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, &be_const_str_seti); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_super); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, NULL); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_arg_size); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_count); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_response_append); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL); -be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, NULL); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_asstring); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_try_rule); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_PN532_TXD); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_SDM630_TX); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_SPI_MOSI); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str__available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_find); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_lv_draw_mask_line_param); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); -be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_push); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, NULL); be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, NULL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_MCP39F5_TX); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_SDCARD_CS); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, NULL); -be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_LE01MR_RX); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_LOW); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, NULL); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_LEDLNK_INV); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, NULL); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, &be_const_str_def); -be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, NULL); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_rtc); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, NULL); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_NEOPOOL_RX); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_OUTPUT_HI); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_content_flush); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_TFMINIPLUS_RX); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ARIRFRCV); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_members); -be_define_const_str(members, "members", 937576464u, 0, 7, NULL); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_close); -be_define_const_str(close, "close", 667630371u, 0, 5, NULL); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_input); -be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_INPUT_PULLUP); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_toint); -be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_assert); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_lv_draw_mask_angle_param_cfg); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, &be_const_str_web_send); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SYMBOL_REFRESH); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_lv_area); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_setmember); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_SDCARD_CS); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str___upper__); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, NULL); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_KEY1_NP); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, NULL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_SYMBOL_EJECT); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_read8); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_lv_draw_mask_angle_param_cfg); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, &be_const_str_lv_draw_rect_dsc); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, &be_const_str_web_send); be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_ILI9341_DC); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_PMS5003_RX); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_PZEM016_RX); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SPI_DC); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_map); -be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_memory); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_SYMBOL_BELL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_IBEACON_RX); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_SYMBOL_BATTERY_FULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_get_light); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_ceil); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_load_font); -be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_SYMBOL_SD_CARD); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_lv_draw_mask_common_dsc); -be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str__read); -be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_resp_cmnd); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_BACKLIGHT); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, NULL); -be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_lv_textarea); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_SSPI_MAX31865_CS1); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_SYMBOL_DIRECTORY); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_lv_event_cb); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_lv_dropdown); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_rand); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_I2S_IN_CLK); -be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_SYMBOL_EYE_OPEN); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_lv_style); -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_IRRECV); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_OLED_RESET); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_TELEINFO_RX); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_remove_rule); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_set); -be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_digital_read); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_int); -be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_SYMBOL_REFRESH); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_stop); -be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_class); -be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_clear); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_imax); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_init); -be_define_const_str(init, "init", 380752755u, 0, 4, NULL); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_RXD); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str__ccmd); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, NULL); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_SYMBOL_PASTE); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_SYMBOL_PLAY); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_lv_btn); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, NULL); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_get_free_heap); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_SBR_TX); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_type); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SYMBOL_DIRECTORY); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, NULL); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_RFSEND); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); +be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, &be_const_str_def); +be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_type); be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_Driver); -be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, &be_const_str_MAX7219DIN); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_TASMOTACLIENT_RXD); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_compile); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str__rules); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_SYMBOL_CUT); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str_lv_draw_mask_angle_param); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_SWT1_NP); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, NULL); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_RDM6300_RX); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_codedump); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_exp); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_gc); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_CSE7766_TX); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_NONE); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SYMBOL_EYE_CLOSE); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_millis); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_module); -be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_return); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_every_100ms); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_lv_arc); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_ctypes_bytes); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_get_tasmota); -be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, NULL); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_TASMOTACLIENT_RST); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, NULL); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_content_start); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, NULL); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); -be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_save); -be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, NULL); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SYMBOL_DRIVE); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_resp_cmnd_failed); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_cosh); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_lv_btnmatrix); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, &be_const_str_for); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_find_key_i); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_draw_mask_map_param_cfg); -be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_REL1_INV); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_lv_cb); -be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_ZIGBEE_RST); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, NULL); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_isrunning); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_web_add_button); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_lv_switch); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_start); -be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_set_timer); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_KEY1_PD); -be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_OUTPUT_OPEN_DRAIN); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_SDS0X1_RX); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_SYMBOL_PAUSE); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_WS2812); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_dump); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_publish); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_addr); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_lv_draw_img_dsc); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); -be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_scan); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_top); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SYMBOL_PREV); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_set_power); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_DDS2382_TX); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, NULL); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_indev); -be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, &be_const_str_end); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_call); -be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_copy); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_fromstring); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, NULL); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_NRG_SEL_INV); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_SYMBOL_VOLUME_MAX); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_lv_draw_mask_line_param_cfg); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_get); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, NULL); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_collect); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, NULL); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_lv_linemeter); -be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_try); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SPI_CLK); -be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_var); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_gamma8); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, NULL); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, NULL); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_TASMOTACLIENT_TXD); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_DHT11_OUT); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_KEY1_NP); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_SPI_CS); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, NULL); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, NULL); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_cb_dispatch); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_lv_group_focus_cb); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_NRG_CF1); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_SBR_RX); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str__timers); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_set_light); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); -be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, &be_const_str_resp_cmnd_str); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_wire_scan); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_HLW_CF); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_KEY1_TC); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_ROT1B); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, NULL); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_SYMBOL_POWER); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_TCP_RX); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); -be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_SYMBOL_EJECT); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_setrange); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_lv_page); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_MGC3130_RESET); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_TXD); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, NULL); -be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, NULL); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_arg_name); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, NULL); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SHELLY_DIMMER_RST_INV); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_SYMBOL_NEW_LINE); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_AudioOutputI2S); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_I2S_IN_SLCT); -be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_read); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, NULL); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_yield); -be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_SYMBOL_NEXT); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_event); -be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SYMBOL_BATTERY_EMPTY); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str_lv_draw_label_dsc); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_run_deferred); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_web_add_main_button); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_SAIR_TX); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_SYMBOL_EDIT); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_TX2X_TXD_BLACK); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, NULL); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, NULL); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_HJL_CF); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_atan); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_web_add_config_button); -be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); -be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, NULL); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_lv_label); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_WEBCAM_HSD); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, NULL); -be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, NULL); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, NULL); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_loop); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(upper, "upper", 176974407u, 0, 5, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_acos); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_lv_tileview); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); -be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SYMBOL_BATTERY_3); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, NULL); -be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_ETH_PHY_MDIO); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_resp_cmnd_error); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_setbits); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, &be_const_str_except); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_cos); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_SM2135_CLK); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_MAX31855CS); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_lv_objmask); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); -be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_WEBCAM_PWDN); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_ZIGBEE_TX); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_SBR_TX); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_SYMBOL_SETTINGS); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_button_pressed); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_get_power); be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_lv_cont); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_lv_point); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_getbits); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_load_font); +be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_TASMOTACLIENT_TXD); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_pin); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, NULL); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str___iterator__); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_millis); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_delay); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str__drivers); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, NULL); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SYMBOL_POWER); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, NULL); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, NULL); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_lv_style); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, NULL); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_SYMBOL_GPS); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_SYMBOL_KEYBOARD); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_static); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SDM120_RX); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_chars_in_string); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_TUYA_RX); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_lv_area); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_opt_connect); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_SYMBOL_HOME); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_format); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_hex); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_read8); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, &be_const_str_raise); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_SAIR_TX); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_deg); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_gen_cb); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_start); +be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); +be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_TM1638STB); +be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_NRF24_CS); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_write_bit); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_SYMBOL_AUDIO); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_setitem); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_write_bit); be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_SDM120_TX); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_imin); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, NULL); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_MIEL_HVAC_TX); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_MP3_DFR562); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_RC522_CS); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_add_cmd); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_ILI9488_CS); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_SYMBOL_STOP); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_SYMBOL_UP); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_WEBCAM_VSYNC); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_byte); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); -be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_resolvecmnd); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_SYMBOL_CALL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, NULL); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_true); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_SYMBOL_BACKSPACE); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_calldepth); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_write); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_cmd); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_add_driver); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_content_button); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); -be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_resize); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_MHZ_RXD); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SYMBOL_BATTERY_1); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_WEBCAM_PCLK); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, NULL); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_WE517_TX); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_char); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_lv_cpicker); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_LE01MR_TX); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_WEBCAM_SIOC); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_web_add_management_button); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, NULL); -be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_PN532_RXD); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_update); -be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, NULL); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_redirect); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_WE517_RX); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_lv_img); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_tolower); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_stop); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_SYMBOL_MINUS); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, NULL); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_iter); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_lv_draw_mask_saved); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_call); +be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, NULL); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_NRG_SEL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, NULL); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_SM16716_DAT); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_SYMBOL_CALL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_TM1638CLK); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_MIEL_HVAC_RX); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, NULL); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_DHT11); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_tolower); be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_button_pressed); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_publish_result); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_range); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, NULL); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_read24); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_read_bytes); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, NULL); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, NULL); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_ROT1B_NP); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_Wire); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str__begin_transmission); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_TM1637CLK); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_arg_size); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_input); +be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_WIEGAND_D1); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_ETH_PHY_MDC); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_HIGH); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_LEDLNK_INV); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_AudioGenerator); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_DDS2382_RX); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str__cmd); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); +be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, NULL); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, NULL); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_WEBCAM_XCLK); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, NULL); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SYMBOL_SHUFFLE); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_set); +be_define_const_str(set, "set", 3324446467u, 0, 3, &be_const_str_elif); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, NULL); +be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_ILI9488_CS); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_SAIR_RX); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, NULL); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_SYMBOL_CUT); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, NULL); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_lv_sqrt_res); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, NULL); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_FTC532); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, NULL); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_WIEGAND_D0); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str__end_transmission); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_read32); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_for); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_log); +be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_range); be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_lv_gauge_format_cb); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_read12); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_EPAPER42_CS); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_content_send); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_seg7_font); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, NULL); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_SYMBOL_VIDEO); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, &be_const_str_content_stop); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_lv_canvas); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_save_before_restart); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_SSPI_MISO); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_erase); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_TM1638DIO); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, NULL); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_SYMBOL_FILE); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, NULL); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_PZEM017_RX); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_read24); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_state); -be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str__buffer); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_scale_uint); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_WINDMETER_SPEED); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_Wire); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_bus); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_ADC_INPUT); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_lv_spinbox); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, NULL); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_PN532_TXD); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_json_append); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_TASMOTACLIENT_RST_INV); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_web_add_config_button); +be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_find_key_i); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_msgbox); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, NULL); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_SYMBOL_RIGHT); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_WEBCAM_PCLK); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_lv_spinbox); be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_geti); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_SYMBOL_PAUSE); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_SHELLY_DIMMER_RST_INV); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_lv_led); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_set_power); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, &be_const_str_seti); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, &be_const_str_acos); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_TX2X_TXD_BLACK); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_WEBCAM_PSCLK); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_find_op); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, NULL); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_isinstance); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_CSE7766_RX); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_SM16716_SEL); +be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_cb_dispatch); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, NULL); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str__available); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_true); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_SYMBOL_BULLET); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_SYMBOL_EDIT); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_name); +be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_DDS2382_TX); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_WEBCAM_HREF); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str_WEBCAM_HSD); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_attrdump); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_resp_cmnd); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_ZIGBEE_RX); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str_memory); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_pin_mode); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, NULL); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_write_bytes); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, &be_const_str_except); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); +be_define_const_str(init, "init", 380752755u, 0, 4, NULL); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_SPI_CS); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str__timers); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_lv_draw_mask_map_param_cfg); +be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, NULL); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str_bus); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_checkbox); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, NULL); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_WINDMETER_SPEED); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str__request_from); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_every_100ms); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, NULL); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_MAX31855CLK); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_MCP39F5_TX); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_REL1); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_content_send_style); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_return); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_asstring); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_remove_rule); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_seg7_font); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_ILI9341_CS); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_add_driver); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_member); +be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_response_append); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_lv_canvas); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_MIEL_HVAC_TX); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_lv_indev); +be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, NULL); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_OLED_RESET); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SYMBOL_LEFT); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, NULL); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_lv_table); +be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_SYMBOL_PASTE); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_lv_spinner); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_calldepth); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_members); +be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_lv_page); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_resp_cmnd_str); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_lv_cont); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_tan); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_ST7789_CS); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, NULL); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_RC522_CS); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, NULL); +be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_compile); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_wire2); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_add_cmd); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_event); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_lv_color); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_classof); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, NULL); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_SSPI_MAX31865_CS1); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_SYMBOL_SD_CARD); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, NULL); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_item); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_setbits); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_OUTPUT_LO); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_every_50ms); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_TCP_TX); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_lv_btnmatrix); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_HX711_DAT); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_read12); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, NULL); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_write8); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_ETH_PHY_POWER); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_SOLAXX1_RX); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_yield); +be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, NULL); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_web_add_button); +be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_TM1637DIO); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_WEBCAM_DATA); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_ZIGBEE_RST); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_lv_dropdown); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_ctypes_bytes); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SSPI_DC); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_imin); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_SYMBOL_BATTERY_FULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, NULL); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_top); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_toint); +be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_content_stop); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_gc); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_ceil); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, NULL); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_SM16716_CLK); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_SYMBOL_MUTE); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, NULL); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_lv_draw_mask_fade_param); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_DYP_RX); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_resolvecmnd); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); +be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str__cb); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_CSE7761_RX); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_ETH_PHY_MDIO); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SYMBOL_TRASH); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_check_privileged_access); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_lv_list); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_content_send); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_imax); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_publish_result); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_PZEM017_RX); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_SPI_CLK); +be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_scale_uint); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SYMBOL_COPY); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_SYMBOL_SAVE); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_get); +be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_ZIGBEE_TX); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_I2C_Driver); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_NONE); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SSD1331_DC); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_SWT1_NP); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_digital_write); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, NULL); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_floor); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_real); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_PN532_RXD); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_SM2135_DAT); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_int); +be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SR04_TRIG); +be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_SYMBOL_BATTERY_1); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_byte); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_resp_cmnd_error); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_WEBCAM_PSRCS); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, NULL); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_SDM630_RX); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_SDM72_TX); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str___lower__); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str__read); +be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, &be_const_str_arg); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_deinit); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_load_freetype_font); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_SWT1_PD); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_lv_cb); +be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_PZEM004_RX); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_content_flush); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_get_light); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_lv_group_focus_cb); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_log10); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_redirect); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_SYMBOL_STOP); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_lv_draw_label_dsc); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_web_add_handler); +be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); +be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_signal_cb); +be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_update); +be_define_const_str(update, "update", 672109684u, 0, 6, NULL); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_SYMBOL_CLOSE); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_WEBCAM_VSYNC); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_lv_label); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_SSD1331_CS); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str__buffer); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_SYMBOL_DOWNLOAD); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_lower); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_MGC3130_XFER); +be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SYMBOL_BLUETOOTH); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, NULL); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_TM1638DIO); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, NULL); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, NULL); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_WE517_TX); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_OUTPUT); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_RF_SENSOR); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_bytes); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_SYMBOL_BATTERY_3); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_i2c_enabled); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_OUTPUT_HI); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_BOILER_OT_TX); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_add_rule); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_fromstring); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_lv_arc); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_publish); +be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_wifi); +be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_every_second); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_lv_draw_mask_line_param_cfg); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, NULL); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_lv_bar); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_as); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); +be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_SDM72_RX); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, NULL); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str_display); +be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, NULL); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_draw_mask_angle_param); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_resp_cmnd_failed); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_cosh); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_size); +be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, &be_const_str_write); +be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, NULL); +be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, &be_const_str_SYMBOL_UPLOAD); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, NULL); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_digital_read); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_has_arg); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_number); +be_define_const_str(number, "number", 467038368u, 0, 6, NULL); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_SYMBOL_DOWN); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_close); +be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_lv_cpicker); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, &be_const_str_split); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_SSPI_MISO); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str__ccmd); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_lv_tileview); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, NULL); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_LED1_INV); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_MCP39F5_RX); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, NULL); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_save_before_restart); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_get_tasmota); +be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, &be_const_str_loop); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, &be_const_str_lv_group); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, NULL); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, NULL); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_LE01MR_TX); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_SYMBOL_PREV); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, NULL); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, &be_const_str_lv_draw_mask_line_param); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, &be_const_str_lv_roller); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, &be_const_str_web_add_main_button); +be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_ST7789_DC); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_ZEROCROSS); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_collect); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_codedump); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_lv_keyboard); +be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_gamma8); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_state); +be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, NULL); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_SYMBOL_EYE_OPEN); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_eth); +be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_concat); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_get_free_heap); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_lv_draw_mask_fade_param_cfg); +be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_issubclass); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_class); +be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_ROT1B_NP, - NULL, - (const bstring *)&be_const_str_SYMBOL_LOOP, - (const bstring *)&be_const_str_DCKI, - (const bstring *)&be_const_str_SYMBOL_LEFT, - (const bstring *)&be_const_str_SR04_ECHO, - (const bstring *)&be_const_str_CHANGE, - NULL, - (const bstring *)&be_const_str_LED1_INV, - (const bstring *)&be_const_str_lv_calendar, - (const bstring *)&be_const_str_arg, - (const bstring *)&be_const_str_TUYA_TX, - (const bstring *)&be_const_str_ADC_CT_POWER, - (const bstring *)&be_const_str_SDM630_RX, - NULL, - (const bstring *)&be_const_str_HALLEFFECT, - (const bstring *)&be_const_str___iterator__, - (const bstring *)&be_const_str_SYMBOL_MUTE, - NULL, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_PULLUP, - (const bstring *)&be_const_str_abs, - (const bstring *)&be_const_str_AS608_TX, - (const bstring *)&be_const_str_SM16716_SEL, - (const bstring *)&be_const_str_REL1, - (const bstring *)&be_const_str_MAX31855DO, - (const bstring *)&be_const_str_iter, - (const bstring *)&be_const_str_lv_bar, - (const bstring *)&be_const_str_floor, - NULL, - (const bstring *)&be_const_str_PWM1, - (const bstring *)&be_const_str_SSPI_CS, - (const bstring *)&be_const_str_MAX7219CS, - NULL, - (const bstring *)&be_const_str_WEBCAM_PSRCS, - (const bstring *)&be_const_str_LMT01, - (const bstring *)&be_const_str_has_arg, - (const bstring *)&be_const_str_I2S_OUT_DATA, - (const bstring *)&be_const_str_gen_cb, - (const bstring *)&be_const_str_SYMBOL_BLUETOOTH, - (const bstring *)&be_const_str_SDM72_RX, - (const bstring *)&be_const_str_MIEL_HVAC_RX, - (const bstring *)&be_const_str_lv_signal_cb, - (const bstring *)&be_const_str_SSPI_DC, (const bstring *)&be_const_str_ADC_TEMP, - (const bstring *)&be_const_str_I2C_SCL, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_IBEACON_TX, - (const bstring *)&be_const_str_AZ_TXD, - (const bstring *)&be_const_str_lv_sqrt_res, - (const bstring *)&be_const_str_opt_call, - (const bstring *)&be_const_str_isinstance, - (const bstring *)&be_const_str_WEBCAM_DATA, - (const bstring *)&be_const_str_KEY1_INV_NP, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_A4988_MS1, - (const bstring *)&be_const_str_AS3935, - NULL, - (const bstring *)&be_const_str_lv_draw_rect_dsc, - (const bstring *)&be_const_str_SOLAXX1_RX, - (const bstring *)&be_const_str_geti, - (const bstring *)&be_const_str_DHT11, - NULL, - (const bstring *)&be_const_str_i2c_enabled, - (const bstring *)&be_const_str_PZEM004_RX, - (const bstring *)&be_const_str_TM1637CLK, - (const bstring *)&be_const_str_read32, - (const bstring *)&be_const_str_EPAPER29_CS, - (const bstring *)&be_const_str_KEY1, - (const bstring *)&be_const_str_LEDLNK, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str_exec_cmd, - NULL, - NULL, - (const bstring *)&be_const_str_KEY1_INV, - (const bstring *)&be_const_str_FTC532, - (const bstring *)&be_const_str_SSD1331_DC, - (const bstring *)&be_const_str_ADC_BUTTON_INV, - (const bstring *)&be_const_str_name, - (const bstring *)&be_const_str_classname, - (const bstring *)&be_const_str_SSD1351_CS, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_while, - (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str_MGC3130_RESET, (const bstring *)&be_const_str_ADE7953_IRQ, + (const bstring *)&be_const_str_A4988_DIR, + (const bstring *)&be_const_str_copy, + (const bstring *)&be_const_str_CNTR1, + (const bstring *)&be_const_str_BACKLIGHT, + (const bstring *)&be_const_str_SYMBOL_BELL, + (const bstring *)&be_const_str_GPS_TX, + (const bstring *)&be_const_str_MAX7219DIN, + (const bstring *)&be_const_str_hex, + (const bstring *)&be_const_str_EPAPER42_CS, + (const bstring *)&be_const_str_web_sensor, + (const bstring *)&be_const_str_SYMBOL_VOLUME_MAX, + (const bstring *)&be_const_str_WEBCAM_PWDN, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_IRSEND, + (const bstring *)&be_const_str_MP3_DFR562, + (const bstring *)&be_const_str_finish, + (const bstring *)&be_const_str_dot_p, + (const bstring *)&be_const_str_SYMBOL_PLAY, + NULL, + (const bstring *)&be_const_str_IRRECV, + (const bstring *)&be_const_str_ROT1A_NP, + (const bstring *)&be_const_str_PZEM0XX_TX, + (const bstring *)&be_const_str_TUYA_TX, + (const bstring *)&be_const_str_opt_call, + (const bstring *)&be_const_str_INPUT, + (const bstring *)&be_const_str_RDM6300_RX, + (const bstring *)&be_const_str_NRG_SEL_INV, + (const bstring *)&be_const_str_lv_point, + (const bstring *)&be_const_str_MAX31855CS, + (const bstring *)&be_const_str_web_add_console_button, + (const bstring *)&be_const_str_NRF24_DC, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_raise, + (const bstring *)&be_const_str_ROT1A, + (const bstring *)&be_const_str_NRG_CF1, + (const bstring *)&be_const_str_HPMA_RX, + (const bstring *)&be_const_str_exec_cmd, + (const bstring *)&be_const_str_exp, + (const bstring *)&be_const_str_SYMBOL_BACKSPACE, + NULL, + (const bstring *)&be_const_str_HRE_DATA, + (const bstring *)&be_const_str_NEOPOOL_TX, (const bstring *)&be_const_str_DSB_OUT, + (const bstring *)&be_const_str_ADC_BUTTON_INV, + NULL, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_BOILER_OT_RX, + (const bstring *)&be_const_str_PMS5003_RX, + (const bstring *)&be_const_str_PULLUP, + NULL, + (const bstring *)&be_const_str_TASMOTACLIENT_RST, + (const bstring *)&be_const_str_SPI_MOSI, + (const bstring *)&be_const_str_IBEACON_RX, + (const bstring *)&be_const_str_BS814_CLK, + (const bstring *)&be_const_str_SSPI_MOSI, + NULL, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_SYMBOL_OK, + (const bstring *)&be_const_str_CHANGE, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_Driver, + (const bstring *)&be_const_str_lv_chart, + (const bstring *)&be_const_str_LED1, + (const bstring *)&be_const_str_web_add_management_button, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_Tasmota, + (const bstring *)&be_const_str_read, + (const bstring *)&be_const_str_SYMBOL_LIST, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_save, + (const bstring *)&be_const_str_EXS_ENABLE, + (const bstring *)&be_const_str_NEOPOOL_RX, + (const bstring *)&be_const_str_arg_name, + NULL, + (const bstring *)&be_const_str_I2S_OUT_SLCT, + (const bstring *)&be_const_str_ADC_INPUT, + (const bstring *)&be_const_str_SYMBOL_KEYBOARD, + (const bstring *)&be_const_str_WEBCAM_RESET, + (const bstring *)&be_const_str_RFRECV, + (const bstring *)&be_const_str_format, + (const bstring *)&be_const_str_RC522_RST, + (const bstring *)&be_const_str_PMS5003_TX, + (const bstring *)&be_const_str_SYMBOL_HOME, + (const bstring *)&be_const_str_SYMBOL_WARNING, + (const bstring *)&be_const_str_HJL_CF, + (const bstring *)&be_const_str_SYMBOL_LOOP, + (const bstring *)&be_const_str_LE01MR_RX, + (const bstring *)&be_const_str_SPI_MISO, + (const bstring *)&be_const_str_SM2135_CLK, + (const bstring *)&be_const_str_P9813_DAT, + (const bstring *)&be_const_str_ROT1B, + (const bstring *)&be_const_str_lv_calendar, + (const bstring *)&be_const_str_TFMINIPLUS_RX, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_IBEACON_TX, + (const bstring *)&be_const_str_WS2812, + (const bstring *)&be_const_str_AZ_RXD, + (const bstring *)&be_const_str_KEY1_PD, + (const bstring *)&be_const_str_TELEINFO_ENABLE, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_VL53L0X_XSHUT1, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str__write, + (const bstring *)&be_const_str_PWM1, + (const bstring *)&be_const_str_WEBCAM_SIOC, (const bstring *)&be_const_str_RA8876_CS, - (const bstring *)&be_const_str_getbits, - (const bstring *)&be_const_str_SSD1331_CS, - (const bstring *)&be_const_str_SYMBOL_DUMMY, - (const bstring *)&be_const_str_MAX31855CLK, NULL, + (const bstring *)&be_const_str_IEM3000_TX, + (const bstring *)&be_const_str_SPI_DC, + (const bstring *)&be_const_str_SWT1, + (const bstring *)&be_const_str_get_option, + (const bstring *)&be_const_str_lv_line, + (const bstring *)&be_const_str_init, (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, - (const bstring *)&be_const_str_display, - (const bstring *)&be_const_str_DYP_RX, - (const bstring *)&be_const_str_SYMBOL_BATTERY_2, - (const bstring *)&be_const_str_TM1637DIO, - (const bstring *)&be_const_str_PWM1_INV, + (const bstring *)&be_const_str_LMT01, NULL, + (const bstring *)&be_const_str_ADC_CT_POWER, + (const bstring *)&be_const_str_DCKI, + (const bstring *)&be_const_str_SBR_RX, + (const bstring *)&be_const_str_SSD1351_CS, + NULL, + (const bstring *)&be_const_str_ARIRFRCV, + (const bstring *)&be_const_str_try_rule, + (const bstring *)&be_const_str_var, + (const bstring *)&be_const_str_HALLEFFECT, + (const bstring *)&be_const_str_MAX31855DO, + (const bstring *)&be_const_str_lv_gauge_format_cb, + (const bstring *)&be_const_str_SYMBOL_GPS, + (const bstring *)&be_const_str_opt_neq, + (const bstring *)&be_const_str_HM10_TX, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_INPUT_PULLUP, + (const bstring *)&be_const_str_KEY1, + (const bstring *)&be_const_str_lv_event_cb, + (const bstring *)&be_const_str_TFMINIPLUS_TX, + (const bstring *)&be_const_str_I2C_SCL, + (const bstring *)&be_const_str_wire1, + (const bstring *)&be_const_str_SYMBOL_FILE, + (const bstring *)&be_const_str_LEDLNK, + (const bstring *)&be_const_str_SYMBOL_PLUS, + NULL, + (const bstring *)&be_const_str_HPMA_TX, + (const bstring *)&be_const_str__rules, + (const bstring *)&be_const_str_lv_tabview, + (const bstring *)&be_const_str_CC1101_GDO0, + NULL, + (const bstring *)&be_const_str_erase, + (const bstring *)&be_const_str_rand, + NULL, + (const bstring *)&be_const_str_SR04_ECHO, + (const bstring *)&be_const_str_MHZ_TXD, + (const bstring *)&be_const_str_EPAPER29_CS, + (const bstring *)&be_const_str_SSPI_CS, + (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, + (const bstring *)&be_const_str_push, + (const bstring *)&be_const_str_TASMOTACLIENT_RXD, + (const bstring *)&be_const_str_TXD, + NULL, + NULL, + (const bstring *)&be_const_str_HM10_RX, + (const bstring *)&be_const_str_KEY1_INV, + (const bstring *)&be_const_str_MAX7219CS, + (const bstring *)&be_const_str_tostring, + (const bstring *)&be_const_str_PULLDOWN, + (const bstring *)&be_const_str_lv_img, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_RXD, + (const bstring *)&be_const_str_opt_add, + (const bstring *)&be_const_str_REL1_INV, + (const bstring *)&be_const_str_chars_in_string, + NULL, + (const bstring *)&be_const_str_DI, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_rtc, + (const bstring *)&be_const_str_SYMBOL_VOLUME_MID, + (const bstring *)&be_const_str_addr, + NULL, + (const bstring *)&be_const_str_add, + (const bstring *)&be_const_str_CSE7766_TX, + (const bstring *)&be_const_str_lv_design_cb, + (const bstring *)&be_const_str_SYMBOL_WIFI, + (const bstring *)&be_const_str_KEY1_INV_PD, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_KEY1_INV_NP, + (const bstring *)&be_const_str_time_dump, + (const bstring *)&be_const_str_classname, + (const bstring *)&be_const_str_lv_obj, + (const bstring *)&be_const_str_begin, + (const bstring *)&be_const_str_SYMBOL_IMAGE, + (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, + (const bstring *)&be_const_str_SYMBOL_VIDEO, + (const bstring *)&be_const_str_lv_textarea, + NULL, + NULL, + NULL, + (const bstring *)&be_const_str_MAX7219CLK, + NULL, + (const bstring *)&be_const_str_I2S_IN_CLK, + NULL, + (const bstring *)&be_const_str_WEBCAM_SIOD, + (const bstring *)&be_const_str_ARIRFSEL, + (const bstring *)&be_const_str_HX711_SCK, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_try, + (const bstring *)&be_const_str_MHZ_RXD, + (const bstring *)&be_const_str_CNTR1_NP, + (const bstring *)&be_const_str_A4988_STP, + (const bstring *)&be_const_str_detect, + NULL, + (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_lv_draw_mask_radius_param_cfg, + (const bstring *)&be_const_str_AS608_TX, + (const bstring *)&be_const_str_PZEM016_RX, + (const bstring *)&be_const_str_IEM3000_RX, + NULL, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_BL0940_RX, + (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, + (const bstring *)&be_const_str_char, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_SDS0X1_TX, + (const bstring *)&be_const_str_ILI9341_DC, + (const bstring *)&be_const_str_LOW, + NULL, + (const bstring *)&be_const_str_lv_draw_img_dsc, + NULL, + (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str_PWM1_INV, + (const bstring *)&be_const_str_SYMBOL_UP, + (const bstring *)&be_const_str_SYMBOL_USB, + (const bstring *)&be_const_str_SDM120_RX, + (const bstring *)&be_const_str_NRF24_CS, + (const bstring *)&be_const_str_SYMBOL_NEW_LINE, + (const bstring *)&be_const_str_TELEINFO_RX, + NULL, + NULL, + (const bstring *)&be_const_str_TUYA_RX, + (const bstring *)&be_const_str_OPTION_A, + (const bstring *)&be_const_str_map, + (const bstring *)&be_const_str_SYMBOL_BATTERY_2, + (const bstring *)&be_const_str_lv_linemeter, + (const bstring *)&be_const_str_count, + NULL, + (const bstring *)&be_const_str_HRXL_RX, + (const bstring *)&be_const_str_content_button, + (const bstring *)&be_const_str_AudioGeneratorMP3, + NULL, + (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, + (const bstring *)&be_const_str_BUZZER, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str_exists, + (const bstring *)&be_const_str_DHT11_OUT, + (const bstring *)&be_const_str_SDM120_TX, + (const bstring *)&be_const_str_AS608_RX, + (const bstring *)&be_const_str_SENSOR_END, + NULL, + NULL, + (const bstring *)&be_const_str_I2S_IN_DATA, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str_ADC_RANGE, + (const bstring *)&be_const_str_FALLING, + (const bstring *)&be_const_str_SDS0X1_RX, + (const bstring *)&be_const_str_SYMBOL_CHARGE, + NULL, + NULL, + (const bstring *)&be_const_str_content_start, NULL, (const bstring *)&be_const_str_INPUT_PULLDOWN, - NULL, - (const bstring *)&be_const_str_PZEM0XX_TX, - (const bstring *)&be_const_str_DHT22, - (const bstring *)&be_const_str_BS814_DAT, - (const bstring *)&be_const_str_ROT1A, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_lv_obj, - (const bstring *)&be_const_str_BUZZER, - (const bstring *)&be_const_str_tan, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str_SYMBOL_RIGHT, - (const bstring *)&be_const_str_lv_slider, - NULL, - (const bstring *)&be_const_str_digital_write, - (const bstring *)&be_const_str_WIEGAND_D0, - NULL, - (const bstring *)&be_const_str_SYMBOL_DOWN, - (const bstring *)&be_const_str_SYMBOL_USB, - (const bstring *)&be_const_str__end_transmission, - (const bstring *)&be_const_str_BOILER_OT_TX, - (const bstring *)&be_const_str_deinit, - (const bstring *)&be_const_str_AudioGenerator, - NULL, - (const bstring *)&be_const_str_ETH_PHY_MDC, - (const bstring *)&be_const_str_RFRECV, - (const bstring *)&be_const_str_SYMBOL_SETTINGS, - (const bstring *)&be_const_str_DI, - (const bstring *)&be_const_str_NEOPOOL_TX, - (const bstring *)&be_const_str_HM10_RX, - (const bstring *)&be_const_str_P9813_DAT, - (const bstring *)&be_const_str_SR04_TRIG, - (const bstring *)&be_const_str_SYMBOL_IMAGE, - (const bstring *)&be_const_str_SYMBOL_SHUFFLE, - (const bstring *)&be_const_str_lv_group, - (const bstring *)&be_const_str_SOLAXX1_TX, - NULL, - (const bstring *)&be_const_str_wire2, - (const bstring *)&be_const_str__begin_transmission, - (const bstring *)&be_const_str_delay, - (const bstring *)&be_const_str_every_second, - NULL, - NULL, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_HIGH, - (const bstring *)&be_const_str_web_add_handler, - (const bstring *)&be_const_str_SYMBOL_MINUS, - (const bstring *)&be_const_str_I2S_OUT_CLK, - (const bstring *)&be_const_str_BS814_CLK, - (const bstring *)&be_const_str_P9813_CLK, - (const bstring *)&be_const_str_TM1638CLK, - (const bstring *)&be_const_str_DEEPSLEEP, - (const bstring *)&be_const_str_HPMA_TX, - NULL, - NULL, - (const bstring *)&be_const_str_SYMBOL_BULLET, - (const bstring *)&be_const_str_ILI9341_CS, - (const bstring *)&be_const_str_ETH_PHY_POWER, - (const bstring *)&be_const_str_OPEN_DRAIN, - (const bstring *)&be_const_str_ZIGBEE_RX, - (const bstring *)&be_const_str_SENSOR_END, - (const bstring *)&be_const_str_check_privileged_access, - (const bstring *)&be_const_str_lv_spinner, - (const bstring *)&be_const_str_SWT1, - NULL, - (const bstring *)&be_const_str_WEBCAM_PSCLK, - (const bstring *)&be_const_str_SDS0X1_TX, - (const bstring *)&be_const_str__write, - (const bstring *)&be_const_str_I2S_OUT_SLCT, - (const bstring *)&be_const_str_elif, - (const bstring *)&be_const_str_SYMBOL_VOLUME_MID, - (const bstring *)&be_const_str_DDS2382_RX, - NULL, - (const bstring *)&be_const_str_SYMBOL_CHARGE, - (const bstring *)&be_const_str_CSE7761_RX, - (const bstring *)&be_const_str_RF_SENSOR, - (const bstring *)&be_const_str_TCP_TX, - (const bstring *)&be_const_str_RC522_RST, - (const bstring *)&be_const_str_pin_mode, - (const bstring *)&be_const_str_SYMBOL_UPLOAD, - (const bstring *)&be_const_str_INPUT, - (const bstring *)&be_const_str_SM2135_DAT, - (const bstring *)&be_const_str_MHZ_TXD, - (const bstring *)&be_const_str_lv_draw_mask_fade_param_cfg, - (const bstring *)&be_const_str_ADC_PH, - (const bstring *)&be_const_str_SAIR_RX, - (const bstring *)&be_const_str_SWT1_PD, - NULL, - NULL, - (const bstring *)&be_const_str_SYMBOL_PLUS, - (const bstring *)&be_const_str_load_freetype_font, - NULL, - (const bstring *)&be_const_str_ADC_RANGE, - (const bstring *)&be_const_str_dot_p, - (const bstring *)&be_const_str_MGC3130_XFER, - NULL, - (const bstring *)&be_const_str_every_50ms, - (const bstring *)&be_const_str_SI7021, - (const bstring *)&be_const_str_BOILER_OT_RX, - (const bstring *)&be_const_str_VL53L0X_XSHUT1, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str_AS608_RX, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_exec_rules, - NULL, - (const bstring *)&be_const_str_HX711_DAT, - (const bstring *)&be_const_str_HM10_TX, - (const bstring *)&be_const_str_OUTPUT, - (const bstring *)&be_const_str_CNTR1_NP, - (const bstring *)&be_const_str_write_bytes, - (const bstring *)&be_const_str_lv_chart, - (const bstring *)&be_const_str_DSB, - (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_PULLDOWN, - (const bstring *)&be_const_str_add_rule, - (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_bytes, - (const bstring *)&be_const_str_SYMBOL_AUDIO, - (const bstring *)&be_const_str_detect, - (const bstring *)&be_const_str_lv_led, - (const bstring *)&be_const_str_read_bytes, - (const bstring *)&be_const_str_A4988_ENA, - (const bstring *)&be_const_str_MCP39F5_RX, - (const bstring *)&be_const_str_upper, - (const bstring *)&be_const_str_lv_draw_mask_saved, - (const bstring *)&be_const_str_lv_msgbox, - (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, - (const bstring *)&be_const_str_KEY1_INV_PD, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_ARIRFSEL, - NULL, - (const bstring *)&be_const_str_SPI_MISO, - (const bstring *)&be_const_str_SYMBOL_LIST, - (const bstring *)&be_const_str_MCP39F5_RST, - (const bstring *)&be_const_str_SYMBOL_SAVE, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_INTERRUPT, - (const bstring *)&be_const_str_SYMBOL_DOWNLOAD, - NULL, - (const bstring *)&be_const_str_lv_draw_mask_fade_param, - (const bstring *)&be_const_str_json_append, - NULL, - (const bstring *)&be_const_str_get_power, - (const bstring *)&be_const_str_FALLING, - (const bstring *)&be_const_str_PMS5003_TX, - (const bstring *)&be_const_str_IEM3000_TX, - (const bstring *)&be_const_str_GPS_TX, - (const bstring *)&be_const_str__cb, - NULL, - (const bstring *)&be_const_str_NRG_SEL, - (const bstring *)&be_const_str_CNTR1, - (const bstring *)&be_const_str_OUTPUT_LO, - (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_content_send_style, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_CSE7766_RX, - (const bstring *)&be_const_str_RFSEND, - (const bstring *)&be_const_str_I2S_IN_DATA, - (const bstring *)&be_const_str_DDSU666_TX, - (const bstring *)&be_const_str_ST7789_DC, - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_item, - (const bstring *)&be_const_str_ZEROCROSS, - NULL, - (const bstring *)&be_const_str_AZ_RXD, - (const bstring *)&be_const_str_A4988_STP, - NULL, - (const bstring *)&be_const_str_TELEINFO_ENABLE, - (const bstring *)&be_const_str_member, - (const bstring *)&be_const_str_exists, - (const bstring *)&be_const_str_EXS_ENABLE, - NULL, + (const bstring *)&be_const_str_str, + (const bstring *)&be_const_str_SSD1351_DC, (const bstring *)&be_const_str_montserrat_font, - (const bstring *)&be_const_str_ROT1A_NP, - (const bstring *)&be_const_str_write8, - (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_concat, - (const bstring *)&be_const_str_BL0940_RX, - (const bstring *)&be_const_str_HPMA_RX, - (const bstring *)&be_const_str_open, - (const bstring *)&be_const_str_A4988_DIR, + (const bstring *)&be_const_str_SDM630_TX, + (const bstring *)&be_const_str_super, + (const bstring *)&be_const_str_SYMBOL_BATTERY_EMPTY, NULL, - (const bstring *)&be_const_str_split, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_opt_add, - (const bstring *)&be_const_str_HRXL_RX, - (const bstring *)&be_const_str_HRE_CLOCK, - (const bstring *)&be_const_str_lv_table, - (const bstring *)&be_const_str_CC1101_GDO0, - (const bstring *)&be_const_str_SYMBOL_TRASH, - (const bstring *)&be_const_str_as, - (const bstring *)&be_const_str_get_option, - (const bstring *)&be_const_str_find_op, - (const bstring *)&be_const_str_SYMBOL_WARNING, - (const bstring *)&be_const_str__request_from, - (const bstring *)&be_const_str_SYMBOL_CLOSE, + (const bstring *)&be_const_str_WE517_RX, + (const bstring *)&be_const_str_SOLAXX1_TX, + (const bstring *)&be_const_str_P9813_CLK, + (const bstring *)&be_const_str_A4988_ENA, NULL, - NULL, - (const bstring *)&be_const_str_NRF24_DC, - (const bstring *)&be_const_str_finish, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_WIEGAND_D1, - (const bstring *)&be_const_str_WEBCAM_HREF, - (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, - (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_cos, + (const bstring *)&be_const_str_module, + (const bstring *)&be_const_str_HLW_CF, + (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, + (const bstring *)&be_const_str_OPEN_DRAIN, + (const bstring *)&be_const_str_resize, + (const bstring *)&be_const_str_ADC_BUTTON, + (const bstring *)&be_const_str_A4988_MS1, + (const bstring *)&be_const_str_exec_rules, + (const bstring *)&be_const_str_I2S_OUT_DATA, + (const bstring *)&be_const_str_DSB, + (const bstring *)&be_const_str_SYMBOL_NEXT, (const bstring *)&be_const_str_insert, - (const bstring *)&be_const_str_lv_tabview, - (const bstring *)&be_const_str_MAX7219CLK, - (const bstring *)&be_const_str_real, - (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, - (const bstring *)&be_const_str_SYMBOL_COPY, - (const bstring *)&be_const_str_LED1, - (const bstring *)&be_const_str_WEBCAM_SIOD, - (const bstring *)&be_const_str_HRE_DATA, - (const bstring *)&be_const_str_SYMBOL_WIFI, - (const bstring *)&be_const_str_HX711_SCK, - (const bstring *)&be_const_str_ADC_BUTTON + (const bstring *)&be_const_str_EPD_DATA, + (const bstring *)&be_const_str_SYMBOL_DUMMY, + (const bstring *)&be_const_str_cmd, + (const bstring *)&be_const_str_nil, + (const bstring *)&be_const_str_lv_slider, + (const bstring *)&be_const_str_SYMBOL_DRIVE, + (const bstring *)&be_const_str_DHT22, + (const bstring *)&be_const_str_INTERRUPT, + (const bstring *)&be_const_str_AS3935, + (const bstring *)&be_const_str_DEEPSLEEP, + (const bstring *)&be_const_str_MD5, + (const bstring *)&be_const_str_lv_switch, + (const bstring *)&be_const_str_KEY1_TC, + (const bstring *)&be_const_str_DDSU666_TX, + (const bstring *)&be_const_str_SI7021, + (const bstring *)&be_const_str_set_light, + NULL, + (const bstring *)&be_const_str_SSPI_SCLK, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_I2S_IN_SLCT, + (const bstring *)&be_const_str_BS814_DAT, + NULL, + (const bstring *)&be_const_str_atan }; static const struct bconststrtab m_const_string_table = { - .size = 319, - .count = 638, + .size = 320, + .count = 640, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h index 7e087db7f..cd8f9f4b0 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h @@ -1,69 +1,71 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_tasmota_map) { - { be_const_key(publish, -1), be_const_func(l_publish) }, - { be_const_key(wire2, -1), be_const_index(0) }, - { be_const_key(yield, 14), be_const_func(l_yield) }, - { be_const_key(log, 34), be_const_func(l_logInfo) }, - { be_const_key(find_op, -1), be_const_closure(find_op_closure) }, - { be_const_key(i2c_enabled, 24), be_const_func(l_i2cenabled) }, - { be_const_key(run_deferred, -1), be_const_closure(run_deferred_closure) }, - { be_const_key(_cmd, -1), be_const_func(l_cmd) }, - { be_const_key(save, 30), be_const_func(l_save) }, - { be_const_key(resolvecmnd, 51), be_const_func(l_resolveCmnd) }, - { be_const_key(memory, -1), be_const_func(l_memory) }, - { be_const_key(_ccmd, -1), be_const_index(1) }, - { be_const_key(get_light, -1), be_const_closure(get_light_closure) }, - { be_const_key(add_rule, 56), be_const_closure(add_rule_closure) }, - { be_const_key(exec_rules, -1), be_const_closure(exec_rules_closure) }, - { be_const_key(get_power, -1), be_const_func(l_getpower) }, - { be_const_key(_get_cb, -1), be_const_func(l_get_cb) }, - { be_const_key(_cb, -1), be_const_index(2) }, - { be_const_key(time_str, -1), be_const_closure(time_str_closure) }, - { be_const_key(add_driver, 21), be_const_closure(add_driver_closure) }, - { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) }, - { be_const_key(_rules, -1), be_const_index(3) }, - { be_const_key(rtc, -1), be_const_func(l_rtc) }, - { be_const_key(set_light, -1), be_const_closure(set_light_closure) }, - { be_const_key(add_cmd, 25), be_const_closure(add_cmd_closure) }, - { be_const_key(event, 49), be_const_closure(event_closure) }, - { be_const_key(scale_uint, -1), be_const_func(l_scaleuint) }, - { be_const_key(millis, -1), be_const_func(l_millis) }, - { be_const_key(remove_rule, -1), be_const_closure(remove_rule_closure) }, - { be_const_key(publish_result, -1), be_const_func(l_publish_result) }, - { be_const_key(_timers, -1), be_const_index(4) }, - { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) }, - { be_const_key(response_append, -1), be_const_func(l_respAppend) }, - { be_const_key(set_power, -1), be_const_func(l_setpower) }, - { be_const_key(get_option, -1), be_const_func(l_getoption) }, - { be_const_key(wire1, 32), be_const_index(5) }, - { be_const_key(web_send, 29), be_const_func(l_webSend) }, - { be_const_key(resp_cmnd_done, -1), be_const_func(l_respCmndDone) }, - { be_const_key(remove_cmd, 23), be_const_closure(remove_cmd_closure) }, - { be_const_key(try_rule, 46), be_const_closure(try_rule_closure) }, - { be_const_key(wire_scan, 31), be_const_closure(wire_scan_closure) }, - { be_const_key(_drivers, 15), be_const_index(6) }, - { be_const_key(resp_cmnd_failed, 7), be_const_func(l_respCmndFailed) }, - { be_const_key(exec_cmd, -1), be_const_closure(exec_cmd_closure) }, - { be_const_key(find_key_i, -1), be_const_closure(find_key_i_closure) }, - { be_const_key(get_free_heap, -1), be_const_func(l_getFreeHeap) }, - { be_const_key(load, -1), be_const_closure(load_closure) }, - { be_const_key(cmd, -1), be_const_closure(cmd_closure) }, - { be_const_key(resp_cmnd, 20), be_const_func(l_respCmnd) }, - { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) }, - { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) }, - { be_const_key(gen_cb, -1), be_const_closure(gen_cb_closure) }, - { be_const_key(web_send_decimal, 1), be_const_func(l_webSendDecimal) }, { be_const_key(gc, -1), be_const_closure(gc_closure) }, - { be_const_key(delay, -1), be_const_func(l_delay) }, - { be_const_key(time_dump, 50), be_const_func(l_time_dump) }, - { be_const_key(time_reached, -1), be_const_func(l_timereached) }, + { be_const_key(_cmd, -1), be_const_func(l_cmd) }, + { be_const_key(event, -1), be_const_closure(event_closure) }, + { be_const_key(millis, -1), be_const_func(l_millis) }, + { be_const_key(eth, 23), be_const_func(l_eth) }, + { be_const_key(try_rule, -1), be_const_closure(try_rule_closure) }, + { be_const_key(resp_cmnd, -1), be_const_func(l_respCmnd) }, + { be_const_key(set_light, -1), be_const_closure(set_light_closure) }, + { be_const_key(remove_rule, -1), be_const_closure(remove_rule_closure) }, + { be_const_key(get_light, -1), be_const_closure(get_light_closure) }, + { be_const_key(_rules, -1), be_const_index(0) }, + { be_const_key(add_driver, 0), be_const_closure(add_driver_closure) }, + { be_const_key(save, 38), be_const_func(l_save) }, + { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) }, + { be_const_key(yield, 48), be_const_func(l_yield) }, + { be_const_key(resp_cmnd_done, -1), be_const_func(l_respCmndDone) }, + { be_const_key(find_op, 4), be_const_closure(find_op_closure) }, + { be_const_key(get_free_heap, -1), be_const_func(l_getFreeHeap) }, + { be_const_key(remove_cmd, -1), be_const_closure(remove_cmd_closure) }, + { be_const_key(exec_cmd, 20), be_const_closure(exec_cmd_closure) }, + { be_const_key(add_cmd, -1), be_const_closure(add_cmd_closure) }, + { be_const_key(log, -1), be_const_func(l_logInfo) }, + { be_const_key(_get_cb, 18), be_const_func(l_get_cb) }, + { be_const_key(_timers, 35), be_const_index(1) }, + { be_const_key(wifi, 55), be_const_func(l_wifi) }, + { be_const_key(_drivers, 10), be_const_index(2) }, + { be_const_key(find_key_i, -1), be_const_closure(find_key_i_closure) }, + { be_const_key(_cb, -1), be_const_index(3) }, + { be_const_key(web_send, -1), be_const_func(l_webSend) }, { be_const_key(resp_cmnd_error, -1), be_const_func(l_respCmndError) }, + { be_const_key(memory, 31), be_const_func(l_memory) }, + { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) }, + { be_const_key(time_str, 7), be_const_closure(time_str_closure) }, + { be_const_key(set_power, 34), be_const_func(l_setpower) }, + { be_const_key(get_option, 46), be_const_func(l_getoption) }, + { be_const_key(rtc, -1), be_const_func(l_rtc) }, + { be_const_key(response_append, -1), be_const_func(l_respAppend) }, + { be_const_key(publish_result, -1), be_const_func(l_publish_result) }, + { be_const_key(chars_in_string, 50), be_const_closure(chars_in_string_closure) }, + { be_const_key(cmd, 2), be_const_closure(cmd_closure) }, + { be_const_key(wire_scan, -1), be_const_closure(wire_scan_closure) }, + { be_const_key(i2c_enabled, -1), be_const_func(l_i2cenabled) }, + { be_const_key(resp_cmnd_failed, 1), be_const_func(l_respCmndFailed) }, + { be_const_key(add_rule, 29), be_const_closure(add_rule_closure) }, + { be_const_key(publish, -1), be_const_func(l_publish) }, + { be_const_key(resolvecmnd, -1), be_const_func(l_resolveCmnd) }, + { be_const_key(_ccmd, -1), be_const_index(4) }, + { be_const_key(time_dump, -1), be_const_func(l_time_dump) }, + { be_const_key(scale_uint, -1), be_const_func(l_scaleuint) }, + { be_const_key(load, -1), be_const_closure(load_closure) }, + { be_const_key(exec_rules, 37), be_const_closure(exec_rules_closure) }, + { be_const_key(gen_cb, 36), be_const_closure(gen_cb_closure) }, + { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) }, + { be_const_key(time_reached, -1), be_const_func(l_timereached) }, + { be_const_key(web_send_decimal, -1), be_const_func(l_webSendDecimal) }, + { be_const_key(delay, 54), be_const_func(l_delay) }, + { be_const_key(run_deferred, 9), be_const_closure(run_deferred_closure) }, + { be_const_key(get_power, -1), be_const_func(l_getpower) }, + { be_const_key(wire2, -1), be_const_index(5) }, + { be_const_key(wire1, 52), be_const_index(6) }, }; static be_define_const_map( be_class_tasmota_map, - 58 + 60 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/tasmota/xdrv_52_3_berry_tasmota.ino b/tasmota/xdrv_52_3_berry_tasmota.ino index 734a571c7..a15388058 100644 --- a/tasmota/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/xdrv_52_3_berry_tasmota.ino @@ -184,7 +184,7 @@ extern "C" { be_raise(vm, kTypeError, nullptr); } - // Berry: tasmota.memory(timer:int) -> bool + // Berry: tasmota.memory() -> map // int32_t l_memory(struct bvm *vm); int32_t l_memory(struct bvm *vm) { @@ -207,6 +207,53 @@ extern "C" { be_raise(vm, kTypeError, nullptr); } + // Berry: tasmota.wifi() -> map + // + int32_t l_wifi(struct bvm *vm); + int32_t l_wifi(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 1) { // no argument (instance only) + be_newobject(vm, "map"); + if (Settings->flag4.network_wifi) { + int32_t rssi = WiFi.RSSI(); + map_insert_int(vm, "rssi", rssi); + map_insert_int(vm, "quality", WifiGetRssiAsQuality(rssi)); +#if LWIP_IPV6 + String ipv6_addr = WifiGetIPv6(); + if (ipv6_addr != "") { + map_insert_str(vm, "ip6", ipv6_addr.c_str()); + } +#endif + if (static_cast(WiFi.localIP()) != 0) { + map_insert_str(vm, "mac", WiFi.macAddress().c_str()); + map_insert_str(vm, "ip", WiFi.localIP().toString().c_str()); + } + } + be_pop(vm, 1); + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); + } + + // Berry: tasmota.eth() -> map + // + int32_t l_eth(struct bvm *vm); + int32_t l_eth(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 1) { // no argument (instance only) + be_newobject(vm, "map"); +#ifdef USE_ETHERNET + if (static_cast(EthernetLocalIP()) != 0) { + map_insert_str(vm, "mac", EthernetMacAddress().c_str()); + map_insert_str(vm, "ip", EthernetLocalIP().toString().c_str()); + } +#endif + be_pop(vm, 1); + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); + } + int32_t l_time_dump(bvm *vm) { int32_t top = be_top(vm); // Get the number of arguments if (top == 2 && be_isint(vm, 2)) { From 3b35cea8eca9b984fa1c8d4aa2ced790235da08e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 25 Jul 2021 13:54:10 +0200 Subject: [PATCH 038/148] JTAG debug env --- boards/esp32_solo1_4M.json | 38 ++++++++++++++++++++++++++++++ platformio_tasmota_cenv_sample.ini | 24 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 boards/esp32_solo1_4M.json diff --git a/boards/esp32_solo1_4M.json b/boards/esp32_solo1_4M.json new file mode 100644 index 000000000..64759d331 --- /dev/null +++ b/boards/esp32_solo1_4M.json @@ -0,0 +1,38 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_ESP32_DEV -DESP32_4M", + "f_cpu": "80000000L", + "f_flash": "40000000L", + "flash_mode": "dout", + "mcu": "esp32", + "variant": "esp32", + "partitions": "esp32_partition_app1856k_spiffs320k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_target": "esp32-solo-1.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k SPIFFS", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://en.wikipedia.org/wiki/ESP32", + "vendor": "Espressif" +} diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index d5286bb6c..9b666d8bb 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -93,3 +93,27 @@ build_type = debug build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} ; -Wstack-usage=300 + +; *** JTAG Debug version, needs esp-prog or FT2232H or FT232H +[env:tasmota32-ocd] +;build_type = debug +extends = env:tasmota32_base +debug_tool = esp-prog +upload_protocol = esp-prog +debug_init_break = tbreak setup +build_unflags = ${esp32_defaults.build_unflags} +build_flags = ${env:tasmota32_base.build_flags} + +; *** JTAG Debug version, needs esp-prog or FT2232H or FT232H +[env:tasmota32solo1-ocd] +;build_type = debug +extends = env:tasmota32_base +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.3/tasmota-arduinoespressif32-solo1-release_v3.3.5.tar.gz + platformio/tool-esptoolpy @ ~1.30100 + platformio/tool-mklittlefs @ ~1.203.200522 +board = esp32_solo1_4M +debug_tool = esp-prog +upload_protocol = esp-prog +debug_init_break = tbreak setup +build_unflags = ${esp32_defaults.build_unflags} +build_flags = ${env:tasmota32_base.build_flags} From db146024defe1b36b8460790759ab4adef588510 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 25 Jul 2021 19:15:45 +0200 Subject: [PATCH 039/148] Arduino 2.0.0-rc1 based on IDF 4.4 --- platformio_tasmota_cenv_sample.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 9b666d8bb..85e117bc7 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -21,7 +21,7 @@ build_flags = ${esp82xx_defaults.build_flags} [env:tasmota32idf3] extends = env:tasmota32_base platform = espressif32 @ 3.3.0 -platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.1/tasmota-arduinoespressif32-release_v3.3.5.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.3/tasmota-arduinoespressif32-release_v3.3.5.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} @@ -32,7 +32,7 @@ build_flags = ${esp32_defaults.build_flags} extends = env:tasmota32_base board = esp32s2 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/349/framework-arduinoespressif32-master-caf43f7e9.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/375/framework-arduinoespressif32-master-32a9e33b1.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} -DFIRMWARE_LITE @@ -48,7 +48,7 @@ lib_ignore = extends = env:tasmota32_base board = esp32c3 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/349/framework-arduinoespressif32-master-caf43f7e9.tar.gz +platform_packages = framework-arduinoespressif32 @https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/375/framework-arduinoespressif32-master-32a9e33b1.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable @@ -71,7 +71,7 @@ lib_ignore = [env:tasmota32idf4] extends = env:tasmota32_base platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/349/framework-arduinoespressif32-master-caf43f7e9.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/375/framework-arduinoespressif32-master-32a9e33b1.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable From 37d350d9e13ea8a86773854bdc38f0484e90783b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 25 Jul 2021 19:23:58 +0200 Subject: [PATCH 040/148] LVGL new widget ``lv_wifi_bars`` (#12752) * LVGL new widget ``lv_wifi_bars`` * Remove old code --- CHANGELOG.md | 1 + .../Berry/default/be_lvgl_signal_bars_lib.c | 2 +- .../Berry/default/be_lvgl_signal_wifi_lib.c | 117 ++++++++ lib/libesp32/Berry/default/be_modtab.c | 2 + lib/libesp32/Berry/default/be_tasmotalib.c | 257 ++++++------------ .../Berry/default/embedded/Tasmota.be | 39 +-- .../Berry/default/embedded/lv_signal_bars.be | 106 ++++++++ lib/libesp32/Berry/src/be_constobj.h | 2 +- lib/libesp32/Berry/src/be_solidifylib.c | 2 +- tasmota/berry/lvgl_examples/lvgl_demo.be | 5 +- 10 files changed, 322 insertions(+), 211 deletions(-) create mode 100644 lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c create mode 100644 lib/libesp32/Berry/default/embedded/lv_signal_bars.be diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c02dacaf..353c41148 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Berry ESP32 support for I2S audio mp3 playback - Berry add module ``introspect`` - Berry add ``tasmota.wifi()`` and ``tasmota.eth()`` +- LVGL new widget ``lv_wifi_bars`` ### Changed - ESP32 core library from v1.0.7.1 to v1.0.7.3 diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c index 1784493a0..cc75b848c 100644 --- a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c @@ -371,7 +371,7 @@ be_local_class(lv_signal_bars, /*******************************************************************/ void be_load_lv_signal_bars_class(bvm *vm) { - be_pushntvclass(vm, &be_lv_signal_bars_class); + be_pushntvclass(vm, &be_class_lv_signal_bars); be_setglobal(vm, "lv_signal_bars"); be_pop(vm, 1); } diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c new file mode 100644 index 000000000..7218e752b --- /dev/null +++ b/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c @@ -0,0 +1,117 @@ +/******************************************************************** + * Tasmota LVGL lv_signal_bars widget + *******************************************************************/ +#include "be_constobj.h" + +#ifdef USE_LVGL + +#include "lvgl.h" + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(init, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + be_nested_string("global", 503252654, 6), + be_nested_string("lv_signal_bars", -780994737, 14), + be_nested_string("init", 380752755, 4), + be_nested_string("tasmota", 424643812, 7), + be_nested_string("add_driver", 1654458371, 10), + }), + (be_nested_const_str("init", 380752755, 4)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[14]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 R256 + 0x60100014, // 0001 GETGBL R4 G20 + 0x5C140000, // 0002 MOVE R5 R0 + 0x88180701, // 0003 GETMBR R6 R3 R257 + 0x7C100400, // 0004 CALL R4 2 + 0x8C100902, // 0005 GETMET R4 R4 R258 + 0x5C180200, // 0006 MOVE R6 R1 + 0x5C1C0400, // 0007 MOVE R7 R2 + 0x7C100600, // 0008 CALL R4 3 + 0x88100703, // 0009 GETMBR R4 R3 R259 + 0x8C100904, // 000A GETMET R4 R4 R260 + 0x5C180000, // 000B MOVE R6 R0 + 0x7C100400, // 000C CALL R4 2 + 0x80000000, // 000D RET 0 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(every_second, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + be_nested_string("global", 503252654, 6), + be_nested_string("tasmota", 424643812, 7), + be_nested_string("wifi", 120087624, 4), + be_nested_string("find", -1108310694, 4), + be_nested_string("quality", -1697296346, 7), + be_nested_string("set_percentage", -1342944572, 14), + }), + (be_nested_const_str("every_second", 2075451465, 12)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[14]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 R256 + 0x88080301, // 0001 GETMBR R2 R1 R257 + 0x8C080502, // 0002 GETMET R2 R2 R258 + 0x7C080200, // 0003 CALL R2 1 + 0x8C0C0503, // 0004 GETMET R3 R2 R259 + 0x58140004, // 0005 LDCONST R5 K4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x4C100000, // 0007 LDNIL 4 + 0x20100604, // 0008 NE R4 R3 R4 + 0x78120002, // 0009 JMPF R4 #000D + 0x8C100105, // 000A GETMET R4 R0 R261 + 0x5C180600, // 000B MOVE R6 R3 + 0x7C100400, // 000C CALL R4 2 + 0x80000000, // 000D RET 0 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: lv_wifi_bars +********************************************************************/ +extern const bclass be_class_lv_signal_bars; +be_local_class(lv_wifi_bars, + 0, + &be_class_lv_signal_bars, + be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_nested_key("init", 380752755, 4, -1), be_const_closure(init_closure) }, + { be_nested_key("every_second", 2075451465, 12, 0), be_const_closure(every_second_closure) }, + })), + (be_nested_const_str("lv_wifi_bars", 2109539196, 12)) +); +/*******************************************************************/ + +void be_load_lv_wifi_bars_class(bvm *vm) { + be_pushntvclass(vm, &be_class_lv_wifi_bars); + be_setglobal(vm, "lv_wifi_bars"); + be_pop(vm, 1); +} + +#endif // USE_LVGL \ No newline at end of file diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index 5991b1ba2..cc014603b 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -118,6 +118,7 @@ extern void be_load_lvgl_ctypes_lib(bvm *vm); extern void be_load_ctypes_definitions_lib(bvm *vm); // custom widgets extern void be_load_lv_signal_bars_class(bvm *vm); +extern void be_load_lv_wifi_bars_class(bvm *vm); #endif// USE_LVGL /* this code loads the native class definitions */ @@ -151,6 +152,7 @@ BERRY_API void be_load_custom_libs(bvm *vm) be_load_ctypes_definitions_lib(vm); // custom widgets be_load_lv_signal_bars_class(vm); + be_load_lv_wifi_bars_class(vm); #endif // USE_LVGL } #endif diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index 4a853087a..451be9520 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -1364,14 +1364,15 @@ be_local_closure(gc, /* name */ ********************************************************************/ be_local_closure(event, /* name */ be_nested_proto( - 16, /* nstack */ + 18, /* nstack */ 5, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ + be_nested_string("introspect", 164638290, 10), be_nested_string("every_50ms", -1911083288, 10), be_nested_string("run_deferred", 371594696, 12), be_nested_string("cmd", -158181397, 3), @@ -1381,19 +1382,8 @@ be_local_closure(event, /* name */ be_nested_string("mqtt_data", -1756753932, 9), be_nested_string("gc", 1042313471, 2), be_nested_string("_drivers", -1034638311, 8), - be_nested_string("every_second", 2075451465, 12), - be_nested_string("every_100ms", 1546407804, 11), - be_nested_string("web_add_button", -757092238, 14), - be_nested_string("web_add_main_button", -334599632, 19), - be_nested_string("web_add_management_button", -1556090110, 25), - be_nested_string("web_add_config_button", 639674325, 21), - be_nested_string("web_add_console_button", -813531104, 22), - be_nested_string("save_before_restart", 1253239338, 19), - be_nested_string("web_add_handler", -304792334, 15), - be_nested_string("web_sensor", -1394870324, 10), - be_nested_string("json_append", -1292948012, 11), - be_nested_string("button_pressed", 1694209616, 14), - be_nested_string("display", 1164572437, 7), + be_nested_string("get", 1410115415, 3), + be_nested_string("function", -1630125495, 8), be_nested_string("string", 398550328, 6), be_nested_string("format", -1180859054, 6), be_nested_string("BRY: Exception> '%s' - %s", -2047976332, 25), @@ -1401,170 +1391,79 @@ be_local_closure(event, /* name */ }), (be_nested_const_str("event", -30355297, 5)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[163]) { /* code */ - 0x1C140300, // 0000 EQ R5 R1 R256 - 0x78160001, // 0001 JMPF R5 #0004 - 0x8C140101, // 0002 GETMET R5 R0 R257 - 0x7C140200, // 0003 CALL R5 1 - 0x1C140302, // 0004 EQ R5 R1 R258 - 0x78160006, // 0005 JMPF R5 #000D - 0x8C140103, // 0006 GETMET R5 R0 R259 - 0x5C1C0400, // 0007 MOVE R7 R2 - 0x5C200600, // 0008 MOVE R8 R3 - 0x5C240800, // 0009 MOVE R9 R4 - 0x7C140800, // 000A CALL R5 4 - 0x80040A00, // 000B RET 1 R5 - 0x70020094, // 000C JMP #00A2 - 0x1C140304, // 000D EQ R5 R1 R260 - 0x78160004, // 000E JMPF R5 #0014 - 0x8C140105, // 000F GETMET R5 R0 R261 - 0x5C1C0800, // 0010 MOVE R7 R4 - 0x7C140400, // 0011 CALL R5 2 - 0x80040A00, // 0012 RET 1 R5 - 0x7002008D, // 0013 JMP #00A2 - 0x1C140306, // 0014 EQ R5 R1 R262 - 0x78160002, // 0015 JMPF R5 #0019 - 0x4C140000, // 0016 LDNIL 5 - 0x80040A00, // 0017 RET 1 R5 - 0x70020088, // 0018 JMP #00A2 - 0x1C140307, // 0019 EQ R5 R1 R263 - 0x78160003, // 001A JMPF R5 #001F - 0x8C140107, // 001B GETMET R5 R0 R263 - 0x7C140200, // 001C CALL R5 1 - 0x80040A00, // 001D RET 1 R5 - 0x70020082, // 001E JMP #00A2 - 0x88140108, // 001F GETMBR R5 R0 R264 - 0x78160080, // 0020 JMPF R5 #00A2 - 0x60140000, // 0021 GETGBL R5 G0 - 0x88180108, // 0022 GETMBR R6 R0 R264 - 0x7C140200, // 0023 CALL R5 1 - 0xA8020079, // 0024 EXBLK 0 #009F - 0x5C180A00, // 0025 MOVE R6 R5 - 0x7C180000, // 0026 CALL R6 0 - 0xA8020069, // 0027 EXBLK 0 #0092 - 0x1C1C0309, // 0028 EQ R7 R1 R265 - 0x781E0004, // 0029 JMPF R7 #002F - 0x881C0D09, // 002A GETMBR R7 R6 R265 - 0x781E0002, // 002B JMPF R7 #002F - 0x8C1C0D09, // 002C GETMET R7 R6 R265 - 0x7C1C0200, // 002D CALL R7 1 - 0x70020060, // 002E JMP #0090 - 0x1C1C0300, // 002F EQ R7 R1 R256 - 0x781E0004, // 0030 JMPF R7 #0036 - 0x881C0D00, // 0031 GETMBR R7 R6 R256 - 0x781E0002, // 0032 JMPF R7 #0036 - 0x8C1C0D00, // 0033 GETMET R7 R6 R256 - 0x7C1C0200, // 0034 CALL R7 1 - 0x70020059, // 0035 JMP #0090 - 0x1C1C030A, // 0036 EQ R7 R1 R266 - 0x781E0004, // 0037 JMPF R7 #003D - 0x881C0D0A, // 0038 GETMBR R7 R6 R266 - 0x781E0002, // 0039 JMPF R7 #003D - 0x8C1C0D0A, // 003A GETMET R7 R6 R266 - 0x7C1C0200, // 003B CALL R7 1 - 0x70020052, // 003C JMP #0090 - 0x1C1C030B, // 003D EQ R7 R1 R267 - 0x781E0004, // 003E JMPF R7 #0044 - 0x881C0D0B, // 003F GETMBR R7 R6 R267 - 0x781E0002, // 0040 JMPF R7 #0044 - 0x8C1C0D0B, // 0041 GETMET R7 R6 R267 - 0x7C1C0200, // 0042 CALL R7 1 - 0x7002004B, // 0043 JMP #0090 - 0x1C1C030C, // 0044 EQ R7 R1 R268 - 0x781E0004, // 0045 JMPF R7 #004B - 0x881C0D0C, // 0046 GETMBR R7 R6 R268 - 0x781E0002, // 0047 JMPF R7 #004B - 0x8C1C0D0C, // 0048 GETMET R7 R6 R268 - 0x7C1C0200, // 0049 CALL R7 1 - 0x70020044, // 004A JMP #0090 - 0x1C1C030D, // 004B EQ R7 R1 R269 - 0x781E0004, // 004C JMPF R7 #0052 - 0x881C0D0D, // 004D GETMBR R7 R6 R269 - 0x781E0002, // 004E JMPF R7 #0052 - 0x8C1C0D0D, // 004F GETMET R7 R6 R269 - 0x7C1C0200, // 0050 CALL R7 1 - 0x7002003D, // 0051 JMP #0090 - 0x1C1C030E, // 0052 EQ R7 R1 R270 - 0x781E0004, // 0053 JMPF R7 #0059 - 0x881C0D0E, // 0054 GETMBR R7 R6 R270 - 0x781E0002, // 0055 JMPF R7 #0059 - 0x8C1C0D0E, // 0056 GETMET R7 R6 R270 - 0x7C1C0200, // 0057 CALL R7 1 - 0x70020036, // 0058 JMP #0090 - 0x1C1C030F, // 0059 EQ R7 R1 R271 - 0x781E0004, // 005A JMPF R7 #0060 - 0x881C0D0F, // 005B GETMBR R7 R6 R271 - 0x781E0002, // 005C JMPF R7 #0060 - 0x8C1C0D0F, // 005D GETMET R7 R6 R271 - 0x7C1C0200, // 005E CALL R7 1 - 0x7002002F, // 005F JMP #0090 - 0x1C1C0310, // 0060 EQ R7 R1 R272 - 0x781E0004, // 0061 JMPF R7 #0067 - 0x881C0D10, // 0062 GETMBR R7 R6 R272 - 0x781E0002, // 0063 JMPF R7 #0067 - 0x8C1C0D10, // 0064 GETMET R7 R6 R272 - 0x7C1C0200, // 0065 CALL R7 1 - 0x70020028, // 0066 JMP #0090 - 0x1C1C0311, // 0067 EQ R7 R1 R273 - 0x781E0004, // 0068 JMPF R7 #006E - 0x881C0D11, // 0069 GETMBR R7 R6 R273 - 0x781E0002, // 006A JMPF R7 #006E - 0x8C1C0D11, // 006B GETMET R7 R6 R273 - 0x7C1C0200, // 006C CALL R7 1 - 0x70020021, // 006D JMP #0090 - 0x1C1C0312, // 006E EQ R7 R1 R274 - 0x781E0004, // 006F JMPF R7 #0075 - 0x881C0D12, // 0070 GETMBR R7 R6 R274 - 0x781E0002, // 0071 JMPF R7 #0075 - 0x8C1C0D12, // 0072 GETMET R7 R6 R274 - 0x7C1C0200, // 0073 CALL R7 1 - 0x7002001A, // 0074 JMP #0090 - 0x1C1C0313, // 0075 EQ R7 R1 R275 - 0x781E0004, // 0076 JMPF R7 #007C - 0x881C0D13, // 0077 GETMBR R7 R6 R275 - 0x781E0002, // 0078 JMPF R7 #007C - 0x8C1C0D13, // 0079 GETMET R7 R6 R275 - 0x7C1C0200, // 007A CALL R7 1 - 0x70020013, // 007B JMP #0090 - 0x1C1C0314, // 007C EQ R7 R1 R276 - 0x781E0004, // 007D JMPF R7 #0083 - 0x881C0D14, // 007E GETMBR R7 R6 R276 - 0x781E0002, // 007F JMPF R7 #0083 - 0x8C1C0D14, // 0080 GETMET R7 R6 R276 - 0x7C1C0200, // 0081 CALL R7 1 - 0x7002000C, // 0082 JMP #0090 - 0x1C1C0311, // 0083 EQ R7 R1 R273 - 0x781E0004, // 0084 JMPF R7 #008A - 0x881C0D15, // 0085 GETMBR R7 R6 R277 - 0x781E0002, // 0086 JMPF R7 #008A - 0x8C1C0D15, // 0087 GETMET R7 R6 R277 - 0x7C1C0200, // 0088 CALL R7 1 - 0x70020005, // 0089 JMP #0090 - 0x1C1C0315, // 008A EQ R7 R1 R277 - 0x781E0003, // 008B JMPF R7 #0090 - 0x881C0D15, // 008C GETMBR R7 R6 R277 - 0x781E0001, // 008D JMPF R7 #0090 - 0x8C1C0D15, // 008E GETMET R7 R6 R277 - 0x7C1C0200, // 008F CALL R7 1 - 0xA8040001, // 0090 EXBLK 1 1 - 0x7002000B, // 0091 JMP #009E - 0xAC1C0002, // 0092 CATCH R7 0 2 - 0x70020008, // 0093 JMP #009D - 0xA4262C00, // 0094 IMPORT R9 R278 - 0x6028000F, // 0095 GETGBL R10 G15 - 0x8C2C1317, // 0096 GETMET R11 R9 R279 - 0x58340018, // 0097 LDCONST R13 K24 - 0x5C380E00, // 0098 MOVE R14 R7 - 0x5C3C1000, // 0099 MOVE R15 R8 - 0x7C2C0800, // 009A CALL R11 4 - 0x7C280200, // 009B CALL R10 1 - 0x70020000, // 009C JMP #009E - 0xB0080000, // 009D RAISE 2 R0 R0 - 0x7001FF85, // 009E JMP #0025 - 0x58140019, // 009F LDCONST R5 K25 - 0xAC140200, // 00A0 CATCH R5 1 0 - 0xB0080000, // 00A1 RAISE 2 R0 R0 - 0x80000000, // 00A2 RET 0 R0 + ( &(const binstruction[72]) { /* code */ + 0xA4160000, // 0000 IMPORT R5 R256 + 0x1C180301, // 0001 EQ R6 R1 R257 + 0x781A0001, // 0002 JMPF R6 #0005 + 0x8C180102, // 0003 GETMET R6 R0 R258 + 0x7C180200, // 0004 CALL R6 1 + 0x1C180303, // 0005 EQ R6 R1 R259 + 0x781A0006, // 0006 JMPF R6 #000E + 0x8C180104, // 0007 GETMET R6 R0 R260 + 0x5C200400, // 0008 MOVE R8 R2 + 0x5C240600, // 0009 MOVE R9 R3 + 0x5C280800, // 000A MOVE R10 R4 + 0x7C180800, // 000B CALL R6 4 + 0x80040C00, // 000C RET 1 R6 + 0x70020038, // 000D JMP #0047 + 0x1C180305, // 000E EQ R6 R1 R261 + 0x781A0004, // 000F JMPF R6 #0015 + 0x8C180106, // 0010 GETMET R6 R0 R262 + 0x5C200800, // 0011 MOVE R8 R4 + 0x7C180400, // 0012 CALL R6 2 + 0x80040C00, // 0013 RET 1 R6 + 0x70020031, // 0014 JMP #0047 + 0x1C180307, // 0015 EQ R6 R1 R263 + 0x781A0002, // 0016 JMPF R6 #001A + 0x4C180000, // 0017 LDNIL 6 + 0x80040C00, // 0018 RET 1 R6 + 0x7002002C, // 0019 JMP #0047 + 0x1C180308, // 001A EQ R6 R1 R264 + 0x781A0003, // 001B JMPF R6 #0020 + 0x8C180108, // 001C GETMET R6 R0 R264 + 0x7C180200, // 001D CALL R6 1 + 0x80040C00, // 001E RET 1 R6 + 0x70020026, // 001F JMP #0047 + 0x88180109, // 0020 GETMBR R6 R0 R265 + 0x781A0024, // 0021 JMPF R6 #0047 + 0x60180000, // 0022 GETGBL R6 G0 + 0x881C0109, // 0023 GETMBR R7 R0 R265 + 0x7C180200, // 0024 CALL R6 1 + 0xA802001D, // 0025 EXBLK 0 #0044 + 0x5C1C0C00, // 0026 MOVE R7 R6 + 0x7C1C0000, // 0027 CALL R7 0 + 0x8C200B0A, // 0028 GETMET R8 R5 R266 + 0x5C280E00, // 0029 MOVE R10 R7 + 0x5C2C0200, // 002A MOVE R11 R1 + 0x7C200600, // 002B CALL R8 3 + 0x60240015, // 002C GETGBL R9 G21 + 0x5C281000, // 002D MOVE R10 R8 + 0x7C240200, // 002E CALL R9 1 + 0x1C24130B, // 002F EQ R9 R9 R267 + 0x78260011, // 0030 JMPF R9 #0043 + 0xA8020004, // 0031 EXBLK 0 #0037 + 0x5C241000, // 0032 MOVE R9 R8 + 0x5C280E00, // 0033 MOVE R10 R7 + 0x7C240200, // 0034 CALL R9 1 + 0xA8040001, // 0035 EXBLK 1 1 + 0x7002000B, // 0036 JMP #0043 + 0xAC240002, // 0037 CATCH R9 0 2 + 0x70020008, // 0038 JMP #0042 + 0xA42E1800, // 0039 IMPORT R11 R268 + 0x6030000F, // 003A GETGBL R12 G15 + 0x8C34170D, // 003B GETMET R13 R11 R269 + 0x583C000E, // 003C LDCONST R15 K14 + 0x5C401200, // 003D MOVE R16 R9 + 0x5C441400, // 003E MOVE R17 R10 + 0x7C340800, // 003F CALL R13 4 + 0x7C300200, // 0040 CALL R12 1 + 0x70020000, // 0041 JMP #0043 + 0xB0080000, // 0042 RAISE 2 R0 R0 + 0x7001FFE1, // 0043 JMP #0026 + 0x5818000F, // 0044 LDCONST R6 K15 + 0xAC180200, // 0045 CATCH R6 1 0 + 0xB0080000, // 0046 RAISE 2 R0 R0 + 0x80000000, // 0047 RET 0 R0 }) ) ); diff --git a/lib/libesp32/Berry/default/embedded/Tasmota.be b/lib/libesp32/Berry/default/embedded/Tasmota.be index cf92ac5b9..0c04819e0 100644 --- a/lib/libesp32/Berry/default/embedded/Tasmota.be +++ b/lib/libesp32/Berry/default/embedded/Tasmota.be @@ -241,35 +241,24 @@ class Tasmota2 : Tasmota end - def event(type, cmd, idx, payload) - if type=='every_50ms' self.run_deferred() end #- first run deferred events -# + def event(event_type, cmd, idx, payload) + import introspect + if event_type=='every_50ms' self.run_deferred() end #- first run deferred events -# - if type=='cmd' return self.exec_cmd(cmd, idx, payload) - elif type=='rule' return self.exec_rules(payload) - elif type=='mqtt_data' return nil - elif type=='gc' return self.gc() + if event_type=='cmd' return self.exec_cmd(cmd, idx, payload) + elif event_type=='rule' return self.exec_rules(payload) + elif event_type=='mqtt_data' return nil + elif event_type=='gc' return self.gc() elif self._drivers for d:self._drivers - try - if type=='every_second' && d.every_second d.every_second() - elif type=='every_50ms' && d.every_50ms d.every_50ms() - elif type=='every_100ms' && d.every_100ms d.every_100ms() - elif type=='web_add_button' && d.web_add_button d.web_add_button() - elif type=='web_add_main_button' && d.web_add_main_button d.web_add_main_button() - elif type=='web_add_management_button' && d.web_add_management_button d.web_add_management_button() - elif type=='web_add_config_button' && d.web_add_config_button d.web_add_config_button() - elif type=='web_add_console_button' && d.web_add_console_button d.web_add_console_button() - elif type=='save_before_restart' && d.save_before_restart d.save_before_restart() - elif type=='web_add_handler' && d.web_add_handler d.web_add_handler() - elif type=='web_sensor' && d.web_sensor d.web_sensor() - elif type=='json_append' && d.json_append d.json_append() - elif type=='button_pressed' && d.button_pressed d.button_pressed() - elif type=='web_add_handler' && d.display d.display() - elif type=='display' && d.display d.display() + var f = introspect.get(d, event_type) # try to match a function or method with the same name + if type(f) == 'function' + try + f(d) + except .. as e,m + import string + print(string.format("BRY: Exception> '%s' - %s", e, m)) end - except .. as e,m - import string - print(string.format("BRY: Exception> '%s' - %s", e, m)) end end end diff --git a/lib/libesp32/Berry/default/embedded/lv_signal_bars.be b/lib/libesp32/Berry/default/embedded/lv_signal_bars.be new file mode 100644 index 000000000..32ae32977 --- /dev/null +++ b/lib/libesp32/Berry/default/embedded/lv_signal_bars.be @@ -0,0 +1,106 @@ +#- LVGL lv_signal_bars and lv_wifi_bars + - +--# + +class lv_signal_bars : lv_obj + var ancestor_design # previous design_cb + var percentage + var p1, p2, line_dsc, area + + def init(parent, copy) + import global + var lv = global.lv + # init parent object + super(self, global.lv_obj).init(parent, copy) + # keep a copy of + self.ancestor_design = self.get_design_cb() + self.set_design_cb(self.my_design_cb) + # own values + self.percentage = 100 + # pre-allocate buffers + self.p1 = global.lv_point() + self.p2 = global.lv_point() + self.line_dsc = global.lv_draw_line_dsc() + self.area = global.lv_area() + end + + def atleast1(x) if x >= 1 return x else return 1 end end + + def my_design_cb(area, mode) + import global + var lv = global.lv + #def atleast1(x) if x >= 1 return x else return 1 end end + # the model is that we have 4 bars and inter-bar (1/4 of width) + var height = self.get_height() + var width = self.get_width() + + var inter_bar = self.atleast1(width / 15) + var bar = self.atleast1((width - inter_bar * 3) / 4) + var bar_offset = bar / 2 + + if mode == lv.DESIGN_COVER_CHK + #- Return false if the object is not covers the clip_area area -# + return self.ancestor_design.call(self, area, mode) + + elif mode == lv.DESIGN_DRAW_MAIN + #self.ancestor_design.call(self, area, mode) - don't draw a background + + # get coordinates of area + self.get_coords(area) + var x_ofs = area.x1 + var y_ofs = area.y1 + + lv.draw_line_dsc_init(self.line_dsc) + self.init_draw_line_dsc(lv.OBJ_PART_MAIN, self.line_dsc) + + self.line_dsc.round_start = 1 + self.line_dsc.round_end = 1 + self.line_dsc.width = bar + var on_color = self.get_style_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) + var off_color = self.get_style_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) + + for i:0..3 + self.line_dsc.color = self.percentage >= (i+1)*20 ? on_color : off_color + self.p1.y = y_ofs + height - 1 - bar_offset + self.p1.x = x_ofs + i * (bar + inter_bar) + bar_offset + self.p2.y = y_ofs + ((3 - i) * (height - bar)) / 4 + bar_offset + self.p2.x = self.p1.x + lv.draw_line(self.p1, self.p2, area, self.line_dsc) + end + #elif mode == lv.DESIGN_DRAW_POST # we don't want a frame around this object + #self.ancestor_design.call(self, area, mode) + end + return lv.DESIGN_RES_OK + end + + def set_percentage(v) + var old_bars = self.percentage / 5 + if v > 100 v = 100 end + if v < 0 v = 0 end + self.percentage = v + if old_bars != v / 5 + self.invalidate() # be frugal and avoid updating the widget if it's not needed + end + end + + def get_percentage() + return self.percentage + end +end + +class lv_wifi_bars: lv_signal_bars + def init(parent, copy) + import global + super(self, global.lv_signal_bars).init(parent, copy) + global.tasmota.add_driver(self) + end + + def every_second() + import global + var wifi = global.tasmota.wifi() + var quality = wifi.find("quality") + if quality != nil + self.set_percentage(quality) + end + end +end \ No newline at end of file diff --git a/lib/libesp32/Berry/src/be_constobj.h b/lib/libesp32/Berry/src/be_constobj.h index d5d417161..b1a5165ff 100644 --- a/lib/libesp32/Berry/src/be_constobj.h +++ b/lib/libesp32/Berry/src/be_constobj.h @@ -144,7 +144,7 @@ const bntvmodule be_native_module(_module) = { \ /* defines needed for solidified classes */ #define be_local_class(_name, _nvar, _super, _map, _cname) \ - const bclass be_##_name##_class = { \ + const bclass be_class_##_name = { \ be_const_header(BE_CLASS), \ .nvar = _nvar, \ .super = (bclass*)_super, \ diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index 262933de0..dc49de6f7 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -250,7 +250,7 @@ static void m_solidify_class(bvm *vm, bclass *cl, int builtins) logfmt("/*******************************************************************/\n\n"); logfmt("void be_load_%s_class(bvm *vm) {\n", class_name); - logfmt(" be_pushntvclass(vm, &be_%s_class);\n", class_name); + logfmt(" be_pushntvclass(vm, &be_class_%s);\n", class_name); logfmt(" be_setglobal(vm, \"%s\");\n", class_name); logfmt(" be_pop(vm, 1);\n"); logfmt("}\n"); diff --git a/tasmota/berry/lvgl_examples/lvgl_demo.be b/tasmota/berry/lvgl_examples/lvgl_demo.be index 1f995772d..b3ff41869 100644 --- a/tasmota/berry/lvgl_examples/lvgl_demo.be +++ b/tasmota/berry/lvgl_examples/lvgl_demo.be @@ -57,13 +57,10 @@ log_height = log.get_height() # log.get_style_pad_right(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) log.set_style_local_pad_right(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, log_height+1) -bars = lv_signal_bars(log) +bars = lv_wifi_bars(log) bars.set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(lv.BLACK)) bars.set_height(log_height) bars.set_width(log_height) bars.set_x(log.get_width() - log_height) - -#bars.get_style_transform_width(lv.OBJ_PART_MAIN) -#bars.get_style_transform_height(lv.OBJ_PART_MAIN) \ No newline at end of file From 4cab21eaaa5d7fae3b9fed546a1f3be52b0dc854 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 25 Jul 2021 21:20:14 +0200 Subject: [PATCH 041/148] Berry fix solidified sub-protos --- lib/libesp32/Berry/default/be_driverlib.c | 68 +-- .../Berry/default/be_lvgl_signal_bars_lib.c | 410 +++++++++--------- .../Berry/default/embedded/lv_signal_bars.be | 8 +- lib/libesp32/Berry/src/be_solidifylib.c | 4 +- 4 files changed, 242 insertions(+), 248 deletions(-) diff --git a/lib/libesp32/Berry/default/be_driverlib.c b/lib/libesp32/Berry/default/be_driverlib.c index a62a53805..1958c8f4d 100644 --- a/lib/libesp32/Berry/default/be_driverlib.c +++ b/lib/libesp32/Berry/default/be_driverlib.c @@ -46,12 +46,12 @@ be_local_closure(get_tasmota, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* upvals */ - { { .s=be_nested_const_str("global", 503252654, 6) }, BE_STRING}, - { { .s=be_nested_const_str("tasmota", 424643812, 7) }, BE_STRING}, + ( &(const bvalue[ 2]) { /* constants */ + be_nested_string("global", 503252654, 6), + be_nested_string("tasmota", 424643812, 7), }), (be_nested_const_str("get_tasmota", 334356779, 11)), - (be_nested_const_str("stdin", -1529146723, 5)), + (be_nested_const_str("input", -103256197, 5)), ( &(const binstruction[ 3]) { /* code */ 0xA4060000, // 0000 IMPORT R1 R256 0x88080301, // 0001 GETMBR R2 R1 R257 @@ -71,38 +71,40 @@ be_local_closure(add_cmd, /* name */ 0, /* has upvals */ NULL, /* no upvals */ 1, /* has sup protos */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 2), - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - (be_nested_const_str("", 607256038, 8)), - (be_nested_const_str("stdin", -1529146723, 5)), - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x68140001, // 0001 GETUPV R5 U1 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 2), + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + (be_nested_const_str("", 607256038, 8)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x68140001, // 0001 GETUPV R5 U1 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), 1, /* has constants */ - ( &(const bvalue[ 2]) { /* upvals */ - { { .s=be_nested_const_str("get_tasmota", 334356779, 11) }, BE_STRING}, - { { .s=be_nested_const_str("add_cmd", -933336417, 7) }, BE_STRING}, + ( &(const bvalue[ 2]) { /* constants */ + be_nested_string("get_tasmota", 334356779, 11), + be_nested_string("add_cmd", -933336417, 7), }), (be_nested_const_str("add_cmd", -933336417, 7)), - (be_nested_const_str("stdin", -1529146723, 5)), + (be_nested_const_str("input", -103256197, 5)), ( &(const binstruction[ 8]) { /* code */ 0x8C0C0100, // 0000 GETMET R3 R0 R256 0x7C0C0200, // 0001 CALL R3 1 diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c index cc75b848c..3932039c1 100644 --- a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c @@ -7,94 +7,46 @@ #include "lvgl.h" -/******************************************************************** -** Solidified function: get_percentage -********************************************************************/ -be_local_closure(get_percentage, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - be_nested_string("percentage", -1756136011, 10), - }), - (be_nested_const_str("get_percentage", -1414483304, 14)), - (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 R256 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_percentage -********************************************************************/ -be_local_closure(set_percentage, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - be_nested_string("percentage", -1756136011, 10), - be_const_int(0), - be_nested_string("invalidate", -1645232368, 10), - }), - (be_nested_const_str("set_percentage", -1342944572, 14)), - (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[18]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 R256 - 0x540E0004, // 0001 LDINT R3 5 - 0x0C080403, // 0002 DIV R2 R2 R3 - 0x540E0063, // 0003 LDINT R3 100 - 0x240C0203, // 0004 GT R3 R1 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x54060063, // 0006 LDINT R1 100 - 0x140C0301, // 0007 LT R3 R1 R257 - 0x780E0000, // 0008 JMPF R3 #000A - 0x58040001, // 0009 LDCONST R1 K1 - 0x90020001, // 000A SETMBR R0 R256 R1 - 0x540E0004, // 000B LDINT R3 5 - 0x0C0C0203, // 000C DIV R3 R1 R3 - 0x200C0403, // 000D NE R3 R2 R3 - 0x780E0001, // 000E JMPF R3 #0011 - 0x8C0C0102, // 000F GETMET R3 R0 R258 - 0x7C0C0200, // 0010 CALL R3 1 - 0x80000000, // 0011 RET 0 R0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: my_design_cb ********************************************************************/ be_local_closure(my_design_cb, /* name */ be_nested_proto( - 22, /* nstack */ + 23, /* nstack */ 3, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + be_const_int(1), + }), + (be_nested_const_str("atleast1", 1956331672, 8)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 6]) { /* code */ + 0x28040100, // 0000 GE R1 R0 R256 + 0x78060001, // 0001 JMPF R1 #0004 + 0x80040000, // 0002 RET 1 R0 + 0x70020000, // 0003 JMP #0005 + 0x80060000, // 0004 RET 1 R256 + 0x80000000, // 0005 RET 0 R0 + }) + ), + }), 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ + ( &(const bvalue[34]) { /* constants */ be_nested_string("global", 503252654, 6), be_nested_string("lv", 1529997255, 2), be_nested_string("get_height", -723211773, 10), be_nested_string("get_width", -1001549996, 9), - be_nested_string("atleast1", 1956331672, 8), be_const_int(3), be_const_int(2), be_nested_string("DESIGN_COVER_CHK", -1298406708, 16), @@ -128,117 +80,118 @@ be_local_closure(my_design_cb, /* name */ }), (be_nested_const_str("my_design_cb", -1173588798, 12)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[110]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 R256 - 0x88100701, // 0001 GETMBR R4 R3 R257 - 0x8C140102, // 0002 GETMET R5 R0 R258 - 0x7C140200, // 0003 CALL R5 1 - 0x8C180103, // 0004 GETMET R6 R0 R259 - 0x7C180200, // 0005 CALL R6 1 - 0x8C1C0104, // 0006 GETMET R7 R0 R260 - 0x5426000E, // 0007 LDINT R9 15 - 0x0C240C09, // 0008 DIV R9 R6 R9 - 0x7C1C0400, // 0009 CALL R7 2 - 0x8C200104, // 000A GETMET R8 R0 R260 - 0x08280F05, // 000B MUL R10 R7 R261 - 0x04280C0A, // 000C SUB R10 R6 R10 - 0x542E0003, // 000D LDINT R11 4 - 0x0C28140B, // 000E DIV R10 R10 R11 - 0x7C200400, // 000F CALL R8 2 - 0x0C241106, // 0010 DIV R9 R8 R262 - 0x88280907, // 0011 GETMBR R10 R4 R263 - 0x1C28040A, // 0012 EQ R10 R2 R10 - 0x782A0007, // 0013 JMPF R10 #001C - 0x88280108, // 0014 GETMBR R10 R0 R264 - 0x8C281509, // 0015 GETMET R10 R10 R265 - 0x5C300000, // 0016 MOVE R12 R0 - 0x5C340200, // 0017 MOVE R13 R1 - 0x5C380400, // 0018 MOVE R14 R2 - 0x7C280800, // 0019 CALL R10 4 - 0x80041400, // 001A RET 1 R10 - 0x7002004F, // 001B JMP #006C - 0x8828090A, // 001C GETMBR R10 R4 R266 - 0x1C28040A, // 001D EQ R10 R2 R10 - 0x782A004C, // 001E JMPF R10 #006C - 0x8C28010B, // 001F GETMET R10 R0 R267 - 0x5C300200, // 0020 MOVE R12 R1 - 0x7C280400, // 0021 CALL R10 2 - 0x8828030C, // 0022 GETMBR R10 R1 R268 - 0x882C030D, // 0023 GETMBR R11 R1 R269 - 0x8C30090E, // 0024 GETMET R12 R4 R270 - 0x8838010F, // 0025 GETMBR R14 R0 R271 - 0x7C300400, // 0026 CALL R12 2 - 0x8C300110, // 0027 GETMET R12 R0 R272 - 0x88380911, // 0028 GETMBR R14 R4 R273 - 0x883C010F, // 0029 GETMBR R15 R0 R271 - 0x7C300600, // 002A CALL R12 3 - 0x8830010F, // 002B GETMBR R12 R0 R271 - 0x90322513, // 002C SETMBR R12 R274 R275 - 0x8830010F, // 002D GETMBR R12 R0 R271 - 0x90322913, // 002E SETMBR R12 R276 R275 - 0x8830010F, // 002F GETMBR R12 R0 R271 - 0x90322A08, // 0030 SETMBR R12 R277 R8 - 0x8C300116, // 0031 GETMET R12 R0 R278 - 0x88380911, // 0032 GETMBR R14 R4 R273 - 0x883C0917, // 0033 GETMBR R15 R4 R279 - 0x7C300600, // 0034 CALL R12 3 - 0x8C340118, // 0035 GETMET R13 R0 R280 - 0x883C0911, // 0036 GETMBR R15 R4 R273 - 0x88400917, // 0037 GETMBR R16 R4 R279 - 0x7C340600, // 0038 CALL R13 3 - 0x60380000, // 0039 GETGBL R14 G0 - 0x403E3305, // 003A CONNECT R15 R281 R261 - 0x7C380200, // 003B CALL R14 1 - 0xA802002B, // 003C EXBLK 0 #0069 - 0x5C3C1C00, // 003D MOVE R15 R14 - 0x7C3C0000, // 003E CALL R15 0 - 0x8840010F, // 003F GETMBR R16 R0 R271 - 0x8844011B, // 0040 GETMBR R17 R0 R283 - 0x00481F13, // 0041 ADD R18 R15 R275 - 0x544E0013, // 0042 LDINT R19 20 - 0x08482413, // 0043 MUL R18 R18 R19 - 0x28442212, // 0044 GE R17 R17 R18 - 0x78460001, // 0045 JMPF R17 #0048 - 0x5C441800, // 0046 MOVE R17 R12 - 0x70020000, // 0047 JMP #0049 - 0x5C441A00, // 0048 MOVE R17 R13 - 0x90423411, // 0049 SETMBR R16 R282 R17 - 0x8840011C, // 004A GETMBR R16 R0 R284 - 0x00441605, // 004B ADD R17 R11 R5 - 0x04442313, // 004C SUB R17 R17 R275 - 0x04442209, // 004D SUB R17 R17 R9 - 0x90423A11, // 004E SETMBR R16 R285 R17 - 0x8840011C, // 004F GETMBR R16 R0 R284 - 0x00441007, // 0050 ADD R17 R8 R7 - 0x08441E11, // 0051 MUL R17 R15 R17 - 0x00441411, // 0052 ADD R17 R10 R17 - 0x00442209, // 0053 ADD R17 R17 R9 - 0x90423C11, // 0054 SETMBR R16 R286 R17 - 0x8840011F, // 0055 GETMBR R16 R0 R287 - 0x04460A0F, // 0056 SUB R17 R261 R15 - 0x04480A08, // 0057 SUB R18 R5 R8 - 0x08442212, // 0058 MUL R17 R17 R18 - 0x544A0003, // 0059 LDINT R18 4 - 0x0C442212, // 005A DIV R17 R17 R18 - 0x00441611, // 005B ADD R17 R11 R17 - 0x00442209, // 005C ADD R17 R17 R9 - 0x90423A11, // 005D SETMBR R16 R285 R17 - 0x8840011F, // 005E GETMBR R16 R0 R287 - 0x8844011C, // 005F GETMBR R17 R0 R284 - 0x8844231E, // 0060 GETMBR R17 R17 R286 - 0x90423C11, // 0061 SETMBR R16 R286 R17 - 0x8C400920, // 0062 GETMET R16 R4 R288 - 0x8848011C, // 0063 GETMBR R18 R0 R284 - 0x884C011F, // 0064 GETMBR R19 R0 R287 - 0x5C500200, // 0065 MOVE R20 R1 - 0x8854010F, // 0066 GETMBR R21 R0 R271 - 0x7C400A00, // 0067 CALL R16 5 - 0x7001FFD3, // 0068 JMP #003D - 0x58380021, // 0069 LDCONST R14 K33 - 0xAC380200, // 006A CATCH R14 1 0 - 0xB0080000, // 006B RAISE 2 R0 R0 - 0x88280922, // 006C GETMBR R10 R4 R290 - 0x80041400, // 006D RET 1 R10 + ( &(const binstruction[111]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0xA4120000, // 0001 IMPORT R4 R256 + 0x88140901, // 0002 GETMBR R5 R4 R257 + 0x8C180102, // 0003 GETMET R6 R0 R258 + 0x7C180200, // 0004 CALL R6 1 + 0x8C1C0103, // 0005 GETMET R7 R0 R259 + 0x7C1C0200, // 0006 CALL R7 1 + 0x5C200600, // 0007 MOVE R8 R3 + 0x5426000E, // 0008 LDINT R9 15 + 0x0C240E09, // 0009 DIV R9 R7 R9 + 0x7C200200, // 000A CALL R8 1 + 0x5C240600, // 000B MOVE R9 R3 + 0x08281104, // 000C MUL R10 R8 R260 + 0x04280E0A, // 000D SUB R10 R7 R10 + 0x542E0003, // 000E LDINT R11 4 + 0x0C28140B, // 000F DIV R10 R10 R11 + 0x7C240200, // 0010 CALL R9 1 + 0x0C281305, // 0011 DIV R10 R9 R261 + 0x882C0B06, // 0012 GETMBR R11 R5 R262 + 0x1C2C040B, // 0013 EQ R11 R2 R11 + 0x782E0007, // 0014 JMPF R11 #001D + 0x882C0107, // 0015 GETMBR R11 R0 R263 + 0x8C2C1708, // 0016 GETMET R11 R11 R264 + 0x5C340000, // 0017 MOVE R13 R0 + 0x5C380200, // 0018 MOVE R14 R1 + 0x5C3C0400, // 0019 MOVE R15 R2 + 0x7C2C0800, // 001A CALL R11 4 + 0x80041600, // 001B RET 1 R11 + 0x7002004F, // 001C JMP #006D + 0x882C0B09, // 001D GETMBR R11 R5 R265 + 0x1C2C040B, // 001E EQ R11 R2 R11 + 0x782E004C, // 001F JMPF R11 #006D + 0x8C2C010A, // 0020 GETMET R11 R0 R266 + 0x5C340200, // 0021 MOVE R13 R1 + 0x7C2C0400, // 0022 CALL R11 2 + 0x882C030B, // 0023 GETMBR R11 R1 R267 + 0x8830030C, // 0024 GETMBR R12 R1 R268 + 0x8C340B0D, // 0025 GETMET R13 R5 R269 + 0x883C010E, // 0026 GETMBR R15 R0 R270 + 0x7C340400, // 0027 CALL R13 2 + 0x8C34010F, // 0028 GETMET R13 R0 R271 + 0x883C0B10, // 0029 GETMBR R15 R5 R272 + 0x8840010E, // 002A GETMBR R16 R0 R270 + 0x7C340600, // 002B CALL R13 3 + 0x8834010E, // 002C GETMBR R13 R0 R270 + 0x90362312, // 002D SETMBR R13 R273 R274 + 0x8834010E, // 002E GETMBR R13 R0 R270 + 0x90362712, // 002F SETMBR R13 R275 R274 + 0x8834010E, // 0030 GETMBR R13 R0 R270 + 0x90362809, // 0031 SETMBR R13 R276 R9 + 0x8C340115, // 0032 GETMET R13 R0 R277 + 0x883C0B10, // 0033 GETMBR R15 R5 R272 + 0x88400B16, // 0034 GETMBR R16 R5 R278 + 0x7C340600, // 0035 CALL R13 3 + 0x8C380117, // 0036 GETMET R14 R0 R279 + 0x88400B10, // 0037 GETMBR R16 R5 R272 + 0x88440B16, // 0038 GETMBR R17 R5 R278 + 0x7C380600, // 0039 CALL R14 3 + 0x603C0000, // 003A GETGBL R15 G0 + 0x40423104, // 003B CONNECT R16 R280 R260 + 0x7C3C0200, // 003C CALL R15 1 + 0xA802002B, // 003D EXBLK 0 #006A + 0x5C401E00, // 003E MOVE R16 R15 + 0x7C400000, // 003F CALL R16 0 + 0x8844010E, // 0040 GETMBR R17 R0 R270 + 0x8848011A, // 0041 GETMBR R18 R0 R282 + 0x004C2112, // 0042 ADD R19 R16 R274 + 0x54520013, // 0043 LDINT R20 20 + 0x084C2614, // 0044 MUL R19 R19 R20 + 0x28482413, // 0045 GE R18 R18 R19 + 0x784A0001, // 0046 JMPF R18 #0049 + 0x5C481A00, // 0047 MOVE R18 R13 + 0x70020000, // 0048 JMP #004A + 0x5C481C00, // 0049 MOVE R18 R14 + 0x90463212, // 004A SETMBR R17 R281 R18 + 0x8844011B, // 004B GETMBR R17 R0 R283 + 0x00481806, // 004C ADD R18 R12 R6 + 0x04482512, // 004D SUB R18 R18 R274 + 0x0448240A, // 004E SUB R18 R18 R10 + 0x90463812, // 004F SETMBR R17 R284 R18 + 0x8844011B, // 0050 GETMBR R17 R0 R283 + 0x00481208, // 0051 ADD R18 R9 R8 + 0x08482012, // 0052 MUL R18 R16 R18 + 0x00481612, // 0053 ADD R18 R11 R18 + 0x0048240A, // 0054 ADD R18 R18 R10 + 0x90463A12, // 0055 SETMBR R17 R285 R18 + 0x8844011E, // 0056 GETMBR R17 R0 R286 + 0x044A0810, // 0057 SUB R18 R260 R16 + 0x044C0C09, // 0058 SUB R19 R6 R9 + 0x08482413, // 0059 MUL R18 R18 R19 + 0x544E0003, // 005A LDINT R19 4 + 0x0C482413, // 005B DIV R18 R18 R19 + 0x00481812, // 005C ADD R18 R12 R18 + 0x0048240A, // 005D ADD R18 R18 R10 + 0x90463812, // 005E SETMBR R17 R284 R18 + 0x8844011E, // 005F GETMBR R17 R0 R286 + 0x8848011B, // 0060 GETMBR R18 R0 R283 + 0x8848251D, // 0061 GETMBR R18 R18 R285 + 0x90463A12, // 0062 SETMBR R17 R285 R18 + 0x8C440B1F, // 0063 GETMET R17 R5 R287 + 0x884C011B, // 0064 GETMBR R19 R0 R283 + 0x8850011E, // 0065 GETMBR R20 R0 R286 + 0x5C540200, // 0066 MOVE R21 R1 + 0x8858010E, // 0067 GETMBR R22 R0 R270 + 0x7C440A00, // 0068 CALL R17 5 + 0x7001FFD3, // 0069 JMP #003E + 0x583C0020, // 006A LDCONST R15 K32 + 0xAC3C0200, // 006B CATCH R15 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x882C0B21, // 006D GETMBR R11 R5 R289 + 0x80041600, // 006E RET 1 R11 }) ) ); @@ -246,29 +199,25 @@ be_local_closure(my_design_cb, /* name */ /******************************************************************** -** Solidified function: atleast1 +** Solidified function: get_percentage ********************************************************************/ -be_local_closure(atleast1, /* name */ +be_local_closure(get_percentage, /* name */ be_nested_proto( - 3, /* nstack */ - 2, /* argc */ + 2, /* nstack */ + 1, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - be_const_int(1), + be_nested_string("percentage", -1756136011, 10), }), - (be_nested_const_str("atleast1", 1956331672, 8)), + (be_nested_const_str("get_percentage", -1414483304, 14)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[ 6]) { /* code */ - 0x28080300, // 0000 GE R2 R1 R256 - 0x780A0001, // 0001 JMPF R2 #0004 - 0x80040200, // 0002 RET 1 R1 - 0x70020000, // 0003 JMP #0005 - 0x80060000, // 0004 RET 1 R256 - 0x80000000, // 0005 RET 0 R0 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 R256 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -345,6 +294,50 @@ be_local_closure(init, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_percentage +********************************************************************/ +be_local_closure(set_percentage, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + be_nested_string("percentage", -1756136011, 10), + be_const_int(0), + be_nested_string("invalidate", -1645232368, 10), + }), + (be_nested_const_str("set_percentage", -1342944572, 14)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[18]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 R256 + 0x540E0004, // 0001 LDINT R3 5 + 0x0C080403, // 0002 DIV R2 R2 R3 + 0x540E0063, // 0003 LDINT R3 100 + 0x240C0203, // 0004 GT R3 R1 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x54060063, // 0006 LDINT R1 100 + 0x140C0301, // 0007 LT R3 R1 R257 + 0x780E0000, // 0008 JMPF R3 #000A + 0x58040001, // 0009 LDCONST R1 K1 + 0x90020001, // 000A SETMBR R0 R256 R1 + 0x540E0004, // 000B LDINT R3 5 + 0x0C0C0203, // 000C DIV R3 R1 R3 + 0x200C0403, // 000D NE R3 R2 R3 + 0x780E0001, // 000E JMPF R3 #0011 + 0x8C0C0102, // 000F GETMET R3 R0 R258 + 0x7C0C0200, // 0010 CALL R3 1 + 0x80000000, // 0011 RET 0 R0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: lv_signal_bars ********************************************************************/ @@ -352,19 +345,18 @@ extern const bclass be_class_lv_obj; be_local_class(lv_signal_bars, 6, &be_class_lv_obj, - be_nested_map(11, + be_nested_map(10, ( (struct bmapnode*) &(const bmapnode[]) { { be_nested_key("p1", -1605446022, 2, -1), be_const_index(2) }, - { be_nested_key("get_percentage", -1414483304, 14, 5), be_const_closure(get_percentage_closure) }, - { be_nested_key("set_percentage", -1342944572, 14, -1), be_const_closure(set_percentage_closure) }, - { be_nested_key("p2", -1622223641, 2, -1), be_const_index(3) }, - { be_nested_key("ancestor_design", 421545719, 15, -1), be_const_index(0) }, - { be_nested_key("percentage", -1756136011, 10, 4), be_const_index(1) }, - { be_nested_key("line_dsc", -200476318, 8, -1), be_const_index(4) }, { be_nested_key("my_design_cb", -1173588798, 12, -1), be_const_closure(my_design_cb_closure) }, - { be_nested_key("atleast1", 1956331672, 8, -1), be_const_closure(atleast1_closure) }, - { be_nested_key("init", 380752755, 4, 8), be_const_closure(init_closure) }, - { be_nested_key("area", -1693507260, 4, 3), be_const_index(5) }, + { be_nested_key("get_percentage", -1414483304, 14, -1), be_const_closure(get_percentage_closure) }, + { be_nested_key("init", 380752755, 4, 7), be_const_closure(init_closure) }, + { be_nested_key("set_percentage", -1342944572, 14, 0), be_const_closure(set_percentage_closure) }, + { be_nested_key("percentage", -1756136011, 10, 3), be_const_index(1) }, + { be_nested_key("area", -1693507260, 4, -1), be_const_index(5) }, + { be_nested_key("p2", -1622223641, 2, -1), be_const_index(3) }, + { be_nested_key("line_dsc", -200476318, 8, 1), be_const_index(4) }, + { be_nested_key("ancestor_design", 421545719, 15, -1), be_const_index(0) }, })), (be_nested_const_str("lv_signal_bars", -780994737, 14)) ); diff --git a/lib/libesp32/Berry/default/embedded/lv_signal_bars.be b/lib/libesp32/Berry/default/embedded/lv_signal_bars.be index 32ae32977..97b71d466 100644 --- a/lib/libesp32/Berry/default/embedded/lv_signal_bars.be +++ b/lib/libesp32/Berry/default/embedded/lv_signal_bars.be @@ -24,18 +24,16 @@ class lv_signal_bars : lv_obj self.area = global.lv_area() end - def atleast1(x) if x >= 1 return x else return 1 end end - def my_design_cb(area, mode) + def atleast1(x) if x >= 1 return x else return 1 end end import global var lv = global.lv - #def atleast1(x) if x >= 1 return x else return 1 end end # the model is that we have 4 bars and inter-bar (1/4 of width) var height = self.get_height() var width = self.get_width() - var inter_bar = self.atleast1(width / 15) - var bar = self.atleast1((width - inter_bar * 3) / 4) + var inter_bar = atleast1(width / 15) + var bar = atleast1((width - inter_bar * 3) / 4) var bar_offset = bar / 2 if mode == lv.DESIGN_COVER_CHK diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index dc49de6f7..02dec222f 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -110,13 +110,15 @@ static void m_solidify_proto(bvm *vm, bproto *pr, const char * func_name, int bu logfmt("%*s%d, /* has sup protos */\n", indent, "", (pr->nproto > 0) ? 1 : 0); if (pr->nproto > 0) { + logfmt("%*s( &(const struct bproto*[%2d]) {\n", indent, "", pr->nproto); for (int32_t i = 0; i < pr->nproto; i++) { size_t sub_len = strlen(func_name) + 10; char sub_name[sub_len]; snprintf(sub_name, sizeof(sub_name), "%s_%d", func_name, i); - m_solidify_proto(vm, pr->ptab[i], sub_name, builtins, indent); + m_solidify_proto(vm, pr->ptab[i], sub_name, builtins, indent+2); logfmt(",\n"); } + logfmt("%*s}),\n", indent, ""); } else { logfmt("%*sNULL, /* no sub protos */\n", indent, ""); } From ee876bd3427c7f70c57defcc8becdb51e0462721 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 25 Jul 2021 21:33:39 +0200 Subject: [PATCH 042/148] Berry solidified constants --- .../Berry/default/be_lvgl_signal_wifi_lib.c | 22 +++++++++---------- lib/libesp32/Berry/src/be_solidifylib.c | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c index 7218e752b..23b6c140f 100644 --- a/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c @@ -20,11 +20,11 @@ be_local_closure(init, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - be_nested_string("global", 503252654, 6), - be_nested_string("lv_signal_bars", -780994737, 14), - be_nested_string("init", 380752755, 4), - be_nested_string("tasmota", 424643812, 7), - be_nested_string("add_driver", 1654458371, 10), + be_nested_string("global", 503252654, 6), /* R256 - K0 */ + be_nested_string("lv_signal_bars", -780994737, 14), /* R257 - K1 */ + be_nested_string("init", 380752755, 4), /* R258 - K2 */ + be_nested_string("tasmota", 424643812, 7), /* R259 - K3 */ + be_nested_string("add_driver", 1654458371, 10), /* R260 - K4 */ }), (be_nested_const_str("init", 380752755, 4)), (be_nested_const_str("input", -103256197, 5)), @@ -62,12 +62,12 @@ be_local_closure(every_second, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 6]) { /* constants */ - be_nested_string("global", 503252654, 6), - be_nested_string("tasmota", 424643812, 7), - be_nested_string("wifi", 120087624, 4), - be_nested_string("find", -1108310694, 4), - be_nested_string("quality", -1697296346, 7), - be_nested_string("set_percentage", -1342944572, 14), + be_nested_string("global", 503252654, 6), /* R256 - K0 */ + be_nested_string("tasmota", 424643812, 7), /* R257 - K1 */ + be_nested_string("wifi", 120087624, 4), /* R258 - K2 */ + be_nested_string("find", -1108310694, 4), /* R259 - K3 */ + be_nested_string("quality", -1697296346, 7), /* R260 - K4 */ + be_nested_string("set_percentage", -1342944572, 14), /* R261 - K5 */ }), (be_nested_const_str("every_second", 2075451465, 12)), (be_nested_const_str("input", -103256197, 5)), diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c index 02dec222f..473f74c0b 100644 --- a/lib/libesp32/Berry/src/be_solidifylib.c +++ b/lib/libesp32/Berry/src/be_solidifylib.c @@ -129,7 +129,7 @@ static void m_solidify_proto(bvm *vm, bproto *pr, const char * func_name, int bu for (int k = 0; k < pr->nconst; k++) { logfmt("%*s ", indent, ""); m_solidify_bvalue(vm, &pr->ktab[k]); - logfmt(",\n"); + logfmt(", /* R%d - K%d */\n", 256+k, k); } logfmt("%*s}),\n", indent, ""); } else { From e039edde334541ecd4cfe50590f0e972180db114 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 26 Jul 2021 15:10:47 +0200 Subject: [PATCH 043/148] Enforce valid hostname --- tasmota/tasmota.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index aeab9e8ed..15a5cf519 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -382,7 +382,8 @@ void setup(void) { } char *s = TasmotaGlobal.hostname; while (*s) { - if (' ' == *s) { *s = '_'; } + if (!(isalnum(*s) || ('.' == *s))) { *s = '-'; } // Valid hostname chars are A..Z, a..z, 0..9, . and - + if ((s == TasmotaGlobal.hostname) && ('-' == *s)) { *s = 'x'; } // First char cannot be a dash so replace by an x s++; } snprintf_P(TasmotaGlobal.mqtt_topic, sizeof(TasmotaGlobal.mqtt_topic), ResolveToken(TasmotaGlobal.mqtt_topic).c_str()); From e2b7cd96e6cb77765f87e32c8977617c70a8fb94 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 26 Jul 2021 17:10:08 +0200 Subject: [PATCH 044/148] Skip not used ESP32 GPIO init --- tasmota/support_tasmota.ino | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 7c74aa479..22bb3a136 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1850,6 +1850,10 @@ void GpioInit(void) pinMode(i, OUTPUT); digitalWrite(i, 0); } + +/* + // Until 20210726 + // Set any non-used GPIO to INPUT - Related to resetPins() in support_legacy_cores.ino // Doing it here solves relay toggles at restart. #if CONFIG_IDF_TARGET_ESP32C3 @@ -1865,6 +1869,16 @@ void GpioInit(void) } } #endif // CONFIG_IDF_TARGET_ESP32C3 +*/ +#ifdef ESP8266 + // Set any non-used GPIO to INPUT - Related to resetPins() in support_legacy_cores.ino + // Doing it here solves relay toggles at restart. + else if (((i < 6) || (i > 11)) && (GPIO_NONE == mpin)) { // Skip SPI flash interface + if (!((1 == i) || (3 == i))) { // Skip serial + pinMode(i, INPUT); + } + } +#endif // ESP8266 } // Digital input From 901d4a6a179614410270504bfd96d76027dbc2eb Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 27 Jul 2021 15:50:00 +0200 Subject: [PATCH 045/148] Fix discovery compile error when no light is enabled --- tasmota/xdrv_12_discovery.ino | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tasmota/xdrv_12_discovery.ino b/tasmota/xdrv_12_discovery.ino index f4ad21752..f6ab5a425 100644 --- a/tasmota/xdrv_12_discovery.ino +++ b/tasmota/xdrv_12_discovery.ino @@ -79,18 +79,24 @@ void TasDiscoverMessage(void) { PSTR(PUB_PREFIX), PSTR(PUB_PREFIX2)); - uint8_t lightidx = MAX_RELAYS + 1; // Will store the starting position of the lights - if (Light.subtype > LST_NONE) { - if (!light_controller.isCTRGBLinked()) { // One or two lights present - lightidx = TasmotaGlobal.devices_present - 2; + uint8_t light_idx = MAX_RELAYS + 1; // Will store the starting position of the lights + uint8_t light_subtype = 0; + bool light_controller_isCTRGBLinked = false; +#ifdef USE_LIGHT + light_subtype = Light.subtype; + if (light_subtype > LST_NONE) { + light_controller_isCTRGBLinked = light_controller.isCTRGBLinked(); + if (!light_controller_isCTRGBLinked) { // One or two lights present + light_idx = TasmotaGlobal.devices_present - 2; } else { - lightidx = TasmotaGlobal.devices_present - 1; + light_idx = TasmotaGlobal.devices_present - 1; } } if ((Light.device > 0) && Settings->flag3.pwm_multi_channels) { // How many relays are light devices? - lightidx = TasmotaGlobal.devices_present - Light.subtype; + light_idx = TasmotaGlobal.devices_present - light_subtype; } +#endif // USE_LIGHT uint16_t Relay[MAX_RELAYS] = { 0 }; // Base array to store the relay type uint16_t Shutter[MAX_RELAYS] = { 0 }; // Array to store a temp list for shutters @@ -114,7 +120,7 @@ void TasDiscoverMessage(void) { if (Shutter[i] != 0) { // Check if there are shutters present Relay[i] = 3; // Relay is a shutter } else { - if (i >= lightidx || (iFanMod && (0 == i))) { // First relay on Ifan controls the light + if (i >= light_idx || (iFanMod && (0 == i))) { // First relay on Ifan controls the light Relay[i] = 2; // Relay is a light } else { if (!iFanMod) { // Relays 2-4 for ifan are controlled by FANSPEED and don't need to be present if TasmotaGlobal.module_type = SONOFF_IFAN02 or SONOFF_IFAN03 @@ -182,8 +188,8 @@ void TasDiscoverMessage(void) { Settings->flag4.alexa_ct_range, Settings->flag5.mqtt_switches, Settings->flag5.fade_fixed_duration, - light_controller.isCTRGBLinked(), - Light.subtype); + light_controller_isCTRGBLinked, + light_subtype); for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { #ifdef USE_SHUTTER From 52b29625a6f13ff55fa604a6d33ab5f722705169 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 27 Jul 2021 21:39:24 +0200 Subject: [PATCH 046/148] Berry simplidy globals for solidification --- .../Berry/default/be_lvgl_signal_bars_lib.c | 407 +++++++++--------- .../Berry/default/be_lvgl_signal_wifi_lib.c | 86 ++-- .../Berry/default/embedded/lv_signal_bars.be | 22 +- lib/libesp32/Berry/src/be_code.c | 21 +- lib/libesp32/Berry/src/be_code.h | 1 + lib/libesp32/Berry/src/be_debug.c | 3 + lib/libesp32/Berry/src/be_opcodes.h | 4 +- lib/libesp32/Berry/src/be_parser.c | 20 +- lib/libesp32/Berry/src/be_parser.h | 3 +- lib/libesp32/Berry/src/be_vm.c | 33 ++ lib/libesp32/Berry/src/be_vm.h | 10 + tasmota/berry/lvgl_examples/signal_bars.be | 98 ----- tasmota/xdrv_52_9_berry.ino | 2 + 13 files changed, 345 insertions(+), 365 deletions(-) delete mode 100644 tasmota/berry/lvgl_examples/signal_bars.be diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c index 3932039c1..060789ae0 100644 --- a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c @@ -12,7 +12,7 @@ ********************************************************************/ be_local_closure(my_design_cb, /* name */ be_nested_proto( - 23, /* nstack */ + 21, /* nstack */ 3, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ @@ -27,7 +27,7 @@ be_local_closure(my_design_cb, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - be_const_int(1), + be_const_int(1), /* R256 - K0 */ }), (be_nested_const_str("atleast1", 1956331672, 8)), (be_nested_const_str("input", -103256197, 5)), @@ -42,156 +42,163 @@ be_local_closure(my_design_cb, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ - be_nested_string("global", 503252654, 6), - be_nested_string("lv", 1529997255, 2), - be_nested_string("get_height", -723211773, 10), - be_nested_string("get_width", -1001549996, 9), - be_const_int(3), - be_const_int(2), - be_nested_string("DESIGN_COVER_CHK", -1298406708, 16), - be_nested_string("ancestor_design", 421545719, 15), - be_nested_string("call", -1276017495, 4), - be_nested_string("DESIGN_DRAW_MAIN", -904475754, 16), - be_nested_string("get_coords", 1044089006, 10), - be_nested_string("x1", 274927234, 2), - be_nested_string("y1", -1939865569, 2), - be_nested_string("draw_line_dsc_init", -428273650, 18), - be_nested_string("line_dsc", -200476318, 8), - be_nested_string("init_draw_line_dsc", -1787031256, 18), - be_nested_string("OBJ_PART_MAIN", 658062838, 13), - be_nested_string("round_start", -1345482912, 11), - be_const_int(1), - be_nested_string("round_end", 985288225, 9), - be_nested_string("width", -1786286561, 5), - be_nested_string("get_style_line_color", 805371932, 20), - be_nested_string("STATE_DEFAULT", 712406428, 13), - be_nested_string("get_style_bg_color", 964794381, 18), - be_const_int(0), - be_nested_string("color", 1031692888, 5), - be_nested_string("percentage", -1756136011, 10), - be_nested_string("p1", -1605446022, 2), - be_nested_string("y", -66302220, 1), - be_nested_string("x", -49524601, 1), - be_nested_string("p2", -1622223641, 2), - be_nested_string("draw_line", 1634465686, 9), - be_nested_string("stop_iteration", -121173395, 14), - be_nested_string("DESIGN_RES_OK", -1265307123, 13), + ( &(const bvalue[33]) { /* constants */ + be_nested_string("get_height", -723211773, 10), /* R256 - K0 */ + be_nested_string("get_width", -1001549996, 9), /* R257 - K1 */ + be_const_int(3), /* R258 - K2 */ + be_const_int(2), /* R259 - K3 */ + be_nested_string("lv", 1529997255, 2), /* R260 - K4 */ + be_nested_string("DESIGN_COVER_CHK", -1298406708, 16), /* R261 - K5 */ + be_nested_string("ancestor_design", 421545719, 15), /* R262 - K6 */ + be_nested_string("call", -1276017495, 4), /* R263 - K7 */ + be_nested_string("DESIGN_DRAW_MAIN", -904475754, 16), /* R264 - K8 */ + be_nested_string("get_coords", 1044089006, 10), /* R265 - K9 */ + be_nested_string("x1", 274927234, 2), /* R266 - K10 */ + be_nested_string("y1", -1939865569, 2), /* R267 - K11 */ + be_nested_string("draw_line_dsc_init", -428273650, 18), /* R268 - K12 */ + be_nested_string("line_dsc", -200476318, 8), /* R269 - K13 */ + be_nested_string("init_draw_line_dsc", -1787031256, 18), /* R270 - K14 */ + be_nested_string("OBJ_PART_MAIN", 658062838, 13), /* R271 - K15 */ + be_nested_string("round_start", -1345482912, 11), /* R272 - K16 */ + be_const_int(1), /* R273 - K17 */ + be_nested_string("round_end", 985288225, 9), /* R274 - K18 */ + be_nested_string("width", -1786286561, 5), /* R275 - K19 */ + be_nested_string("get_style_line_color", 805371932, 20), /* R276 - K20 */ + be_nested_string("STATE_DEFAULT", 712406428, 13), /* R277 - K21 */ + be_nested_string("get_style_bg_color", 964794381, 18), /* R278 - K22 */ + be_const_int(0), /* R279 - K23 */ + be_nested_string("color", 1031692888, 5), /* R280 - K24 */ + be_nested_string("percentage", -1756136011, 10), /* R281 - K25 */ + be_nested_string("p1", -1605446022, 2), /* R282 - K26 */ + be_nested_string("y", -66302220, 1), /* R283 - K27 */ + be_nested_string("x", -49524601, 1), /* R284 - K28 */ + be_nested_string("p2", -1622223641, 2), /* R285 - K29 */ + be_nested_string("draw_line", 1634465686, 9), /* R286 - K30 */ + be_nested_string("stop_iteration", -121173395, 14), /* R287 - K31 */ + be_nested_string("DESIGN_RES_OK", -1265307123, 13), /* R288 - K32 */ }), (be_nested_const_str("my_design_cb", -1173588798, 12)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[111]) { /* code */ + ( &(const binstruction[119]) { /* code */ 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 R256 - 0x88140901, // 0002 GETMBR R5 R4 R257 - 0x8C180102, // 0003 GETMET R6 R0 R258 - 0x7C180200, // 0004 CALL R6 1 - 0x8C1C0103, // 0005 GETMET R7 R0 R259 - 0x7C1C0200, // 0006 CALL R7 1 - 0x5C200600, // 0007 MOVE R8 R3 - 0x5426000E, // 0008 LDINT R9 15 - 0x0C240E09, // 0009 DIV R9 R7 R9 - 0x7C200200, // 000A CALL R8 1 - 0x5C240600, // 000B MOVE R9 R3 - 0x08281104, // 000C MUL R10 R8 R260 - 0x04280E0A, // 000D SUB R10 R7 R10 - 0x542E0003, // 000E LDINT R11 4 - 0x0C28140B, // 000F DIV R10 R10 R11 - 0x7C240200, // 0010 CALL R9 1 - 0x0C281305, // 0011 DIV R10 R9 R261 - 0x882C0B06, // 0012 GETMBR R11 R5 R262 - 0x1C2C040B, // 0013 EQ R11 R2 R11 - 0x782E0007, // 0014 JMPF R11 #001D - 0x882C0107, // 0015 GETMBR R11 R0 R263 - 0x8C2C1708, // 0016 GETMET R11 R11 R264 - 0x5C340000, // 0017 MOVE R13 R0 - 0x5C380200, // 0018 MOVE R14 R1 - 0x5C3C0400, // 0019 MOVE R15 R2 - 0x7C2C0800, // 001A CALL R11 4 - 0x80041600, // 001B RET 1 R11 - 0x7002004F, // 001C JMP #006D - 0x882C0B09, // 001D GETMBR R11 R5 R265 - 0x1C2C040B, // 001E EQ R11 R2 R11 - 0x782E004C, // 001F JMPF R11 #006D - 0x8C2C010A, // 0020 GETMET R11 R0 R266 - 0x5C340200, // 0021 MOVE R13 R1 - 0x7C2C0400, // 0022 CALL R11 2 - 0x882C030B, // 0023 GETMBR R11 R1 R267 - 0x8830030C, // 0024 GETMBR R12 R1 R268 - 0x8C340B0D, // 0025 GETMET R13 R5 R269 - 0x883C010E, // 0026 GETMBR R15 R0 R270 - 0x7C340400, // 0027 CALL R13 2 - 0x8C34010F, // 0028 GETMET R13 R0 R271 - 0x883C0B10, // 0029 GETMBR R15 R5 R272 - 0x8840010E, // 002A GETMBR R16 R0 R270 - 0x7C340600, // 002B CALL R13 3 - 0x8834010E, // 002C GETMBR R13 R0 R270 - 0x90362312, // 002D SETMBR R13 R273 R274 - 0x8834010E, // 002E GETMBR R13 R0 R270 - 0x90362712, // 002F SETMBR R13 R275 R274 - 0x8834010E, // 0030 GETMBR R13 R0 R270 - 0x90362809, // 0031 SETMBR R13 R276 R9 - 0x8C340115, // 0032 GETMET R13 R0 R277 - 0x883C0B10, // 0033 GETMBR R15 R5 R272 - 0x88400B16, // 0034 GETMBR R16 R5 R278 - 0x7C340600, // 0035 CALL R13 3 - 0x8C380117, // 0036 GETMET R14 R0 R279 - 0x88400B10, // 0037 GETMBR R16 R5 R272 - 0x88440B16, // 0038 GETMBR R17 R5 R278 - 0x7C380600, // 0039 CALL R14 3 - 0x603C0000, // 003A GETGBL R15 G0 - 0x40423104, // 003B CONNECT R16 R280 R260 - 0x7C3C0200, // 003C CALL R15 1 - 0xA802002B, // 003D EXBLK 0 #006A - 0x5C401E00, // 003E MOVE R16 R15 - 0x7C400000, // 003F CALL R16 0 - 0x8844010E, // 0040 GETMBR R17 R0 R270 - 0x8848011A, // 0041 GETMBR R18 R0 R282 - 0x004C2112, // 0042 ADD R19 R16 R274 - 0x54520013, // 0043 LDINT R20 20 - 0x084C2614, // 0044 MUL R19 R19 R20 - 0x28482413, // 0045 GE R18 R18 R19 - 0x784A0001, // 0046 JMPF R18 #0049 - 0x5C481A00, // 0047 MOVE R18 R13 - 0x70020000, // 0048 JMP #004A - 0x5C481C00, // 0049 MOVE R18 R14 - 0x90463212, // 004A SETMBR R17 R281 R18 - 0x8844011B, // 004B GETMBR R17 R0 R283 - 0x00481806, // 004C ADD R18 R12 R6 - 0x04482512, // 004D SUB R18 R18 R274 - 0x0448240A, // 004E SUB R18 R18 R10 - 0x90463812, // 004F SETMBR R17 R284 R18 - 0x8844011B, // 0050 GETMBR R17 R0 R283 - 0x00481208, // 0051 ADD R18 R9 R8 - 0x08482012, // 0052 MUL R18 R16 R18 - 0x00481612, // 0053 ADD R18 R11 R18 - 0x0048240A, // 0054 ADD R18 R18 R10 - 0x90463A12, // 0055 SETMBR R17 R285 R18 - 0x8844011E, // 0056 GETMBR R17 R0 R286 - 0x044A0810, // 0057 SUB R18 R260 R16 - 0x044C0C09, // 0058 SUB R19 R6 R9 - 0x08482413, // 0059 MUL R18 R18 R19 - 0x544E0003, // 005A LDINT R19 4 - 0x0C482413, // 005B DIV R18 R18 R19 - 0x00481812, // 005C ADD R18 R12 R18 - 0x0048240A, // 005D ADD R18 R18 R10 - 0x90463812, // 005E SETMBR R17 R284 R18 - 0x8844011E, // 005F GETMBR R17 R0 R286 - 0x8848011B, // 0060 GETMBR R18 R0 R283 - 0x8848251D, // 0061 GETMBR R18 R18 R285 - 0x90463A12, // 0062 SETMBR R17 R285 R18 - 0x8C440B1F, // 0063 GETMET R17 R5 R287 - 0x884C011B, // 0064 GETMBR R19 R0 R283 - 0x8850011E, // 0065 GETMBR R20 R0 R286 - 0x5C540200, // 0066 MOVE R21 R1 - 0x8858010E, // 0067 GETMBR R22 R0 R270 - 0x7C440A00, // 0068 CALL R17 5 - 0x7001FFD3, // 0069 JMP #003E - 0x583C0020, // 006A LDCONST R15 K32 - 0xAC3C0200, // 006B CATCH R15 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x882C0B21, // 006D GETMBR R11 R5 R289 - 0x80041600, // 006E RET 1 R11 + 0x8C100100, // 0001 GETMET R4 R0 R256 + 0x7C100200, // 0002 CALL R4 1 + 0x8C140101, // 0003 GETMET R5 R0 R257 + 0x7C140200, // 0004 CALL R5 1 + 0x5C180600, // 0005 MOVE R6 R3 + 0x541E000E, // 0006 LDINT R7 15 + 0x0C1C0A07, // 0007 DIV R7 R5 R7 + 0x7C180200, // 0008 CALL R6 1 + 0x5C1C0600, // 0009 MOVE R7 R3 + 0x08200D02, // 000A MUL R8 R6 R258 + 0x04200A08, // 000B SUB R8 R5 R8 + 0x54260003, // 000C LDINT R9 4 + 0x0C201009, // 000D DIV R8 R8 R9 + 0x7C1C0200, // 000E CALL R7 1 + 0x0C200F03, // 000F DIV R8 R7 R259 + 0xB8260800, // 0010 GETNGBL R9 R260 + 0x88241305, // 0011 GETMBR R9 R9 R261 + 0x1C240409, // 0012 EQ R9 R2 R9 + 0x78260007, // 0013 JMPF R9 #001C + 0x88240106, // 0014 GETMBR R9 R0 R262 + 0x8C241307, // 0015 GETMET R9 R9 R263 + 0x5C2C0000, // 0016 MOVE R11 R0 + 0x5C300200, // 0017 MOVE R12 R1 + 0x5C340400, // 0018 MOVE R13 R2 + 0x7C240800, // 0019 CALL R9 4 + 0x80041200, // 001A RET 1 R9 + 0x70020057, // 001B JMP #0074 + 0xB8260800, // 001C GETNGBL R9 R260 + 0x88241308, // 001D GETMBR R9 R9 R264 + 0x1C240409, // 001E EQ R9 R2 R9 + 0x78260053, // 001F JMPF R9 #0074 + 0x8C240109, // 0020 GETMET R9 R0 R265 + 0x5C2C0200, // 0021 MOVE R11 R1 + 0x7C240400, // 0022 CALL R9 2 + 0x8824030A, // 0023 GETMBR R9 R1 R266 + 0x8828030B, // 0024 GETMBR R10 R1 R267 + 0xB82E0800, // 0025 GETNGBL R11 R260 + 0x8C2C170C, // 0026 GETMET R11 R11 R268 + 0x8834010D, // 0027 GETMBR R13 R0 R269 + 0x7C2C0400, // 0028 CALL R11 2 + 0x8C2C010E, // 0029 GETMET R11 R0 R270 + 0xB8360800, // 002A GETNGBL R13 R260 + 0x88341B0F, // 002B GETMBR R13 R13 R271 + 0x8838010D, // 002C GETMBR R14 R0 R269 + 0x7C2C0600, // 002D CALL R11 3 + 0x882C010D, // 002E GETMBR R11 R0 R269 + 0x902E2111, // 002F SETMBR R11 R272 R273 + 0x882C010D, // 0030 GETMBR R11 R0 R269 + 0x902E2511, // 0031 SETMBR R11 R274 R273 + 0x882C010D, // 0032 GETMBR R11 R0 R269 + 0x902E2607, // 0033 SETMBR R11 R275 R7 + 0x8C2C0114, // 0034 GETMET R11 R0 R276 + 0xB8360800, // 0035 GETNGBL R13 R260 + 0x88341B0F, // 0036 GETMBR R13 R13 R271 + 0xB83A0800, // 0037 GETNGBL R14 R260 + 0x88381D15, // 0038 GETMBR R14 R14 R277 + 0x7C2C0600, // 0039 CALL R11 3 + 0x8C300116, // 003A GETMET R12 R0 R278 + 0xB83A0800, // 003B GETNGBL R14 R260 + 0x88381D0F, // 003C GETMBR R14 R14 R271 + 0xB83E0800, // 003D GETNGBL R15 R260 + 0x883C1F15, // 003E GETMBR R15 R15 R277 + 0x7C300600, // 003F CALL R12 3 + 0x60340000, // 0040 GETGBL R13 G0 + 0x403A2F02, // 0041 CONNECT R14 R279 R258 + 0x7C340200, // 0042 CALL R13 1 + 0xA802002C, // 0043 EXBLK 0 #0071 + 0x5C381A00, // 0044 MOVE R14 R13 + 0x7C380000, // 0045 CALL R14 0 + 0x883C010D, // 0046 GETMBR R15 R0 R269 + 0x88400119, // 0047 GETMBR R16 R0 R281 + 0x00441D11, // 0048 ADD R17 R14 R273 + 0x544A0013, // 0049 LDINT R18 20 + 0x08442212, // 004A MUL R17 R17 R18 + 0x28402011, // 004B GE R16 R16 R17 + 0x78420001, // 004C JMPF R16 #004F + 0x5C401600, // 004D MOVE R16 R11 + 0x70020000, // 004E JMP #0050 + 0x5C401800, // 004F MOVE R16 R12 + 0x903E3010, // 0050 SETMBR R15 R280 R16 + 0x883C011A, // 0051 GETMBR R15 R0 R282 + 0x00401404, // 0052 ADD R16 R10 R4 + 0x04402111, // 0053 SUB R16 R16 R273 + 0x04402008, // 0054 SUB R16 R16 R8 + 0x903E3610, // 0055 SETMBR R15 R283 R16 + 0x883C011A, // 0056 GETMBR R15 R0 R282 + 0x00400E06, // 0057 ADD R16 R7 R6 + 0x08401C10, // 0058 MUL R16 R14 R16 + 0x00401210, // 0059 ADD R16 R9 R16 + 0x00402008, // 005A ADD R16 R16 R8 + 0x903E3810, // 005B SETMBR R15 R284 R16 + 0x883C011D, // 005C GETMBR R15 R0 R285 + 0x0442040E, // 005D SUB R16 R258 R14 + 0x04440807, // 005E SUB R17 R4 R7 + 0x08402011, // 005F MUL R16 R16 R17 + 0x54460003, // 0060 LDINT R17 4 + 0x0C402011, // 0061 DIV R16 R16 R17 + 0x00401410, // 0062 ADD R16 R10 R16 + 0x00402008, // 0063 ADD R16 R16 R8 + 0x903E3610, // 0064 SETMBR R15 R283 R16 + 0x883C011D, // 0065 GETMBR R15 R0 R285 + 0x8840011A, // 0066 GETMBR R16 R0 R282 + 0x8840211C, // 0067 GETMBR R16 R16 R284 + 0x903E3810, // 0068 SETMBR R15 R284 R16 + 0xB83E0800, // 0069 GETNGBL R15 R260 + 0x8C3C1F1E, // 006A GETMET R15 R15 R286 + 0x8844011A, // 006B GETMBR R17 R0 R282 + 0x8848011D, // 006C GETMBR R18 R0 R285 + 0x5C4C0200, // 006D MOVE R19 R1 + 0x8850010D, // 006E GETMBR R20 R0 R269 + 0x7C3C0A00, // 006F CALL R15 5 + 0x7001FFD2, // 0070 JMP #0044 + 0x5834001F, // 0071 LDCONST R13 K31 + 0xAC340200, // 0072 CATCH R13 1 0 + 0xB0080000, // 0073 RAISE 2 R0 R0 + 0xB8260800, // 0074 GETNGBL R9 R260 + 0x88241320, // 0075 GETMBR R9 R9 R288 + 0x80041200, // 0076 RET 1 R9 }) ) ); @@ -211,7 +218,7 @@ be_local_closure(get_percentage, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - be_nested_string("percentage", -1756136011, 10), + be_nested_string("percentage", -1756136011, 10), /* R256 - K0 */ }), (be_nested_const_str("get_percentage", -1414483304, 14)), (be_nested_const_str("input", -103256197, 5)), @@ -229,65 +236,61 @@ be_local_closure(get_percentage, /* name */ ********************************************************************/ be_local_closure(init, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 3, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - be_nested_string("global", 503252654, 6), - be_nested_string("lv", 1529997255, 2), - be_nested_string("lv_obj", -37134147, 6), - be_nested_string("init", 380752755, 4), - be_nested_string("ancestor_design", 421545719, 15), - be_nested_string("get_design_cb", -825649242, 13), - be_nested_string("set_design_cb", 1469311634, 13), - be_nested_string("my_design_cb", -1173588798, 12), - be_nested_string("percentage", -1756136011, 10), - be_nested_string("p1", -1605446022, 2), - be_nested_string("lv_point", -174745506, 8), - be_nested_string("p2", -1622223641, 2), - be_nested_string("line_dsc", -200476318, 8), - be_nested_string("lv_draw_line_dsc", -1872162060, 16), - be_nested_string("area", -1693507260, 4), - be_nested_string("lv_area", -1773816895, 7), + ( &(const bvalue[14]) { /* constants */ + be_nested_string("lv_obj", -37134147, 6), /* R256 - K0 */ + be_nested_string("init", 380752755, 4), /* R257 - K1 */ + be_nested_string("ancestor_design", 421545719, 15), /* R258 - K2 */ + be_nested_string("get_design_cb", -825649242, 13), /* R259 - K3 */ + be_nested_string("set_design_cb", 1469311634, 13), /* R260 - K4 */ + be_nested_string("my_design_cb", -1173588798, 12), /* R261 - K5 */ + be_nested_string("percentage", -1756136011, 10), /* R262 - K6 */ + be_nested_string("p1", -1605446022, 2), /* R263 - K7 */ + be_nested_string("lv_point", -174745506, 8), /* R264 - K8 */ + be_nested_string("p2", -1622223641, 2), /* R265 - K9 */ + be_nested_string("line_dsc", -200476318, 8), /* R266 - K10 */ + be_nested_string("lv_draw_line_dsc", -1872162060, 16), /* R267 - K11 */ + be_nested_string("area", -1693507260, 4), /* R268 - K12 */ + be_nested_string("lv_area", -1773816895, 7), /* R269 - K13 */ }), (be_nested_const_str("init", 380752755, 4)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[31]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 R256 - 0x88100701, // 0001 GETMBR R4 R3 R257 - 0x60140014, // 0002 GETGBL R5 G20 - 0x5C180000, // 0003 MOVE R6 R0 - 0x881C0702, // 0004 GETMBR R7 R3 R258 - 0x7C140400, // 0005 CALL R5 2 - 0x8C140B03, // 0006 GETMET R5 R5 R259 - 0x5C1C0200, // 0007 MOVE R7 R1 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x8C140105, // 000A GETMET R5 R0 R261 - 0x7C140200, // 000B CALL R5 1 - 0x90020805, // 000C SETMBR R0 R260 R5 - 0x8C140106, // 000D GETMET R5 R0 R262 - 0x881C0107, // 000E GETMBR R7 R0 R263 - 0x7C140400, // 000F CALL R5 2 - 0x54160063, // 0010 LDINT R5 100 - 0x90021005, // 0011 SETMBR R0 R264 R5 - 0x8C14070A, // 0012 GETMET R5 R3 R266 - 0x7C140200, // 0013 CALL R5 1 - 0x90021205, // 0014 SETMBR R0 R265 R5 - 0x8C14070A, // 0015 GETMET R5 R3 R266 - 0x7C140200, // 0016 CALL R5 1 - 0x90021605, // 0017 SETMBR R0 R267 R5 - 0x8C14070D, // 0018 GETMET R5 R3 R269 - 0x7C140200, // 0019 CALL R5 1 - 0x90021805, // 001A SETMBR R0 R268 R5 - 0x8C14070F, // 001B GETMET R5 R3 R271 - 0x7C140200, // 001C CALL R5 1 - 0x90021C05, // 001D SETMBR R0 R270 R5 - 0x80000000, // 001E RET 0 R0 + ( &(const binstruction[29]) { /* code */ + 0x600C0014, // 0000 GETGBL R3 G20 + 0x5C100000, // 0001 MOVE R4 R0 + 0xB8160000, // 0002 GETNGBL R5 R256 + 0x7C0C0400, // 0003 CALL R3 2 + 0x8C0C0701, // 0004 GETMET R3 R3 R257 + 0x5C140200, // 0005 MOVE R5 R1 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C0C0600, // 0007 CALL R3 3 + 0x8C0C0103, // 0008 GETMET R3 R0 R259 + 0x7C0C0200, // 0009 CALL R3 1 + 0x90020403, // 000A SETMBR R0 R258 R3 + 0x8C0C0104, // 000B GETMET R3 R0 R260 + 0x88140105, // 000C GETMBR R5 R0 R261 + 0x7C0C0400, // 000D CALL R3 2 + 0x540E0063, // 000E LDINT R3 100 + 0x90020C03, // 000F SETMBR R0 R262 R3 + 0xB80E1000, // 0010 GETNGBL R3 R264 + 0x7C0C0000, // 0011 CALL R3 0 + 0x90020E03, // 0012 SETMBR R0 R263 R3 + 0xB80E1000, // 0013 GETNGBL R3 R264 + 0x7C0C0000, // 0014 CALL R3 0 + 0x90021203, // 0015 SETMBR R0 R265 R3 + 0xB80E1600, // 0016 GETNGBL R3 R267 + 0x7C0C0000, // 0017 CALL R3 0 + 0x90021403, // 0018 SETMBR R0 R266 R3 + 0xB80E1A00, // 0019 GETNGBL R3 R269 + 0x7C0C0000, // 001A CALL R3 0 + 0x90021803, // 001B SETMBR R0 R268 R3 + 0x80000000, // 001C RET 0 R0 }) ) ); @@ -307,9 +310,9 @@ be_local_closure(set_percentage, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 3]) { /* constants */ - be_nested_string("percentage", -1756136011, 10), - be_const_int(0), - be_nested_string("invalidate", -1645232368, 10), + be_nested_string("percentage", -1756136011, 10), /* R256 - K0 */ + be_const_int(0), /* R257 - K1 */ + be_nested_string("invalidate", -1645232368, 10), /* R258 - K2 */ }), (be_nested_const_str("set_percentage", -1342944572, 14)), (be_nested_const_str("input", -103256197, 5)), diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c index 23b6c140f..6e0a401af 100644 --- a/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c +++ b/lib/libesp32/Berry/default/be_lvgl_signal_wifi_lib.c @@ -12,37 +12,35 @@ ********************************************************************/ be_local_closure(init, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 3, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - be_nested_string("global", 503252654, 6), /* R256 - K0 */ - be_nested_string("lv_signal_bars", -780994737, 14), /* R257 - K1 */ - be_nested_string("init", 380752755, 4), /* R258 - K2 */ - be_nested_string("tasmota", 424643812, 7), /* R259 - K3 */ - be_nested_string("add_driver", 1654458371, 10), /* R260 - K4 */ + ( &(const bvalue[ 4]) { /* constants */ + be_nested_string("lv_signal_bars", -780994737, 14), /* R256 - K0 */ + be_nested_string("init", 380752755, 4), /* R257 - K1 */ + be_nested_string("tasmota", 424643812, 7), /* R258 - K2 */ + be_nested_string("add_driver", 1654458371, 10), /* R259 - K3 */ }), (be_nested_const_str("init", 380752755, 4)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[14]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 R256 - 0x60100014, // 0001 GETGBL R4 G20 - 0x5C140000, // 0002 MOVE R5 R0 - 0x88180701, // 0003 GETMBR R6 R3 R257 - 0x7C100400, // 0004 CALL R4 2 - 0x8C100902, // 0005 GETMET R4 R4 R258 - 0x5C180200, // 0006 MOVE R6 R1 - 0x5C1C0400, // 0007 MOVE R7 R2 - 0x7C100600, // 0008 CALL R4 3 - 0x88100703, // 0009 GETMBR R4 R3 R259 - 0x8C100904, // 000A GETMET R4 R4 R260 - 0x5C180000, // 000B MOVE R6 R0 - 0x7C100400, // 000C CALL R4 2 - 0x80000000, // 000D RET 0 R0 + ( &(const binstruction[13]) { /* code */ + 0x600C0014, // 0000 GETGBL R3 G20 + 0x5C100000, // 0001 MOVE R4 R0 + 0xB8160000, // 0002 GETNGBL R5 R256 + 0x7C0C0400, // 0003 CALL R3 2 + 0x8C0C0701, // 0004 GETMET R3 R3 R257 + 0x5C140200, // 0005 MOVE R5 R1 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C0C0600, // 0007 CALL R3 3 + 0xB80E0400, // 0008 GETNGBL R3 R258 + 0x8C0C0703, // 0009 GETMET R3 R3 R259 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000000, // 000C RET 0 R0 }) ) ); @@ -54,38 +52,36 @@ be_local_closure(init, /* name */ ********************************************************************/ be_local_closure(every_second, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - be_nested_string("global", 503252654, 6), /* R256 - K0 */ - be_nested_string("tasmota", 424643812, 7), /* R257 - K1 */ - be_nested_string("wifi", 120087624, 4), /* R258 - K2 */ - be_nested_string("find", -1108310694, 4), /* R259 - K3 */ - be_nested_string("quality", -1697296346, 7), /* R260 - K4 */ - be_nested_string("set_percentage", -1342944572, 14), /* R261 - K5 */ + ( &(const bvalue[ 5]) { /* constants */ + be_nested_string("tasmota", 424643812, 7), /* R256 - K0 */ + be_nested_string("wifi", 120087624, 4), /* R257 - K1 */ + be_nested_string("find", -1108310694, 4), /* R258 - K2 */ + be_nested_string("quality", -1697296346, 7), /* R259 - K3 */ + be_nested_string("set_percentage", -1342944572, 14), /* R260 - K4 */ }), (be_nested_const_str("every_second", 2075451465, 12)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[14]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 R256 - 0x88080301, // 0001 GETMBR R2 R1 R257 - 0x8C080502, // 0002 GETMET R2 R2 R258 - 0x7C080200, // 0003 CALL R2 1 - 0x8C0C0503, // 0004 GETMET R3 R2 R259 - 0x58140004, // 0005 LDCONST R5 K4 - 0x7C0C0400, // 0006 CALL R3 2 - 0x4C100000, // 0007 LDNIL 4 - 0x20100604, // 0008 NE R4 R3 R4 - 0x78120002, // 0009 JMPF R4 #000D - 0x8C100105, // 000A GETMET R4 R0 R261 - 0x5C180600, // 000B MOVE R6 R3 - 0x7C100400, // 000C CALL R4 2 - 0x80000000, // 000D RET 0 R0 + ( &(const binstruction[13]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 R256 + 0x8C040301, // 0001 GETMET R1 R1 R257 + 0x7C040200, // 0002 CALL R1 1 + 0x8C080302, // 0003 GETMET R2 R1 R258 + 0x58100003, // 0004 LDCONST R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x4C0C0000, // 0006 LDNIL 3 + 0x200C0403, // 0007 NE R3 R2 R3 + 0x780E0002, // 0008 JMPF R3 #000C + 0x8C0C0104, // 0009 GETMET R3 R0 R260 + 0x5C140400, // 000A MOVE R5 R2 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000000, // 000C RET 0 R0 }) ) ); diff --git a/lib/libesp32/Berry/default/embedded/lv_signal_bars.be b/lib/libesp32/Berry/default/embedded/lv_signal_bars.be index 97b71d466..59985cf7d 100644 --- a/lib/libesp32/Berry/default/embedded/lv_signal_bars.be +++ b/lib/libesp32/Berry/default/embedded/lv_signal_bars.be @@ -8,26 +8,22 @@ class lv_signal_bars : lv_obj var p1, p2, line_dsc, area def init(parent, copy) - import global - var lv = global.lv # init parent object - super(self, global.lv_obj).init(parent, copy) + super(self, lv_obj).init(parent, copy) # keep a copy of self.ancestor_design = self.get_design_cb() self.set_design_cb(self.my_design_cb) # own values self.percentage = 100 # pre-allocate buffers - self.p1 = global.lv_point() - self.p2 = global.lv_point() - self.line_dsc = global.lv_draw_line_dsc() - self.area = global.lv_area() + self.p1 = lv_point() + self.p2 = lv_point() + self.line_dsc = lv_draw_line_dsc() + self.area = lv_area() end def my_design_cb(area, mode) def atleast1(x) if x >= 1 return x else return 1 end end - import global - var lv = global.lv # the model is that we have 4 bars and inter-bar (1/4 of width) var height = self.get_height() var width = self.get_width() @@ -88,14 +84,12 @@ end class lv_wifi_bars: lv_signal_bars def init(parent, copy) - import global - super(self, global.lv_signal_bars).init(parent, copy) - global.tasmota.add_driver(self) + super(self, lv_signal_bars).init(parent, copy) + tasmota.add_driver(self) end def every_second() - import global - var wifi = global.tasmota.wifi() + var wifi = tasmota.wifi() var quality = wifi.find("quality") if quality != nil self.set_percentage(quality) diff --git a/lib/libesp32/Berry/src/be_code.c b/lib/libesp32/Berry/src/be_code.c index 8d4a62b05..e4f238d5c 100644 --- a/lib/libesp32/Berry/src/be_code.c +++ b/lib/libesp32/Berry/src/be_code.c @@ -14,7 +14,6 @@ #include "be_var.h" #include "be_exec.h" #include "be_vm.h" -#include #define NOT_MASK (1 << 0) #define NOT_EXPR (1 << 1) @@ -376,6 +375,9 @@ static int var2reg(bfuncinfo *finfo, bexpdesc *e, int dst) case ETGLOBAL: codeABx(finfo, OP_GETGBL, dst, e->v.idx); break; + case ETNGLOBAL: + codeABC(finfo, OP_GETNGBL, dst, e->v.ss.idx, 0); + break; case ETUPVAL: codeABx(finfo, OP_GETUPV, dst, e->v.idx); break; @@ -552,6 +554,15 @@ int be_code_unop(bfuncinfo *finfo, int op, bexpdesc *e) return 0; } +static void setbgblvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) +{ + if (isK(src)) { /* move const to register */ + code_move(finfo, finfo->freereg, src); + src = finfo->freereg; + } + codeABC(finfo, op, src, e1->v.idx, 0); +} + static void setsupvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) { if (isK(src)) { /* move const to register */ @@ -589,6 +600,9 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) case ETGLOBAL: /* store to grobal R(A) -> G(Bx) */ setsupvar(finfo, OP_SETGBL, e1, src); break; + case ETNGLOBAL: /* store to grobal R(A) -> G(Bx) */ + setbgblvar(finfo, OP_SETNGBL, e1, src); + break; case ETUPVAL: setsupvar(finfo, OP_SETUPV, e1, src); break; @@ -711,6 +725,11 @@ static void package_suffix(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k) c->v.ss.idx = key; } +int be_code_nglobal(bfuncinfo *finfo, bexpdesc *k) +{ + return exp2anyreg(finfo, k); +} + void be_code_member(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k) { package_suffix(finfo, c, k); diff --git a/lib/libesp32/Berry/src/be_code.h b/lib/libesp32/Berry/src/be_code.h index 8dfc21501..f7fdb2d55 100644 --- a/lib/libesp32/Berry/src/be_code.h +++ b/lib/libesp32/Berry/src/be_code.h @@ -31,6 +31,7 @@ void be_code_closure(bfuncinfo *finfo, bexpdesc *e, int idx); void be_code_close(bfuncinfo *finfo, int isret); void be_code_class(bfuncinfo *finfo, bexpdesc *dst, bclass *c); void be_code_ret(bfuncinfo *finfo, bexpdesc *e); +int be_code_nglobal(bfuncinfo *finfo, bexpdesc *k); void be_code_member(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2); void be_code_index(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k); void be_code_setsuper(bfuncinfo *finfo, bexpdesc *c, bexpdesc *s); diff --git a/lib/libesp32/Berry/src/be_debug.c b/lib/libesp32/Berry/src/be_debug.c index f46446199..469e30b63 100644 --- a/lib/libesp32/Berry/src/be_debug.c +++ b/lib/libesp32/Berry/src/be_debug.c @@ -62,6 +62,9 @@ void be_print_inst(binstruction ins, int pc) case OP_OR: case OP_XOR: case OP_SHL: case OP_SHR: logbuf("%s\tR%d\tR%d\tR%d", opc2str(op), IGET_RA(ins), IGET_RKB(ins), IGET_RKC(ins)); break; + case OP_GETNGBL: case OP_SETNGBL: + logbuf("%s\tR%d\tR%d", opc2str(op), IGET_RA(ins), IGET_RKB(ins)); + break; case OP_GETGBL: case OP_SETGBL: logbuf("%s\tR%d\tG%d", opc2str(op), IGET_RA(ins), IGET_Bx(ins)); break; diff --git a/lib/libesp32/Berry/src/be_opcodes.h b/lib/libesp32/Berry/src/be_opcodes.h index 562bd4b31..f72049dbe 100644 --- a/lib/libesp32/Berry/src/be_opcodes.h +++ b/lib/libesp32/Berry/src/be_opcodes.h @@ -52,4 +52,6 @@ OPCODE(IMPORT), /* A, B, C | IF (A == C) import module name as RK(B) to OPCODE(EXBLK), /* A, Bx | ... */ OPCODE(CATCH), /* A, B, C | ... */ OPCODE(RAISE), /* A, B, C | ... */ -OPCODE(CLASS) /* Bx | init class in K[Bx] */ +OPCODE(CLASS), /* Bx | init class in K[Bx] */ +OPCODE(GETNGBL), /* A, B | R(A) <- GLOBAL[B] by name */ +OPCODE(SETNGBL) /* A, B | R(A) -> GLOBAL[B] by name */ diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 8f1b0f3e4..c19f83e9a 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -446,10 +446,17 @@ static int singlevaraux(bvm *vm, bfuncinfo *finfo, bstring *s, bexpdesc *var) int res = singlevaraux(vm, finfo->prev, s, var); if (res == ETUPVAL || res == ETLOCAL) { idx = new_upval(vm, finfo, s, var); /* new upvalue */ - } else if (be_global_find(vm, s) >= 0) { - return ETGLOBAL; /* global variable */ } else { - return ETVOID; /* unknow (new variable or error) */ + idx = be_global_find(vm, s); + if (idx >= 0) { + if (idx < be_builtin_count(vm)) { + return ETGLOBAL; /* global variable */ + } else { + return comp_is_named_gbl(vm) ? ETNGLOBAL : ETGLOBAL; /* global variable */ + } + } else { + return ETVOID; /* unknow (new variable or error) */ + } } } init_exp(var, ETUPVAL, idx); @@ -460,6 +467,7 @@ static int singlevaraux(bvm *vm, bfuncinfo *finfo, bstring *s, bexpdesc *var) static void singlevar(bparser *parser, bexpdesc *var) { + bexpdesc key; bstring *varname = next_token(parser).u.s; int type = singlevaraux(parser->vm, parser->finfo, varname, var); switch (type) { @@ -471,6 +479,12 @@ static void singlevar(bparser *parser, bexpdesc *var) init_exp(var, ETGLOBAL, 0); var->v.idx = be_global_find(parser->vm, varname); break; + case ETNGLOBAL: + init_exp(&key, ETSTRING, 0); + key.v.s = varname; + init_exp(var, ETNGLOBAL, 0); + var->v.idx = be_code_nglobal(parser->finfo, &key); + break; default: break; } diff --git a/lib/libesp32/Berry/src/be_parser.h b/lib/libesp32/Berry/src/be_parser.h index 47c9f6f48..7d06fdc23 100644 --- a/lib/libesp32/Berry/src/be_parser.h +++ b/lib/libesp32/Berry/src/be_parser.h @@ -25,7 +25,8 @@ typedef enum { ETUPVAL, ETMEMBER, ETINDEX, - ETREG + ETREG, + ETNGLOBAL } exptype_t; typedef struct { diff --git a/lib/libesp32/Berry/src/be_vm.c b/lib/libesp32/Berry/src/be_vm.c index 92604b6d4..ec30e8ce4 100644 --- a/lib/libesp32/Berry/src/be_vm.c +++ b/lib/libesp32/Berry/src/be_vm.c @@ -435,6 +435,7 @@ BERRY_API bvm* be_vm_new(void) be_globalvar_init(vm); be_gc_setpause(vm, 1); be_loadlibs(vm); + vm->compopt = 0; #if BE_USE_OBSERVABILITY_HOOK vm->obshook = NULL; #endif @@ -500,6 +501,38 @@ newframe: /* a new call frame */ *v = *be_global_var(vm, idx); dispatch(); } + opcase(GETNGBL): { /* get Global by name */ + bvalue *v = RA(); + bvalue *b = RKB(); + if (var_isstr(b)) { + bstring *name = var_tostr(b); + int idx = be_global_find(vm, name); + if (idx > -1) { + *v = *be_global_var(vm, idx); + } else { + vm_error(vm, "attribute_error", "'%s' undeclared", str(name)); + } + } else { + vm_error(vm, "internal_error", "global name must be a string"); + } + dispatch(); + } + opcase(SETNGBL): { /* set Global by name */ + bvalue *v = RA(); + bvalue *b = RKB(); + if (var_isstr(b)) { + bstring *name = var_tostr(b); + int idx = be_global_find(vm, name); + if (idx > -1) { + *be_global_var(vm, idx) = *v; + } else { + vm_error(vm, "attribute_error", "'%s' undeclared", str(name)); + } + } else { + vm_error(vm, "internal_error", "global name must be a string"); + } + dispatch(); + } opcase(SETGBL): { bvalue *v = RA(); int idx = IGET_Bx(ins); diff --git a/lib/libesp32/Berry/src/be_vm.h b/lib/libesp32/Berry/src/be_vm.h index e2df0b475..86926d421 100644 --- a/lib/libesp32/Berry/src/be_vm.h +++ b/lib/libesp32/Berry/src/be_vm.h @@ -10,6 +10,15 @@ #include "be_object.h" +#define comp_is_named_gbl(vm) ((vm)->compopt & (1<compopt |= (1<compopt &= ~(1<= 1 return x else return 1 end end - - def my_design_cb(area, mode) - import global - var lv = global.lv - #def atleast1(x) if x >= 1 return x else return 1 end end - # the model is that we have 4 bars and inter-bar (1/4 of width) - var height = self.get_height() - var width = self.get_width() - - var inter_bar = self.atleast1(width / 15) - var bar = self.atleast1((width - inter_bar * 3) / 4) - var bar_offset = bar / 2 - - if mode == lv.DESIGN_COVER_CHK - #- Return false if the object is not covers the clip_area area -# - return self.ancestor_design.call(self, area, mode) - - elif mode == lv.DESIGN_DRAW_MAIN - #self.ancestor_design.call(self, area, mode) - don't draw a background - - # get coordinates of area - self.get_coords(area) - var x_ofs = area.x1 - var y_ofs = area.y1 - - lv.draw_line_dsc_init(self.line_dsc) - self.init_draw_line_dsc(lv.OBJ_PART_MAIN, self.line_dsc) - - self.line_dsc.round_start = 1 - self.line_dsc.round_end = 1 - self.line_dsc.width = bar - var on_color = self.get_style_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) - var off_color = self.get_style_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT) - - for i:0..3 - self.line_dsc.color = self.percentage >= (i+1)*20 ? on_color : off_color - self.p1.y = y_ofs + height - 1 - bar_offset - self.p1.x = x_ofs + i * (bar + inter_bar) + bar_offset - self.p2.y = y_ofs + ((3 - i) * (height - bar)) / 4 + bar_offset - self.p2.x = self.p1.x - lv.draw_line(self.p1, self.p2, area, self.line_dsc) - end - #elif mode == lv.DESIGN_DRAW_POST # we don't want a frame around this object - #self.ancestor_design.call(self, area, mode) - end - return lv.DESIGN_RES_OK - end - - def set_percentage(v) - var old_bars = self.percentage / 5 - if v > 100 v = 100 end - if v < 0 v = 0 end - self.percentage = v - if old_bars != v / 5 - self.invalidate() # be frugal and avoid updating the widget if it's not needed - end - end - - def get_percentage() - return self.percentage - end -end - -bars = lv_signal_bars(lv.scr_act()) -bars.set_height(16) -bars.set_width(16) -bars.set_percentage(45) -bars.set_style_local_line_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0xFF8000)) \ No newline at end of file diff --git a/tasmota/xdrv_52_9_berry.ino b/tasmota/xdrv_52_9_berry.ino index 9abe75b65..3f3210fe8 100644 --- a/tasmota/xdrv_52_9_berry.ino +++ b/tasmota/xdrv_52_9_berry.ino @@ -23,6 +23,7 @@ #define XDRV_52 52 #include +#include "be_vm.h" extern "C" { extern void be_load_custom_libs(bvm *vm); @@ -267,6 +268,7 @@ void BerryInit(void) { do { berry.vm = be_vm_new(); /* create a virtual machine instance */ be_set_obs_hook(berry.vm, &BerryObservability); + comp_set_named_gbl(berry.vm); be_load_custom_libs(berry.vm); // Register functions From 9813e0f483a33e8786a7e642d2e6f90a3a05a603 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 28 Jul 2021 12:17:32 +0200 Subject: [PATCH 047/148] Add Tasmota discovery --- tasmota/tasmota_configurations.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index c77b2c03e..6530cdbc3 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -269,6 +269,7 @@ #undef USE_EMULATION_WEMO // Disable Belkin WeMo emulation for Alexa (+6k code, +2k mem common) #undef USE_DOMOTICZ // Disable Domoticz #undef USE_HOME_ASSISTANT // Disable Home Assistant +#define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) // -- Optional modules ---------------------------- #undef ROTARY_V1 // Disable support for MI Desk Lamp @@ -486,6 +487,7 @@ #undef USE_ARDUINO_OTA // Disable support for Arduino OTA #define USE_DOMOTICZ // Enable Domoticz #undef USE_HOME_ASSISTANT // Disable Home Assistant +#define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) #define UPGRADE_V8_MIN // do not support upgrading from version below 8.0.0 @@ -639,6 +641,7 @@ #undef USE_ARDUINO_OTA // Disable support for Arduino OTA #undef USE_DOMOTICZ // Disable Domoticz #undef USE_HOME_ASSISTANT // Disable Home Assistant +#define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) #undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set #undef USE_KNX // Disable KNX IP Protocol Support //#undef USE_WEBSERVER // Disable Webserver From 215ec4388fe335e40ef2c020df56633f7182bd19 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 28 Jul 2021 17:35:08 +0200 Subject: [PATCH 048/148] Force a rebuild --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 353c41148..c63f1363a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. - Disable PSRAM on unsupported hardware - Replace spaces by hyphens in final hostname (#12710) - Message ``Upload buffer miscompare`` into ``Not enough space`` +- ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support ### Fixed - Discovery fails when using ``%hostname%`` in a topic (#12710) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4bbffb3b6..4942198f2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -123,6 +123,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - ESP32 internal sensor driver id moved from 87 to 127 - Extended supported sensor driver range to 128 - Disable PSRAM on unsupported hardware +- ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) - Allow buttons to work in AP normal mode [#12518](https://github.com/arendst/Tasmota/issues/12518) From ccb87026056b963c00d7575707e76f705a3d62a5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 28 Jul 2021 18:37:21 +0200 Subject: [PATCH 049/148] Fix ESP32 PWM buzzer (#12717) --- tasmota/xdrv_24_buzzer.ino | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tasmota/xdrv_24_buzzer.ino b/tasmota/xdrv_24_buzzer.ino index 3921589f3..377c2fee6 100644 --- a/tasmota/xdrv_24_buzzer.ino +++ b/tasmota/xdrv_24_buzzer.ino @@ -50,6 +50,9 @@ void BuzzerSet(uint32_t state) { if (Settings->flag4.buzzer_freq_mode) { // SetOption111 - Enable frequency output mode for buzzer static uint8_t last_state = 0; if (last_state != state) { +#ifdef ESP32 + analogAttach(Pin(GPIO_BUZZER), 7); +#endif // ESP32 // Set 50% duty cycle for frequency output // Set 0% (or 100% for inverted PWM) duty cycle which turns off frequency output either way analogWrite(Pin(GPIO_BUZZER), (state) ? Settings->pwm_range / 2 : 0); // set duty cycle for frequency output From bce1aeda744d52ab730bc646437bac5942ad8587 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 29 Jul 2021 08:37:52 +0200 Subject: [PATCH 050/148] Berry add support for mqtt_data in Driver --- lib/libesp32/Berry/default/be_driverlib.c | 159 +- lib/libesp32/Berry/default/be_i2c_driverlib.c | 4 +- lib/libesp32/Berry/default/be_i2s_audio_lib.c | 3 - lib/libesp32/Berry/default/be_modtab.c | 4 +- lib/libesp32/Berry/default/be_tasmotalib.c | 143 +- lib/libesp32/Berry/default/embedded/Driver.be | 25 + .../Berry/default/embedded/Tasmota.be | 8 +- lib/libesp32/Berry/generate/be_const_strtab.h | 1266 ++++++----- .../Berry/generate/be_const_strtab_def.h | 1906 ++++++++--------- .../generate/be_fixed_be_class_lv_draw_line.h | 20 - .../be_fixed_be_class_tasmota_driver.h | 32 - .../be_fixed_be_class_tasmota_i2c_driver.h | 2 +- 12 files changed, 1713 insertions(+), 1859 deletions(-) create mode 100644 lib/libesp32/Berry/default/embedded/Driver.be delete mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_lv_draw_line.h delete mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h diff --git a/lib/libesp32/Berry/default/be_driverlib.c b/lib/libesp32/Berry/default/be_driverlib.c index 1958c8f4d..a81a11acc 100644 --- a/lib/libesp32/Berry/default/be_driverlib.c +++ b/lib/libesp32/Berry/default/be_driverlib.c @@ -6,67 +6,12 @@ *******************************************************************/ #include "be_constobj.h" -/******************************************************************** - class Driver2 : Driver - var every_second - var every_100ms - var web_add_handler - var web_add_button - var web_add_main_button - var web_add_management_button - var web_add_config_button - var web_add_console_button - var save_before_restart - var web_sensor - var json_append - var button_pressed - var display - - def get_tasmota() - import global - return global.tasmota - end - - def add_cmd(c, f) - var tasmota = self.get_tasmota() - tasmota.add_cmd(c, / cmd, idx, payload, payload_json -> f(self, cmd, idx, payload, payload_json)) - end - end -********************************************************************/ - -/******************************************************************** -** Solidified function: get_tasmota -********************************************************************/ -be_local_closure(get_tasmota, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - be_nested_string("global", 503252654, 6), - be_nested_string("tasmota", 424643812, 7), - }), - (be_nested_const_str("get_tasmota", 334356779, 11)), - (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[ 3]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 R256 - 0x88080301, // 0001 GETMBR R2 R1 R257 - 0x80040400, // 0002 RET 1 R2 - }) - ) -); -/*******************************************************************/ - /******************************************************************** ** Solidified function: add_cmd ********************************************************************/ be_local_closure(add_cmd, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 3, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ @@ -100,80 +45,54 @@ be_local_closure(add_cmd, /* name */ }), 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - be_nested_string("get_tasmota", 334356779, 11), - be_nested_string("add_cmd", -933336417, 7), + be_nested_string("tasmota", 424643812, 7), /* R256 - K0 */ + be_nested_string("add_cmd", -933336417, 7), /* R257 - K1 */ }), (be_nested_const_str("add_cmd", -933336417, 7)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[ 8]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 R256 - 0x7C0C0200, // 0001 CALL R3 1 - 0x8C100701, // 0002 GETMET R4 R3 R257 - 0x5C180200, // 0003 MOVE R6 R1 - 0x841C0000, // 0004 CLOSURE R7 P0 - 0x7C100600, // 0005 CALL R4 3 - 0xA0000000, // 0006 CLOSE 0 - 0x80000000, // 0007 RET 0 R0 + ( &(const binstruction[ 7]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 R256 + 0x8C0C0701, // 0001 GETMET R3 R3 R257 + 0x5C140200, // 0002 MOVE R5 R1 + 0x84180000, // 0003 CLOSURE R6 P0 + 0x7C0C0600, // 0004 CALL R3 3 + 0xA0000000, // 0005 CLOSE 0 + 0x80000000, // 0006 RET 0 R0 }) ) ); /*******************************************************************/ -#if BE_USE_PRECOMPILED_OBJECT -#include "../generate/be_fixed_be_class_tasmota_driver.h" -#endif -void be_load_driverlib(bvm *vm) { -#if !BE_USE_PRECOMPILED_OBJECT - static const bnfuncinfo members[] = { - { "every_second", NULL }, - { "every_50ms", NULL }, - { "every_100ms", NULL }, - { "web_add_handler", NULL }, - { "web_add_button", NULL }, - { "web_add_main_button", NULL }, - { "web_add_management_button", NULL }, - { "web_add_config_button", NULL }, - { "web_add_console_button", NULL }, - { "save_before_restart", NULL }, - { "web_sensor", NULL }, - { "json_append", NULL }, - { "button_pressed", NULL }, - { "display", NULL }, +/******************************************************************** +** Solidified class: Driver +********************************************************************/ +be_local_class(Driver, + 13, + NULL, + be_nested_map(14, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_nested_key("web_add_handler", -304792334, 15, 2), be_const_index(2) }, + { be_nested_key("every_second", 2075451465, 12, -1), be_const_index(0) }, + { be_nested_key("web_add_button", -757092238, 14, -1), be_const_index(3) }, + { be_nested_key("web_add_config_button", 639674325, 21, 1), be_const_index(6) }, + { be_nested_key("every_100ms", 1546407804, 11, 0), be_const_index(1) }, + { be_nested_key("add_cmd", -933336417, 7, -1), be_const_closure(add_cmd_closure) }, + { be_nested_key("web_add_management_button", -1556090110, 25, 13), be_const_index(5) }, + { be_nested_key("display", 1164572437, 7, -1), be_const_index(12) }, + { be_nested_key("web_add_main_button", -334599632, 19, 9), be_const_index(4) }, + { be_nested_key("save_before_restart", 1253239338, 19, 11), be_const_index(8) }, + { be_nested_key("web_sensor", -1394870324, 10, 6), be_const_index(9) }, + { be_nested_key("button_pressed", 1694209616, 14, -1), be_const_index(11) }, + { be_nested_key("json_append", -1292948012, 11, -1), be_const_index(10) }, + { be_nested_key("web_add_console_button", -813531104, 22, -1), be_const_index(7) }, + })), + (be_nested_const_str("Driver", -718580993, 6)) +); +/*******************************************************************/ - { NULL, (bntvfunc) BE_CLOSURE }, /* mark section for berry closures */ - { "get_tasmota", (bntvfunc) &get_tasmota_closure }, - { "add_cmd", (bntvfunc) &add_cmd_closure }, - - { NULL, NULL } - }; - be_regclass(vm, "Driver", members); -#else - be_pushntvclass(vm, &be_class_tasmota_driver); +void be_load_Driver_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Driver); be_setglobal(vm, "Driver"); be_pop(vm, 1); -#endif } -/* @const_object_info_begin - -class be_class_tasmota_driver (scope: global, name: Driver) { - every_second, var - every_50ms, var - every_100ms, var - web_add_handler, var - web_add_button, var - web_add_main_button, var - web_add_management_button, var - web_add_config_button, var - web_add_console_button, var - save_before_restart, var - web_sensor, var - json_append, var - button_pressed, var - display, var - - get_tasmota, closure(get_tasmota_closure) - - add_cmd, closure(add_cmd_closure) -} -@const_object_info_end */ diff --git a/lib/libesp32/Berry/default/be_i2c_driverlib.c b/lib/libesp32/Berry/default/be_i2c_driverlib.c index 3b44bc6df..4fe868dae 100644 --- a/lib/libesp32/Berry/default/be_i2c_driverlib.c +++ b/lib/libesp32/Berry/default/be_i2c_driverlib.c @@ -9,7 +9,7 @@ *******************************************************************/ #include "be_constobj.h" -extern bclass* be_class_tasmota_driver; // Parent class +extern bclass* be_class_Driver; // Parent class /******************************************************************** ** Solidified function: init @@ -418,7 +418,7 @@ void be_load_driver_i2c_lib(bvm *vm) { } /* @const_object_info_begin -class be_class_tasmota_i2c_driver (scope: global, name: I2C_Driver, super: be_class_tasmota_driver) { +class be_class_tasmota_i2c_driver (scope: global, name: I2C_Driver, super: be_class_Driver) { wire, var addr, var name, var diff --git a/lib/libesp32/Berry/default/be_i2s_audio_lib.c b/lib/libesp32/Berry/default/be_i2s_audio_lib.c index fb08e66b0..74a523d32 100644 --- a/lib/libesp32/Berry/default/be_i2s_audio_lib.c +++ b/lib/libesp32/Berry/default/be_i2s_audio_lib.c @@ -8,9 +8,6 @@ #ifdef USE_I2S #ifdef USE_I2S_AUDIO_BERRY -// extern bclass* be_class_tasmota_driver; // Parent class - - extern int i2s_output_i2s_init(bvm *vm); extern int i2s_output_i2s_deinit(bvm *vm); diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index cc014603b..99c493793 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -100,7 +100,7 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { #ifdef ESP32 extern void be_load_tasmota_ntvlib(bvm *vm); extern void be_load_wirelib(bvm *vm); -extern void be_load_driverlib(bvm *vm); +extern void be_load_Driver_class(bvm *vm); extern void be_load_driver_i2c_lib(bvm *vm); extern void be_load_md5_lib(bvm *vm); @@ -131,7 +131,7 @@ BERRY_API void be_load_custom_libs(bvm *vm) /* be_load_xxxlib(vm); */ #endif be_load_tasmota_ntvlib(vm); - be_load_driverlib(vm); + be_load_Driver_class(vm); be_load_md5_lib(vm); #ifdef USE_I2C be_load_wirelib(vm); diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index 451be9520..ddc45090f 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -1371,27 +1371,26 @@ be_local_closure(event, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - be_nested_string("introspect", 164638290, 10), - be_nested_string("every_50ms", -1911083288, 10), - be_nested_string("run_deferred", 371594696, 12), - be_nested_string("cmd", -158181397, 3), - be_nested_string("exec_cmd", 493567399, 8), - be_nested_string("rule", -64077613, 4), - be_nested_string("exec_rules", 1445221092, 10), - be_nested_string("mqtt_data", -1756753932, 9), - be_nested_string("gc", 1042313471, 2), - be_nested_string("_drivers", -1034638311, 8), - be_nested_string("get", 1410115415, 3), - be_nested_string("function", -1630125495, 8), - be_nested_string("string", 398550328, 6), - be_nested_string("format", -1180859054, 6), - be_nested_string("BRY: Exception> '%s' - %s", -2047976332, 25), - be_nested_string("stop_iteration", -121173395, 14), + ( &(const bvalue[15]) { /* constants */ + be_nested_string("introspect", 164638290, 10), /* R256 - K0 */ + be_nested_string("every_50ms", -1911083288, 10), /* R257 - K1 */ + be_nested_string("run_deferred", 371594696, 12), /* R258 - K2 */ + be_nested_string("cmd", -158181397, 3), /* R259 - K3 */ + be_nested_string("exec_cmd", 493567399, 8), /* R260 - K4 */ + be_nested_string("rule", -64077613, 4), /* R261 - K5 */ + be_nested_string("exec_rules", 1445221092, 10), /* R262 - K6 */ + be_nested_string("gc", 1042313471, 2), /* R263 - K7 */ + be_nested_string("_drivers", -1034638311, 8), /* R264 - K8 */ + be_nested_string("get", 1410115415, 3), /* R265 - K9 */ + be_nested_string("function", -1630125495, 8), /* R266 - K10 */ + be_nested_string("string", 398550328, 6), /* R267 - K11 */ + be_nested_string("format", -1180859054, 6), /* R268 - K12 */ + be_nested_string("BRY: Exception> '%s' - %s", -2047976332, 25), /* R269 - K13 */ + be_nested_string("stop_iteration", -121173395, 14), /* R270 - K14 */ }), (be_nested_const_str("event", -30355297, 5)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[72]) { /* code */ + ( &(const binstruction[78]) { /* code */ 0xA4160000, // 0000 IMPORT R5 R256 0x1C180301, // 0001 EQ R6 R1 R257 0x781A0001, // 0002 JMPF R6 #0005 @@ -1405,65 +1404,71 @@ be_local_closure(event, /* name */ 0x5C280800, // 000A MOVE R10 R4 0x7C180800, // 000B CALL R6 4 0x80040C00, // 000C RET 1 R6 - 0x70020038, // 000D JMP #0047 + 0x7002003E, // 000D JMP #004D 0x1C180305, // 000E EQ R6 R1 R261 0x781A0004, // 000F JMPF R6 #0015 0x8C180106, // 0010 GETMET R6 R0 R262 0x5C200800, // 0011 MOVE R8 R4 0x7C180400, // 0012 CALL R6 2 0x80040C00, // 0013 RET 1 R6 - 0x70020031, // 0014 JMP #0047 + 0x70020037, // 0014 JMP #004D 0x1C180307, // 0015 EQ R6 R1 R263 - 0x781A0002, // 0016 JMPF R6 #001A - 0x4C180000, // 0017 LDNIL 6 - 0x80040C00, // 0018 RET 1 R6 - 0x7002002C, // 0019 JMP #0047 - 0x1C180308, // 001A EQ R6 R1 R264 - 0x781A0003, // 001B JMPF R6 #0020 - 0x8C180108, // 001C GETMET R6 R0 R264 - 0x7C180200, // 001D CALL R6 1 - 0x80040C00, // 001E RET 1 R6 - 0x70020026, // 001F JMP #0047 - 0x88180109, // 0020 GETMBR R6 R0 R265 - 0x781A0024, // 0021 JMPF R6 #0047 - 0x60180000, // 0022 GETGBL R6 G0 - 0x881C0109, // 0023 GETMBR R7 R0 R265 - 0x7C180200, // 0024 CALL R6 1 - 0xA802001D, // 0025 EXBLK 0 #0044 - 0x5C1C0C00, // 0026 MOVE R7 R6 - 0x7C1C0000, // 0027 CALL R7 0 - 0x8C200B0A, // 0028 GETMET R8 R5 R266 - 0x5C280E00, // 0029 MOVE R10 R7 - 0x5C2C0200, // 002A MOVE R11 R1 - 0x7C200600, // 002B CALL R8 3 - 0x60240015, // 002C GETGBL R9 G21 - 0x5C281000, // 002D MOVE R10 R8 - 0x7C240200, // 002E CALL R9 1 - 0x1C24130B, // 002F EQ R9 R9 R267 - 0x78260011, // 0030 JMPF R9 #0043 - 0xA8020004, // 0031 EXBLK 0 #0037 - 0x5C241000, // 0032 MOVE R9 R8 - 0x5C280E00, // 0033 MOVE R10 R7 - 0x7C240200, // 0034 CALL R9 1 - 0xA8040001, // 0035 EXBLK 1 1 - 0x7002000B, // 0036 JMP #0043 - 0xAC240002, // 0037 CATCH R9 0 2 - 0x70020008, // 0038 JMP #0042 - 0xA42E1800, // 0039 IMPORT R11 R268 - 0x6030000F, // 003A GETGBL R12 G15 - 0x8C34170D, // 003B GETMET R13 R11 R269 - 0x583C000E, // 003C LDCONST R15 K14 - 0x5C401200, // 003D MOVE R16 R9 - 0x5C441400, // 003E MOVE R17 R10 - 0x7C340800, // 003F CALL R13 4 - 0x7C300200, // 0040 CALL R12 1 - 0x70020000, // 0041 JMP #0043 - 0xB0080000, // 0042 RAISE 2 R0 R0 - 0x7001FFE1, // 0043 JMP #0026 - 0x5818000F, // 0044 LDCONST R6 K15 - 0xAC180200, // 0045 CATCH R6 1 0 + 0x781A0003, // 0016 JMPF R6 #001B + 0x8C180107, // 0017 GETMET R6 R0 R263 + 0x7C180200, // 0018 CALL R6 1 + 0x80040C00, // 0019 RET 1 R6 + 0x70020031, // 001A JMP #004D + 0x88180108, // 001B GETMBR R6 R0 R264 + 0x781A002F, // 001C JMPF R6 #004D + 0x60180000, // 001D GETGBL R6 G0 + 0x881C0108, // 001E GETMBR R7 R0 R264 + 0x7C180200, // 001F CALL R6 1 + 0xA8020026, // 0020 EXBLK 0 #0048 + 0x5C1C0C00, // 0021 MOVE R7 R6 + 0x7C1C0000, // 0022 CALL R7 0 + 0x8C200B09, // 0023 GETMET R8 R5 R265 + 0x5C280E00, // 0024 MOVE R10 R7 + 0x5C2C0200, // 0025 MOVE R11 R1 + 0x7C200600, // 0026 CALL R8 3 + 0x60240015, // 0027 GETGBL R9 G21 + 0x5C281000, // 0028 MOVE R10 R8 + 0x7C240200, // 0029 CALL R9 1 + 0x1C24130A, // 002A EQ R9 R9 R266 + 0x7826001A, // 002B JMPF R9 #0047 + 0xA802000D, // 002C EXBLK 0 #003B + 0x5C241000, // 002D MOVE R9 R8 + 0x5C280E00, // 002E MOVE R10 R7 + 0x5C2C0400, // 002F MOVE R11 R2 + 0x5C300600, // 0030 MOVE R12 R3 + 0x5C340800, // 0031 MOVE R13 R4 + 0x7C240800, // 0032 CALL R9 4 + 0x50280200, // 0033 LDBOOL R10 1 0 + 0x1C28120A, // 0034 EQ R10 R9 R10 + 0x782A0002, // 0035 JMPF R10 #0039 + 0x50280200, // 0036 LDBOOL R10 1 0 + 0xA8040002, // 0037 EXBLK 1 2 + 0x80041400, // 0038 RET 1 R10 + 0xA8040001, // 0039 EXBLK 1 1 + 0x7002000B, // 003A JMP #0047 + 0xAC240002, // 003B CATCH R9 0 2 + 0x70020008, // 003C JMP #0046 + 0xA42E1600, // 003D IMPORT R11 R267 + 0x6030000F, // 003E GETGBL R12 G15 + 0x8C34170C, // 003F GETMET R13 R11 R268 + 0x583C000D, // 0040 LDCONST R15 K13 + 0x5C401200, // 0041 MOVE R16 R9 + 0x5C441400, // 0042 MOVE R17 R10 + 0x7C340800, // 0043 CALL R13 4 + 0x7C300200, // 0044 CALL R12 1 + 0x70020000, // 0045 JMP #0047 0xB0080000, // 0046 RAISE 2 R0 R0 - 0x80000000, // 0047 RET 0 R0 + 0x7001FFD8, // 0047 JMP #0021 + 0x5818000E, // 0048 LDCONST R6 K14 + 0xAC180200, // 0049 CATCH R6 1 0 + 0xB0080000, // 004A RAISE 2 R0 R0 + 0x50180000, // 004B LDBOOL R6 0 0 + 0x80040C00, // 004C RET 1 R6 + 0x80000000, // 004D RET 0 R0 }) ) ); diff --git a/lib/libesp32/Berry/default/embedded/Driver.be b/lib/libesp32/Berry/default/embedded/Driver.be new file mode 100644 index 000000000..d5079b1b3 --- /dev/null +++ b/lib/libesp32/Berry/default/embedded/Driver.be @@ -0,0 +1,25 @@ +#- Native code used for testing and code solidification -# +#- Do not use it -# + +class Driver + var every_second + var every_100ms + var web_add_handler + var web_add_button + var web_add_main_button + var web_add_management_button + var web_add_config_button + var web_add_console_button + var save_before_restart + var web_sensor + var json_append + var button_pressed + var display + + def init() + end + + def add_cmd(c, f) + tasmota.add_cmd(c, / cmd, idx, payload, payload_json -> f(self, cmd, idx, payload, payload_json)) + end +end diff --git a/lib/libesp32/Berry/default/embedded/Tasmota.be b/lib/libesp32/Berry/default/embedded/Tasmota.be index 0c04819e0..fab2ed290 100644 --- a/lib/libesp32/Berry/default/embedded/Tasmota.be +++ b/lib/libesp32/Berry/default/embedded/Tasmota.be @@ -1,7 +1,7 @@ #- Native code used for testing and code solidification -# #- Do not use it -# -class Tasmota2 : Tasmota +class Tasmota # add `chars_in_string(s:string,c:string) -> int`` # looks for any char in c, and return the position of the first char @@ -247,20 +247,21 @@ class Tasmota2 : Tasmota if event_type=='cmd' return self.exec_cmd(cmd, idx, payload) elif event_type=='rule' return self.exec_rules(payload) - elif event_type=='mqtt_data' return nil elif event_type=='gc' return self.gc() elif self._drivers for d:self._drivers var f = introspect.get(d, event_type) # try to match a function or method with the same name if type(f) == 'function' try - f(d) + var done = f(d, cmd, idx, payload) + if done == true return true end except .. as e,m import string print(string.format("BRY: Exception> '%s' - %s", e, m)) end end end + return false end end @@ -288,4 +289,3 @@ class Tasmota2 : Tasmota end end -tasmota = Tasmota2() \ No newline at end of file diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index c25261edc..94df1b34e 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,662 +1,646 @@ -extern const bcstring be_const_str_ADC_TEMP; -extern const bcstring be_const_str_MGC3130_RESET; -extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str_A4988_DIR; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_MAX7219DIN; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_web_sensor; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_button_pressed; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_SYMBOL_PLAY; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_NRG_SEL_INV; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_web_add_console_button; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_OPTION_A; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_loop; extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_AudioFileSourceFS; extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_SI7021; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str__buffer; extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_HRE_DATA; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_TM1637CLK; extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_WIEGAND_D1; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_Driver; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_get_option; extern const bcstring be_const_str_list; -extern const bcstring be_const_str_web_add_management_button; +extern const bcstring be_const_str_PWM1; extern const bcstring be_const_str_I2S_OUT_CLK; extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_lv_sqrt_res; -extern const bcstring be_const_str_I2S_OUT_SLCT; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_json_append; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_web_add_config_button; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str_WEBCAM_PSCLK; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_AZ_RXD; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_SM16716_SEL; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_KEY1_PD; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_SYMBOL_BULLET; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_WEBCAM_SIOC; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str_every_100ms; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_return; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_lv_gauge_format_cb; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_ILI9341_CS; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_I2C_SCL; extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_HPMA_TX; -extern const bcstring be_const_str_members; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_RC522_CS; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_TASMOTACLIENT_RXD; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_KEY1_INV; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_OUTPUT_LO; -extern const bcstring be_const_str_every_50ms; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_REL1_INV; extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_web_add_button; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_size; extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str_TM1637DIO; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_KEY1_INV_PD; -extern const bcstring be_const_str_SSPI_DC; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_isrunning; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_toint; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_MAX7219CLK; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_I2S_IN_CLK; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_CNTR1_NP; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_publish_result; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_BL0940_RX; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_GPS_RX; -extern const bcstring be_const_str_PN532_RXD; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_SR04_TRIG; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_SDM72_TX; -extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_tostring; +extern const bcstring be_const_str_HLW_CF; extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_SWT1_PD; -extern const bcstring be_const_str_lv_cb; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_web_add_handler; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_lv_signal_cb; -extern const bcstring be_const_str_update; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_I2S_IN_DATA; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_KEY1_TC; extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_I2C_SDA; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_BOILER_OT_TX; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_wifi; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_every_second; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_AS3935; extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_SYMBOL_CHARGE; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_REL1; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_SYMBOL_SETTINGS; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_SYMBOL_MUTE; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_millis; +extern const bcstring be_const_str_DDS2382_TX; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_get_light; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_remove_cmd; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_AZ_RXD; extern const bcstring be_const_str_SDM630_TX; extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str_display; -extern const bcstring be_const_str_WE517_RX; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_HLW_CF; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_close; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_I2S_OUT_DATA; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_SYMBOL_NEXT; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_save_before_restart; extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_get_tasmota; -extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_INTERRUPT; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_web_add_main_button; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_ZEROCROSS; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_SWT1_PD; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str_lv_tileview; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_find_key_i; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_SR04_TRIG; +extern const bcstring be_const_str_VL53L0X_XSHUT1; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str_lv_line; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_AZ_TXD; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_wifi; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_SYMBOL_CHARGE; extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_I2S_IN_SLCT; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_SWT1_NP; extern const bcstring be_const_str_eth; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_seg7_font; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_SYMBOL_LEFT; extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_AudioGeneratorMP3; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_HX711_DAT; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_SYMBOL_OK; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_TASMOTACLIENT_RST; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_SYMBOL_WIFI; +extern const bcstring be_const_str_setbits; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_ADC_BUTTON; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_HX711_SCK; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_lv_dropdown; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_MIEL_HVAC_TX; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_GPS_TX; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str_SYMBOL_PAUSE; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_toint; +extern const bcstring be_const_str_wire2; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_screenshot; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_BUZZER_INV; extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_TELEINFO_ENABLE; +extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_SENSOR_END; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_reverse_gamma10; +extern const bcstring be_const_str_KEY1; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str_add_rule; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_CNTR1; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_LE01MR_RX; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_I2C_Driver; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_DHT22; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_has_arg; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_web_send; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_BUZZER; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str_LEDLNK_INV; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_DI; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_get; +extern const bcstring be_const_str_MAX31855DO; +extern const bcstring be_const_str_SYMBOL_RIGHT; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_WEBCAM_SIOD; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str_bytes; +extern const bcstring be_const_str_lv_signal_cb; +extern const bcstring be_const_str_update; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_SYMBOL_REFRESH; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_SSD1351_CS; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str__end_transmission; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_SM16716_SEL; +extern const bcstring be_const_str_load_font; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_members; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_SSD1351_DC; +extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str_elif; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_read12; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_item; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_TXD; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_SYMBOL_USB; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_exec_rules; +extern const bcstring be_const_str_publish_result; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_SYMBOL_EJECT; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str_lv_img; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_RDM6300_RX; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_SYMBOL_GPS; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_close; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_push; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_add_cmd; extern const bcstring be_const_str_class; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_lv_draw_label_dsc; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_lv_slider; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_CNTR1_NP; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_MGC3130_RESET; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_MGC3130_XFER; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_SDM72_TX; +extern const bcstring be_const_str__ccmd; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_return; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index 5c2fa593f..663da014c 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,991 +1,967 @@ -be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, NULL); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SYMBOL_REFRESH); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_lv_area); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_SDCARD_CS); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str___upper__); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, NULL); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_KEY1_NP); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, NULL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_SYMBOL_EJECT); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_read8); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_upper); -be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_lv_draw_mask_angle_param_cfg); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, &be_const_str_lv_draw_rect_dsc); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, &be_const_str_web_send); -be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SYMBOL_DIRECTORY); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, NULL); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_RFSEND); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); -be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, &be_const_str_def); -be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_type); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_SBR_TX); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_SYMBOL_SETTINGS); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_button_pressed); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_get_power); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_getbits); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_load_font); -be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_TASMOTACLIENT_TXD); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_pin); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, NULL); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str___iterator__); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_millis); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_delay); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str__drivers); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, NULL); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SYMBOL_POWER); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, NULL); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, NULL); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_lv_style); -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_SAIR_TX); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_gen_cb); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_start); -be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_TM1638STB); -be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_clear); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_SYMBOL_AUDIO); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_write_bit); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_stop); -be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_SYMBOL_MINUS); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_iter); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_lv_draw_mask_saved); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_wire_scan); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_call); -be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, NULL); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_NRG_SEL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_SM16716_DAT); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_SYMBOL_CALL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_TM1638CLK); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_MIEL_HVAC_RX); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, NULL); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_DHT11); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_tolower); -be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, NULL); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_read24); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_read_bytes); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, NULL); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, NULL); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_ROT1B_NP); -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_Wire); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str__begin_transmission); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_TM1637CLK); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_arg_size); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_input); -be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_WIEGAND_D1); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_ETH_PHY_MDC); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_HIGH); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_LEDLNK_INV); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_AudioGenerator); -be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_DDS2382_RX); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); -be_define_const_str(Driver, "Driver", 3576386303u, 0, 6, NULL); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, NULL); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_WEBCAM_XCLK); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, NULL); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); -be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SYMBOL_SHUFFLE); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_set); -be_define_const_str(set, "set", 3324446467u, 0, 3, &be_const_str_elif); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_lv_draw_mask_common_dsc); -be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, NULL); -be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_ILI9488_CS); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_SAIR_RX); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, NULL); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_SYMBOL_CUT); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, NULL); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_lv_sqrt_res); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); -be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, NULL); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_FTC532); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, NULL); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_WIEGAND_D0); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str__end_transmission); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_read32); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_for); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_range); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, NULL); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_PN532_TXD); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_json_append); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_TASMOTACLIENT_RST_INV); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_web_add_config_button); -be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_find_key_i); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_msgbox); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, NULL); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_SYMBOL_RIGHT); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_WEBCAM_PCLK); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_lv_spinbox); -be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_geti); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_SYMBOL_PAUSE); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_SHELLY_DIMMER_RST_INV); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_lv_led); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_set_power); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, &be_const_str_seti); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, &be_const_str_acos); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_TX2X_TXD_BLACK); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str_WEBCAM_PSCLK); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_find_op); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, NULL); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_isinstance); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_CSE7766_RX); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_SM16716_SEL); -be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_cb_dispatch); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL); -be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, NULL); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str__available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_true); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_SYMBOL_BULLET); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_SYMBOL_EDIT); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_name); -be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_DDS2382_TX); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_WEBCAM_HREF); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str_WEBCAM_HSD); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_attrdump); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_resp_cmnd); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_ZIGBEE_RX); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str_memory); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_pin_mode); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, NULL); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_write_bytes); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, &be_const_str_except); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, NULL); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_SPI_CS); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str__timers); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_lv_draw_mask_map_param_cfg); -be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, NULL); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str_bus); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, NULL); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_WINDMETER_SPEED); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str__request_from); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_every_100ms); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, NULL); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_SYMBOL_VIDEO); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, &be_const_str_WE517_TX); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, NULL); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_SYMBOL_BLUETOOTH); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_classname); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_NRG_CF1); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_try_rule); be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_MAX31855CLK); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_MCP39F5_TX); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_REL1); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_content_send_style); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_return); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_asstring); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_remove_rule); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_seg7_font); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_ILI9341_CS); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_add_driver); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_member); -be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_response_append); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_lv_canvas); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); -be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_set_timer); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_MIEL_HVAC_TX); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_lv_indev); -be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_OLED_RESET); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SYMBOL_LEFT); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_run_deferred); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, NULL); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_lv_table); -be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_SYMBOL_PASTE); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_lv_spinner); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_calldepth); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_while); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_members); -be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_lv_page); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_resp_cmnd_str); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_lv_cont); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_setrange); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_tan); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_ST7789_CS); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, NULL); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_RC522_CS); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, NULL); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_compile); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_wire2); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_add_cmd); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_event); -be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, NULL); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_SSPI_MAX31865_CS1); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_SYMBOL_SD_CARD); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, NULL); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_item); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_setbits); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_OUTPUT_LO); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_every_50ms); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_TCP_TX); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_lv_btnmatrix); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_HX711_DAT); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_read12); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_end); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, NULL); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_write8); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_ETH_PHY_POWER); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_SOLAXX1_RX); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_yield); -be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, NULL); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, NULL); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_web_add_button); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_TM1637DIO); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_WEBCAM_DATA); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_ZIGBEE_RST); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_lv_dropdown); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, NULL); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_ctypes_bytes); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); -be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SSPI_DC); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_imin); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_SYMBOL_BATTERY_FULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, NULL); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, &be_const_str_static); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_isrunning); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_top); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_toint); -be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_TCP_RX); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_content_stop); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_gc); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); -be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_ceil); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, NULL); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_SM16716_CLK); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_SYMBOL_MUTE); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, NULL); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_lv_draw_mask_fade_param); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_DYP_RX); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_resolvecmnd); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str__cb); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_CSE7761_RX); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_ETH_PHY_MDIO); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_SYMBOL_TRASH); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_check_privileged_access); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_btn); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_lv_list); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_content_send); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_imax); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_publish_result); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_PZEM017_RX); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_SPI_CLK); -be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_scale_uint); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SYMBOL_COPY); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_SYMBOL_SAVE); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_get); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_ZIGBEE_TX); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); -be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_I2C_Driver); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_NONE); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SSD1331_DC); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_SWT1_NP); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_digital_write); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, NULL); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, NULL); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_floor); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_real); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_PN532_RXD); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_SM2135_DAT); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_int); -be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SR04_TRIG); -be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_SYMBOL_BATTERY_1); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_byte); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_resp_cmnd_error); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_gamma8); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_resp_cmnd_error); be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_WEBCAM_PSRCS); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, NULL); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_lv_objmask); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_SDM630_RX); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_SDM72_TX); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str___lower__); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str__read); -be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, &be_const_str_arg); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_deinit); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_load_freetype_font); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_SWT1_PD); -be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_lv_cb); -be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_PZEM004_RX); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_content_flush); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str__buffer); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_exp); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_get_option); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, NULL); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, NULL); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SYMBOL_SHUFFLE); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_wire1); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_size); +be_define_const_str(size, "size", 597743964u, 0, 4, NULL); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_SYMBOL_VOLUME_MAX); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_erase); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_tostring); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str___lower__); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, NULL); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_classof); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_geti); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); +be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_SYMBOL_BATTERY_3); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, NULL); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_SPI_DC); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_deg); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_lv_draw_rect_dsc); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_lv_draw_mask_line_param_cfg); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_NEOPOOL_RX); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, NULL); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_content_flush); be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_get_light); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_lv_group_focus_cb); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, NULL); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_log10); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); -be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_redirect); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_SYMBOL_STOP); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_lv_draw_label_dsc); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_web_add_handler); -be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_SDM120_TX); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_SYMBOL_SETTINGS); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_SYMBOL_UP); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_attrdump); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, NULL); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_INPUT); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SYMBOL_MUTE); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, NULL); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, NULL); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_PZEM017_RX); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_lv_calendar); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, NULL); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_get_light); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_lv_draw_mask_fade_param); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, NULL); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_SYMBOL_BULLET); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_TM1638CLK); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_rand); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_SYMBOL_SAVE); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_start); +be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_LOW); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_RFRECV); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_call); +be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); +be_define_const_str(format, "format", 3114108242u, 0, 6, NULL); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SDM630_TX); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_SDM72_RX); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_cmd); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_content_start); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_seti); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_iter); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_load_freetype_font); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, NULL); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_finish); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, NULL); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_lv_tileview); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_find_key_i); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_pin_mode); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); +be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_VL53L0X_XSHUT1); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str___iterator__); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_event); +be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_ROT1B_NP); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_deinit); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, NULL); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_setitem); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_read); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, &be_const_str_wifi); +be_define_const_str(wifi, "wifi", 120087624u, 0, 4, &be_const_str_write_bytes); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, NULL); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_SWT1_NP); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, NULL); +be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, NULL); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_PZEM0XX_TX); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_fromstring); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_set_light); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_seg7_font); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_getbits); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_WEBCAM_DATA); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_lv_style); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_atan); +be_define_const_str(atan, "atan", 108579519u, 0, 4, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_find_op); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, NULL); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_resp_cmnd_failed); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_RFSEND); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_TASMOTACLIENT_TXD); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_concat); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_TASMOTACLIENT_RXD); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_WE517_RX); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_gc); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_lv_color); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_HPMA_TX); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_log10); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_SDS0X1_RX); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, NULL); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_SSPI_MISO); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_lv_led); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, NULL); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_lv_label); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_SYMBOL_WIFI); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_setbits); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_digital_read); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_bus); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_imax); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_montserrat_font); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_lv_cpicker); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_I2S_OUT_SLCT); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_DSB); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_HPMA_RX); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_PN532_RXD); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, NULL); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_MHZ_RXD); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_PZEM016_RX); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_gen_cb); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, NULL); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, NULL); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_arg_name); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_member); +be_define_const_str(member, "member", 719708611u, 0, 6, NULL); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, NULL); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_module); +be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_read_bytes); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, &be_const_str_type); +be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_WEBCAM_VSYNC); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, NULL); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str__drivers); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str__write); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_init); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_split); +be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_ETH_PHY_POWER); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_INPUT_PULLUP); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_MIEL_HVAC_TX); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_PWM1_INV); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_WEBCAM_PWDN); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str__cmd); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_ROT1A_NP); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_content_stop); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_read8); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str__begin_transmission); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_remove_rule); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_tolower); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_WS2812); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_digital_write); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_time_dump); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_SPI_MOSI); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_lv_msgbox); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_lv_draw_mask_saved); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_ZIGBEE_TX); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_SYMBOL_PAUSE); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_set_power); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, &be_const_str_toint); +be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, NULL); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, &be_const_str_for); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_setmember); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_KEY1_INV_NP); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, NULL); +be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_lv_linemeter); be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_signal_cb); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_PROJECTOR_CTRL_RX); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_ROT1A); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, NULL); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_lv_arc); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_publish); +be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_PMS5003_RX); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_ST7789_CS); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_RC522_CS); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_count); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_group_focus_cb); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, &be_const_str_lv_switch); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_write_bit); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str__available); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, NULL); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str_issubclass); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_FALLING); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_KEY1_INV_PD); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SWT1); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, NULL); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str_lv_sqrt_res); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_cosh); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_lv_draw_mask_map_param_cfg); +be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_IRRECV); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_KEY1_NP); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_ZIGBEE_RX); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str__read); +be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_lv_indev); +be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SDS0X1_TX); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SYMBOL_UPLOAD); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_ST7789_DC); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_TFMINIPLUS_TX); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_WEBCAM_XCLK); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_lv_gauge_format_cb); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_detect); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_lv_table); +be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_lv_spinner); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_SYMBOL_WARNING); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_SYMBOL_KEYBOARD); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_add_rule); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_INTERRUPT); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_IBEACON_TX); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_map); +be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_lower); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_REL1_INV); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_SYMBOL_SD_CARD); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, NULL); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_real); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_SYMBOL_PLUS); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, NULL); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_WEBCAM_SIOC); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_RF_SENSOR); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_copy); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_SYMBOL_HOME); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_lv_bar); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_OPEN_DRAIN); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_SAIR_RX); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_lv_draw_mask_angle_param); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_SSPI_SCLK); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_SSPI_CS); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_SHELLY_DIMMER_BOOT0); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str__request_from); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_add); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_NRF24_CS); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_SYMBOL_BATTERY_2); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, NULL); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_write8); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_def); +be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_exists); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_as); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_yield); +be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_OUTPUT_LO); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_has_arg); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_web_send); +be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_TM1638STB); +be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_true); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_DI); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SYMBOL_CALL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_SYMBOL_MINUS); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, NULL); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_content_button); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_get); +be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_SYMBOL_RIGHT); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, NULL); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_bytes); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_lv_signal_cb); be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_update); be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_SYMBOL_CLOSE); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_WEBCAM_VSYNC); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_lv_label); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); -be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_SSD1331_CS); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str__buffer); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_SYMBOL_DOWNLOAD); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_MGC3130_XFER); -be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str_assert); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SYMBOL_BLUETOOTH); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, NULL); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_TM1638DIO); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, NULL); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, NULL); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_WE517_TX); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, NULL); -be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_OUTPUT); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_RF_SENSOR); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_bytes); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_SYMBOL_BATTERY_3); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_i2c_enabled); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_OUTPUT_HI); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_BOILER_OT_TX); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_add_rule); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_dump); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_fromstring); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_lv_arc); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_publish); -be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_wifi); -be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_every_second); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_lv_draw_mask_line_param_cfg); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, NULL); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_lv_bar); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_as); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); -be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_SDM72_RX); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, NULL); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str_display); -be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, NULL); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_lv_draw_mask_angle_param); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_find); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_resp_cmnd_failed); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_cosh); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, &be_const_str_write); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, NULL); -be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, &be_const_str_SYMBOL_UPLOAD); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, NULL); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_digital_read); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_has_arg); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, NULL); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_SYMBOL_DOWN); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_close); -be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_lv_cpicker); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, &be_const_str_split); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); -be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_SSPI_MISO); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str__ccmd); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_lv_tileview); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, NULL); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_scan); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_LED1_INV); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_MCP39F5_RX); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, NULL); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_save_before_restart); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_get_tasmota); -be_define_const_str(get_tasmota, "get_tasmota", 334356779u, 0, 11, &be_const_str_loop); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, &be_const_str_lv_group); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, NULL); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, NULL); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_LE01MR_TX); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_SYMBOL_PREV); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, NULL); -be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, &be_const_str_lv_draw_mask_line_param); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, &be_const_str_lv_roller); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, &be_const_str_web_add_main_button); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_ST7789_DC); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_ZEROCROSS); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_collect); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_codedump); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, NULL); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_lv_keyboard); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_lv_keyboard); be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_gamma8); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_state); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_resp_cmnd_str); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_state); be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, NULL); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); -be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_SYMBOL_EYE_OPEN); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_eth); -be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_concat); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_get_free_heap); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_lv_draw_mask_fade_param_cfg); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_LE01MR_TX); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_ceil); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, NULL); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_SYMBOL_VOLUME_MID); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str_lv_checkbox); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_SSD1331_DC); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_SYMBOL_NEW_LINE); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_lv_draw_img_dsc); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, &be_const_str_read24); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_OUTPUT_OPEN_DRAIN); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_PMS5003_TX); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, NULL); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, NULL); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_INPUT_PULLDOWN); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); +be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_WEBCAM_PSCLK); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str__end_transmission); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_ZEROCROSS); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_SM16716_SEL); +be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_load_font); +be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_class); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_TFMINIPLUS_RX); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_members); +be_define_const_str(members, "members", 937576464u, 0, 7, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_SSD1351_DC); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str__rules); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, NULL); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_SYMBOL_BATTERY_EMPTY); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_DHT11_OUT); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, NULL); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_exec_cmd); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_lv_chart); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, NULL); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SDM120_RX); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_TUYA_TX); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, NULL); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_HRXL_RX); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_SYMBOL_LIST); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_name); +be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_scale_uint); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_check_privileged_access); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_lv_cont); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_rtc); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_tan); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_lv_spinbox); +be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_SYMBOL_STOP); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_lv_tabview); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, &be_const_str_read12); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, NULL); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, NULL); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_DSB_OUT); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, NULL); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, NULL); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_number); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_save); +be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_hex); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_range); +be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_SYMBOL_NEXT); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, &be_const_str_TXD); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, NULL); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_SYMBOL_USB); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, NULL); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_WEBCAM_PCLK); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_get_power); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_publish_result); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_lv_design_cb); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_TUYA_RX); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str_lv_img); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, NULL); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_WEBCAM_HREF); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, NULL); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_lv_cb); +be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_lv_group); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_SSPI_MAX31865_CS1); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); +be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, NULL); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_SSD1331_CS); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_lv_draw_mask_angle_param_cfg); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, NULL); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_SYMBOL_POWER); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_close); +be_define_const_str(close, "close", 667630371u, 0, 5, NULL); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_NRG_SEL_INV); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_SYMBOL_DRIVE); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_SYMBOL_EDIT); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_compile); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_class); be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_insert); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_lv_event_cb); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_P9813_CLK); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_log); +be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_isinstance); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_lv_draw_label_dsc); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, NULL); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, &be_const_str_pin); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MCP39F5_TX); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_arg); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_SYMBOL_TRASH); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_lv_roller); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SBR_RX); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_SYMBOL_DOWNLOAD); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_resp_cmnd); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_MGC3130_XFER); +be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_SDM72_TX); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str__ccmd); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_char); +be_define_const_str(char, "char", 2823553821u, 0, 4, NULL); +be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_ADC_TEMP, - (const bstring *)&be_const_str_MGC3130_RESET, - (const bstring *)&be_const_str_ADE7953_IRQ, - (const bstring *)&be_const_str_A4988_DIR, - (const bstring *)&be_const_str_copy, - (const bstring *)&be_const_str_CNTR1, - (const bstring *)&be_const_str_BACKLIGHT, - (const bstring *)&be_const_str_SYMBOL_BELL, - (const bstring *)&be_const_str_GPS_TX, - (const bstring *)&be_const_str_MAX7219DIN, - (const bstring *)&be_const_str_hex, - (const bstring *)&be_const_str_EPAPER42_CS, - (const bstring *)&be_const_str_web_sensor, - (const bstring *)&be_const_str_SYMBOL_VOLUME_MAX, - (const bstring *)&be_const_str_WEBCAM_PWDN, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_MP3_DFR562, - (const bstring *)&be_const_str_finish, - (const bstring *)&be_const_str_dot_p, - (const bstring *)&be_const_str_SYMBOL_PLAY, - NULL, - (const bstring *)&be_const_str_IRRECV, - (const bstring *)&be_const_str_ROT1A_NP, - (const bstring *)&be_const_str_PZEM0XX_TX, - (const bstring *)&be_const_str_TUYA_TX, - (const bstring *)&be_const_str_opt_call, - (const bstring *)&be_const_str_INPUT, - (const bstring *)&be_const_str_RDM6300_RX, - (const bstring *)&be_const_str_NRG_SEL_INV, - (const bstring *)&be_const_str_lv_point, - (const bstring *)&be_const_str_MAX31855CS, - (const bstring *)&be_const_str_web_add_console_button, - (const bstring *)&be_const_str_NRF24_DC, - (const bstring *)&be_const_str_ADC_PH, - (const bstring *)&be_const_str_raise, - (const bstring *)&be_const_str_ROT1A, - (const bstring *)&be_const_str_NRG_CF1, - (const bstring *)&be_const_str_HPMA_RX, - (const bstring *)&be_const_str_exec_cmd, - (const bstring *)&be_const_str_exp, - (const bstring *)&be_const_str_SYMBOL_BACKSPACE, - NULL, - (const bstring *)&be_const_str_HRE_DATA, - (const bstring *)&be_const_str_NEOPOOL_TX, - (const bstring *)&be_const_str_DSB_OUT, - (const bstring *)&be_const_str_ADC_BUTTON_INV, - NULL, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_BOILER_OT_RX, - (const bstring *)&be_const_str_PMS5003_RX, - (const bstring *)&be_const_str_PULLUP, - NULL, - (const bstring *)&be_const_str_TASMOTACLIENT_RST, - (const bstring *)&be_const_str_SPI_MOSI, - (const bstring *)&be_const_str_IBEACON_RX, - (const bstring *)&be_const_str_BS814_CLK, - (const bstring *)&be_const_str_SSPI_MOSI, - NULL, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str_SYMBOL_OK, - (const bstring *)&be_const_str_CHANGE, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_Driver, - (const bstring *)&be_const_str_lv_chart, - (const bstring *)&be_const_str_LED1, - (const bstring *)&be_const_str_web_add_management_button, - (const bstring *)&be_const_str_I2S_OUT_CLK, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_read, - (const bstring *)&be_const_str_SYMBOL_LIST, - (const bstring *)&be_const_str_HRE_CLOCK, - (const bstring *)&be_const_str_save, - (const bstring *)&be_const_str_EXS_ENABLE, - (const bstring *)&be_const_str_NEOPOOL_RX, - (const bstring *)&be_const_str_arg_name, - NULL, - (const bstring *)&be_const_str_I2S_OUT_SLCT, - (const bstring *)&be_const_str_ADC_INPUT, - (const bstring *)&be_const_str_SYMBOL_KEYBOARD, - (const bstring *)&be_const_str_WEBCAM_RESET, - (const bstring *)&be_const_str_RFRECV, - (const bstring *)&be_const_str_format, - (const bstring *)&be_const_str_RC522_RST, - (const bstring *)&be_const_str_PMS5003_TX, - (const bstring *)&be_const_str_SYMBOL_HOME, - (const bstring *)&be_const_str_SYMBOL_WARNING, - (const bstring *)&be_const_str_HJL_CF, - (const bstring *)&be_const_str_SYMBOL_LOOP, - (const bstring *)&be_const_str_LE01MR_RX, - (const bstring *)&be_const_str_SPI_MISO, - (const bstring *)&be_const_str_SM2135_CLK, - (const bstring *)&be_const_str_P9813_DAT, - (const bstring *)&be_const_str_ROT1B, - (const bstring *)&be_const_str_lv_calendar, - (const bstring *)&be_const_str_TFMINIPLUS_RX, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_IBEACON_TX, - (const bstring *)&be_const_str_WS2812, - (const bstring *)&be_const_str_AZ_RXD, - (const bstring *)&be_const_str_KEY1_PD, - (const bstring *)&be_const_str_TELEINFO_ENABLE, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_VL53L0X_XSHUT1, - (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str__write, - (const bstring *)&be_const_str_PWM1, - (const bstring *)&be_const_str_WEBCAM_SIOC, - (const bstring *)&be_const_str_RA8876_CS, - NULL, - (const bstring *)&be_const_str_IEM3000_TX, - (const bstring *)&be_const_str_SPI_DC, - (const bstring *)&be_const_str_SWT1, - (const bstring *)&be_const_str_get_option, - (const bstring *)&be_const_str_lv_line, - (const bstring *)&be_const_str_init, - (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, - (const bstring *)&be_const_str_LMT01, - NULL, - (const bstring *)&be_const_str_ADC_CT_POWER, - (const bstring *)&be_const_str_DCKI, - (const bstring *)&be_const_str_SBR_RX, - (const bstring *)&be_const_str_SSD1351_CS, - NULL, - (const bstring *)&be_const_str_ARIRFRCV, - (const bstring *)&be_const_str_try_rule, - (const bstring *)&be_const_str_var, - (const bstring *)&be_const_str_HALLEFFECT, - (const bstring *)&be_const_str_MAX31855DO, - (const bstring *)&be_const_str_lv_gauge_format_cb, - (const bstring *)&be_const_str_SYMBOL_GPS, - (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_HM10_TX, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_INPUT_PULLUP, - (const bstring *)&be_const_str_KEY1, - (const bstring *)&be_const_str_lv_event_cb, - (const bstring *)&be_const_str_TFMINIPLUS_TX, - (const bstring *)&be_const_str_I2C_SCL, - (const bstring *)&be_const_str_wire1, - (const bstring *)&be_const_str_SYMBOL_FILE, - (const bstring *)&be_const_str_LEDLNK, - (const bstring *)&be_const_str_SYMBOL_PLUS, - NULL, - (const bstring *)&be_const_str_HPMA_TX, - (const bstring *)&be_const_str__rules, - (const bstring *)&be_const_str_lv_tabview, - (const bstring *)&be_const_str_CC1101_GDO0, - NULL, - (const bstring *)&be_const_str_erase, - (const bstring *)&be_const_str_rand, - NULL, - (const bstring *)&be_const_str_SR04_ECHO, - (const bstring *)&be_const_str_MHZ_TXD, - (const bstring *)&be_const_str_EPAPER29_CS, - (const bstring *)&be_const_str_SSPI_CS, - (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, - (const bstring *)&be_const_str_push, - (const bstring *)&be_const_str_TASMOTACLIENT_RXD, - (const bstring *)&be_const_str_TXD, - NULL, - NULL, - (const bstring *)&be_const_str_HM10_RX, - (const bstring *)&be_const_str_KEY1_INV, - (const bstring *)&be_const_str_MAX7219CS, - (const bstring *)&be_const_str_tostring, - (const bstring *)&be_const_str_PULLDOWN, - (const bstring *)&be_const_str_lv_img, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_RXD, - (const bstring *)&be_const_str_opt_add, - (const bstring *)&be_const_str_REL1_INV, - (const bstring *)&be_const_str_chars_in_string, - NULL, - (const bstring *)&be_const_str_DI, - (const bstring *)&be_const_str_BUZZER_INV, - (const bstring *)&be_const_str_rtc, - (const bstring *)&be_const_str_SYMBOL_VOLUME_MID, - (const bstring *)&be_const_str_addr, - NULL, - (const bstring *)&be_const_str_add, - (const bstring *)&be_const_str_CSE7766_TX, - (const bstring *)&be_const_str_lv_design_cb, - (const bstring *)&be_const_str_SYMBOL_WIFI, - (const bstring *)&be_const_str_KEY1_INV_PD, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_KEY1_INV_NP, - (const bstring *)&be_const_str_time_dump, - (const bstring *)&be_const_str_classname, - (const bstring *)&be_const_str_lv_obj, - (const bstring *)&be_const_str_begin, - (const bstring *)&be_const_str_SYMBOL_IMAGE, - (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, - (const bstring *)&be_const_str_SYMBOL_VIDEO, - (const bstring *)&be_const_str_lv_textarea, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_MAX7219CLK, - NULL, - (const bstring *)&be_const_str_I2S_IN_CLK, - NULL, - (const bstring *)&be_const_str_WEBCAM_SIOD, - (const bstring *)&be_const_str_ARIRFSEL, - (const bstring *)&be_const_str_HX711_SCK, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str_try, - (const bstring *)&be_const_str_MHZ_RXD, - (const bstring *)&be_const_str_CNTR1_NP, - (const bstring *)&be_const_str_A4988_STP, - (const bstring *)&be_const_str_detect, - NULL, - (const bstring *)&be_const_str_MCP39F5_RST, - (const bstring *)&be_const_str_lv_draw_mask_radius_param_cfg, - (const bstring *)&be_const_str_AS608_TX, - (const bstring *)&be_const_str_PZEM016_RX, - (const bstring *)&be_const_str_IEM3000_RX, - NULL, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str_BL0940_RX, - (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, - (const bstring *)&be_const_str_char, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_SDS0X1_TX, - (const bstring *)&be_const_str_ILI9341_DC, - (const bstring *)&be_const_str_LOW, - NULL, - (const bstring *)&be_const_str_lv_draw_img_dsc, - NULL, - (const bstring *)&be_const_str_AZ_TXD, - (const bstring *)&be_const_str_PWM1_INV, - (const bstring *)&be_const_str_SYMBOL_UP, - (const bstring *)&be_const_str_SYMBOL_USB, - (const bstring *)&be_const_str_SDM120_RX, - (const bstring *)&be_const_str_NRF24_CS, - (const bstring *)&be_const_str_SYMBOL_NEW_LINE, - (const bstring *)&be_const_str_TELEINFO_RX, - NULL, - NULL, - (const bstring *)&be_const_str_TUYA_RX, (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_map, - (const bstring *)&be_const_str_SYMBOL_BATTERY_2, - (const bstring *)&be_const_str_lv_linemeter, - (const bstring *)&be_const_str_count, - NULL, - (const bstring *)&be_const_str_HRXL_RX, - (const bstring *)&be_const_str_content_button, - (const bstring *)&be_const_str_AudioGeneratorMP3, - NULL, - (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, - (const bstring *)&be_const_str_BUZZER, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str_exists, - (const bstring *)&be_const_str_DHT11_OUT, - (const bstring *)&be_const_str_SDM120_TX, - (const bstring *)&be_const_str_AS608_RX, - (const bstring *)&be_const_str_SENSOR_END, - NULL, - NULL, - (const bstring *)&be_const_str_I2S_IN_DATA, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_I2C_SDA, - (const bstring *)&be_const_str_ADC_RANGE, - (const bstring *)&be_const_str_FALLING, - (const bstring *)&be_const_str_SDS0X1_RX, - (const bstring *)&be_const_str_SYMBOL_CHARGE, - NULL, - NULL, - (const bstring *)&be_const_str_content_start, - NULL, - (const bstring *)&be_const_str_INPUT_PULLDOWN, - (const bstring *)&be_const_str_str, - (const bstring *)&be_const_str_SSD1351_DC, - (const bstring *)&be_const_str_montserrat_font, - (const bstring *)&be_const_str_SDM630_TX, - (const bstring *)&be_const_str_super, - (const bstring *)&be_const_str_SYMBOL_BATTERY_EMPTY, - NULL, - (const bstring *)&be_const_str_WE517_RX, - (const bstring *)&be_const_str_SOLAXX1_TX, - (const bstring *)&be_const_str_P9813_CLK, - (const bstring *)&be_const_str_A4988_ENA, - NULL, - (const bstring *)&be_const_str_cos, - (const bstring *)&be_const_str_module, + (const bstring *)&be_const_str_MCP39F5_RX, + (const bstring *)&be_const_str_codedump, + (const bstring *)&be_const_str_loop, + (const bstring *)&be_const_str_SYMBOL_AUDIO, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_PULLDOWN, + (const bstring *)&be_const_str_SI7021, + (const bstring *)&be_const_str_TX2X_TXD_BLACK, + (const bstring *)&be_const_str_arg_size, + (const bstring *)&be_const_str_PWM1, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_chars_in_string, + (const bstring *)&be_const_str_CSE7766_TX, (const bstring *)&be_const_str_HLW_CF, - (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_OPEN_DRAIN, - (const bstring *)&be_const_str_resize, - (const bstring *)&be_const_str_ADC_BUTTON, - (const bstring *)&be_const_str_A4988_MS1, - (const bstring *)&be_const_str_exec_rules, - (const bstring *)&be_const_str_I2S_OUT_DATA, - (const bstring *)&be_const_str_DSB, - (const bstring *)&be_const_str_SYMBOL_NEXT, - (const bstring *)&be_const_str_insert, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_SYMBOL_DUMMY, - (const bstring *)&be_const_str_cmd, - (const bstring *)&be_const_str_nil, - (const bstring *)&be_const_str_lv_slider, - (const bstring *)&be_const_str_SYMBOL_DRIVE, - (const bstring *)&be_const_str_DHT22, - (const bstring *)&be_const_str_INTERRUPT, + (const bstring *)&be_const_str__cb, + NULL, + NULL, + (const bstring *)&be_const_str_SPI_MISO, + NULL, + (const bstring *)&be_const_str_write, + (const bstring *)&be_const_str_KEY1_TC, + (const bstring *)&be_const_str_lv_point, + (const bstring *)&be_const_str_SBR_TX, + (const bstring *)&be_const_str_WEBCAM_HSD, (const bstring *)&be_const_str_AS3935, (const bstring *)&be_const_str_DEEPSLEEP, + (const bstring *)&be_const_str_BL0940_RX, + NULL, + NULL, + NULL, + (const bstring *)&be_const_str_REL1, + (const bstring *)&be_const_str_AS608_RX, + (const bstring *)&be_const_str_SYMBOL_DIRECTORY, + NULL, + (const bstring *)&be_const_str_ILI9341_CS, + (const bstring *)&be_const_str_WINDMETER_SPEED, + (const bstring *)&be_const_str_lv_obj, + (const bstring *)&be_const_str_ADC_BUTTON_INV, + (const bstring *)&be_const_str_millis, + (const bstring *)&be_const_str_DDS2382_TX, + (const bstring *)&be_const_str_NRF24_DC, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_set, + (const bstring *)&be_const_str_SYMBOL_EYE_OPEN, + (const bstring *)&be_const_str_SYMBOL_PASTE, + (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_delay, + (const bstring *)&be_const_str_ILI9488_CS, + (const bstring *)&be_const_str_format, + (const bstring *)&be_const_str_AZ_RXD, + (const bstring *)&be_const_str_WIEGAND_D1, + (const bstring *)&be_const_str_ZIGBEE_RST, + (const bstring *)&be_const_str_memory, + (const bstring *)&be_const_str_byte, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_SWT1_PD, + (const bstring *)&be_const_str_SYMBOL_CUT, + (const bstring *)&be_const_str_add_driver, + (const bstring *)&be_const_str_NEOPOOL_TX, + (const bstring *)&be_const_str_TM1637DIO, + (const bstring *)&be_const_str_SM16716_DAT, + (const bstring *)&be_const_str_SR04_TRIG, + (const bstring *)&be_const_str_BS814_CLK, + (const bstring *)&be_const_str_RXD, + (const bstring *)&be_const_str_lv_line, + (const bstring *)&be_const_str_assert, + (const bstring *)&be_const_str_RA8876_CS, + (const bstring *)&be_const_str_AZ_TXD, + NULL, + (const bstring *)&be_const_str_SYMBOL_BATTERY_1, + (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, + (const bstring *)&be_const_str_TCP_TX, + (const bstring *)&be_const_str_SYMBOL_CHARGE, (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_lv_switch, - (const bstring *)&be_const_str_KEY1_TC, + (const bstring *)&be_const_str_eth, + (const bstring *)&be_const_str_lv_draw_mask_radius_param_cfg, + NULL, + (const bstring *)&be_const_str_SYMBOL_IMAGE, + (const bstring *)&be_const_str_I2S_IN_CLK, + (const bstring *)&be_const_str_lv_area, + NULL, + (const bstring *)&be_const_str_EPAPER42_CS, + (const bstring *)&be_const_str_P9813_DAT, + (const bstring *)&be_const_str_HIGH, + NULL, + (const bstring *)&be_const_str_SYMBOL_LEFT, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_EPD_DATA, + (const bstring *)&be_const_str_HX711_DAT, + (const bstring *)&be_const_str_NONE, + (const bstring *)&be_const_str_SYMBOL_OK, + (const bstring *)&be_const_str_TASMOTACLIENT_RST, + (const bstring *)&be_const_str_SYMBOL_CLOSE, + (const bstring *)&be_const_str_HALLEFFECT, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_LED1_INV, + (const bstring *)&be_const_str_PZEM004_RX, + (const bstring *)&be_const_str_lv_page, + NULL, + (const bstring *)&be_const_str_LEDLNK, + (const bstring *)&be_const_str_TM1638DIO, + (const bstring *)&be_const_str_SYMBOL_BELL, + (const bstring *)&be_const_str_WEBCAM_RESET, + (const bstring *)&be_const_str_BOILER_OT_RX, + (const bstring *)&be_const_str_ADC_BUTTON, + (const bstring *)&be_const_str___upper__, + (const bstring *)&be_const_str_PN532_TXD, + (const bstring *)&be_const_str_ETH_PHY_MDC, + (const bstring *)&be_const_str_DDS2382_RX, + (const bstring *)&be_const_str_MAX31855CS, + (const bstring *)&be_const_str_DCKI, + (const bstring *)&be_const_str_LED1, + (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, + (const bstring *)&be_const_str_dot_p, + (const bstring *)&be_const_str_HX711_SCK, + (const bstring *)&be_const_str_floor, + (const bstring *)&be_const_str_AS608_TX, + NULL, + (const bstring *)&be_const_str_except, + (const bstring *)&be_const_str_A4988_STP, + NULL, + (const bstring *)&be_const_str_SM16716_CLK, + (const bstring *)&be_const_str_ARIRFRCV, + (const bstring *)&be_const_str_lv_dropdown, (const bstring *)&be_const_str_DDSU666_TX, - (const bstring *)&be_const_str_SI7021, - (const bstring *)&be_const_str_set_light, + (const bstring *)&be_const_str_MAX31855CLK, + (const bstring *)&be_const_str_SOLAXX1_TX, + (const bstring *)&be_const_str_redirect, + (const bstring *)&be_const_str_HM10_RX, + (const bstring *)&be_const_str_cb_dispatch, + (const bstring *)&be_const_str_TELEINFO_RX, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_SM2135_DAT, + (const bstring *)&be_const_str_BOILER_OT_TX, + (const bstring *)&be_const_str_GPS_TX, NULL, - (const bstring *)&be_const_str_SSPI_SCLK, - (const bstring *)&be_const_str_abs, - (const bstring *)&be_const_str_I2S_IN_SLCT, + NULL, + NULL, + (const bstring *)&be_const_str_SPI_CS, (const bstring *)&be_const_str_BS814_DAT, + (const bstring *)&be_const_str_wire2, + (const bstring *)&be_const_str_ctypes_bytes, + (const bstring *)&be_const_str_lv_draw_mask_line_param, + (const bstring *)&be_const_str_resize, + (const bstring *)&be_const_str_EPAPER29_CS, + (const bstring *)&be_const_str_input, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str_stop, NULL, - (const bstring *)&be_const_str_atan + (const bstring *)&be_const_str_content_send_style, + (const bstring *)&be_const_str_ILI9341_DC, + NULL, + (const bstring *)&be_const_str_ADE7953_IRQ, + NULL, + (const bstring *)&be_const_str_I2S_IN_DATA, + (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV, + (const bstring *)&be_const_str_SOLAXX1_RX, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_MHZ_TXD, + NULL, + (const bstring *)&be_const_str_SDCARD_CS, + (const bstring *)&be_const_str_HM10_TX, + (const bstring *)&be_const_str_TELEINFO_ENABLE, + (const bstring *)&be_const_str_BACKLIGHT, + (const bstring *)&be_const_str_OLED_RESET, + (const bstring *)&be_const_str_lv_list, + (const bstring *)&be_const_str_SENSOR_END, + (const bstring *)&be_const_str_addr, + (const bstring *)&be_const_str_RC522_RST, + (const bstring *)&be_const_str_Tasmota, + (const bstring *)&be_const_str_DYP_RX, + (const bstring *)&be_const_str_OUTPUT_HI, + (const bstring *)&be_const_str_KEY1, + (const bstring *)&be_const_str_ETH_PHY_MDIO, + (const bstring *)&be_const_str_EXS_ENABLE, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_ARIRFSEL, + (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_LMT01, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_WIEGAND_D0, + (const bstring *)&be_const_str_read32, + NULL, + NULL, + (const bstring *)&be_const_str_PULLUP, + (const bstring *)&be_const_str_OUTPUT, + (const bstring *)&be_const_str_CNTR1, + NULL, + (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, + (const bstring *)&be_const_str_IRSEND, + (const bstring *)&be_const_str_LE01MR_RX, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_I2S_IN_SLCT, + NULL, + (const bstring *)&be_const_str_begin, + NULL, + (const bstring *)&be_const_str_SYMBOL_LOOP, + (const bstring *)&be_const_str_collect, + (const bstring *)&be_const_str_A4988_ENA, + (const bstring *)&be_const_str_SM2135_CLK, + (const bstring *)&be_const_str_SYMBOL_FILE, + (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, + (const bstring *)&be_const_str_MAX7219CLK, + (const bstring *)&be_const_str_DHT22, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str_SYMBOL_BACKSPACE, + (const bstring *)&be_const_str_lv_textarea, + (const bstring *)&be_const_str_BUZZER, + NULL, + (const bstring *)&be_const_str_LEDLNK_INV, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_SYMBOL_PREV, + (const bstring *)&be_const_str_MAX31855DO, + (const bstring *)&be_const_str_lv_btnmatrix, + (const bstring *)&be_const_str_WEBCAM_SIOD, + (const bstring *)&be_const_str_KEY1_INV, + (const bstring *)&be_const_str_SYMBOL_PLAY, + (const bstring *)&be_const_str_get_free_heap, + (const bstring *)&be_const_str_FTC532, + (const bstring *)&be_const_str_ADC_RANGE, + (const bstring *)&be_const_str_SR04_ECHO, + (const bstring *)&be_const_str_SYMBOL_REFRESH, + (const bstring *)&be_const_str_SSD1351_CS, + (const bstring *)&be_const_str_HRE_DATA, + (const bstring *)&be_const_str_KEY1_PD, + (const bstring *)&be_const_str_ROT1B, + (const bstring *)&be_const_str_int, + (const bstring *)&be_const_str_HJL_CF, + (const bstring *)&be_const_str_ADC_TEMP, + (const bstring *)&be_const_str_SYMBOL_BATTERY_FULL, + NULL, + (const bstring *)&be_const_str_A4988_DIR, + NULL, + (const bstring *)&be_const_str_lv_draw_mask_fade_param_cfg, + NULL, + (const bstring *)&be_const_str_ADC_CT_POWER, + (const bstring *)&be_const_str_imin, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_opt_call, + NULL, + (const bstring *)&be_const_str__timers, + (const bstring *)&be_const_str_I2S_OUT_DATA, + (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_IBEACON_RX, + (const bstring *)&be_const_str_Wire, + (const bstring *)&be_const_str_MAX7219DIN, + NULL, + (const bstring *)&be_const_str_elif, + NULL, + NULL, + (const bstring *)&be_const_str_ADC_INPUT, + (const bstring *)&be_const_str_acos, + (const bstring *)&be_const_str_SSPI_DC, + (const bstring *)&be_const_str_SSPI_MOSI, + (const bstring *)&be_const_str_SYMBOL_DUMMY, + (const bstring *)&be_const_str_A4988_MS1, + (const bstring *)&be_const_str_MAX7219CS, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_item, + (const bstring *)&be_const_str_SAIR_TX, + (const bstring *)&be_const_str_asstring, + NULL, + (const bstring *)&be_const_str_I2C_SCL, + (const bstring *)&be_const_str_response_append, + NULL, + (const bstring *)&be_const_str_i2c_enabled, + NULL, + (const bstring *)&be_const_str_SYMBOL_COPY, + (const bstring *)&be_const_str_IEM3000_RX, + (const bstring *)&be_const_str_TM1637CLK, + (const bstring *)&be_const_str_opt_add, + NULL, + (const bstring *)&be_const_str_exec_rules, + (const bstring *)&be_const_str_NRG_SEL, + (const bstring *)&be_const_str_calldepth, + (const bstring *)&be_const_str_SYMBOL_EJECT, + (const bstring *)&be_const_str_CSE7761_RX, + (const bstring *)&be_const_str_DHT11, + NULL, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_RDM6300_RX, + (const bstring *)&be_const_str_resolvecmnd, + (const bstring *)&be_const_str_SPI_CLK, + NULL, + (const bstring *)&be_const_str_MIEL_HVAC_RX, + (const bstring *)&be_const_str_content_send, + (const bstring *)&be_const_str_SYMBOL_GPS, + (const bstring *)&be_const_str_CC1101_GDO0, + (const bstring *)&be_const_str_top, + (const bstring *)&be_const_str_CHANGE, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_add_cmd, + (const bstring *)&be_const_str_WEBCAM_PSRCS, + (const bstring *)&be_const_str_MP3_DFR562, + (const bstring *)&be_const_str_find, + (const bstring *)&be_const_str_CSE7766_RX, + (const bstring *)&be_const_str_lv_canvas, + (const bstring *)&be_const_str_lv_slider, + (const bstring *)&be_const_str_IEM3000_TX, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_CNTR1_NP, + (const bstring *)&be_const_str_MGC3130_RESET, + (const bstring *)&be_const_str_SYMBOL_DOWN, + (const bstring *)&be_const_str_opt_neq, + NULL, + (const bstring *)&be_const_str_SDM630_RX, + (const bstring *)&be_const_str_try, + (const bstring *)&be_const_str_return }; static const struct bconststrtab m_const_string_table = { - .size = 320, - .count = 640, + .size = 312, + .count = 624, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_draw_line.h b/lib/libesp32/Berry/generate/be_fixed_be_class_lv_draw_line.h deleted file mode 100644 index 834966f29..000000000 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_lv_draw_line.h +++ /dev/null @@ -1,20 +0,0 @@ -#include "be_constobj.h" - -static be_define_const_map_slots(be_class_lv_draw_line_map) { - { be_const_key(init, 2), be_const_func(lvbe_draw_line_create) }, - { be_const_key(tostring, -1), be_const_func(lvx_tostring) }, - { be_const_key(dot_p, -1), be_const_int(0) }, - { be_const_key(member, 0), be_const_func(lvx_member) }, -}; - -static be_define_const_map( - be_class_lv_draw_line_map, - 4 -); - -BE_EXPORT_VARIABLE be_define_const_class( - be_class_lv_draw_line, - 1, - NULL, - lv_draw_line -); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h deleted file mode 100644 index 19c71b1e0..000000000 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_driver.h +++ /dev/null @@ -1,32 +0,0 @@ -#include "be_constobj.h" - -static be_define_const_map_slots(be_class_tasmota_driver_map) { - { be_const_key(button_pressed, 6), be_const_index(0) }, - { be_const_key(web_add_management_button, -1), be_const_index(1) }, - { be_const_key(web_add_button, 13), be_const_index(2) }, - { be_const_key(web_add_config_button, -1), be_const_index(3) }, - { be_const_key(json_append, -1), be_const_index(4) }, - { be_const_key(display, 3), be_const_index(5) }, - { be_const_key(web_add_console_button, 14), be_const_index(6) }, - { be_const_key(every_100ms, -1), be_const_index(7) }, - { be_const_key(every_50ms, -1), be_const_index(8) }, - { be_const_key(every_second, -1), be_const_index(9) }, - { be_const_key(save_before_restart, -1), be_const_index(10) }, - { be_const_key(get_tasmota, -1), be_const_closure(get_tasmota_closure) }, - { be_const_key(web_sensor, 7), be_const_index(11) }, - { be_const_key(web_add_handler, 1), be_const_index(12) }, - { be_const_key(web_add_main_button, -1), be_const_index(13) }, - { be_const_key(add_cmd, -1), be_const_closure(add_cmd_closure) }, -}; - -static be_define_const_map( - be_class_tasmota_driver_map, - 16 -); - -BE_EXPORT_VARIABLE be_define_const_class( - be_class_tasmota_driver, - 14, - NULL, - Driver -); diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h index 9801aedbb..b28ffdabd 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota_i2c_driver.h @@ -22,6 +22,6 @@ static be_define_const_map( BE_EXPORT_VARIABLE be_define_const_class( be_class_tasmota_i2c_driver, 3, - (bclass *)&be_class_tasmota_driver, + (bclass *)&be_class_Driver, I2C_Driver ); From 0af33c903db08eb4a42a05db9b2c9b3fee9f8dc4 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 29 Jul 2021 09:33:39 +0200 Subject: [PATCH 051/148] Berry fix regression --- lib/libesp32/Berry/default/be_driverlib.c | 79 +++++++++++++++---- lib/libesp32/Berry/default/embedded/Driver.be | 4 + 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/lib/libesp32/Berry/default/be_driverlib.c b/lib/libesp32/Berry/default/be_driverlib.c index a81a11acc..6035a8736 100644 --- a/lib/libesp32/Berry/default/be_driverlib.c +++ b/lib/libesp32/Berry/default/be_driverlib.c @@ -6,6 +6,55 @@ *******************************************************************/ #include "be_constobj.h" +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(init, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + (be_nested_const_str("init", 380752755, 4)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_tasmota +********************************************************************/ +be_local_closure(get_tasmota, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + be_nested_string("tasmota", 424643812, 7), /* R256 - K0 */ + }), + (be_nested_const_str("get_tasmota", 334356779, 11)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[ 2]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 R256 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: add_cmd ********************************************************************/ @@ -70,22 +119,24 @@ be_local_closure(add_cmd, /* name */ be_local_class(Driver, 13, NULL, - be_nested_map(14, + be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { - { be_nested_key("web_add_handler", -304792334, 15, 2), be_const_index(2) }, - { be_nested_key("every_second", 2075451465, 12, -1), be_const_index(0) }, - { be_nested_key("web_add_button", -757092238, 14, -1), be_const_index(3) }, - { be_nested_key("web_add_config_button", 639674325, 21, 1), be_const_index(6) }, - { be_nested_key("every_100ms", 1546407804, 11, 0), be_const_index(1) }, - { be_nested_key("add_cmd", -933336417, 7, -1), be_const_closure(add_cmd_closure) }, - { be_nested_key("web_add_management_button", -1556090110, 25, 13), be_const_index(5) }, - { be_nested_key("display", 1164572437, 7, -1), be_const_index(12) }, - { be_nested_key("web_add_main_button", -334599632, 19, 9), be_const_index(4) }, - { be_nested_key("save_before_restart", 1253239338, 19, 11), be_const_index(8) }, - { be_nested_key("web_sensor", -1394870324, 10, 6), be_const_index(9) }, - { be_nested_key("button_pressed", 1694209616, 14, -1), be_const_index(11) }, - { be_nested_key("json_append", -1292948012, 11, -1), be_const_index(10) }, + { be_nested_key("web_add_main_button", -334599632, 19, 14), be_const_index(4) }, { be_nested_key("web_add_console_button", -813531104, 22, -1), be_const_index(7) }, + { be_nested_key("web_add_management_button", -1556090110, 25, 8), be_const_index(5) }, + { be_nested_key("init", 380752755, 4, -1), be_const_closure(init_closure) }, + { be_nested_key("json_append", -1292948012, 11, -1), be_const_index(10) }, + { be_nested_key("web_add_config_button", 639674325, 21, 7), be_const_index(6) }, + { be_nested_key("every_100ms", 1546407804, 11, -1), be_const_index(1) }, + { be_nested_key("display", 1164572437, 7, -1), be_const_index(12) }, + { be_nested_key("web_add_button", -757092238, 14, 13), be_const_index(3) }, + { be_nested_key("every_second", 2075451465, 12, -1), be_const_index(0) }, + { be_nested_key("save_before_restart", 1253239338, 19, -1), be_const_index(8) }, + { be_nested_key("get_tasmota", 334356779, 11, -1), be_const_closure(get_tasmota_closure) }, + { be_nested_key("web_sensor", -1394870324, 10, 6), be_const_index(9) }, + { be_nested_key("web_add_handler", -304792334, 15, -1), be_const_index(2) }, + { be_nested_key("button_pressed", 1694209616, 14, 1), be_const_index(11) }, + { be_nested_key("add_cmd", -933336417, 7, -1), be_const_closure(add_cmd_closure) }, })), (be_nested_const_str("Driver", -718580993, 6)) ); diff --git a/lib/libesp32/Berry/default/embedded/Driver.be b/lib/libesp32/Berry/default/embedded/Driver.be index d5079b1b3..d0782f024 100644 --- a/lib/libesp32/Berry/default/embedded/Driver.be +++ b/lib/libesp32/Berry/default/embedded/Driver.be @@ -19,6 +19,10 @@ class Driver def init() end + def get_tasmota() + return tasmota + end + def add_cmd(c, f) tasmota.add_cmd(c, / cmd, idx, payload, payload_json -> f(self, cmd, idx, payload, payload_json)) end From 0db37f7d36aba5ea9163f34c23ba5a2034e00398 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jul 2021 12:29:12 +0200 Subject: [PATCH 052/148] workflow_dispatch --- .github/workflows/Tasmota_build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index a67ae0bd8..ef0873a90 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1,8 +1,11 @@ name: Build_firmware on: + workflow_dispatch: # Manually start a workflow push: branches: development + paths-ignore: + - '.github/**' # Ignore changes towards the .github directory jobs: tasmota_pull: From 753bce9b8b96f4c730093056d0a2c6a94daaf908 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jul 2021 12:57:10 +0200 Subject: [PATCH 053/148] Build some firmwares with Win --- .github/workflows/Tasmota_build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index ef0873a90..03bac409b 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -9,7 +9,7 @@ on: jobs: tasmota_pull: - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 @@ -29,7 +29,7 @@ jobs: tasmota: needs: tasmota_pull - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 @@ -49,7 +49,7 @@ jobs: tasmota-minimal: needs: tasmota_pull - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 @@ -69,7 +69,7 @@ jobs: tasmota-lite: needs: tasmota_pull - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 @@ -89,7 +89,7 @@ jobs: tasmota-knx: needs: tasmota_pull - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 @@ -109,7 +109,7 @@ jobs: tasmota-sensors: needs: tasmota_pull - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 @@ -129,7 +129,7 @@ jobs: tasmota-display: needs: tasmota_pull - runs-on: ubuntu-latest + runs-on: windows-2019 continue-on-error: true steps: - uses: actions/checkout@v1 From 8a12588aabc28b3a56179e80f76c2914fbda2d13 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:58:09 +0200 Subject: [PATCH 054/148] Speed up checkout with using checkout@v2 --- .github/workflows/Tasmota_build.yml | 154 ++++++++++++++-------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 03bac409b..984273492 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -9,10 +9,10 @@ on: jobs: tasmota_pull: - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Use latest Tasmota development run: | git config --local user.name "Platformio BUILD" @@ -29,10 +29,10 @@ jobs: tasmota: needs: tasmota_pull - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -49,10 +49,10 @@ jobs: tasmota-minimal: needs: tasmota_pull - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -69,10 +69,10 @@ jobs: tasmota-lite: needs: tasmota_pull - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -89,10 +89,10 @@ jobs: tasmota-knx: needs: tasmota_pull - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -109,10 +109,10 @@ jobs: tasmota-sensors: needs: tasmota_pull - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -129,10 +129,10 @@ jobs: tasmota-display: needs: tasmota_pull - runs-on: windows-2019 + runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -152,7 +152,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -172,7 +172,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -192,7 +192,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -212,7 +212,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -232,7 +232,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -252,7 +252,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -272,7 +272,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -292,7 +292,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -312,7 +312,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -332,7 +332,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -352,7 +352,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -372,7 +372,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -392,7 +392,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -412,7 +412,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -432,7 +432,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -452,7 +452,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -472,7 +472,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -492,7 +492,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -512,7 +512,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -532,7 +532,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -552,7 +552,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -572,7 +572,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -592,7 +592,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -612,7 +612,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -632,7 +632,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -652,7 +652,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -672,7 +672,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -692,7 +692,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -712,7 +712,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -732,7 +732,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -752,7 +752,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -772,7 +772,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -792,7 +792,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -812,7 +812,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -832,7 +832,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -852,7 +852,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -872,7 +872,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -892,7 +892,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -912,7 +912,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -932,7 +932,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -952,7 +952,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -972,7 +972,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -992,7 +992,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1012,7 +1012,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1032,7 +1032,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1052,7 +1052,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1072,7 +1072,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1092,7 +1092,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1112,7 +1112,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1132,7 +1132,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1152,7 +1152,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1172,7 +1172,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1192,7 +1192,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1212,7 +1212,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1232,7 +1232,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1252,7 +1252,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1272,7 +1272,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1292,7 +1292,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1312,7 +1312,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1332,7 +1332,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1352,7 +1352,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1372,7 +1372,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1392,7 +1392,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Delete all files and folders run: | rm -rf * From 52b86eafe1db5ee670f3c3a5ae1896db3ae74922 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 29 Jul 2021 15:10:30 +0200 Subject: [PATCH 055/148] Add restart after multiple failed AP timeouts --- tasmota/support_wifi.ino | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index 6f61f41ab..c7c33291f 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -49,6 +49,7 @@ struct WIFI { uint8_t counter; uint8_t retry_init; uint8_t retry; + uint8_t max_retry; uint8_t status; uint8_t config_type = 0; uint8_t config_counter = 0; @@ -388,6 +389,7 @@ void WifiCheckIp(void) WifiSetState(1); Wifi.counter = WIFI_CHECK_SEC; Wifi.retry = Wifi.retry_init; + Wifi.max_retry = 0; if (Wifi.status != WL_CONNECTED) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CONNECTED)); // AddLog(LOG_LEVEL_INFO, PSTR("Wifi: Set IP addresses")); @@ -439,6 +441,10 @@ void WifiCheckIp(void) if (!Wifi.retry || ((Wifi.retry_init / 2) == Wifi.retry)) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CONNECT_FAILED_AP_TIMEOUT)); Settings->wifi_channel = 0; // Disable stored AP + Wifi.max_retry++; + if (100 == Wifi.max_retry) { // Restart after 100 * (WIFI_RETRY_OFFSET_SEC + MAC) / 2 seconds + TasmotaGlobal.restart_flag = 2; + } } else { if (!strlen(SettingsText(SET_STASSID1)) && !strlen(SettingsText(SET_STASSID2))) { Settings->wifi_channel = 0; // Disable stored AP @@ -584,6 +590,7 @@ void WifiConnect(void) Wifi.status = 0; Wifi.retry_init = WIFI_RETRY_OFFSET_SEC + (ESP_getChipId() & 0xF); // Add extra delay to stop overrun by simultanous re-connects Wifi.retry = Wifi.retry_init; + Wifi.max_retry = 0; Wifi.counter = 1; memcpy((void*) &Wifi.bssid, (void*) Settings->wifi_bssid, sizeof(Wifi.bssid)); From fa747a6576f51ea032879ce96a1fda960e7bf366 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jul 2021 15:22:43 +0200 Subject: [PATCH 056/148] Branch firmware needed --- .github/workflows/Tasmota_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 984273492..94e3d34c5 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1392,7 +1392,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v1 - name: Delete all files and folders run: | rm -rf * From 65b7034b0cc92a130a76a6dfb0b90b8b4574544e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 29 Jul 2021 16:57:04 +0200 Subject: [PATCH 057/148] Support for second DNS server --- CHANGELOG.md | 7 ++++++- RELEASENOTES.md | 4 +++- tasmota/my_user_config.h | 3 ++- tasmota/settings.h | 6 +++--- tasmota/settings.ino | 5 +++++ tasmota/support_command.ino | 8 ++++---- tasmota/support_wifi.ino | 3 ++- tasmota/tasmota_version.h | 2 +- tasmota/user_config_override_sample.h | 7 ++++++- tasmota/xdrv_01_webserver.ino | 3 ++- tasmota/xdrv_82_esp32_ethernet.ino | 1 + 11 files changed, 35 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c63f1363a..0db12e009 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [9.5.0.3] +## [9.5.0.4] +### Added +- Support for second DNS server + +## [9.5.0.3] 20210729 ### Added - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout (#12651) @@ -22,6 +26,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Discovery fails when using ``%hostname%`` in a topic (#12710) - ESP32-Solo OTA upgrade +- ESP32 buzzer in PWM mode exception (#12717) ## [9.5.0.2] 20210714 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4942198f2..1417e723d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -98,11 +98,12 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v9.5.0.3 +## Changelog v9.5.0.4 ### Added - Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota/) - Command ``SetOption127 1`` to force Wifi in no-sleep mode even if ``Sleep 0`` is not enabled - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver +- Support for second DNS server - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939) - Berry ESP32 partition manager [#12465](https://github.com/arendst/Tasmota/issues/12465) - Berry ESP32 support for I2S audio mp3 playback @@ -147,3 +148,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Wi-Fi initial setup workaround for 11n only routers [#12566](https://github.com/arendst/Tasmota/issues/12566) - ESP32 do not use chip temperature sensor as global temperature if external temperature sensor is used [#12630](https://github.com/arendst/Tasmota/issues/12630) - Discovery fails when using ``%hostname%`` in a topic [#12710](https://github.com/arendst/Tasmota/issues/12710) +- ESP32 buzzer in PWM mode exception (#12717)[#12717](https://github.com/arendst/Tasmota/issues/12717) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 16df7aa0a..e7d94b684 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -68,7 +68,8 @@ #define WIFI_IP_ADDRESS "0.0.0.0" // [IpAddress1] Set to 0.0.0.0 for using DHCP or enter a static IP address #define WIFI_GATEWAY "192.168.1.1" // [IpAddress2] If not using DHCP set Gateway IP address #define WIFI_SUBNETMASK "255.255.255.0" // [IpAddress3] If not using DHCP set Network mask -#define WIFI_DNS "192.168.1.1" // [IpAddress4] If not using DHCP set DNS IP address (might be equal to WIFI_GATEWAY) +#define WIFI_DNS "192.168.1.1" // [IpAddress4] If not using DHCP set DNS1 IP address (might be equal to WIFI_GATEWAY) +#define WIFI_DNS2 "0.0.0.0" // [IpAddress5] If not using DHCP set DNS2 IP address (might be equal to WIFI_GATEWAY) #define STA_SSID1 "" // [Ssid1] Wi-Fi SSID #define STA_PASS1 "" // [Password1] Wi-Fi password diff --git a/tasmota/settings.h b/tasmota/settings.h index 6ade9fc44..150e5558d 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -598,8 +598,7 @@ typedef struct { uint8_t ina219_mode; // 531 uint16_t pulse_timer[MAX_PULSETIMERS]; // 532 uint16_t button_debounce; // 542 - uint32_t ipv4_address[4]; // 544 - unsigned long energy_kWhtotal; // 554 + uint32_t ipv4_address[5]; // 544 uint8_t free_558[100]; // 558 @@ -737,10 +736,11 @@ typedef struct { uint16_t shd_warmup_brightness; // F5C uint8_t shd_warmup_time; // F5E - uint8_t free_f5f[65]; // F5F - Decrement if adding new Setting variables just above and below + uint8_t free_f5f[61]; // F5F - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below + unsigned long energy_kWhtotal; // F9C SBitfield1 sbflag1; // FA0 TeleinfoCfg teleinfo; // FA4 uint64_t rf_protocol_mask; // FA8 diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 177df024b..f751ede1d 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -859,6 +859,7 @@ void SettingsDefaultSet2(void) { ParseIPv4(&Settings->ipv4_address[1], PSTR(WIFI_GATEWAY)); ParseIPv4(&Settings->ipv4_address[2], PSTR(WIFI_SUBNETMASK)); ParseIPv4(&Settings->ipv4_address[3], PSTR(WIFI_DNS)); + ParseIPv4(&Settings->ipv4_address[4], PSTR(WIFI_DNS2)); Settings->sta_config = WIFI_CONFIG_TOOL; // Settings->sta_active = 0; SettingsUpdateText(SET_STASSID1, PSTR(STA_SSID1)); @@ -1376,6 +1377,10 @@ void SettingsDelta(void) { if (Settings->version < 0x09050003) { memset(&Settings->sensors, 0xFF, 16); // Enable all possible sensors } + if (Settings->version < 0x09050004) { + Settings->energy_kWhtotal = Settings->ipv4_address[4]; + ParseIPv4(&Settings->ipv4_address[4], PSTR(WIFI_DNS2)); + } Settings->version = VERSION; SettingsSave(1); diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index cad553579..253e5551c 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -567,10 +567,10 @@ void CmndStatus(void) if ((0 == payload) || (5 == payload)) { Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS5_NETWORK "\":{\"" D_CMND_HOSTNAME "\":\"%s\",\"" D_CMND_IPADDRESS "\":\"%_I\",\"" - D_JSON_GATEWAY "\":\"%_I\",\"" D_JSON_SUBNETMASK "\":\"%_I\",\"" D_JSON_DNSSERVER "\":\"%_I\",\"" + D_JSON_GATEWAY "\":\"%_I\",\"" D_JSON_SUBNETMASK "\":\"%_I\",\"" D_JSON_DNSSERVER "1\":\"%_I\",\"" D_JSON_DNSSERVER "2\":\"%_I\",\"" D_JSON_MAC "\":\"%s\",\"" D_CMND_WEBSERVER "\":%d,\"" D_CMND_WIFICONFIG "\":%d,\"" D_CMND_WIFIPOWER "\":%s}}"), NetworkHostname(), (uint32_t)NetworkAddress(), - Settings->ipv4_address[1], Settings->ipv4_address[2], Settings->ipv4_address[3], + Settings->ipv4_address[1], Settings->ipv4_address[2], Settings->ipv4_address[3], Settings->ipv4_address[4], NetworkMacAddress().c_str(), Settings->webserver, Settings->sta_config, WifiGetOutputPower().c_str()); CmndStatusResponse(5); } @@ -1642,12 +1642,12 @@ void CmndLogport(void) void CmndIpAddress(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { char network_address[22]; ext_snprintf_P(network_address, sizeof(network_address), PSTR(" (%_I)"), (uint32_t)NetworkAddress()); if (!XdrvMailbox.usridx) { ResponseClear(); - for (uint32_t i = 0; i < 4; i++) { + for (uint32_t i = 0; i < 5; i++) { ResponseAppend_P(PSTR("%c\"%s%d\":\"%_I%s\""), (i)?',':'{', XdrvMailbox.command, i +1, Settings->ipv4_address[i], (0 == i)?network_address:""); } ResponseJsonEnd(); diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index c7c33291f..4119b0f0e 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -207,7 +207,7 @@ void WifiBegin(uint8_t flag, uint8_t channel) Settings->sta_active ^= 1; // Skip empty SSID } if (Settings->ipv4_address[0]) { - WiFi.config(Settings->ipv4_address[0], Settings->ipv4_address[1], Settings->ipv4_address[2], Settings->ipv4_address[3]); // Set static IP + WiFi.config(Settings->ipv4_address[0], Settings->ipv4_address[1], Settings->ipv4_address[2], Settings->ipv4_address[3], Settings->ipv4_address[4]); // Set static IP } WiFi.hostname(TasmotaGlobal.hostname); // ESP8266 needs this here (after WiFi.mode) @@ -396,6 +396,7 @@ void WifiCheckIp(void) Settings->ipv4_address[1] = (uint32_t)WiFi.gatewayIP(); Settings->ipv4_address[2] = (uint32_t)WiFi.subnetMask(); Settings->ipv4_address[3] = (uint32_t)WiFi.dnsIP(); + Settings->ipv4_address[4] = (uint32_t)WiFi.dnsIP(1); // Save current AP parameters for quick reconnect Settings->wifi_channel = WiFi.channel(); diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index 0f02b3d91..d732eaef6 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x09050003; +const uint32_t VERSION = 0x09050004; #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/user_config_override_sample.h b/tasmota/user_config_override_sample.h index 3bfa1269f..896d050eb 100644 --- a/tasmota/user_config_override_sample.h +++ b/tasmota/user_config_override_sample.h @@ -79,7 +79,12 @@ Examples : #define WIFI_DNS MY_DNS // If not using DHCP set DNS IP address (might be equal to WIFI_GATEWAY) #endif -// !!! Remember that your changes GOES AT THE BOTTOM OF THIS FILE right before the last #endif !!! +#ifdef MY_DNS2 +#undef WIFI_DNS2 +#define WIFI_DNS2 MY_DNS2 // If not using DHCP set DNS IP address (might be equal to WIFI_GATEWAY) +#endif + +// !!! Remember that your changes GOES AT THE BOTTOM OF THIS FILE right before the last #endif !!! */ diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index c25c62f33..7041bda45 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2310,7 +2310,8 @@ void HandleInformation(void) if (!TasmotaGlobal.global_state.network_down) { WSContentSend_P(PSTR("}1" D_GATEWAY "}2%_I"), Settings->ipv4_address[1]); WSContentSend_P(PSTR("}1" D_SUBNET_MASK "}2%_I"), Settings->ipv4_address[2]); - WSContentSend_P(PSTR("}1" D_DNS_SERVER "}2%_I"), Settings->ipv4_address[3]); + WSContentSend_P(PSTR("}1" D_DNS_SERVER "1}2%_I"), Settings->ipv4_address[3]); + WSContentSend_P(PSTR("}1" D_DNS_SERVER "2}2%_I"), Settings->ipv4_address[4]); } if ((WiFi.getMode() >= WIFI_AP) && (static_cast(WiFi.softAPIP()) != 0)) { WSContentSend_P(PSTR("}1
}2
")); diff --git a/tasmota/xdrv_82_esp32_ethernet.ino b/tasmota/xdrv_82_esp32_ethernet.ino index b8bb1373b..d276ad7fd 100644 --- a/tasmota/xdrv_82_esp32_ethernet.ino +++ b/tasmota/xdrv_82_esp32_ethernet.ino @@ -100,6 +100,7 @@ void EthernetEvent(WiFiEvent_t event) { Settings->ipv4_address[1] = (uint32_t)ETH.gatewayIP(); Settings->ipv4_address[2] = (uint32_t)ETH.subnetMask(); Settings->ipv4_address[3] = (uint32_t)ETH.dnsIP(); + Settings->ipv4_address[4] = (uint32_t)ETH.dnsIP(1); TasmotaGlobal.global_state.eth_down = 0; break; case SYSTEM_EVENT_ETH_DISCONNECTED: From 3b5180d1e897c62de28b609a181bc5090b088608 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jul 2021 17:37:31 +0200 Subject: [PATCH 058/148] Checkout only needed branches --- .github/workflows/Tasmota_build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 94e3d34c5..fd2c6fe05 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -16,8 +16,9 @@ jobs: - name: Use latest Tasmota development run: | git config --local user.name "Platformio BUILD" + git config user.email github-actions@github.com git switch -c work - git remote add -f Tasmota "https://github.com/arendst/Tasmota.git" + git remote add -f Tasmota "https://github.com/arendst/Tasmota.git" --track development git merge Tasmota/development --allow-unrelated-histories - name: Push Tasmota # Push updates of latest Tasmota development to repo uses: ad-m/github-push-action@master @@ -1392,12 +1393,9 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 - - name: Delete all files and folders - run: | - rm -rf * - git config --local user.name "Platformio BUILD" - git checkout firmware + - uses: actions/checkout@v2 + with: + ref: firmware - name: Display files from branch firmware run: ls -R - name: Remove old firmware files @@ -1454,6 +1452,8 @@ jobs: run: ls -R ./* - name: Commit files # transfer the new binaries back into the repository run: | + git config user.name github-actions + git config user.email github-actions@github.com git rm -r --cached . git add -f ./* git commit -m "Tasmota ESP Binaries http://tasmota.com" From bbe3babe8b7a21ad270491add58f7fda4036c3a7 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 29 Jul 2021 19:58:23 +0200 Subject: [PATCH 059/148] Berry support for AES GCM and raw MQTT send/receive --- lib/libesp32/Berry/default/be_aes_gcm_lib.c | 44 + lib/libesp32/Berry/default/be_modtab.c | 4 + lib/libesp32/Berry/default/be_tasmotalib.c | 161 +- .../Berry/default/embedded/Tasmota.be | 4 +- lib/libesp32/Berry/generate/be_const_strtab.h | 1260 +++++------ .../Berry/generate/be_const_strtab_def.h | 1861 +++++++++-------- .../generate/be_fixed_be_class_aes_gcm.h | 22 + tasmota/xdrv_52_3_berry_aes_gcm.ino | 196 ++ tasmota/xdrv_52_3_berry_md5.ino | 3 +- tasmota/xdrv_52_3_berry_tasmota.ino | 20 +- tasmota/xdrv_52_9_berry.ino | 15 +- 11 files changed, 1946 insertions(+), 1644 deletions(-) create mode 100644 lib/libesp32/Berry/default/be_aes_gcm_lib.c create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_aes_gcm.h create mode 100644 tasmota/xdrv_52_3_berry_aes_gcm.ino diff --git a/lib/libesp32/Berry/default/be_aes_gcm_lib.c b/lib/libesp32/Berry/default/be_aes_gcm_lib.c new file mode 100644 index 000000000..3276cdd05 --- /dev/null +++ b/lib/libesp32/Berry/default/be_aes_gcm_lib.c @@ -0,0 +1,44 @@ +/******************************************************************** + * Berry module `webserver` + * + * To use: `import webserver` + * + * Allows to respond to HTTP request + *******************************************************************/ +#include "be_constobj.h" + +#ifdef USE_ALEXA_AVS + +extern int m_aes_gcm_init(bvm *vm); +extern int m_aes_gcm_encryt(bvm *vm); +extern int m_aes_gcm_decryt(bvm *vm); +extern int m_aes_gcm_tag(bvm *vm); + +#if BE_USE_PRECOMPILED_OBJECT +#include "../generate/be_fixed_be_class_aes_gcm.h" +#endif + +void be_load_aes_gcm_lib(bvm *vm) { + // insert the class GCM in module AES + be_newmodule(vm); + be_setname(vm, -1, "AES"); + be_setglobal(vm, "AES"); + + be_pushntvclass(vm, &be_class_aes_gcm); + be_setmember(vm, -2, "GCM"); + be_pop(vm, 2); +} +/* @const_object_info_begin + +class be_class_aes_gcm (scope: global, name: GCM) { + .p1, var + .p2, var + + init, func(m_aes_gcm_init) + encrypt, func(m_aes_gcm_encryt) + decrypt, func(m_aes_gcm_decryt) + tag, func(m_aes_gcm_tag) +} +@const_object_info_end */ + +#endif // USE_ALEXA_AVS diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index 99c493793..b84559548 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -103,6 +103,7 @@ extern void be_load_wirelib(bvm *vm); extern void be_load_Driver_class(bvm *vm); extern void be_load_driver_i2c_lib(bvm *vm); extern void be_load_md5_lib(bvm *vm); +extern void be_load_aes_gcm_lib(bvm *vm); #ifdef USE_I2S_AUDIO_BERRY extern void be_load_driver_audio_lib(bvm *vm); @@ -133,6 +134,9 @@ BERRY_API void be_load_custom_libs(bvm *vm) be_load_tasmota_ntvlib(vm); be_load_Driver_class(vm); be_load_md5_lib(vm); +#ifdef USE_ALEXA_AVS + be_load_aes_gcm_lib(vm); +#endif #ifdef USE_I2C be_load_wirelib(vm); be_load_driver_i2c_lib(vm); diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index ddc45090f..f14657f33 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -1364,8 +1364,8 @@ be_local_closure(gc, /* name */ ********************************************************************/ be_local_closure(event, /* name */ be_nested_proto( - 18, /* nstack */ - 5, /* argc */ + 19, /* nstack */ + 6, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ @@ -1390,85 +1390,86 @@ be_local_closure(event, /* name */ }), (be_nested_const_str("event", -30355297, 5)), (be_nested_const_str("input", -103256197, 5)), - ( &(const binstruction[78]) { /* code */ - 0xA4160000, // 0000 IMPORT R5 R256 - 0x1C180301, // 0001 EQ R6 R1 R257 - 0x781A0001, // 0002 JMPF R6 #0005 - 0x8C180102, // 0003 GETMET R6 R0 R258 - 0x7C180200, // 0004 CALL R6 1 - 0x1C180303, // 0005 EQ R6 R1 R259 - 0x781A0006, // 0006 JMPF R6 #000E - 0x8C180104, // 0007 GETMET R6 R0 R260 - 0x5C200400, // 0008 MOVE R8 R2 - 0x5C240600, // 0009 MOVE R9 R3 - 0x5C280800, // 000A MOVE R10 R4 - 0x7C180800, // 000B CALL R6 4 - 0x80040C00, // 000C RET 1 R6 - 0x7002003E, // 000D JMP #004D - 0x1C180305, // 000E EQ R6 R1 R261 - 0x781A0004, // 000F JMPF R6 #0015 - 0x8C180106, // 0010 GETMET R6 R0 R262 - 0x5C200800, // 0011 MOVE R8 R4 - 0x7C180400, // 0012 CALL R6 2 - 0x80040C00, // 0013 RET 1 R6 - 0x70020037, // 0014 JMP #004D - 0x1C180307, // 0015 EQ R6 R1 R263 - 0x781A0003, // 0016 JMPF R6 #001B - 0x8C180107, // 0017 GETMET R6 R0 R263 - 0x7C180200, // 0018 CALL R6 1 - 0x80040C00, // 0019 RET 1 R6 - 0x70020031, // 001A JMP #004D - 0x88180108, // 001B GETMBR R6 R0 R264 - 0x781A002F, // 001C JMPF R6 #004D - 0x60180000, // 001D GETGBL R6 G0 - 0x881C0108, // 001E GETMBR R7 R0 R264 - 0x7C180200, // 001F CALL R6 1 - 0xA8020026, // 0020 EXBLK 0 #0048 - 0x5C1C0C00, // 0021 MOVE R7 R6 - 0x7C1C0000, // 0022 CALL R7 0 - 0x8C200B09, // 0023 GETMET R8 R5 R265 - 0x5C280E00, // 0024 MOVE R10 R7 - 0x5C2C0200, // 0025 MOVE R11 R1 - 0x7C200600, // 0026 CALL R8 3 - 0x60240015, // 0027 GETGBL R9 G21 - 0x5C281000, // 0028 MOVE R10 R8 - 0x7C240200, // 0029 CALL R9 1 - 0x1C24130A, // 002A EQ R9 R9 R266 - 0x7826001A, // 002B JMPF R9 #0047 - 0xA802000D, // 002C EXBLK 0 #003B - 0x5C241000, // 002D MOVE R9 R8 - 0x5C280E00, // 002E MOVE R10 R7 - 0x5C2C0400, // 002F MOVE R11 R2 - 0x5C300600, // 0030 MOVE R12 R3 - 0x5C340800, // 0031 MOVE R13 R4 - 0x7C240800, // 0032 CALL R9 4 - 0x50280200, // 0033 LDBOOL R10 1 0 - 0x1C28120A, // 0034 EQ R10 R9 R10 - 0x782A0002, // 0035 JMPF R10 #0039 - 0x50280200, // 0036 LDBOOL R10 1 0 - 0xA8040002, // 0037 EXBLK 1 2 - 0x80041400, // 0038 RET 1 R10 - 0xA8040001, // 0039 EXBLK 1 1 - 0x7002000B, // 003A JMP #0047 - 0xAC240002, // 003B CATCH R9 0 2 - 0x70020008, // 003C JMP #0046 - 0xA42E1600, // 003D IMPORT R11 R267 - 0x6030000F, // 003E GETGBL R12 G15 - 0x8C34170C, // 003F GETMET R13 R11 R268 - 0x583C000D, // 0040 LDCONST R15 K13 - 0x5C401200, // 0041 MOVE R16 R9 + ( &(const binstruction[79]) { /* code */ + 0xA41A0000, // 0000 IMPORT R6 R256 + 0x1C1C0301, // 0001 EQ R7 R1 R257 + 0x781E0001, // 0002 JMPF R7 #0005 + 0x8C1C0102, // 0003 GETMET R7 R0 R258 + 0x7C1C0200, // 0004 CALL R7 1 + 0x1C1C0303, // 0005 EQ R7 R1 R259 + 0x781E0006, // 0006 JMPF R7 #000E + 0x8C1C0104, // 0007 GETMET R7 R0 R260 + 0x5C240400, // 0008 MOVE R9 R2 + 0x5C280600, // 0009 MOVE R10 R3 + 0x5C2C0800, // 000A MOVE R11 R4 + 0x7C1C0800, // 000B CALL R7 4 + 0x80040E00, // 000C RET 1 R7 + 0x7002003F, // 000D JMP #004E + 0x1C1C0305, // 000E EQ R7 R1 R261 + 0x781E0004, // 000F JMPF R7 #0015 + 0x8C1C0106, // 0010 GETMET R7 R0 R262 + 0x5C240800, // 0011 MOVE R9 R4 + 0x7C1C0400, // 0012 CALL R7 2 + 0x80040E00, // 0013 RET 1 R7 + 0x70020038, // 0014 JMP #004E + 0x1C1C0307, // 0015 EQ R7 R1 R263 + 0x781E0003, // 0016 JMPF R7 #001B + 0x8C1C0107, // 0017 GETMET R7 R0 R263 + 0x7C1C0200, // 0018 CALL R7 1 + 0x80040E00, // 0019 RET 1 R7 + 0x70020032, // 001A JMP #004E + 0x881C0108, // 001B GETMBR R7 R0 R264 + 0x781E0030, // 001C JMPF R7 #004E + 0x601C0000, // 001D GETGBL R7 G0 + 0x88200108, // 001E GETMBR R8 R0 R264 + 0x7C1C0200, // 001F CALL R7 1 + 0xA8020027, // 0020 EXBLK 0 #0049 + 0x5C200E00, // 0021 MOVE R8 R7 + 0x7C200000, // 0022 CALL R8 0 + 0x8C240D09, // 0023 GETMET R9 R6 R265 + 0x5C2C1000, // 0024 MOVE R11 R8 + 0x5C300200, // 0025 MOVE R12 R1 + 0x7C240600, // 0026 CALL R9 3 + 0x60280015, // 0027 GETGBL R10 G21 + 0x5C2C1200, // 0028 MOVE R11 R9 + 0x7C280200, // 0029 CALL R10 1 + 0x1C28150A, // 002A EQ R10 R10 R266 + 0x782A001B, // 002B JMPF R10 #0048 + 0xA802000E, // 002C EXBLK 0 #003C + 0x5C281200, // 002D MOVE R10 R9 + 0x5C2C1000, // 002E MOVE R11 R8 + 0x5C300400, // 002F MOVE R12 R2 + 0x5C340600, // 0030 MOVE R13 R3 + 0x5C380800, // 0031 MOVE R14 R4 + 0x5C3C0A00, // 0032 MOVE R15 R5 + 0x7C280A00, // 0033 CALL R10 5 + 0x502C0200, // 0034 LDBOOL R11 1 0 + 0x1C2C140B, // 0035 EQ R11 R10 R11 + 0x782E0002, // 0036 JMPF R11 #003A + 0x502C0200, // 0037 LDBOOL R11 1 0 + 0xA8040002, // 0038 EXBLK 1 2 + 0x80041600, // 0039 RET 1 R11 + 0xA8040001, // 003A EXBLK 1 1 + 0x7002000B, // 003B JMP #0048 + 0xAC280002, // 003C CATCH R10 0 2 + 0x70020008, // 003D JMP #0047 + 0xA4321600, // 003E IMPORT R12 R267 + 0x6034000F, // 003F GETGBL R13 G15 + 0x8C38190C, // 0040 GETMET R14 R12 R268 + 0x5840000D, // 0041 LDCONST R16 K13 0x5C441400, // 0042 MOVE R17 R10 - 0x7C340800, // 0043 CALL R13 4 - 0x7C300200, // 0044 CALL R12 1 - 0x70020000, // 0045 JMP #0047 - 0xB0080000, // 0046 RAISE 2 R0 R0 - 0x7001FFD8, // 0047 JMP #0021 - 0x5818000E, // 0048 LDCONST R6 K14 - 0xAC180200, // 0049 CATCH R6 1 0 - 0xB0080000, // 004A RAISE 2 R0 R0 - 0x50180000, // 004B LDBOOL R6 0 0 - 0x80040C00, // 004C RET 1 R6 - 0x80000000, // 004D RET 0 R0 + 0x5C481600, // 0043 MOVE R18 R11 + 0x7C380800, // 0044 CALL R14 4 + 0x7C340200, // 0045 CALL R13 1 + 0x70020000, // 0046 JMP #0048 + 0xB0080000, // 0047 RAISE 2 R0 R0 + 0x7001FFD7, // 0048 JMP #0021 + 0x581C000E, // 0049 LDCONST R7 K14 + 0xAC1C0200, // 004A CATCH R7 1 0 + 0xB0080000, // 004B RAISE 2 R0 R0 + 0x501C0000, // 004C LDBOOL R7 0 0 + 0x80040E00, // 004D RET 1 R7 + 0x80000000, // 004E RET 0 R0 }) ) ); diff --git a/lib/libesp32/Berry/default/embedded/Tasmota.be b/lib/libesp32/Berry/default/embedded/Tasmota.be index fab2ed290..7b36f6caf 100644 --- a/lib/libesp32/Berry/default/embedded/Tasmota.be +++ b/lib/libesp32/Berry/default/embedded/Tasmota.be @@ -241,7 +241,7 @@ class Tasmota end - def event(event_type, cmd, idx, payload) + def event(event_type, cmd, idx, payload, raw) import introspect if event_type=='every_50ms' self.run_deferred() end #- first run deferred events -# @@ -253,7 +253,7 @@ class Tasmota var f = introspect.get(d, event_type) # try to match a function or method with the same name if type(f) == 'function' try - var done = f(d, cmd, idx, payload) + var done = f(d, cmd, idx, payload, raw) if done == true return true end except .. as e,m import string diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 94df1b34e..9f6673837 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,646 +1,652 @@ extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_I2S_OUT_CLK; -extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_HLW_CF; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_BL0940_RX; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_ILI9341_CS; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_I2C_SDA; -extern const bcstring be_const_str_SYMBOL_BULLET; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_AZ_RXD; -extern const bcstring be_const_str_SDM630_TX; -extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_WIEGAND_D1; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_SWT1_PD; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_TM1637DIO; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_push; extern const bcstring be_const_str_SR04_TRIG; extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_lv_draw_mask_radius_param; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_wifi; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_SYMBOL_CHARGE; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_eth; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_I2S_IN_CLK; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_TASMOTACLIENT_RXD; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_WE517_RX; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_HPMA_TX; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_I2S_OUT_SLCT; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_PN532_RXD; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_PWM1_INV; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_BOILER_OT_TX; -extern const bcstring be_const_str_lv_draw_mask_saved; -extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_toint; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_ROT1A; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_I2S_IN_DATA; -extern const bcstring be_const_str_RC522_CS; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_KEY1_INV_PD; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str_lv_sqrt_res; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_WEBCAM_XCLK; -extern const bcstring be_const_str_lv_gauge_format_cb; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_INTERRUPT; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_REL1_INV; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_GPS_RX; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_WEBCAM_SIOC; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_isrunning; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_millis; extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_I2S_IN_SLCT; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_def; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_SYMBOL_REFRESH; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_KEY1_TC; +extern const bcstring be_const_str_ADC_BUTTON; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str_lv_tileview; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str_TASMOTACLIENT_RST; +extern const bcstring be_const_str_add_cmd; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_SENSOR_END; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_GCM; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_seg7_font; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_SYMBOL_SETTINGS; extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_MAX7219CLK; -extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_SDM72_RX; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_CSE7766_TX; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_SYMBOL_AUDIO; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str_MD5; +extern const bcstring be_const_str_reverse_gamma10; +extern const bcstring be_const_str_add_rule; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_elif; extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_members; +extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str_allocated; extern const bcstring be_const_str_has_arg; extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_HX711_SCK; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_SDM630_TX; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_TXD; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_RDM6300_RX; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_AZ_RXD; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str_chars_in_string; +extern const bcstring be_const_str_publish_result; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_NRG_CF1; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_REL1; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_SYMBOL_EJECT; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_BUZZER_INV; +extern const bcstring be_const_str_CNTR1; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_I2S_OUT_CLK; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str___lower__; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_issubclass; extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str__rules; extern const bcstring be_const_str_bytes; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_tostring; +extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; +extern const bcstring be_const_str_lv_img; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_SWT1_PD; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_I2C_Driver; +extern const bcstring be_const_str_MIEL_HVAC_TX; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_SYMBOL_PAUSE; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_class; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_SYMBOL_BATTERY_3; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_lv_draw_label_dsc; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_SWT1_NP; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_lv_line; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_exec_rules; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str__ccmd; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_close; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_SDM72_TX; +extern const bcstring be_const_str_AS3935; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_encrypt; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_item; +extern const bcstring be_const_str_lv_slider; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str_DDS2382_TX; +extern const bcstring be_const_str_lv_gauge_format_cb; extern const bcstring be_const_str_lv_signal_cb; extern const bcstring be_const_str_update; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_HRE_DATA; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_KEY1_PD; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_ADC_TEMP; -extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_wifi; +extern const bcstring be_const_str_KEY1; extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_ZEROCROSS; -extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_SYMBOL_CHARGE; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_read12; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_MAX31855DO; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_remove_cmd; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_web_send; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_wire1; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_LEDLNK_INV; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_dot_p2; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_cmd; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str_SSD1351_DC; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_BUZZER; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_WEBCAM_SIOD; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_SYMBOL_RIGHT; +extern const bcstring be_const_str_DI; extern const bcstring be_const_str_SM16716_SEL; extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_members; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_I2S_OUT_DATA; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_MAX7219DIN; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_SSPI_DC; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_I2C_SCL; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str_SYMBOL_NEXT; -extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_TM1637CLK; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_publish_result; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_lv_cb; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_content_send; extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_close; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_loop; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str_get_light; extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_CNTR1_NP; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_MGC3130_RESET; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_HX711_DAT; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_pop; extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_SDM72_TX; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_try; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_SYMBOL_USB; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str_TELEINFO_ENABLE; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_SSD1351_CS; +extern const bcstring be_const_str_setbits; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str__buffer; +extern const bcstring be_const_str_AZ_TXD; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str_find_key_i; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_arg_size; +extern const bcstring be_const_str_AudioGeneratorMP3; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_eth; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_decrypt; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str_tag; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_assert; extern const bcstring be_const_str_return; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str_lv_dropdown; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_SYMBOL_LEFT; +extern const bcstring be_const_str_SI7021; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_SYMBOL_OK; +extern const bcstring be_const_str_get; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_size; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_wire2; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_PWM1; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_screenshot; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_dot_p1; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_toint; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_MGC3130_RESET; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_SYMBOL_WIFI; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_SYMBOL_SHUFFLE; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_AudioFileSourceFS; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_SYMBOL_MUTE; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_CNTR1_NP; +extern const bcstring be_const_str_GPS_TX; +extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_NRG_SEL_INV; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index 663da014c..7aa7d626d 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,967 +1,976 @@ -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, NULL); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_SYMBOL_VIDEO); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, &be_const_str_WE517_TX); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, NULL); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_SYMBOL_BLUETOOTH); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_classname); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); -be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_NRG_CF1); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_try_rule); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_gamma8); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_resp_cmnd_error); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, &be_const_str__buffer); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_exp); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_get_option); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, NULL); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, NULL); -be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SYMBOL_SHUFFLE); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_wire1); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_SYMBOL_VOLUME_MAX); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_erase); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_tostring); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str___lower__); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, NULL); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_geti); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_SYMBOL_BATTERY_3); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_SPI_DC); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_lv_draw_rect_dsc); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_lv_draw_mask_line_param_cfg); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_NEOPOOL_RX); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, NULL); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_content_flush); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_SDM120_TX); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, &be_const_str_SYMBOL_SETTINGS); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_SYMBOL_UP); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_attrdump); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, NULL); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_INPUT); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SYMBOL_MUTE); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, NULL); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_PZEM017_RX); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_lv_calendar); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, NULL); -be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_get_light); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_lv_draw_mask_fade_param); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, NULL); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_SYMBOL_BULLET); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, &be_const_str_TM1638CLK); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_rand); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_SYMBOL_SAVE); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_start); -be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_LOW); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_RFRECV); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_call); -be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, NULL); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SDM630_TX); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_SDM72_RX); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_cmd); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_content_start); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_seti); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_iter); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_load_freetype_font); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); -be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, NULL); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_finish); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, NULL); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_lv_tileview); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_find_key_i); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_pin_mode); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_pin); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_HIGH); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_SYMBOL_IMAGE); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_content_stop); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_VL53L0X_XSHUT1); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str___iterator__); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_event); -be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_ROT1B_NP); -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_deinit); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, NULL); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, NULL); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_read); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, &be_const_str_wifi); -be_define_const_str(wifi, "wifi", 120087624u, 0, 4, &be_const_str_write_bytes); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_SWT1_NP); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, NULL); -be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, NULL); -be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_PZEM0XX_TX); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_fromstring); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_set_light); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_seg7_font); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_getbits); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_WEBCAM_DATA); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_lv_style); -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_atan); -be_define_const_str(atan, "atan", 108579519u, 0, 4, NULL); -be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_find_op); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, NULL); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_resp_cmnd_failed); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_RFSEND); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_TASMOTACLIENT_TXD); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_concat); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_TASMOTACLIENT_RXD); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_while); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_WE517_RX); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_gc); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_HPMA_TX); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_log10); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, NULL); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_SDS0X1_RX); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, NULL); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_clear); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_SSPI_MISO); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_lv_led); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, NULL); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_lv_label); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_SYMBOL_WIFI); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_setbits); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_digital_read); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_bus); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_imax); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_montserrat_font); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_lv_cpicker); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, NULL); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_cos); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_I2S_OUT_SLCT); -be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_set_timer); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_DSB); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_HPMA_RX); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_PN532_RXD); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, NULL); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_MHZ_RXD); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_PZEM016_RX); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_gen_cb); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, NULL); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, NULL); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, NULL); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_arg_name); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_member); -be_define_const_str(member, "member", 719708611u, 0, 6, NULL); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, NULL); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_module); -be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_read_bytes); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, &be_const_str_type); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_WEBCAM_VSYNC); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, NULL); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str__drivers); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str__write); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_init); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_split); -be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_raise); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_ETH_PHY_POWER); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_INPUT_PULLUP); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_MIEL_HVAC_TX); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_PWM1_INV); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_WEBCAM_PWDN); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_ROT1A_NP); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_content_stop); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_read8); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str__begin_transmission); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_remove_rule); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_setrange); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_tolower); -be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_WS2812); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_end); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_digital_write); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_time_dump); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_lv_draw_mask_common_dsc); -be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_SPI_MOSI); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_lv_msgbox); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_lv_draw_mask_saved); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, NULL); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_ZIGBEE_TX); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, NULL); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_SYMBOL_PAUSE); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_set_power); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, &be_const_str_toint); -be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, &be_const_str_for); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_KEY1_INV_NP); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, NULL); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_lv_linemeter); -be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_PROJECTOR_CTRL_RX); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_ROT1A); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, NULL); -be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_lv_arc); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_publish); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_PMS5003_RX); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_ST7789_CS); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, NULL); -be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_RC522_CS); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_count); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_group_focus_cb); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, &be_const_str_lv_switch); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_write_bit); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str__available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, NULL); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_FALLING); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_KEY1_INV_PD); -be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SWT1); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, NULL); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, NULL); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str_lv_sqrt_res); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_cosh); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_lv_draw_mask_map_param_cfg); -be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, NULL); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_IRRECV); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_KEY1_NP); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_ZIGBEE_RX); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str__read); -be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_lv_indev); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str_millis); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_lv_indev); be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SDS0X1_TX); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SYMBOL_UPLOAD); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_TCP_RX); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_dump); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_ST7789_DC); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_TFMINIPLUS_TX); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_WEBCAM_XCLK); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_lv_gauge_format_cb); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_lv_objmask); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_detect); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_lv_table); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_SYMBOL_REFRESH); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_redirect); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_response_append); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_SWT1); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_SYMBOL_BLUETOOTH); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, NULL); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_SYMBOL_PREV); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, NULL); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_lv_table); be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_lv_spinner); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_SYMBOL_WARNING); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_SYMBOL_KEYBOARD); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_add_rule); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_INTERRUPT); -be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, NULL); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_IBEACON_TX); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_map); -be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_REL1_INV); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_SYMBOL_SD_CARD); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, NULL); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_real); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_SYMBOL_PLUS); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, NULL); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_WEBCAM_SIOC); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, NULL); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_RF_SENSOR); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_copy); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_isrunning); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_SYMBOL_HOME); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_lv_bar); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_SYMBOL_BACKSPACE); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_TX2X_TXD_BLACK); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_OUTPUT_HI); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_SYMBOL_DRIVE); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, NULL); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_write); +be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, NULL); be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_OPEN_DRAIN); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_SAIR_RX); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_lv_draw_mask_angle_param); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_SSPI_SCLK); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_SSPI_CS); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, NULL); -be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_SHELLY_DIMMER_BOOT0); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str__request_from); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_add); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_super); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, &be_const_str_run_deferred); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_NRF24_CS); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_SYMBOL_BATTERY_2); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, NULL); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_write8); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_def); -be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_exists); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_as); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_yield); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_SSD1331_CS); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_TASMOTACLIENT_RST); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, NULL); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, NULL); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SBR_TX); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_pin_mode); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MAX31855CS); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_P9813_CLK); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_SYMBOL_WARNING); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_lv_area); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_split); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_SENSOR_END); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_TFMINIPLUS_TX); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_content_send_style); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, NULL); +be_define_const_str(GCM, "GCM", 3790320054u, 0, 3, &be_const_str_INPUT_PULLUP); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_read); +be_define_const_str(read, "read", 3470762949u, 0, 4, &be_const_str_seg7_font); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_ST7789_DC); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_SYMBOL_SETTINGS); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_TASMOTACLIENT_RST_INV); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_add); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_read32); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_lv_msgbox); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_ILI9488_CS); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_SHELLY_DIMMER_RST_INV); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_SYMBOL_TRASH); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, NULL); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_copy); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_lv_keyboard); +be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_SDM72_RX); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_SYMBOL_DOWN); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_gamma8); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_SHELLY_DIMMER_BOOT0); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_SYMBOL_AUDIO); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_try); +be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, NULL); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, NULL); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_OUTPUT); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SYMBOL_NEW_LINE); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_TELEINFO_RX); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, NULL); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, NULL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, NULL); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SDS0X1_RX); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_WIEGAND_D1); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_ZIGBEE_RX); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_finish); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_resp_cmnd_error); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_WEBCAM_PSRCS); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_digital_write); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_lv_spinbox); +be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_elif); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_set_power); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_content_send); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_iter); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_SYMBOL_BATTERY_FULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_lv_checkbox); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_SYMBOL_BATTERY_2); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, NULL); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_P9813_DAT); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_TM1637CLK); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str__cb); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_RXD); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SSPI_SCLK); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_yield); be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_upper); -be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_OUTPUT_LO); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_has_arg); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_MIEL_HVAC_RX); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, NULL); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_read8); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(members, "members", 937576464u, 0, 7, NULL); +be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_DCKI); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, NULL); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_MHZ_RXD); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str__cmd); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_lv_page); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, &be_const_str_resp_cmnd_failed); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_save); +be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_has_arg); be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_web_send); -be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, &be_const_str_wire_scan); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_TM1638STB); -be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_static); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_true); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_DI); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SYMBOL_CALL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_SYMBOL_MINUS); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, NULL); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, &be_const_str_content_button); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_get); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_SYMBOL_RIGHT); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, NULL); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str_bytes); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_lv_signal_cb); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_SOLAXX1_RX); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ETH_PHY_MDC); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_KEY1_NP); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_find_op); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_member); +be_define_const_str(member, "member", 719708611u, 0, 6, NULL); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_load_freetype_font); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_KEY1_INV_PD); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_TXD); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, NULL); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_WEBCAM_SIOC); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_ctypes_bytes); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SYMBOL_DIRECTORY); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str__begin_transmission); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_deg); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str_chars_in_string); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_publish_result); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_module); +be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_state); +be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, NULL); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_NRG_CF1); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, NULL); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_montserrat_font); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_ZEROCROSS); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_set); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_IBEACON_RX); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str__write); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, NULL); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, NULL); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_lv_chart); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_publish); +be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str_CNTR1); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_SPI_MISO); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_SYMBOL_DOWNLOAD); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, NULL); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_INPUT); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_lv_draw_img_dsc); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_type); +be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_detect); +be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_input); +be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_issubclass); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str__rules); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_bytes); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_lv_sqrt_res); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, &be_const_str_tostring); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, &be_const_str_lv_img); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, NULL); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, &be_const_str_MAX7219CS); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_I2S_IN_SLCT); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_PULLUP); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_range); +be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, NULL); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); +be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_SYMBOL_BULLET); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, NULL); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_WEBCAM_PCLK); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_WIEGAND_D0); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_delay); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, NULL); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_SYMBOL_STOP); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_write_bytes); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, NULL); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_cosh); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_get_free_heap); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_set_light); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, NULL); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_SYMBOL_KEYBOARD); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_lv_btnmatrix); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, &be_const_str_class); +be_define_const_str(class, "class", 2872970239u, 57, 5, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, NULL); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_SYMBOL_BATTERY_3); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_lv_label); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_SYMBOL_SD_CARD); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_WEBCAM_HSD); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_WINDMETER_SPEED); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_lv_bar); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_line); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_tolower); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_lv_cpicker); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, &be_const_str_start); +be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_concat); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_exec_rules); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_write8); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_asstring); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_lv_linemeter); +be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, &be_const_str_lv_switch); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_number); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_read_bytes); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, NULL); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_close); +be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_lv_group_focus_cb); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, NULL); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_SYMBOL_NEXT); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_lv_draw_mask_fade_param_cfg); +be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_ROT1B); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_exists); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_TUYA_TX); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_begin); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_encrypt); +be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_resolvecmnd); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_item); +be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_lv_slider); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_time_dump); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_DDS2382_TX); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_lv_gauge_format_cb); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_lv_signal_cb); be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_update); be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_lv_keyboard); -be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, NULL); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_resp_cmnd_str); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_state); -be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_LE01MR_TX); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_ceil); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, NULL); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_SYMBOL_VOLUME_MID); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_SSD1331_DC); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_SYMBOL_NEW_LINE); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, &be_const_str_lv_draw_img_dsc); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, &be_const_str_read24); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_OUTPUT_OPEN_DRAIN); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_PMS5003_TX); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, NULL); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, NULL); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_var); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_INPUT_PULLDOWN); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); -be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_WEBCAM_PSCLK); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str__end_transmission); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, NULL); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, NULL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_HPMA_RX); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_I2S_OUT_DATA); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, NULL); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_count); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_wifi); +be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str__end_transmission); be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_ZEROCROSS); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_SM16716_SEL); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_i2c_enabled); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_lv_event_cb); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_content_flush); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_read12); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_SYMBOL_UP); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_SYMBOL_BATTERY_EMPTY); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, NULL); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_MAX31855DO); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, NULL); +be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, NULL); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_try_rule); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_lv_cb); +be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, &be_const_str_lv_draw_mask_radius_param_cfg); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_lv_textarea); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_SYMBOL_COPY); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_abs); +be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_SBR_RX); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str_lv_spinner); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_byte); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_web_send); +be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_content_start); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_wire1); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str__timers); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_call); +be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_lv_draw_mask_angle_param); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, NULL); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_lv_obj); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, &be_const_str_as); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_exp); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_resp_cmnd); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(dot_p2, ".p2", 232398067u, 0, 3, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_PN532_TXD); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_SDM630_RX); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_cmd); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_lv_draw_mask_saved); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, &be_const_str_seti); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_ZIGBEE_RST); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_gc); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_SDCARD_CS); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str_SSD1351_DC); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str_SYMBOL_VOLUME_MAX); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_DSB); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_getbits); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_memory); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_ROT1A); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_TM1637DIO); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_WEBCAM_PSCLK); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_ZIGBEE_TX); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str_lv_design_cb); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_name); +be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SM16716_SEL); be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_load_font); be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); -be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_TFMINIPLUS_RX); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_members); -be_define_const_str(members, "members", 937576464u, 0, 7, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_SSD1351_DC); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str__rules); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, NULL); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); -be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_SYMBOL_BATTERY_EMPTY); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, NULL); -be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_DHT11_OUT); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, NULL); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_exec_cmd); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_lv_chart); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, NULL); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SDM120_RX); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_TUYA_TX); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, NULL); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_HRXL_RX); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_SYMBOL_LIST); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_name); -be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_scale_uint); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_TASMOTACLIENT_TXD); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_write_bit); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_addr); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_SPI_CS); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_get_light); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_except); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_WS2812); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_scale_uint); be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_check_privileged_access); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_lv_btn); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_lv_cont); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_rtc); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_tan); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_lv_spinbox); -be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_SYMBOL_STOP); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_lv_tabview); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, &be_const_str_read12); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, NULL); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_DSB_OUT); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, NULL); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, NULL); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_save); -be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_scan); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_hex); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_range); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_SYMBOL_NEXT); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, &be_const_str_TXD); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, NULL); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_SYMBOL_USB); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, NULL); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_WEBCAM_PCLK); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_get_power); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_publish_result); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_lv_design_cb); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, &be_const_str_TUYA_RX); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str_lv_img); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, NULL); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_WEBCAM_HREF); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, NULL); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_lv_cb); -be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_lv_group); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, NULL); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_SSPI_MAX31865_CS1); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, NULL); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_SSD1331_CS); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_lv_draw_mask_angle_param_cfg); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, NULL); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_SYMBOL_POWER); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_close); -be_define_const_str(close, "close", 667630371u, 0, 5, NULL); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_NRG_SEL_INV); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_push); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_SYMBOL_DRIVE); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str_SYMBOL_EDIT); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_compile); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_class); -be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_insert); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_lv_event_cb); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_P9813_CLK); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_isinstance); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_lv_draw_label_dsc); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, NULL); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, &be_const_str_pin); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MCP39F5_TX); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_arg); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_SYMBOL_TRASH); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_lv_roller); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_SBR_RX); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_SYMBOL_DOWNLOAD); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, &be_const_str_resp_cmnd); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_MGC3130_XFER); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_PROJECTOR_CTRL_TX); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_SSPI_CS); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_SDM72_TX); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str__ccmd); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_char); -be_define_const_str(char, "char", 2823553821u, 0, 4, NULL); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_SYMBOL_USB); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_stop); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, NULL); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, NULL); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_map); +be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_I2C_SDA); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_SSD1351_CS); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_setbits); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str__buffer); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_NEOPOOL_TX); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_PMS5003_TX); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, NULL); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_find_key_i); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_arg_size); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_cb_dispatch); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_fromstring); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_lv_color); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_log10); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, NULL); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SYMBOL_CUT); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str_erase); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_hex); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_lv_tabview); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_decrypt); +be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_lv_led); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_arg_name); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, NULL); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_ILI9341_CS); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_SPI_DC); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_SYMBOL_EYE_OPEN); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_add_driver); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, NULL); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_MP3_DFR562); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_lv_calendar); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_tag); +be_define_const_str(tag, "tag", 2516003219u, 0, 3, NULL); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_resize); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_I2S_OUT_SLCT); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_MHZ_TXD); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_lv_draw_mask_line_param); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_lv_dropdown); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_setitem); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_isinstance); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_NEOPOOL_RX); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_SSD1331_DC); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, NULL); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SYMBOL_LEFT); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_TM1638CLK); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_setmember); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_SYMBOL_OK); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_get); +be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_PULLDOWN); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, NULL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, NULL); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_SYMBOL_LOOP); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, NULL); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_size); +be_define_const_str(size, "size", 597743964u, 0, 4, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_lower); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_check_privileged_access); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_wire2); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_collect); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_init); +be_define_const_str(init, "init", 380752755u, 0, 4, NULL); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_ROT1B_NP); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_format); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_lv_draw_mask_angle_param_cfg); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_SSPI_DC); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); +be_define_const_str(dot_p1, ".p1", 249175686u, 0, 3, &be_const_str_SYMBOL_PASTE); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_char); +be_define_const_str(char, "char", 2823553821u, 0, 4, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_deinit); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_imin); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_toint); +be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_MGC3130_RESET); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_insert); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_SYMBOL_POWER); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, NULL); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, NULL); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, NULL); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_resp_cmnd_str); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_SYMBOL_SHUFFLE); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_AudioOutput); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_SYMBOL_MUTE); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_TM1638STB); +be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_BOILER_OT_RX); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_TUYA_RX); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_SM2135_CLK); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_codedump); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, &be_const_str_def); +be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_GPS_TX); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_TASMOTACLIENT_RXD); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_classname); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, NULL); static const bstring* const m_string_table[] = { (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_MCP39F5_RX, - (const bstring *)&be_const_str_codedump, - (const bstring *)&be_const_str_loop, - (const bstring *)&be_const_str_SYMBOL_AUDIO, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_PULLDOWN, - (const bstring *)&be_const_str_SI7021, - (const bstring *)&be_const_str_TX2X_TXD_BLACK, - (const bstring *)&be_const_str_arg_size, - (const bstring *)&be_const_str_PWM1, - (const bstring *)&be_const_str_I2S_OUT_CLK, - (const bstring *)&be_const_str_chars_in_string, - (const bstring *)&be_const_str_CSE7766_TX, - (const bstring *)&be_const_str_HLW_CF, - (const bstring *)&be_const_str__cb, - NULL, - NULL, - (const bstring *)&be_const_str_SPI_MISO, - NULL, - (const bstring *)&be_const_str_write, - (const bstring *)&be_const_str_KEY1_TC, - (const bstring *)&be_const_str_lv_point, - (const bstring *)&be_const_str_SBR_TX, - (const bstring *)&be_const_str_WEBCAM_HSD, - (const bstring *)&be_const_str_AS3935, - (const bstring *)&be_const_str_DEEPSLEEP, - (const bstring *)&be_const_str_BL0940_RX, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_REL1, - (const bstring *)&be_const_str_AS608_RX, - (const bstring *)&be_const_str_SYMBOL_DIRECTORY, - NULL, - (const bstring *)&be_const_str_ILI9341_CS, - (const bstring *)&be_const_str_WINDMETER_SPEED, - (const bstring *)&be_const_str_lv_obj, - (const bstring *)&be_const_str_ADC_BUTTON_INV, - (const bstring *)&be_const_str_millis, - (const bstring *)&be_const_str_DDS2382_TX, - (const bstring *)&be_const_str_NRF24_DC, - (const bstring *)&be_const_str_ADC_PH, - (const bstring *)&be_const_str_set, - (const bstring *)&be_const_str_SYMBOL_EYE_OPEN, - (const bstring *)&be_const_str_SYMBOL_PASTE, - (const bstring *)&be_const_str_I2C_SDA, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_delay, - (const bstring *)&be_const_str_ILI9488_CS, - (const bstring *)&be_const_str_format, - (const bstring *)&be_const_str_AZ_RXD, - (const bstring *)&be_const_str_WIEGAND_D1, - (const bstring *)&be_const_str_ZIGBEE_RST, - (const bstring *)&be_const_str_memory, - (const bstring *)&be_const_str_byte, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_SWT1_PD, - (const bstring *)&be_const_str_SYMBOL_CUT, - (const bstring *)&be_const_str_add_driver, - (const bstring *)&be_const_str_NEOPOOL_TX, - (const bstring *)&be_const_str_TM1637DIO, - (const bstring *)&be_const_str_SM16716_DAT, + (const bstring *)&be_const_str_BACKLIGHT, + (const bstring *)&be_const_str_int, (const bstring *)&be_const_str_SR04_TRIG, - (const bstring *)&be_const_str_BS814_CLK, - (const bstring *)&be_const_str_RXD, - (const bstring *)&be_const_str_lv_line, - (const bstring *)&be_const_str_assert, - (const bstring *)&be_const_str_RA8876_CS, - (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str_LE01MR_RX, NULL, - (const bstring *)&be_const_str_SYMBOL_BATTERY_1, - (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, - (const bstring *)&be_const_str_TCP_TX, - (const bstring *)&be_const_str_SYMBOL_CHARGE, - (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_eth, - (const bstring *)&be_const_str_lv_draw_mask_radius_param_cfg, - NULL, - (const bstring *)&be_const_str_SYMBOL_IMAGE, - (const bstring *)&be_const_str_I2S_IN_CLK, - (const bstring *)&be_const_str_lv_area, - NULL, - (const bstring *)&be_const_str_EPAPER42_CS, - (const bstring *)&be_const_str_P9813_DAT, - (const bstring *)&be_const_str_HIGH, - NULL, - (const bstring *)&be_const_str_SYMBOL_LEFT, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_HX711_DAT, - (const bstring *)&be_const_str_NONE, - (const bstring *)&be_const_str_SYMBOL_OK, - (const bstring *)&be_const_str_TASMOTACLIENT_RST, - (const bstring *)&be_const_str_SYMBOL_CLOSE, - (const bstring *)&be_const_str_HALLEFFECT, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_LED1_INV, - (const bstring *)&be_const_str_PZEM004_RX, - (const bstring *)&be_const_str_lv_page, - NULL, - (const bstring *)&be_const_str_LEDLNK, - (const bstring *)&be_const_str_TM1638DIO, - (const bstring *)&be_const_str_SYMBOL_BELL, - (const bstring *)&be_const_str_WEBCAM_RESET, - (const bstring *)&be_const_str_BOILER_OT_RX, + (const bstring *)&be_const_str_RC522_CS, + (const bstring *)&be_const_str_ADE7953_IRQ, + (const bstring *)&be_const_str_SSPI_MISO, + (const bstring *)&be_const_str_KEY1_TC, (const bstring *)&be_const_str_ADC_BUTTON, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_PN532_TXD, - (const bstring *)&be_const_str_ETH_PHY_MDC, - (const bstring *)&be_const_str_DDS2382_RX, - (const bstring *)&be_const_str_MAX31855CS, - (const bstring *)&be_const_str_DCKI, - (const bstring *)&be_const_str_LED1, - (const bstring *)&be_const_str_PROJECTOR_CTRL_TX, - (const bstring *)&be_const_str_dot_p, - (const bstring *)&be_const_str_HX711_SCK, - (const bstring *)&be_const_str_floor, - (const bstring *)&be_const_str_AS608_TX, - NULL, - (const bstring *)&be_const_str_except, - (const bstring *)&be_const_str_A4988_STP, - NULL, - (const bstring *)&be_const_str_SM16716_CLK, - (const bstring *)&be_const_str_ARIRFRCV, - (const bstring *)&be_const_str_lv_dropdown, - (const bstring *)&be_const_str_DDSU666_TX, - (const bstring *)&be_const_str_MAX31855CLK, - (const bstring *)&be_const_str_SOLAXX1_TX, - (const bstring *)&be_const_str_redirect, - (const bstring *)&be_const_str_HM10_RX, - (const bstring *)&be_const_str_cb_dispatch, - (const bstring *)&be_const_str_TELEINFO_RX, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_SM2135_DAT, - (const bstring *)&be_const_str_BOILER_OT_TX, - (const bstring *)&be_const_str_GPS_TX, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_SPI_CS, - (const bstring *)&be_const_str_BS814_DAT, - (const bstring *)&be_const_str_wire2, - (const bstring *)&be_const_str_ctypes_bytes, - (const bstring *)&be_const_str_lv_draw_mask_line_param, - (const bstring *)&be_const_str_resize, + (const bstring *)&be_const_str_SM16716_DAT, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_lv_tileview, (const bstring *)&be_const_str_EPAPER29_CS, - (const bstring *)&be_const_str_input, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str_stop, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, + (const bstring *)&be_const_str_KEY1_INV, + (const bstring *)&be_const_str_add_cmd, + (const bstring *)&be_const_str_OLED_RESET, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_LED1_INV, + (const bstring *)&be_const_str_ADC_INPUT, + (const bstring *)&be_const_str_GCM, + (const bstring *)&be_const_str_LOW, + (const bstring *)&be_const_str_HRXL_RX, + (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_attrdump, + (const bstring *)&be_const_str_I2S_IN_DATA, + (const bstring *)&be_const_str_CSE7766_TX, + (const bstring *)&be_const_str_SM2135_DAT, + (const bstring *)&be_const_str_get_option, + (const bstring *)&be_const_str_WEBCAM_HREF, + (const bstring *)&be_const_str_IEM3000_TX, + (const bstring *)&be_const_str_IRSEND, + (const bstring *)&be_const_str_WE517_TX, + (const bstring *)&be_const_str_I2C_SCL, + (const bstring *)&be_const_str_WEBCAM_PWDN, + (const bstring *)&be_const_str_NRG_SEL, + NULL, + (const bstring *)&be_const_str_MD5, + (const bstring *)&be_const_str_add_rule, + (const bstring *)&be_const_str_WE517_RX, + NULL, + (const bstring *)&be_const_str_SYMBOL_CALL, + (const bstring *)&be_const_str_SYMBOL_PLUS, + (const bstring *)&be_const_str_DHT22, + (const bstring *)&be_const_str_ST7789_CS, + (const bstring *)&be_const_str_LED1, + (const bstring *)&be_const_str_floor, + (const bstring *)&be_const_str_MAX31855CLK, + NULL, + NULL, + (const bstring *)&be_const_str_lv_point, + (const bstring *)&be_const_str_read24, + (const bstring *)&be_const_str_AudioGenerator, NULL, - (const bstring *)&be_const_str_content_send_style, (const bstring *)&be_const_str_ILI9341_DC, NULL, - (const bstring *)&be_const_str_ADE7953_IRQ, - NULL, - (const bstring *)&be_const_str_I2S_IN_DATA, - (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV, - (const bstring *)&be_const_str_SOLAXX1_RX, - (const bstring *)&be_const_str_BUZZER_INV, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_MHZ_TXD, - NULL, - (const bstring *)&be_const_str_SDCARD_CS, - (const bstring *)&be_const_str_HM10_TX, - (const bstring *)&be_const_str_TELEINFO_ENABLE, - (const bstring *)&be_const_str_BACKLIGHT, - (const bstring *)&be_const_str_OLED_RESET, - (const bstring *)&be_const_str_lv_list, - (const bstring *)&be_const_str_SENSOR_END, - (const bstring *)&be_const_str_addr, - (const bstring *)&be_const_str_RC522_RST, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_DYP_RX, - (const bstring *)&be_const_str_OUTPUT_HI, - (const bstring *)&be_const_str_KEY1, - (const bstring *)&be_const_str_ETH_PHY_MDIO, + (const bstring *)&be_const_str_WEBCAM_DATA, + (const bstring *)&be_const_str_content_button, (const bstring *)&be_const_str_EXS_ENABLE, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str_ARIRFSEL, - (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_lv_style, + NULL, + NULL, (const bstring *)&be_const_str_LMT01, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_WIEGAND_D0, - (const bstring *)&be_const_str_read32, NULL, - NULL, - (const bstring *)&be_const_str_PULLUP, - (const bstring *)&be_const_str_OUTPUT, - (const bstring *)&be_const_str_CNTR1, - NULL, - (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_LE01MR_RX, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str_I2S_IN_SLCT, - NULL, - (const bstring *)&be_const_str_begin, - NULL, - (const bstring *)&be_const_str_SYMBOL_LOOP, - (const bstring *)&be_const_str_collect, - (const bstring *)&be_const_str_A4988_ENA, - (const bstring *)&be_const_str_SM2135_CLK, - (const bstring *)&be_const_str_SYMBOL_FILE, - (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV, - (const bstring *)&be_const_str_MAX7219CLK, - (const bstring *)&be_const_str_DHT22, - (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str_SYMBOL_BACKSPACE, - (const bstring *)&be_const_str_lv_textarea, - (const bstring *)&be_const_str_BUZZER, - NULL, - (const bstring *)&be_const_str_LEDLNK_INV, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_SYMBOL_PREV, - (const bstring *)&be_const_str_MAX31855DO, - (const bstring *)&be_const_str_lv_btnmatrix, - (const bstring *)&be_const_str_WEBCAM_SIOD, - (const bstring *)&be_const_str_KEY1_INV, - (const bstring *)&be_const_str_SYMBOL_PLAY, - (const bstring *)&be_const_str_get_free_heap, - (const bstring *)&be_const_str_FTC532, - (const bstring *)&be_const_str_ADC_RANGE, - (const bstring *)&be_const_str_SR04_ECHO, - (const bstring *)&be_const_str_SYMBOL_REFRESH, - (const bstring *)&be_const_str_SSD1351_CS, - (const bstring *)&be_const_str_HRE_DATA, - (const bstring *)&be_const_str_KEY1_PD, - (const bstring *)&be_const_str_ROT1B, - (const bstring *)&be_const_str_int, - (const bstring *)&be_const_str_HJL_CF, + (const bstring *)&be_const_str_members, (const bstring *)&be_const_str_ADC_TEMP, - (const bstring *)&be_const_str_SYMBOL_BATTERY_FULL, NULL, - (const bstring *)&be_const_str_A4988_DIR, - NULL, - (const bstring *)&be_const_str_lv_draw_mask_fade_param_cfg, - NULL, - (const bstring *)&be_const_str_ADC_CT_POWER, - (const bstring *)&be_const_str_imin, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_opt_call, - NULL, - (const bstring *)&be_const_str__timers, - (const bstring *)&be_const_str_I2S_OUT_DATA, - (const bstring *)&be_const_str_AudioGenerator, - (const bstring *)&be_const_str_IBEACON_RX, - (const bstring *)&be_const_str_Wire, - (const bstring *)&be_const_str_MAX7219DIN, - NULL, - (const bstring *)&be_const_str_elif, - NULL, - NULL, - (const bstring *)&be_const_str_ADC_INPUT, - (const bstring *)&be_const_str_acos, - (const bstring *)&be_const_str_SSPI_DC, - (const bstring *)&be_const_str_SSPI_MOSI, - (const bstring *)&be_const_str_SYMBOL_DUMMY, + (const bstring *)&be_const_str_HJL_CF, + (const bstring *)&be_const_str_SAIR_RX, + (const bstring *)&be_const_str_HX711_SCK, + (const bstring *)&be_const_str_SDM630_TX, (const bstring *)&be_const_str_A4988_MS1, - (const bstring *)&be_const_str_MAX7219CS, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str_item, - (const bstring *)&be_const_str_SAIR_TX, - (const bstring *)&be_const_str_asstring, + (const bstring *)&be_const_str_SR04_ECHO, + (const bstring *)&be_const_str_lv_draw_rect_dsc, + (const bstring *)&be_const_str_FALLING, NULL, - (const bstring *)&be_const_str_I2C_SCL, - (const bstring *)&be_const_str_response_append, NULL, - (const bstring *)&be_const_str_i2c_enabled, - NULL, - (const bstring *)&be_const_str_SYMBOL_COPY, - (const bstring *)&be_const_str_IEM3000_RX, - (const bstring *)&be_const_str_TM1637CLK, - (const bstring *)&be_const_str_opt_add, - NULL, - (const bstring *)&be_const_str_exec_rules, - (const bstring *)&be_const_str_NRG_SEL, - (const bstring *)&be_const_str_calldepth, - (const bstring *)&be_const_str_SYMBOL_EJECT, - (const bstring *)&be_const_str_CSE7761_RX, - (const bstring *)&be_const_str_DHT11, - NULL, - (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_MCP39F5_RX, (const bstring *)&be_const_str_RDM6300_RX, - (const bstring *)&be_const_str_resolvecmnd, - (const bstring *)&be_const_str_SPI_CLK, + (const bstring *)&be_const_str_AZ_RXD, NULL, - (const bstring *)&be_const_str_MIEL_HVAC_RX, - (const bstring *)&be_const_str_content_send, - (const bstring *)&be_const_str_SYMBOL_GPS, - (const bstring *)&be_const_str_CC1101_GDO0, + (const bstring *)&be_const_str_AS608_RX, + (const bstring *)&be_const_str_SYMBOL_VOLUME_MID, + NULL, + (const bstring *)&be_const_str_lv_arc, + (const bstring *)&be_const_str_DSB_OUT, + (const bstring *)&be_const_str_BS814_CLK, + (const bstring *)&be_const_str_HM10_TX, + (const bstring *)&be_const_str_SM16716_CLK, + (const bstring *)&be_const_str_lv_group, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_INPUT_PULLDOWN, + (const bstring *)&be_const_str_REL1, + (const bstring *)&be_const_str_dump, + (const bstring *)&be_const_str_MAX7219DIN, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_KEY1_INV_NP, + (const bstring *)&be_const_str_SYMBOL_EJECT, (const bstring *)&be_const_str_top, - (const bstring *)&be_const_str_CHANGE, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_add_cmd, - (const bstring *)&be_const_str_WEBCAM_PSRCS, - (const bstring *)&be_const_str_MP3_DFR562, - (const bstring *)&be_const_str_find, - (const bstring *)&be_const_str_CSE7766_RX, - (const bstring *)&be_const_str_lv_canvas, - (const bstring *)&be_const_str_lv_slider, - (const bstring *)&be_const_str_IEM3000_TX, - (const bstring *)&be_const_str_HRE_CLOCK, - (const bstring *)&be_const_str_CNTR1_NP, - (const bstring *)&be_const_str_MGC3130_RESET, - (const bstring *)&be_const_str_SYMBOL_DOWN, - (const bstring *)&be_const_str_opt_neq, + (const bstring *)&be_const_str_SPI_MOSI, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_real, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_SYMBOL_DUMMY, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str___lower__, NULL, - (const bstring *)&be_const_str_SDM630_RX, - (const bstring *)&be_const_str_try, - (const bstring *)&be_const_str_return + NULL, + NULL, + (const bstring *)&be_const_str_HPMA_TX, + (const bstring *)&be_const_str_SYMBOL_PLAY, + NULL, + (const bstring *)&be_const_str_lv_draw_mask_map_param_cfg, + (const bstring *)&be_const_str_ADC_RANGE, + (const bstring *)&be_const_str_INTERRUPT, + NULL, + (const bstring *)&be_const_str_opt_neq, + (const bstring *)&be_const_str_EPD_DATA, + (const bstring *)&be_const_str_SWT1_PD, + (const bstring *)&be_const_str_lv_roller, + NULL, + (const bstring *)&be_const_str_log, + (const bstring *)&be_const_str_HM10_RX, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_MIEL_HVAC_TX, + (const bstring *)&be_const_str_imax, + (const bstring *)&be_const_str_EPAPER42_CS, + (const bstring *)&be_const_str_SYMBOL_EDIT, + (const bstring *)&be_const_str_A4988_DIR, + (const bstring *)&be_const_str_ADC_CT_POWER, + NULL, + (const bstring *)&be_const_str_RFSEND, + (const bstring *)&be_const_str_SYMBOL_PAUSE, + (const bstring *)&be_const_str_BOILER_OT_TX, + (const bstring *)&be_const_str_ARIRFRCV, + (const bstring *)&be_const_str_TFMINIPLUS_RX, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_lv_draw_label_dsc, + (const bstring *)&be_const_str_remove_rule, + (const bstring *)&be_const_str_SWT1_NP, + (const bstring *)&be_const_str_lv_draw_mask_line_param_cfg, + (const bstring *)&be_const_str_HLW_CF, + (const bstring *)&be_const_str_classof, + (const bstring *)&be_const_str_LE01MR_TX, + NULL, + NULL, + (const bstring *)&be_const_str_rtc, + NULL, + (const bstring *)&be_const_str__ccmd, + (const bstring *)&be_const_str_dot_p, + NULL, + (const bstring *)&be_const_str_bus, + NULL, + (const bstring *)&be_const_str_SDS0X1_TX, + (const bstring *)&be_const_str_SDM72_TX, + (const bstring *)&be_const_str_AS3935, + NULL, + (const bstring *)&be_const_str_BS814_DAT, + (const bstring *)&be_const_str_OUTPUT_LO, + (const bstring *)&be_const_str_lv_draw_mask_fade_param, + (const bstring *)&be_const_str_SYMBOL_HOME, + (const bstring *)&be_const_str_WEBCAM_VSYNC, + (const bstring *)&be_const_str_HALLEFFECT, + (const bstring *)&be_const_str_OPEN_DRAIN, + (const bstring *)&be_const_str_A4988_STP, + (const bstring *)&be_const_str_SYMBOL_SAVE, + NULL, + (const bstring *)&be_const_str_lv_cont, + (const bstring *)&be_const_str_ARIRFSEL, + (const bstring *)&be_const_str_ETH_PHY_POWER, + (const bstring *)&be_const_str_KEY1, + (const bstring *)&be_const_str_SYMBOL_CHARGE, + NULL, + (const bstring *)&be_const_str_SYMBOL_VIDEO, + NULL, + (const bstring *)&be_const_str_acos, + (const bstring *)&be_const_str_SYMBOL_CLOSE, + (const bstring *)&be_const_str_SSPI_MOSI, + (const bstring *)&be_const_str_FTC532, + (const bstring *)&be_const_str_SPI_CLK, + (const bstring *)&be_const_str_ceil, + NULL, + (const bstring *)&be_const_str_IRRECV, + (const bstring *)&be_const_str_RA8876_CS, + (const bstring *)&be_const_str_TM1638DIO, + (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, + (const bstring *)&be_const_str_SAIR_TX, + NULL, + (const bstring *)&be_const_str_SYMBOL_MINUS, + (const bstring *)&be_const_str_clear, + (const bstring *)&be_const_str_SYMBOL_FILE, + (const bstring *)&be_const_str_RFRECV, + (const bstring *)&be_const_str_calldepth, + (const bstring *)&be_const_str_SDM120_RX, + (const bstring *)&be_const_str_exec_cmd, + (const bstring *)&be_const_str_RF_SENSOR, + (const bstring *)&be_const_str_LEDLNK_INV, + (const bstring *)&be_const_str_dot_p2, + (const bstring *)&be_const_str_HRE_DATA, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_SDM120_TX, + (const bstring *)&be_const_str_IEM3000_RX, + (const bstring *)&be_const_str_get_power, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_DHT11, + (const bstring *)&be_const_str_PWM1_INV, + (const bstring *)&be_const_str_BUZZER, + (const bstring *)&be_const_str_WEBCAM_SIOD, + (const bstring *)&be_const_str_SYMBOL_RIGHT, + (const bstring *)&be_const_str_DI, + (const bstring *)&be_const_str_SYMBOL_GPS, + (const bstring *)&be_const_str_gen_cb, + NULL, + (const bstring *)&be_const_str_MAX7219CLK, + (const bstring *)&be_const_str_loop, + NULL, + (const bstring *)&be_const_str_DEEPSLEEP, + (const bstring *)&be_const_str_MCP39F5_RST, + (const bstring *)&be_const_str_ROT1A_NP, + (const bstring *)&be_const_str_PZEM017_RX, + (const bstring *)&be_const_str_HX711_DAT, + (const bstring *)&be_const_str_MGC3130_XFER, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_lv_list, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str_WEBCAM_RESET, + (const bstring *)&be_const_str_TELEINFO_ENABLE, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str___upper__, + (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str__drivers, + (const bstring *)&be_const_str_opt_call, + (const bstring *)&be_const_str_CC1101_GDO0, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_PZEM004_RX, + (const bstring *)&be_const_str_geti, + (const bstring *)&be_const_str_eth, + NULL, + (const bstring *)&be_const_str___iterator__, + (const bstring *)&be_const_str_NONE, + (const bstring *)&be_const_str_SOLAXX1_TX, + (const bstring *)&be_const_str_arg, + (const bstring *)&be_const_str_tan, + (const bstring *)&be_const_str_NRF24_DC, + (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str_WEBCAM_XCLK, + (const bstring *)&be_const_str_ADC_BUTTON_INV, + (const bstring *)&be_const_str_MCP39F5_TX, + NULL, + (const bstring *)&be_const_str_SSPI_MAX31865_CS1, + (const bstring *)&be_const_str_for, + (const bstring *)&be_const_str__available, + (const bstring *)&be_const_str_return, + (const bstring *)&be_const_str_compile, + (const bstring *)&be_const_str_NRF24_CS, + (const bstring *)&be_const_str_SYMBOL_LIST, + (const bstring *)&be_const_str_true, + (const bstring *)&be_const_str_A4988_ENA, + (const bstring *)&be_const_str_ETH_PHY_MDIO, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_rand, + (const bstring *)&be_const_str_Wire, + NULL, + (const bstring *)&be_const_str_CSE7761_RX, + (const bstring *)&be_const_str_CSE7766_RX, + (const bstring *)&be_const_str_PZEM016_RX, + (const bstring *)&be_const_str_SI7021, + (const bstring *)&be_const_str_SYMBOL_UPLOAD, + NULL, + NULL, + (const bstring *)&be_const_str_I2S_IN_CLK, + (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, + (const bstring *)&be_const_str_SYMBOL_BELL, + (const bstring *)&be_const_str_SYMBOL_BATTERY_1, + (const bstring *)&be_const_str_atan, + (const bstring *)&be_const_str_opt_add, + (const bstring *)&be_const_str_REL1_INV, + NULL, + (const bstring *)&be_const_str_Tasmota, + NULL, + (const bstring *)&be_const_str_DDSU666_TX, + (const bstring *)&be_const_str_PWM1, + (const bstring *)&be_const_str_DDS2382_RX, + (const bstring *)&be_const_str_RC522_RST, + (const bstring *)&be_const_str_AS608_TX, + NULL, + (const bstring *)&be_const_str_dot_p1, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_digital_read, + (const bstring *)&be_const_str_DHT11_OUT, + (const bstring *)&be_const_str_PMS5003_RX, + (const bstring *)&be_const_str_LEDLNK, + (const bstring *)&be_const_str_IBEACON_TX, + (const bstring *)&be_const_str_SYMBOL_WIFI, + (const bstring *)&be_const_str_PZEM0XX_TX, + (const bstring *)&be_const_str_KEY1_PD, + (const bstring *)&be_const_str_reverse, + (const bstring *)&be_const_str_PN532_RXD, + (const bstring *)&be_const_str_false, + (const bstring *)&be_const_str_TCP_TX, + (const bstring *)&be_const_str_DYP_RX, + NULL, + NULL, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_BL0940_RX, + (const bstring *)&be_const_str__read, + (const bstring *)&be_const_str_CHANGE, + (const bstring *)&be_const_str_lv_canvas, + (const bstring *)&be_const_str_CNTR1_NP, + (const bstring *)&be_const_str_NRG_SEL_INV }; static const struct bconststrtab m_const_string_table = { - .size = 312, - .count = 624, + .size = 315, + .count = 630, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_aes_gcm.h b/lib/libesp32/Berry/generate/be_fixed_be_class_aes_gcm.h new file mode 100644 index 000000000..593696b3f --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_aes_gcm.h @@ -0,0 +1,22 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_aes_gcm_map) { + { be_const_key(encrypt, 4), be_const_func(m_aes_gcm_encryt) }, + { be_const_key(dot_p2, -1), be_const_index(0) }, + { be_const_key(decrypt, -1), be_const_func(m_aes_gcm_decryt) }, + { be_const_key(init, -1), be_const_func(m_aes_gcm_init) }, + { be_const_key(dot_p1, -1), be_const_index(1) }, + { be_const_key(tag, -1), be_const_func(m_aes_gcm_tag) }, +}; + +static be_define_const_map( + be_class_aes_gcm_map, + 6 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_aes_gcm, + 2, + NULL, + GCM +); diff --git a/tasmota/xdrv_52_3_berry_aes_gcm.ino b/tasmota/xdrv_52_3_berry_aes_gcm.ino new file mode 100644 index 000000000..ae0559794 --- /dev/null +++ b/tasmota/xdrv_52_3_berry_aes_gcm.ino @@ -0,0 +1,196 @@ +/* + xdrv_52_3_berry_md5.ino - Berry scripting language, Md5 class + + Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 USE_BERRY +#ifdef USE_ALEXA_AVS + +#include +#include "be_mem.h" + +/*********************************************************************************************\ + * AES class + * +\*********************************************************************************************/ +extern "C" { + + int free_br_obj(bvm* vm) { + int argc = be_top(vm); + if (argc > 0) { + void * obj = be_tocomptr(vm, 1); + if (obj != NULL) { be_os_free(obj); } + } + be_return_nil(vm); + } + + // `AES_GCM.init(secret_key:bytes(32), iv:bytes(12)) -> instance` + int32_t m_aes_gcm_init(struct bvm *vm); + int32_t m_aes_gcm_init(struct bvm *vm) { + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 3 && be_isinstance(vm, 2) && be_isinstance(vm, 3)) { + do { + be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ + if (!be_isderived(vm, 2)) break; + size_t length = 0; + const void * bytes = be_tobytes(vm, 2, &length); + if (!bytes) break; + if (length != 32) { + be_raise(vm, "value_error", "Key size must be 32 bytes"); + } + + be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ + if (!be_isderived(vm, 3)) break; + size_t iv_length = 0; + const void * iv_bytes = be_tobytes(vm, 3, &iv_length); + if (!iv_bytes) break; + + // Initialize an AES CTR structure with the secret key + br_aes_small_ctr_keys * ctr_ctx = (br_aes_small_ctr_keys *) be_os_malloc(sizeof(br_aes_small_ctr_keys)); + if (!ctr_ctx) { be_throw(vm, BE_MALLOC_FAIL); } + br_aes_small_ctr_init(ctr_ctx, bytes, length); + be_newcomobj(vm, ctr_ctx, &free_br_obj); + be_setmember(vm, 1, ".p1"); + + // Initialize an AES GCM structure based on this CTR engine + br_gcm_context * gcm_ctx = (br_gcm_context *) be_os_malloc(sizeof(br_gcm_context)); + if (!gcm_ctx) { be_throw(vm, BE_MALLOC_FAIL); } + br_gcm_init(gcm_ctx, &ctr_ctx->vtable, &br_ghash_ctmul32); + be_newcomobj(vm, gcm_ctx, &free_br_obj); + be_setmember(vm, 1, ".p2"); + + // Reset GCM context with provided IV + br_gcm_reset(gcm_ctx, iv_bytes, iv_length); + + // We don't have any additional authenticated data so we flip instantly + br_gcm_flip(gcm_ctx); + + be_return_nil(vm); + // success + } while (0); + } + be_raise(vm, kTypeError, nullptr); + } + + int32_t m_aes_gcm_encryt(bvm *vm); + int32_t m_aes_gcm_decryt(bvm *vm); + int32_t m_aes_gcm_encrypt_or_decryt(bvm *vm, int encrypt) { + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 2 && be_isinstance(vm, 2)) { + do { + be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ + if (!be_isderived(vm, 2)) break; + + // get GCM context + be_getmember(vm, 1, ".p2"); + br_gcm_context * gcm_ctx = (br_gcm_context *) be_tocomptr(vm, -1); + be_pop(vm, 1); + + // copy the input buffer + be_getmember(vm, 2, "copy"); // stack: bytes.copy() + be_pushvalue(vm, 2); // stack: bytes.copy(), bytes instance + be_call(vm, 1); // call copy with self parameter + be_pop(vm, 1); // stack: clone of input bytes + + size_t length = 0; + // we are changing bytes in place + void * bytes = (void*) be_tobytes(vm, -1, &length); + if (!bytes) break; + + br_gcm_run(gcm_ctx, encrypt, bytes, length); + + be_return(vm); + // success + } while (0); + } + be_raise(vm, kTypeError, nullptr); + } + int32_t m_aes_gcm_encryt(bvm *vm) { + return m_aes_gcm_encrypt_or_decryt(vm, 1); + } + int32_t m_aes_gcm_decryt(bvm *vm) { + return m_aes_gcm_encrypt_or_decryt(vm, 0); + } + + int32_t m_aes_gcm_tag(bvm *vm) { + do { + be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ + + // get GCM context + be_getmember(vm, 1, ".p2"); + br_gcm_context * gcm_ctx = (br_gcm_context *) be_tocomptr(vm, -1); + be_pop(vm, 1); + + // create a bytes buffer of 16 bytes + uint8_t tag[16] = {0}; + br_gcm_get_tag(gcm_ctx, tag); + be_pushbytes(vm, tag, sizeof(tag)); + + be_return(vm); + // success + } while (0); + be_raise(vm, kTypeError, nullptr); + } + +// // `Md5.update(content:bytes()) -> nil` +// // +// // Add raw bytes to the MD5 calculation +// int32_t m_md5_update(struct bvm *vm); +// int32_t m_md5_update(struct bvm *vm) { +// int32_t argc = be_top(vm); // Get the number of arguments +// if (argc >= 2 && be_isinstance(vm, 2)) { +// do { +// be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ +// if (!be_isderived(vm, 2)) break; +// size_t length = 0; +// const void * bytes = be_tobytes(vm, 2, &length); +// if (!bytes) break; + +// be_getmember(vm, 1, ".p"); +// struct MD5Context * ctx; +// ctx = (struct MD5Context *) be_tocomptr(vm, -1); +// if (!ctx) break; + +// if (length > 0) { +// MD5Update(ctx, (const uint8_t*) bytes, length); +// } +// be_return_nil(vm); +// // success +// } while (0); +// } +// be_raise(vm, kTypeError, nullptr); +// } + +// // `Md5.update(content:bytes()) -> nil` +// // +// // Add raw bytes to the MD5 calculation +// int32_t m_md5_finish(struct bvm *vm); +// int32_t m_md5_finish(struct bvm *vm) { +// be_getmember(vm, 1, ".p"); +// struct MD5Context * ctx; +// ctx = (struct MD5Context *) be_tocomptr(vm, -1); + +// uint8_t output[16]; +// MD5Final(output, ctx); +// be_pushbytes(vm, output, sizeof(output)); +// be_return(vm); +// } +} + +#endif // USE_ALEXA_AVS +#endif // USE_BERRY diff --git a/tasmota/xdrv_52_3_berry_md5.ino b/tasmota/xdrv_52_3_berry_md5.ino index 4ae85d4b3..a4adee029 100644 --- a/tasmota/xdrv_52_3_berry_md5.ino +++ b/tasmota/xdrv_52_3_berry_md5.ino @@ -33,7 +33,8 @@ extern "C" { int free_ctx(bvm* vm) { int argc = be_top(vm); if (argc > 0) { - struct MD5Context * ctx = (struct MD5Context *) be_tocomptr(vm, 1); + be_getmember(vm, 1, ".p"); + struct MD5Context * ctx = (struct MD5Context *) be_tocomptr(vm, -1); if (ctx != NULL) { be_os_free(ctx); } diff --git a/tasmota/xdrv_52_3_berry_tasmota.ino b/tasmota/xdrv_52_3_berry_tasmota.ino index a15388058..252338ca7 100644 --- a/tasmota/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/xdrv_52_3_berry_tasmota.ino @@ -72,17 +72,27 @@ extern "C" { int32_t l_publish(struct bvm *vm); int32_t l_publish(struct bvm *vm) { int32_t top = be_top(vm); // Get the number of arguments - if (top >= 3 && be_isstring(vm, 2) && be_isstring(vm, 3)) { // 2 mandatory string arguments + if (top >= 3 && be_isstring(vm, 2) && (be_isstring(vm, 3) || be_isinstance(vm, 3))) { // 2 mandatory string arguments if (top == 3 || (top == 4 && be_isbool(vm, 4))) { // 3rd optional argument must be bool const char * topic = be_tostring(vm, 2); - const char * payload = be_tostring(vm, 3); + const char * payload = nullptr; + size_t payload_len = 0; + if (be_isstring(vm, 3)) { + payload = be_tostring(vm, 3); + payload_len = strlen(payload); + } else { + be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ + if (be_isderived(vm, 3)) { + payload = (const char *) be_tobytes(vm, 3, &payload_len); + } + } bool retain = false; if (top == 4) { retain = be_tobool(vm, 4); } - Response_P(payload); - MqttPublish(topic, retain); - be_return(vm); // Return + if (!payload) { be_raise(vm, "value_error", "Empty payload"); } + MqttPublishPayload(topic, payload, payload_len, retain); + be_return_nil(vm); // Return } } be_raise(vm, kTypeError, nullptr); diff --git a/tasmota/xdrv_52_9_berry.ino b/tasmota/xdrv_52_9_berry.ino index 3f3210fe8..47f31c34a 100644 --- a/tasmota/xdrv_52_9_berry.ino +++ b/tasmota/xdrv_52_9_berry.ino @@ -37,6 +37,8 @@ void (* const BerryCommand[])(void) PROGMEM = { CmndBrRun, }; +int32_t callBerryEventDispatcher(const char *type, const char *cmd, int32_t idx, const char *payload, uint32_t data_len = 0); + // // Sanity Check for be_top() // @@ -191,7 +193,8 @@ bool callMethodObjectWithArgs(const char * objname, const char * method, size_t // call the event dispatcher from Tasmota object -int32_t callBerryEventDispatcher(const char *type, const char *cmd, int32_t idx, const char *payload) { +// if data_len is non-zero, the event is also sent as raw `bytes()` object because the string may lose data +int32_t callBerryEventDispatcher(const char *type, const char *cmd, int32_t idx, const char *payload, uint32_t data_len) { int32_t ret = 0; bvm *vm = berry.vm; @@ -206,7 +209,13 @@ int32_t callBerryEventDispatcher(const char *type, const char *cmd, int32_t idx, be_pushstring(vm, cmd != nullptr ? cmd : ""); be_pushint(vm, idx); be_pushstring(vm, payload != nullptr ? payload : "{}"); // empty json - ret = be_pcall(vm, 5); // 5 arguments + if (data_len > 0) { + be_pushbytes(vm, payload, data_len); // if data_len is set, we also push raw bytes + ret = be_pcall(vm, 6); // 6 arguments + be_pop(vm, 1); + } else { + ret = be_pcall(vm, 5); // 5 arguments + } if (ret != 0) { BerryDumpErrorAndClear(vm, false); // log in Tasmota console only return ret; @@ -725,7 +734,7 @@ bool Xdrv52(uint8_t function) result = callBerryRule(); break; case FUNC_MQTT_DATA: - result = callBerryEventDispatcher(PSTR("mqtt_data"), XdrvMailbox.topic, 0, XdrvMailbox.data); + result = callBerryEventDispatcher(PSTR("mqtt_data"), XdrvMailbox.topic, 0, XdrvMailbox.data, XdrvMailbox.data_len); break; case FUNC_EVERY_50_MSECOND: callBerryEventDispatcher(PSTR("every_50ms"), nullptr, 0, nullptr); From 9c5ab65925c75a5590b50a082671e19287d161e0 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jul 2021 22:59:25 +0200 Subject: [PATCH 060/148] checkout@v2 --- .github/workflows/CI_github.yml | 68 ++++----- .github/workflows/CI_github_ESP32.yml | 68 ++++----- .github/workflows/Tasmota_build_master.yml | 152 +++++++++++---------- 3 files changed, 146 insertions(+), 142 deletions(-) diff --git a/.github/workflows/CI_github.yml b/.github/workflows/CI_github.yml index c5e37b063..84017f6f4 100644 --- a/.github/workflows/CI_github.yml +++ b/.github/workflows/CI_github.yml @@ -7,7 +7,7 @@ jobs: tasmota: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -26,7 +26,7 @@ jobs: tasmota-minimal: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -45,7 +45,7 @@ jobs: tasmota-lite: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -64,7 +64,7 @@ jobs: tasmota-knx: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -83,7 +83,7 @@ jobs: tasmota-sensors: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -102,7 +102,7 @@ jobs: tasmota-display: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -121,7 +121,7 @@ jobs: tasmota-ir: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -140,7 +140,7 @@ jobs: tasmota-zbbridge: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -159,7 +159,7 @@ jobs: tasmota-zigbee: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -178,7 +178,7 @@ jobs: tasmota-AF: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -197,7 +197,7 @@ jobs: tasmota-BG: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -216,7 +216,7 @@ jobs: tasmota-BR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -235,7 +235,7 @@ jobs: tasmota-CN: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -254,7 +254,7 @@ jobs: tasmota-CZ: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -273,7 +273,7 @@ jobs: tasmota-DE: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -292,7 +292,7 @@ jobs: tasmota-ES: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -311,7 +311,7 @@ jobs: tasmota-FR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -330,7 +330,7 @@ jobs: tasmota-FY: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -349,7 +349,7 @@ jobs: tasmota-GR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -368,7 +368,7 @@ jobs: tasmota-HE: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -387,7 +387,7 @@ jobs: tasmota-HU: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -406,7 +406,7 @@ jobs: tasmota-IT: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -425,7 +425,7 @@ jobs: tasmota-KO: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -444,7 +444,7 @@ jobs: tasmota-NL: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -463,7 +463,7 @@ jobs: tasmota-PL: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -482,7 +482,7 @@ jobs: tasmota-PT: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -501,7 +501,7 @@ jobs: tasmota-RO: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -520,7 +520,7 @@ jobs: tasmota-RU: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -539,7 +539,7 @@ jobs: tasmota-SE: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -558,7 +558,7 @@ jobs: tasmota-SK: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -577,7 +577,7 @@ jobs: tasmota-TR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -596,7 +596,7 @@ jobs: tasmota-TW: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -615,7 +615,7 @@ jobs: tasmota-UK: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -634,7 +634,7 @@ jobs: tasmota-VN: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies diff --git a/.github/workflows/CI_github_ESP32.yml b/.github/workflows/CI_github_ESP32.yml index 0b63de0da..b01c6af2c 100644 --- a/.github/workflows/CI_github_ESP32.yml +++ b/.github/workflows/CI_github_ESP32.yml @@ -7,7 +7,7 @@ jobs: tasmota32: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -27,7 +27,7 @@ jobs: tasmota32solo1: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -47,7 +47,7 @@ jobs: tasmota32-webcam: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -67,7 +67,7 @@ jobs: tasmota32-odroidgo: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -87,7 +87,7 @@ jobs: tasmota32-core2: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -107,7 +107,7 @@ jobs: tasmota32-bluetooth: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -127,7 +127,7 @@ jobs: tasmota32-display: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -147,7 +147,7 @@ jobs: tasmota32-lvgl: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -167,7 +167,7 @@ jobs: tasmota32-ir: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -187,7 +187,7 @@ jobs: tasmota32-AF: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -207,7 +207,7 @@ jobs: tasmota32-BG: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -227,7 +227,7 @@ jobs: tasmota32-BR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -247,7 +247,7 @@ jobs: tasmota32-CN: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -267,7 +267,7 @@ jobs: tasmota32-CZ: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -287,7 +287,7 @@ jobs: tasmota32-DE: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -307,7 +307,7 @@ jobs: tasmota32-ES: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -327,7 +327,7 @@ jobs: tasmota32-FR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -347,7 +347,7 @@ jobs: tasmota32-FY: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -367,7 +367,7 @@ jobs: tasmota32-GR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -387,7 +387,7 @@ jobs: tasmota32-HE: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -407,7 +407,7 @@ jobs: tasmota32-HU: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -427,7 +427,7 @@ jobs: tasmota32-IT: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -447,7 +447,7 @@ jobs: tasmota32-KO: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -467,7 +467,7 @@ jobs: tasmota32-NL: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -487,7 +487,7 @@ jobs: tasmota32-PL: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -507,7 +507,7 @@ jobs: tasmota32-PT: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -527,7 +527,7 @@ jobs: tasmota32-RO: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -547,7 +547,7 @@ jobs: tasmota32-RU: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -567,7 +567,7 @@ jobs: tasmota32-SE: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -587,7 +587,7 @@ jobs: tasmota32-SK: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -607,7 +607,7 @@ jobs: tasmota32-TR: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -627,7 +627,7 @@ jobs: tasmota32-TW: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -647,7 +647,7 @@ jobs: tasmota32-UK: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -667,7 +667,7 @@ jobs: tasmota32-VN: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index d138ac4d7..9ac239ef7 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1,20 +1,23 @@ -name: Build_firmware +name: Build_firmware_master on: push: branches: master + paths-ignore: + - '.github/**' # Ignore changes towards the .github directory jobs: tasmota_pull: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Use Tasmota master run: | git config --local user.name "Platformio BUILD" + git config user.email github-actions@github.com git switch -c work - git remote add -f Tasmota "https://github.com/arendst/Tasmota.git" + git remote add -f Tasmota "https://github.com/arendst/Tasmota.git" --track master git merge Tasmota/master --allow-unrelated-histories - name: Push Tasmota # Push updates of latest Tasmota master to repo uses: ad-m/github-push-action@master @@ -29,7 +32,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -49,7 +52,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -69,7 +72,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -89,7 +92,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -109,7 +112,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -129,7 +132,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -149,7 +152,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -169,7 +172,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -189,7 +192,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -209,7 +212,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -229,7 +232,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -249,7 +252,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -269,7 +272,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -289,7 +292,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -309,7 +312,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -329,7 +332,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -349,7 +352,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -369,7 +372,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -389,7 +392,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -409,7 +412,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -429,7 +432,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -449,7 +452,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -469,7 +472,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -489,7 +492,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -509,7 +512,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -529,7 +532,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -549,7 +552,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -569,7 +572,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -589,7 +592,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -609,7 +612,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -629,7 +632,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -649,7 +652,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -669,7 +672,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -689,7 +692,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -709,7 +712,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -729,7 +732,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -749,7 +752,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -769,7 +772,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -789,7 +792,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -809,7 +812,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -829,7 +832,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -849,7 +852,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -869,7 +872,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -889,7 +892,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -909,7 +912,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -929,7 +932,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -949,7 +952,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -969,7 +972,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -989,7 +992,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1009,7 +1012,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1029,7 +1032,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1049,7 +1052,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1069,7 +1072,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1089,7 +1092,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1109,7 +1112,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1129,7 +1132,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1149,7 +1152,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1169,7 +1172,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1189,7 +1192,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1209,7 +1212,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1229,7 +1232,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1249,7 +1252,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1269,7 +1272,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1289,7 +1292,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1309,7 +1312,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1329,7 +1332,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1349,7 +1352,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1369,7 +1372,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 - name: Install dependencies @@ -1389,7 +1392,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions/download-artifact@v2 with: name: firmware @@ -1404,7 +1407,7 @@ jobs: files: ./mv_firmware/firmware/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + - name: Move firmware files in sub-folders run: | mkdir -p ./firmware/tasmota/languages @@ -1438,7 +1441,8 @@ jobs: [ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md - name: Commit files # transfer the new binaries back into the repository run: | - git config --local user.name "Platformio BUILD" + git config user.name github-actions + git config user.email github-actions@github.com git rm -r --cached . git add ./README.md git add -f ./firmware/*.* From cb1fbf2edcffa07048ee8efb76903d6b3fc58b85 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 30 Jul 2021 13:09:31 +0200 Subject: [PATCH 061/148] Berry support for WAV audio --- lib/libesp32/Berry/default/be_i2s_audio_lib.c | 22 ++++++ lib/libesp32/Berry/generate/be_const_strtab.h | 1 + .../Berry/generate/be_const_strtab_def.h | 5 +- .../be_fixed_be_class_audio_generator_wav.h | 23 +++++++ lib/libesp32/Berry/src/be_byteslib.c | 16 ++++- lib/libesp32/Berry/src/be_filelib.c | 51 +++++++++++++- lib/libesp32/Berry/src/berry.h | 1 + tasmota/xdrv_52_3_berry_audio.ino | 68 +++++++++++++++++++ 8 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h diff --git a/lib/libesp32/Berry/default/be_i2s_audio_lib.c b/lib/libesp32/Berry/default/be_i2s_audio_lib.c index 74a523d32..d41fc683f 100644 --- a/lib/libesp32/Berry/default/be_i2s_audio_lib.c +++ b/lib/libesp32/Berry/default/be_i2s_audio_lib.c @@ -11,6 +11,13 @@ extern int i2s_output_i2s_init(bvm *vm); extern int i2s_output_i2s_deinit(bvm *vm); +extern int i2s_generator_wav_init(bvm *vm); +extern int i2s_generator_wav_deinit(bvm *vm); +extern int i2s_generator_wav_begin(bvm *vm); +extern int i2s_generator_wav_loop(bvm *vm); +extern int i2s_generator_wav_stop(bvm *vm); +extern int i2s_generator_wav_isrunning(bvm *vm); + extern int i2s_generator_mp3_init(bvm *vm); extern int i2s_generator_mp3_deinit(bvm *vm); extern int i2s_generator_mp3_begin(bvm *vm); @@ -28,6 +35,7 @@ extern int i2s_file_source_fs_deinit(bvm *vm); #include "../generate/be_fixed_be_class_audio_output.h" #include "../generate/be_fixed_be_class_audio_output_i2s.h" #include "../generate/be_fixed_be_class_audio_generator.h" +#include "../generate/be_fixed_be_class_audio_generator_wav.h" #include "../generate/be_fixed_be_class_audio_generator_mp3.h" #include "../generate/be_fixed_be_class_audio_file_source.h" #include "../generate/be_fixed_be_class_audio_file_source_fs.h" @@ -42,6 +50,10 @@ void be_load_driver_audio_lib(bvm *vm) { be_setglobal(vm, "AudioOutputI2S"); be_pop(vm, 1); + be_pushntvclass(vm, &be_class_audio_generator_wav); + be_setglobal(vm, "AudioGeneratorWAV"); + be_pop(vm, 1); + be_pushntvclass(vm, &be_class_audio_generator_mp3); be_setglobal(vm, "AudioGeneratorMP3"); be_pop(vm, 1); @@ -73,6 +85,16 @@ class be_class_audio_output_i2s (scope: global, name: AudioOutputI2S, super: be_ close, func(i2s_output_i2s_deinit) } +class be_class_audio_generator_wav (scope: global, name: AudioGeneratorWAV, super: be_class_audio_generator) { + init, func(i2s_generator_wav_init) + deinit, func(i2s_generator_wav_deinit) + close, func(i2s_generator_wav_deinit) + begin, func(i2s_generator_wav_begin) + loop, func(i2s_generator_wav_loop) + stop, func(i2s_generator_wav_stop) + isrunning, func(i2s_generator_wav_isrunning) +} + class be_class_audio_generator_mp3 (scope: global, name: AudioGeneratorMP3, super: be_class_audio_generator) { init, func(i2s_generator_mp3_init) deinit, func(i2s_generator_mp3_deinit) diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 9f6673837..513a00d95 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -230,6 +230,7 @@ extern const bcstring be_const_str_type; extern const bcstring be_const_str__request_from; extern const bcstring be_const_str___lower__; extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_AudioGeneratorWAV; extern const bcstring be_const_str_HPMA_TX; extern const bcstring be_const_str_input; extern const bcstring be_const_str_issubclass; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index 7aa7d626d..b36a4fcc3 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -230,6 +230,7 @@ be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_detect); be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); +be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, NULL); be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_input); be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_issubclass); be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); @@ -765,7 +766,7 @@ static const bstring* const m_string_table[] = { (const bstring *)&be_const_str___lower__, NULL, NULL, - NULL, + (const bstring *)&be_const_str_AudioGeneratorWAV, (const bstring *)&be_const_str_HPMA_TX, (const bstring *)&be_const_str_SYMBOL_PLAY, NULL, @@ -971,6 +972,6 @@ static const bstring* const m_string_table[] = { static const struct bconststrtab m_const_string_table = { .size = 315, - .count = 630, + .count = 631, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h new file mode 100644 index 000000000..3436ed6e3 --- /dev/null +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h @@ -0,0 +1,23 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_audio_generator_wav_map) { + { be_const_key(close, -1), be_const_func(i2s_generator_wav_deinit) }, + { be_const_key(stop, -1), be_const_func(i2s_generator_wav_stop) }, + { be_const_key(loop, 0), be_const_func(i2s_generator_wav_loop) }, + { be_const_key(isrunning, 1), be_const_func(i2s_generator_wav_isrunning) }, + { be_const_key(begin, -1), be_const_func(i2s_generator_wav_begin) }, + { be_const_key(deinit, 6), be_const_func(i2s_generator_wav_deinit) }, + { be_const_key(init, -1), be_const_func(i2s_generator_wav_init) }, +}; + +static be_define_const_map( + be_class_audio_generator_wav_map, + 7 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_audio_generator_wav, + 0, + (bclass *)&be_class_audio_generator, + AudioGeneratorWAV +); diff --git a/lib/libesp32/Berry/src/be_byteslib.c b/lib/libesp32/Berry/src/be_byteslib.c index 5d18fdd0b..c171ccf02 100644 --- a/lib/libesp32/Berry/src/be_byteslib.c +++ b/lib/libesp32/Berry/src/be_byteslib.c @@ -372,7 +372,7 @@ static int m_fromstring(bvm *vm) int argc = be_top(vm); if (argc >= 2 && be_isstring(vm, 2)) { const char *s = be_tostring(vm, 2); - size_t len = strlen(s); + size_t len = be_strlen(vm, 2); buf_impl * buf = bytes_check_data(vm, 0); buf = bytes_resize(vm, buf, len); /* resize if needed */ if (len > buf->size) { len = buf->size; } /* avoid overflow */ @@ -753,6 +753,20 @@ BERRY_API const void *be_tobytes(bvm *vm, int rel_index, size_t *len) return NULL; } +BERRY_API bbool be_isbytes(bvm *vm, int rel_index) +{ + bbool ret = bfalse; + int index = be_absindex(vm, rel_index); + if (be_isinstance(vm, index)) { + be_getbuiltin(vm, "bytes"); + if (be_isderived(vm, index)) { + ret = btrue; + } + be_pop(vm, 1); + } + return ret; +} + /* Helper code to compile bytecode diff --git a/lib/libesp32/Berry/src/be_filelib.c b/lib/libesp32/Berry/src/be_filelib.c index 2a489555a..87691809b 100644 --- a/lib/libesp32/Berry/src/be_filelib.c +++ b/lib/libesp32/Berry/src/be_filelib.c @@ -16,10 +16,17 @@ static int i_write(bvm *vm) { be_getmember(vm, 1, ".p"); - if(be_iscomptr(vm, -1) && be_isstring(vm, 2)) { + if(be_iscomptr(vm, -1) && (be_isstring(vm, 2) || be_isbytes(vm, 2))) { void *fh = be_tocomptr(vm, -1); - const char *data = be_tostring(vm, 2); - be_fwrite(fh, data, be_strlen(vm, 2)); + size_t size = 0; + const char *data = NULL; + if (be_isstring(vm, 2)) { + data = be_tostring(vm, 2); + size = be_strlen(vm, 2); + } else { + data = be_tobytes(vm, 2, &size); + } + be_fwrite(fh, data, size); } be_return_nil(vm); } @@ -52,6 +59,43 @@ static int i_read(bvm *vm) be_return_nil(vm); } +static int i_readbytes(bvm *vm) +{ + int argc = be_top(vm); + be_getmember(vm, 1, ".p"); + if (be_iscomptr(vm, -1)) { + void *fh = be_tocomptr(vm, -1); + size_t size = readsize(vm, argc, fh); + if (size) { + /* avoid double allocation, using directly the internal buffer of bytes() */ + be_getbuiltin(vm, "bytes"); + be_pushint(vm, size); + be_call(vm, 1); /* call bytes() constructor with pre-sized buffer */ + be_pop(vm, 1); /* bytes() instance is at top */ + + be_getmember(vm, -1, "resize"); + be_pushvalue(vm, -2); + be_pushint(vm, size); + be_call(vm, 2); /* call b.resize(size) */ + be_pop(vm, 3); /* bytes() instance is at top */ + + char *buffer = (char*) be_tobytes(vm, -1, NULL); /* we get the address of the internam buffer of size 'size' */ + size = be_fread(fh, buffer, size); + + /* resize if something went wrong */ + be_getmember(vm, -1, "resize"); + be_pushvalue(vm, -2); + be_pushint(vm, size); + be_call(vm, 2); /* call b.resize(size) */ + be_pop(vm, 3); /* bytes() instance is at top */ + } else { + be_pushbytes(vm, NULL, 0); + } + be_return(vm); + } + be_return_nil(vm); +} + static int i_readline(bvm *vm) { be_getmember(vm, 1, ".p"); @@ -144,6 +188,7 @@ int be_nfunc_open(bvm *vm) { ".p", NULL }, { "write", i_write }, { "read", i_read }, + { "readbytes", i_readbytes }, { "readline", i_readline }, { "seek", i_seek }, { "tell", i_tell }, diff --git a/lib/libesp32/Berry/src/berry.h b/lib/libesp32/Berry/src/berry.h index e2d8270e1..52a557fd8 100644 --- a/lib/libesp32/Berry/src/berry.h +++ b/lib/libesp32/Berry/src/berry.h @@ -444,6 +444,7 @@ BERRY_API bbool be_ismap(bvm *vm, int index); BERRY_API bbool be_iscomptr(bvm *vm, int index); BERRY_API bbool be_iscomobj(bvm *vm, int index); BERRY_API bbool be_isderived(bvm *vm, int index); +BERRY_API bbool be_isbytes(bvm *vm, int index); BERRY_API bint be_toint(bvm *vm, int index); BERRY_API breal be_toreal(bvm *vm, int index); diff --git a/tasmota/xdrv_52_3_berry_audio.ino b/tasmota/xdrv_52_3_berry_audio.ino index d3e82b63a..9612de208 100644 --- a/tasmota/xdrv_52_3_berry_audio.ino +++ b/tasmota/xdrv_52_3_berry_audio.ino @@ -25,6 +25,7 @@ // #include "AudioFileSourceSPIFFS.h" // #include "AudioFileSourceID3.h" #include "AudioOutputI2S.h" +#include "AudioGeneratorWAV.h" #include "AudioGeneratorMP3.h" #include "AudioFileSourceFS.h" @@ -83,6 +84,73 @@ extern "C" { be_return_nil(vm); } + // + // AudioGeneratorWAV() + // + int i2s_generator_wav_init(bvm *vm) { + AudioGeneratorWAV * wav = new AudioGeneratorWAV(); + be_pushcomptr(vm, (void*) wav); + be_setmember(vm, 1, ".p"); + be_return_nil(vm); + } + + AudioGeneratorWAV * i2s_generator_wav_get(bvm *vm) { + be_getmember(vm, 1, ".p"); + AudioGeneratorWAV * wav = (AudioGeneratorWAV *) be_tocomptr(vm, -1); + return wav; + } + + int i2s_generator_wav_deinit(bvm *vm) { + int argc = be_top(vm); + AudioGeneratorWAV * wav = i2s_generator_wav_get(vm); + if (wav) { + delete wav; + // clear + be_pushcomptr(vm, (void*) NULL); + be_setmember(vm, 1, ".p"); + } + + be_return_nil(vm); + } + + int i2s_generator_wav_begin(bvm *vm) { + int argc = be_top(vm); + if (argc > 2) { + AudioGeneratorWAV * wav = i2s_generator_wav_get(vm); + be_getmember(vm, 2, ".p"); + AudioFileSource * source = (AudioFileSource*) be_tocomptr(vm, -1); + be_getmember(vm, 3, ".p"); + AudioOutput * output = (AudioOutput*) be_tocomptr(vm, -1); + be_pop(vm, 2); + + bool ret = wav->begin(source, output); + be_pushbool(vm, ret); + be_return(vm); + } + be_return_nil(vm); + } + + int i2s_generator_wav_loop(bvm *vm) { + AudioGeneratorWAV * wav = i2s_generator_wav_get(vm); + bool ret = wav->loop(); + be_pushbool(vm, ret); + be_return(vm); + } + + int i2s_generator_wav_stop(bvm *vm) { + AudioGeneratorWAV * wav = i2s_generator_wav_get(vm); + bool ret = wav->stop(); + be_pushbool(vm, ret); + be_return(vm); + } + + int i2s_generator_wav_isrunning(bvm *vm) { + AudioGeneratorWAV * wav = i2s_generator_wav_get(vm); + bool ret = wav->isRunning(); + be_pushbool(vm, ret); + be_return(vm); + } + // // AudioGeneratorMP3() // From 173b9d8c885280964164d3a074d00f7a574072e7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 30 Jul 2021 16:10:35 +0200 Subject: [PATCH 062/148] Fix DzSend error message on valid command --- tasmota/xdrv_07_domoticz.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/xdrv_07_domoticz.ino b/tasmota/xdrv_07_domoticz.ino index 1f1dea37b..0342e6d89 100644 --- a/tasmota/xdrv_07_domoticz.ino +++ b/tasmota/xdrv_07_domoticz.ino @@ -526,6 +526,7 @@ void CmndDomoticzSend(void) { else if (3 == XdrvMailbox.index) { type = DZ_AIRQUALITY; } DomoticzSendData(type, index, data); } + ResponseCmndDone(); } } } From 14c4be9d51b962c5be81d6318b77858f2aadf947 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 30 Jul 2021 16:34:50 +0200 Subject: [PATCH 063/148] ESP8266Audio library from v1.5.0 to v1.9.2 --- lib/lib_audio/ESP8266Audio/README.md | 2 +- .../PlayWAVFromFunction.ino | 78 +++++ .../PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino | 6 - .../StreamMP3FromHTTP/StreamMP3FromHTTP.ino | 2 +- .../StreamOnHost/AudioOutputLinuxDSP.h | 118 +++++++ .../StreamOnHost/AudioOutputNullSlow.h | 57 +++ .../examples/StreamOnHost/StreamOnHost.ino | 118 +++++++ .../ESP8266Audio/examples/StreamOnHost/onHost | 66 ++++ lib/lib_audio/ESP8266Audio/keywords.txt | 1 + lib/lib_audio/ESP8266Audio/library.json | 8 +- lib/lib_audio/ESP8266Audio/library.properties | 6 +- .../ESP8266Audio/src/AudioFileSourceFS.h | 8 +- .../src/AudioFileSourceFunction.cpp | 148 ++++++++ .../src/AudioFileSourceFunction.h | 119 +++++++ .../src/AudioFileSourceHTTPStream.cpp | 8 +- .../src/AudioFileSourceHTTPStream.h | 11 +- .../src/AudioFileSourceICYStream.cpp | 11 +- .../src/AudioFileSourceICYStream.h | 9 +- .../ESP8266Audio/src/AudioFileSourceID3.cpp | 19 +- .../ESP8266Audio/src/AudioFileSourceSD.h | 9 +- .../src/AudioFileSourceSPIRAMBuffer.cpp | 4 + .../src/AudioFileSourceSPIRAMBuffer.h | 4 +- .../ESP8266Audio/src/AudioGenerator.h | 1 + .../ESP8266Audio/src/AudioGeneratorAAC.cpp | 9 +- .../ESP8266Audio/src/AudioGeneratorFLAC.cpp | 6 +- .../ESP8266Audio/src/AudioGeneratorMP3.cpp | 99 ++++-- .../ESP8266Audio/src/AudioGeneratorMP3.h | 26 +- .../src/AudioOutputFilterBiquad.cpp | 245 +++++++++++++ .../src/AudioOutputFilterBiquad.h | 80 +++++ .../ESP8266Audio/src/AudioOutputI2S.cpp | 330 +++++++++++------- .../ESP8266Audio/src/AudioOutputI2S.h | 26 +- .../ESP8266Audio/src/AudioOutputI2SNoDAC.cpp | 24 +- .../ESP8266Audio/src/AudioOutputI2SNoDAC.h | 7 +- .../ESP8266Audio/src/AudioOutputSPDIF.cpp | 3 + .../ESP8266Audio/src/AudioOutputSPDIF.h | 4 +- .../ESP8266Audio/src/AudioOutputULP.cpp | 262 ++++++++++++++ .../ESP8266Audio/src/AudioOutputULP.h | 69 ++++ lib/lib_audio/ESP8266Audio/src/ESP8266Audio.h | 50 +++ .../ESP8266Audio/src/libflac/bitreader.c | 6 + .../ESP8266Audio/src/libflac/config.h | 4 +- lib/lib_audio/ESP8266Audio/src/libflac/cpu.c | 2 +- lib/lib_audio/ESP8266Audio/src/libflac/crc.c | 4 +- .../ESP8266Audio/src/libflac/stream_decoder.c | 3 + .../ESP8266Audio/src/libhelix-aac/assembly.h | 4 +- .../ESP8266Audio/src/libhelix-aac/sbr.c | 1 + .../ESP8266Audio/src/libhelix-aac/sbrhfgen.c | 4 +- .../ESP8266Audio/src/libhelix-mp3/assembly.h | 4 +- .../ESP8266Audio/src/libmad/global.h | 1 + .../src/libopus/celt/celt_decoder.c | 3 +- .../ESP8266Audio/src/libopus/config.h | 2 + .../ESP8266Audio/src/libopus/repacketizer.c | 71 ++-- .../ESP8266Audio/src/libopus/silk/NLSF2A.c | 11 +- .../libopus/silk/fixed/burg_modified_FIX.c | 18 +- .../silk/fixed/warped_autocorrelation_FIX.c | 6 +- .../src/libopus/silk/resampler_down2_3.c | 4 +- .../ESP8266Audio/src/libtinysoundfont/tsf.h | 13 +- .../ESP8266Audio/src/opusfile/opusfile.c | 67 ++-- lib/lib_audio/ESP8266Audio/tests/common.sh | 0 .../ESP8266Audio/tests/host/Makefile | 20 +- .../ESP8266Audio/tests/host/flac.cpp | 24 ++ .../tests/host/gs-16b-2c-44100hz.flac | Bin 0 -> 1336528 bytes lib/libesp32/Berry/default/be_i2s_audio_lib.c | 6 +- lib/libesp32/Berry/generate/be_const_strtab.h | 1 - .../Berry/generate/be_const_strtab_def.h | 5 +- .../be_fixed_be_class_audio_file_source_fs.h | 5 +- .../be_fixed_be_class_audio_generator_mp3.h | 13 +- .../be_fixed_be_class_audio_generator_wav.h | 13 +- .../be_fixed_be_class_audio_output_i2s.h | 4 +- tasmota/xdrv_52_3_berry_audio.ino | 14 +- 69 files changed, 2049 insertions(+), 337 deletions(-) create mode 100644 lib/lib_audio/ESP8266Audio/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino create mode 100644 lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputLinuxDSP.h create mode 100644 lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputNullSlow.h create mode 100644 lib/lib_audio/ESP8266Audio/examples/StreamOnHost/StreamOnHost.ino create mode 100755 lib/lib_audio/ESP8266Audio/examples/StreamOnHost/onHost create mode 100644 lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.cpp create mode 100644 lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.h create mode 100644 lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.cpp create mode 100644 lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.h create mode 100644 lib/lib_audio/ESP8266Audio/src/AudioOutputULP.cpp create mode 100644 lib/lib_audio/ESP8266Audio/src/AudioOutputULP.h create mode 100644 lib/lib_audio/ESP8266Audio/src/ESP8266Audio.h mode change 100644 => 100755 lib/lib_audio/ESP8266Audio/tests/common.sh create mode 100644 lib/lib_audio/ESP8266Audio/tests/host/flac.cpp create mode 100644 lib/lib_audio/ESP8266Audio/tests/host/gs-16b-2c-44100hz.flac diff --git a/lib/lib_audio/ESP8266Audio/README.md b/lib/lib_audio/ESP8266Audio/README.md index c8c92ff67..f243db52a 100644 --- a/lib/lib_audio/ESP8266Audio/README.md +++ b/lib/lib_audio/ESP8266Audio/README.md @@ -1,4 +1,4 @@ -# ESP8266Audio - supports ESP8266 & ESP32 [![Gitter](https://badges.gitter.im/ESP8266Audio/community.svg)](https://gitter.im/ESP8266Audio/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +# ESP8266Audio - supports ESP8266 & ESP32 & Raspberry Pi RP2040[![Gitter](https://badges.gitter.im/ESP8266Audio/community.svg)](https://gitter.im/ESP8266Audio/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) Arduino library for parsing and decoding MOD, WAV, MP3, FLAC, MIDI, AAC, and RTTL files and playing them on an I2S DAC or even using a software-simulated delta-sigma DAC with dynamic 32x-128x oversampling. ESP8266 is fully supported and most mature, but ESP32 is also mostly there with built-in DAC as well as external ones. diff --git a/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino b/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino new file mode 100644 index 000000000..fe0cc896d --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromFunction/PlayWAVFromFunction.ino @@ -0,0 +1,78 @@ +#include +#include "AudioFileSourceFunction.h" +#include "AudioGeneratorWAV.h" +#include "AudioOutputI2SNoDAC.h" + +float hz = 440.f; + +// pre-defined function can also be used to generate the wave +float sine_wave(const float time) { + float v = sin(TWO_PI * hz * time); // C + v *= fmod(time, 1.f); // change linear + v *= 0.5; // scale + return v; +}; + +AudioGeneratorWAV* wav; +AudioFileSourceFunction* file; +AudioOutputI2SNoDAC* out; + +void setup() { + Serial.begin(115200); + delay(1000); + + // ===== create instance with length of song in [sec] ===== + file = new AudioFileSourceFunction(8.); + // + // you can set (sec, channels, hz, bit/sample) but you should care about + // the trade-off between performance and the audio quality + // + // file = new AudioFileSourceFunction(sec, channels, hz, bit/sample); + // channels : default = 1 + // hz : default = 8000 (8000, 11025, 22050, 44100, 48000, etc.) + // bit/sample : default = 16 (8, 16, 32) + + // ===== set your sound function ===== + file->addAudioGenerators([&](const float time) { + float v = sin(TWO_PI * hz * time); // generate sine wave + v *= fmod(time, 1.f); // change linear + v *= 0.5; // scale + return v; + }); + // + // sound function should have one argument(float) and one return(float) + // param : float (current time [sec] of the song) + // return : float (the amplitude of sound which varies from -1.f to +1.f) + // + // sound function can be registerd only one or the same number with channels + // if the channels > 1 && the number of function == 1, + // same function are used to generate the sound in every channel + // + // file = new AudioFileSourceFunction(8., 2); + // file->addAudioGenerators( + // // L (channel 0) + // [](const float time) { + // return 0.25 * sin(TWO_PI * 440.f * time) * fmod(time, 1.f); // C + // }, + // // R (channel 1) + // [](const float time) { + // return 0.25 * sin(TWO_PI * 550.f * time) * fmod(time, 1.f); // E + // } + // ); + // + // you can also use the pre-defined function + // file->addAudioGenerators(sine_wave); + + out = new AudioOutputI2SNoDAC(); + wav = new AudioGeneratorWAV(); + wav->begin(file, out); +} + +void loop() { + if (wav->isRunning()) { + if (!wav->loop()) wav->stop(); + } else { + Serial.println("function done!"); + delay(1000); + } +} diff --git a/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino b/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino index 5221c913c..cb488f1c3 100644 --- a/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino +++ b/lib/lib_audio/ESP8266Audio/examples/PlayWAVFromPROGMEM/PlayWAVFromPROGMEM.ino @@ -1,9 +1,4 @@ #include -#ifdef ESP32 - #include -#else - #include -#endif #include "AudioFileSourcePROGMEM.h" #include "AudioGeneratorWAV.h" @@ -18,7 +13,6 @@ AudioOutputI2SNoDAC *out; void setup() { - WiFi.mode(WIFI_OFF); Serial.begin(115200); delay(1000); Serial.printf("WAV start\n"); diff --git a/lib/lib_audio/ESP8266Audio/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino b/lib/lib_audio/ESP8266Audio/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino index 8ea451576..84d7d5b37 100644 --- a/lib/lib_audio/ESP8266Audio/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino +++ b/lib/lib_audio/ESP8266Audio/examples/StreamMP3FromHTTP/StreamMP3FromHTTP.ino @@ -22,7 +22,7 @@ const char* ssid = STASSID; const char* password = STAPSK; // Randomly picked URL -const char *URL="http://streaming.shoutcast.com/80sPlanet?lang=en-US"; +const char *URL="http://kvbstreams.dyndns.org:8000/wkvi-am"; AudioGeneratorMP3 *mp3; AudioFileSourceICYStream *file; diff --git a/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputLinuxDSP.h b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputLinuxDSP.h new file mode 100644 index 000000000..743410e84 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputLinuxDSP.h @@ -0,0 +1,118 @@ +/* + AudioOutput + Base class of an audio output player + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOOUTPUTNULLSLOW_H +#define _AUDIOOUTPUTNULLSLOW_H + +#include +#include +#include +#include +#include +#include +#include + +#include "AudioOutput.h" + +class AudioOutputNullSlow : public AudioOutput +{ + public: + AudioOutputNullSlow() { }; + ~AudioOutputNullSlow() {}; + virtual bool begin() { samples = 0; startms = millis(); return true; } + + virtual bool ConsumeSample(int16_t sample[2]) { + + if (fd < 0) { + fd = open("/dev/dsp", O_RDWR); + if (fd < 0) { + perror("open of /dev/dsp failed (Try with 'padsp this-exec')"); + exit(1); + } + } + + if (channels && lastchannels != channels) { + Serial.printf("CHANNELS=%d\n", channels); + int arg = channels; /* mono or stereo */ + int status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg); + if (status == -1) { + perror("SOUND_PCM_WRITE_CHANNELS ioctl failed"); + exit(1); + } else if (arg != channels) { + perror("unable to set number of channels"); + exit(1); + } + lastchannels = channels; + } + + if (lastchannels > 0 && hertz && lasthertz != hertz) { + Serial.printf("FREQ=%d\n", hertz); + int arg = hertz*4/lastchannels; /* sampling rate */ + int status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg); + if (status == -1) { + perror("SOUND_PCM_WRITE_RATE ioctl failed"); + exit(1); + } + lasthertz = hertz; + } + + if (bps && lastbps != bps) { + Serial.printf("BPS=%d\n", bps); + int arg = bps; /* sample size */ + int status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg); + if (status == -1) { + perror("SOUND_PCM_WRITE_BITS ioctl failed"); + exit(1); + } else if (arg != bps) { + perror("unable to set sample size"); + exit(1); + } + lastbps = bps; + } + + if ((++samples & ((1<<9)-1)) == 0) { + // let the main loop a chance to run + return false; + } + + if (write(fd, sample, sizeof(sample)) != sizeof(sample)) { + perror("doing sound"); + exit(1); + } + + return true; + } + + virtual bool stop() { endms = millis(); return true; }; + unsigned long GetMilliseconds() { return endms - startms; } + int GetSamples() { return samples; } + int GetFrequency() { return hertz; } + + protected: + unsigned long startms; + unsigned long endms; + int samples; + int lastchannels = -1; + int lasthertz = -1; + int lastbps = -1; + int fd = -1; +}; + +#endif diff --git a/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputNullSlow.h b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputNullSlow.h new file mode 100644 index 000000000..e85cd9ee9 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/AudioOutputNullSlow.h @@ -0,0 +1,57 @@ +/* + AudioOutput + Base class of an audio output player + + Copyright (C) 2017 Earle F. Philhower, III + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOOUTPUTNULLSLOW_H +#define _AUDIOOUTPUTNULLSLOW_H + +#include "AudioOutput.h" + +class AudioOutputNullSlow : public AudioOutput +{ + public: + AudioOutputNullSlow() { }; + ~AudioOutputNullSlow() {}; + virtual bool begin() { samples = 0; startms = millis(); return true; } + virtual bool ConsumeSample(int16_t sample[2]) { + // return false (= output buffer full) + // sometimes to let the main loop running + constexpr int everylog2 = 10; + if ((++samples & ((1< 0) { + // simulate real time + delay(1000/(hertz >> everylog2)); + } + return false; + } + return true; + } + virtual bool stop() { endms = millis(); return true; }; + unsigned long GetMilliseconds() { return endms - startms; } + int GetSamples() { return samples; } + int GetFrequency() { return hertz; } + + protected: + unsigned long startms; + unsigned long endms; + int samples; +}; + +#endif + diff --git a/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/StreamOnHost.ino b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/StreamOnHost.ino new file mode 100644 index 000000000..876562d1b --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/StreamOnHost.ino @@ -0,0 +1,118 @@ +#include + +#ifdef ESP32 + #include +#else + #include +#endif +#include "AudioFileSourceICYStream.h" +#include "AudioFileSourceBuffer.h" +#include "AudioGeneratorMP3.h" +#if AUDIO +#pragma message("Outputting audio") +#include "AudioOutputLinuxDSP.h" +#else +#pragma message("No audio") +#include "AudioOutputNullSlow.h" +#endif + +// To run, set your ESP8266 build to 160MHz, update the SSID info, and upload. + +// Enter your WiFi setup here: +#ifndef STASSID +#define STASSID "your-ssid" +#define STAPSK "your-password" +#endif + +const char* ssid = STASSID; +const char* password = STAPSK; + +// Randomly picked URL +//const char *URL="http://kvbstreams.dyndns.org:8000/wkvi-am"; +//const char *URL="http://stream2.pvpjamz.com:8706/stream"; +// that one is not well decoded: +const char *URL="http://icecast.radiofrance.fr/franceinter-lofi.mp3"; + +AudioGeneratorMP3 *mp3; +AudioFileSourceICYStream *file; +AudioFileSourceBuffer *buff; +AudioOutputNullSlow *out; + +// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. +void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) +{ + const char *ptr = reinterpret_cast(cbData); + (void) isUnicode; // Punt this ball for now + // Note that the type and string may be in PROGMEM, so copy them to RAM for printf + char s1[32], s2[64]; + strncpy_P(s1, type, sizeof(s1)); + s1[sizeof(s1)-1]=0; + strncpy_P(s2, string, sizeof(s2)); + s2[sizeof(s2)-1]=0; + Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); + Serial.flush(); +} + +// Called when there's a warning or error (like a buffer underflow or decode hiccup) +void StatusCallback(void *cbData, int code, const char *string) +{ + const char *ptr = reinterpret_cast(cbData); + // Note that the string may be in PROGMEM, so copy it to RAM for printf + char s1[64]; + strncpy_P(s1, string, sizeof(s1)); + s1[sizeof(s1)-1]=0; + Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); + Serial.flush(); +} + + +void setup() +{ + Serial.begin(115200); + delay(1000); + Serial.println("Connecting to WiFi"); + + WiFi.disconnect(); + WiFi.softAPdisconnect(true); + WiFi.mode(WIFI_STA); + + WiFi.begin(ssid, password); + + // Try forever + while (WiFi.status() != WL_CONNECTED) { + Serial.println("...Connecting to WiFi"); + delay(1000); + } + Serial.println("Connected"); + + audioLogger = &Serial; + file = new AudioFileSourceICYStream(); + file->RegisterMetadataCB(MDCallback, (void*)"ICY"); + file->useHTTP10(); + file->open(URL); + buff = new AudioFileSourceBuffer(file, 2048); + buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); + out = new AudioOutputNullSlow(); + mp3 = new AudioGeneratorMP3(); + mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); + mp3->begin(buff, out); +} + + +void loop() +{ + static int lastms = 0; + + if (mp3->isRunning()) { + if (millis()-lastms > 1000) { + lastms = millis(); + Serial.printf("Running for %d ms...\n", lastms); + Serial.flush(); + } + if (!mp3->loop()) mp3->stop(); + } else { + Serial.printf("MP3 done\n"); + delay(1000); + } +} + diff --git a/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/onHost b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/onHost new file mode 100755 index 000000000..014845692 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/examples/StreamOnHost/onHost @@ -0,0 +1,66 @@ +#!/bin/bash + +ino=${PWD##*/} + +if [ ! -d "${ESP8266ARDUINO}/tests/host" ]; then + echo "\${ESP8266ARDUINO} should point to ESP8266 Arduino core directory" + exit 1 +fi + +THISLIB=$(pwd)/../.. +MAD=$(ls ${THISLIB}/src/libmad/*.c) +PAGER=${PAGER:-less} + +cd ${ESP8266ARDUINO}/tests/host + +if [ "$1" = "clean" ]; then + make clean + cd ${THISLIB} + rm -f src/*.o src/libmad/*.o + exit 0 +elif [ "$1" = diff ]; then + cd ${THISLIB}/examples + diff -u StreamMP3FromHTTP/StreamMP3FromHTTP.ino ${ino}/${ino}.ino | ${PAGER} + exit 0 +else + echo "" + echo "usage:" + echo " $0" + echo " $0 clean" + echo " $0 diff" + echo " AUDIO=a VALGRIND=v FORCE32=f $0" + echo " a=1 play sound (use padsp, open /dev/dsp)" + echo " v=1 run in native mode (FORCE32=0) with valgrind" + echo " f=1 run in 32 bits mode (if gcc-multilib is installed)" + echo "variable ESP8266ARDUINO must point to esp8266 Arduino core directory" + echo "" + [ "$1" = "-h" ] && exit 0 + sleep 1 +fi + +run="" + +[ -z "${FORCE32}" ] && FORCE32=0 +[ -z "${AUDIO}" ] && AUDIO=1 + +if [ "${AUDIO}" = 1 ]; then + run="${run} padsp" +fi + +if [ "${VALGRIND}" = 1 ]; then + FORCE32=0 + run="$run valgrind" +fi + +touch ${THISLIB}/examples/${ino}/${ino}.ino # rebuild + +eval make FORCE32=${FORCE32} -j \ + USERCSOURCES=\"${MAD}\" \ + USERCXXSOURCES=\"${THISLIB}/src/AudioFileSourceBuffer.cpp ${THISLIB}/src/AudioLogger.cpp ${THISLIB}/src/AudioGeneratorMP3.cpp ${THISLIB}/src/AudioFileSourceICYStream.cpp ${THISLIB}/src/AudioFileSourceHTTPStream.cpp\" \ + USERCFLAGS=\"-I${THISLIB}/src/ -DAUDIO=${AUDIO}\" \ + ${THISLIB}/examples/${ino}/${ino} + +set -x + +$run ./bin/${ino}/${ino} "$@" +stty sane diff --git a/lib/lib_audio/ESP8266Audio/keywords.txt b/lib/lib_audio/ESP8266Audio/keywords.txt index 251f431e3..75b11139c 100644 --- a/lib/lib_audio/ESP8266Audio/keywords.txt +++ b/lib/lib_audio/ESP8266Audio/keywords.txt @@ -22,6 +22,7 @@ AudioGeneratorWAV KEYWORD1 AudioOutput KEYWORD1 AudioOutputI2S KEYWORD1 AudioOutputI2SNoDAC KEYWORD1 +AudioOutputI2SClass KEYWORD1 AudioOutputNull KEYWORD1 AudioOutputBuffer KEYWORD1 AudioOutputSerialWAV KEYWORD1 diff --git a/lib/lib_audio/ESP8266Audio/library.json b/lib/lib_audio/ESP8266Audio/library.json index 5986c2a41..139291880 100644 --- a/lib/lib_audio/ESP8266Audio/library.json +++ b/lib/lib_audio/ESP8266Audio/library.json @@ -1,6 +1,6 @@ { "name": "ESP8266Audio", - "description": "Audio file format and I2S DAC library", + "description": "Audio file format and I2S DAC library for ESP8266, ESP32, and Raspberry Pi Pico RP2040", "keywords": "ESP8266, ESP32, MP3, AAC, WAV, MOD, FLAC, RTTTL, MIDI, I2S, DAC, Delta-Sigma, TTS", "authors": [ { @@ -14,13 +14,9 @@ "type": "git", "url": "https://github.com/earlephilhower/ESP8266Audio" }, - "version": "1.5.0", + "version": "1.9.2", "homepage": "https://github.com/earlephilhower/ESP8266Audio", - "dependencies": { - "SPI": "1.0" - }, "frameworks": "Arduino", - "platforms": ["espressif8266", "espressif32"], "examples": [ "examples/*/*.ino" ] diff --git a/lib/lib_audio/ESP8266Audio/library.properties b/lib/lib_audio/ESP8266Audio/library.properties index 0eb36bee2..111915c1c 100644 --- a/lib/lib_audio/ESP8266Audio/library.properties +++ b/lib/lib_audio/ESP8266Audio/library.properties @@ -1,9 +1,9 @@ name=ESP8266Audio -version=1.5.0 +version=1.9.2 author=Earle F. Philhower, III maintainer=Earle F. Philhower, III -sentence=Audio file and I2S sound playing routines. +sentence=Audio file and I2S sound playing routines for ESP8266, ESP32, and Raspberry Pi Pico RP2040 paragraph=Decode compressed MP3, AAC, FLAC, Screamtracker MOD, MIDI, RTTL, TI Talkie, and WAV and play on an I2S DAC or a software-driven delta-sigma DAC and 1-transistor amplifier. category=Signal Input/Output url=https://github.com/earlephilhower/ESP8266Audio -architectures=esp8266,esp32 +architectures=esp8266,esp32,rp2040 diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFS.h b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFS.h index fea34c29e..4e1cb8ec0 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFS.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFS.h @@ -29,8 +29,8 @@ class AudioFileSourceFS : public AudioFileSource { public: - AudioFileSourceFS(FS &fs) { filesystem = &fs; } - AudioFileSourceFS(FS &fs, const char *filename); + AudioFileSourceFS(fs::FS &fs) { filesystem = &fs; } + AudioFileSourceFS(fs::FS &fs, const char *filename); virtual ~AudioFileSourceFS() override; virtual bool open(const char *filename) override; @@ -42,8 +42,8 @@ class AudioFileSourceFS : public AudioFileSource virtual uint32_t getPos() override { if (!f) return 0; else return f.position(); }; private: - FS *filesystem; - File f; + fs::FS *filesystem; + fs::File f; }; diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.cpp b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.cpp new file mode 100644 index 000000000..9e86eff21 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.cpp @@ -0,0 +1,148 @@ +/* + AudioFileSourceFunction + Audio ouptut generator which can generate WAV file data from function + + Copyright (C) 2021 Hideaki Tai + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 "AudioFileSourceFunction.h" + +AudioFileSourceFunction::AudioFileSourceFunction(float sec, uint16_t channels, uint32_t sample_per_sec, uint16_t bits_per_sample) { + uint32_t bytes_per_sec = sample_per_sec * channels * bits_per_sample / 8; + uint32_t len = uint32_t(sec * (float)bytes_per_sec); + + // RIFF chunk + strncpy(wav_header.riff.chunk_id, "RIFF", 4); + wav_header.riff.chunk_size = 4 // size of riff chunk w/o chunk_id and chunk_size + + 8 + 16 // size of format chunk + + 8 + len; // size of data chunk + strncpy(wav_header.riff.format, "WAVE", 4); + + // format chunk + strncpy(wav_header.format.chunk_id, "fmt ", 4); + wav_header.format.chunk_size = 16; + wav_header.format.format_tag = 0x0001; // PCM + wav_header.format.channels = channels; + wav_header.format.sample_per_sec = sample_per_sec; + wav_header.format.avg_bytes_per_sec = bytes_per_sec; + wav_header.format.block_align = channels * bits_per_sample / 8; + wav_header.format.bits_per_sample = bits_per_sample; + + // data chunk + strncpy(wav_header.data.chunk_id, "data", 4); + wav_header.data.chunk_size = len; + + funcs.reserve(channels); + pos = 0; + size = sizeof(WavHeader) + len; + is_ready = false; + is_unique = false; +} + +AudioFileSourceFunction::~AudioFileSourceFunction() { + close(); +} + +uint32_t AudioFileSourceFunction::read(void* data, uint32_t len) { + // callback size must be 1 or equal to channels + if (!is_ready) + return 0; + + uint8_t* d = reinterpret_cast(data); + uint32_t i = 0; + while (i < len) { + uint32_t p = pos + i; + if (p < sizeof(WavHeader)) { + // header bytes + d[i] = wav_header.bytes[p]; + i += 1; + } else { + // data bytes + float time = (float)(p - sizeof(WavHeader)) / (float)wav_header.format.avg_bytes_per_sec; + float v = funcs[0](time); + for (size_t ch = 0; ch < wav_header.format.channels; ++ch) { + if (!is_unique && ch > 0) + v = funcs[ch](time); + + switch (wav_header.format.bits_per_sample) { + case 8: { + Uint8AndInt8 vs {int8_t(v * (float)0x7F)}; + d[i] = vs.u; + break; + } + case 32: { + Uint8AndInt32 vs {int32_t(v * (float)0x7FFFFFFF)}; + d[i + 0] = vs.u[0]; + d[i + 1] = vs.u[1]; + d[i + 2] = vs.u[2]; + d[i + 3] = vs.u[3]; + break; + } + case 16: + default: { + Uint8AndInt16 vs {int16_t(v * (float)0x7FFF)}; + d[i + 0] = vs.u[0]; + d[i + 1] = vs.u[1]; + break; + } + } + } + i += wav_header.format.block_align; + } + } + pos += i; + return (pos >= size) ? 0 : i; +} + +bool AudioFileSourceFunction::seek(int32_t pos, int dir) { + if (dir == SEEK_SET) { + if (pos < 0 || (uint32_t)pos >= size) + return false; + this->pos = pos; + } else if (dir == SEEK_CUR) { + int32_t p = (int32_t)this->pos + pos; + if (p < 0 || (uint32_t)p >= size) + return false; + this->pos = p; + } else { + int32_t p = (int32_t)this->size + pos; + if (p < 0 || (uint32_t)p >= size) + return false; + this->pos = p; + } + return true; +} + +bool AudioFileSourceFunction::close() { + funcs.clear(); + pos = 0; + size = 0; + is_ready = false; + is_unique = false; + return true; +} + +bool AudioFileSourceFunction::isOpen() { + return is_ready; +} + +uint32_t AudioFileSourceFunction::getSize() { + return size; +} + +uint32_t AudioFileSourceFunction::getPos() { + return pos; +} diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.h b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.h new file mode 100644 index 000000000..6c41229ae --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceFunction.h @@ -0,0 +1,119 @@ +/* + AudioFileSourceFunction + Audio ouptut generator which can generate WAV file data from function + + Copyright (C) 2021 Hideaki Tai + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AUDIOFILESOURCEFUNCTION_H +#define _AUDIOFILESOURCEFUNCTION_H + +#include +#include +#include + +#include "AudioFileSource.h" + +class AudioFileSourceFunction : public AudioFileSource { + union WavHeader { + struct { + // RIFF chunk + struct { + char chunk_id[4]; // "RIFF" + uint32_t chunk_size; // 4 + (8 + sizeof(format_chunk)(16)) + (8 + sizeof(data_chunk)) + char format[4]; // "WAVE" + } riff; + // format chunk + struct { + char chunk_id[4]; // "fmt " + uint32_t chunk_size; // 16 + uint16_t format_tag; // 1: PCM + uint16_t channels; // 1: MONO, 2: STEREO + uint32_t sample_per_sec; // 8000, 11025, 22050, 44100, 48000 + uint32_t avg_bytes_per_sec; // sample_per_sec * channels * bits_per_sample / 8 + uint16_t block_align; // channels * bits_per_sample / 8 + uint16_t bits_per_sample; // 8, 16, 32 + } format; + // data chunk + struct { + char chunk_id[4]; // "data" + uint32_t chunk_size; // num_samples * channels * bytes_per_sample + // audio data follows here... + } data; + }; + uint8_t bytes[44]; + } wav_header; + + union Uint8AndInt8 { + int8_t i; + uint8_t u; + }; + + union Uint8AndInt16 { + int16_t i; + uint8_t u[2]; + }; + + union Uint8AndInt32 { + int32_t i; + uint8_t u[4]; + }; + + using callback_t = std::function; + std::vector funcs; + uint32_t pos; + uint32_t size; + bool is_ready; + bool is_unique; + +public: + AudioFileSourceFunction(float sec, uint16_t channels = 1, uint32_t sample_per_sec = 8000, uint16_t bits_per_sample = 16); + virtual ~AudioFileSourceFunction() override; + + template + bool addAudioGenerators(const F& f, Fs&&... fs) { + funcs.emplace_back(f); + return addAudioGenerators(std::forward(fs)...); + } + bool addAudioGenerators() { + funcs.shrink_to_fit(); + if (funcs.size() == 1) { + is_ready = true; + is_unique = true; + return true; + } else if (funcs.size() == wav_header.format.channels) { + is_ready = true; + is_unique = false; + return true; + } else { + is_ready = false; + is_unique = false; + funcs.clear(); + return false; + } + } + + virtual uint32_t read(void* data, uint32_t len) override; + virtual bool seek(int32_t pos, int dir) override; + + virtual bool close() override; + virtual bool isOpen() override; + + virtual uint32_t getSize() override; + virtual uint32_t getPos() override; +}; + +#endif // _AUDIOFILESOURCEFUNCTION_H diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp index c07eb0944..c5d0b8334 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp @@ -18,6 +18,8 @@ along with this program. If not, see . */ +#if defined(ESP32) || defined(ESP8266) + #include "AudioFileSourceHTTPStream.h" AudioFileSourceHTTPStream::AudioFileSourceHTTPStream() @@ -40,7 +42,7 @@ bool AudioFileSourceHTTPStream::open(const char *url) http.begin(client, url); http.setReuse(true); #ifndef ESP32 - http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); + http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); #endif int code = http.GET(); if (code != HTTP_CODE_OK) { @@ -84,7 +86,7 @@ retry: cb.st(STATUS_DISCONNECTED, PSTR("Stream disconnected")); http.end(); for (int i = 0; i < reconnectTries; i++) { - char buff[32]; + char buff[64]; sprintf_P(buff, PSTR("Attempting to reconnect, try %d"), i); cb.st(STATUS_RECONNECTING, buff); delay(reconnectDelayMs); @@ -152,3 +154,5 @@ uint32_t AudioFileSourceHTTPStream::getPos() { return pos; } + +#endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.h b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.h index e764b45d8..34e54663d 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceHTTPStream.h @@ -1,7 +1,7 @@ /* AudioFileSourceHTTPStream Connect to a HTTP based streaming service - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -18,14 +18,13 @@ along with this program. If not, see . */ -#ifndef _AUDIOFILESOURCEHTTPSTREAM_H -#define _AUDIOFILESOURCEHTTPSTREAM_H +#if defined(ESP32) || defined(ESP8266) +#pragma once #include #ifdef ESP32 #include #else - #include #include #endif #include "AudioFileSource.h" @@ -38,7 +37,7 @@ class AudioFileSourceHTTPStream : public AudioFileSource AudioFileSourceHTTPStream(); AudioFileSourceHTTPStream(const char *url); virtual ~AudioFileSourceHTTPStream() override; - + virtual bool open(const char *url) override; virtual uint32_t read(void *data, uint32_t len) override; virtual uint32_t readNonBlock(void *data, uint32_t len) override; @@ -48,6 +47,7 @@ class AudioFileSourceHTTPStream : public AudioFileSource virtual uint32_t getSize() override; virtual uint32_t getPos() override; bool SetReconnect(int tries, int delayms) { reconnectTries = tries; reconnectDelayMs = delayms; return true; } + void useHTTP10 () { http.useHTTP10(true); } enum { STATUS_HTTPFAIL=2, STATUS_DISCONNECTED, STATUS_RECONNECTING, STATUS_RECONNECTED, STATUS_NODATA }; @@ -64,3 +64,4 @@ class AudioFileSourceHTTPStream : public AudioFileSource #endif + diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.cpp b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.cpp index cc7cc5e27..63c84f328 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.cpp @@ -17,6 +17,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ + +#if defined(ESP32) || defined(ESP8266) + #define _GNU_SOURCE #include "AudioFileSourceICYStream.h" @@ -83,12 +86,16 @@ AudioFileSourceICYStream::~AudioFileSourceICYStream() uint32_t AudioFileSourceICYStream::readInternal(void *data, uint32_t len, bool nonBlock) { + // Ensure we can't possibly read 2 ICY headers in a single go #355 + if (icyMetaInt > 1) { + len = std::min((int)(icyMetaInt >> 1), (int)len); + } retry: if (!http.connected()) { cb.st(STATUS_DISCONNECTED, PSTR("Stream disconnected")); http.end(); for (int i = 0; i < reconnectTries; i++) { - char buff[32]; + char buff[64]; sprintf_P(buff, PSTR("Attempting to reconnect, try %d"), i); cb.st(STATUS_RECONNECTING, buff); delay(reconnectDelayMs); @@ -211,3 +218,5 @@ retry: icyByteCount += ret; return read; } + +#endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.h b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.h index dacbf7efd..97688a57d 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceICYStream.h @@ -1,7 +1,7 @@ /* AudioFileSourceHTTPStream Connect to a HTTP based streaming service - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -18,8 +18,8 @@ along with this program. If not, see . */ -#ifndef _AUDIOFILESOURCEICYSTREAM_H -#define _AUDIOFILESOURCEICYSTREAM_H +#if defined(ESP32) || defined(ESP8266) +#pragma once #include #ifdef ESP32 @@ -36,7 +36,7 @@ class AudioFileSourceICYStream : public AudioFileSourceHTTPStream AudioFileSourceICYStream(); AudioFileSourceICYStream(const char *url); virtual ~AudioFileSourceICYStream() override; - + virtual bool open(const char *url) override; private: @@ -45,5 +45,4 @@ class AudioFileSourceICYStream : public AudioFileSourceHTTPStream int icyByteCount; }; - #endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceID3.cpp b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceID3.cpp index 1723b8d4d..2a22bb180 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceID3.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceID3.cpp @@ -143,6 +143,7 @@ uint32_t AudioFileSourceID3::read(void *data, uint32_t len) if (ret<10) return ret; if ((buff[0]!='I') || (buff[1]!='D') || (buff[2]!='3') || (buff[3]>0x04) || (buff[3]<0x02) || (buff[4]!=0)) { + cb.md("eof", false, "id3"); return 10 + src->read(buff+10, len-10); } @@ -212,9 +213,9 @@ uint32_t AudioFileSourceID3::read(void *data, uint32_t len) // Read the value and send to callback char value[64]; - uint16_t i; + uint32_t i; bool isUnicode = (id3.getByte()==1) ? true : false; - for (i=0; iread(data, len); } diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSD.h b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSD.h index 3eb079bce..eacd99188 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSD.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSD.h @@ -1,7 +1,7 @@ /* AudioFileSourceSPIFFS Input SD card "file" to be used by AudioGenerator - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -22,10 +22,6 @@ #define _AUDIOFILESOURCESD_H #include "AudioFileSource.h" -#ifdef ESP8266 -#include -#include -#endif #include @@ -35,7 +31,7 @@ class AudioFileSourceSD : public AudioFileSource AudioFileSourceSD(); AudioFileSourceSD(const char *filename); virtual ~AudioFileSourceSD() override; - + virtual bool open(const char *filename) override; virtual uint32_t read(void *data, uint32_t len) override; virtual bool seek(int32_t pos, int dir) override; @@ -50,3 +46,4 @@ class AudioFileSourceSD : public AudioFileSource #endif + diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.cpp b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.cpp index fafadcea8..2c9eb3b96 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.cpp @@ -22,6 +22,8 @@ along with this program. If not, see . */ +#if defined(ESP32) || defined(ESP8266) + #include #include "AudioFileSourceSPIRAMBuffer.h" @@ -165,3 +167,5 @@ bool AudioFileSourceSPIRAMBuffer::loop() } return true; } + +#endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.h b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.h index 19d915f1a..d8c05540b 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIRAMBuffer.h @@ -19,8 +19,8 @@ along with this program. If not, see . */ -#ifndef _AUDIOFILESOURCESPIRAMBUFFER_H -#define _AUDIOFILESOURCESPIRAMBUFFER_H +#if defined(ESP32) || defined(ESP8266) +#pragma once #include "AudioFileSource.h" #include diff --git a/lib/lib_audio/ESP8266Audio/src/AudioGenerator.h b/lib/lib_audio/ESP8266Audio/src/AudioGenerator.h index 889b2285c..6d974876a 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioGenerator.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioGenerator.h @@ -35,6 +35,7 @@ class AudioGenerator virtual bool loop() { return false; }; virtual bool stop() { return false; }; virtual bool isRunning() { return false;}; + virtual void desync () { }; public: virtual bool RegisterMetadataCB(AudioStatus::metadataCBFn fn, void *data) { return cb.RegisterMetadataCB(fn, data); } diff --git a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp index 98f720786..c7568676a 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp @@ -144,8 +144,13 @@ bool AudioGeneratorAAC::loop() // If we've got data, try and pump it out... while (validSamples) { - lastSample[0] = outSample[curSample*2]; - lastSample[1] = outSample[curSample*2 + 1]; + if (lastChannels == 1) { + lastSample[0] = outSample[curSample]; + lastSample[1] = outSample[curSample]; + } else { + lastSample[0] = outSample[curSample*2]; + lastSample[1] = outSample[curSample*2 + 1]; + } if (!output->ConsumeSample(lastSample)) goto done; // Can't send, but no error detected validSamples--; curSample++; diff --git a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorFLAC.cpp b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorFLAC.cpp index 1af00ce3a..bd6e801c9 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorFLAC.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorFLAC.cpp @@ -177,9 +177,9 @@ FLAC__StreamDecoderWriteStatus AudioGeneratorFLAC::write_cb(const FLAC__StreamDe // Hackish warning here. FLAC sends the buffer but doesn't free it until the next call to decode_frame, so we stash // the pointers here and use it in our loop() instead of memcpy()'ing into yet another buffer. buffLen = frame->header.blocksize; - buff[0] = buffer[0]; - if (frame->header.channels>1) buff[1] = buffer[1]; - else buff[1] = buffer[0]; + buff[0] = (const int *)buffer[0]; + if (frame->header.channels>1) buff[1] = (const int *)buffer[1]; + else buff[1] = (const int *)buffer[0]; buffPtr = 0; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } diff --git a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.cpp b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.cpp index 2979a5848..d962c9e0b 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.cpp @@ -1,7 +1,7 @@ /* AudioGeneratorMP3 Wrap libmad MP3 library to play audio - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -29,11 +29,23 @@ AudioGeneratorMP3::AudioGeneratorMP3() buff = NULL; nsCountMax = 1152/32; madInitted = false; - preallocateSpace = NULL; - preallocateSize = 0; } -AudioGeneratorMP3::AudioGeneratorMP3(void *space, int size) +AudioGeneratorMP3::AudioGeneratorMP3(void *space, int size): preallocateSpace(space), preallocateSize(size) +{ + running = false; + file = NULL; + output = NULL; + buff = NULL; + nsCountMax = 1152/32; + madInitted = false; +} + +AudioGeneratorMP3::AudioGeneratorMP3(void *buff, int buffSize, void *stream, int streamSize, void *frame, int frameSize, void *synth, int synthSize): + preallocateSpace(buff), preallocateSize(buffSize), + preallocateStreamSpace(stream), preallocateStreamSize(streamSize), + preallocateFrameSpace(frame), preallocateFrameSize(frameSize), + preallocateSynthSpace(synth), preallocateSynthSize(synthSize) { running = false; file = NULL; @@ -41,8 +53,6 @@ AudioGeneratorMP3::AudioGeneratorMP3(void *space, int size) buff = NULL; nsCountMax = 1152/32; madInitted = false; - preallocateSpace = space; - preallocateSize = size; } AudioGeneratorMP3::~AudioGeneratorMP3() @@ -52,7 +62,7 @@ AudioGeneratorMP3::~AudioGeneratorMP3() free(synth); free(frame); free(stream); - } + } } @@ -109,7 +119,12 @@ enum mad_flow AudioGeneratorMP3::Input() if (stream->next_frame) { unused = lastBuffLen - (stream->next_frame - buff); - memmove(buff, stream->next_frame, unused); + if (unused < 0) { + desync(); + unused = 0; + } else { + memmove(buff, stream->next_frame, unused); + } stream->next_frame = NULL; } @@ -125,6 +140,10 @@ enum mad_flow AudioGeneratorMP3::Input() // Can't read any from the file, and we don't have anything left. It's done.... return MAD_FLOW_STOP; } + if (len < 0) { + desync(); + unused = 0; + } lastBuffLen = len + unused; mad_stream_buffer(stream, buff, lastBuffLen); @@ -132,6 +151,16 @@ enum mad_flow AudioGeneratorMP3::Input() return MAD_FLOW_CONTINUE; } +void AudioGeneratorMP3::desync () +{ + audioLogger->printf_P(PSTR("MP3:desync\n")); + if (stream) { + stream->next_frame = nullptr; + stream->this_frame = nullptr; + stream->sync = 0; + } + lastBuffLen = 0; +} bool AudioGeneratorMP3::DecodeNextFrame() { @@ -153,7 +182,7 @@ bool AudioGeneratorMP3::GetOneSample(int16_t sample[2]) output->SetChannels(synth->pcm.channels); lastChannels = synth->pcm.channels; } - + // If we're here, we have one decoded frame and sent 0 or more samples out if (samplePtr < synth->pcm.length) { sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr]; @@ -161,7 +190,7 @@ bool AudioGeneratorMP3::GetOneSample(int16_t sample[2]) samplePtr++; } else { samplePtr = 0; - + switch ( mad_synth_frame_onens(synth, frame, nsCount++) ) { case MAD_FLOW_STOP: case MAD_FLOW_BREAK: audioLogger->printf_P(PSTR("msf1ns failed\n")); @@ -196,6 +225,18 @@ retry: } if (!DecodeNextFrame()) { + if (stream->error == MAD_ERROR_BUFLEN) { + // randomly seeking can lead to endless + // and unrecoverable "MAD_ERROR_BUFLEN" loop + audioLogger->printf_P(PSTR("MP3:ERROR_BUFLEN %d\n"), unrecoverable); + if (++unrecoverable >= 3) { + unrecoverable = 0; + stop(); + return running; + } + } else { + unrecoverable = 0; + } goto retry; } samplePtr = 9999; @@ -229,6 +270,9 @@ bool AudioGeneratorMP3::begin(AudioFileSource *source, AudioOutput *output) return false; // Error } + // Reset error count from previous file + unrecoverable = 0; + output->SetBitsPerSample(16); // Constant for MP3 decoder output->SetChannels(2); @@ -243,16 +287,32 @@ bool AudioGeneratorMP3::begin(AudioFileSource *source, AudioOutput *output) lastBuffLen = 0; // Allocate all large memory chunks - if (preallocateSpace) { + if (preallocateStreamSize + preallocateFrameSize + preallocateSynthSize) { + if (preallocateSize >= preAllocBuffSize() && + preallocateStreamSize >= preAllocStreamSize() && + preallocateFrameSize >= preAllocFrameSize() && + preallocateSynthSize >= preAllocSynthSize()) { + buff = reinterpret_cast(preallocateSpace); + stream = reinterpret_cast(preallocateStreamSpace); + frame = reinterpret_cast(preallocateFrameSpace); + synth = reinterpret_cast(preallocateSynthSpace); + } + else { + audioLogger->printf_P("OOM error in MP3: Want %d/%d/%d/%d bytes, have %d/%d/%d/%d bytes preallocated.\n", + preAllocBuffSize(), preAllocStreamSize(), preAllocFrameSize(), preAllocSynthSize(), + preallocateSize, preallocateStreamSize, preallocateFrameSize, preallocateSynthSize); + return false; + } + } else if (preallocateSpace) { uint8_t *p = reinterpret_cast(preallocateSpace); buff = reinterpret_cast(p); - p += (buffLen+7) & ~7; + p += preAllocBuffSize(); stream = reinterpret_cast(p); - p += (sizeof(struct mad_stream)+7) & ~7; + p += preAllocStreamSize(); frame = reinterpret_cast(p); - p += (sizeof(struct mad_frame)+7) & ~7; + p += preAllocFrameSize(); synth = reinterpret_cast(p); - p += (sizeof(struct mad_synth)+7) & ~7; + p += preAllocSynthSize(); int neededBytes = p - reinterpret_cast(preallocateSpace); if (neededBytes > preallocateSize) { audioLogger->printf_P("OOM error in MP3: Want %d bytes, have %d bytes preallocated.\n", neededBytes, preallocateSize); @@ -272,19 +332,17 @@ bool AudioGeneratorMP3::begin(AudioFileSource *source, AudioOutput *output) stream = NULL; frame = NULL; synth = NULL; - uint32_t size = buffLen + sizeof(struct mad_stream) + sizeof(struct mad_frame) + sizeof(struct mad_synth); - audioLogger->printf_P("OOM error in MP3: Want %d bytes\n", size); return false; } } - + mad_stream_init(stream); mad_frame_init(frame); mad_synth_init(synth); synth->pcm.length = 0; mad_stream_options(stream, 0); // TODO - add options support madInitted = true; - + running = true; return true; } @@ -304,7 +362,7 @@ extern "C" { { return 8192; } -#elif defined(ESP8266) +#elif defined(ESP8266) && !defined(CORE_MOCK) #include extern cont_t g_cont; @@ -351,3 +409,4 @@ extern "C" { } #endif } + diff --git a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.h b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.h index 750cecaca..0f4e439e9 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorMP3.h @@ -30,17 +30,31 @@ class AudioGeneratorMP3 : public AudioGenerator public: AudioGeneratorMP3(); AudioGeneratorMP3(void *preallocateSpace, int preallocateSize); + AudioGeneratorMP3(void *buff, int buffSize, void *stream, int streamSize, void *frame, int frameSize, void *synth, int synthSize); virtual ~AudioGeneratorMP3() override; virtual bool begin(AudioFileSource *source, AudioOutput *output) override; virtual bool loop() override; virtual bool stop() override; virtual bool isRunning() override; - - protected: - void *preallocateSpace; - int preallocateSize; + virtual void desync () override; - const int buffLen = 0x600; // Slightly larger than largest MP3 frame + static constexpr int preAllocSize () { return preAllocBuffSize() + preAllocStreamSize() + preAllocFrameSize() + preAllocSynthSize(); } + static constexpr int preAllocBuffSize () { return ((buffLen + 7) & ~7); } + static constexpr int preAllocStreamSize () { return ((sizeof(struct mad_stream) + 7) & ~7); } + static constexpr int preAllocFrameSize () { return (sizeof(struct mad_frame) + 7) & ~7; } + static constexpr int preAllocSynthSize () { return (sizeof(struct mad_synth) + 7) & ~7; } + + protected: + void *preallocateSpace = nullptr; + int preallocateSize = 0; + void *preallocateStreamSpace = nullptr; + int preallocateStreamSize = 0; + void *preallocateFrameSpace = nullptr; + int preallocateFrameSize = 0; + void *preallocateSynthSpace = nullptr; + int preallocateSynthSize = 0; + + static constexpr int buffLen = 0x600; // Slightly larger than largest MP3 frame unsigned char *buff; int lastReadPos; int lastBuffLen; @@ -62,6 +76,8 @@ class AudioGeneratorMP3 : public AudioGenerator bool DecodeNextFrame(); bool GetOneSample(int16_t sample[2]); + private: + int unrecoverable = 0; }; #endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.cpp new file mode 100644 index 000000000..5c8af8e5c --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.cpp @@ -0,0 +1,245 @@ +/* + AudioOutputFilterBiquad + Implements a Biquad filter + + Copyright (C) 2012 Nigel Redmon + Copyright (C) 2021 William Bérubé + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 +#include "AudioOutputFilterBiquad.h" + +AudioOutputFilterBiquad::AudioOutputFilterBiquad(AudioOutput *sink) +{ + this->sink = sink; + + type = bq_type_lowpass; + a0 = 1.0; + a1 = a2 = b1 = b2 = 0.0; + Fc = 0.50; + Q = 0.707; + peakGain = 0.0; + z1 = z2 = 0.0; +} + +AudioOutputFilterBiquad::AudioOutputFilterBiquad(int type, float Fc, float Q, float peakGain, AudioOutput *sink) +{ + this->sink = sink; + + SetBiquad(type, Fc, Q, peakGain); + z1 = z2 = 0.0; +} + +AudioOutputFilterBiquad::~AudioOutputFilterBiquad() {} + +bool AudioOutputFilterBiquad::SetRate(int hz) +{ + return sink->SetRate(hz); +} + +bool AudioOutputFilterBiquad::SetBitsPerSample(int bits) +{ + return sink->SetBitsPerSample(bits); +} + +bool AudioOutputFilterBiquad::SetChannels(int channels) +{ + return sink->SetChannels(channels); +} + +bool AudioOutputFilterBiquad::SetGain(float gain) +{ + return sink->SetGain(gain); +} + +void AudioOutputFilterBiquad::SetType(int type) +{ + this->type = type; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetFc(float Fc) +{ + this->Fc = Fc; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetQ(float Q) +{ + this->Q = Q; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetPeakGain(float peakGain) +{ + this->peakGain = peakGain; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::SetBiquad(int type, float Fc, float Q, float peakGain) +{ + this->type = type; + this->Fc = Fc; + this->Q = Q; + this->peakGain = peakGain; + CalcBiquad(); +} + +void AudioOutputFilterBiquad::CalcBiquad() +{ + float norm; + float V = pow(10, fabs(peakGain) / 20.0); + float K = tan(M_PI * Fc); + + switch (this->type) { + case bq_type_lowpass: + norm = 1 / (1 + K / Q + K * K); + a0 = K * K * norm; + a1 = 2 * a0; + a2 = a0; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_highpass: + norm = 1 / (1 + K / Q + K * K); + a0 = 1 * norm; + a1 = -2 * a0; + a2 = a0; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_bandpass: + norm = 1 / (1 + K / Q + K * K); + a0 = K / Q * norm; + a1 = 0; + a2 = -a0; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_notch: + norm = 1 / (1 + K / Q + K * K); + a0 = (1 + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = a0; + b1 = a1; + b2 = (1 - K / Q + K * K) * norm; + break; + + case bq_type_peak: + if (peakGain >= 0) { // boost + norm = 1 / (1 + 1/Q * K + K * K); + a0 = (1 + V/Q * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - V/Q * K + K * K) * norm; + b1 = a1; + b2 = (1 - 1/Q * K + K * K) * norm; + } else { // cut + norm = 1 / (1 + V/Q * K + K * K); + a0 = (1 + 1/Q * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - 1/Q * K + K * K) * norm; + b1 = a1; + b2 = (1 - V/Q * K + K * K) * norm; + } + break; + + case bq_type_lowshelf: + if (peakGain >= 0) { // boost + norm = 1 / (1 + sqrt(2) * K + K * K); + a0 = (1 + sqrt(2*V) * K + V * K * K) * norm; + a1 = 2 * (V * K * K - 1) * norm; + a2 = (1 - sqrt(2*V) * K + V * K * K) * norm; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - sqrt(2) * K + K * K) * norm; + } + else { // cut + norm = 1 / (1 + sqrt(2*V) * K + V * K * K); + a0 = (1 + sqrt(2) * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - sqrt(2) * K + K * K) * norm; + b1 = 2 * (V * K * K - 1) * norm; + b2 = (1 - sqrt(2*V) * K + V * K * K) * norm; + } + break; + + case bq_type_highshelf: + if (peakGain >= 0) { // boost + norm = 1 / (1 + sqrt(2) * K + K * K); + a0 = (V + sqrt(2*V) * K + K * K) * norm; + a1 = 2 * (K * K - V) * norm; + a2 = (V - sqrt(2*V) * K + K * K) * norm; + b1 = 2 * (K * K - 1) * norm; + b2 = (1 - sqrt(2) * K + K * K) * norm; + } + else { // cut + norm = 1 / (V + sqrt(2*V) * K + K * K); + a0 = (1 + sqrt(2) * K + K * K) * norm; + a1 = 2 * (K * K - 1) * norm; + a2 = (1 - sqrt(2) * K + K * K) * norm; + b1 = 2 * (K * K - V) * norm; + b2 = (V - sqrt(2*V) * K + K * K) * norm; + } + break; + } + + i_a0 = a0 * BQ_DECAL; + i_a1 = a1 * BQ_DECAL; + i_a2 = a2 * BQ_DECAL; + + i_b1 = b1 * BQ_DECAL; + i_b2 = b2 * BQ_DECAL; + + i_lz1 = i_rz1 = z1 * BQ_DECAL; + i_lz2 = i_rz2 = z2 * BQ_DECAL; + + i_Fc = Fc * BQ_DECAL; + i_Q = Q * BQ_DECAL; + i_peakGain = peakGain * BQ_DECAL; +} + +bool AudioOutputFilterBiquad::begin() +{ + return sink->begin(); +} + +bool AudioOutputFilterBiquad::ConsumeSample(int16_t sample[2]) +{ + + int32_t leftSample = (sample[LEFTCHANNEL] << BQ_SHIFT) / 2; + int32_t rightSample = (sample[RIGHTCHANNEL] << BQ_SHIFT) / 2; + + int64_t leftOutput = ((leftSample * i_a0) >> BQ_SHIFT) + i_lz1; + i_lz1 = ((leftSample * i_a1) >> BQ_SHIFT) + i_lz2 - ((i_b1 * leftOutput) >> BQ_SHIFT); + i_lz2 = ((leftSample * i_a2) >> BQ_SHIFT) - ((i_b2 * leftOutput) >> BQ_SHIFT); + + int64_t rightOutput = ((rightSample * i_a0) >> BQ_SHIFT) + i_rz1; + i_rz1 = ((rightSample * i_a1) >> BQ_SHIFT) + i_rz2 - ((i_b1 * rightOutput) >> BQ_SHIFT); + i_rz2 = ((rightSample * i_a2) >> BQ_SHIFT) - ((i_b2 * rightOutput) >> BQ_SHIFT); + + int16_t out[2]; + out[LEFTCHANNEL] = (int16_t)(leftOutput >> BQ_SHIFT); + out[RIGHTCHANNEL] = (int16_t)(rightOutput >> BQ_SHIFT); + + return sink->ConsumeSample(out); +} + +bool AudioOutputFilterBiquad::stop() +{ + return sink->stop(); +} diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.h b/lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.h new file mode 100644 index 000000000..f4dc95f51 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputFilterBiquad.h @@ -0,0 +1,80 @@ +/* + AudioOutputFilterBiquad + Implements a Biquad filter + + Copyright (C) 2012 Nigel Redmon + Copyright (C) 2021 William Bérubé + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _AudioOutputFilterBiquad_H +#define _AudioOutputFilterBiquad_H + +#include "AudioOutput.h" + +#define BQ_SHIFT 16 +#define BQ_DECAL 65536 + +enum { + bq_type_lowpass = 0, + bq_type_highpass, + bq_type_bandpass, + bq_type_notch, + bq_type_peak, + bq_type_lowshelf, + bq_type_highshelf +}; + +class AudioOutputFilterBiquad : public AudioOutput +{ + public: + AudioOutputFilterBiquad(AudioOutput *sink); + AudioOutputFilterBiquad(int type, float Fc, float Q, float peakGain, AudioOutput *sink); + virtual ~AudioOutputFilterBiquad() override; + virtual bool SetRate(int hz) override; + virtual bool SetBitsPerSample(int bits) override; + virtual bool SetChannels(int chan) override; + virtual bool SetGain(float f) override; + virtual bool begin() override; + virtual bool ConsumeSample(int16_t sample[2]) override; + virtual bool stop() override; + + private: + void SetType(int type); + void SetFc(float Fc); + void SetQ(float Q); + void SetPeakGain(float peakGain); + void SetBiquad(int type, float Fc, float Q, float peakGain); + + protected: + AudioOutput *sink; + int buffSize; + int16_t *leftSample; + int16_t *rightSample; + int writePtr; + int readPtr; + bool filled; + int type; + void CalcBiquad(); + int64_t i_a0, i_a1, i_a2, i_b1, i_b2; + int64_t i_Fc, i_Q, i_peakGain; + int64_t i_lz1, i_lz2, i_rz1, i_rz2; + float a0, a1, a2, b1, b2; + float Fc, Q, peakGain; + float z1, z2; +}; + +#endif + diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp index c028df105..cec3abe75 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp @@ -1,7 +1,7 @@ /* AudioOutputI2S Base class for I2S interface port - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -21,11 +21,12 @@ #include #ifdef ESP32 #include "driver/i2s.h" -#else - #include +#elif defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) + #include #endif #include "AudioOutputI2S.h" +#if defined(ESP32) || defined(ESP8266) AudioOutputI2S::AudioOutputI2S(int port, int output_mode, int dma_buf_count, int use_apll) { this->portNo = port; @@ -35,115 +36,93 @@ AudioOutputI2S::AudioOutputI2S(int port, int output_mode, int dma_buf_count, int output_mode = EXTERNAL_I2S; } this->output_mode = output_mode; -#ifdef ESP32 - if (!i2sOn) { - if (use_apll == APLL_AUTO) { - // don't use audio pll on buggy rev0 chips - use_apll = APLL_DISABLE; - esp_chip_info_t out_info; - esp_chip_info(&out_info); - if(out_info.revision > 0) { - use_apll = APLL_ENABLE; - } - } + this->use_apll = use_apll; - i2s_mode_t mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); -#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 - if (output_mode == INTERNAL_DAC) { - mode = (i2s_mode_t)(mode | I2S_MODE_DAC_BUILT_IN); - } else if (output_mode == INTERNAL_PDM) { - mode = (i2s_mode_t)(mode | I2S_MODE_PDM); - } -#endif - - i2s_comm_format_t comm_fmt = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB); - if (output_mode == INTERNAL_DAC) { - comm_fmt = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S_MSB; - } - - i2s_config_t i2s_config_dac = { - .mode = mode, - .sample_rate = 44100, - .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = comm_fmt, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // lowest interrupt priority - .dma_buf_count = dma_buf_count, - .dma_buf_len = 64, - .use_apll = use_apll // Use audio PLL - }; - audioLogger->printf("+%d %p\n", portNo, &i2s_config_dac); - if (i2s_driver_install((i2s_port_t)portNo, &i2s_config_dac, 0, NULL) != ESP_OK) { - audioLogger->println("ERROR: Unable to install I2S drives\n"); - } - if (output_mode == INTERNAL_DAC || output_mode == INTERNAL_PDM) { - i2s_set_pin((i2s_port_t)portNo, NULL); - i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); - } else { - SetPinout(26, 25, 22); - } - i2s_zero_dma_buffer((i2s_port_t)portNo); - } -#else - (void) dma_buf_count; - (void) use_apll; - if (!i2sOn) { - orig_bck = READ_PERI_REG(PERIPHS_IO_MUX_MTDO_U); - orig_ws = READ_PERI_REG(PERIPHS_IO_MUX_GPIO2_U); - i2s_begin(); - } -#endif - i2sOn = true; + //set defaults mono = false; bps = 16; channels = 2; + hertz = 44100; + bclkPin = 26; + wclkPin = 25; + doutPin = 22; SetGain(1.0); - SetRate(44100); // Default } -AudioOutputI2S::~AudioOutputI2S() +bool AudioOutputI2S::SetPinout() { -#ifdef ESP32 - if (i2sOn) { - audioLogger->printf("UNINSTALL I2S\n"); - i2s_driver_uninstall((i2s_port_t)portNo); //stop & destroy i2s driver - } -#else - if (i2sOn) i2s_end(); -#endif - i2sOn = false; + #ifdef ESP32 + if (output_mode == INTERNAL_DAC || output_mode == INTERNAL_PDM) + return false; // Not allowed + + i2s_pin_config_t pins = { + .bck_io_num = bclkPin, + .ws_io_num = wclkPin, + .data_out_num = doutPin, + .data_in_num = I2S_PIN_NO_CHANGE}; + i2s_set_pin((i2s_port_t)portNo, &pins); + return true; + #else + (void)bclkPin; + (void)wclkPin; + (void)doutPin; + return false; + #endif } bool AudioOutputI2S::SetPinout(int bclk, int wclk, int dout) { -#ifdef ESP32 - if (output_mode == INTERNAL_DAC || output_mode == INTERNAL_PDM) return false; // Not allowed + bclkPin = bclk; + wclkPin = wclk; + doutPin = dout; + if (i2sOn) + return SetPinout(); - i2s_pin_config_t pins = { - .bck_io_num = bclk, - .ws_io_num = wclk, - .data_out_num = dout, - .data_in_num = I2S_PIN_NO_CHANGE - }; - i2s_set_pin((i2s_port_t)portNo, &pins); return true; -#else - (void) bclk; - (void) wclk; - (void) dout; - return false; +} +#elif defined(ARDUINO_ARCH_RP2040) +AudioOutputI2S::AudioOutputI2S(long sampleRate, pin_size_t sck, pin_size_t data) { + i2sOn = false; + mono = false; + bps = 16; + channels = 2; + hertz = sampleRate; + bclkPin = sck; + doutPin = data; + SetGain(1.0); +} #endif + +AudioOutputI2S::~AudioOutputI2S() +{ + #ifdef ESP32 + if (i2sOn) { + audioLogger->printf("UNINSTALL I2S\n"); + i2s_driver_uninstall((i2s_port_t)portNo); //stop & destroy i2s driver + } + #elif defined(ESP8266) + if (i2sOn) + i2s_end(); + #elif defined(ARDUINO_ARCH_RP2040) + stop(); + #endif + i2sOn = false; } bool AudioOutputI2S::SetRate(int hz) { // TODO - have a list of allowable rates from constructor, check them this->hertz = hz; -#ifdef ESP32 - i2s_set_sample_rates((i2s_port_t)portNo, AdjustI2SRate(hz)); -#else - i2s_set_rate(AdjustI2SRate(hz)); -#endif + if (i2sOn) + { + #ifdef ESP32 + i2s_set_sample_rates((i2s_port_t)portNo, AdjustI2SRate(hz)); + #elif defined(ESP8266) + i2s_set_rate(AdjustI2SRate(hz)); + #elif defined(ARDUINO_ARCH_RP2040) + I2S.setFrequency(hz); + #endif + } return true; } @@ -167,13 +146,106 @@ bool AudioOutputI2S::SetOutputModeMono(bool mono) return true; } -bool AudioOutputI2S::begin() +bool AudioOutputI2S::begin(bool txDAC) { + #ifdef ESP32 + if (!i2sOn) + { + if (use_apll == APLL_AUTO) + { + // don't use audio pll on buggy rev0 chips + use_apll = APLL_DISABLE; + esp_chip_info_t out_info; + esp_chip_info(&out_info); + if (out_info.revision > 0) + { + use_apll = APLL_ENABLE; + } + } + + i2s_mode_t mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); + if (output_mode == INTERNAL_DAC) + { + mode = (i2s_mode_t)(mode | I2S_MODE_DAC_BUILT_IN); + } + else if (output_mode == INTERNAL_PDM) + { + mode = (i2s_mode_t)(mode | I2S_MODE_PDM); + } + + i2s_comm_format_t comm_fmt = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB); + if (output_mode == INTERNAL_DAC) + { + comm_fmt = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S_MSB; + } + + i2s_config_t i2s_config_dac = { + .mode = mode, + .sample_rate = 44100, + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = comm_fmt, + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // lowest interrupt priority + .dma_buf_count = dma_buf_count, + .dma_buf_len = 64, + .use_apll = use_apll // Use audio PLL + }; + audioLogger->printf("+%d %p\n", portNo, &i2s_config_dac); + if (i2s_driver_install((i2s_port_t)portNo, &i2s_config_dac, 0, NULL) != ESP_OK) + { + audioLogger->println("ERROR: Unable to install I2S drives\n"); + } + if (output_mode == INTERNAL_DAC || output_mode == INTERNAL_PDM) + { + i2s_set_pin((i2s_port_t)portNo, NULL); + i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); + } + else + { + SetPinout(); + } + i2s_zero_dma_buffer((i2s_port_t)portNo); + } + #elif defined(ESP8266) + (void)dma_buf_count; + (void)use_apll; + if (!i2sOn) + { + orig_bck = READ_PERI_REG(PERIPHS_IO_MUX_MTDO_U); + orig_ws = READ_PERI_REG(PERIPHS_IO_MUX_GPIO2_U); + #ifdef I2S_HAS_BEGIN_RXTX_DRIVE_CLOCKS + if (!i2s_rxtxdrive_begin(false, true, false, txDAC)) { + return false; + } + #else + if (!i2s_rxtx_begin(false, true)) { + return false; + } + if (!txDAC) { + audioLogger->printf_P(PSTR("I2SNoDAC: esp8266 arduino core should be upgraded to avoid conflicts with SPI\n")); + } + #endif + } + #elif defined(ARDUINO_ARCH_RP2040) + (void)txDAC; + if (!i2sOn) { + I2S.setBCLK(bclkPin); + I2S.setDOUT(doutPin); + I2S.begin(hertz); + } + #endif + i2sOn = true; + SetRate(hertz); // Default return true; } bool AudioOutputI2S::ConsumeSample(int16_t sample[2]) { + + //return if we haven't called ::begin yet + if (!i2sOn) + return false; + int16_t ms[2]; ms[0] = sample[0]; @@ -185,43 +257,55 @@ bool AudioOutputI2S::ConsumeSample(int16_t sample[2]) int32_t ttl = ms[LEFTCHANNEL] + ms[RIGHTCHANNEL]; ms[LEFTCHANNEL] = ms[RIGHTCHANNEL] = (ttl>>1) & 0xffff; } -#ifdef ESP32 - uint32_t s32; - if (output_mode == INTERNAL_DAC) { - int16_t l = Amplify(ms[LEFTCHANNEL]) + 0x8000; - int16_t r = Amplify(ms[RIGHTCHANNEL]) + 0x8000; - s32 = (r<<16) | (l&0xffff); - } else { - s32 = ((Amplify(ms[RIGHTCHANNEL]))<<16) | (Amplify(ms[LEFTCHANNEL]) & 0xffff); - } -// Deprecated. Use i2s_write -// return i2s_write_bytes((i2s_port_t)portNo, (const char*)&s32, sizeof(uint32_t), 0); - size_t bytes_written; - i2s_write((i2s_port_t)portNo, (const char*)&s32, sizeof(uint32_t), &bytes_written, 0); - return bytes_written; -#else - uint32_t s32 = ((Amplify(ms[RIGHTCHANNEL]))<<16) | (Amplify(ms[LEFTCHANNEL]) & 0xffff); - return i2s_write_sample_nb(s32); // If we can't store it, return false. OTW true -#endif + #ifdef ESP32 + uint32_t s32; + if (output_mode == INTERNAL_DAC) + { + int16_t l = Amplify(ms[LEFTCHANNEL]) + 0x8000; + int16_t r = Amplify(ms[RIGHTCHANNEL]) + 0x8000; + s32 = (r << 16) | (l & 0xffff); + } + else + { + s32 = ((Amplify(ms[RIGHTCHANNEL])) << 16) | (Amplify(ms[LEFTCHANNEL]) & 0xffff); + } + return i2s_write_bytes((i2s_port_t)portNo, (const char *)&s32, sizeof(uint32_t), 0); + #elif defined(ESP8266) + uint32_t s32 = ((Amplify(ms[RIGHTCHANNEL])) << 16) | (Amplify(ms[LEFTCHANNEL]) & 0xffff); + return i2s_write_sample_nb(s32); // If we can't store it, return false. OTW true + #elif defined(ARDUINO_ARCH_RP2040) + return !!I2S.write((void*)ms, 4); + #endif } -void AudioOutputI2S::flush() { -#ifdef ESP32 - // makes sure that all stored DMA samples are consumed / played - int buffersize = 64 * this->dma_buf_count; - int16_t samples[2] = {0x0,0x0}; - for (int i=0;idma_buf_count; + int16_t samples[2] = {0x0, 0x0}; + for (int i = 0; i < buffersize; i++) + { + while (!ConsumeSample(samples)) + { + delay(10); + } } - } -#endif + #elif defined(ARDUINO_ARCH_RP2040) + I2S.flush(); + #endif } bool AudioOutputI2S::stop() { -#ifdef ESP32 - i2s_zero_dma_buffer((i2s_port_t)portNo); -#endif + if (!i2sOn) + return false; + + #ifdef ESP32 + i2s_zero_dma_buffer((i2s_port_t)portNo); + #elif defined(ARDUINO_ARCH_RP2040) + I2S.end(); + #endif + i2sOn = false; return true; } diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.h b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.h index 6070ca4e8..90370dc27 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.h @@ -18,41 +18,47 @@ along with this program. If not, see . */ -#ifndef _AUDIOOUTPUTI2S_H -#define _AUDIOOUTPUTI2S_H +#pragma once #include "AudioOutput.h" class AudioOutputI2S : public AudioOutput { public: +#if defined(ESP32) || defined(ESP8266) AudioOutputI2S(int port=0, int output_mode=EXTERNAL_I2S, int dma_buf_count = 8, int use_apll=APLL_DISABLE); - virtual ~AudioOutputI2S() override; bool SetPinout(int bclkPin, int wclkPin, int doutPin); + enum : int { APLL_AUTO = -1, APLL_ENABLE = 1, APLL_DISABLE = 0 }; + enum : int { EXTERNAL_I2S = 0, INTERNAL_DAC = 1, INTERNAL_PDM = 2 }; +#elif defined(ARDUINO_ARCH_RP2040) + AudioOutputI2S(long sampleRate = 44100, pin_size_t sck = 26, pin_size_t data = 28); +#endif + virtual ~AudioOutputI2S() override; virtual bool SetRate(int hz) override; virtual bool SetBitsPerSample(int bits) override; virtual bool SetChannels(int channels) override; - virtual bool begin() override; + virtual bool begin() override { return begin(true); } virtual bool ConsumeSample(int16_t sample[2]) override; virtual void flush() override; virtual bool stop() override; + bool begin(bool txDAC); bool SetOutputModeMono(bool mono); // Force mono output no matter the input - enum : int { APLL_AUTO = -1, APLL_ENABLE = 1, APLL_DISABLE = 0 }; - enum : int { EXTERNAL_I2S = 0, INTERNAL_DAC = 1, INTERNAL_PDM = 2 }; - protected: + bool SetPinout(); virtual int AdjustI2SRate(int hz) { return hz; } uint8_t portNo; int output_mode; bool mono; bool i2sOn; int dma_buf_count; + int use_apll; // We can restore the old values and free up these pins when in NoDAC mode uint32_t orig_bck; uint32_t orig_ws; + + uint8_t bclkPin; + uint8_t wclkPin; + uint8_t doutPin; }; - -#endif - diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp index 4f7b21ff7..c38b4b5f0 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp @@ -1,7 +1,7 @@ /* AudioOutputI2SNoDAC Audio player using SW delta-sigma to generate "analog" on I2S data - + Copyright (C) 2017 Earle F. Philhower, III This program is free software: you can redistribute it and/or modify @@ -21,8 +21,8 @@ #include #ifdef ESP32 #include "driver/i2s.h" -#else - #include +#elif defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) + #include #endif #include "AudioOutputI2SNoDAC.h" @@ -32,7 +32,7 @@ AudioOutputI2SNoDAC::AudioOutputI2SNoDAC(int port) : AudioOutputI2S(port, false) SetOversampling(32); lastSamp = 0; cumErr = 0; -#ifndef ESP32 +#ifdef ESP8266 WRITE_PERI_REG(PERIPHS_IO_MUX_MTDO_U, orig_bck); WRITE_PERI_REG(PERIPHS_IO_MUX_GPIO2_U, orig_ws); #endif @@ -66,7 +66,7 @@ void AudioOutputI2SNoDAC::DeltaSigma(int16_t sample[2], uint32_t dsBuff[8]) for (int j = 0; j < oversample32; j++) { uint32_t bits = 0; // The bits we convert the sample into, MSB to go on the wire first - + for (int i = 32; i > 0; i--) { bits = bits << 1; if (cumErr < 0) { @@ -95,19 +95,19 @@ bool AudioOutputI2SNoDAC::ConsumeSample(int16_t sample[2]) // Either send complete pulse stream or nothing #ifdef ESP32 - -// Deprecated. Use i2s_write -// if (!i2s_write_bytes((i2s_port_t)portNo, (const char *)dsBuff, sizeof(uint32_t) * (oversample/32), 0)) - size_t bytes_written; - i2s_write((i2s_port_t)portNo, (const char *)dsBuff, sizeof(uint32_t) * (oversample/32), &bytes_written, 0); - if (!bytes_written) + if (!i2s_write_bytes((i2s_port_t)portNo, (const char *)dsBuff, sizeof(uint32_t) * (oversample/32), 0)) return false; -#else +#elif defined(ESP8266) if (!i2s_write_sample_nb(dsBuff[0])) return false; // No room at the inn // At this point we've sent in first of possibly 8 32-bits, need to send // remaining ones even if they block. for (int i = 32; i < oversample; i+=32) i2s_write_sample( dsBuff[i / 32]); +#elif defined(ARDUINO_ARCH_RP2040) + int16_t *p = (int16_t *) dsBuff; + for (int i = 0; i < oversample / 16; i++) { + I2S.write(*(p++)); + } #endif return true; } diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.h b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.h index b5f321457..2a6322524 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.h @@ -18,8 +18,7 @@ along with this program. If not, see . */ -#ifndef _AUDIOOUTPUTI2SNODAC_H -#define _AUDIOOUTPUTI2SNODAC_H +#pragma once #include "AudioOutputI2S.h" @@ -28,6 +27,7 @@ class AudioOutputI2SNoDAC : public AudioOutputI2S public: AudioOutputI2SNoDAC(int port = 0); virtual ~AudioOutputI2SNoDAC() override; + virtual bool begin() override { return AudioOutputI2S::begin(false); } virtual bool ConsumeSample(int16_t sample[2]) override; bool SetOversampling(int os); @@ -41,6 +41,3 @@ class AudioOutputI2SNoDAC : public AudioOutputI2S fixed24p8_t lastSamp; // Last sample value fixed24p8_t cumErr; // Running cumulative error since time began }; - -#endif - diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.cpp index 8c993c5f9..53483d4ac 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.cpp @@ -37,6 +37,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#if defined(ESP32) || defined(ESP8266) #include #if defined(ESP32) @@ -286,3 +287,5 @@ bool AudioOutputSPDIF::stop() frame_num = 0; return true; } + +#endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.h b/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.h index 92a4e46e4..5da160b3d 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.h +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputSPDIF.h @@ -30,8 +30,8 @@ along with this program. If not, see . */ -#ifndef _AUDIOOUTPUTSPDIF_H -#define _AUDIOOUTPUTSPDIF_H +#if defined(ESP32) || defined(ESP8266) +#pragma once #include "AudioOutput.h" diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputULP.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputULP.cpp new file mode 100644 index 000000000..63177e3a1 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputULP.cpp @@ -0,0 +1,262 @@ +/* + AudioOutputULP + Outputs to ESP32 DAC through the ULP, freeing I2S for other uses + + Copyright (C) 2020 Martin Laclaustra, based on bitluni's code + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 ESP32 + +#include "AudioOutputULP.h" +#include +#include +#include +#include +#include + +uint32_t create_I_WR_REG(uint32_t reg, uint32_t low_bit, uint32_t high_bit, uint32_t val){ + typedef union {ulp_insn_t ulp_ins; uint32_t ulp_bin;} ulp_union; + const ulp_insn_t singleinstruction[] = {I_WR_REG(reg, low_bit, high_bit, val)}; + ulp_union recover_ins; + recover_ins.ulp_ins=singleinstruction[0]; + return (uint32_t)(recover_ins.ulp_bin); +} + +uint32_t create_I_BXI(uint32_t imm_pc){ + typedef union {ulp_insn_t ulp_ins; uint32_t ulp_bin;} ulp_union; + const ulp_insn_t singleinstruction[] = {I_BXI(imm_pc)}; + ulp_union recover_ins; + recover_ins.ulp_ins=singleinstruction[0]; + return (uint32_t)(recover_ins.ulp_bin); +} + +bool AudioOutputULP::begin() +{ + if(!stereoOutput){ + waitingOddSample = false; + //totalSampleWords += 512; + //dacTableStart2 = dacTableStart1; + } + + //calculate the actual ULP clock + unsigned long rtc_8md256_period = rtc_clk_cal(RTC_CAL_8MD256, 1000); + unsigned long rtc_fast_freq_hz = 1000000ULL * (1 << RTC_CLK_CAL_FRACT) * 256 / rtc_8md256_period; + + //initialize DACs + if(activeDACs & 1){ + dac_output_enable(DAC_CHANNEL_1); + dac_output_voltage(DAC_CHANNEL_1, 128); + } + if(activeDACs & 2){ + dac_output_enable(DAC_CHANNEL_2); + dac_output_voltage(DAC_CHANNEL_2, 128); + } + + int retAddress1 = 9; + int retAddress2 = 14; + + int loopCycles = 134; + int loopHalfCycles1 = 90; + int loopHalfCycles2 = 44; + + Serial.print("Real RTC clock: "); + Serial.println(rtc_fast_freq_hz); + + uint32_t dt = (rtc_fast_freq_hz / hertz) - loopCycles; + uint32_t dt2 = 0; + if(!stereoOutput){ + dt = (rtc_fast_freq_hz / hertz) - loopHalfCycles1; + dt2 = (rtc_fast_freq_hz / hertz) - loopHalfCycles2; + } + + Serial.print("dt: "); + Serial.println(dt); + + Serial.print("dt2: "); + Serial.println(dt2); + + const ulp_insn_t stereo[] = { + //reset offset register + I_MOVI(R3, 0), + //delay to get the right sampling rate + I_DELAY(dt), // 6 + dt + //reset sample index + I_MOVI(R0, 0), // 6 + //write the index back to memory for the main cpu + I_ST(R0, R3, indexAddress), // 8 + //load the samples + I_LD(R1, R0, bufferStart), // 8 + //mask the lower 8 bits + I_ANDI(R2, R1, 0x00ff), // 6 + //multiply by 2 + I_LSHI(R2, R2, 1), // 6 + //add start position + I_ADDI(R2, R2, dacTableStart1),// 6 + //jump to the dac opcode + I_BXR(R2), // 4 + //back from first dac + //delay between the two samples in mono rendering + I_DELAY(dt2), // 6 + dt2 + //mask the upper 8 bits + I_ANDI(R2, R1, 0xff00), // 6 + //shift the upper bits to right and multiply by 2 + I_RSHI(R2, R2, 8 - 1), // 6 + //add start position of second dac table + I_ADDI(R2, R2, dacTableStart2),// 6 + //jump to the dac opcode + I_BXR(R2), // 4 + //here we get back from writing the second sample + //load 0x8080 as sample + I_MOVI(R1, 0x8080), // 6 + //write 0x8080 in the sample buffer + I_ST(R1, R0, indexAddress), // 8 + //increment the sample index + I_ADDI(R0, R0, 1), // 6 + //if reached end of the buffer, jump relative to index reset + I_BGE(-16, totalSampleWords), // 4 + //wait to get the right sample rate (2 cycles more to compensate the index reset) + I_DELAY((unsigned int)dt + 2), // 8 + dt + //if not, jump absolute to where index is written to memory + I_BXI(3) // 4 + }; + // write io and jump back another 12 + 4 + 12 + 4 + + size_t load_addr = 0; + size_t size = sizeof(stereo)/sizeof(ulp_insn_t); + ulp_process_macros_and_load(load_addr, stereo, &size); + // this is how to get the opcodes + // for(int i = 0; i < size; i++) + // Serial.println(RTC_SLOW_MEM[i], HEX); + + //create DAC opcode tables + switch(activeDACs){ + case 1: + for(int i = 0; i < 256; i++) + { + RTC_SLOW_MEM[dacTableStart1 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG,19,26,i); //dac1: 0x1D4C0121 | (i << 10) + RTC_SLOW_MEM[dacTableStart1 + 1 + i * 2] = create_I_BXI(retAddress1); // 0x80000000 + retAddress1 * 4 + RTC_SLOW_MEM[dacTableStart2 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG,19,26,i); //dac2: 0x1D4C0122 | (i << 10) + RTC_SLOW_MEM[dacTableStart2 + 1 + i * 2] = create_I_BXI(retAddress2); // 0x80000000 + retAddress2 * 4 + } + break; + case 2: + for(int i = 0; i < 256; i++) + { + RTC_SLOW_MEM[dacTableStart1 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC2_REG,19,26,i); //dac1: 0x1D4C0121 | (i << 10) + RTC_SLOW_MEM[dacTableStart1 + 1 + i * 2] = create_I_BXI(retAddress1); // 0x80000000 + retAddress1 * 4 + RTC_SLOW_MEM[dacTableStart2 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC2_REG,19,26,i); //dac2: 0x1D4C0122 | (i << 10) + RTC_SLOW_MEM[dacTableStart2 + 1 + i * 2] = create_I_BXI(retAddress2); // 0x80000000 + retAddress2 * 4 + } + break; + case 3: + for(int i = 0; i < 256; i++) + { + RTC_SLOW_MEM[dacTableStart1 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG,19,26,i); //dac1: 0x1D4C0121 | (i << 10) + RTC_SLOW_MEM[dacTableStart1 + 1 + i * 2] = create_I_BXI(retAddress1); // 0x80000000 + retAddress1 * 4 + RTC_SLOW_MEM[dacTableStart2 + i * 2] = create_I_WR_REG(RTC_IO_PAD_DAC1_REG,19,26,i); //dac2: 0x1D4C0122 | (i << 10) + RTC_SLOW_MEM[dacTableStart2 + 1 + i * 2] = create_I_BXI(retAddress2); // 0x80000000 + retAddress2 * 4 + } + break; + } + + //set all samples to 128 (silence) + for(int i = 0; i < totalSampleWords; i++) + RTC_SLOW_MEM[bufferStart + i] = 0x8080; + + //start + RTC_SLOW_MEM[indexAddress] = 0; + ulp_run(0); + + //wait until ULP starts using samples and the index of output sample advances + while(RTC_SLOW_MEM[indexAddress] == 0) + delay(1); + + return true; +} + +bool AudioOutputULP::ConsumeSample(int16_t sample[2]) +{ + int16_t ms[2]; + ms[0] = sample[0]; + ms[1] = sample[1]; + MakeSampleStereo16( ms ); + + // TODO: needs improvement (counting is different here with respect to ULP code) + int currentSample = RTC_SLOW_MEM[indexAddress] & 0xffff; + int currentWord = currentSample >> 1; + + for (int i=0; i<2; i++) { + ms[i] = ((ms[i] >> 8) + 128) & 0xff; + } + if(!stereoOutput) // mix both channels + ms[0] = (uint16_t)(( (uint32_t)((int32_t)(ms[0]) + (int32_t)(ms[1])) >> 1 ) & 0xff); + + if(waitingOddSample){ // always true for stereo because samples are consumed in pairs + if(lastFilledWord != currentWord) // accept sample if writing index lastFilledWord has not reached index of output sample + { + unsigned int w; + if(stereoOutput){ + w = ms[0]; + w |= ms[1] << 8; + } else { + w = bufferedOddSample; + w |= ms[0] << 8; + bufferedOddSample = 128; + waitingOddSample = false; + } + RTC_SLOW_MEM[bufferStart + lastFilledWord] = w; + lastFilledWord++; + if(lastFilledWord == totalSampleWords) + lastFilledWord = 0; + return true; + } else { + return false; + } + } else { + bufferedOddSample = ms[0]; + waitingOddSample = true; + return true; + } +} + + +bool AudioOutputULP::stop() +{ + audioLogger->printf_P(PSTR("\n\n\nstop\n\n\n")); + const ulp_insn_t stopulp[] = { + //stop the timer + I_END(), + //end the program + I_HALT()}; + + size_t load_addr = 0; + size_t size = sizeof(stopulp)/sizeof(ulp_insn_t); + ulp_process_macros_and_load(load_addr, stopulp, &size); + + //start + ulp_run(0); + + if(activeDACs & 1){ + dac_output_voltage(DAC_CHANNEL_1, 128); + } + if(activeDACs & 2){ + dac_output_voltage(DAC_CHANNEL_2, 128); + } + + return true; +} + +#endif diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputULP.h b/lib/lib_audio/ESP8266Audio/src/AudioOutputULP.h new file mode 100644 index 000000000..fc4e438c1 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputULP.h @@ -0,0 +1,69 @@ +/* + AudioOutputULP + Outputs to ESP32 DAC through the ULP, freeing I2S for other uses + + Copyright (C) 2020 Martin Laclaustra, based on bitluni's code + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Instructions: +// AudioOutputULP out = new AudioOutputULP(); // stereo +// Connect left channel on pin 25 +// Connect right channel on pin 26 +// OR +// Connect mono channel on either of them (stereo samples are downmixed) +// AudioOutputULP out = new AudioOutputULP(1); // mono, only DAC 1 +// OR +// AudioOutputULP out = new AudioOutputULP(2); // mono, only DAC 2 + + +#ifndef _AUDIOOUTPUTULP_H +#define _AUDIOOUTPUTULP_H + +#include "AudioOutput.h" + +#ifdef ESP32 + +class AudioOutputULP : public AudioOutput +{ + public: + AudioOutputULP(int argActiveDACs=3) {if(argActiveDACs<1||argActiveDACs>2)argActiveDACs=3;activeDACs=argActiveDACs;stereoOutput=activeDACs==3;}; + ~AudioOutputULP() {}; + virtual bool begin() override; + virtual bool ConsumeSample(int16_t sample[2]) override; + virtual bool stop() override; + enum : int { DAC1 = 1, DAC2 = 2 }; + private: + int lastFilledWord = 0; + uint8_t bufferedOddSample = 128; + bool waitingOddSample = true; // must be set to false for mono output + int activeDACs = 3; // 1:DAC1; 2:DAC2; 3:both; + bool stereoOutput = true; + const int opcodeCount = 20; + const uint32_t dacTableStart1 = 2048 - 512; + const uint32_t dacTableStart2 = dacTableStart1 - 512; + uint32_t totalSampleWords = 2048 - 512 - 512 - (opcodeCount + 1); // add 512 for mono + const int totalSamples = totalSampleWords * 2; + const uint32_t indexAddress = opcodeCount; + const uint32_t bufferStart = indexAddress + 1; +}; + +#else + +#error Only the ESP32 supports ULP audio output + +#endif + +#endif diff --git a/lib/lib_audio/ESP8266Audio/src/ESP8266Audio.h b/lib/lib_audio/ESP8266Audio/src/ESP8266Audio.h new file mode 100644 index 000000000..eb0acc52a --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/ESP8266Audio.h @@ -0,0 +1,50 @@ +// Lazy "include all the things" header for simplicity. +// In general a user should only include the specific headers they need +// to miniimize build times. + +// Input stage +#include "AudioFileSourceBuffer.h" +#include "AudioFileSourceFATFS.h" +#include "AudioFileSourceFS.h" +#include "AudioFileSource.h" +#include "AudioFileSourceHTTPStream.h" +#include "AudioFileSourceICYStream.h" +#include "AudioFileSourceID3.h" +#include "AudioFileSourceLittleFS.h" +#include "AudioFileSourcePROGMEM.h" +#include "AudioFileSourceSD.h" +#include "AudioFileSourceSPIFFS.h" +#include "AudioFileSourceSPIRAMBuffer.h" +#include "AudioFileSourceSTDIO.h" + +// Misc. plumbing +#include "AudioFileStream.h" +#include "AudioLogger.h" +#include "AudioStatus.h" + +// Actual decode/audio generation logic +#include "AudioGeneratorAAC.h" +#include "AudioGeneratorFLAC.h" +#include "AudioGenerator.h" +#include "AudioGeneratorMIDI.h" +#include "AudioGeneratorMOD.h" +#include "AudioGeneratorMP3a.h" +#include "AudioGeneratorMP3.h" +#include "AudioGeneratorOpus.h" +#include "AudioGeneratorRTTTL.h" +#include "AudioGeneratorTalkie.h" +#include "AudioGeneratorWAV.h" + +// Render(output) sounds +#include "AudioOutputBuffer.h" +#include "AudioOutputFilterDecimate.h" +#include "AudioOutput.h" +#include "AudioOutputI2S.h" +#include "AudioOutputI2SNoDAC.h" +#include "AudioOutputMixer.h" +#include "AudioOutputNull.h" +#include "AudioOutputSerialWAV.h" +#include "AudioOutputSPDIF.h" +#include "AudioOutputSPIFFSWAV.h" +#include "AudioOutputSTDIO.h" +#include "AudioOutputULP.h" diff --git a/lib/lib_audio/ESP8266Audio/src/libflac/bitreader.c b/lib/lib_audio/ESP8266Audio/src/libflac/bitreader.c index a64c1ce53..b2a751d40 100644 --- a/lib/lib_audio/ESP8266Audio/src/libflac/bitreader.c +++ b/lib/lib_audio/ESP8266Audio/src/libflac/bitreader.c @@ -121,6 +121,8 @@ struct FLAC__BitReader { void *client_data; }; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" static inline void crc16_update_word_(FLAC__BitReader *br, brword word) { unsigned crc = br->read_crc16; @@ -149,6 +151,7 @@ static inline void crc16_update_word_(FLAC__BitReader *br, brword word) #endif br->crc16_align = 0; } +#pragma GCC diagnostic pop static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) { @@ -338,6 +341,8 @@ void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) br->crc16_align = br->consumed_bits; } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) { FLAC__ASSERT(0 != br); @@ -353,6 +358,7 @@ FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) } return br->read_crc16; } +#pragma GCC diagnostic pop inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) { diff --git a/lib/lib_audio/ESP8266Audio/src/libflac/config.h b/lib/lib_audio/ESP8266Audio/src/libflac/config.h index b6efd1dc8..cf6c07dfe 100644 --- a/lib/lib_audio/ESP8266Audio/src/libflac/config.h +++ b/lib/lib_audio/ESP8266Audio/src/libflac/config.h @@ -2,9 +2,7 @@ #ifdef DEBUG #undef NDEBUG -#endif - -#ifndef NDEBUG +#else #define NDEBUG #endif diff --git a/lib/lib_audio/ESP8266Audio/src/libflac/cpu.c b/lib/lib_audio/ESP8266Audio/src/libflac/cpu.c index efed11b7f..cd650a09c 100644 --- a/lib/lib_audio/ESP8266Audio/src/libflac/cpu.c +++ b/lib/lib_audio/ESP8266Audio/src/libflac/cpu.c @@ -31,7 +31,7 @@ */ //#ifdef HAVE_CONFIG_H -# include +# include "config.h" //#endif #include "private/cpu.h" diff --git a/lib/lib_audio/ESP8266Audio/src/libflac/crc.c b/lib/lib_audio/ESP8266Audio/src/libflac/crc.c index 1b531e3d1..88ef8cfbc 100644 --- a/lib/lib_audio/ESP8266Audio/src/libflac/crc.c +++ b/lib/lib_audio/ESP8266Audio/src/libflac/crc.c @@ -136,7 +136,8 @@ FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) return crc; } - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) { unsigned crc = 0; @@ -146,3 +147,4 @@ unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) return crc; } +#pragma GCC diagnostic pop diff --git a/lib/lib_audio/ESP8266Audio/src/libflac/stream_decoder.c b/lib/lib_audio/ESP8266Audio/src/libflac/stream_decoder.c index eabcf092c..ec172fe8d 100644 --- a/lib/lib_audio/ESP8266Audio/src/libflac/stream_decoder.c +++ b/lib/lib_audio/ESP8266Audio/src/libflac/stream_decoder.c @@ -2021,6 +2021,8 @@ FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) return true; } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) { uint32_t channel; @@ -2167,6 +2169,7 @@ FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FL decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; return true; } +#pragma GCC diagnostic pop FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) { diff --git a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/assembly.h b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/assembly.h index fc4d76739..595a8fc97 100644 --- a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/assembly.h +++ b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/assembly.h @@ -223,7 +223,7 @@ Word64 MADD64(Word64 sum64, int x, int y); /* toolchain: ARM ADS or RealView * target architecture: ARM v.4 and above (requires 'M' type processor for 32x32->64 multiplier) */ -#elif defined (__arm) && defined (__ARMCC_VERSION) +#elif defined (XXX__arm) && defined (__ARMCC_VERSION) static __inline int MULSHIFT32(int x, int y) { @@ -336,7 +336,7 @@ static __inline Word64 MADD64(Word64 sum64, int x, int y) /* toolchain: ARM gcc * target architecture: ARM v.4 and above (requires 'M' type processor for 32x32->64 multiplier) */ -#elif defined(__GNUC__) && defined(__arm__) +#elif defined(__GNUC__) && defined(XXXX__arm__) static inline int MULSHIFT32(int x, int y) { diff --git a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbr.c b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbr.c index ec046720c..e46391585 100644 --- a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbr.c +++ b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbr.c @@ -44,6 +44,7 @@ **************************************************************************************/ #if defined(USE_DEFAULT_STDLIB) || defined(ARDUINO) +#include #include #else #include "hlxclib/stdlib.h" diff --git a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbrhfgen.c b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbrhfgen.c index 7ebc047af..e5f27eb6d 100644 --- a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbrhfgen.c +++ b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/sbrhfgen.c @@ -76,7 +76,7 @@ static const int newBWTab[4][4] PROGMEM = { * Notes: this is carefully written to be efficient on ARM * use the assembly code version in sbrcov.s when building for ARM! **************************************************************************************/ -#if (defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) +#if (defined (XXXX__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(XXXX__arm__)) #ifdef __cplusplus extern "C" #endif @@ -237,7 +237,7 @@ static int CalcCovariance1(int *XBuf, int *p01reN, int *p01imN, int *p12reN, int * Notes: this is carefully written to be efficient on ARM * use the assembly code version in sbrcov.s when building for ARM! **************************************************************************************/ -#if (defined (__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(__arm__)) +#if (defined (XXXX__arm) && defined (__ARMCC_VERSION)) || (defined (_WIN32) && defined (_WIN32_WCE) && defined (ARM)) || (defined(__GNUC__) && defined(XXXX__arm__)) #ifdef __cplusplus extern "C" #endif diff --git a/lib/lib_audio/ESP8266Audio/src/libhelix-mp3/assembly.h b/lib/lib_audio/ESP8266Audio/src/libhelix-mp3/assembly.h index 9c10c4da0..b9e46c529 100644 --- a/lib/lib_audio/ESP8266Audio/src/libhelix-mp3/assembly.h +++ b/lib/lib_audio/ESP8266Audio/src/libhelix-mp3/assembly.h @@ -217,7 +217,7 @@ static __inline int CLZ(int x) return numZeros; } -#elif defined ARM_ADS +#elif defined XXXARM_ADS static __inline int MULSHIFT32(int x, int y) { @@ -267,7 +267,7 @@ static __inline int CLZ(int x) return numZeros; } -#elif defined(__GNUC__) && defined(__thumb__) +#elif defined(__GNUC__) && defined(XXXX__thumb__) static __inline int MULSHIFT32(int x, int y) diff --git a/lib/lib_audio/ESP8266Audio/src/libmad/global.h b/lib/lib_audio/ESP8266Audio/src/libmad/global.h index a6debfd8b..a688495f8 100644 --- a/lib/lib_audio/ESP8266Audio/src/libmad/global.h +++ b/lib/lib_audio/ESP8266Audio/src/libmad/global.h @@ -48,6 +48,7 @@ # endif # if !defined(HAVE_ASSERT_H) +# undef assert # if defined(NDEBUG) # define assert(x) /* nothing */ # else diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c b/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c index 329b6f6cc..7e7296ed5 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c @@ -482,7 +482,7 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch) int pitch_index; VARDECL( opus_val16, lp_pitch_buf ); SAVE_STACK; - ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); + opus_val16 *lp_pitch_buf = (opus_val16*)malloc((DECODE_BUFFER_SIZE>>1) * sizeof(opus_val16)); //ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); pitch_downsample(decode_mem, lp_pitch_buf, DECODE_BUFFER_SIZE, C, arch); pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, @@ -490,6 +490,7 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch) PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch); pitch_index = PLC_PITCH_LAG_MAX-pitch_index; RESTORE_STACK; + free(lp_pitch_buf); return pitch_index; } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/config.h b/lib/lib_audio/ESP8266Audio/src/libopus/config.h index 3577204b6..dc1ee1e98 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/config.h +++ b/lib/lib_audio/ESP8266Audio/src/libopus/config.h @@ -206,3 +206,5 @@ # define _Restrict # define __restrict__ #endif + +#include diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c b/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c index 5a1eb675e..36732293f 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c @@ -239,21 +239,30 @@ opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len) { - OpusRepacketizer rp; + OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer)); opus_int32 ret; - if (len < 1) + if (len < 1) { + free(rp); return OPUS_BAD_ARG; - if (len==new_len) + } + if (len==new_len) { + free(rp); return OPUS_OK; - else if (len > new_len) + } + else if (len > new_len) { + free(rp); return OPUS_BAD_ARG; - opus_repacketizer_init(&rp); + } + opus_repacketizer_init(rp); /* Moving payload to the end of the packet so we can do in-place padding */ OPUS_MOVE(data+new_len-len, data, len); - ret = opus_repacketizer_cat(&rp, data+new_len-len, len); - if (ret != OPUS_OK) + ret = opus_repacketizer_cat(rp, data+new_len-len, len); + if (ret != OPUS_OK) { + free(rp); return ret; - ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, new_len, 0, 1); + } + ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, new_len, 0, 1); + free(rp); if (ret > 0) return OPUS_OK; else @@ -262,15 +271,20 @@ int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len) opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len) { - OpusRepacketizer rp; + OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer)); opus_int32 ret; - if (len < 1) + if (len < 1) { + free(rp); return OPUS_BAD_ARG; - opus_repacketizer_init(&rp); - ret = opus_repacketizer_cat(&rp, data, len); - if (ret < 0) + } + opus_repacketizer_init(rp); + ret = opus_repacketizer_cat(rp, data, len); + if (ret < 0) { + free(rp); return ret; - ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, len, 0, 0); + } + ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, len, 0, 0); + free(rp); celt_assert(ret > 0 && ret <= len); return ret; } @@ -312,12 +326,14 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in unsigned char toc; opus_int16 size[48]; opus_int32 packet_offset; - OpusRepacketizer rp; + OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer)); unsigned char *dst; opus_int32 dst_len; - if (len < 1) + if (len < 1){ + free(rp); return OPUS_BAD_ARG; + } dst = data; dst_len = 0; /* Unpad all frames */ @@ -325,25 +341,34 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in { opus_int32 ret; int self_delimited = s!=nb_streams-1; - if (len<=0) + if (len<=0) { + free(rp); return OPUS_INVALID_PACKET; - opus_repacketizer_init(&rp); + } + opus_repacketizer_init(rp); ret = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, size, NULL, &packet_offset); - if (ret<0) + if (ret<0) { + free(rp); return ret; - ret = opus_repacketizer_cat_impl(&rp, data, packet_offset, self_delimited); - if (ret < 0) + } + ret = opus_repacketizer_cat_impl(rp, data, packet_offset, self_delimited); + if (ret < 0) { + free(rp); return ret; - ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, dst, len, self_delimited, 0); - if (ret < 0) + } + ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, dst, len, self_delimited, 0); + if (ret < 0) { + free(rp); return ret; + } else dst_len += ret; dst += ret; data += packet_offset; len -= packet_offset; } + free(rp); return dst_len; } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c index 40718e7a8..2b3e3340d 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c @@ -80,10 +80,11 @@ void silk_NLSF2A( }; const unsigned char *ordering; opus_int k, i, dd; - opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ]; - opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; + opus_int32 *cos_LSF_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC ); + opus_int32 *P = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1)); + opus_int32 *Q= (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1)); opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta; - opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ]; + opus_int32 *a32_QA1 = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC ); silk_assert( LSF_COS_TAB_SZ_FIX == 128 ); celt_assert( d==10 || d==16 ); @@ -137,5 +138,9 @@ void silk_NLSF2A( a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ } } + free(cos_LSF_QA); + free(P); + free(Q); + free(a32_QA1); } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c index b4a31d605..dd7862983 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c @@ -57,12 +57,12 @@ void silk_burg_modified_c( opus_int k, n, s, lz, rshifts, reached_max_gain; opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; const opus_int16 *x_ptr; - opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; - opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ]; - opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; - opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; - opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; - opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; + opus_int32 *C_first_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); + opus_int32 *C_last_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); + opus_int32 *Af_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); + opus_int32 *CAf = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1)); + opus_int32 *CAb = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1)); + opus_int32 *xcorr = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); opus_int64 C0_64; celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); @@ -277,4 +277,10 @@ void silk_burg_modified_c( *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ *res_nrg_Q = -rshifts; } + free(C_first_row); + free(C_last_row); + free(Af_QA); + free(CAf); + free(CAb); + free(xcorr); } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c index 7ef3a7efc..9c21f2a9b 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c @@ -49,8 +49,8 @@ void silk_warped_autocorrelation_FIX_c( { opus_int n, i, lsh; opus_int32 tmp1_QS, tmp2_QS; - opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + opus_int32 *state_QS = (opus_int32*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int32)); + opus_int64 *corr_QC = (opus_int64*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int64)); /* Order must be even */ celt_assert( ( order & 1 ) == 0 ); @@ -88,5 +88,7 @@ void silk_warped_autocorrelation_FIX_c( } } silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ + free(state_QS); + free(corr_QC); } #endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */ diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c index d8ce95c68..62aab5682 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c @@ -48,7 +48,8 @@ void silk_resampler_down2_3( opus_int32 *buf_ptr; SAVE_STACK; - ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); +// ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); + opus_int32 *buf = (opus_int32*)malloc((RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR) * sizeof(opus_int32)); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) ); @@ -99,5 +100,6 @@ void silk_resampler_down2_3( /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); + free(buf); RESTORE_STACK; } diff --git a/lib/lib_audio/ESP8266Audio/src/libtinysoundfont/tsf.h b/lib/lib_audio/ESP8266Audio/src/libtinysoundfont/tsf.h index e1a43221e..4ac232d14 100644 --- a/lib/lib_audio/ESP8266Audio/src/libtinysoundfont/tsf.h +++ b/lib/lib_audio/ESP8266Audio/src/libtinysoundfont/tsf.h @@ -486,16 +486,17 @@ struct tsf_stream_memory { const char* buffer; unsigned int total, pos; }; static int tsf_stream_memory_read(struct tsf_stream_memory* m, void* ptr, unsigned int size) { if (size > m->total - m->pos) size = m->total - m->pos; TSF_MEMCPY(ptr, m->buffer+m->pos, size); m->pos += size; return size; } static int tsf_stream_memory_tell(struct tsf_stream_memory* m) { return m->pos; } static int tsf_stream_memory_size(struct tsf_stream_memory* m) { return m->total; } -static int tsf_stream_memory_skip(struct tsf_stream_memory* m, unsigned int count) { if (m->pos + count > m->total) return 0; m->pos += count; return 1; } +static int tsf_stream_memory_skip(struct tsf_stream_memory* m, unsigned int count) { if (m->pos + count > m->total) count = m->total - m->pos; m->pos += count; return 1; } static int tsf_stream_memory_seek(struct tsf_stream_memory* m, unsigned int pos) { if (pos > m->total) return 0; else m->pos = pos; return 1; } -static int tsf_stream_memory_close(struct tsf_stream_memory* m) { (void)m; return 1; } +static int tsf_stream_memory_close(struct tsf_stream_memory* m) { TSF_FREE(m); return 1; } TSFDEF tsf* tsf_load_memory(const void* buffer, int size) { struct tsf_stream stream = { TSF_NULL, (int(*)(void*,void*,unsigned int))&tsf_stream_memory_read, (int(*)(void*))&tsf_stream_memory_tell, (int(*)(void*,unsigned int))&tsf_stream_memory_skip, (int(*)(void*,unsigned int))&tsf_stream_memory_seek, (int(*)(void*))&tsf_stream_memory_close, (int(*)(void*))&tsf_stream_memory_size }; - struct tsf_stream_memory f = { 0, 0, 0 }; - f.buffer = (const char*)buffer; - f.total = size; - stream.data = &f; + struct tsf_stream_memory* f = (struct tsf_stream_memory*)TSF_MALLOC(sizeof(struct tsf_stream_memory)); + f->pos = 0; + f->buffer = (const char*)buffer; + f->total = size; + stream.data = f; return tsf_load(&stream); } diff --git a/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c b/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c index bfd3c9e5d..7ffe32f89 100644 --- a/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c +++ b/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c @@ -90,12 +90,12 @@ int op_test(OpusHead *_head, ogg_sync_init(&oy); data=ogg_sync_buffer(&oy,(long)_initial_bytes); if(data!=NULL){ - ogg_stream_state os; + ogg_stream_state *os = (ogg_stream_state*)malloc(sizeof(ogg_stream_state)); ogg_page og; int ret; memcpy(data,_initial_data,_initial_bytes); ogg_sync_wrote(&oy,(long)_initial_bytes); - ogg_stream_init(&os,-1); + ogg_stream_init(os,-1); err=OP_FALSE; do{ ogg_packet op; @@ -104,11 +104,11 @@ int op_test(OpusHead *_head, if(ret<0)continue; /*Stop if we run out of data.*/ if(!ret)break; - ogg_stream_reset_serialno(&os,ogg_page_serialno(&og)); - ogg_stream_pagein(&os,&og); + ogg_stream_reset_serialno(os,ogg_page_serialno(&og)); + ogg_stream_pagein(os,&og); /*Only process the first packet on this page (if it's a BOS packet, it's required to be the only one).*/ - if(ogg_stream_packetout(&os,&op)==1){ + if(ogg_stream_packetout(os,&op)==1){ if(op.b_o_s){ ret=opus_head_parse(_head,op.packet,op.bytes); /*If this didn't look like Opus, keep going.*/ @@ -122,7 +122,8 @@ int op_test(OpusHead *_head, } } while(err==OP_FALSE); - ogg_stream_clear(&os); + ogg_stream_clear(os); + free(os); } else err=OP_EFAULT; ogg_sync_clear(&oy); @@ -835,7 +836,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, ogg_int64_t cur_page_gp; ogg_uint32_t serialno; opus_int32 total_duration; - int durations[255]; + int *durations = (int*)malloc(255 * sizeof(int)); int cur_page_eos; int op_count; int pi; @@ -852,26 +853,31 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, Otherwise there are no audio data packets in the whole logical stream.*/ if(OP_UNLIKELY(page_offset<0)){ /*Fail if there was a read error.*/ - if(page_offsethead.pre_skip>0)return OP_EBADTIMESTAMP; + if(_link->head.pre_skip>0) {free(durations); return OP_EBADTIMESTAMP;} _link->pcm_file_offset=0; /*Set pcm_end and end_offset so we can skip the call to op_find_final_pcm_offset().*/ _link->pcm_start=_link->pcm_end=0; _link->end_offset=_link->data_offset; + free(durations); return 0; } /*Similarly, if we hit the next link in the chain, we've gone too far.*/ if(OP_UNLIKELY(ogg_page_bos(_og))){ - if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP; + if(_link->head.pre_skip>0) { + free(durations); + return OP_EBADTIMESTAMP; + } /*Set pcm_end and end_offset so we can skip the call to op_find_final_pcm_offset().*/ _link->pcm_file_offset=0; _link->pcm_start=_link->pcm_end=0; _link->end_offset=_link->data_offset; /*Tell the caller we've got a buffered page for them.*/ + free(durations); return 1; } /*Ignore pages from other streams (not strictly necessary, because of the @@ -901,7 +907,10 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, cur_page_gp=_of->op[op_count-1].granulepos; /*But getting a packet without a valid granule position on the page is not okay.*/ - if(cur_page_gp==-1)return OP_EBADTIMESTAMP; + if(cur_page_gp==-1) { + free(durations); + return OP_EBADTIMESTAMP; + } cur_page_eos=_of->op[op_count-1].e_o_s; if(OP_LIKELY(!cur_page_eos)){ /*The EOS flag wasn't set. @@ -910,6 +919,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, if(OP_UNLIKELY(op_granpos_add(&pcm_start,cur_page_gp,-total_duration)<0)){ /*The starting granule position MUST not be smaller than the amount of audio on the first page with completed packets.*/ + free(durations); return OP_EBADTIMESTAMP; } } @@ -923,6 +933,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, /*However, the end-trimming MUST not ask us to trim more samples than exist after applying the pre-skip.*/ if(OP_UNLIKELY(op_granpos_cmp(cur_page_gp,_link->head.pre_skip)<0)){ + free(durations); return OP_EBADTIMESTAMP; } } @@ -957,6 +968,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, _link->pcm_file_offset=0; _of->prev_packet_gp=_link->pcm_start=pcm_start; _of->prev_page_offset=page_offset; + free(durations); return 0; } @@ -1391,32 +1403,34 @@ static int op_open_seekable2_impl(OggOpusFile *_of){ /*64 seek records should be enough for anybody. Actually, with a bisection search in a 63-bit range down to OP_CHUNK_SIZE granularity, much more than enough.*/ - OpusSeekRecord sr[64]; + OpusSeekRecord *sr = (OpusSeekRecord*)malloc(64 * sizeof(OpusSeekRecord)); opus_int64 data_offset; int ret; /*We can seek, so set out learning all about this file.*/ (*_of->callbacks.seek)(_of->stream,0,SEEK_END); _of->offset=_of->end=(*_of->callbacks.tell)(_of->stream); - if(OP_UNLIKELY(_of->end<0))return OP_EREAD; + if(OP_UNLIKELY(_of->end<0)){free(sr); return OP_EREAD;} data_offset=_of->links[0].data_offset; - if(OP_UNLIKELY(_of->endendend, _of->links[0].serialno,_of->serialnos,_of->nserialnos); - if(OP_UNLIKELY(ret<0))return ret; + if(OP_UNLIKELY(ret<0)){free(sr); return ret;} /*If there's any trailing junk, forget about it.*/ _of->end=sr[0].offset+sr[0].size; - if(OP_UNLIKELY(_of->endendserialnos,&_of->nserialnos,&_of->cserialnos); + free(sr); + return ret; } static int op_open_seekable2(OggOpusFile *_of){ ogg_sync_state oy_start; - ogg_stream_state os_start; + ogg_stream_state *os_start = (ogg_stream_state*)malloc(sizeof(ogg_stream_state)); ogg_packet *op_start; opus_int64 prev_page_offset; opus_int64 start_offset; @@ -1435,9 +1449,9 @@ static int op_open_seekable2(OggOpusFile *_of){ start_op_count=_of->op_count; /*This is a bit too large to put on the stack unconditionally.*/ op_start=(ogg_packet *)_ogg_malloc(sizeof(*op_start)*start_op_count); - if(op_start==NULL)return OP_EFAULT; + if(op_start==NULL){free(os_start); return OP_EFAULT;} *&oy_start=_of->oy; - *&os_start=_of->os; + *os_start=_of->os; prev_page_offset=_of->prev_page_offset; start_offset=_of->offset; memcpy(op_start,_of->op,sizeof(*op_start)*start_op_count); @@ -1449,7 +1463,7 @@ static int op_open_seekable2(OggOpusFile *_of){ ogg_stream_clear(&_of->os); ogg_sync_clear(&_of->oy); *&_of->oy=*&oy_start; - *&_of->os=*&os_start; + *&_of->os=*os_start; _of->offset=start_offset; _of->op_count=start_op_count; memcpy(_of->op,op_start,sizeof(*_of->op)*start_op_count); @@ -1457,9 +1471,10 @@ static int op_open_seekable2(OggOpusFile *_of){ _of->prev_packet_gp=_of->links[0].pcm_start; _of->prev_page_offset=prev_page_offset; _of->cur_discard_count=_of->links[0].head.pre_skip; - if(OP_UNLIKELY(ret<0))return ret; + if(OP_UNLIKELY(ret<0)){free(os_start); return ret;} /*And restore the position indicator.*/ ret=(*_of->callbacks.seek)(_of->stream,op_position(_of),SEEK_SET); + free(os_start); return OP_UNLIKELY(ret<0)?OP_EREAD:0; } @@ -1980,7 +1995,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of, ogg_stream_pagein(&_of->os,&og); if(OP_LIKELY(_of->ready_state>=OP_INITSET)){ opus_int32 total_duration; - int durations[255]; + int *durations = (int*)malloc(255 * sizeof(int)); int op_count; int report_hole; report_hole=0; @@ -2037,7 +2052,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of, Proceed to the next link, rather than risk playing back some samples that shouldn't have been played.*/ _of->op_count=0; - if(report_hole)return OP_HOLE; + if(report_hole){ free(durations); return OP_HOLE; } continue; } /*By default discard 80 ms of data after a seek, unless we seek @@ -2145,9 +2160,9 @@ static int op_fetch_and_process_page(OggOpusFile *_of, _of->prev_page_offset=_page_offset; _of->op_count=op_count=pi; } - if(report_hole)return OP_HOLE; + if(report_hole) { free(durations); return OP_HOLE; } /*If end-trimming didn't trim all the packets, we're done.*/ - if(op_count>0)return 0; + if(op_count>0) { free(durations); return 0; } } } } diff --git a/lib/lib_audio/ESP8266Audio/tests/common.sh b/lib/lib_audio/ESP8266Audio/tests/common.sh old mode 100644 new mode 100755 diff --git a/lib/lib_audio/ESP8266Audio/tests/host/Makefile b/lib/lib_audio/ESP8266Audio/tests/host/Makefile index 9a219465e..25156dbcd 100644 --- a/lib/lib_audio/ESP8266Audio/tests/host/Makefile +++ b/lib/lib_audio/ESP8266Audio/tests/host/Makefile @@ -73,12 +73,17 @@ libopus=../../src/libopus/opus_decoder.c ../../src/libopus/opus_projection_decod opusfile=../../src/opusfile/opusfile.c ../../src/opusfile/stream.c ../../src/opusfile/internal.c ../../src/opusfile/info.c -CCOPTS=-g -Wunused-parameter -Wall -m32 -include Arduino.h -CPPOPTS=-g -Wunused-parameter -Wall -std=c++11 -m32 -include Arduino.h +libflac=../../src/libflac/md5.c ../../src/libflac/window.c ../../src/libflac/memory.c ../../src/libflac/cpu.c \ +../../src/libflac/fixed.c ../../src/libflac/format.c ../../src/libflac/lpc.c ../../src/libflac/crc.c \ +../../src/libflac/bitreader.c ../../src/libflac/bitmath.c ../../src/libflac/stream_decoder.c ../../src/libflac/float.c + + +CCOPTS=-g -Wunused-parameter -Wall -m32 -include Arduino.h -Wstack-usage=300 +CPPOPTS=-g -Wunused-parameter -Wall -std=c++11 -m32 -Wstack-usage=300 -include Arduino.h .phony: all -all: mp3 aac wav midi opus +all: mp3 aac wav midi opus flac mp3: FORCE rm -f *.o @@ -94,6 +99,13 @@ aac: FORCE rm -f *.o echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./aac +flac: FORCE + rm -f *.o + gcc $(CCOPTS) -DUSE_DEFAULT_STDLIB -c $(libflac) -I ../../src/ -I ../../src/libflac -I. + g++ $(CPPOPTS) -o flac flac.cpp Serial.cpp *.o ../../src/AudioFileSourceSTDIO.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioFileSourceID3.cpp ../../src/AudioGeneratorFLAC.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. + rm -f *.o + echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./flac + wav: FORCE rm -f *.o g++ $(CPPOPTS) -o wav wav.cpp Serial.cpp ../../src/AudioFileSourceSTDIO.cpp ../../src/AudioOutputSTDIO.cpp ../../src/AudioGeneratorWAV.cpp ../../src/AudioLogger.cpp -I ../../src/ -I. @@ -116,6 +128,6 @@ opus: FORCE echo valgrind --leak-check=full --track-origins=yes -v --error-limit=no --show-leak-kinds=all ./opus clean: - rm -f mp3 aac wav midi opus *.o + rm -f mp3 aac wav midi opus flac *.o FORCE: diff --git a/lib/lib_audio/ESP8266Audio/tests/host/flac.cpp b/lib/lib_audio/ESP8266Audio/tests/host/flac.cpp new file mode 100644 index 000000000..2d7110da1 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/tests/host/flac.cpp @@ -0,0 +1,24 @@ +#include +#include "AudioFileSourceSTDIO.h" +#include "AudioOutputSTDIO.h" +#include "AudioGeneratorFLAC.h" + +#define AAC "gs-16b-2c-44100hz.flac" + +int main(int argc, char **argv) +{ + (void) argc; + (void) argv; + AudioFileSourceSTDIO *in = new AudioFileSourceSTDIO(AAC); + AudioOutputSTDIO *out = new AudioOutputSTDIO(); + out->SetFilename("out.flac.wav"); + AudioGeneratorFLAC *flac = new AudioGeneratorFLAC(); + + flac->begin(in, out); + while (flac->loop()) { /*noop*/ } + flac->stop(); + + delete flac; + delete out; + delete in; +} diff --git a/lib/lib_audio/ESP8266Audio/tests/host/gs-16b-2c-44100hz.flac b/lib/lib_audio/ESP8266Audio/tests/host/gs-16b-2c-44100hz.flac new file mode 100644 index 0000000000000000000000000000000000000000..1771321465b8a38b39609dc1ba48551d9cb20516 GIT binary patch literal 1336528 zcmeFYi(6Cm9|sPIx&i9Ac)>^+o}GcB;yI)qoqz*z2aX$pnv`F4df3FwaMN-{DmE_O z$2o``oSPV4^A=iZsTo*u@USVGX_-pREiajFTFnT4@AbPqzdzykJn}p|32bNQ^S-<; z@ApYZX)}X@f)b*FqJn~Yj|m!Q54)gz5)`&SpO>x5$-DPtOyrt}+1YDK3POW|=JbP? zQrdTQuZad04}W_3^)do4Bk(c;FC*|W0xu)*G6F9n@G=4~Bk(c; zFC*|W0xu)*G6F9n@G=4~Bk(c;FC*|W0xu)*G6F9n@G=4~Bk(c;FC*|W0xu)*|Mv*= z{9QOC=&c+$MsQDeP)Ok0{mrqez7r2|?~YXezAo6#u_(p&FLKabUOiTNGl?NtoJ?Y+ zK0QNoHZ}ZYP*Xw=+sL`s9GQn z7kwmS=SDmU8X8GMmzg1D$Y~rSaUA2Eat`5YPT%A( zGHtbiBzc!t&+@2#Z4%OnQtli>F&4PNc7Jy?pX9*>52kl(tagPzjO2;5xBYmX5!0zn zH<=x7qsO`n7px5BLYPb@j%WGQIz7U=Y1V_(;JN82*{oh`bwowcOzG8Re|DQ4cRY!RU>m`ipV&#ad%RxG*)2NP2_v5H$XEI}; zSqtxiz_4``kNEbPyrnz@*iSa#HdCe5Yf3BKPmqWu5CJ@;RbQcDjK~ga9nF{sM&jZa zEvk_VR}na%z)SBZ)o>2Iixh)#8PSmMrq>fZr z>PehOSS;3I!VzABo8b*Ufn#yTU{I67JxpE1l(H;g$9*WxqI%>6!Xl2fRw&s){#M~T3yIhQsFzB&Bgj|pXj(f7*cNMcyZi+?DxM`-q-hz=* ztQ2uEY8{Qkbr}drQ?ZNN1>L~F{g^9sP!3M72`AjNAZH^4AF85SDadOl!(C%m(*i?c z>L?n@1cJnuSqihXHh8qFw`By<`|TUdm5@q`?=aNK?zqwKqQzK-5MUI($Q zBjwE3a!jR*q6L?YguHQ(7_F4IdrMh?F}WC0iZuFp9wSjBC$ODz%*4X+lic}hX7~w) z4Ab&5=_Ovlc3PQe9@RRua#Ul}I2HH3dIY(1+HS{XxEz5_q+FhsX1YmD!M#Wk|6>w5 zjZ8uf?*(Fuxa?@Dy@RvxC{tnLA#7yCJ`KV-<~b2)erJlOrhacwP)|=#@Y?^reG50Y z46xpu@l*8J6}x*mQ6t2!1;-5Zlr1ATxzA;wb52qO=Nzw0i_TjAT0%X2@3yVznuCq`LqS z1RjS9Jx94%9O<56<`70#ifa9cy@o@)M$W0&i}0*nfdX_fl+|w|S$-lka-9ZZhmts; zCxW|Nc6R|FFsheB(h!eJU^IR{wHDqZ7KDAnNPul8zzK`6IEO0Ll+O;WK5QOi6yrE9 zm)07gfgxoW>m?h^oCQ+N5JCqN$nnX{Scy7o19E!uV2myeDktu;& zv9c)^9*f2C%9iAI(#-=5;uviacrg=2LtCZuR*rXTA-m0LoxXc*8_hE&z&xFSwAGhd zefSwWPbeUSyw7u)q5r!Xl1S6QU0Qa?2^LyjH_rhz>;;AZC}nieN?IsVv7DLZ;-zA% z9fbfQ&6E>ZNF#T7DPB(a{j88g0E>79kDXJP&1M4A$hiH8o31s<#k>sR)?+BZa+EZqPj_Nabd;;sgi_wX=Rp6b@K_OF|JP>#mB zpwoDp2C50+nl)l{tsK>hnP`H*QJrBmZB2WZ`r}W^kI`06jz4GS$KJG~IvoXdzzNWp zx>$fMJtEXFC1xH04gh4319u|U9o_R-d3P&SPtx8f4RRA(o9Sarf{Pbe!HJQbgsWB! zS)~yxlfT3O#K1}!5|=X|Fq+9E$R5jZDR8_17Q&J5WBPQS;>T#927p~~UswW zXSF&30uf7vZfyX=PQzQ1Sx+;MQk5-klRZrXoF#=OfP)}7$CyxqW`_n-LCkR=H#U8e zPD$1oxtlhMYtHyr6i{u!%L1zH|M_x%Q@6FRrn&juLTA6-p)RQ#bP@^a>M%gL0CVYa z95v|CH6)fvOh8SniwCqUY1Q}0;fyYaiE-#0M#5`QN7a?`Y0;fLC$_Z9?4`XCNG8k4IS2xk_N9mDNnr$O(?%5D;@b0SwOQ<;Dslaw7eOu}9CG z=AnD}B(DeH-^xOt$!VvHH(Okuq{LjnnM%2w#cR6bIHU#xOjVN@NK7e#l9o*%!^zpc0w^#|JnS{>-s<#zbT|A}%P{t@0PfCN9YeDv7 z09<9;aL~-UeiUVq={hb)eVj6P?l({{LAuU$h8Y6%$58}`n z!IZF0#uQM_pnh@zo)N)8*1 zBU9=D)UfwJOrYlf1Mr^vkaf2aHP*N_STqxh8d)*im7_vk(gg$qik=FDSr-MgQ0ilG zy8w0`w!ol0<>tv0#XdIWfFi2{3V6I3z$Nq;N+}JfCB=NMOXn5d61fr z%mMHkIRPc<2YMDdmdAmp#yw_UECoI=5rA03Q~=Bz0l@1cSLD$LV>v4x_k|egT@FHCn<2vDsV4?tL7>Y z2Gs>@1AIVR6>Na{OaK^=D1viqq-G26tjGf`fkU!rKU6Yst(Z&V0qvkU;ay4q1R7k@ z8n;0W$8eNlzz-ZoiZQa3OEdnhC;UKVh|6O~jdF~FL?RBgNzQpmz5*&#r_(zX7M>O3 zVyVz&QR9ZKhjE0;fSAbp*q?@ zD&XuSV&=z}GJ5>=MAB^U!I4I5rQBxXTmmCuVzF3(Q~b;M;aqkFBp);*NIf}!6UR!e zr>`Oy?esDEO2Kj3tC533GUSsj={-qEWr__P7>H}qbprGIYxZfO%c&k8Ctb#Zc{JUI zzEN;eh&iw!Pf#4r=qO7a-58Mn;Bpz#*TO6SJ4Bgz0yCw9dm*`g*n1uu$+)1fL5n#9 z-OI6rhf|VBT@m6!I1Pxkv{;}es0tr%>f&7j7tjFCuREeBxOu?})|^qRd8e3%Mj#M= zSKB)T4yB`Y;<%Gy^x{cWw-35XRUq%F;jAq2hXR3qw9CLsu6^X7!6z^Vau>=mu}Ehs z$e9Yt1y`Li0L&ops928Wc0(+USf*HmxGca4uXzYtRFsRU0BA_cxf74#I$zMTAG15^0;0Ap=QV0HkLv{j!7-%P9Z67OR zbS8hD*2GG&`i&S`;TcZ@Z~iaimY6-j&7HY2M9!?s1~Hh z76on1bEh9V^kycSF@m87=UwAxiL^MI39y1sPrsVZrbPq4^6V6z=iSUZM3+-cc$m0m z5Cjg&-ruCKy46ax4(0#~4~W&ZjW$xo;)J*(+D$q#JseZoMot!7z@w{4h#xSsBsrTQlpIN3bzq6 zrI{2qFj5Lu(WXIK4P+p}Pzfjvp9&2Q?gT3!#^h+^t(Ob|`4&=?^WVU&2NYazPmg=S z#q(3PuT4ApZ@Mlccp^!Fk|m{Jzj(x<1S6CQ<)gSnjBh{jM+ZoBMkCkM2ZS95rnNQj zqszsC%@hDMz(d1*|Eq-3rLCZrqs^WV)npy%fIjGN^!e?Tyuu1ER%)fqV3pub;o1zz zT?G>M`*{EgLFy$5qQ<6oKC%M9)EgmT0OvN^O2uV;~-F00)SAB%K(4K&he zbu_lkgU%+q3pfI?R+QF~0|JE}AV6RMhQa{vLCO1INLEL|EQjs#mUd`>OHrM&NI1<) zahS|#74Fs zm0~o{fKs3sSCf*)Xt$2E>8R#mdYMn*lmTAxH(k(BEaFvL<%}LW3Ag$yfkoBtQUr2u z7vk0x2Q-_|MmcRT!*I%-5j;A70kUr`fOeOQm0MiR8m`Ni%(E4=6?hZmoX%x+&;nzz z13b&!tMw?zOo*u*x2?n7_^bhCdIOramMvB3GK!59iQA-INBroEGT2Ipl zNCGnwR%hVtsOAN{0)@#Flp5>SrSHCBB!u*TpD4z_< z0D6kVBk)xBJdPtcmkVK=LCfNVjdnToIALZhK5+Rx4!ASKvp>n>55N&L7{V!RVCWHm z7hqc;Bt{o7?^=vzeGF8Pa*)1~U|Y#Ff1ucKY&rS22{l6X;Fz(QcFG+}4RVXca-wLi z2i&=zApCM*X4YzR=#5{Sa)o_?UgQt~hGkw#aNV+UFy`_+=}|C7@Ph2**Iag%Yf~FB zvYY3Tol*iB%XPxQEGj>m#Xa4oG;QFOyhEka3SRbVpke}pND34fIL0mjDFc*d8mVAD zG<$gN3Frpg^QhjS0itzc9Jt`MIv60r-51o@)ATrUhqL$yIAuXP?o3DZFv|3?3MY>v zJ76*m;ly-?TlXU2tu!D4R9A}Y2}4pW0`39^IXayQ3Ka4V6E;+*mrJ>nE{K{%a8qFO;B6k{ zbYl%%+$r`cYISPb?^C!9(6YeL@OR7v**AAi1ZsMAtmkgfSooFzjP+mkifUiXu=}@u zneljcP&5pI16Bxh<4qZ=Bx&%(C0U}-oG#=(H`HgF0$qZ4T*-A06Kw`pL^ z3i`qc*y{kXLp>8%vAM?qT&?G<9zqIJp3WLyH%ze|YsCUk4a?a;Y}#PN2=;=IdY9p1 z1Y#;cNFaJ36qy1U@G;_qRux!oSGtGi!GKs;P?`w)%w{EUwskG%^egOEw+_&VMQr+7 zkjNAR^Bk!orvN@0?P3@;4G5r9Q?LVonzeGB2=CPpUQ?|eRq52xY>KVaW#(ZK;<1A; zW|o0D3aCRgpcx@6_Q|*x4zy+g4>LixzS3dlwTy~HW1IwPCj}PO;^InX4dn#V$uu*X zo*vTYRDeM`%CK|In*{%-GL#4w zUVxDOlLov&0~y)i41uWwG*Rh&9AO2UAy+Q9(G1-aU{GwC*;cf6fZXYZjAwFe3z0q+ zpGe}M8UPPjgB$qH3;vsPkW4gU_Q+sVtnb$8NNAr%fUa1C0Q$wzwWk4fJaPxj9!>Ui zpMpoDU57BsWl!g1Rj8%SJPgT%zgrQQ>}VCV+vS3V^5c#cQuhbsxIb4 zw3+2R3O{Br%7u2c7^MR15Z)@(ljF5aiJ$mSfI~|#nNkFlc8wWqKa3q1kP1Sxib8di z2i7N`ZUVyN4D0b&{e-oG_H?<8tb7-Yzj0=malgO}fjteN2G0`&xHLvfh|$vh6LnPE zJ8q90M*@Bjj1znM9%6+U0^q~Qp-b4O2c+eZo9QS(LMg8xWPl1_ufh0|Jn!M4XdqAB zMF1~GESAxO>#jrq`h;ijHnac;b#kg#ttSFXi}d+9DeNi04FNL3RapenmHzoIxMf9P z7`-~cr6dpABciJ*6Su?oPT)P>K-PFL+05EMAp?QoBJ?=OTqgph4tJ3RN)L5<rP5#|pPaxbc1OUCgR6F?Q2{s76`1HfvD#j-V-Pd~NVw5KdnOuDHVKL!X~EQM z3}h>CCQNpC-?I)C4YOn5M5IosXN=7dP*aR>*qWk%PSjD*mPU}#Rvv+Xfezu*#bBB0 z^fIxvQ-+xY4mEnDJm4nhp{*?tP?xpS3bze3Y2}$%2dt1tmyPz490(v>>M~nx9>5EM z(M5Y4)^@h*nVB(;t+2x^OQD-pX7Wc9)kkT}Vfem)TY!{$}6AtRrG{BOKmV(_wF;}a3bko;^79xI3 z9gV6>!PJqRFyBf=Ulc&3H3V`(3iIl2z#cLMmXatbH8*R_Ft6YV*p9a86<2GVh<64y zjOGGbK+l4S@;QoZAi{Z=oPi^T8WTKe(8JvtEA%1j?())n8V!Pif_+T?w{Ak(L7U4F zA1}8P1ma|YM-%mcFR*j<13s{}W#Ah4G$qNgZY4Mk!BOg_1W#Z-A_Ufln6a}MRqH+H zirF4C2IvE@f=knp7;SavOyd5~9Imdw8r+T=VAyVe5)=?QjDUfE-bzQH05x(af%BYj zMq#yQ!alBogiWchSqBQq0mB;JBu>WM)6t^jffaw~HxgcVM7gk{$+X>FaBh;x4q@S=@U93}h0xI;JUhqp{ zH3G!N7y$9;TB;2OAC%h#Vu`zoEsx%}_6$K*lAOXx5L_xZSw;YkaX>>+Ciz5g2sX+Q z3pI^fUC`}qMlr<6t!Ffx;Bv~)SogeoT~Xay80Ckv+}6Q5CtPVxfw3q!xX_NCP3c%1+NBT$)gm^z1#BhVNA*kuvgO9 zARUCzK?88J=rGb{wOeYb7K_iae{D}s&pOzDt^-vTKr`dQf2U7Byyacoa9kBRGrl`x z0Qinwn2AewL^qfEopP4&!E__S=aVyqAm3>li1*>(D3}={$e_(oL2`Bm2C*g%h)nM; zWnfJ)MeLntD@?~qU2eU(mP}K30O=51B4|}7;ewgG4^z_n0WMLFO~!>?juId^7_xy{ zgXIre>hhL=PXG}qJo34S3Wo{in~qYykC_MKcVnvcgo~lg9QIE>iHpTLbv}r?)uiT; z0Fn+S(@yp(4q_7gaZk?+-Ey*#KU1#-;yqa{gZfGi{76UZ} zMjdgm`{KIx&4ULT0v9WB?$iiCj9_dSqiYvp<(;UrrAvVs$1h{q0XDS>1?KZ`oLy#b zv_gp(nG(T{x2jEumjnm1c1&qaSEq|}aW!^1jFeA%Ce45_@^~^+Y6g`GSmtu=uwnte z0{Oy5OeD>=d=q9^O{NoRx;3;{XHbK=l6TYontNQA3+h*n+n4!ZTfhO~`(XwF;~APE zVI~`hSYYbU5>VhzI3IX7uiA*5K{`kU+vtW;B-wjVEAC2!<0jHV1$kl@niqI{0ZNr& z`3R;GHPHX*0!>dN7)%cq;G_U+!%o1cXaHrPgHbBHgtD3;c`z}Lv&#kE5kN{kG`GD+ zsY$+rux1eT0E|r3@bMI9hpYTIW1%^zhtum>%YFGlIWC7HV_jgTUwTNDGl9hi*a$vws&ng0RDN39(tBHTAe}k{(tayR2R{fRQF0(+4^c zH7TS7KL(Bs$1zYXwWR?3b}(e=K()4<_jLx!OM8vj2R$ILO#q%OYcmlkJZ|=`CGY_4 zfN(Hd+-fj)07QPaQ7*-3Gnif0!+Bw-RaanzY|9bEbEc<}0Wl{hq=ZKg7cpPzVL5Ir zFHVAWe+o!Qz&J{PMKo}soHxlCEdVZy3#a8~0B(53Ch!P|;LuSv^}K&`90(ji`2dG$ zZ!D)a;)rjjiv`{5)_P#q4{}MtJ_ouQE@vl^Hd0prn>B$^k%%AZWCaeE_TV~Tj1*W< zI4Hpa490WK)RUG*Uo#0j%TT+J!&X)f5M^YBK{??Bw$j{0+n>Sgv=AOMaF8tk6*yD| zoEek{j@)PcsFJeLH(?kNco4|MYtmpr0JwxOyuhEh2P{sv>cvtIPC7ZO6KnEadWUQ8g)5!M%eT_o>!}E}R-vm0zaTtqh}Tkj*KL840?W5lDi$ zENY!0D}IKwT2zp^dr(}0GJar0S|$@eHK;m*9}yvHrW26uwWEu3r;RJj;&W!kPSXxK zb6C~7eNoe^@mo4rR{FNN$%VrNq}sl$PZ3#K;gdQcAV% z`7O6_RPq~5v!v^28zjysz@}HR8AH1VP#4l9v|FSayhZkni@8!C`1sj zysePlv02jQjpLF}9hfmVD&=VY=%naTQP-z67pcNST#Em$n$i|6k*P8zbvb2-)~r%B z7b#T;pAeNlbfF|OgqI|XER79hP9_yzE|X?dm7!%}LoBW4q=q(SmE=T7gE@16SdyrY zs|pS+N6SLXf-9m;ZZt7Mj9M8$D>wrpTJyjbp0m3mrMF+>#me=mXigW1<%JsmPRs zMIs5YE#z-Qm_bo>L&}5VTMdz6l9M4zLvt^GsVtTiFY*>H84;bIMK@CiY6}yJMZeVS zVa`vaMIv%caI~@r9Tt0jqvV>j(y)SlqIJu5M`o-K&WQ;T4J(Pa_G5~av@*1TDGw1kRZ~OqL`cfM zp_wE5lb|iP(BIGQB92~ zKcBE9CzN8Cl4@yLw5U?ntGW7(q;ccseiqX@Kkv+r@HUcO*wncqg`1h5d`5OSULr|K zRU|~!6<9o%lXt7)Lqj8WXH_(-Easd(bs0*XHZ+VxG8#ulWtBBZ!lhABSz#HQlXr=0 z5~=2hl;bt$Plq6uJ(9hW5Hv3-sXr}2E=W@oBc-7s(gx9-%mg|yOT=gsdW-7{LsH=N z^}REtnU)0YLM6Q9{osa#-tqw{RkK`H889^oQ-o`qQ&tNKcVBg8{Ps-no~Nvm)}&Vuz8j4WJwaOLyuHD`Mh89R&TO!>E^aANJ^DgP6%n*WNp?DunXM!)C7^wZ)x z&${SuPx@~!t^f3|51sCU2Or&kxMbV|(~hQ(W#sswTj#v`@wvYa&BqppUd&zjLb*xw z{gx%=|Gd>&Jo?TT<=^yQN3A%gpfY=(`h3o_w@G^JnbYo1^flt2qry%zVopWt?Up9H#fK@kq8%GU)5~=5U zGv;-}%Vupj@>X*4v3}CjEw2xCb&i_++fQdod#j4W_CICbk4Iw=8ah97wBFW(bCuxjZ$ z>smr$ff7_%3DKFA=-O&geqOveK7MG<;D`_ew~R=+tYESxW|hkZg!L|ybV@FXIUsn8 zIpfI)Gos2F6slSjtW5}(>>kVpdpAY{ou` zGE}m0)3-}DNA5XE%@~|eJa9H-{>g-JH!&1I6y<3#zYrnw``9fi^4V9Vx0k{KbQDRn|o_?+D6nX6}v z8W{pl??B2MY7&bT;g)K1U3}l17(o!?%Mybrri?1*T;>dKq^Qh0Sgb5hiRV(<`V>pg zpX|>>CdM?V@&t2J6rWkc0Fds^;xhJzWp5gzvQ2C3C`=uJXsN1Z@Aiawc~kei@$J2l z%5hWilqPOj*vvhem~Fte2QcA_dFpRnC|%Gc6Lr(v+7(CiE6W&G|+B z$@Rfu`T^1!2#QQfS*pl=l8vDay9*LaTs#$D3~CFcjlfI#=g^|#Ng!n8P}K3|34L13 zsw_OLq_Jjqfl^0OHO$nInB%F<@l(+#>G{pF{-L2EY>TM5GNMgcUN$6Dk~|=zwJyIm zx+I`dJDZW3yHit|$}I_bh$JOJD`G`VnJNZTt;-5GSDW|ckR&-tQdJbR0oV-0X=6%R zuqdxFnRq5^E<}_=W5P@kswfn69S9_iR1~kxlqAj)YcF#PXZFen$PQ&oIdmu!ugMrA zk%(&0(lIeSS>IbWF_O`0tumlQ$%fQq5m$1mu6kqEFNLEc&24iJpFBAuQ7vk#PN~~G znw%96QbXBX-K#FEKYc-*3~W{vQxhH{<*{{HmlGDw{Wj}TbTV@V;iET2){dF0mJQyN zbNS0;>G_Jp3!enlL1*`g&oWDDYPf#^3Gj^5(&&tYLA?{>!g?oCxL6V*S`yU~UN$6e zWT=@Augj8Q%VY_mjYxx%_70*hi+0C}&L@kI)~VuD>oZYV16HvvLvPMVP&VgP#WX0( zE*lZnJ3zcmWixs;wnWs_4Gb|KPv%-$^Ww{tCGIGxG}T-k0VNl+IeYMhgIR6K zO?8de26bc=g}SzHys(IAV;0rP6J;UgVX-16uenu)ghfgd;zaRzRb+$AT-!SwPn6WF z-|x*42~luSEWe~G#!{uz_t)k*BB{b+*#`5a=uv}e(Y>lKBR3qRxgybpQJT3=T;B==;0MAmF2E$IWcUR)n+Ui?3&cIWk#jA_+&G~wi+ z&tE&OEV;a{ds)n*@2|#vum1I5{uiYWZk;_4^6KXuvHZ8AyMElC*6!WeQF}0Z!Y7e$ zcSM{XPYqn!?NA zMqWJBugGhvda^$TS5f;uU3vR|6C!Jd{LsM`PJT~vefl@VNBuUY{DjWDdp;xU%E0o_ zL*K19%SaMtS7dv7%}r!K^aLN_#$L2NT)*hm+YfbDjzzsXdnR)CPd)kjob7)uzDv)T z`*qkBdqLipMLUZp)evJIR(?OEQ>XvAPsz~cPmXQ>GxSvc-cK9LV*2jR8J6wK@1VaL za(c3@Nc@SdwsPY+SC!@TmlqB%-!FRj#huI_&-~nVZp+PGPw(FUVB1AMGjsRnb1ZYF zy7Kq^qxq-}~wLwSz}LNIv<8b^2!&G5VZIFEox%9JWtR zuD{p2Z26q1u;Mod4%$8^xji$bX}Rj5;qt$(8FN=O_u1NY`{bBSz8`%<+Gl@vULB5h zekEGn_*2pHw{|xCF;qz=9UQi3i|WoS@##z6zjqX!+85risHMJSciGzDzF{AvZ!KFk zeB1bewM6?D{+KMwvF5u^N8H-?P05ai-(K`W9=zLe8@okTO#D1|%*DI!9&BEZ9GvuQ zcFo?Oc3(KWy7&E||Gbj<+2rNFoH_E($1A>D-7mvD=x$C>W=QguH=>^|mZaP$3QT-@ zm#D)_!`42&;g2du!DqgTD_* z`FqCDmi${|`+xk}7ayF6d%N_OYq@3ONAd9Bhk+b9)z8LtM8My23$$ZO`LSHXI;nHs+~WUj~a8myg&6! zRQpv;l`Aagob1V%qFLLoTT)LSC#Kyg(k7Gjw-2h|pFYizI-^G1B>Wd9G>u;w|JWNL~9rMZW@%0mu zHxGTfE3KhlOjFzS-A_)hdizlJjy|1|6zeoYzrwmb(X(&Pe(&1#3*5*0ZMQSsCp0?U zDP&@F^NoY|MpxfC*C%-Os5h7Q!G4w&{xwnYZykHkt9Wzv;M+4~7ZqPf?+*kXq**?zLCQm_$0@}k86DX>xmze^JitSNxMgN6mQmySGkgs=YKeR=I)Lss^_`;S#I~|sb=f@!az~DvIy0)eeDd%9 z_vXGcJt%)`bt3V7m|H*R@hwG|;lP8F$!mrd$C%$N93#8regDYWW2(&WlBJ$Ax!1bh z#Lu5e%vM$EMdR{j#U}TCI65tV_%Z#p&3n#@f4p9EVyth8j{80J)f3&9<{5@o-D>ST z^Gb8o>l;oyTX1Yk|JUlwRSA9U(|#HE#z*a=>sCFGPXA@&!;Pa5#qXc*yFJ~Nv1Re* z5tZ@hk({f)6%1)s9Utvjzq;tF#2-)WJ$32*^=~FvsX<|oI?5vTq{+^h6$R72q>6kA0ZuRBrP2yGA*K4ysx3@Em#TjpY z6}tO)^rE|+Q|>H^bWsaFJ^iHV?^k9Y317DVoq?Zk<)(gk2k)uoPLD4MeLM2wK1K8n zO14J(hOj+kjU^R*?R?zNkE7!cuTAj0VqZNm`YqSLl7~x|HsmkcU^u=?mGFGz(;w60 zG}1EDo^9`qGJLY)d60G6*vv$7=-gFb4kdD~KH_ieZND+Hy|;G69jamCUsqDszoGCB zeCN$=W6mOX_V&_D-kPz(zV1Svb+G3|%!7$u@d)|OnLiwy zc3Bi}NvfVSZeRGuj!%}yq~A?RIF&kNwr2a!`6r~&?cr-?CGT+!+S4jeT$z1*)T>Fc zwV!Rf6#ev+iy3_~Rx~y3qv0nX7ya@1y-fPS)`6dWmHEbwrc~+5i@Cu_^CzR2b#8HbJ(xemDTOPbyb!{8d9;p+KwiDOgPr}*|Busn1(e=-~H=g zq$%qh>Phq{-}+a1YuVd}#;ISdkFFXPc@89a(FA<;wN!jcDreO;^SZT(!77 zK6>Id+YjBJL@Q6k%ldw>d&9r$91FsK`%JU#LKgja-q6mk4+=YW=B0f)VKQ^2_1TR% ziQoS5fwlD7h{Bj~{Bclm|OaJt+G2^S#uL%i~ z-v(aJtw0ipR^JChzYb~}v~xkm2*0pMu3D4u^lMkQ;2%5kaM%~liW2$OaaioOX<6vG zw+7!VCa*a|KTQb^8-hLW`!qlPW=&t^*)x@Q`g?|gDDQf)Yt4PbdU*ct)73jIhAw`7 zQu?8v9~Mlkz8%-lD*H&cqVmH%#j!03+_q=csH|aT?ZNri7JS>jXTbd7&ul5vou&^L zhwHT?zPaz-TZvHx89a4iPxYeSEBZxjZ}Yz~qT+`!)4%B_pI$TNE0MFKdt2VDJJV+d zeYcuBBN1e*actGQtwrelm8{Ad<$K|=-d?Hyd zGkN|w99f9VYuQO`d6b;?Jl zu90zTibj>r>j+=5^Ug0D#_r0Q-GATpEzc)B|E=`B1t*8kp7x#T$7`9;RE z*RI}aUNPzRzIF00tTlJSNaaVXOp6|g5lKBrFEHEqeDOXEq`29y!83XZ^lu3o8#wwzWZSw+1i%< zv;5*ON$Y018sh$Jc zkH(g4KJcrzGb||VhqR#CAN8%<*fqklZuyZ7e>VKpu;B87ofUIu^{fBsyXS}3e;}?8 zElm3HSQsIWUzKxe1zOOtf5h0QdDDxvhS9H0{&iG~15MxgcxC2%`p-2_;=dfbed?e5 zwH^4nhd=fCX+e5L=C^Nb-PZEAJM{eFpME{N`oRjr{G-~R&JN0Wdg9*rZ*qfkXTH^y zpSocoJ?UPGbf@Xl8PlF^%~xDE9?Uti_Q92;&(B}1|JRzOntEo!Nl(d2Q{T&u>+eJk zEiRvYW_RnG-?e1f7tbD?9rxguQ`5FQR5`Z1J!<2N>by@G&lBtM&8HGwl|#FS{*jK0 zlD|<5#^)cZ*?#Z7$b?JBe(?T^3x9rHKKIlE=Qo>=e5%v*x%w>b#QO`rUlEKf?z5Gt z$onbI8J+dc-d&-uo?ZCfW!qc(zIw`ret7oXta-b?WgaI^&Ha#E|Kswp_d{II7q*}K z>#RC!ZtNesU-Th|{27^tEUt*KEA~BCT^g`-K9iL^>&K?SnU?8)&av+-QBAnUxtE75 zSiC*vY-?ouvXwiSHHMwv7y3}vg#erXZufv-I{nQA;c8cnbO}>F#VGCS7h(Vj$VZW zuur8`4@K8DEcD$=Id;as_t2g{kK`^|f8<2)5(^xZ|m~I?w%X^(UI{BusG}V>-hI)^Q)-xg+E1HS#9{bEMr1e(&rC8 zzW42$I`3b%1U1q2_dDNbt%|O!_80w=_fT?S$efMR=7~931D9_&^ZNYF*htGrRgZGp z1W(qD_sR#~$zF9dwP|!l_C8Bp@{&i*#`Ns?1HV+=OWx48_+8E?yYYQ(+hO$CXnRJ3ilg((~Rs$8H`R{ou!|k8bvi{9|F# zCi#f>XWsqFKiQsovgKoB%lF!zNs7a{o#T!#V{3#4+oubnpLUveyt&l8@=DFuvRZ3X z6W8`6F9N?&zG`xHaVcAqU8URopnlkk{U=^qyfmR`%D5+&4-oPq>Faar7Rg7v`Qx)y zu~SQro*TRGVd9+8ac7vb$2Lrm9nQJ>d>eU7`4QF6@=x#9gV9=pc-TL=A1^sxrTMNS zRC^6gt&7gQMip!uTOOTp^W?w>pDv!U`iJ+Dksm(zrFZV^d7IjHE+#i-{n-92JADuf z|L5R>ucAi(96WFO=J%F-@l#XnKhYDG7Af2G>G6HB%2QX7At}GTw zp=qq_RuTcQ%e5m$xJ-d&4O4vOVU?mRN~V5mmW+a#+iX;vwW0**&HWd=C5wO zv5N8HRj+z#o8*s*X^nXP!$m9vd$NHzv@!=QfXcj~9q!x(BhJth7 zfXz|3f7SZ&Ur5r%vx%&59>JuZ7X%J?qq&AKj$^pCQZW;bRvFOPNFDO-N5)g_wGeiGkCGy{nWWgS zpqgPh130W`DH1gdRz3T4M7CDtYc%&c%ASH!a^+F^-9czF2Y|o|;@FIKO~VQ3C(5@9 zL5ZHtSyB?&t*BokPrUE%@m=aRa(mcHtPcXrNr}OLWS{NgMLm^Yv`AD>$>v2R7B=Rx zyU3RRee9LzNUU?ZgXeFZ1-U3^JWfKj;@T*W3F$$#WzfFUblXmO9Y)SG|OP=bp z%w@aF_I#Zs;dEgejA4DyBZhJGnnF*x#f|O-V;lC)EQ{IE(_HYo^VX>ertS{w#F*j# z2_U2)A(XzuvFuOlinsReepCYqtk`FOV>13--+xI!5yT1+bp0!iW09?v(ac>G zNAtM`!|vV`WyOA5SgbB<4dc9R+qP}rb6)-Y(0N=hPuc~WM1JKY#EE%p zZ%BGdQED_w^c4&9l0SSQLqsjA(`YEc1ULjJz$Foq6>h9wbsq^O5)M~X!v`DduNXFr&gen2wa`8uq zc`U({ic=7cB~jpGGz30^Rag*?pKB^=2r;#a8kW78zw{-w+3SvLu^ zj!o*vl*UnnbUdHK66;8(a<$|iv3A?EJ3i?2{L1tB9CSVe(>SIP#uD>+pj{LeNa!;N zJcrRdu8qk-iE=z&g5=|ejlW!76#Z}B;_tWk9oFaI?K{Uogmk$?lQiHoNb>R2aJN?N z&zFy6o=LoFOAgPaEFMEznng3r2gxve3UY{tP?3nj2{x%?_MUEIc>wxO{VXX{5%(*@ z?4x{$7L3;o^RM@Z1q`mvB!=)H0ptr{M+fsbJqx4AZWSFA>jXA!EQ!x7oS=?@dCs^^ zZVvQ;Y{(02ySAEW>L38Zdrx3!5^n6KmL+jx7;E99?Mu zN(1QP1+&^fcO$~VKqXL$HA=%AuF4-QvLq{2!^2@BH}8lfCK*N@;shyOVeUhyU(3r+ zs|9AJ9lFOiEu>{>zAqUU_iV9EcC9zCFz#`0I+){06a$bDK%fM}$XIb40;%*qE~Ok~ zLR%en6J}}8ve#>Glt`%Qhj`yH++~iyC1G8c;Uy1zsQpnI&jj=gic`ohqB#SmEQM&y@G>^`@h!cx~(2|oCzGB|oAa15)GcFGj zoPB~6ON9RF{X~`95s)>bgkK<`(}_z0w7@!!ZFZ8KQ-fGsrZXo zKS`qiLR9^HkeWEln%pl!TG2v-BK#EVdQ5WE#s5FSN(%6Nf^4xSW|;AmdR#CNnkc0? zRX*ot&Y@}s+pHJkFINrVi^r}+noNhZS-jB61>uo9P|}$|Igq3`B4J#O7@iVEq)%$h zq0tEv1TI9$Iu|VvT7rBcLdE}Ht2zji@vo%lDRP#oJv)m z&MpI%E`rB?aJU>nB*Z2mAl)3x>%6`8wDD|270WC_F;}dEywzfmC+OQVLY#NTJ@m6N zj-jAr1`^QhL|q8(=ws1Z{%|Ld5`S(%)Vfh<;3i9t7MgHL5JT8Q$VUK8=u#L=ctf`_ z2X&a$P}Q7~n`N*eCF~4nrFWd`_dPFSQ(WJFLV(eCwwpa#g$A2s`>O04l#wvPtPvr2 z8Nn7L$o9Gz;g~k;Y(%Whko6Bf+P~%vcZFY7%B0^dTZ<+Te3H4+OrsIksq*L?%!de) z5`ws#V=EE+iz<4`*`+t6rGqCa&2JgxN1%{wzCE`i@;}1}hBn0!wj$L^Di&DDc?nGI zwkq%IIe4+dpp|%B8DcRHqWMB68&g0d03DD(B__6UGzBgy07UUB;0M|Z*cHfSf(aQ` z(wG!eRR1!J5`%!XymF~f)7Ny#AV;w3e?wcCb+*dR5-BcF3)_^yV&_hZL}taxF7HjZ z4Ci5~4I*~F8%9}{CggOZ5wixCtEkSAn1V|_plq8|#Kvk{AqEsHQ%k{2wf;_eU1ZXyKS}tK_fyV&mKp}wU>O(pS)Z+p# z5`gYb0L0IzYkts)>T>Oo=v!S_6|Ch7CyHfXNZXxwvmgKUU6MPz{>y`lXkYOcA?Jw% z-|20~@2|hZm)p*MzUlLkpDB)EH|2^i7rK4BVk*iq3t}Nglb3A?|4ox9O;qlkiCFsm z0)X*WmakE%XP1jnFBoOZx?M7>KnZf7I|xveINQM_;ah6i$^tg2n$w~|Nm?>R>$g&T z@g_>uLiXzTe(-iNvLTzt~k{QfHY`gws^C-hQo zJhy4eYrgeZQqWQI`%kKh5=5~jN)hrXL@cUHE{0KR!G3<{D?7X7&p&HX`xW@x!BW2opB!FDhMuv{Og#$G6j*p-;yZmUuDXJr$so;LQ+vF@+$_V)Y# zzgfx`i?@4J);;&g+!toqv?&Nx>DX5xhEuRmJiPriHg4#Sl#>F#n>R(RCVo^Ed$f7d z*bVF95r>HO$gkw2F?Jdgjb)9IBCU!rico~G{whpiHgq`No3B6O`ldGxIw<}RX_9T zn)0ezK9yn2;#?>#nkdZZ7J8jBfk~Ee&N93sQ)h`fp${?A!yt(!Ce`={>+W)theKBzHEC5QS&mr~y? zLeEPe8K67R0CQkiKna)&tW;olmWi^@N!AdMVNID092Ewo(AtOUnQ}afEeIj7Gm`KO zAmfXmKh6Z1l3qGlxx3R>yo?aFM9G%Sq}fI$jPmDD)an#R6k8fZ<x$SNd z$Z7(q&*34W^@ppz|2vLuZ(AXuRt48+5~yr)SPCqQfX>1p8?6kWc+s&&nbM}=eB`V| zz5b?fVC4d=bp`aPI-Hi#I3d$DZ|)LL(w&lYWZJ$e27rSN1!r#Mi$^&%OLdd!X_}Xg zeOj@rDH#PAhn&NeDlt2+sNJLsF|bhv#F#7XJM!^~lkHf3b{E%~Z2dZF+Bp0`=dJCstk+=w2vVtsR5itTeIf%UCOcrn|m`#Z0D#)k7 zYsGUB-#XG+O60x@G88ov7?Lo{qP}2uMEeN)L<#V~$dS{$H~m(Y-EtJ+I?#6j&{=Ei zGm@EfB96VsdHzodNr{MX3h=$#Pr?fDD4XTnyh9r^FyPjN+x?uqCml9tW0TuG1O znsjf(uk9BfG+{#%`e|BS)mbCT{jayC-1^ie8>a5#60bp99Mzz_$3zG+%JvrUZRVqC zvYBB?%8+ydkC)D6+Mj)YFly(29rCzw$AZYDY8R!=8;aq!tgs_i?U#-fDzKa8{|?Y6 z-FNrVD#bktNJdDExIoS7NrD9fpmk%#2{|f9RHmu-g3j_AT23OF2umwEs*xm5N||Ow zYS&8aA~0f}+roOz?@OelO9XVMhYAwBtl2tZI|Q)6gk06dt5f`>99Dp^+6p4O|6?(r zZA{U#xXkQqyC+F}--DBj)Irv{9FnD@n~hyy%?L%y%hXmcktk0`otb%9)$LNHqX;AA z0bz@&tz8<#%3Sbt(oxpZwgUpT`sO}|QdsV0mo8;?LC1{`z#UQo#n89r?Cuv{spsGA!HZXV4>0>QWe6frXV+0-HRlX)>}apOwnU zEc>w7O$W=WmDSPmQ z8A=lf5b5Hx=H}7|Pd&h3iwb^?esOZ8eI(fm)($gx;JZT_&_TL?mxfhMgUViMRIb*^ zB#ZT7J9?#M7Sqwu7roBRr3Ru6Bhr|)db4Cp3q-pskE9?)BMuc|ISE@4OL*zrjsnDCJHt7{;Da_cPFpUOF=d+$ra#6?#fS+b~)MR;<9uMSVqX0 zBf)38ymB0rPm)z`Q8LDvR{~fSFE6Bs-ZXIKaLDUyPLSfKiB4hgf2~vaL~#aJ^{KAV%BLO zgG5JOqr{HYNI18e%oTQI#pvwH^zaYk;-!0;rMLo$2@#lJ*FdDmMBqlN=(gj$K!O=c zDbR_9{I)Fw{R0Oa61T8$+MM3r6p14h_-Uw2JpV6NFB6J_?jUN3?^qJD2g|)S9g75Z zCrk`^Zc-X*!ql0&qMxTjc3%i`zNeS;b4p1`om^bRZ%)Ak^b={D8dCew4E@03M%T=I zM5?S8VYVQlE2)cfODAk-Wy1WS&GCyydem6u6|ym&*zI873*cHxQCb(o_t_jVDG+6oEE!%UYp8aP%OUQTEm9g36Aha3Ao~i zb_gC+NZ6Ldlax^4=71ltj9oe~dF{3b!C&&JCtrnd$TtYl^z{OBDLAPSa-g6RlXhUT z0+$l4bEcS%)%=oPuMg@m{8RT@wzB|_7Fl)iB|8jia`alD`()Iaw($X&0>zxQ>%zvX-n4svtd5 z8kmxa$c=zgb7llHC{&AfWRv9@^dt7M5i4+0CWV!0ae8dAevBtT;5Py+nKrD6d4X+P z!~~PDDlB20G&r>_8Ah&FktIB^?(5o8%^eX7te$Y2lXWyff_Rd;1rWCjkzpWY0EyTh zknhwy@pY7ZajQC-ZNN`LVqC~8&MEP-y!gG9*U-o@MYdx*?{$ z8G{7}G=@yF!v_7y%Qdh9xWE=vrX8ZPpfz>~Pxqg?q}(GT%ksOO2nUOUI} zlG+-=9SU%F_RR9RJtVySR*^#Mlo)`u16%?z31skq6b2GphSsqY-8#)bW@;kT+BF5p zwJ7KdW{m3^Cj+hiHAHDn3)c$(6Yj$vJR&;jCsGXjL7&ccm4t6na|I}~KSFqOo`ygq z15AL$i^Cu_z>^NbnD+(%(?RT8GX-$SA;Y**H}fLqiijhyMwBX5)l-eGtGjl7)m_89 zWSu-e>uvPBa^fk`$Z{i3AZ3Z6xC?Y!%5T2}R|87ATU!Dom+qGXo332CQ`r<)M{T_* zl#p5?O+93>O{N)w$xGD45T7ZPr$0|kiO?exbW60==++aaE9#A!4>0@RW$R`O*PkHQ zgR0oqE*R%wP?Y`yuxqy{@r*(ZAg>5Qm=qwqD$fZOknM`VgHD?r)HEGS(@gjig=$ES zJcQX!V;AO2Lql*&c|pge{KyU7Lz1brs=9*RrTe^E8p|C)OcS93iJdo%M{C&>)cS}{ ze}K3ZMmt8I*(pg7ISDjj2O02HO`oSH4xFl4I#-0--Ed}%14Z(@OOSXSe-@~; zp&K(|q9J3(6p_UzCZxW+>)vkRPhLq1+S7~q1*W8^y@REDGIRtggg*220Yd83b_)a7HX* z$=K+JWD?Vc&*SepIEeuzzID|6wY9mgR#69$$t_$nrt^qiR;An{wtf4%bafrmj;i-( zG4`DrGxmh*O5P^oL(GmIM<}&!UOA+Wb$M*fYwN3HHiffwZArb1c1^COcr{AJB7Rh` z5)|b@CjYoUB$JTckEK*YlW%o#i9}|#?qkVN?-3$6!bEWpg=#0NttXs_F68u>sy>HDfdH`b!qb_fc6PiYNu3qaX*ECBbA4 z5z;9Kh_DD?%`?x|fT?&Bt8-!1gZW-|KW9g<()ml&kzl`}Em|YAW*O%aI{}BSt&h!A zPd?2x;U9rQxyI{LK50JSW*evk^AGl5G7oBh4B1is2`B!D#1Mu6)glS=b^ zlT>FNYfnOvGKAPu6Awd7D4M2orIp`g@NOwv2uO27E_%-29?$d3cpeCkQ?uP9(L}mt z6@!3M1lY13Aw(|ARZF?-Pzh12Dh3E_1-LkefIyEEK&xe1zi#lNBa&8Kqbg|65r3ii zYskWp1?RZvsxi`y6?_h^cW}%@tH?7L-gql^Xp^)LL8@>#*(6)|)mJDGI0|tIsY!?q=>RA zY@RP%P@jdN8phhYk^F>cny;eBLyI9o|0NB97H+Ul2HN!+h*nU4>rz_Gn-*AJS7&=o zXb7;M5GQf+F`r@~e~Ova3L{;pG5pi zs7R&y6X@dDWZ2&px~Dl`R`v{_pK%2q*R@5f&QN(VBugI$X~tHFVnXI#7@l^?pwf{U?#{OJ!osBB6`Rv*uGqIWr6c<5V$$wKGE zSN0=i*z-k>m?@Yo+8y*p!iFev4#f}5*$1j5&S zQ0=mGkql!9hlAOEx=*6gFNJ|{B+KLN{*~jZ)abH98rO0kf|Mi2C?o*{GmVm%&{Aeo zRN)}pWHS|QaxqP~ZDAv5)$=msh`58AGU|9mBq5?oBkQ{^TH2P~cb(Piex&%dI1f?Y zF9$$l1kg*2v7#ge&{_=AK-*D!Iz&giV?uJaK2q&=($@xrVo7Pu5b=*TYoGn2 zMO~lV+icVlgh16Bfm8?q3MWpJ*wYaQz|0px2qDSR3CO2mC{#&30xj6vY#N$K54@1ON^q?WqLkB)N_L@3UEF_k`bsj!CBIh zFVOuwbrDLnH^vFjH_VYbM4E@VnKOhb+iD_KU47dlLZc{I+& zqAxEtnBC}+Hsi7BToq^<8aW(^(qsERWDa*NQ*2J!!;hmc)G_Lfy6G zx{)&0ik24ad(ZgGoRJ$7u%3vRtdv*ej*)sy5n>`mp@J!klW6xSPEvWwB@7~Hq;(X| z_Ru_NjWB6hg;w>(qQmjxIoi|w#kW#uZ=vL!lEXPXg_*dPzTV0l=5g|RjD^m86 zHYLk%XL^}eo5?tEG@fpudQ=Nx*dyO&A*@E9?8F8yIM>M`;2Dtr_*obRc~1Cs_iFZK z^{4cE^e^>&_FU#B(wb)GHc5)AJd;DX{bGp*8L3JX|J=q3g!mxTN#@&Kviryzl5>u1 z*KX#%aL22%k_N-;ezUjI2CFs^;w5EWl8B{AX>aI?Y|n+3!f!D`-QXotTUQ=0rTwb0 zJ=z-vv5@591Y($_tlLn(O{eKHVlaP&D&XNxrD`N$gcPjO$#6(gBzDZWOf-sS0M21J zhLXaZR;K1-cwogq$V&y&xhQUvvZx`R2bfs9MfptUO*u4J328@b&{n(nn=>1&!uX>T zP33d(1y~C6pnR7n5K9{()F=j!S-Mth=e@vR8085re2&3LPZ4AqnYu7ZF}QLxPjigu zKAd5m>_3GF$_ufqG{(8SZx1%C;CEv?t)9_dkBUPemTnV4>|h!%0!5P02tm*nA&5rTL{Sn0JJ7Ek&ZWB9@G8ray(+K7<`wvM;sq|QW|gR2ca)9l>kS^7d1r2~vIr_d zV`ZTS-1aRNdE@vXD-tQVn zPAzZl-`Je>zBvb@c$O+HT$7^id&a_%*QIUW=cZYlugpTrd9gNV*`1)2m2z^ktK-72h#SkK8{Do$kJf#u-0_QaR+3ItYb|X8Ef9<3rT_GW zK{u@#b0y_Pp?r3&i@w&0X>%7*wIJjTmyMH_RckT4Qi3SHv+}C!$XgY~h_u`13ESp$ zjats-v*jIIEiG!YEJ*d+-h&0pj>Jht;M z?Pkv_hD*fHdRt`BEkmVvKMg*I9MHEI$@ybXv^1A;&%^0mbNOPg)#cP+;ZU9kZR*tvnX7nFL0=;NU zv;-*v?mF2;Taj3a$a*UEl^k)B<1~ga2I?JRhdbl?hOp^}2AWDG#}JbdXPDu1j73tR zHLLIT6b?7>ph=L+b$hEAQqg@mUAS_)yeZ-=pljEkt{yK@du!jR;WGW#+W9 zZHhJ}X805C(ZJtXA!_YT7`fkNF%0L?I&cdTJfK~WosgmcOged86AP{8*({)P> z%9fTX)!c3&EcwSaEgxoEEli}?DSe|Dxpd%=csi7CI9-iTqxn2r8;)+alJvk(H|8G& zg%GRN>3p1|mH&!9yO9-EUh1J-#t|yva=lkM^OmLi6TC(b14WNJvvc>^d&~-hW$WFP z8s*C8I{okE{f&ZQz=}rXbWQy43UYnp!pfC1uj@|!IK&p=65MZZZQ0KkaEX{QDw@yL zO7d-xgQ4qt|K)06oQ~H;Q#-I$Wc9M*!e?0$qoJ&)`njpUT6AgQ?O}m zc}k}JZ*foGZNN~!#aa8Zj9-`6@pNS9EJfG^$cG$i(p_X_9K->E?5)icXGnoH?Sw8p znu&~lw8uKEf1II`QPzo)4UQzt7HDCWX#;#ZngV3ZO7)1Qcv@VtYk?!;B*WZ?1z+ez zt#3F;smitqUL5Okhh8q^7zP5soQd0>33OwH&MXu;?#?u_HwI7f6H^+ZH6di>EAh9^ zyKVo%K{Z-*S}g(@AO%q@l)quP1kXxEzM>?5TiFDmRQ4-0->|VV#nH%E2eZJKGzn5j z^$GaV7V4s_cO{L?XEj$xe$^Pf7(|vfR!rgg-LH3wt@7b0K<9j}+nmnir~luTXRTy4 zp``*Vk3fzQhqVeN!|OE3StA0#hCCR-IFZq9l$%suRHR>$Y!b;Vk@pbV!^7ye|fT}?Q!od>AIM@9jhD3RS zzdBWHRNVSC)o3+@07(PjKZ1z1e*b^P-fw5VAJK_yX`)F!WGkPBbDrXhYMg?$&>?rur1!dLvGVy0Q_3VkS}uV z*`m7z@krWHn|y(HFkp$5;OksSqd1*xpdiF(%Nu>%sg^Z}rrQoE0#N8%`&7GL0E6K( z!WIqYlV1!H6^1O;-=e;tYtNvAJhT{nXMtWPh_IDd1fPMutRfMFYY?N#I}O%7LFyu* zbOLC#WfEY;FGEGeO5~MDCCW$lc2I)z%7M>hEfjcS-1BC#`PwGfQP{OhCa-NvCq!YK z`t33!3NB397Hst>=p~0?@hz+BquUmSzvi^5-7X1aMxopo_Zp%ng50Sku3eqTE`n=A z0!8F0ABJQ06J9{LxgyJvAI`AQzduk^wW-cK5;@piCZ(06ieD6tGzx(x`u_ z$NkJXSUHAKY$GmGQuMBc8z|~h>3lH(z$q#WMGw|m<`gEj=Kw#;Ae?2DH5P1))=#aU)-!68_( zomavL?lgkH`U#_B#gZpwPn0y46?#u6vna~Fj!uwqHU3NLXRELcs3{0@}eN=(QYl9ry zUIbj|M4vKYo6N%b3E`j}-E->jghZi5c*%24 zdA#bmUzTp8Sq3UE%JBr<5D|#ybLcq@7b~@Lb?^5k5K-#05%g#SD`;U}K?j0R8kx#R zd3upps9#)}1-B z=GBQmP))llfd)#5lUn5Fu11*#DH!N029jEo`WUF=wJzx)(%Q21(D%AqB^c8q_*om| z0EHrY=dYl~`JPv|D907PMGFR0)_a7}h$IF9mac>Llu&J1sNCoMGR@V_tEL+KDZ+?D zDG*Gp$*(V^gsZtH=hG*n<6PBG(o>E~+kG}2bpfT_dM@_cr5qIb+CnFO3L=d5h?OLS2GUg#RYNZDC)Q;I_ZmQDLGR#w@jdK8*=t+f~2}Bvbn; zmX7HZw%A&USyM$1I{s_?b4_@PrX7JuJc5wHR9K3uL@=mD$gNSLgIwO#UbN0KA&jy! z8|hu!pEpf9MJ`7-S{X@1LlX}z?nM(q8!Cyr`?MM)*C`W;uov-?bPd@z265dfBOkZSam#JIWh43Zygm7y<7_S)Qi zZi?ZYG=oYdTG1RP!D7Nwg4WC(I?fmpuzJ9sZPMAKFTKrq@Spt?a>RhKaJzmqM zW1B+`&f)8ZbBy>a`;vucJchs8VW{4Sv8j!MsIH?bsU08|-G}w zQ-O&F^UM^>1fy-KQ3AZldH`IOD*CHi?yS6N9FslZs5Iw{ZZH(=oBN3{I`O3*d+vBNib_p zrL$=o5-!60wysq}A}C1b3~Uh6twSsskU^bGPgIqlI6=|{mlz8lfZ*_xt~pkONyaJ&09vrdxPRRi zVx{cs+qxgtO(BY1kTOZ^^NfbL9%O|Jl(dyir^Wa(Lw>ZA&Xg-n5b+`2hQgR3c4mw` zvO|q4*&;XP>;3BP7TE}S-YOeSu~H}Hn{_-aC6sL$V5ZhuVHs(gia&?FUF^u*S$hTm z6u^?M%nDpumHK#HhC#vlFasGP zYE-)f^kz(d{Xe=W83agpJKx|>MU)!=YLd+$F4oW*<)C}B0*fdeRsl)a7~~<+s~thw zh1F`hFwcd9_JeH4}QttFhhpJhMO*V(fj2FhqpgD}5hEVNiDijuKL9k%@zw)w^yQH)bs*uYks|^)knGo&qLQ91c zXS)d-s_eQI$P|59l6<|O6&ON&HYf85kLNiSga)N z3#4DEUO8K68XKH3cTw;^KF*9?+L5k*X8IS z;lwDy96FIK@UB3t0H%F|fUpgBz!Nj!-$i2+&D8=q8VmD8869k7O7$E`36RRMAfL)+CZO zr}$NsS(T>FsH0Dc+yq3LDHy3m2q1t$1Tsi-HLghe8gQIVSB&|x;i|WBc>ko?CE>&) zH>re?g~XcGyAv5!3Js$ftj;+gi@b)49BvZm^;sK#Pp?)uT46qn9u^!+`!5*dvhz4sqk{eb!y$nG=>o?*-6cbTLhY<_3RN`~+UD^dGY^ z-Z-Uua>LIw74jSB$|JSO$EQz;Cosl3QjGSH)(pf!@Lh;fbpb&+8vGzb32ySNXwxk8 z?16UWm`GQftf)2_W-3T+Gi9@6jsGwSDH>UD?#5B_{Whcm7c~A9K0L|Qm~-eXlQV&) zq6<{jNNemXmvqNoow79#!xc!Y)vA`IlM)JnMD{8oF!9{CU-rp@P|HLg#&RP0V&Tu- zb)FmtYMDyMvAP~Ro_UT?IBw$8DH?`^0K z#UkvpF0^k3B|Gv9@yqhN^r!bz`>+D+3nQ3|60myw+G0s?az&1s_8u#XYU0>{H;{{n z8hThZ?6epAG*y@7&J3o5t%7u|O;eO}{FSPrNKp`53nFlkawxA8dygi)l0eL>{EOw9ma7;`cyHDp^!6z&_fjj)lC&+k;HE(9i)ltmj-Mqivb)P zL=h-JEi?y)aXs^qNM%kJn@taZsucnBNEZx))4fiL_hJWNUjkTE6`Rpd=cGYaX|A~# zKolieL`k2|1K2?p<$^C&gnXMP0^uyX=jC1GJ2`yc6bE>Eg}7giLjdbH+2l&Knn|_{ zGC3(!I!_~X)h$I?k|+!ZftL9sOvB+SOgc}(%x#=!p}b%_%I2Xij@mcNGcDBTW;R|U zlza>kQd77dFW2E_r`oJO#0j)>p2kqL6NF3gJA>k^H|h;ng^nymAv}^!J@$)|n29n3 zY0z#6R7Q^h*dhyZyyk*I5mtdfgqXn#QKRdkpTob@Zwlb73SfwH78nd95dOC?9!B?L zk{NvC;I^M)pdl^mH~v(mEno7pP+b_;)Tz@{yGeEpqWMJ{RHyvrTTckbl?)PXnwM*i z^34V(YFc9yaJ*u~pkxJL#z}LM7_3hBOMR|VtqU~*Pv2VclYACri6+~pt0ej?NTiYp zA$e)~GDTU=DC*4j*iVgg_`#@AnIk+Z;m2xr@+n5%=kds)Dek3tr04FF3;)JP!G$K3 zPv_pMjIL{Zt#O9&;yZg}wrA5?$hjYV(>K;d^7ks6DIGHpcW&DD4L47BCTv#EsGz2M zS+&PQj-^9AA9YQ6)WI*+3A+B(y)KHzmesnvG8$Ch^#7-KM0h-0ZF3(h)Li2iMW@@( zM%2_qjIuAwd+(#kX<_56B58~KWNHxt-h9U4%aS2jg>RPwm=PFYLbS4^7l%yYQ+`++25J8+4K`0T9 z$4p=roCjv~9`$Dc&JqAi4rlTFws;0p=uJma$yt#_<1lpyV7>x?RRJs~rjKPuV91eh z5z2Q5$}FNF3`648bXQ*ksZ=kFVo|g_9s`*K;y5=2F_c^v2?tcfU3W8YG7x_Q*gk<^ zl(9zs6~fSa4B(PN3P!WC28xdmjAtkf$Tk=HeS#3H`8u{jx+mKXPGSiq+_WE7&J3yb z!DuH2AfQ-i<|%eDVwO&X_-Q{7inFyt2apM7atTFXSwOh{2K;2{y^gG@GO+hL#t!y?NxgU9lDy$YP7hWFidhCZxoqdN)${Ypo&G3ERn0% z7MJ)K;f{?9JpUQRYL#==E%VxB91&~doh6BYj$4wbGpwy3MrnR?}`RT~mnD6gv5WN(N`#vgnxusdzS5VdeR&&8%5XhkuY->3MS<#*}A5- zO^^~|sih>Awt1itydI@|EmxqbYy#k1 zK@r6!mdkV6X|@C*j5r0ta7`MGLt<;c?d$5WeHq3V;UV53(+?LW&|@7-s?~uDk$HS> z5=V0>?Do1!E+GuX62S?Gj8r0P1PMkv%a)!ci44qmXrgQnxRo-fBZ3f9JQ>Pm^2yYk zz9i+2nCQ$!5m^?1SZaEBqA9;DqsZe~{NNFe&g)Fb4112^v&sT(MoGx$5Yi8XA}v)) z{OGH^?&VQMGkEle90HJK0x1m&R8+qxuGy>hy(P>lDiT1Y%)Mp_Y3t!cJ5 z?i_PurZb8opj`xFAr)rTnd4^0nt65WbS5T|tkpNTt_vc55z0FMNEZ7ml-@-MxR&_O z5Qx^1RI|f1pv^gTMIVO;ZR5uHau3*i@*_W76-%&BtDZ0D%O4+Yc;T0&6 zLS@`A$)cOy{AiESHgnChH4`68Rl0#FK8-+EGBYd5Rpg%~-`(mRU9qsp#8*2F=*`Uo zgOjL~mT()EL$Hu}9ZJrvSIe$+K%$ee^0Bt_5=g-?l1L$C$rkP%1|Nn!R+Td3A$>8FM52bIdWMrCo#a`Oeh&r4L{F|?M>+)htRMKM5Fquwja*Dq9}R9iH-^} z;&JrskAd790)rx%K0VI%sV+!FjYYi@4Z_$fnSo5mv@SOo8NUw_)er06(2_7A7Q*6z z5G_47lBfE#<4q9_fxIr3feGJ{;>$(6)^F1cWUow{kHg?a4JARzl(3%9UU@&iF9{tK z{q;k5(wcb5LaP-9loQm;+ZO!Y#qd}eL3BYtE1xNOwt{B!f+c);~Nn<{r?JFBLmsl1!Uisv$(peT)4^D7^!o4*X3tVXn^t;$>SIz zu8c-QaGvy|urpuqJ-Edbjz`H8Pgec&D&0P2>`c5JKk-y826yul&G0^I6>-y?mGU2N zi_7aw_t=v#%CVcj8mFDsZ?MZAYQtC*20);YMtw(Gw_LM9pQv{kI^|i7wOH>`z@0ba zN0d6pDXRTup`^xfphX>#XNEySjD_n&332|N1w0gP_?r7gsFpNo^!sd)D)q@!jMBR_ z*j_U~E}l_b5pD8JX^62JeW>uHtAva6r8Vhsb61VBJ}9Z4`SLlX5u1+k^Q{EvoUL1x z;WiSeRZTN6!%oE-ECN#C^1P_jCwC}g?-w~VJRYhHbj7?k@lMTanl30{Ty#;>b$^%A zoPBTGp1#Xx(B2h;;F$d1^yhLQ<=WHL(qF4C$#dG{*BZwn!9NjijE;X2N3qaUcyU1> zHSFdHc-l64cfaNp3q3h$l_=rN*6e;aClqou$^3ie(JZuSEecL00zVDr^^ri4@{v}` zL+Sf~g?uF)Q?Mg01tTWRS2T&~C39LIdl4JgayeR~G`Cxmt$sTi4M$wtE)|8dDx0d2 zfmB;0jwb=lUyuKD0bTsyfLbn49vg|bYW?d7;35x#2?$p0 zxb_oh>oS=~3{IOQ|NNzbAA-iB2`s~eV$$)dkw?O!4u9omJzD2h-C;UoIvc4INVWXf zJQAA#M?kp07U=5*QGC*JUUxp_J&;Od!l5q#m7K1;n%&AMyhU}ysp_x%&K^qp!*6f)x1B~n*6LFggRos^A!Jp>bO#1%x%d8y z{Sm2NpQ+37I)0Vt@+AKZleH)O`Vx;RON?TQ;FUedRV^KPMo<6T>=#7SN%e14%OvA0 zhuz}YN5PY`dVgNZMU{b6LU1FH*uD_!7awZ3XI~BOcZ7(iMY{Egc@u{9!&Ht&X*?JN z^-LQrFH1A}t%LVK^qrys%|9t6) zKvtT0r}%*=QmWD|K3nn6y_*Fw^gcb04W1Rej*|&kQYS3XOxwW*#r1ac)IpUE!U)I+ zV_;fNZ8KV##7T5Ov0bG-*7b(75=e5z?V`?f2DXGCtJduCW16Ouw4lq+*iZ6>+>CfG zSs=WHXkzeb2UL?ji3-^~Ej2Q*dG7Ex+@CdI9U-)wRq0?wMB*{Eu)RU z6+(f*VbWKc?qwRleOX@*Yb_y8s(upmk^ z3HRyh?NLEHKg{8tU*8hGb}lJjN^6^#*M*a^l{9r3Gjh zt{2z15n@#F2Cw6|E5UcYOrjBmfhct_CyB8)^MWLL1hNCUK`n<+Qe9F$QH&QHElcMO zT}{l8EFVPC@Q%p(_)pKms4Nsoe^zUbVq&yx9ndabnPzOy$ridRr1E?93FM(*++Y@s zWVfLdMI$V)rqNXfB1%|-$4aKN??gg0tl*34Z$6!daBdBTaHNf_-fN-?d4<*s(_bKP zBQ_q4`|D{UFl&=RB~=gdoEZzDkVj?@q&>*!mllWd@G>03Kx`z8NKUgeDhQe4azmA za|5k~hU)k{E}%K&C{M$PQ#q3v+)vH&krFI+<-%6Mn=RRDdkU{HWyVI9S0vP{CD{gT z@-bN-R|;%*8*NhlWKWd`dnZIuq4pvlSi=#SlEj(e)NJFV+~$8s@L(F)0tmjc zLS==>j}Ybv*|lo>7HBbAA#&6*4Mu~K8^P+ivTzwkVI`RspDFsBVz6lSNrEagq9h80Qlm=)T;yDmJUuZN zWuGuriB$L@)l2E%OG$Zl17AmM8g()HBAFv-jXFj5B@n{NfO}l-UbEoO+w};U=V{`4 znzIgdzWcCEL)+cm)3v08o=1qZQjK(mKIBcaT>=&%nm$0E@FmcBh;%cctsoI>`C`|m zNKwJu3X@}_j#{}MaFQr5gFYZrnr4buz7sYXMAbrPXUb!sofP-oO@=juszeC4Y5Ha5 zBvkbX*9f5sHi%-odyTsEKuF=SX7MgHNlpTS@-&`|?4cvY%J)rXtZ3meOfhmzmU6Cj zwIvTl3V8M>gz)rwY3YvAktf9ndFbDi_74=^ASB%Hu`kmThUj=?MCqsQ8!qpT1T2b{dHnx5Q2zPSe`+Qqy(U776MW^NNP?JjHay078@ofLd&-zip1oe6sWmfu6=*2 zlv)k85h%a};lMZ_Se}H%t0~@(Rh#{S%lq9&62IyZMvq))yoaU zU`Z9yV34~QL6j;@ZvoF0&k}$gy5%@y-;1~Lyl>V|H~iDMm~T;WkbNB&8sC+|*-q?i zNLSvxX@qJT@*-JG=)zwnwx)K5%{h9rrGrxs2+?e;&J6_v_?GLME&5^&S9ziv;vMeg z-X&^di*_3&qt#B9BC`tu5^I>CjwH1*5$V!Y%X7bd=vmpadTEk|efp!_C1MQzIV{A| zX+Ekj$o)#XH4%F%$y&Q5<`UxESB+4;Bg-*UioYVtmtwtDs`&g?Gjp>;`>R30aU-ds zgEq?+Iqry)ots2SOmUVR*o zg!-41oilBX_?nr%hO)**?aq)DZD1lD2eVK*v>XoTRgs+i&c&1bfNzrw%=~6%Yaxb} zLln;dh#g4*QPkc}F$-dm$D=8hPC}c+G=I)_dmg(bu?H~LOJbVH4RksjCGZh9Vq%S7 zAoCjv;y4{dgXkLCN(Xa>(pP^t6>`1Pf~H2zGn!OUmoqHurtA5ShJdK4}an>a6UIKeN;7t;dSVo(=z z8t^LVi27>N1zo)`u^Ykt7W>R7NhEbI0wBb{GVBwCUX& zb2!PQk@C9X6SGRII3%l-*z=m)q#w`LLe-h~Ry4OT+`>Ed?q3zJ*3|(J`J9ThElxP7 z+@$H&T0~tjy$cyHUo{P5VBZ&KT^XJ6eh~B)H@EA`Ary`WzG#N7v_c~PvebcFThCrg^;rHee+LG%89wKas>~|*{ zLHTGS5aDVr^~RV`nvO{vk-$_^KSpI_X4xqa)CmiWm5MK0reV&)Yw$%L)ZzVM(;=f? z@IKR|;VcU?1F}#hE5%)vnC;e1&OvJ#}=E7A4v{Zxn*4Da2#y!4^s@ z5@~%bH`;AbZ|sRDhxs4k++I1FzfW==Skg99>7;L}kwwn8i6}s=sX{=PJxk9Xt%Y5* zAJ{;Hqx>SzH(J8BlQnE%6zjDKh0wftAH`9?ekkdhivqNCDDqe)&ZoME5~WS8zZjn! zjYTOePbY3Cy&9R%iXEaHRh91xj!8b@p~{(cu`cxz2OY1Gm4}^!Mx}Nn z;cA-`s3|s8t=GYqPt-$p*Cs?hcc$o4(PsiMX>huts*z?+Ka||B^l^Jh*j|fu9fDA= zdfrFMAU71&4*0{j4};f0E24X}rg#y7Q&wUXK?;e;$#(wekVUGC7BZ(7Yw~I=M2|D~ zZCPhv7!CKhjb2!_-TTsY9y#cN&$hxRWmi)1l-CeFB8Jr_5DaC2HJ$kdxAccBz-_{kzR{p9A2j0Z(*3RDT3sABfZ(xFv@`=c*AdQmgU22tv*Zi$! zD3#) zo+Q+f?gCe$i(e45l(isk@X1P(WMc1fQP*5kYgDgW-}yGh+CcRZ;H@nNDR%jZ2?^6! zE}kLeDFawV5Ufp6n!{$UP=@f}nh`N9LdG-je4_W_YY^6!WGvC7;i!5P;RqIim;*{^i#e3cT@? z?idLE^5K8g0OMH?<2g3*NW|?c#r*KDLG zQ#X)g0C~Mg3$X84$nq@_#WsOJg3~Nr&*1rYiPkBFl`9}SL|}R^1S5`#xE^7GB*Vn9 z@7YegM_fHnwr?Wuq`$q4PnkC}NF!cIMca>NX!z#;)LWZ7CXnqIBY`j=c-aMO5wFHV zBwt{~6Kobld6I_BG9gezsTQWQmux~-4s9`i6w=gL#ol4LN^Ed@j;q;{#$AL$2?dN?mAf*REn)*M)b3)KG9<4N9Lk7-JEQa$v?WMEOi1P$28%HYB@R=vn?v`1iGtoRgZ%Ow3&T#@QbQu{^_ zX>@t^q<)htf>E94aH+57HD&Zi5Z0*yb80KSD3Nw2{SERwUehJPKheDcQw9!GN?eV! zAuaYK0yIeu6QJ7aSI#d*a4wQ<-{zg%@p%3|inS=MHarn7 zURbBRthCTc(bz}Q)r*fkwNYek!X=a6m-num$u7~q74Mk#BaftJ=`eZzxZ?q)MirNr zw9IAnwl^@Cevt}_H%a^1)~3AZ?G#NL%fmP%R_7lm?pzR!w}LjHU;Zf#lcz*HPf;{2kKv>1gEc6YZC zb4l<2D2|}3js<9q8?$=E$b|DO!~b${-*QQlcKrH`g76Di`>u+Uu#WLr0gBzT9sx#^R zO>tWcA{AgR?a`cK)Yop5YcP+(J{5ekU8G>Zf|AaOPsHxc8n~YsOSI@Zb?RFQrK^^7)K8MMI@wCWvA(~9g%Pe*k zgHL8H7Qd^3Fkk3!ihc^5UXm111-gVM z4M3Om@Ggr@J28GPMcJ$MoTy4b-w+r9{GzcCH7HM*^$iSZbqx_2{y~Z@?m$8xV0=uLfqOQmzH`< zI`1|QQoyPTu(d`7LhbWnx`iX$G3AyXqFteNmE=Zgr%pve)9W(d-YN#1sCAt@#(P8I+Z+rLUihl5 z_2u=2xY32jH=!*5l4eujGG6HJFzlSE!y~E^|M6L`MD5jEtfKna-lBw!PspF&iRh0< z7p~cEawY4eT|qETOUi4pEZF(sW-U<=xs;F;6K2qe>$s+{WVI6~&n% zzv#>EKXxCM4sxT%YNjNqmpK<`{l5;xC1nv_tum51jzgkfj@Q@MKarJbe2OPC7tx27 z7Y1DwUHT#k!u`@~2+ByMQY?2o`Lpn7Oq|zEA95wHLZA_rMkaJ{tZEvRhlOn}$f`Ku zj_S$6@SZ{f5R$Y&5U2Vf*4QV)E!T|uYpn9bfr*>jU=<{?=Txe)TZ{eViaH`EEfFcU z&9`US0#&IKd`s1N#0wCbCk~qiEoO}}#F{#+`9hzJyRzt5BJpQm5tW+iA3YFHsq0hq z7#Z$j7W#f?W{Aqg-(?;;>~<%!#^Xv;hdIG!*v#PAr*vh-JLOf@(-4X|cmptHgc`Bo zUHsJ|dKTMI-9dSl#~;K?6NFw)(JrSCjniO)4W{qKy}?%9Aqt}ASO)@Po^)VnmQYVT zhCP5G%v1GH6#CIv`;}ubJ#KFSYg$pXI;rty3>WZ&CG`}I8G4hKq=sRpQ)vKDmkt}) zp0Lxw|38 zKIL2(@(2CYB-cD$c@2KwQmU?3E5c!6Ud?72*I*$|G>&Glh+Lyqt;l1A>2}fnH_5p? zA$GPAzfZnR`39e9`I`u^ z*m}5^Q6nUBI*`j3(GdMwO_=JzaL*&`5H$?_T!qu9A+xV(SSE+(PMF-&h4+PDxtifO zGN{7gjW0HLl7fA$V^ZHoj5-@wZW*y_jv#SiIL4ZHk@>cxh@0mw znZj2Xb@Hzi%cACOAa5}<3%mRAautW4w*P&kKnc8#o>(Z z6lOLl^JqK!Hdqbjcrh0NzD6x zFq!Dky)-A#C&Fr!Kh9d{koa$9G)le!iEEMK)FF}WB;MJ!A~n|WXQ0y=^2(IG)U`~F zDKKDzOsJ(3LZ;;+3I_m+EuZ576j^K%!}-e#Pn)QZm#y}?&5&-HVGuHr(hUDt;T%1h z&Q;?dRJ{O)u!7i;D3SVg4rvh0NYMSee%sfus9m%shoKl$BOmj5VJG)5PVG7~$`Fh0 z5iS_2VWw=8R;222AgWT~f=N9jhvAH99C0=>0~(Qdk2;F3noI8{2wm606d~}*Np^qA znVyOmnTX=3^+>6xB{-m&VoC>D8WE>Ny=cJfxzS!j@Ce#n{5|jV3XVsICnE)0T1v>l zP78QG$fbb(5EnS!Z)PVZ`b6D)_w~BW~3>0$XlN1uRhNq)99f**RQ!G`4S3p|SKyq2%NgFO3wOrh1 z=`czS0R?6@M{SBH?%KX&(gv|Dn0;Rw^lr(GQ(BIe-Kb6U_2((aZs)YTHOz@B;UaJa(Hl7^vQ>m)nf&YUeO#Slkweitl;(H28D zc7nX*x~5*}W!7agO@vu#Ug#E-*tN4mP?A(yR$%gX*o8bVtp`A)ye!=jC#(>K4O$`( z;In+sss<{&@g(FgKLLCo)J(7O6vk-3yqr^(;*&yN@#gCY7j00=9-Xc(4(T=@?R`0T z;k1SO5}SFZV(cRXBP8hMYD$^iSbyHZFsE(NA_BAoaE{zMMx|78QKD#T%aLj?XLzbI z&o@xAD6JlFj?cXY^^;1DVt`%Eu00TJw?Y^B5#uP|5#?pG_Ai)=Ptdr3LcD&NGaOuI zqudC7Bx4#gEQBnh5T&$)(vZG$Og%I-xin(;-sdSyk{o;~+Hu(FYUyn(=)e5k1ifvA zTID3_q@?&_u0cHNvUY~cIeQ>Q&! zo{YpKcEmJH^6|+0@sIA+odSjb>%YY9cxk01Gs=m*Dekw2NEUTMh@0cuc<8N!46OyIu3wA$c=y5 zApZM?`7rCer)XvH~1<<)d()-zB8^-n_;5aDd5`PeNY5Xx?=A7i0{y`$?fV4G19<&%=Dr?0} zHE7QYDgU}=p9Y!1YsLO4e=l`-6>%C9=IU|CKNHEJb45FhdBa0@8z)M!ZxbSraSulh z;iaZuv0Nooou73Eaf`Cs(~Qw7Oa!1MkO3Pbo2$)pC1~_(z9S-#x*cqh1T|vkw5Ra! zb^>7r{Cz2pw#5&WKgq_Vi%Sb14Cn>*~mE*8L%DeEic6Mcnj85eUkDMZ9A zv}*^vXbB{ICIV7VNtufQd`rVR4!}y}K>7d#i~zF$4&VR)01|Ks_y7O}YCy$}Z~~10 zjzAK?2sulDW}rGS1;lFr1QszsDkpTF0qwJ332<1Zi}RiPY&!8Yl;WiZv=JZ_c?AKt zQ!{AK!jpl}Yer(+t3>UK@B6=LuGDLHNtjBd=Z6<2b&ANgP08D+8$p{hYo3dA%11@? zo_Qzf2neK^20_0e`Lzl(oX3-NYVsD$6#$mmYc!7Oj-izzD)x47(AsFtR~;jLM9|Y~ zNNK09b_^2ar{Pq$_xt2usrBA4%@bDW0Y6qOaY9~o!{z$i=1ieuXv&c0GCoE- z*nA{%OeKjT*eKZtv>L^2#ho^#Q&+q3Bu%uHtiotK1}w=u7ox%556zTSzxFhYe3a+$ z#))ne)$NsdisYtcU#{oqy?kiL>xd|6=HU2n2(Qa%NNFgbWTQZ%Dj^Fs6U*78U8gH! ztEfO9UNO`;bf`s0<)qhY;%3`y?xd7)%onv+)sx+aX}P%w^L0z1++74khs*ao{E{2R z{VUJP#FKm6TXwlJe3G8tl-4fP@ZNPeCy*|9G$c3VIjB2CJls5cn1G`h`U>lKhZVG* z4YUpN3d#?ojG0KM|cZ`KXePWuIN|KO~)i zpnsyIt4asRX{i~V$>l|Z4<$iL+I1yTa_&-Y?FEgY{r#3naNBgLvR#M-p%)mZq?TMW z3j`-~C6IVkr+4h`)41m;GnEa`5UqX9#G)#!rEIO&O7j6#)q3|hW*A7SgRrXbD8d|t zqem)enmW;h)C6k;KnMaWIbu_`ap|oruaH`A-Sg0PD5vBcGA3x*N~lCEp3j{b@-`TcBT{iAg6+Xl7fB1%T8y!cjHJ`Uq}fORW;0e64)KDwyQ$YyMc|2AumOT&9lrPF-lN;|A>>`fU1!iueU{zXl{Pg4haH0x-t zF_G8Uu!%GQ^8kX>I5$R#KgIuX3l^IeIRZa@% zO62k(xm6RZA$mhNxo_6DXghWk2f#H zqrNLh0{?;QtNR7h9>pgs{&^eze7XnfIq)|xtO#QHU7;6=ty+-_lgMUHns)K!! z~Q&h_L@)1(>PpQNBtX4!b zNd`Q3xqnQN5O6qX;PfC7)3p$}5pd=C!FJA4yk?(Jgtwp61i?l@{+Xg@fc8cE_YnzQ z#;4V*aem88&fwHYCz)wGD#W3AErzvZvz?tvlcy!hT98|&{Sk3v6`$!{=5Sf<-bj%3x(`Fct4&b;wdBK{-$D=42OO7*-x ze8xJQo3ig|J zBEJ-avp5UPqsG<_ssFL`0 ze0-W|TT*v}netXP$i6Mrg1AoSA*72XR6gL62%^`In^ZEP8ZP4gaC%kZ5-xgtGCHtp z?L`cr{N$QI7lJ93_^gM^9k=PEt8zgV!6KeR5qFLKIu^#Wz51!;TP`y(XA@b-KF% zM=au14}f7V5Wjeg>}AyVS1FgQa7->K&A6UTX$)h?mn8IAHgC+*PJha#+9}qCa9cjE zuqYu4gJUP(Wu{HZ)6J)fYuQn5|3aJW{c%aY#=H$0qS%ol2wF-IRWGj{SAR zDUhc&%JkRQ%Pr?#R5>d*%e=C=5RlhUNVpP8Xh-5b8odbB$d%soDs*p^yGJoIca^j^b!I&k*5uv zvL?N_k%EL$&7C^}wO9NtR!hKV;l&hpPjp5xGC~t2S)h6m$;ws~j#Q@KbP7>KWA)TO zh0|JS($lLh=FxQAjH_NKOGI5hVq2Kg>6Sa!%+r)i2}bvEQ0XPu=q zioM;q@3<0)Lby&!pds2a20~w6#ZPP5Zz87Ze9-AtW2dMSEfSMhUzWv^Bx4j?y*^hE zspH^f#d(E~%;7iOvzNo4RV>Duk*aJau6r8A&Fo@v>}98 z!B2MSPNI>KeUS=Di@M=KNYa{e7u;x-e2dxQnGhippO^R;&(zD>&1jG+R(3`gxdeK3 zR;sv#wERG(Pqj_yCR*ac@U)>{v>FX)rE2Lu(NG{#7Ir~Ft=6KA4uNGt2}_&O8#Tjm zjo23>EZqpOl)4?_c_zF$iCHbH=)!fF2-9h15idVY%~;f$yyaVf<<@!R(KFp znY)CdK_4)?C}j~sI;lpO=xs1E4G!LWYTsCB#ZNPb3|lnHD`Jabv3- zQ0a#_k@Z2X_+zMjbvEzzX z7|w^fV@O)LyizJd1Sabi!n@F|XWbWoVkKI-&sMrbu+-{09u-2_X-1lp=e%=7wUF z(mxX7C7y#A7}v6Mk|PKfBzbMt=vH# zamFG|5?$MtjmmKtZQD-q=#UjKe7w9Gt4@Jt*J*xaTQKmZ8X5RUR_$7{ z=Y)V=hU{#u8_Y?WtRg5S2xNsn;Km^lOhyiw@+^FIs|jfQM6CM>Gj>uQuF)Z^)3+&A zBH;A!+_J6~jpPrUL5!X$h?kvuZRTYZqn)GS*m;ul=Py_BKR~JT7zDHtDCzbLfMOFj zFQaU4@m0rnSt6dCFDa!=&M{|#92L-Yz`w5x0ytzn| zCWYQEIETM>C8pFDWQV4~RJYLt(SfGGgDO(NAk4oyw4Sg`=Gj1YJ4&=*o-a)t3)vJA zORom4ReQO}jgLe`dlgh(39JfQ2hpv$Cm-Ii&3%$7vca%PtE3h*?t}{RPr8IOs#_^h zfu0nC;(mq7rC z1l~y!5+W%ue!=PFq%@?d{wZE*E)Umc**3{ALafV-dv%g6yZ2OI4MwWLf%Qw{uE9&3 z#(^h)5Kx`2bp?2619YjhfYj=k4RZCy0PYqs?zhi!%Y3 zD?&D)svJ&XN(q)5E2M|-Eciu`W{O{AD@5MN7H9&~de-!rRt|2&xpLRxB?JFBp&_YJgVbiIe!n@uq%+_HaQI+Z( z3nOM5j(9F3Vr)FY02r3)<0XzKtSXf+9y%iVh_#0GvswsrX(3j`n|t9yJSv*5rt+Gv zx7p!EC=jb?4SeoFCj7)U7kp&VotF42@KCPT^jr#|Th=U;UEiB8o1<%$KWtWo9n2*t z&Xn_tEEs7)j$r(Yr?^GTLYm#H`*DQ@h26>@#nWQE}y0`*Xs ztKiZ>8GUM{(IGV`6D^kWbw8ZV4H%aZ@@2+QekusuuNo^EL{$t?Zp{#x-+cr=>rls7 zvzBKi9MMt=I_BlO^x$xh#?yrnzwBV1n)EBnbJ;) z_A!|>gYH0;>1sGMGL_Cy{Jb8byq!zngcq)FM(CM*HWi5|!3%hzT<&T((8S^mVXiHD zBsEh@u*p&wMj+!9sO?ck4*(odLH)TE zuwG|4LT_!H2->t)8+s70RxGea#K(mwc^y@+ec7W%8+kQ)DKW08zFDeWCS^0MPP4f? z%}sijteeb1vvXfI6SmUL2;Fx~WK`7vNq8&vBk?k4q<`S_gXAu7BgnTErm@0|3b z#l8B08mYj9*NqnTOKH{wK{+Dk>18?TZfu+yV3m{H-ZVp*g8K6RQ-n-cQgyxP1Sny} z?ap}+O-3k+8Kn9W=#n(CXit}vj8!xQ{hC8Qo|HsFoQ~f8f>^Y1`q5osK}IV9Im;2k zl<_6vX5)It)Wu9sSlkA9K4S)NCu*<5;uBlCjTnpO74K{|P_Zpi7O=T}IGaNxz@_3y zS(Nx=xpKyl45sfg!4xB?g&LCcN>l<#1wZnr+O!fXa_7$2w+CtCd;05ms4xd5Td;lV zt8!LA={8X(AoRQ;GGQ6^C4D&nXcx1hClt!yC=wHY&Ehmqb><6it$iGVBuo@^jNbDC zxaY|(!L^4TgPxHeBf5_hF6+ItdG1EVg*uHCog)eDM>P0m!c$q$4lcfaOVw)OYp-*> zWwP|usu}liTQGI9IKJlK7A4c-x%K>D@C|j1l`^#%6Cwz~Dx*dyBT8`^gzAs~&w&Xefy|Gf5~epj9)t)o zwn}j1n6G;4LV)pX!XOPOa#nfd1T0v z8*@vO75G}jCbCk=G)Q+4{X9JRf5|yC4-)VaR3=|@Rv*F^cj|^)lwLmtwl$<(gB0VG zUCA*HK?)6+rR<1Ck|2!;87#{ezv|15TTaVgeb}eu9aoN4HVFs6dUqOHGD#x@MM?fKS4)97i1k79>5OC@L9)EKe7 zt%9f`#wG9A4Ws60FD}Ce+*{bP^vPZQ^~MO zj|`B>b$-ebu0A5FEQ{eYfmHhmc<=R+Ix;xmqVXd#Pz<7S_M}TUh#H27WkLj(1iVrO z+U7-bIAeA#gB|UWAq?dMO!rs^sVGrjrVCTt=?K0pYR+|2^#h6Y3KJwWD3NpvuU+g( zScT8J*poIw8!UJSU6w0H4tWj043Xlgt?E#{Q$BJGz+#TE3o7kx@M{DEs&d!C`b+ik zVxS{Mo*11q)ytMlNnr_tQu=L~5*CmR)m@u4*O8rG=YlZ0hYim14j<O_EIBH( z*rpY11dURbJ7HoA5LVJas~cAFEG{&Zz&uDJGF~C1Y?23PR}6S9)D**}YKx38NeG;>r4ScSU(B>g z1e-!FsMaO4NduN{hcR4{hklp>42Mn#z=+p+N{f6$;90Pk<+AQNaCuaQ5S^5W0Kv2i z*rxm2sT=!9rZKCyN9cjrX3tA1ri!-qDgH`$NTV^PChr3%OvrJr5}zWVVrj?v#F{2a zpq0eI8gH2arNsd(J|xWo2&t7B&G1G;ueJ+gT|@>9al}(ovCR#M@2~CX&JU0Cf2y7R z@f>5t{V8lIw32h1Aw#{UDW|{ALzrUQu@djW0cJ%;S~!gH(cBYfk=%W!!dFD-AY9bE z(FDcg6kvnxUWHWlO(*K`MqCoKa7pVMnW#>F>{<^IeBZ?wD`EmrpCX5GHqtI9=dj;o zMxcd``{=0^VGFsSfxj2vp$R-h*1Nz+h>pIfys8vI6eIw(&3PrQauBvs_%dVl^|%69 zT3pesV9!$`F2N5EcsxznWm*CXP%3oL&IhjM*8++))dFfQ7l2kAgAa=^VaRDI#RwvP zlL52MX~p?M5VGi>og;A0w2vw#HWoiC@Do{5eC?5xWIBdJE@J{Onkhp5raL9{Q8N>? z4NFU?)^yeBTDlTPkb6X2W*Fy*E%2WfDV(6uRIW-9R*K?t8 z{YX)~(~4>0d!rvrYLV39^VaohWv@R;oaORjYhn5((6XxwW*>GztqzGiV@)|0J0ga- zI$j0NcQ)Q@NjUY@3lgUHBmq}q+mE(k*XWbt2C+KA(_KikFC8QEC-_ zbIM%7wvp>;M7741iNV|z84*gTu7WYH6wB!ybHWy7s8t=$)?M}_4n3g zZR2kjNIt1tG-?>Y;r=iJvzo;zND2;mv~|1J9IqCFp!pj518GRiy`c zvqF)wz(lB>z`S<&5dIWcPqq=uL$q5*h>}rUVLP%}%%;Ks{ekHjoMQt=qHFcFzXis!`dAj_}>=2hIjNi{$ zKy?Irm@Al3|5PMN+nJeokq1VQl>OzA!?|4kgu=!mBsdb1uU0`-GZtT3IY8HO=;Q;x zm{*PpmXJA7Gpeg=>SAbKPv}XXiYRvIMTpL!t|f<2HNBO{T3~Uoh+YQvoa{Hn{dy_} zUHzDR1)J%Acw8XUK4m^U6xazxE$S=!j>T$CLK}TOiK=>wwyzOHB~u`n&>l#0T__sW z=p%#$^=>GfJ2w301w(fOKsd$FF;{@nq+*y+X5+MK+|W5}-CdfY@g2rsGbrIt=O3XTUNfIjp5m5#PK3H6@bSzSS7;YO zxiNr7v1{TnJX~z+qvyIhlv&Jy@u3n$N{OS}9!HZRJ}l|kMZ~zKzol(43?bStwvOkS zKr^ybSqA+;5>!lsxPsuTwcmrrnd=?OQdZk0SCeSSQWGR7ZU>|P!=iCrSg>dfAs>|L z@pmP7(IK2zs`&C+gU`DbH}h|0_snFK%1ellrlbKd#-W{?>b$$;$YxsVUrT`H z21W^D@~9oGX^LSwQc)NgM=ME3BDw3WC~rIFkt_kZcZ1l+yUsF=mxCA2+DfdRe{09_ z@0~JxZP_1&lKr_BcPal=QxQvB>APY`}M+%Q5l$N<||$cK;13W zy$aHyvC8s$coMD}lYcnNp3Ppd{l}28kc9i`{rIP>U0IV&BE__oK&tYl+L_oX0Y?8ITGdec)f;$D864HNF zB}C#G)0P}gWB<7^BO0%l{Mk$AA5p!%32??FgdDeun_O0uwN3$Nc1Taxx~`EgghB){ ztBEd?yKfmvOe$8pFx?nV_V9zpZ$UGlZZl=G-l&pO3t9hmi`7+}A%ZVIbHaPwCuhb) z+>g!VOSX1m{c|#L(?tm;DgRM9N8k0v-_9faCaDnAhclBCw&+_mlB5b5Nb7%aegiJ%+p(L+bZ=nPWIl(rm&8`hI<` zwbyQY{GUTUx-7!NE}o%rk=K3^{Mibh<({G&sst$LKN^woC;eR@#wN9en5f0{`+K5* zNh$+~%xNC_m~fj)l!1H|aqKn6|7vhh)f{ToeKnSK zLl@y7tl9(>NEr{E6oFGBzkLZgWs1RDTTTFFo-(VruUzOVhZi*YK%N*dy$G*vHRgj{x^Qe0V6B2E5( zg8jWY=#1H_#MlJ;a+kvhp0<1?;HRi+S<6qv$137|In6Y9K*m47EY|P)8h>RP?MY|B z!q$0d9`mMcxbmi*Z92(_w_h&0)PZ4;~)@uN5hMW%)GBi9e4WJ`8p z`ZoCyDaxy$kID?kNrF>pUpLL3QSz#hwcpTAKM%&N5>c@-h;g? zn0goKv~`lJ?NjzuOMX;?o7#KIQtF*Z+7MGK7$vgPq$*gV!d9QtZX3U>z$9%uu zYsCS+)+NQV2NbEukV9Sq>$ZZGt@*w09&ckI+*#H%9Y`rvC2jJFHnZmi?Y91T1%94sAsgfbaUTR#7B4?#NOaV$@ z%zncsF*hcz?_uz{S5L{@J)WuY3zk`~$ppnXN>kp!eXJ8rjbJC0_La+Gm&o=zz?hT4 z5cFLFa5&IeYtJlCh{~E`9pbPrGxJf!NfzYKm{h8A;gLS7nwDWEzCD^4a>gEGNT9|bGOA3t>Y7_D%GH2tkAM~1JyaBFR!NsS@ zH%o?5r*_#ib&+QnwKUpLaHP>g2<*y`hbWx>L=jzakHC>5!s9=c4?I(--I(c+n8KwA zFOfe#0U{!a)RxL6Vlj> z4Xb{Aln(1SiW2=edlbo7%Xw_1<2_;>_ts*<;?xuVBErEnXFlJhx}lVp>7D9oMA4_> z5YqShS;}$w=ET45$TITk#V1gh&W#83a0+}nwapeTJl>ylM$1^oTI!W4KXhy zd8EY=d}E%`n^n9%M~Pr5Ql?v(&r0b6#C08WT2|AO(fpiP(s2e>h@a}Vs+{RVaM=>{ zn7uwh_-vgw9gH9XUb&jfqArsfdFe30d};weJQ`G>wwqQHzAtPV7e6pNQhBnW_=M=t z2q{aU5;NpBLyynHoE;qcjY(q4#fia899Q07TxJLcR_ekWO@cFwu|a*w$V624QiJw{ zk#k>fIv;Nar#_B(RW~KQ+qh-5m*&haO24`2^bjErJU{BH+>aT)xiNoPV&~X%jcH+ zN=}ZGaoAOsky5h>{2`HN)rT^YVO{zs1ZUl~n1oyWxwqx{>io5Dl9)*9zQ$PTd-}yG z;Z)%aEtc^1lxZ7R9X~8EO%@b-YD?cFS2iHwW4iIeznVgGXhOJe1v&E&v#!z*Ds(M* zmdP&=nZhhI)Jgfr6( z>zYpomF*aFYKXM(S9dmrt|xl{)D00w8lSRdkF?nN3tq*DC3;(81O7rA6)J?e$|@R) z!+eL5P@V+|Rv~@dK zxXKi_q5frZ6PK*;pHzD;4H}D|f;+L}@hrB<2XW3D!u0I06}fYV0F#?6Thicgho?{_}Mklnh3Ug z0{3Kt7yZJ+1WO8oxQGh6vp}^p>j&_FD^#c3w@^ApU;zY2uSFTk7u{w}7^VWKnFby8 zI9oW5o~wZcXe?Abm5cK!Y&c@iIh#+fFI>6eH7|tSB;mg80 zh>|@2pAg2pd#W_LP-!L3vw3e{jA!u@B?u>p+CZLdqzuK%x!b6(CFKJYDRIO800i@l zeW2dwn2tTd_K)jd)KQ8Ua@y?-79N9yor}bZo2cxZ#06oYjQZbYf z^Z-Z`A{RQ{9h9w8395IGb6{nP@gi!WtG>$YQjP-`O+1Uy*+sZKL)ESr2NaINgJ{mW zb()sX#zA)X6=1^{1Q7=gI1|Mh`|B7xsJ=&(=~~%a2q7tmd#F!je-E>$EdcQYL~{Z^ zL|i9?MUxwQ&aKdvj(?#wHcJJ6bf1OWaU>0c>efOL4!7!8nJmOexWkp^8l8F`e4p{XG_E|ONKnj?mY z#*GRgh?&8-E&@4fe|`&}tIoWK@Zc6o2qq@i(9R<^&LN~rHq~nEM^U&c*zS%&r564w z1n6+Z@;-~>z$@!cWllpO>%Qt6Pe@A+U5*1Y|=<`|<&3B~o&L+xhq%qW~Dn zXi%0|8)D;>hX97KHpMXcbA>0mWzHi|L{us~BN;`nSfc@+Yy-)jIbO|fJ1%{xyss_@ zgC*_}254h~5%H)>9&kZi`s>GxBk;)pV3A^?DWOHUAJgORNjz#6*GBCigd=9P1BP7U z3lRtOErnBPEzR;+FNL+Jr-TIvzs}jr>N8Tb%FgLx z3vuA7Q=7n}3v(GvOtkO>;Hz+m$&mPxX|)Y84oNz6L^2Dj^B>nx%zxbmSD8Y%NQ8NR za@8=z`vseW2nMip1GEuyGTi7USqJTsCvANwrWlo_9$5M-!N-cM(bdTd-_qk~yh>Ln zAx@I5fKd>%1#{f|hakxWLqHY=s%^c-FT_cDg^Y86WY2|ytXmd{TLqbl=PgS^;@ygN zsJCZ3uE2(H1gp_zRjrLXraA9+?@Rkxf=OtaO(!)2>{yFo5N&AUtcE$2yib^fWx<$Q zs-I>22!8YUge)qiTop$l91!~^AwIM(hifoG){F++oC>HTuS};P`BxnTdZ7D#-uTD4 zhoT{9H?xU1ckgT1b{mGZ0gkLaq^!25!0db*`v0KON!?osxy%{l&@Ufc-zWMU@GB@a z4g_GCM}%TMo17P31Wll9GnV@tI-CIlPl#tAhy+1dbN)m)x;1Frz`BsD;GMl%9Gc4G z!B?ELYsx4e55_t#6z_4r zL>Ph`Kwl5wBzS?iO1#v~qiQxh&5dLqz7fX>;9eH+Vm@7z@eGhLW-A*#UnE9g-#I+N z8accbffS)K(d$NWo1447gd1dANX3DuA!skh`Qo=A10W!UY6b0uaEygt7+Q@Lj`8+- zle8y?%$Ym`9qJN?*gHZ5y^hEE+}7T-)@b;cJAk}ZJb%T#{E3f0S2w*O1}#ysyRV|; zc;N^WHuz2!+PlwOzg4H<9^0M3w(52g$Iz@P{et$BJ zytG=3{>ltNpikf)rz^-&z*7zo(1Abpg$s#APFD?a@8PgYDG%;4R0xgLnVtR@LI8gD ziul`5_oeT`Kkyr{pOAdpOAu- zerg*2N~6Dhq#eezwI0DjR?y%bYPyCUpr|QLmT8;0+>Ex99 zVu|}9CVsdY?~(xd*e#~hA{T6v2(t=TjLdNoS0etrxHySvmZZ0`p!KWP9I^k+r0B)A z&dwCtzvy3ALAV~myHZTsH31|->kaBaQ+Wglxfl$y{WNGw4Z0ZPDx6899-_@*@9cz3 zgMg41K80-9+?E7l1NbNjnS@YnjRFKyf|%{l3PAsAZdr~iS@Jie0*HNSAs!+1^63r@ zVe}~k2$at4+8L!y!-Q#fJ7s>30%R9;it`t!HWpdqx!e|_Wx09q!eC0fr7uTEB;q6% z?O#BMAi-`a16X+c%wK67qWBetutW$pD1a?U#bH8H2&&!_mAPImQ*1Je0ABInO6v<> zQcO*VERtLhg|vc@HA2@YEQE5#y7!=PE7)q$>j=UZ<=C>%ZM3iq^78;T@Q#N;XhB0Y zl-Oh`O(htXbo-plF;Z{Mv(mfT^KWN7Unu`H@A>2U+XC_pFVtKLw+RJeR7wO6hjqpS+V>Q_>WY18$jl~-0?XSio-s{37a@CU)lQd@w zOu;x_2f}~A=n_)n{x-!0{F-}xJLz;=ZWfj}X)`nn6hn>=Ye{M=Icih3p$72v|@x*nT<7s!y}sppKO39HxEf zNCtPyAh@wB3qfA>3gR*Hq`eTJq(TcZHHMMpdG5QJ$z&0HVW`SPq64Y`3!-b6L8W!f zjAlfn=U4YK{Wk7(#1he?RFz{vkS}r+$y^Y}z_?g+AfzjS8_*Dn1i1nuMkldAO9U8^ zLYp3luaY#<0!Tu(OKDl?)A%x(4sAn1(zV4>C+I2mOiCmTm=Y^5)Ck@DS>Kee}?$xlKxiDf>V{htteE?f(EfAP<^rV}lp+%`y4fgV+@iWDh4AEJH9gbD`{mUs>VR9pT_W3e3NkG?NU zdJZ6Hob#RE6>4`2NSa0nm`dWoeirZJ19W>KrRA>&f_`4FqpXv@`f5p9&o=TeJMVo<4@BonAN(g8f0LJ1YY zOVDfC6gUr|gMPYHtFd|hdV9dbP}HZjv9jL&ik{I-!J1)u+v2o)1G z>MRJceqlR-jc!<&k36OzGQ>cL2{L}wB4WDSmTIJcbNdTI-a!<&JTTw6CDFOivRYuS zu#se<^n(iO0R0ksQlOKK-g$*n92($xLV~2y6C}#ewKYO$MSI4FhV`j5RQCiTR*XdF z;Sr{4%!E|EMd$Tvp_Wt>jbmZcm|8avh{G5W$9f&*mqkGq)Rp--d#@bk5f=muA&N1; zlA|N-^$mW&m=SQ`KuC+jIAFGljQ;A;y`8R}9j@Ot!O%mAyL53hhR-yzoJt~DKo>?r ztEqL)N+LM=CNU)PbqY4xPpPf@nzV~JmgmXn$ion352IKt7E}Xb(YEv<>BA88J(wak z@)ZcrDcRHZz2Cx8O`csl38WyaQ34>m7{>K&UAZK{AY-ap<=0q`eF_l*KDR%(<+$ck z1YC&xW1YMn=P}q>9*(_S3xB0i?E-@^CC^rQ682*ROuC5F-2a2d43BM}>6Ty!s)l26 z$CN*v;_Q$q8~0_{gN+<2GnkF&TUTE`*pkKE=!Ma*B-59T;G7AYOp+8~C8V7JKU#oc z#RQ*!_(zb)(kzB3?w3@|XL%(SU%3G(GR#zwJ{AjdcWcI`&=BSi7!;x25Z1-L2Qd<; zL4;iQs{M`3_n%%5h#-jxaz2*9hxY#LGQmprLfkF$La=gevcnDxP?zC+%|p-x zx)CPpJc1m5yItWpfiq&?VkpcUYxvQ06od4j{|tnPFWc`m!wWwj((Nb2w$S=w+LYzMy*g`i9z%rg20AQA28&!-ynTo z`El5brik6ZltWzGQCh>Y&a9;G%b;G7a|7 zFazOjdSFR8(004OJX9qpxOo9~DqK#8n{svdK}H+zm|XeO1@7D>f-vq*yp^Zx13nCS zA7!gy>v;2ixCL16;=^hoW{-q(a}X)lNn$OC6oVMId5()vLz<`k2!;@3ZD-G^I+g6< znX*PezzVZu(~Gcr^uV(KhLRS!qU~-Yn~K7$3!P)~yholmULjwXa6<0IFAjxdxPdsz zF6}^=W+Hl&N60Go;6axM-XVD$Av&|cFsg>DlYo!CNsn{SS;P%mB|%0CA-E2dslscB zVo@7zW9ZB~T0Qchf%`@UP2NyKjsd_U*;2u?#|$QnZ-(_*$Jw62SDG!AuBbtUOx(Pi zn0Bs;M_YqzQ`eg8T?THWlrVvWJy)s0T9#ep3J%<&^d?7?pp%<8=f@9-ycRnFMap=7 z3zb!i>$iLp8^X*qmM46jdevJsTyecrqGd=>!Osjuebgwd3>+b`{W2erN@BtvRPfbk6=n{y`*uX99C1N` zM6YTTO_{eAM~Wr4FU%8xNY_sSTbMUeazu5rTd@*^pp`!)TWlFTisZO}TcyKctm72d z5}`~HN(I!?O~|}x->ov@iP$>^tz?M?OABu`x|T!nn^;v)l2cvf|u-;gn4Q z9Z+46Oyt>-tALi)P%ER+^#W)ZL12?LUju>xmwLK}tzE?V5v|vDRH)S1 zFwVy@u0HPwND9yVkWdeWXX47_gE2*L#^JA3s}>b2M7p(!1U$v?RKt7!kR%V zm(ZiNn0nX6nP?rhtvK%9uSuEeUr)p6OJLTbt{I#c47(IbN}Ja0yJcX)KZOrkyRj$-7@VUu96*) z!EU5y)9@ZX3NX7+4fwy{sYejwOgR{>(%3ZGtuh5h8tp+)ZH^lvoSM=h(= z%lOh{ZL;C1!ae2@!4x=*E!I({E?-duER#n2ejwu5_w^{@**z>_3Yr^>kK)wT8OoB_ zfbCxzO65@Rt59+3FG4T8h}Q{{Ji4;9zfOux2J3|{_M16o#9=^4HUfhT)pE}FH#@Fe zB#C@iU{}Fy(YSEMR5E?MQ6nrSOE}RWG6~`^S+_!g=*ZE(GnB8K4UY|SmuCQiP&3!W zM1z&{!0%k%mIokR6~qLNLU;W@uEf{mi0kNbF-7)3X{wXoU5YkPYN69IV<?j3LWj)8?QD`NvQrM(j=3$(7SB?gwu0~x#%(5|-%e17T zwcQYdmP0&>GT_3O%`wdir0CMPSFV!YT;8{32doty`j(ig*kM9J+;P|y-)O=d{)yb* zsN(k`js)~=AK@256BV{L{g7&o4iux21X*Yu;RBloV33~~#nK|`mSoW}5jLFWZz=w# zrUJtyWQ|}D6WYZqVlubY+j_I?tRc5+!`nlXsArMlB&nMQO7VRHRzbocnlkocq!bX; zkATHW>H3HL+7Fcb9R4K|weKW&=V1)hSdLIIKBod&?-oU`?$;wkCfS8D;yVpYGpF{i z0@Mv6vFB;qbb$y=9L@6LeOFQ?q@b>BOVlM_A-ghvD0NIwFUPfWEDS)cI#!`J;5&QW z=E@UUUL;&@w`R8qIfO(IcjvQsjQnF2_B>H4jM zB3sq2hg_&mZ#Nbf(1g{>WL@xAyzXGa8P8Q5#}b|?JZ5$Rk@@<3&?vZsgejKV8X|hi ztDO5@ZU~T`ntJ5b%a`Jqn{8dCWS6OnBYlD=_b0_~UA{5&N(5&wfp;oyQIbGcvbf}0 zFPdS>IbEd7)=k{*wYIF7ybsckOE)XfXogIu6=kf27(T3|(TWgP$Bb@?-5uN*mGHoD zCdLL0M#GS%GWFeR~*PlYSAdA}I_V2u5lBNI(O z1#ooA2<$~yZfy`^s}^!l zF>XNkzQ@;^CgfZ+QROulCTY>SK!+P?;z!QDLi@ujS14myAAnyvO!h9=vAST zIyezbFsvzpv45ExIGvdB*1wjseW_Gfr<7IKl7-8yHHPQlcpB2QHA)g3=Avu=edg@X zi>39EGAR!EOcA6h)p;srUi?SUEfy48l%AF_w?E3^Sv zQ)P;QXGUxIJ6fi+8N;$5Mu@11V?aWJ6vnf+Pf{4YkT3B&W}TV4T*0%)BQDo+7Ml58 zp687Z1=Y_>RYc)+X$07Z^AlJlk#!1z95KH#Lba+Ao#dV9<{MiN&A*D6VxVkxWeFlQ zg!1STWaYCj3_9*AT^r7%A+aKXFS@<%F?~U6T*yW1X>4(qdh-0mGY}B|Y z{AN2Y^OEqZ$og-}L|~$6*c3OnxeZn`k|ol|Y2PDvCe4e0lX zolx%+W3d(|w#|GbyAk$H(J1<>ZZ5p7kzsy*VG-_);fVNfm3?YKG9H{r^?UhbT8a`r zNd{7I1X<(TiE$-=f&5-pf$}T+#WgUOi8wLLkgu&mD#Va0An|(C@l?>((Lk5VkMM0@ zl*cah8eZSB*jgFbK|L(uoJSYcO*C##ZxZAxYFU8mB`2;P#EL6))!lA#B!^4o zI1R1lbyrG}V%$c2YSk_>@(rzvm3J)14F)xQL*E22sek~CSWp2*2e=ym0$%_X%gzBK z050m(027F_MqnYsR3B*5)k%;5N(}Te)>*ZwL~*13Bxk$CiiKh}#JH?N4{lAUf#6fY zY2z?AES(VJHf8+Eikn#TYKwN1Q4D`QNEgad)~|RG?xli&>&ihlJo*OC-K`U2@i!wk z+c24NI#U<&qtDS%W~X8bz}R%&{rx^}07B{s?=@J0W_h&DEdo$6DlW0H8!9wxj4}Ns z2G4EC81FgI;)#NzKm;0~{!4U#5!Oyfp68cJv{+WLlSuKZqF4<;v&uKMSyC5qs}N45 z#6dfTw+FJi)RGdO!niyg-Ztaun~L|8E{uDPmq;?sf(=RUEp-=uCH5Lc#pK>{e_;sk zD%v!Yt8So^xvbcp@>MXm)GyI~su?PH@KQOAC1npC+nQbVvLHw>p7ds!AR<#Gtwf!= z!qGC9>|J^WE9FNb)ZM=&3zs+q$i6jY97^3ml96wbvdi%_svsecY|T=bq0g~YChwVc zTgo1>r41|GtQfR$`r*S!#ldr;RI`d=0clCyGcPA4RMy_HZsff!84vsm*D2BWTri}V zXB%c(qapaKFoaA@i-2EI5&-1+^+%%R%wHPkhKh+keib~OlKcEVD|d?TmSyDMm?bJc zpXZYT0$XxeQTueCWhK?$DPn&0(s`FWn%QV_P(kK_RRYwE4Ncijeoz+rRjk#Gd@nG| ztw&QDxDkvQMaAAd$IRWdao?{!%~a5%t-#F zDJb=A-DJ8>VrD_n8LI)3s*DU%0MzD z-$U1VQf>9#K~^vs#b)6 z(hyj3RBl%m3xYSh!oV$~svqO9nA@RbeNGSs0;FY8v{NgSa{Spku#F?53kXALO>?7; zI~4?>JlBL65~}lVkb8zj#u#oU|A`GI`|sv$>Jg+1DCTi5HMpA8I4x=HWB+U>MsiUI z@gg{QvTV{nTVAaTnrU|44h*MkmE{$~7mHbno}gVAya{#S8mp{)bq^GIV=EZ4F z5!2V)C<0pdkCoCjVnMc4bP1P0=qCY1D(#X^gwT}w%dANV_-0T%fB&T%|8*$%!#I^X zg3VxKZIfI5!^tW`lEdm(g5Qbik-L%zpC+y`L1JByG%aB1XkyL0NTLR_8tjEl*6?`bNC{ z7b3H=?$X2{PfSZp6BM0aN$`T>AS9R~t#@DYG%~copWf|7mz@o#y7{$|GTWsgowdJ0Ud-y6GJ!2RBEgRfiBP)OVtWR2 zs^FL*WIjZQQn5yDLbhih=th!_VHKQEm1N5hM(#1;*uyo|dMNOrm5Yi+p zi;5SkID>Vw!pv(v)3b>3Ds6JPbek%=mu7&DZ=5PQZ3v)jmnD$A5aeEjmL4_n(y|<; zjN_~wr`b&ZC|ogIaGun0!4}f!@}C}RAa#g+_&`17!yI5q#RWVQkHfoUB|M)Yre2%i$|FCu6P8goI?wd>Gp)~l>_>U5iCbF%aFe|4&5_$; z)rW19qjAJ2(;(lqyGt6U8=?Rx_sayGr(@Oo^kpP4NJy=coT5OIErQm+neB5_+6set zTM@_o!G@E6iB&e%f$MtMszNBIQvDZAmb@XdbU4MZFUcRLaidOMG-)RWCFy3e$T9jZ z^P&<}nn#;pP>`~2Jn++KKWy|IF)8u{Kmq`VEl464+i_IR@anC^d4t-e{`8g< zR}!*e*zu^s26NURN_{@TCspG$3caZKV^#ce=8|JlDyK&GAPl{I{b9{Q(wd^k48Wwg zbRvee`j=IJL!>N#vsa4mzFppsmsQHoUE-ISf{=~Pe5}*Vimxg=!mqdFeOp-TXqxj# z+;`53d^WgLOO{%r?&&??j*dDRMa8M>0!uvteGux6W!RnXB6A3 z3WTiymXLqcv~%yKiFG5ev|yzx20;{pR;}u4O}*Q})=zmm%t$wC;xw$-M4}W-$-~wb z*ny#>k5{MZDKbLTj3CyUjhLaO!+|{`GIpt{KG4)VREP2LIs)ZS_O2b)T!eQ;XFsKXQzkO%p@@h2EO{39uSIwg z$GJ@?ENjAxl+R@K;zzOU@lRw*VkYZT53Z}MG#H$ z6OM+vvf57ZqpmL1KAebu4PMPVAHPS0W>h@gsY1#3Py+QPNK%)1XyLEnTr{mUA7K{+>T~b&`vHM?6VJsP@I<8o?q1X8AJcKf^aIc)_|~)B+D97 z&iMMQ@*lm|%cIud0vwfXW@%0Cwk^{zozXhX$aqLOxFS*>{g#sdnEUs><*`86qzgJE zNyT&RTUv3G1#_DZO$o^%lx`W{g?T^090#;u`%!V-Q}1IobI7y>KZzjO1>uTY?J7#w z?o_sB1rI!Aw#rpF%4m{Pjm-Uzd1dvN#SAS~2e?rpnvz{sZuAfL#a0<&Qe*Bc?KyHP z8?>h~P?8A>>RaEkDr(6cjJ-|NeRbJxcbUcSF099vWFm?cbY;0BvGHEFLaevR9j@EQ zVAK`#fEFv8=+kCC4cFz1n5fZ2^Xy>wh^og7Dp!eHheQ-YO9FtE^CGI{{cC&zg%F(l zoWVTwx~xS`AXKO!6*MPcyM*K_330bGL1b&zID8Rvv$%`Ax%O>@BWVk>In}dxvyDdl zVlif3Yip?%M#&qo=6?*dD!eNuMv8*-Q&q2&hi;Nh6Riw%MQY?H=XtbEU6*}%KC^(P zLD@k<=I>wSMpdnd$^0h}r6PgIyUtC=U4ri66OILIJ2%cdrw3$j86 z_M%|M1x7sIekp_!kDnN%a`+IudCch-m5nPTt_t-3Fw`Oy%^(>DMIhin+1hZMCJe*1 zz7j>lzD*wj+Tb0_>JXJ1*sK6jxlnPEI{rsdYh+Dbx~^;8a?y2|_mmHYP~$TWn7v}! z^LZ8_ENPeFi3y4XscDY{fa{@yO!|}_`Ap8u3qYP=zGTpuV%(N6QJWPYgjR8d_i}ib zII|H&Pt_2&Q-e37E}@B}%7{<$pTX#t!JayEG8F>qAhv&EYqu9r)1kS=P}om*wB!Wd zRYXoEtP!?^V2CCCtTE8;-m@PA5o7Y81V~b16v7UhSOv*RA@Y<|Mxh=V(uO7Ds*S96 zO(|zxAmo84XH50!Mvso+VS&($l<3!@g zX3=emsyC0ouiOng;yIO^6R^g^Px>&`4!dG?Kv3vXTu^8y1>uS5l~@fL;n)}RmrZp}%hg}6|S=67InpxW38RMb@6EVT@c#$9JGWauCa!f(PSTv|z8 z9F``YWLcGY9%$@Fp=)`I_eu+)Myhhf;4C8oK-_)Mv3Ush8HtXY@3801Hj7C@3iBc4 zO$gNijF}*B!!+*_$;lQ?UyeF%9PA{2s*kt!N;!2@8;XM5b`@-f3QSDUOU#N4U7A?ULS z9@cOb5)#Rryduv&@)sO}&{>UQxAs49Ky^Ogf|c>zD4?#UfXyqWVhmYNl#<{+zW349 z@dj&f;!`y)*DL7q%iOCK!scLcaR`v867dK{-t*0@j!}dyy(gl=uJZL7p6VxW>D zCh7!Hk1<7A(gdlbgWsO8y$x$E_P zE!&M$3A4XJ5aaB(5k>lDCQ3wW1n9H|@w7q+U1gM5cB_FXVT~H3_a}RQ`%?Q<`Z{^I zd7OEIdPMUPA6kb~ms2GxhA3i7o`D69S}hgFx5eKS{TtX47$^P28^;wh=;EqCUgz!0 zVLEA5VM&u>>`!(5T(vg;ZfRL(5|keNoS=CcywK*@y@HB@Q3So>ZrS)DiOcFqA8`ra z6C*-`JdYh?0}Zw?ea{Q)>PW6FKF<(HP&^Eue)F`AAtlIF*%zuaOs`}aESczRq)56Y#D1kevP?8x*rZ8| zOi-}YQH^xNasa`(f-%QXbT?a%RfDLLvmDq@@1^8p{Nza)yjKePO+-}i zDZJawoC*~Ug*Qmw1^SUH2t^9zw%S>u7bJ%#PDE+ZL`7zxSYOJGBd3ia69*x7lo2Tx z?20e3j$<}~U?6l-0@z-Y()pL&y&Stj9*F-Kc4j3wU?sQxf-hXDmKUuLg&!FXO@M~^f;1{jw&Qx<$&Km9BLF%Iv~hxxfQ8MRR&q{ z7!{@}|BQ(-MmN-Ws>nJCF-8atc)@U9;u{syL2gAj!tR*+g7hU@oeT27C3+Fdmhi54 zOrFev0<;OB>xxAYq$LS6ugBLRd)z8TVqh?JM9`B3s%Xy`B#=iqSdN5J)RToEuc8`e zL@hILS)p@-#oKr~YE6O!lPMNVaU)vs+lj##r*;<7-28CN0JG$hAmm{LJORqQJ<@N1 zO92*JrN-#J=QGCkVbTR-G{YCqQ$6`H?MJb_C45Qfk^p*ysVH#Ou-h6EX}*>K{ka7z)Zo40nUu1s%8coao`$dZV1uHJs46|V$+^&Po+(< z(fLGKI#0xS5v3En9V~BHi8(>&dX(XO4ONKv#S#S4Ko|~~xEFl5kAD|1Ns^NVz56dn zh<@C}sRdWW7Ay!x0R#1VkYscPnwi z+omUPL=+z=XDJ@sAV<4hG7%IbtOBVTU6KM;j^ns7xP@oa{BUuKveJEtK$rS>n=Z_A zphzUf4>@3V!!KnJ%yA|yE*Qq;_LAdz^Rb-+FzO`RMTT=9ebf--uY+f4*3>KtlWMSi z!elqK0+?Da) zKsV2Vm0)CNhDW&PX$6U60yFy%qhY91f>|sPHlBP8=3phI`hroaWV;Y{JN_@_iPlFL zqGdTd-l2JH8m~9}Ab3N5*pl-i90xRLevOW%Nf^S%FIAvp3Ep%;()B7u{?UTrs609Q zM3TfC?gi!9m~07RPie8QGd7d6$J5CfgA^>sA}yCT?P?pWad6u}lVXjqdHW8hi)px7 zy)IWHs^uQvX%rtOsT5DO|3oN8yzO;%1-EIsX)pt=#IA`EN5K0ADot!_4gW|n73nk$J8Y^u zN(4?j<{vP1N!1-7nh>uaC~Sz-0L8%BgUTil=zxaDrU2=Q9KLTuCA;hwp;ZsG2%8WO zoLgS5@^^y!pAwmpgc*K4SyIFMsy4{^1$(k6s?9xJan;DN+BdGf(4iO4WKr1kXsUys z=^C0f$N43(56(rcV9xE@ckX9dPl&L*{Cc^N;BE4lV6{qyu;~OFKJ!xCUu2{_5@Ed& z_F2ehapGE}ZSPwzip3F9mk_%J7Tbn>W>VQbA<5h#-P!pa#5%+zMI7%SNxt@?)M08) z6U*FWxVXCH)$g zj%xjD8%CQB_TeRQqaib%hH~}bI?|>GAfBycdO8a16gC<2@{Y4mBBI|F9-_=+K@X0B zKp2DtZdtaqD*SO?RP)*qt3rx%{#frEte3~#0l^AFmf-e-3iyR1NG$r)FlUK0KFT8S z;b^}hHb2UtP0rkinIElsuO3!^<-0Kb21B~g-WqKoKEc&(E?&_bUemi)2Bn0fByJPDlfABn9RgIby}8;b+IPswclOg~u0QS}7UkV; zd^gz&Eq-$`txXMi(4hRA3|k_($XYAMuVNfI%$`@^hL30Kp46a$ALsbP9milm-sZxZ zR~$_S_=-5P=q#^?x;RE?R@igni_p>hJm**=)ZsrvJ;KLC`BMYJvDwGZ%zMQ1-k z^xsCw)iy=>|Lj#phrW)p4boztDVPGNu8?zJ5HsHCd4dt6R8mS7Woa%H=AOP=RA%I- zB-uYLm5oqK6C1#!8$^63%;g=CXXLdmsW$aHu1-l}Yco4lWjWYF92g}H2S`?QLUDVV zP?aZf5o=Is@~}v@lp9Pyg|0IAVN1!~$j$4Qd&eo#@?D#(!Z?`+D4G_?Jckyp=#~;9 zZWgW1fQYTngPP0hw&cQ+o%I`>ph=>I-Z9vK#EEusOArPT-&O{ShO0z8@s2`0F=6_5 z`mzx3(r~gv5YTjX$Xu+sJq*@KhB*-F^SSlWFqp;zH1N0*<-F@)6auCIV`t5UBG^uy zG>(hFm@2!7IB^-Eq6X4NcmnYVS`dI=^vFK{pJod!rtCiu0SE{^us*GzM58o&1OPh$ zoMwr#4c?q-Dg)yN-{b%N&_pjfAt%nAwFkBasX+TS`jDB6&*EszeGsnw~)~#^JTKr<=JTRYC2L;d{08rp2Q+G=)~z(rED2u%nl>MDM9dvHGkqrT9XTMTI0p#vjphAUOD;E`YQ=s?NF0F}C!T z`O*_Jqvk{>W-N;7xo1FSAM{1I*xRRslLkoomGL!)JM7*!k4wl&{bWVG;Y-mEv}eRn zY2?{lG8ckpTu!gN8ouMk)$pBX0o1ZHt?QNmUw;B^;)Kf-HcOW?gV<#yu>bH<8 zwuz}Jcy$n9(~`Jb3!w-dNPM|kW5i4-hM|qSDeCWK1G%;$ZXiPUMsI;=~0pwD1l#O7dTd%X98~sC)))bl{rY`=3!g=PwB(i zy@kp>OEhgZXH#TKS%+lb3A1!XO)rUwdU0eOg(1Ukk3o({BX_jY8q`8%-${E=gtF74 z8&xCqkD*OylNi7)fdF3$Bo8{6#S7oW#hv=c0y+5}PxXB0g>ixn)-&~7yB;X^RRo}mT1Y134T z$hyt@-Ucey+Vs;;@lwX?48nv&5Uut8oQmk8N=ysMWcRcxq|;M&z1s=qxeH%b^d*X^ za8jjVgi0n&6|FPyOIjs4W3mza5c)23J>asm8{~H`Q~qDg$$sVT`q2}dM5Pb*E}Kjy z>nuqx*l2!g3Ki-=D`cl4yJlGx#TiQ7-Gz_y2TOXcfEs|t6VGzVfTxH08lx@8e%~b7 zSqEBOp`rE!3e91HOgb8J7j8i4=oLp>n8@i-p+<`IJLa#kP(-tv)06Ch;6`Z zlAwFKO~z^Mek#G`xb`Wv))`}*;s>iNK`~64YA<6)F1)+A*=v??9Q2lO0%#+ZkT{LDe4QM9vCUeg7HjWh7Zr6)bu}mQoaM=YYgC` z_adggcDoIk@TW0te2BOcm7TQnRkQtViNh{nw_t>tOoT9>NR0`Bq+cAJtD$iVhaAHw zOuxY`3ffx4H4LBW($yyrfp=x}g;5?FN7|sldMy}UK2}|Mf;KG*J0?N1_T)0|(81Tu zn;Mgm^siXAv2iNHaOVp_mR*>MZorQzD9$URCc4S|Y^gx@OJ2nPyE|Om#aU<8Biw@k z;3<+^i>!_A(W&(+ZfEg6&H7!TTy87lZI9jFtG8El@pjYMIH zt{g%kM5HK}0^w>s#7{m5k+eY(+JH5C#4WWI>7Pt(c zvO)wXjT1TYD^_W8l@nOXl|gEaZnymwzv+d7U$omL5a9z3aPq@(k*jX6ekP;_hLaRCwqR@qtuNOwlSgp zW+nq12_ZOPi>*NBsd(H6nKN)y*`HuXyUw{H=v0%UXPs<)xZJL>61_^HNmIF7gpYv)!V)GJcdL@g z{Zw3RVbVkowKKJrQ3=1wW9^A^oF-MLDng7RERi(UW_i>!Sda8&e` zgg19qO8Ka1(h4$=tRdaGg5$Et7~diW@Syl!x<_A)LSf3wLpVZG6&q@t^Ax}ohM^e_iaUSWA+Pz;4)ifT7hBa-Ut7tC`GgwKKV5ktSW}EU+osLb*kk;W= z8|uoH^*1Wqy9+<#Wmn|A7j{`vHsh^5H21*US_M(uES4Oiz-`2htQrU zqs$X8(>SK!;VkFX=r8sY-%;~};n8h}%2rJ%wgs7#J~Ess0*N?-S&0ev38k<^5P}Sl zDi=>hp)bZ$!V6KBdjWt808VOh&WR)`lC7nwS8EjTzJaq-=&+=Br0evb+@l;8BR#c( zAllt|hqpsARj3pQX9S~o6NLCyqD0PhciS>WU?LNhM;T|nP@9eA0E!s^*!Nf#3GrjQ zgKgG=UbNI%sg+2#r!iq1*eHKdi)OjySf4uOTY-d9iD(E=T?%3LB2uv>p3vr`cPT#L zMJ?7t7-@;LzmSDhCrR*M1SY-|!GrYRDWN)QMGJjm+uXm2LyWNhOQ@~DgZ9&Q`nW;_ z?HYm9U7fJ38+q{3E2k$6&*q}Erw1Kd`D|5Qm^tYzMiA%eFY&~H#saYHl^PO`KS=Y$ zue(Fqh)gA_uQMOvo0MOm*ARo`Dp&20%Y$QnzUmjwlZnjHbeYVgaGrSzw5vd%4w*N$ zfd=wOJB!j*xy5=-@Pxhy$1tcWm_iW6*KHB^X;4M+qS1m&%AV{wM7?U*VLX%JP1MTEw+jqFsM@a_wZ*QdJwBl;jwSkMpP$n^^S1oTW-T z4UQ5NTnI@o6s`@P@#sedP~Z~I8JD2y3;+087z$lZ5C{;H5q}Sc3@`~i1#to<<|c2N zuIXkyveIk~-f-@5P}ji&0?jAp;tN;Ha&2#lflG}o<-W^Jkjiy&3M5GoW~OLh1k6J z5M)H7Ng~f+bWG`k6W8|Up7=@GSz)WmAs(1=)rj@k7IR!tB?M%~=l2Sgi-tj@KX1Cb zFn8?*DV_=kgv}cST#RDSt3r}tnaStA9YQp37sBI};j9~5uEUZcr}S1vRoA5}?>^=d z`umyYQ_Pj-FvSHFZbt-G!C93_S`pfR@{a;5Np4XY-V|hvrdgVB20P3C{%TRK%G62~ z1C2f~q$JrwX4Oa&b=h2)qqcVUVGBIFJ(>@me`TCvsu1qRoPr4X7GIUra55or5fPme zqLXAGgzUX;K6RxH=hWSaBoeSkbIdSM_M9@h}gn+{e&c4;-jr z#|+nm{jj~IDA2yWlgwyZl~hEs71EhkTV?>~g9lt>bru%F|5q^HS(58b*DhlCO^_kF zQwUK4wJhHLxdM2+2KrM~m^!C1sHeQjswwrkJc8>{cg8HfzAD4731bW0YWd6*O%09q zZ_o8?e0(6{gmo;_F0Zr}3TM4-B(#(BR?ERq407Ca1WRn+dX_Sf`j^8!1T~$CwBoE< zl5{GBj`x^KI}Tob@3?}P^xAlr%8=$?v~ZWI9hQ2|eUQhrIM7w&sXZAlQcm}3>a_MV(zvgt%%7Zi91fon zyU?%FBG`afk^fgYz-3i&!yeHwQma>Hn)bsan)E68r7Cdocx;Ig5?X>GBXYS0g$hCO z14$*Pcq#3vQeL8sQhz^U;-mqSF(Q68W9HwW(|k)#r*Gz_+TMZ9n7c6=Cvo7hfo~vW zO^!$5Q#kASf}ApC|6t&<1-lS^GDVP3suRhF9V?9OB&FhyIb$2KNV5I3YYc{6@y(XG?kBVjiN)X}AgY^*1S4ruZtctHu`(;Cq@D^Jlz z)*WPl4F9-FX^%Nc`dr>DSpYqwKYde?mG$HAs zh*ZmGZuw19=)0B_;EWl!BD20`ikg(WQ1g88YMj_qIU3-Q@gW3kdenaRU+n>7%7GYl zV@-?81*s6@@o-@ZvY}o#8D-xgX>&TM;f$uBvNlPCWg_`IJNtCAkg{G85m{x>J=N~X zzr!RQr-+4faW}3)rxZV;@Ga>h93fYnoH*A0U04~$Qn|c z2FBBj)^89&wPeZdDr7LervZv3%P^7&fj}z=^`aNKF$JUWL^p}0%=i=M`}Cup%a)U`WB`8( zu`Xo?dF;RuiPDC;W1hkYvT2T2OAuxpV&Ray8^XgnotA!ic?jypUhFO8K7_YsPY}Cb zNTseM&LdHaRznUsCtt>Hsw5&IZYLUyQmz-74%sXoLjl?;hB?A+Ias^1md+gPI$hvJ zvh6^dB@hcs1(k4C?`f?FxTTnpV?uTj#x{5CNKbJ%!~7n23&5hi=EMaAPuqGr@vzcW zx3I!EL0=LQRm~%CLAb5R$e9TKfX^p-9z(js|T!8O$Gu*=!@1)&hTdK-{crJq&;ZKtR%fM+-^v zRLGRHn7P;SiMh`DzMBws=&qC!{%vC%7CkWoBcm|9GVbSbY$JmUhy$Ld&O zB%7YDMjo6f`D@+~xIafwOC*A2>VSJ9iCdVfTpFu667WQWEPxYBF|tmS-!r*U5;u?P zO!ohXEw3kh#!ufuA(Zorrd=1{XNA%C)7kk znD@%JJ>rQ=a2d}E6fcFi;x>$~;#=;#B?1fgjnC_u{ z$Ab=Q*82t;c#Ts@bAce?llTVGP(p=aAby2;^l`2Z{~__g2}eaTo!r$bDE>9dXHlTL zQ6e9z>y?t{oe{ci8&k{F?)C7+2}B|(I&nNuI3`?{gN7F$+vxDNR6I%z6wKDe7L19{ z%%QSm2~oQLNRm|6-k$574-SC`tokgXK$d#A4g}|rxPEkFc2CHwoSx3d^`@l~sB6k5@>D(ZSbqjzHO*WHo>alpIqJQTt_jLcjVcP6)sd zao;A_?Jl97J46RL19H74rrvX08c1dQkimVlZjp7@yi6EVTijG_o#v8e`(f#&Qm zWJ>0?5IifoOl}R#0G&gGk-|z2We>i9_0(5lm-=I$xI)Wg3o|y)5k-Wc5-~n$f)ik4UbW%-j^TXJ2X*)#Yw= ztYyh)QizeT79t3OFR2|Gh=Fqn)vqhxLzF^TO*K`C5mqM#Seh9)>N-qd>3-#_UU`M$ zD#SLAehOWL7Q`)qY(kDYqoY@aPOJq{WX=2~ua1t3+_fl0$g>+GOe+`<>^qwW&k~}X zo}u#`qZDQfHA!Bl3{q%tG#Q_-o|`3c*P`o_Qapmmc2gb8e9)aMlLZtYW~3JJS!*N+ zu{N5%m>7CEA^1g`)>9w_kbWGXfEFn)THmmWLq?hz7L9pQtiX>c+1{eG5Gu2ccI&@< zJ!?n7R@Qku0O}Jccgqi2pR@{Q1;GSNZbzim$`CHeGR9GGwVq*#m#Vcl^8G83DRIPQ zA4V5dPnaaRSdtZNdlGqSDhU6PWLFHh&KvG$ntTb6skyZT{xc3{js4FO>~9L1J?33m zxDg=Vbosz7xkKNO=mH1$g&o1RS3F3k9aXo?X18@ju!!VXNh9Ep zhZ>Qj2(#GV$f1p2cN7xtXgVi_@Lh`|zHpKP{5W#POe&OF&qSW{0btyvNHXz#nxhd0 zDkT6T;rW8af&*0MDp?R6c&xy+0Gb063q;w4$VWuDsKly#x)^6iBoO(x&(o^~)d5Il zAiK;EIO=ca(-5r^Gnjx_1mZAvTW*x57sZ98UyH4vV1=Ke-SH25}=wR)<&Gx}C!hYv2TYpu@&Rs1}IcL?qb zQvH$=5gvA$m0qq&H$eqwB^a`Y*8r+w*F%H~H@U2IH;c?%ctU{m(}A^^c^o_4@g^EN zTz}N&(HW*@H4Iz`;V0evCL7;JZ8r{s43a~f3|V^QMg*?TM0`6P>%0S@1Oaz| z1Jf~p0F8v?8#sx=h6^~Dg|q@Q4NiY662Ld`QZ0$IA8_oC{Z%8U8uvxok?KfjG)7sa zgh2=w=@?4*m7ql+!=<4FfT|=RAFkm4M%-hK|&(;h}Tw zj0JTwW%Igy!xeQ8SXxsusxr>zf}5P&4e0HyWOKO^CacbAlU0`=Ke=z1+G!DZfno)A zta@bX?&RLCREEnmq~z2?p~bs*4}HFZ29G8z{=-YQwAg7n(T-DX1pd`8o58!{Mpyk~ zB0uniEYKjSJ8as4yX;gd7qA>h-Rpo$dosxBc@ z$tji*JKokyLYTTYgRc(_qJZK~*Pj#^<;`jp(W!m)3c7?53?*CmJVSL_aeLxpM_A5z zH4HDr*(3otI7=<2FGrXnX?T-@7QiKIn+9}BrXP>|4{2$ITiVSuEy9i`=h50GL!kT) zmGer%P}$eweo`|d=1d;LC|xPy6fl+raAbtJ{N0kY05j+zn!V?V_yrgfLw#->Q`%|3 zBm?Z20{#wagMSQ=VJoDRH|~hm+6=&k2_Yr~+Ii2u7gHp?9YE`M14!z7kOswozMN9_ z(&i9Hkx*ELaDf8U8Nr12AK!@HiM)oT3V*4Gs3Cy@6$3%IL|Zf{Di9Eqt~M@>ZO!+* zf@jjlk=OGKOo}p;r*V6p$5>k=fE zfT|ECaB4a?Tjn92cGoC5MZBiJhZI!UwsyFylXNm ziMc7{j!7G_nQ@a7u-l$J&UMEr<_zwI{_Y`R9one*rcN$MI?VF7KkCMgZG{CF8FYo6QG56*2gZgsTU)dKSQD$-}|F?wbH?NX5Eq@|SE(@RUV z^+B1TQ#S6H@Xe|*d3rMlcLZooiG!?*V^Ucqjut>T2*-^!7^aB-7VOC$!IQ3bRYWfz z>-siQNqmX?IEv%^RWgYJSGMKD6)IIuouJVrs7zr07O!?Vd&UIzrDS@1%qhYcWDmir z9D?8y;k^Dm71e4Ui6n&qeig%|#1fC;C@4fh#*^)xrqUa+toip|XZx(iA7ZTCMb&r# zeNU##B7wM`;0nv9HC!TBm25-ZGVdRCw+NC<*AJ7J5yJ@RA7p_TucKC{Z#!2jQnKJz zlmj%B7sUFSOcLj?pjaaa%LzlfCN-JR9!1V@q2l9i}B=DtY0`&Zn}tz zGUbJQkB?Zom|pyoE&8oM@r0vwFy>uWuX4xYNmA|#(5WYMTP=6_@V`jv2_<9gQ}ioq zZ%vWo`ExupMn`{}+3_%i{yP=uLD-FDcACqgC|M&ar2I(Qm~6U;q32_2p^#Ra33SaG zAp!-)DbG?J)@M8u97pQl(>MrXN#*Rfx*ojq>UJ$2A zvSH!ReV@mJKnkC{(Ai}hub1{;Tge(ku%BS*gt1U}nT0`snbYvtFD)J~b07;rconK6 zT&m6yh{p4m7rnP>TI(sw@mgu!;IsCoujLbIotf$B4d*qalhRACv2RJwlb&VGA!6*pb!e#Fx% zp|;M99AJ#54tmQ&wJrq!S}>s2=dejepo)KuLuW*#u|} z{)nx7a=^llsq{S~4?YY&_$q}lT_Z0NX;;Y}LDGu?WwS~d&8rB5EEbhW#q_~OaT1x$ zvzWOaNyu8z8}6BkZN+p1jI`zd;7kUi%)6)g(NEYp37V!vY;=Z-U7Rc8ie16Q45=Sr z`vzdjWD_-~y*@O?=@P#YS7%UUYO*(h*htm1TH0MSo}}!^uW0*AH{}?R|Boq!Liksh z0`tpFBCM&?N6Oj{Eab;adX7g#ZK;7Jh*^Uw;X@V{R3dB4PJzrm&!Q6|@xiIRAZxVW zZ3*izDr-WEqYE%#2yzkZVdo)|n#4=^azu%1ZZ)w`K@_)S2f4q=53uq-G+ z2Qnr&60(gReBB|%5?0(exzEPyAoegRl||D?i=-C+EYBfIEy)AYP0l(bY|to#<0e=`S)V z!~-qjgKj8rO4O#Kcl#xUQoF=m+j=OImN>bUt_-Q05|cj}qGgf?38?X7XxQa|vpo`- zb{_MBo}ULQ$3b4(MG?Yfso5b9C*wBx(AM6Aj%m&tqYSpR#d-QN4^4eX+L29goK0{# z6Bf3vF)AU)HRnX%-Fw9IP2y(Y$kgD0T1O zyGW**$eJlk)#La)#Rm!uS28q5D7SsM5X=G$pFLPh5)g>P=3VEo=MPd@%#Z){+o?X28HK!^@+$wv(%u;_&R?4op9O)ZWxO0i}$p9Rx&L z31eIqpUTCjq`a@GuB#H_iD`LH*ml*?mVK9EY?Wy=pQzH(@u0a>dSjjD$$Q^TL!Fdg z6eW>`k_wN<@izX$ z>C~&G8X_c+QJ3iV3Ph64>3^kQmlQ!lGQrw%qsjj@CzG5sT+Pg$Df(0MVAN7(k^fp8 zgSIx}{xqYOENpxu)I^oa`UtKa16@>=%suf=HKKQUwO1`n!eILtfiO9YLRn9ISN(v1 z4{-MatSZjc>BlJP8k@b4sMW+e%%Hig8xC_`AKqq8qABdFre@E%{}7&?u}r{2E0GFP z7iIIt+ynv$lqa8sQ5Zi<(k#b$D7_@t>WKc9hbVLcbPymygh25`H)I63s6F4w4?xu) z1a1aTT{YKpW$&c_))nV&$q7$lRm=u6w7wz96iv#xNhA!K_YHsq*+#BK@PhzivN)C?EqY))XRfpowi)|6EH@AVs)1L1+=9r4&&9 zCQb7@FIyA)OWSe^KuGx;EUdZ<=l|NuZnZ-~Tvz9N9>vD{b7``n$W2zcRwBa_g{5~} z?IK$7EX`3Oo>!%06?=O6Y(S+3;9i8dE==;x^C7Exf~WdY8f?mY0BLq_xXZmJMZJlm zq}{tQ|1$zd_I~)Tve-$Wx%^&sr5DoUNxCNA{_kx57bSE;7>CJ({Z_1u`VGKJ4=|So zSU7@&Ym0b_pAkbfq_nuh@!l&$XZlG^DLWJWB*;`~$Tl^0_2JL>M$VCH+ z(6&Fd|L0bxLFcwhqI^M_hsk_m5dFy$A@(ldv;+Wq1I!fzIm&^~rm8!p|JLUEev2b* z?yD{y9Ru^eYilA@@2#n!``m~kWj)KFZN2-t?cHuL9}9Ygr)n;x8IUat!<0}0C@aO9 zy-{`fu(kkJhd3$#mIQFNYs$&Pc4w&`R;5(x?B)w!{bOO;aysO+W+d0N=TwZM`8%!B zQwIGq#q;4IO8m2`)e!{PP8PRqH?Y-O=1@@%Fy|OfCPRp;1~4T9TpYrzD+fzwN#x*j zUD|Drdd4Twh+9Uexh4N%p{cf#YF%Ge?i(Ic9Hp^5gtMs{AGn=6sM=p$o$Rrd2v+*h zx@L}%vLl57fRAUpxu!5>fszKO39vRok-F%S{hfBTf22ism0CMyrIvC-byHCsYP#N$ zH6;ZTG))41oC*TaxycksUkuyDURBLhVJ$45!w*xDu9Og4TE| z5Y!tUqzGfUIs=?0L#%>9B&zL&yD_RBRKgYp8?=p_Q703X<)K~K(1M&6WdD&;Ye`L& zB0z#l>sX)v8r#W zCAlO{BD~~S5Jg%AIBR4{cW6}u$R$H8EQagU-{n~K7X^jOHP51DM(5o|3}w#Q_el4x zTCQ}_(#C7oxQzY2U>_n`eq6n87>=D0#}iZDrKdVfM;?3Yoz!5A(=3ovA(di4K>|1% zpriskEXAox!Qt035F_r6ztgH(E^AUU@t%{K&At{6Qh0BFKv3R(Z=FXHfhFO z7X+6+kL&bp=>sdG>gATwe%g{fYM4n0a}-4tk1~ODSKUz~DyKckSzGlb5##5#Pa*Ot zLYRLOi4p?Z#EQUYgZv7hEJ5%L0dkvcbt+9~%TLN84pMATIodZg+J%fpOZhED+Eg8t zGV8yo5K|NApBv@2OCt?}(KO$^;=&{6-S>=U2%%u|Ac;}|zTITxD1qPzP$)pt0jLHT z7eS<;+*cb6de1FbBn-vV;UCX<+*GcO#Z*oRfcRGwmeXP-MEkIU64@P1UDQ)_ZS{WF zXHVh9q?@tt?2XzWLr6sz3IfCW%-?eRLrRwlA#i^pUQ?eMk2`N8f5*>5qV9lFD#i2Y3 z*@`fLmHyqc=2HXq6VQM?FAk8hq9STEY;|JdZEGNsbH%)9AOLbjJh?r}sAPZ$ARI!i zs@jys0NsKnw7ruNdD*d4atk3o<3^pyxxKb^y$*Sk6ftS476iNLR_Uo`RV{DCX7_r~ z?$#FU^qlj4a863X!|{)hO$ET1bud`Um z@!!^xF)<4WPD<|oPdBRYZjVFd7~w%8wK9I~mQot6n6h$5M16NIBQ`MVnQN6F=FF`g102YA71d$fFTcD`s za@AV0!)afC^crHbzb$T!6|$MK?p{oZUr^B0o8Z_W(`y1^toq(JXW~xID8P%@kBDxK zJ%yr$C{u@kp+BEy0Z^_c$Wlm*6lS337XsY37h^TVl6F3s4OJ5lro8e}G)2>PM10hU z83}sdnuMZ3F0ssADJA={a)3W)WPQR;q_S;J4?_Z(TCtWQ$U8x3d7H=_epJ2?0elJY zXae9^u1JEkL7s-drgDvwy@C7N)Va1Eod~;jt33YtVu!RU{X3Y3WDz{QW{0dmYLVQ% zD2I@d3qN;x;+S775SHm4FNWx@IGCd}Ml!>AI)boQ7{}n1ZgfR(OdW?ABu6H7Bv+$R zg*Iv*rCgm7ljEIvalW3sdZP@_;b4S0SSQ+w+fL@6@!1IN+c$r*N?x>r)-}-UIohWFl@!vc26ExEVM}D zW-N6zuX`;dQk6yH;#MZ7)JEnC=T}EkPw8j4mt&NMfm1U^OgW*SG(oeM%Qc}+-Sdh< za+nX-{3{`2DGI*q3c3%)lruW7_XIS_el|41xbxw%h5@G6Q70Ywm=b%0O==dR^;_{> z3T0C3&((tj#y22^hB(KPqCM5r%!I7=PhYNTLcLwIIi1uUwEs!d3Xq)Usm$9#HRm~V zOJXFu&&A^S1sPo5(QuJH#NVJ#%st%j6cD~Cix>{2R;hST#aP#9nY_fCoJd7C8u_dz z3UaH`;eXjWSL{t%QB-Q(&Q%A?vg7(g@6J;~M<$8=*=})_Zmf{WWJ#VyCUU~D-#)IN z)ujKKAk2Rqw<56_F`7AF2kyEFWkl<+nBtF)Fg=&HDn@LCxS?Z8vP!e)$`%??X4bKO zK}(4bb^Ni>TStCY$F4Th_ioObswDX{T?OU+Z=qk*W8NjZbbgS$odFH2)02=6=C|1n z^Ato*xmCF-E48ogCD>}C5N7pN-ZC3APK(5s4<)KQI6ZjgYICyz}Z zS4SJ^F_ksw<;$xGsc-%*d~a^7Nyj+vf08#SoyYXt-^n0|gr#eHq1w6|#|+5PE`au; zNM$hk?%|+ENLxH)Lw-=rJhx`Ho%WiGga3Wx`Fl0TJf{h;i$cKAcI-7PmMPSVomj>% zASD4Ae2nZsXTB^mIiu&f@uy60CDY-2oApby4XFPGBtzUnzdsQ_iY@D;UOy^H!gLft z-+GRGap6*gQV=NXMDEG+HJ;nceCKogyH120`w1~|36&eaD>T02Xr;ifEDPkF#hPzy zbhCpt3m}FZXpTkx^I>NI7jPt?gA2g8Lz@ijBC(mLHNzY>fg}hp!<=@wQ>yPjj@yM1 zIHohp3%nQTF_PP!p1~tADoJjTI-7T;64Oz;cij6@C0cWOgj*Jcrd4F7gXIZfI(-Az~{ffP8;T)09RTKF&Ae?^RM5%~v2hv-`ZV} zBJ}P=CBD5^@AIH|)nrR6WM0u-8leQ)^QRnfu?(ndLTV=nw{yzl^hA9Hj8Y3(d_`CtO&MIhQefS>$jcYf()o9s zX%PLn+I~Lb^0zGYu7mt}2LMK&m-VrDl=gQa>Io9ys$t&IhG0`HO**lae}(f35Ty!; zi5uf+l`^VR>Q~IU6)5ak0BcjF-M~;&6qgEU_$(b7-2IEAB(vEOi;2%^=FGtrB7V+e zxIP4~&@TG{H2#iPt^LZXW}2+Do5ZWycR6OiI&Z(xH$~7jk4uo4t=Xri#Sn3ldYj{a9XZ(3l1V`Py*y}w>?nl^iASm=v`%zkZs#DI zSkA-wIA%1hFRD}W;UKyi+~MbEgf^jPJF1_}=VS}k$-U;NR=|kncmn=_a1>@%BXb%# z6~t!uK3Lx)lu$$SxTC&ot3mQe0HUx^kC??;f=UmCwBIc>;LH7O&nobfw{mf?6)Wf|d z4=Vhs^wlDZRo=sP>1@s2m240&_JWp1>O!>JHUvpnHB0lf!ey2RkxWEI4KvgO93hQ} z)rEXsL|w^U5CP}|s1!k%d7!h)oI8cQdx8)#z{w4PmSm}xcPwB=j*zr7lX@dDZBorS zdv0OIgv*zgM6$3r>MbIv118LKfM$~>$t;Pwm+J)Qx}vrz{S1f-FhzoZ7(tSb5?}rn zS!73$V_;4cObp211sD@x=ooGT$iq4lswMd5e)6&8O_@%AaboNmKxl=jRzXP_(Z=BokcJF#IC-VgGS89Z zH%DNgVAL}%f5>@ZE9Pz0S<0&(%KzQcj&ejKSK2Zb^^29SNRC)JGsqoo!{zo36d|hkBjmNeDmvPoVbF2vfGX$~A0T%(^9P^`0o+ed?WT}jpNldOcYW}G` zLWp=e4OtUsfgl1{Is_558PWR>Sk99=5x5ganiB1aShk;dv5F)}hoy6pMno{x2ryiN zTp%1*RGFsi@vvo+hO%Z?N4#E1E_g5MBA}3;MH|feyLWUS!GziF`xbmL>gca-CdOzTThMiYMhw0u! z5%D*3PCGiQG!7yi=_sV`uxgLc-X4crbe@?~gCkMmGn(Wc7GjH*=Ir$)s8vpoN7z3$qOD4%-g{<|>Dp3cf0?0olFC;)=d=g!)5Z_JU)IXWHhKhJ%ZaW$2rt zSW!e9W*8xpPuJBt`S|A!LId{1-8Ey>EI~+s3DP_!U^YG#gfxEY`G`Q8#**C3FsH1r z#Psxtki=2N8be4CN5I`TbbK4tsVi^$_WS&vsYRI-M5X;eQ35pZAP=yJAcw8UlaE!D zWM+3!Dp-VgCPuPpDd;BFh=#7(U?4g9k8CGPdT6trQ65dQ+*}u`;QDjLhO8lTj{1r> z*I`!a@g`;%5mUpAaENS|B7k>zZ3ZzWi=8{kOE8KN&sWQihzM!3MUz$Jnt zHy19`K}hTt#4b%^pL?OA+8ux`O;$6ksOPbw80CvEB1yJcZxsb@dwnZyohR!fs4EDPtC&-g#^t5-m#Zfq)piZG;H;$oOEHauY8O3%f z9-HZV4VyvAp+*akyqvYDCB$awkQfl)(tj0Ak!mxXrhu5$bR$#55(rCYmJQdYJlzV> zCKs)ix%9>q=NAJr_VgUfoGr&pJZvW7{_S5gcD(j@@)oy z!2+X68B$Fm1nE4IB_u?e!qMCv&L+6SyCvNuu5P0tP%Ni&a*1!PTxWqauwJ_ z>0j7bynTH^Jkc)*0A47VXWrX(YE!7@NGQ$Xs4oGbdKO1x5eKyjP8$UR+F^BC^SQPhPg*m78e zlO!nng=uxdFvDSTmkCjmOM?id+@Vbgb`TH6FGLmRZ8PvgkQY73V9cp(~%m`xz zMI31V<2*MCk~E(Zv{0;u1=pe-8l}~ofGZWtp?VN*zIn5UU`+y__KXctFc*7@VXj0g zZw0dygfy8_ln8U>gkdhG$u#J*d+OH!p&wc=GH)WtIX(CLaS zGc5u*Hd48q+C*DaBoH7fMZjr@4S_O1ILZf?E&)1Rp&TV87928* z>fq@5suCQ)n!;)_a9K*I+)kXG~5+#801aMlpz zuZF3VJ1vS+59DDudCl}Sz%@i67W>5G3Wb?`*`XE*a6v4P0lB|_K$AG0b&9P#99*Bo>8X$msc&_JYT-ZPP@0jK0Xr*5W#R0Xhp{h1ssc}~QFGTARmPgi96xmm! z{I%7J498a7@=nTAg#xGod&$|;`csh5QRd=rS+K7Nmkuj!ajX zYtoI*_zTKGNvU~@YD%q4%XU-5X3uILOqipL`lx!0Yz|U*&@xJ~Xan}+6yW0}~YscwLn;TXO@W9RYEdTh@% zMyoByT1+1WQ15_KISOFgf)A!w@_KOU=91lla_nG=d#YzFdwZOf1kYRH?A7C~yVj zOOJe~3O25y2Yq-aWMS9>ie$Dggx{%GyO@t>EDcb_I9N?&M_7x0BE>RbEn8r-CGtfm z!DOovb@H-Ffy*MO(bdKvkJPB64RtABEEB|;njOKG6EcEEq+B2!vP6+_CB_d16KL@# zTS~jIH7W5#iT-IRhWA0T%DW1VQ%=+pb~dy?wr~_@ZvfUGqI?_QRX`iHe zD8>sRpJWjLez}Bch7p)agvgf81=NyE8y{lnV#Pm-)nK}3A?5Lrq;G2B0wC0f zC>#&TYP*Xb@i^{`Y78`5f@m=W`jDy?Rz&%N4pTL`Vv`@XM6Z$bcxey&@%6uO!4V8y zfAE7n$4D&!C^1j)juja^e9}%`fRTOyd z(Y#U3X5E5FDb@HB?KHnNU2Pm~h{I*#s9r9-;x@^xT2ReAFqjc@Np$gqHm^qPssH4I z^__7kDVr{%Xg`9Uim&1prVv5^soc=z*45=uQnlJO(b5v^CjKcJ?tfki!sXe9w9D>q zUwQiaio#!mu4|_a%HFV>mIuM1PWtRGmeZPHvU9}I`zz#WCAJ}AS1B5lG>#Cd!>h)+ zEcD_>GeW2}8d(_8L*mfybB^J3FH4d_LLzINJx!*ni*tbL%Hu3$2KJYU>xZAkUvBUQ z*5eUEB$6VG#h>EZl-2F-w?wIZ}@Z!j4yUi8InG!dLxrX@9P1)!pJ zSt*2bqIlGg8$e#09YfNdd?nS92|j9mY7dU6m!H;mIq-kXq7Y&C(|f`ccw5&6yS-k9 z;WzQF8+uZJt-9=0niQ~iIM$dOl`4vBx~!!6K1@7`t-f66lCSnULEWoyqS$3bdRm$n z7NwpqHA@>Xz&$>XvV$7VX%)R0@mkV;eLO)BqW1qI`%5y@0l=kFiI9zLuRORX^4iW$ zm8mCD(!J)Xa7daaB2{?|i?FOya1B|ZFty0X_LUeUyvxFsPl}a`+OzaRHwalRNy$#f z3hxV(XX2@piBlC}{m0WQ;3t1&03S#+islQDx6C?&e*8LRS5XL>WiM3=8$x^P#@ zO8ZX1#<>qYzPbD%3R~fBMDyyy2&cCz+UDWl;o{`5*O&q(mS$Bw*P2buCd3-WZC6<< zG~1O~MWAmd*-qNpumuG|FU+6XR^eZj-E-PfR+w+j(!M)*j_x6X!@mn-n!k|DG`*W9 zdV@BC^uo}{@)4)~W>4fbs$$XiRs~@YhB_&Pa!|Hpk}FD3q$QMiOH8fr7E3hGN>->< z+(xWJT-)Sjk9U+^E&f(+Ep0Xln`KB+Sn>;)kl2Qvt&BZhHSLT-b`@H!HaMX+<^YQ> zNI`e;TDef3^*hqWH`!>z@+sea*|@vP)U$EJmG%^ubWn5Z0~>_6m=v*rNttQdvEL9-gn(VEG{;4-wTHlIW$OK0<`c|s+LTd~f> zcJYid$7ZStn;QDuD>rM32MBBHOLjDnT8=Im42MO^XvqD0xj)m4Mq}MgZ4LR#%B&Mg z+O)wt9u*~qSNPOb6}VKaeAx#UX|7uuQ=Ki%}zCJ~=HbFl?$>{ zX!t9YH9U3{jWyCqi>^rKOa*DAlw`7+`Q+52G|wuKOmBQ5Zy(&7P>q668F1`G^dkZ)0jtHB!jlFi$-z7AOs+ZEfYGbnTfSr)JdcKrCtdF zvsIU)f^kQn@^s3?*(gj%iuS<9vTpQI*Pu*nQX;T~7Fq?_c8wt~+)WYQ(%X#PCxn2J zWSx(bRh6a>;J-e|)ZRg|fo?Rtit`m}O9*$jVejn_YFrjkjA#^=ahqUJwf^@pU7<=m zK2`jPvke1|m;9du4y=!nRu$&51!ihh zBASs68c;MZQbZ|`nt6KUT2WDGe?(MVE@!Eiv4h8tb( zk|>AXXVZZpEBOJ&b<1rGY#}=sL zSc-ykV=b7z;rXrmnwX#~^c7`j4Zp_ zE)6qm!Aq*2AcBw#9??z0tr(=(rISv^9D}c8NVrIk^DX{#EvsC{1A%MqE+Z@-VlHh! zFEltFNf&@XgGfMK>FAGx#)jT-F2u_CY5N8NyBu!0pgY1t9}Rv@9)-!OXtHG|WJACc zXbaBkBGltgf?{ONFNH>s#wn|KtzUEI3dheNS74p6hmM^0jA)|pCpAHD{r(F16`C1uXu@~5tx8=vTF*_ zpoXF+y3Hd$_!G;SFT+T!Y>*7Hj4ON4|HUUoYCpW(RF+3Thfa`FlnJoIN$)jW%mHuS z)b(!}CJHvd5KLQe)V{gIlnZ1(O9j8cVNt=KT_iWIkY;hw;tHit>WOaU8a!!y0`4=jKFShFHYVyt$^y>74!{(13uRgSNQ%^E0zo-47e>Quq(Pbtp%z3Y>z|j8 ztrTcIgQThk(Q@iLMZ;kER3`!~BjlNAgVPVOe^L;{X$&kU&eXB2mE{T?0gKjY5FLZ; zQ7mP7MBLu6wn9I{Ac(NNmmFU7MLJ&ansy~s2-OtYgcs5IG~J)Tg$QQe3AQh0A1?*s z_wmE^lHiI8;Mau|&$>{h3j0`|u=I-_q{0vNzzA|R<$#{e2_Z!!+qDR5B#p^hoRBQ9 zuwa;ud*QAB`~0we95;3gb6lx}b+ejDc3*Zxj2JbQq9>Five_jFGylduU~V74RQPJN z*n|kNOua82O^rdH^lqFq^$O3k_?#j&gm|zR1PoXvde{{~ z0i{-5;jzLf{6LC*VN68wP%_=2E`h_`7#ypg95F0XkOH}OOp^#|P2hW)W?XSVXC?#u z7r`?8&Ia818ToQY4uZ*G=OTfCShs~gkD}StXt+h(#S_8U!$0?hLavbXQI;gzMcDf@ z45pk^kg(m09E`w|7=)7~O96K4aEVgz4rbVaET1}!!}U5qXKpA*;3bhs6p$|$pcW%i!)>sVBiyLMd-pac!i6X?f1whcbpi#3jUd#7BOyBNXEdhiom} zO-3DB3`HNoN)=3poh&$45IQT6$8E&4gU~B*i$Jdw2I;35igzm1z{2E)_ErUvzYZx5 zQUIz-y0X$S=+F|$LUhwy38GD;yf4a>3XK)Ssznq$p&)?WGK`F7KG;ud-=@QqRH?&Y zHWK5Eh!U{nAWq|)nOJn8BDU802SdW$pp z=t-M5s<9|zw~yxIzLgju6KQ_Ko(Up>C@bZeX`rCiO#HXV;DSDmg&*Fp{4uJiH>>s$ z271r!WYTPE1+52PfSjijy%T0mDM{IS!(3Oa-TmvWqKU{pNz&wH7|t>#ikRIZLJIzu zb9Y>=Z=fKYcGJ)|yFQAZD+X^Rgs?%bc{>XGw?7Tc4-#gp^hA|(XB3!Gw{mxoxcV6Z z0;O`8LaV37ysz`r5H^y7z2^uY9fer25| z&)t7F^zlLESSWOi%#&S~fvz#0op=kjSnn?eFiaQFFWITY6XR)^w=&756ga+~U2;5e z7PRh6fxIa%GA^4rP=y2InCfWg#_?3MkQ;hF7ny<@lYRY~ElQH&yihN{%#n~p^YCSg z(p`T1UI{DOH_`;$MVucpWJ?fq32#ki! z&T}$42R-u%&ZA^swYlOh{E>v-+DOtc1g0E#ts)#vvJ(+2D2Ra;3o*Eih53DvX$7Fp zavaJl&$5^Miwi;3l6*?uv{+{a)?$ew)D{e5q|L`uSfSasQZSnqgk8adKtwv9(l%gk&lln+cFI)TE(A++mCNN8P`L>| zt06|JS}1iG@QSgv`@fB95Z-Jb4IV`*nCuhFO=H)^NSJQ=dQFw8j?y@F5Fs9>N#E@! z^YkI5r>Q!y$;ILqrkQ`{h6OSuE5o8zWhRYJBXs$;{8GM4r;Tok@sx}l&sU7KBbZZE z6oniWVYfl2@yX)buo>r?e1+i}~3e;~&SXBC|BDf4Wt+yx@y z9XsB^GXzmQrK9CQdue9(Mz5|Aj7A%sQAnkOW0>W{$YnaRgyhowteM8W;+a= zNClxO7}%^OFVyYzW-d<57p;Psnec2i9(XyO0Ejn|G=>$eY2nDXw*E$l1+xdj=x_SR zn7~ z9u!;B6nRS;=K>a#L9WE-qD-iTNy@nVN{3_ed8yysc+xb*6yvhuV+CYIsAp~=qYx+_ z;$!B8*6F1|oc4xB!ovt<*&@~@64AA}`eW9c(g)4jn8QrPYZA_sUOR@h9={=aC!T~6 ze7dvaHvTRRhvEr-K)|78WswBkr%bYI8IW6;Y7PCE+)L7%0@&4XS?@EFO6GTqMSwyt z=xDl#8093z&WiSd082Go;O}h_Ps--{>5>n)Q?cSlW z_Jpk#3oDWrMoGF{XG)-#hJ6UaMUpsKrCBzxx$CB}L&CMml`GHv(bPb7LaY9pFuaB( z1$s1>Wwg;LoNII44_y4+7cH{Pi)=}g;)M*DuzlE!bgg8>i3OXCMWkR&StZ)X9iqW= zWs^SwmaLPBxh($D8p29TZqg2nme96W%E}gN*?|9XKj|I3X>*aT`TNPK3iv{2G)xnY zgg7r!ab9xJ6oo-skF4L#aky`iWt(9SJ!<7Zv)AbHB9`V(70+nCJHAe9Ar#E_Dg5Qh zULR&lFENYSA+&Dt=6Fw4XX>Q*HLZ>!T-7hNs}t3-6|0o=F;t@?)p=ch&{8$6%Q&*V z9|d)y!;!O1$}N~ z(@`l8`7MdswZUFG2xF@I+a&~?XM7~%?~kH82TvD+6$pWdEGQ2K;?{KErc4k5GkB05 zSYpf40K!vqWqs=LYtlnmEU+f?uClW-C8m<+S_+b3gf5ws+8i?2-eA1^YDmcB1vUd@hsQ-I zzlww!yPoP}v27qp%P!0ZMFLJdg>A=R&;BwDnIZ5zm#DVKXbi24FVgRJ4gW`S~oD@8(L9 zAN7Epev^ah!@^|3ZF(peGDX3Aw@NDGn)j*-{Mln1!e_HdOF^3~``k(p9!bpqt8DH2 zP4XTHf#hvpZg!dGZoR~U;KxU~C%j1SrdtJcfW#pR%x1PfDGz8@Mvf65`&YDyY!@@> zRy?5x0UE_n_Lchvg|sUDJLM4pB*|0ev(s=l6^DzTbV!mYM6P+$X6{@mde`dymKl`R z>Tua@K$5VrcIeY&=_yh!1bW{2#-);}SkPV2wq1X7s4l6h>A%#6y{>fJrZ9!<{43NG zTVqGgs%^V)tAcJ(Lcgi3smlhFyY&=MQ$JUeh?X4DvZ?Tfwa%Ma+`N|rt$e>Aft;)% z$smfNpOVp_tTmiX(~yf#kRHgN>gC)(gWaL7UZNQvNPi6mQVA_w{18<4q$J*}A{7AF zBjxTntaGil@z#h2R6EW;T&c3csN8*)CW0u@w^Wq-nnY5V zpRV+Ab~lPCl>22H7hG56(>&7`L%LnYgXRMC&2Oyr$tD*krK1-_Ssz^TFF zePqYwEmov0wz}Dj8xT9W@k-T_c@^QJp}0gjW{}7tCJuFOugY^dF65#-6o}y%vTisU zqQMZcS(M9F^>0cIC#|{VPa>rxm6?c#EVVgHD|NK=dKXMWma+W*U}{p98tQkY0v%n2 zHedH#ca-}ABG4>FDKT zg~E}%(To0-r#PDvtF$%4myYwNjY>^tyzc)JRMFM-?)HF72qTHcfg=_Z#-0x&H)7mf z`SL{F_g)4M@{_98c&#klvk#1zUY_NBrlG%)gib5a5^&g83lmRzxUD0bZnqLH z=^aj;&NT*h;VZYSo{)9@uzB_g^>38A2RC}euauFSDy^W1-=%U& zv2!M}!egLkFVJXuSSs@NCV7GRy?j8rImy8OP6Qc2aebbnKyjku*gvkqhf^+HcXxdF zl%g}*Di!U%r^lsA!82tJfwKJU$#ml*4%Lh+a*v$@q&;4QOIOhq#+bu^P_~F7Grqk+ zX?!eS2-~!3?1N3OI7r?|H{I=V46(HT72-`LpTcuM^3YDnX9=KW=e+sYPrwh z@~^E(Dr4EaqDzW{LW$hM@av!`If$CyCu};UMw`fsp#69nDrf`}lPt|fk+F^32sVPz zbho^Js3qx@lj*xmcRCJk%Rl2P0!>ocz($a6>;$rM88qC@FKQw4s!ci1fo0X&RWU>fm`2lXVm6l?um?XzMtFL@yL&~;)14=F!7 zg`Zo^ODaAc+G|K0ld3*xOJkVoX3)nLan^(bB9gW%)?))%4{YAjH4EnefnEF!=e+X6 zh7NrfHER@am^JClTKY zeRKw7^cvkC@H|5z1D#f?B-+Yi{wrTb)jE8J?I0 zvlxrTc(4$-4^NtcY=R;`73E{EKD6WGm%!7cRfK=U|M<>HPVTA3(R3#(51DJAMLJr^8FmuY>B z`NJM;l4HfuY~br>DH3q=f3_zokI=(OWJRR76RU!yBF#W@O6)O^0q~#A|5xeIrrO0x z;-6&pmk=Ml)im9@3d~zWB_oB)sdp)pbAYNix`%S2vNoMIrzfhcZ^@IrEw7Q>iDYHp zC^CI3BHF$V9!>t%fK`2ww{q4A?+I_)Yvez^l@&jI+w+}F#^hQuH^Nk&B^T#npl=aY z4a#E$QR1-ZMXlbb_vbPee+e?Q${-ZFo*wsgvyq9m(aAK2RP&P!r4vR{j&PDZS6gj1 zE1Fe>T25JJ38%`=2Fcm+ygrSGxYqTACh{5$_>HlHVGuwqX8$+Q=LK&zoh^31o1m4M zada9?Ry!JnK$=9^^pqCH*)@Ja@a(OU5{WE3W8)1YugF|$Z3+aHBhw_(b+O9{B!RX{ zpz15KJ7{A`k|{AZK=L5-?TAAc6B$ui7}xElA&Q3?Ci`zEpK-Nl_TPFTwGX=?5K~S( z-z=&E`5s;~VKT#r3*9QT<3iO&Jzh0}Oj}w`F|$^7|w4Vn^;k2=C`2Dp*Vm?n9NbC_qDM(u zfq$|k>8ib+J#ChVo4P<5=jaoT})Vvcfrr4><-{=aSZz!Rn+X?*JMDLG$F@TDw030Moq`g6<|2v}J&0=m==mU= zZv7%u;nI>*FlboXQ53|=V@bYQj*d}7DoAT z*@J5a`cof*IVZn6Ozw}L`&boBTzVV7FOGDPrw^g5orAkyOsOdm#?7{|Dz(k1U+V1NKuRNZAZ530VJj~T0w7N%>|ZVbu|8uZzr2G*47hYLAaLmNG1Tk9??iHPw0xeT0NN+ccq@?CqL0tSg`Igy9 zl1ENaG;?HKFi36BZl38Dye2J{BH2qoq!PMK`Lj<8wx%_?JBJ}U_teC%J;mDG~$ z2}|0;dFZ-)rh9a#bukI06huh7=2=A7YqBrrmeX-H$b23xCXRb+=G;4V-fD^Pa=9|@>2De0%^KuV6ElE*La_UH598pk{w>=s4 z(v$jH&f7m1@RVAn`5Et}sMq03$9Ee&EEAmoa9LHnTG774-7IL;Vm^WNObzV?Y^pe2 z0VvJf6NudH!}6q1Y?hP3L1Nv#^^;9b`_8)EZC%N~dgJ~7tScQRR^fKS?Jj7|L&tMM zGT7vYe*2NujkuTHz3p2C*5CIiU6NMXWRnv|qhO_M`QqF@jTF`o10^6yJDkxnIu zFIjTyT)uCf&ue3%_bzdAOz%f??deb;Y3}PN|3;oa+O{mZC;-)FVflrILeBkhJCAoK zW>=J_`!QtSbz{A^IyZ7LSIK#W=uJP+u2LI%ia)%?6Q`;!($di?No+6s8Q_x<@GT11h8>c3v@rlDZ4zF5h8}ebWa)j5zv@ z(MO^isZu~dW$)nY14>DyY+5u$nM^B?{7N909c}VXtk!`HZ(k#c7?llm+A4H|D1Cfe z1c#7*5>fkQ{P2R0KRFE-xcg9wkr*&5pKXf+44V!)A@ssTBiR{4Fq$)u2P%IYkQ`5z zV4y(zn|x}nfZqOcMDk!6XWDMjHoGBtVKxeaz-bc?-tsoAo;Dc>^*A(o>c`1M44{#( z8UdoMJ;QXg7C|uQ#bb~|L9{-d23uA<^ooh+!G_qAcy4w;)gwyfulf2{Y-Hw9dz|1| zdKKLkNx246C5ecWTymttWfn9tXXkhvBk2Z4J!=|1rcv_y8JARneHYCl6eCVh_efkTI6T>AVvJHzcw(v z;IP>Q1#<6;Pt=gb9brC)ygD0}Xs0a9HD!U@Mj$(6QCzh&zP^79oi>ri@dryQ^7^?+ z?&3V?3O}5iA%r7zaHi_d^)sX#COKu6y8L`j~`=Z;H=+DE7YUySIq<6VncPP{R{mq!_Zw61a#PK-6tS#^|Ouf$5adBEi93K zMl^}zeA_c_^UU?$0QG`w3gI|6ETi9}7M!{zEn@@@u4{xSa%E{c7}u`X|>v=g^!M0#o{oRPv&9 z3qdJ5OSJB{Q9*(=3($cqiC$KQOSv+RE?lJnJUW~~T-NlAceSkFA=r($W#bK`PJ>9e z!#D=;%PCY8f@H1!=XRn-;NTEJ2uWm_|r4OHIRb^FVBFBfG5`Iy+R-z24Fx@SF+-p zHiXf9=+`k?4)pUUz4R(fX0194cIKZMdFHBO6G0FNBuBTdCAxAc?B-w2@-rj|NEY!d zCW&uzH9NzSbI9PlQ-sij1|xxe)N!qJ3{zkm9g{`MJsYU;=>;$m;T_x*yBhd!Qz|)v zYcGg_NE3=|sPf%mDx(mch-U67Ibuh7BQ7Qa)10$)!X71>Mqfu~#5$Zq!p9gwl>0`$ zarJPD3eqg7KV`;Pe*f9x zBjcKj5K|$THrrhQ+(f)aN*Sb)w#Z=FUUDF76L{gjTyr1XrWubmfXf=cF>AW~v3pv1aB>P}|GAr|NalD`RL zw8t?p@P6f|S0+u5Z0Q}0q~3>gNNkY!Nqv6kH^uUB;ZfgX1TZzlSp%Fg$TMl$Ex%oz zmFNzpRq-f71Z@C}E;DJ~n9ZGxy6~jvUOAFjPBk3A$`cI-5gJ8Z5S6}Vb4uY# zrwt2%AY_SFq7+qo0Y7$D|E1t8z8%`L;sT|Ov36Dj!e#1MGZWV{XF|qu+PNHkRsCHZ z&Lz99!hVBY{)#maiiK%$AW>-_s;yhcG)T&1SSWtg5DlluAV}$zS%ykmtptMXioEFj zkG2X!Gw-BZFA=b$K^pFnoKAVhKA~kPt2(vj8PozwzrK7@$ z3d8tgzI>bj-CU5xicCP$wHXpNQtWfEycRk1kPP?H>2A&|;%<@{NG_=yGh zjVgD4n8+G6NtlQ>ohDpSdeqd0J~!dcJrvE$cxt>^_axij)>L)PWb9RHvwvRMqjw8adFrW@3vwy>xQR!dE5xmdR??#Z2jZ3AEBVO&Lh72e`wrw~m_^W_zycIQ zSeGU7HZzf;Ty#EI&+4Q)R7P7NOu8zdY1z8++sz~CrXV!sG|hBo94FMFAcE{1<&ME> zx=pwm?#XtTt)i0%kLdJEe}SnQG=$N0QWK}b*VNpF4B>yR{JjLlMDwWqJ|LQU>Sig+ zj_qs|&FDp<`c0^_)vD7al^z8~BHdQ$oyyn?lKh~lY?>_Zf#Hv!zv&R0%|qx~8bKQp z{K2Ne2}|`W5+iUkx+r2BR5ylfnvh@W(O60+om6Dyf`jNH_$#4*iUvZeZ1pH(^*L@r z&%N1}cIfAk1A{Kj0+kWT&m+iNN`-s*IX8@e6~*o7yePua-LIjNKu#iAEhi37kGtee zPBa$9CJaa02CbGQ5DNr?V9!5UJ~t$=+X>Rz|HNd+3n6rgc@N!Yu>{roBWmq5Xs z&N0s1w^acl9?9{&KBzI7fgtjOw2*KY`f1}DmOx1%&6`oI=St+Kq%OdwE) zLuz-!ySa$QNiE=y#DzjfdbIy|$yFGG3mF-Ft$!@U*-=Qq=5InzGg|d1SQ3ai)~5n@ z_f?D1FBq1nG?-vqrkFyRcsTY#(T{D)M-%n8L3r-_>@zBX>z-u}PZ{L!lHQB3L2kPXiRZg)>ts(VEEVeYk%c>rob` z*D9$pk9+hXC7WPzD7r^@{`+CJkp7L{1y^}gy7fdZT=-y=XSS$#$czjL|c(d5SuIh)o=M|0n z5M*-h5P8XiZ-!zR*-)i%)>1~b-!6@D4l(~eH+_c(${4*NTI~{~aV@~F8HyE&l2OU5 z6OiOfEig_&*#xmnM~*QFp*73wOj#*2Ky-r{(cjJ}PLFnOVyVUzazzfKnHiK%%%T=0 zn;kw^Z?_**FLa(Lm)pm*5;d^BgS;Yhe>e@MN#n*?F%{pz0U#;SuBx^>d1c*RYc>9Y z;|9{l)oC#Q#Ci&DG^L^wfo#a;LIxNx|W;%!*m?HaFKqyW5< zPT(%X2~3X;!Ye3RvK9?g_Mw2DU^=_PyCHS7pA7Gvx+#t_R`)d=h+Gzxc5uD|MfuJS zr-S-5`d_37)lUvMZ~(I+8i}~kYp#$}4<>wH`P@fO7Dw^?Cd%{iL)qjvBJPSqY-k-? z&qw)Ddp#jP7BXzq?J_w5!Rd1)F7*+u_W7 z<|1aDqZ&Wh;2HwtT9ithli3DoB+HK1_#v?q9m0HK2%TmeStd*Wo-;8DC&WEcU$kVy z#Osg?A|aZy%_-Vz_pjhCatLGpWF^UUlCTf~TDSn;&)c?S)#A(ts0Scl@0>r{B)9as5peJ5Tv?39N76@&@Bhsie#|QTj ztXiVFYlDy>ozC@_*oT3zHcM6R8{SSVQ(YBF4WQufq)4`r8 zRNhGvfbS2Rw^5hyy06W4I0y(qK+vA8CixhQWHf9$u-~rGHvtq>2oKni<`uDBcL^W2 zYTqQbE(z*IrBJmY#rY5w+1Vl`u12~X0BoHTh*=<=6*irD78VOsVo|lsu2@kUN7~(; zZrX&VdevOpsj9(LJ-a;?V= zgC&3o^UiA1#*wsB?mrgJD25R^vn)PIP9NghL!Be8$Scl3z+4LLvY2#)X%BDx|D-W} z^7afuLVfU(dXwSHSoU*9GVxw&NdZ%kz9LoSh-=R@6gfsSeV5Sc`oUE26LSStW* zKrjG#XM)1fcW#Bes5SX&t72&qq#%oyZx4W;u@OlNU0q!r+19_EEFh5IkLW8P5f=zu`Eb)^LXTzH+Iq}=usKqbWqyw71#nuEuzGa$347nq{L5cdxQR}BM%Z}pF1=;GE#_h_TX{(i? zU*;KMir;cqft_|8Cv613f&%4CH&QFbpuWt-u(B!HmH@oDqJd zmdLVV6s)>V$lx^FcXeydNG%5llyYPDd%kv=z_d#&*?KKYDGVhyqNK{OMP-MhXBukq zIE7mM`U9kca+alqo$&mVtlI3Ia@x7FbfYoNL#)0z#4&S5S(prpoQy21?Pa7+7fOn{ zL%VdGKz5&DNfW? zd~admco4gbq<)vBqr)hFB#Sa>gob1Cje(j4m>qzi0WNLfhf-)J_s8)PrCk*UIQO3o zLOcaH!vHUbumQ5W0DxVB^uPfK8sG_#9gBblJBXkUwbD!uvA|a)MXCUG8shaxZYt9| zVFX_}bOEp(DWsALnL`|E0Tv*|SNCh(%VA!ZK^c8i7XI_%ZzHL$xONFOEkZ6zYYmj; zJj?+ibflUnQpF9NiHhuDJ3NPO%b7CtpDTi*MsU#3BiY6@`g3&iFI|jkf3(Pll4yh9IC?>h6$@F$=QvMjpbYZ4|9b!lx2 z2#Dqii%Go-*>3wW8s0fG8=kb*V>n->?WR`3Em4i1b`}Quh)juVHtlpXq?DElSk_wT zpMb&K@+U)y8e#~!Is~Hkpwuz~s6~ygmcsUoLnC|Ry4$uWq=j1qi~RT`a>N(u5ji@hs+{5cQoNjIov{v?QWlkTVBix!HDBu6^L3nw)J(I zq{Ad@r4v5JpHi2TCb?qNM5$#=nx?rzXag8ZfJKBL2mpm0X;X~5U# zc0@4B%_7{F6WE0+`8RX_08bOBa;|)l+z~}_LU4sr^BYL}dXNl*GKoY82U%c3FCh7d z0s%IIZsq1>Sf%auU>oC!=Kk6lbi-Lzm@58C#Kw9y=8;bFc@F$0eTtneS~FNFgbGMt zRgtA*o6l&ccq3GAVJJpO|9WjLwu|XcUAqM|1#I!tK*T|nI1DMS5^@N$`xwj={aGbA zOz&*VanH6C;oDnilQMUjrOPBNCDGIO4X1i-k0x9q`cQ^|^u#9D1thG&a7!{w{tk}U zxj$hRM%z@61X%)dAY-63SF0N_K$)Q98K}w4EPV#Kw$&+_rq2AFK8gWpVbgL+X+6RW z?B?XCA%bhlaX-)!9%8ECg;{4n!cb?Xe~DqbT#H0DtPji3>uA*5wjCK^s0$U z;GL)ybHvZ+hfb@-0GzMoN`-d4|Ceud$c_hg&alf^l;a^sHWO}i=s|3@)PmMvnFt_ zr$T)b$P;5^l|pSU+G-4Tw&OuqMml=N^X{?cygH|RRR*5Vq>~6fQK>$mEp$h*v`T~D zR{_fD=xrdovQpDFNYeLY61jfsUEh@N=FmVp4bfssUu+4KZG;QJO{(mc0gXrz#kl#%iAV)R#_2uy;y@!pU2zOCpfV-A#FSrY8~}!FFa5 zbDim1Dh|ilII5EzFlPGog|KpuE1}k8FQb%uW{WMNeYwKjJgnH;Q75Pfaxcj4CSSi3 z3*16b(T^MusMw@NFA(xYB606YU4?5c9#G38yir_M_{~1PoisYPH_62SRQk`~xnW{L z1X_s(D2WrutTM&GaWct2dzJ--!jzp@Go~qUx-)CcE&6maYJ7+(&B03^XJ^`}b(fu{ zMxD6@{&&slnec^z>WOX7bJaKF21CBixL@P6F(>^}9Vu)V4f{|@LbJ5tCQ7QC?xf{H z>`^AH%!km|C%2)TKI=$j6voUaCq)$s$u=Q>?GSP<;ayQuo^{#j>@Rvtlbq;cE?yAw zg9D347BGoM1QFmD^EOPV%2^|M6>%_A7K*X`bjKN2Dl)e7(uZ4lqGl7t*ThcBd6L;u z>wA~mNT?K}R)!MoI?0r1*^m`1N&;RPJ+_0FS)K+{S$Cryc%X&zHL;+z9)|We3Rwfx zqHgO<%~VBYmXM_9Hs5Wm3)I13!s1&DM#3*{vUJjSk-7`I8NvZqHFkY|t>Fuw%H^P@ zv{$)alL)!W$hCqZ06##$zxi#kK<41dyjL6gyV8`u3RF{q)8i+p_NY_Pe1#y_)nwYix_31pSt?9s`(oZRI5;p zqf@F{xfWqj%aY;=cLc4FW|SS|)D_&WCgWV>u|8d?)QZmoUguhNkL@l)-yyYHd9S(1 z+EqN)T4ujuFoCQnKJ^dTxiKb@GCfP;F*%&6*he$jT1ylx%RM+mwl@nBfe=!}*;C+@ z?9_25Sd9a;%#7ZUNk&d+&!pYB9_yCMZv*lMmaMhbx_)p^@T>BIw&ppFNiGW2u2xbn{-C9tMPj5Kb5Ed1dEX^rQIo!`YOgHa(=Rp44XhjlM|1W!0-TP{h3Y(#zTa^}|d%d!LWAA{6mjale_i$eS~PQ66BcvgIB^ zyM7% zDPmozILD%vDviDLiKS&P_h|-|#;GBzZi?EEgDjGo89z&vb&T5T?&2FWdornDa>hY; zw`h|ai~`=<^+gt>MYWV((H)f=x#;?;S%>Sj(WHc`xM#d5u$;vdzvKm;XS6)3u`PCr zR$s%*;7PcrkDdSOtQaQRJdx{)=d^NaS6TP>YhwJQ69{H52E^V8Z~vx16gTjSuA^%m zYebHZoTfD@ZqWZ#meyvbhHE<7l^Br4$iYe^Zfw^^F8z$>z)7P0;f9j=2BSUL9#?&r z6s}G7nn9Npviat%tJmr0nI*c3IPayrF&y^hqU=*>RV7}SE`+q74}SW27GGc&yO@!# z#k{<2%H*@viSbWX6u&5DvQb6xhEy`NQ0i4(?<;DYug<)c`eZqisI>b7Ix~8H*{I-U z-c6|(QVOi8heR4~m$enXqg^0hi@#Xihm9)bH={hT+xoFsv59RdNDch*7Bh&I^`fa; z!4#Y9l>mZYV34$`9ON|JGs71$!B3>}bu4%{q@?7ExJ%oVUJm^=#4C){pbMDwc>>?m zh-n(Wo7XNw+P~fh$*;e+0)f_P=-A1t=i`WI6q}F5A??H9PD>&#;*#%PY88SKy(^~? zxR-<7P0S)T@eiK&@haCsoF?o;Az?;d(J!W37DWj=jjPfideMc8xt_4koMQEVv@eES zrS8>?aE7p1@OWOj^b(loh185z+wQY2reQ;@%Wrt}ltd`2(I8PMX@a67)fo{eOHKcq zG`@_}Zo{bsGP8t(^@ZMosQ1}9`84t;Ph%@0agFY^)VFw2S$p))em&%nsHTNCHjhF= zKEb+doGLm0Ygf@p4@Xv>X-(Z#Z1 z5;!Bn{mp+H7|)fmr6o3D=%s4AzIPZT+ifPUgRBTD$r}23E3B_LU7{4_H=M4lD4ZOA zNqa_JF_GG6w;*C}g_iZU_tkcrleHwyhb|XKzbPI7Q&uI&2C@j zhCNp#ZDsWe>0@0z(w+~c{62lBQ%Pub6;pK;Z10%GA}Wrn5qBl5h`ds6Qjp1%)XV)1 zyb<>LwaRCba~projacAWwVLmbi|W+79bm)dQ0MTnp|t`7tCg0rSh*+`SyYG*w8}%) zJWg=+M(54bL-I{k%+K>6BHy|*s`YC>6U~tr?qR*lcD!RDaMiH5z)R7mZL!XIef%0I zDZ~NvuYce6*wB#E&aCQw83nAd6+*hTT+nUU!gB0oPWqrNSG^@89pd}k^`7FrW~>S^ z8xs(ci-zcR5IL&&w5qk%1eMjyEoBKQieJ2Z!j}(Yzv2(I{#sWlH$y zE57wmE$x0L@}`P6JN|agj{06|YO+7Wcwm~+KA@3-qi+S(uA3V zJ?YP{Fl>;Fn#-oNoan#$A<&#}!Z{#?gM~yq)|*ynY)#x+wJruE&DC@cONy+K&BYL< z&8EWdzVdwt`R}D;AhSBsND|zgRmpBSa}jpUXv7pzSqs*gjhEu^cTlXe+H}y7W3fuw z+McA0QZiR{Oen;MzV|x~fiQ(1eQ^bX*PM#F*jk3SQjU^=P34@I#!XNwZM>xWh~}~*p@x9UO`?=s-`^h-#G6Yo4!&e~ z&B^sMUG_@1x`tZ5xj@wPvg@4KpM4hTc#Fc;o#MExPHL4}I$SAb%hDi2ujbO-cV}`r zb=OfRp_cZGTOl8Woa1lUll&6S_|0lq^3`;M5uqc<=T=6dCTi+y`e^7@3bcOGKP^Wc zMa=WA%luN%Tfka+op^Jz#b+}(j+;c!=y>2huC%fB=3{ODlrwJVwW6-0UmlkbF~wXw z%JMM?gw|ocQl#VxT^X)iv}}f3Xv8bfHVUj8T6SfmyVT8_V6m9d&1#QZH^h}wJathZ z8d^*Cied{6Ct=rr$wc>w&|aUcH0Fe6V@e5DdgjyO`!JUAuGNhC>_>9xxe{rNw7wxd zxD!0LkP$NQX3RU;n3f^2}L1v`a8+(HL@pwSYk({xL3DGej1gU zgSldmTgSX>3bMt1p2liMCzA0-jI6y{uR7)slf6`{+}G-l`%5k9-zQThbbRBcnkoV_ zSVL$NA}fBGC`CN8n7qQhdYYl#Rp9<=mR5FlGy3)6r?{Aypr%>PGWJL>`T68FO#QoM zhQ7V0wScK*D(Mbtu@hSlOUBY8h=Cc*b*_jHqBFIzQ5VgI+ryfX$W@OF2@C#?BrfBf z-si9^3GJIGzFkoTbc$5GFPXG)jk6I?^_zd#+S9lf2_nDM`z?M@G!hBI3d0bVo_l;6 z3<`r45hg<5?d|ldqzHyxE?Z0dg+jzWOadrga@R7__|)4MVq3L4_W>^%sqedA&ox+) zZVyF>tukgTE6C=dc!HKY7}Jbxsat8HC{gIaDeiMV@TDF|rusU6Jx(QTXUdcK+^SdZ z={j1?_w<(55&|(wq>X6EbW*5)i#p7Df{sx{hiEZ4Zu`Ej-Hlr7z06wOMqcNapBA>C5i>cj&C&snp4NFf= zu6d^bM*tJ9gwTIL00Z;@0NMZnngj3w<_-X)evME#14UzR79)X1(gU1y72)8!1h9cY zrjWi|BsLhNjY=rBkQuYeqZf&WF9IyCAq{h$a=$jnoP|6cZT9TwKabL|jU80+?Y~g5 zZ<4o(U@zN%X8=yf_<%WpZNn-moq=kSdjuw5)zH~X4T&~Dq=9Lh11NuvBfK(%Z-ed0 z4G8@mh3`fGrh`PV0_}vH7J>vNLO2A-sSIS^2!T)# zW#CT~mL!0JBr$>XYbY|wi`044d7~caX8%`Sc$Kvu5TgHZppxPk4MlGHv!3q?G`dF- zh?0y~sq>YEO7*PHLtHZ#%2LNF$YQk>q!zX`7y4~nyg`?Oa8G$sp8~SL+~AycU;1+X zP*f5mkDtuvXp<_SxL!Wr?ART=svB?u1OND07!62H^SkkY@IUaT@mle&@SpC3<|;Xl zWc}_9DGEYIy%OQ!i$r6@e{^m@yUqYTc#ZWi&7BWffVJHuX^qB zEP{MajRa2#c*U()R~h#Ii>Zaue_6;^QzwZ)|wyZ5+^!H(Lb=oAp^f-&(+}bV|uB{Qg!nCq#xsw!-p>uJ;SP zeOizu815m8Hwoua59a+~8NH5S8e7B%YrR&N%{P-_RN8eGwLk8Y?&NAs-F?s#htfmP zH>}SsV|<`Ns{>>fyjzA4c7Qsda}mA{5KB>mmiXt6S$b7=xdCZ;a`TK+Voq3vt-49yD2PbxO#0nF6whEtZJu2wUu5z2BI&y^6 zF&rcFJo}lMIXPIVkA?7LpTsPjo{e#Eb9fQT1FvtHN5XENVn zbb>YO`eM$MBxGZn%7Y0tZuyUqFGd`sOZwpY_(6bsTYq&eH@s)mw%iNd$qy>@r(62~Rwmb<=v zOw}i5W>egv!GtLeer)wfyUciXG8rS^;EAi9rVNfJ;-nI!A*wwDy@)4QAruCTS;m#4 zI}@FFOgGnN_5-_XYhsanCG!iCG!Y{is`>g-%V#Y&8ymX(91*t@0V`<+fbE*!JCq>; zuhle1271$$pC%rS-Q$Q5T(bD_fYLOqE!Jw)ll+M*QsL~_MVC7as2x?y&M&YwK#P;r zeb6nE4Mzb8t970eMc$Bg&B)@Pqz?qP!4L0QXF)heI{aV>y+@*AVO*{0<^B9 z-a#JAgnUZ3g0@8llnl+uHM&`~?tCrj{FG%S_GWK7W-;ePV-Ha319PZnQS?C_P4_}t z11A$Pyso7E0ZaO6z0Kt@u$pjK2wU|K3HAF0;|?S?xHZMjBnSE_!4A8tcuFLdPmO#C zs4jpQ0$aC;n&M}GVw;azAW0Y=5s~1u6B8%@7JH$n;*1Cn7CH)6RH}m5k*BDkefn7g zP#fA%IK3nu9(w09yt-hezsm39#MT*?h+hp%V7Mjxc>=D~$_mIilv8+!DqD+JO{slh zAL@^$#~Y5PFNk1Da;=Nvi3&pUSVX}50XUEO_DZ}N8{>VfXQr(Rsc$kZ26)qr8u0dU zTeA3NmY=6akw_8|a7tvEAS>DiCQ6d#@ar+)ZyI|hfh%Qa{w5pGBmpATt6gW0815vB ze8GLzD2heBvuPlb{%N+O?&pTOa>TeUrSa7HE|Yl|bt@|K;u0b}Sii~c#DrQ~*_fjf zO(BuNt5lCZXF0t}n&kxS=4ifJcRBI~tht&GSaPfj`Z|$5YOEbkHBN$MIhc?hyrKq; zTsnyjDUBAZJ-#pFbYIoHYpq9BaJTV|SEEOVxyUGsdr!Q|$@5KDgLhl>{-G^nK9dMT zXn>6yEj4#Y7olm@s0%=3%gDIUjms10LG|K0RYlI1JDpTL% zQxuzwtrrFOGYKX~mldsf04DCkDNxSYiBOgb8^5RQXh6`_C7l>rsitjpDf*$L;T!M# zQ&EBtq9(U|IY}TV{NK-mMZK+iI^z0TpTny27Ro)@viwFAK78Iv2Y^+i zUp-NB#YtGu8(cQ!3I~TpT!iJ5^3D&zcF65$s<Rcvx@8I$eqYSxudr}KoTQlF;6RXXtlTB=>&8H|m=GTSLK$lUZq}BC@Od5+b``HAn zviK%!QA~N#?Km^6Z4xyL@iWV|0VGibq4sdEUydYH`{v8CQ_~ z!|(G7(-0=0pr3kAoO8#RC;@Zl&dq07vHeFCkRu&Nz4`%~7v+UPhL$fTRFaXYR`7N}n)Qqr@GjcUN>iC#Jk4p$cvQHKkk&L{$Jpekl4mgbR!FfCYRcZlNMd z9}-}gr51!W+0Bjx*r*vwotf)q+)s{=W-H|^w*tAI%`fyROJFpNo3r>DX$;lM2sksP zb#IhPT5?|6ug{qq@r~jr7_eUl$-7-;d6J$Jd664yfSf^^7to=N@-&)@o$}xk)VzKQ z*A2I+;m%AGKJ<4n0-{^ZAtcqYa{)pqB>{sHde7Tr2#8VL5;jTb-fE264kojUlkip{ zDMjuaGzQp7SoRmIRXGT8Ra8<QYWN+} zzT6`CQRhBs7nnvw?`yRXln(ENl^P=yT>9j=5dfbzjv9s>0?g6W$T6#jPD zm*cdeIR$Y*gD1oBUL~u&K4Opf)_pBmd1nFcFk<-5km=j%ceb%+b%Yg4p~Q~DRhCwS zqRi(H;$SnhkAro_(s2m-(9}d;kJ8z7v~d;uX(U&ShHL0u_mc4n3!ze*$#=p?+c32J z0_<&zv-F{wC0^S`!=>aLXD8$Z$uS3!df4FTKe|7;e5_$2SXZq(cvMeNx*W<5H3~1n zaF3kwf>`$GZrW6XNF3-{CE*J3lClpWiiod2p8KaI)gcSL?TB|o97D}1dss}id6zRP zlHlzk)BnG_e52X1sFgk{>;kh_rBMRyugUbRa0lK zlxjUD45QX3Zz_7Co!O3%yj&~p^eUWHx156#%p#sGWN}W$B;FPu)?8DY`3AbKc!+oQ z8%Zk=I;@UOL&)%4(N!xV=CY`*(jr_P~gwo7j^usL= z@1!ULM41SZY`Eo%BMmC7-=+^#M;($7R9UoiWX`>t(m}X_Gz;PYO}M!!?E1liy3aBliN~1(*zaEY z|ImjsX-PjcoBEEm;{J!5T|Mgx3`v+R4jYJY$Cf*CmP&>q;v8c-?*`F1x6j>rG(^{p<@@g(giM zc3ill?VYte=`N5oA)FJH*$lVaOzi6i3STaw?l0*ngJ~M>rP0la;4CG95T)$ZO@EBx zo)bcPQ(1Y+MOeu??vj5}S_(ezLC#}1*g$2-7A_j5$}O6E3$mQ9_|iH2Ren}5Jv=U; zpU$nByDH*RBDcosC0~bZcS<@ew<087P(t+NJmb{GMH`Y3?DI0S5uGib0;j?IS7ads zGKCp7E)c~gvOWFx7I&yo_E~>QpTo9i`itsKGBw7Ho&H$x+{i>zJk z(IkTOnEUN`cjIRATupA<;=7`G``1>2_ibMUB}4{w}`0?)ZaNoH44&kG%3ch zS<>Fhd}jQ$gVSUyqj5rX9lfC4aHL7i5h^NJwno8)a%0&vkbzj4HqH@u#}kYs3WVZV z$W{0HLCnB7gV7Gu4RB1=s>MJJ?n9HYl92MYv8?aVyO-8)+#3wESS{uAXRL?{K$jF{ zN^A*;0}~99$u9aA^=W5#0p#CqLq3*t^fbG;%5wo9zwWy z@!ED*!GwEOXu@(q5V7bTgorEH=kXZL(;(`3bbt__xlz7PFU&>{ka`Wl4!(HXG83|1 zvQ9!Oh+6anA=FQAk18t*zt0`jWm!q@w{p-W$Wg4k%V2f|^J;z&LzJ-!!T460#QQ6J zR$}&e3?PL@v35O+{9pk7zj%mnEjj*-zbT%fr97KD zODUI?rHR~Q75x&uewBM+WOU#VuHs=lH&Tz>B~6LIIL>DSfrWx3X-9g6IF$6LQx$A( z&Ka{Z@z$pQDV(aw!UQVK9xiX!PMj!wjL*~V@uG%5JTQ@#irX&c? z%>%UE6luaU-3X0PReR0v7kof|D_aA2=_Q1-FOa41Ev&3};X-Opnj*8bngZ>>yy5C5 zmZMBXmGXnZZShI`(RWl3-SjmjxsVl(PrI^MSN{*ki3Oo`t|U!aU0PUG(ouCatUsPQ zM7W}S7tPX1OF1UBc|A2lidSmwTF@g9lI>;ES+O~i=}FU(GUL@y;JZ$*0X3??Odss6 zvVJUOmH?^qsm|d{m#k5iPG{%dev`sY3;M-p?w64Yzfdr9d%rZPq`VY08Cd730D%aB zf+Wq7{eVU26UyO(A?>biQJILhHuZJLM0a@l%vI8SFyu-@jtZmT7y=kvnaN5~z3VKz(g;Ba9hA9%!VlF;>I(K15 zOAC+fkfub6y5?M_8uca^)Nbu59{p@aD4zRCaDW|)O%GR$@;{nyJpt>ew%8I4jr>YT z`V9<0jF(zBd4}>7&3;j!Tx^PLA>k~dYD~zhZCN| zSPR#SPO7GPRc2EVe(`V48jH29EDH6EiD?_$>3vMw+1+U$xykcGPaF5V*Zfg2jmsDxU){r5xW&`z+ir-dswgk}Rdaxac ztTIiA{wtDS5nsWzc{*z@i1_hYaTqxQ#59#hxeb`&8(pMI0S+UqUAr^MAoB-DO$9qL zQX02Xu!dvax+p{-yA{N!Y9{iyBn2^?Q*JK`OTOenRHwmUw$QX@mK#G{oHPcCp~EK) zqf}8och5W9$sp-JcV{0cs9ymC+7iDaF()Pp{c|DOb0cI~0gETm9%?9THPsns$PZ`N zI%lm>AHK0jx0f%GG)p!JBJ#W2SM!p-tF)RY9Y#kkl0J_gx2pf+p>vZx&0$=@>XXqkxDzp}6!#L@ zVxFf=W4y|K!?l&>%yl(iDE7(=l$C$xrAf_b!UHs%QE=HncGvhqEd-1qE=24mvV`VW zJ5h>AI28+&!Di%jA<1T4Dls-jW*fq|UjaxZg|^_RDvd*vC@%?(h9MzAosY|iw^TD| zA=Vcnsx>f}VC_J9XI}HJ(s!jC|9D!9_hlKjD`R9@+Fd0P%sd=QIR6=;v2$mhYNKYP~I_ z_<}Y8#f~6HbX^gzs6gqmEZ;UFR7)b5{3UOiZ9{Uj+5}!E-fh){trxFL;J4fnNPEaJ zS3=;#r+dYv9~!Z*cvN~zUck@OJJr{=kx#?5VoD)OMrmnyuX(wCEek^Z zu$X_20G0ps>cyXZBJ9&FwEI85@qhkAY8A+GqNfr#ROfp5$pt^QrizXf(y(~8eNjqC z>Zg3Urxgr~1e8$8QU@AO^god(p;xd~jzTRRlJ+VI)=hSwc=%naOj;>NLF)G|>jj$S zFbJK>2bD^xoGLY<#mkK%v%J^EFq5nuWm4VVLy1GdNziwbwK{tcUpO=@QRT%WHfGZj zn@~PFskD@vR@4dlBTDPak>utuu>HFm)T&wev5;8hRd?H5W3TY)lM0X_WOKvt2B2Sh z2f*Znn89H#p(zl7`uH&l=mtmu0)AA`9*{O54zN}|s^|qp1f;Y&(Jqd<`SJy`2I4T- zXH%m~W$g%R5yt5ol+U7tOUIbe_7gM$hN4kY7Gyc_HhDY1 zU;t@-{2j;`cT^=&_CS2kAQ+WNvc6it0!#>&=q92FJ2k-W!fny_>KWAj6~t@xyxTbZ zPUwr+D>(e9hBe1*5>E=z^y@BE{P3}zjYdGAq6m_~AqSL zZXpzbY7wa~k3ekgRtP*ZW;;Qrs-ApHYg8NHK*KwZd&}5tlROGUV8>bzfj?b;@v6uX zY#=>?C^UJMfOmMZRP;pd{$sR+;~NOmelHnPnL}iMseYWpsXGr;(DLKJNZy}v%%@#; z@k=TfA-alzEY9!%-`is-Q+0nPiF&sV{I0&8FHG0I59ZNV-I#$EUzY7Q3K3}4^kfL1 zqX$+;S<|=c*w5e3E-C5>l|mP}0b?@m?%20VNl-8m$Ab%bzz7gTLyatZg=Anrch2aI zonK6aDGC=&Gx^osaV_Dbk_-&R(qmhbK6L8$7KNHa3tFiU)9k;Q2dEbDR*`_I*hj4U zF@Xn1E~;k3?bVSOg%1C?TKq(<*?-W{3RMKL_7jALbfcl=3U3wUBc~Sv;s$upkZG_m z-$oR4+IM<8ei?h2Ijqp!Y{%(LJL;?JGJm{0u}%4bjTaYvoN!KsEv*mLp~}g3`t)MO zKlRJF+n2Xel7jnLKuZ0j<_%SA4R7wAM$$Q;eryy8d$2xCqTU23Oaw%#lWJlS^yfsO zGxuJZwZ86}-*~DXfFOYJ(WqO@Z88)BrPc^NsyC)jYc7(On_EwCCmZBxkWTL=`j`8# zc>z4+tC)mr#uol-K@xHi!epBor*=$dXw`Z%zEZemLTz-LCg1JW`XO%yu? zRjB4FMnRLjAUrC?1y-Jj!YzCamgF~r2oR%jb2yAxc~y#$V;!hQ3-CeVT|Co05I`Yc z+$SP2wh7c&Wz=-=G2#}=uGAVi`WQDaN$=Ik7q$n@e1w%5FPha=!uYulLctu45o{c3 ziv(9zjVPAJeJ2gP2Y~>r@k;=a>M*qn?VcOiZiPjdENoB-CHN$v&Z390eav#KwMlGT zq0w~3a}KEcn9#F&yJr*#+rNBuw*Z~=AY8(63KF0Nh6KreNZ}s^woq`=xhzbMu3HCR zXqdCfd|)dl1iUhY$dJDXw`m|bDSyMHvXZqgXE;CB^=wCvfb zN6^{Cs;UazhL`5R%;6(*aB}TU_r;s(O6v}yKwSk6f8+LOnL3&u zI9|Dv7{!QWCR8}LyQ{3VU&G4ABcxHsu;&oEU-Y=y#Ql#n3In|Wf zthWrhScQ@497-@{Iosk86XELR;1XwDI~OzQ=GM+p}b=gZ6Y{} zkG>ZB4OZ}Un~vFYGS}nT$KCkiTbV~=U%E}Q646Lr(iE^$iPC?ct;uuDnYW~2j?uOH z%qJIrw6yOqmmSFh)EJ{c+oXNEN`!RirnpN6@*~@ez>|~trrDakk8mm2CLU1z2_VsC z(Zt>*%T;dG3>csxpQ(}szAn^gg;9xQ5>^rWP9+yN zo+AcaWxGqoxsGLkA0CUK6fVA)l{oQulTsFQ-;-lqnO~0FQcwFMNup+XOSjvoGP6Ki zmW0}_`!d-QOwT5nI`zksZ(tTubd_^W8GAR`r?Jx-^ zR6uPGVcS%iD{Vr~M*PcEo+G=P^Uiw6Ta3i&!XSnoEU8=CWS!R^4*G-;Ro@>JwP&EN zfkGp$4a%)s>V+;`)oh^jy}wzv%x9WeMDq4)+(6U5199HW5%YPJ=B}0QRYX+WJT}3a z%QNGu^|KLwTV`1tQxHZ{5(c^DD+pm;4s#Hq2rYO-4f5ZERrRoP+=HsOAE#`=q3lCd zS0ElR|KY%ZBbc;t>5jNZ3FMm_)pg|aD^>DraS78rHx;JTOT|5&h%koYJXzgl8boTS za5N#oamE=%iwkFEA6*dgawCN>qB=reXG0<@f5df18{sTBe&YaWiSWS`!u?DIxNRfo z^@-Qvp^Pw)O%hQm&4@~$7ZB)R=*EL6t;q-nq8iwI=9a6TNRk*K*ah@g=0Zc;=?on4WY|BUP58`QU zehS!R;BT)^@TE1(ZiHL~K=1UNso6v<1W{QU7Im%|b+7r^B&{nGn2EXT$p<|-37f-T zOFL2_W^)hVgar`8Nv zX-rWVQd1c%ncB~qA5vm^$YK!L-jRa)gJFHlD2Dh=7C%CZ6_U?MiATh3ul+fO=wBQ< z0k9P=gor0X*dWvreu!|8lHiz1 zm~9b;wk9%#z|z>c@arUXXommM)4lL~mt@(xtC}?ztmfxXA~wlyYSjS&Ohw%Ft9XL|Z4+5OghnaHbXFTy2SAINei9ejX`bsvxL}GQpg< z`K5erX+&KnEAza}9V}|3+8T!eia3fughAEQYRk}OMiwt0K#FnXo5L1$HiG-F7hN=; zu?b-qrSdRbd%GTw>H+YT_x8bRpgP3So<)uBG7tB z6_4*Zo*=UQ$KFj&uS#Zkm;-acCmNZ;u(Zo*Yr4zV&!LU|#`}vYwnoIMG1(?TZs)bX)wMm|$hpu-h#@R9*a)MItGH^&3x7gG(FfIq%h+A{rrl*B zoA*}gSlZgde`4ysYNT=;Q5VB-GD_vcHn%O&1RL8ggVj}pr$g;RW9Sj+i(M`HjvEkk zlIE#KPL^h#Ooa1$xI*lOiw96xyRWj70VX>9rLQjNijOWQ0$Zjl{Y!`(r1R)CZ>6}{%mX$CjD0(~Rsa~{JM#I3Fq-3V2LRJz2z#u{`4#AlE zu^ocp%M3RU2O?PAAG*VQ^cg*A`EL7!KcBfjXPXYB7Rdp0Y8wGE_c;8Bjau~M^2twy z&Om3LyRPBMDwSqo#>A{AnHqE~;R^)u^i2*iDRv~u0p2I^z>7IYh*8#o1M|`f5-*ed z++Ge~VpbQ=#NV)-vA4^sM@3rd$f*%wZYxiAss||# zsL2VFU1xvC$dSq{#d+3qr&6UsOk!Wh`h8mvMx3Jc`vYJ?!PkmE@d}xA@b$ziuuvuu zV<=k$snF0MO`%=|?*L?pU(j6Mf-Ha9GS?AMLD-4r1N2ku^^{4bTOdrbO9xNUdW<)S ziceVQW})}|wl-A0ReOCS$$-Nouk=g)IU|Wvh+uKABGJ8+%9D)gW!l&5&S!qjD&Rdyo!8# zy}x$d^6xuR@CZeopovUMW@WrPS%G3X%y6wfiy`8eccWA{LC}Jd4=YrjR##_bnR`tV zjg$-1@$uLMmjdu&S8yC(MI&gID5PFt`UINYtA%JEwgbkTqG-8Y3p2PcKY&qSl7pM< z@@i0yDA&O5K^T^{UDeP7nh*&=Acvj=O~Qn?{a4}$1c|Y+y1aZO%LknML{5;A@H9g= z1ay*WG1JsYz@5iXoClzYA_+;>F&>u~z07yj5s5=CGnqiZ_AO!tu38P{_Wcs1$%;ME zIAA1lcGt(0P>XnwQ|775wT}s2%~#F{49D7k$1!vnh#-Q$7}P}S3UxxlXEyt|&Cv~+ z9axqh!iX*eV80}SFKZhCpu|_w#k=fJRm&B7aGIf-U4`iy3j1+K%0Qk0&oao zXc*XxVz5N}y-I1LT-uw~GT6opK^jLJSw7 zA_T~9p~sGX7}G`=3&DUUoJ=Dy%3cUVnfxe!r<$mhT@Xyl+Odbu zhX7rVxmHQ{OsG@tfi&=ZmC;O2m&|i*{@TKAgQI`k9`jbcy32 zCj|oX(3W){ffRcb45cjXD8Da_S^4X9ZTggDKjKr$QM@+?P`rIl`F2yZteBZ}o+lfW zM(dD)RE`hp5)t(#l4T@>@apLaEV2l!8lHhzS&AolGi_+^q;=!YLf;;gKh=gW1)0>W z6Hy_^LC_jut|LSrc~g7yh*OZwFw2P@c;r^o&{A�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%0DqTO3n%=1J5R zaY*5dC@y5BKqn-ux!F``x>Pq25(FJhYe((4CT!a)WRo5uE<{)J|1y3ykC)%D@@`2} z{Cdz`VmN1>kc_AP`Aq;=)V;5t@U5Wz$v+v~cV9HL8M=vfGhbzQVu5c-G-`Wd z994Z~pu)q(dBj7Nw=~NiAVRMKnmFuD45xQsgmEn@_Y^?8D&4syD83NyVIL5*eG)}= z_f9A$VFx3LwhaS7Q;y<(&kD)?8zZ?(f5c}Nx6_NVvMXq9W_$lj%SQ-9TblwjZt6=@ zLd>&`=0I&>+OmImEY9_1^GKM2HjpO<wCL)G71Br7X?>k(uAGC^oyvbgYw>e9q&Gtjec$IOR8>ESujrH* zb6D94(tU%`KCRsYw5evq2Dm~l6VIeby)jybyj^tj>8Sw_AI)B>Axk6+>mH#L?=+z( zGG{z~gfq>F*3C70VN!XUdl?quV`QA9C9#T&^-ZfX-E4m~atn0VW{g;=NC){i5qel4 z)BFBo_^(z|<8X(mC7@P};w1#Wo-rk|QKS{?DhizyVrfPYG;m^@#zAZ&rAAax8LM?- zLnQg+a&PB>w_q5=+`nlW`)Zeut|DX$Hg?bg80$p)Br!Jm5^A9-rw_I`Y)^@uXX9HY z!p&c%=IiOSzdO&n?zgC#@nYHRww0fseqFaCL~um3lGPO+caFg{*p-O3%N+=2i})#80_Y(*uuRo2P}1tJ9fy&MgHjRKj+4&uk31 z5Oqwyw>ntR%voKfIZo;}`(LG=u$_<_q5_M%y?j(F)ANgLlC_k?yS(yWt7*L#B4wLL z+Qj4F?N3OlOW^-@z3vgk)vs<}n1n!-Z9HhQBag*VYq8Nvl~lEEs&cQPe*HDt|Rjm zWq9;!0?=0^JcZJ7BxW@d^uXAN6{ZWM5dkQ<$|sy{@w!2+9MJ-0Cete%e=xys6~c$Z zB3ncbyrOLHtJVb-rjdrp;#vx#XMz8c7*KQU!c78u9b*21-j}E9m%aXXuSWRbFByGv z3aqX3W5YFSywt5$)ZI12xnwCEMH{j0S6G&D1`v~;w6AHSN%v$tIrO2Z#WdOi#H@Kg zrzL5Ww7ZlACBV2xN;tc$8-YZc7PqT<=9_3U8YyNB)I&Qu1*Hio&=W7;Epa%&h|o~! zrO)jOSYI-bIg^4OuF(mBdOyN|cTG$Mvc;5@T@}#Gqmt(haUz9KrW9-!{jxZfBR9}N z6S>WLSe#Iqmhm$G=EYLjo$at`} zy*`zSnr9KsN7@Y4y|It6Cpo*tTv1ei zW(JV45msL4hM!ssX}ISnQGQBZ*PLL&bB|1%4I$01o{Dx^3S8DAu@2PE>}>%nIPZ!_ z7lNl9hHuZDq^WDx1B)$rX$Ig|#?Q&l$dw;Epl`s8*dp z2v!<6>>qwx$9EP#;ndUWhLeCo+-`gDMrQ-jaUnW>!kkNJn0z6H?lno$umoi8?D%YHC}#(4+@sxTq=>`XTic#F5Ng zm-+-SPG;Sth^$UVCjhjeF^nRGE^yADD{xc+cZnMdU*&xIP?ADuDpTKJw-wW3TI7># zN17s1L#xqoD?gzbVs|q+hE^d8l=BZ22yTEXamxTDKmY&~IvfB1Cg5f8GvEw-2b2NQ zk0=r_0TqGXJkhm)LO@XB0s^D}%y+TJOv?0lq!QC0>Uiq`l)SOnHa8Hrq=hgoGwNFo zy!W`YE1BcN@(2X1Nj1N~S8ouh{+6K)jzjqUc0bIp6QOKpIyu#pvp^blL>qg@m zBJ;Q4f=9e;mY~vC`9vZ9)iq`5LKbGaq?f_$6_+}KetECh>}P+DA%08GT6Kw~eq@Qg z!&eG6{`mE>NLVm!?BH*!d%t8B8fsFD*7D%KX_fHE6CINCRcabkBn0g(pIs-&hE8L3M zrs&S{r%7>N+s{2AC}}$CU;Rw6S7CHe?A&TL(O(-hN`TtkrT-BJwUr4ypNCD|Pf4G< zR@TN=g_2RuKnTiy>_MAU#nfUn_38b^^Jwue?+A6E2mK>bkPjP6>nv(q3&rw(4uZ|| zyO8BvEp;x`IeCO_n~@df+D);BaSKH*rnC}n#;H`b5I(QdQ_myr%rY9+N?qPu(M;Et zID=Hd)~XZ5AjmSB2%XryEkvM|eDfq`$Eg;f{{( zN-}CuQq7?lXeec%o@<)R&y~)cTM4TM5p2=9C7C~LsI9=N(@`pMwIvvaLL%4y zs*Z^=%Opa4@F)-ru96d0e{e;b_Y*Y5n4umAJEJabmnL zWEDB1X7Jl3lZ{mDUZ^E*Pe|u(zm5>2aN?S%@`mrGS85C+pQ+3L@+Xz0SWz3SXrvJ3 ztEhz}3BT@tXS@-lw$B8%5DLFfw6~||M6Z}wI=frdsZSrz}xVWD+{w{t0% z2FYtHDdR~V+mYD{YLTMR+LS;`vI(f5(Vg!$QQGPEi^1>!NkF#0NHbzXzQq*90%rC6 zs_4d6owzp|`PFwNSdmlgDjh+N*;Ol$a@n}+aV*k#7dX8nEU4tfU0O}0XF4&~X28nB zDBKnki92-;)R`i0=K9eU5E#nNi$Wfd@1Jsp?W?$@BF?`iyXVrfmbMe#W~+=tHTzjo zLmyFH_AGEj#cI`IIed5_U~Uu4MR&tAtCXct3MC49PN|Yu2C}Pmytr+{fmoDk>O7nUrQ;^`Rc~JiHJq|wFSQk zZm|;5ZyQlWzr&(r5k>&QD9j4%<$mq-cqBdfs?&=c)4kuTPTYezRA;EiCz6$Va|NC& zKjZ1trN;wP&q3Q9Aw(flIkdey%E`Y7sp0nPKBd20M3YWZw8L7>4pFMvWh#rk$zEmK zw#H(LVUXPq=kuz9P26!!%F)xFw8Mq$-l%D*cSDm7;Q;QUc6frGH7`0Le)Y0&2xhdC za}#v^KHXY8Y7$(On_(Pw)lxc-__a>k1rg%`gs<+F7$}8t9?f7+QqC_WYXZu z7$`ah)4d8`D+qOc#lePI7y>s7yFcsSf&-u>URVnUA8kJh3^jXjoQHzh zfJo57IHhZmQ_kwlcM_GBOC4tlwlhbO&La;5J=DhY7;WhzRa@BY&6CzJ#InY;-~ij)Z5{ zc%=TVZs?F-ga^TD^R*@)PDzM;-Z}CuO+`nBwfXGP)y*ZfAc;hJH7AoSozfq@l6BAm z5RgVR`2`7QNorijil~RntC!iNW6YnY>b)gFEF>I@$WVw=TEl=S`v3S@7!(Ii_#5|+ z`1kql`hok}{YL#`<|wSA+@}V~q6Q4#L)1Ol0RGQ`Nja}`7qr!a!5pk)AL#<;4Cn=} z2^Z|{KQ(AgcVQ;sOPOudy_rl;9;dv7w20NbWh(6!?}P~`Yc68Yoy#{WLd69^Tth8% zCOHKGPnYwVu^UdUJjxU7tA61kV5+6~mS_pZ4WTh+KXRy&A&q z?yYiY^O(NMQ5u#a0ra{AK4UZZLZWe2iSF}?#i(_Enw?3P@xNLtmD0;4)NPs#EGDe> zYCd-f-U*UdJZZ(;+S5?A&?WOY_#?1H*xnq^H+ME~&%~)*f&>l_=;y%YkF6RQ#>!Yl z1KGXr_9cm-x7KqoERpPr0cP+>T0Fk^e$xV=XArLT@R&AUtwxblxQCzW1*bD^z4z_gM^7AXvym+GHDj(|Cmj&4Qz>nK z?T?KwHiRVm_cA~WTcBuma&`J2mdbKiV0T^vOFeZsUVsKDZ0$rA3a(p zu#ht3eV^hV%%*RQF6kP-gj5=_R?b*?&-q&x=red>;pBXo9vG@cy4fA)XDD;85h=>s+)_frF zJ3Cz|VDKmSnuT+&MrkqQzYHducPP2F(x^ZgClpf`v+Xj6G!SC6)h1tSW?!hT9)Sv{ zNf~D1EGzGbg3FbN@HskFD2N4fjgZ4oh-oxg8Ww@f+ekQ=9&n;zcz9+|5!4UTJvC*7 zLk&7-fxoy|v{Ur-j+}Ksw1<9(0bD{16ZxRbPtc%@u||>1t4}7f-CQ~Fl|6)5KPsT9 zU%|;?kJ6|>s(6|hFnR=&?HY8Evxp3)SME_y7jxcJpi4l9IArJ_@TcMF%u<`9J2=1| zW0grA89$I!65bG!l?6X_;%(3cAloa~mxAd}*35Q$nKe_yJOe=pfATqQ#v*lLdnYx~ z{T5@Ug`r;Kk$Q{CUXqbCvt7|JYk`T5;;t2dDyOgh_ zdO30$IQWG6PrX7%1!4r#kcKjxGbxW>!Gn%>6YEd5X1M+K(6k$#nbg|6q~LPS#$=jq z)mqX}j8tt;nNsS#>gBWLt1w-{5o+uo7?Zt9RN@h*pP0aDA3gmmaJ0siaK0D=G;Av~ zIj9ChoF`|j3eUWzu+WZdEVw}~r|Fp1eF=}YR%V`Co90!7&z z-#u|u4<@inueXe;VyR4Jk%}P(^iHcO6Oh3}-katKiwUUIcV=Gir@Wa9VE4uUw4WlD z+^gZz#j9ccH`h3*@;0sXk727C7*9n3OWqJc&}l+M!3ax6qz;)qnoZYkPwJnZ<7Ap; z3qa1}eGRS)#m_gvda-MaA4nPGeM(92^OPX!D5R3yY_-bXlK_HMrs@nwgF$ZFXXbIdxJ-qZG8K%?~D_u`L z@~$u#&nl0;_*TqL zOwkg0hp4fKs=R{Dj&>9l+}OD_e$I1>@R1SkzBH4ea1w}2ffpE5e-RDD~PORGV(oX`~`s?nm6CBDqv^mKV z5^aWsVTs|tJ`F&NK1oC(wvdIg_GX&f-9b2f)C35bw}NuxkiMg3E@o_tR`vLSLgT>cFb2~Jz_=H4Id(23f{qPqz?evc zj09ie0>;O-*Iw19+)lB+NG23^hjU+68~gn5Z8518J9xiBOKBx0d?LvZy`zw7qv84Z zlLA2@Qi`6HvECsml#UYi1MGz(sou1jxc#?ofR`mQ2*g+UXfKK)iV!|NuGyj>%lXLO zqqI8n2rtBvDxM6sW))pXe=hsc{>6pFHH=0Ctr2%_WYDjggikz7EbQxKiQsy8rML`Z zZekj$>B@h5J_lw2xV_F;w#sa`@LLidqDNGO8U*2hYFWc^v(NWVH=2im2_= zZ(4RU#!B@J0!*RYgkyn0H*16Y-+Y_X6j4qxg*J^`3Nu~g%Xwbb>xz*{f#n$X zaS?-RdBm?KkRYwF*T9%d*o0Y%fMmuoiK&oP;-x8J=z7@{4T$DTngP{e)bX2TS1yibBK0qRr)D2;87hHP#8X z;c&IkRTW~`K~dv-IwzA1d0N)806@u1OVzA|($XfWVnCIoubiqmMF!7`Rw2LV@Dqo> zsv)7DWE@CMpN_1i*y7K=O-o{;RA)j%5n$1o$@X=dkEQcCxMt{(5(IqPc4PCWSAc&{ zeU@Di*IqP`opUHPHR}cW zZ;U`oyn0;S)&It9>0hf*yyb+ECVI`uu50um|LvJ-jNX=n5GuD43L6-pUAl4{%D9!F zgIUhZ`ISC$a~!gQ10v{crO?dve4@yjQdH67TdR#yFQIO2x*@b#nE7J1v)dz3(S@Fx&7*@1&fu^++3xKzBq!n)L;?_p{sILCvZO*@^CwGWSeNG z*YtU)LImL|m@^gSxh(c9Ke{-Y-nN&6X>8$lq2||4v@Ou<8egpP5gox#T!3Kw9oTDm zvdpbyunO;TUI2}`5x8Op*XG_Nz<# z7fLUoH7ebEWRXc2GAYPZClJt95Zdj+kqI3NPH#S53#CezQI6Fy8`1`e6P#9>>}e&% zWW7w#^I2`;5XlS(rEMpk45?DGYtt(;T9>M{kMk3o8Z~I$##U&dp$M7fT`v=Brj59| z^e&8~I$L7Tv+KTyTD6cN+UY}Y6@?G<3in^5`MmglG@*$rk|m&|^dLeU@Uc-Tp);Ug zm6nZ8&aCIrtdJvK{}w7mIg!sqcX*!f0^@ZN5=(tf?Qx_+_M0B%@zi5G?RiwBng@Hp zU2;Kjvc4JhlpNwPq5LtellhE{b|SJH2?x>0wstHMNmPCc4-*6GwK<=?5?5bjMJ19u zih^e2WM19e&94H2p|=?!C`Rl}u2~KaQXf$-Dz0&-e@R`9UFG(-8AjlZvCzk!%u#N0 zn0R_h_VaV8a*fP!`;?P43nkt5-U~#7YrA@ASSS&2-1p3H`(G}NCFvM3m$3R*GKSBI zL?_EQg{?O2y;EI0Y;>5En!wK4A(Td1+Qyg8fdq?(v**FN5Kz?^6qB;Zq&!jPBlC&B z^8j^xleDu+Q*Y^zix(D;^;?2OAy@Up$~{+j=IGNN%-hiQj@?D$C{$$z+Vl zsj{=D?y)=_%6)x}bn7-=``&!{5~R*UXekbL{qx^Lsdba#*q?z?ri?!IVod-dSv(WA zd>#7ySbYB24R2F%f#JEXg`F)UY8Q|;conte6->eoB2O&SD{;;CF7eZ5Z!9U2PLP{y zPAjBn6AAbgi3+iIq+YNvr`#88WNbPkS$D3}Rf;8oXx;=70JTN5o)Qozu5J1?8>5J}?F*Yz<5N(uxNi{2%Sq^*LDW=bb z=`7ep6kRh#S%M=JtL?Un2ypT$hq9;WT`o0(q8#GiZ>R@i-<^+Q5zd+ zc}%B=83nmNdC`$V5a@Z2&?R;&`}4okWRWeF8~n2t5s) zS?HJ5=jkHmHOMsO{-K_2!(Yr-OkXc3Fl6>5_hqh&}{F>Tw?ck`m=afy5d^`p1J8d>0X=aV3rbgn1j;RS( zhQKlt5D^LJty?+IpucZLc)^gUX1xWE6NxJ+lE~cVq&(FSOrseqzdy6cmPNJ;$4-kB zmm&PK$+ym-8r{BE2x3}fg{8C3p^U%@V_dOUF1t)$EV{n^m4-SSjg3!IV6}>BV!JIn;!ql?CM9g^6U=s2E>=ffBou8nd-IasR~La1`IMKJhJ${}MxJ?d z`?w1tS%bRL@>0x^i}WQ$x2k;Nf!Y01+5}kvez+&$x)ZdNPb(-91e0uNZ7*Q~ z2UC&7vw3=G9a_3*r_545&i4%lB2RnQ|8m-?XsIf zEKn2bw{=l@V%&GYYf?dXPGS@HSAmOCZfP&-AxgZf{T8KOuOsp6Q?0bCXD zA}|SX2ml0#2|(=uycFQZ1?Va#S?1tohLB?NK95zgsy7BXrU`3VhH$42LM&+oSfB%J z31IOa1pbz;v!2C(UzEh5;9=)b3)9pl2vIxcW2kHvBfy}ye-M9fse2YlB}V7VUy%@R zAIFM#*;6mt!X5Qwug8w8P7x9_q6&SfK;a=(OjFC9S0IY7Q`_)BzN@GA@L*Q^t)I5d zwSrLcRWK%_=Pz$iq5%a8bIDnwD^fl4iQV;ETL4+Df$M=G??@ua?jV;cHD zip@8shIX_9*uhH(BTNq!`CR-pK{`Igafpvm3M|Q)K`g?i9;<=_*@60{qx=nl#sy0K zf!He9xJF?v?OQbXAcwa8z$_25os_;$s=_H6KFT8??Vr0kl6PSHai6$r>sc&--#g66@64K*@|*_TC{h3PN$%aqC2}^mN2f@31IIp zl>xwqB9``*C?SW0-9CatYi=~Lm*45^A-G*d6w^Q{B#EV(qL4gBe(qH?`&5DRr)9Xp zh(=!YIGB_29M_ccj{dhD_?9c@EZlF%bq@>pj(QA32HvXMR%TmK<>?Xlyfy{Na=wwt z`)Y(+7JVn9F2K{fY#rajT&sv2_^u_uMHL|hjB4k!dHBlx+3YG7SzFhdSyZbgXK^LK zx|V#9mO>;PWJ=%s+B4Kd^7OYw$4a(5^KC~S*3rr+dA(2CWUmMp!O|=@2qn%G&WKI<3U_m zwWZI9ID7jQPl4h|bAL8mM5Lb~*6ox3;(&@XtJ#Fb{dPU%Bd0bKghp6%61cepoG6IP z(q<>AFE3-JJnn0Wc&ZYs3ZRKX=7i;6mQ>-={otw+69%MpWH!`9)=uqYqu~e9)H8)l zht9;8KJ7$>`4Jtv!{z_da2kY$ba=5c`GyWpDeCho>k8FYO`*%(({h&OliOqYn^ON) zD=s#Wla-m^jCv#XRqD-x$lnn(eZ51ic|1TLNzw;a6z32>;ujs;i&`;No zYZ^!i!W^mi0xXq^OR5(js~U!~jNTCZEBOV8kC`!ry4*3O!%UfaBSE(;6i7?=k&qb) zV$!T$!Wj@EIb$R#_?r(>oJ<_&nmS+RsY~im83uW+$2AE9? z*fDtdAnW# zd~hKI(4%3<7m=RuJknt;fyt_JI16Sty;?p zF=D4Ux&a!u9!STnq8g7F-Zh#}j>4bpX8gvO`ez|Cb_^kQ$vKLPR0C7-KA>n4ZYP0S z45Aq-iHC|4ibS+!OgRoghdE1Z8>5ucHT-ejxVgcBI1YJ{-5gVYpafRP=U5#+Yc_DI zQ;TU3xkwsJ=Cot53jw-v+XOd27bl6$hvE$39NdndIzNY|t@JA19+4hC$2lH6gGA@f z@pm}1!Z@5mES=kAsE3!l-8M6rEMG)AMRM>sT*ta>3o0g^pcTYf8gL|c z21WfzR{1%lL@kvcVzqi{Cm631H5}2#w03`(-~n2jmv31-{ZH<_On{z|ODATu$z3fR+|u|hAk zfYq=fnrjjRgh>Q<+g)i304YLKDEp!W=tzgq6{7sOR%$Cuk`L0#fv00%n>yw@lbw;RSNh)I$m>5qM=6$6N@7TSbC{X-?_Pg zRufk0u6TSZ|MBs8&M>qDq!@9e^yWuIpF;^0Vs~Eblr9vCQDH7RnbW=K7dCmmwGzbv;~5KRIh%GIM~-kPL0!0U6uewOZYG3-w;k)ptTEyU$9E*Y2x z6sczGTY`P3M)kb#24JwYELf%KVRo^rQ;*e#&rdK? zubj>q!~R4do?=*NB?RSpp3^H=s?b5MGKf{9ERG9A;Y8JKj}9YEQfhH(vO-b*hhK_9 zIA(EC5dtv`HV8I+`i9`)Gf1eXok-g49PV-;4`I|C6H1Q6Fh6V>4XE^h$r2P57fECh zE=w2$jfg6&=1=Dv&jgrs5}EPD7H;tvw63_gQWTJoR_T~N!md$H zi`v5CG{g!5IEcQY&l(;=yxe{I%~G+Muh$`IFDVS($%Qy2OEr`Z5n%tju3tN}ZcWai z0m>U`5F*2cWH_P1M1`UmwPg7U=LA_4It{y*Hc;@1A%9I%Ee%+*wOES^ku%Fiykd0a zAnnF>x63+_Iy{Ja+nrjjO1ctMEMMrrQ6$e(nNC!zwvg>ol}qbg%G=UCCD=FqaCo|8 z@sE57O6PlGO7U`OW=LshE6j#27R!4t?8(+~&FMR#f+ZpP7%0!uksY}2RXutLfFx@@|_IQljJ=`7{?!>&YO+*TYil>LMCYD8=LDP0K zJ2ubDnyIMa!6-rg6WQVjf;sXo#Qfg` zu&)h5Vx??fIX7a6xJ#zCs|dmvM=Y5}!ZO#RYkU(YJMHj?njZ+9P|!TSJHE#?=-2x@IjcqfT4FnjE1u7+ zxF6WPSE78Tdk2{=C}rVrC_W1;rE+=EcAwX&MM5WDrHTR*O*$?NB`gkjx3CIh1O`ITmU&N<4MWxFZY@f@bj3X*2d^Y^j$dr)#Y$TPRy; zvrZ)`P=lq!AhVIGm)MgfqtGP8WUHsg;GGj? z6`x_!6|JS|f-sZ2F(XvqH=pZa^1lqD0V^j`_?vhdicz~#ReeZF%PoB|- zDn$8IEybET&nqp|X-~E^a#l5=mxJkopdg998;o@tbd`oegNdoq-wFM3aUqIQ6sIOU zD$3RBa}gCeD>v$a;ZePp;~;tTB8t8yF-j3vE=WMLqK-WI$s*!yYD*@=M2-;r*k!b4 zRwMDQn;2Y(`?~S%#ktNj=OW*%qc1gy@WL`a3Qr?`6)6W#1{hC*9I-CC)a2Uw7GP&j zyi`kDS5-8jCa7l|W(~fb#u)PLAVnl}?(_BxD!(It7ugIIZ;tZTQ zfQeEj96Ko7YGQOfj!nEwp;6Hj>LNNiA zS~@z={`#ItTyf|??4V<9UUOzQfO#{do{ftb=#5HI4&+$B%TqRa^ejpQxap%ju^iGd zLJh-L^tC1MKCf~J-hM?h(f89VZ@g29EF;e$B-^8iFIdzONWz_Df>XpjN!h@)E=g2N z_1XP?TK8vM2+uosA|yu>(j>{QvVGQ))BNHh3CR5E&TERIGWMh+Fwjj^tN7Iq(la6l z{Br?}qE4q7mzHG7nuBo(VU1R+3qE{O2Xf3eQQkBYOTXEpkVB6wVp=f5zJ%cp{2fF553fxBmRU_NZOIsE1Gm0ew{4rf&Y?| zn>`3ZRfl@QI3!3nVuWX>Q3&$}H4sH(9AVt7JCDx5ZH(piesN7|O-jDJRxROytFhayww5*tSp5Zw12k zGnq?~iSnEw*vX}M=qVmyAb*^7LJf2(mD~cB#x8|;w~HkT5s0wmNx#|wOi$ilsYwKz zG_Tp#Qj5o+LYw4OjtP78!^nRa=6nLLfPElR%~hLwj{agAK$&STivKTS7?DN1mJ73C z$eV*nptfZ{EE!S0?KA2^jEEwI3TJN}JUrl7*l$cO7CGd_e5BrRU`u2JHR=3s2C4dLhr$ zh`&zimW7~`uD*AE$fb-cs|t1z>M`CMQ4vnI9*9B;My-Lpke)8R*N6DYFE8&kow=Sz zER+a_8l2JBaAdU1DbUEjZqDOs%Xuh;(EnMg9ygmt+ev3y=(4(CG@v+Uj{|hWEehl? zk9$IlBTjeg1S;s#1$=wwpdvDuXXrq*0b(s5Eap7m6QoczVpLH*vopm~eu$kbXf=nV4>)^#!2Ps7%5zh`f8ELAhKPn<59E#HN(vWUfOsG5UbN zFkOl?8Njzz{EsVcdNoMteyf5?sA=H-nY_xKI@JdC;)g1D{qcBqsY07h{3B8-rV)Xf zs{}FmY+oG3ipJ@@O3`#R^hyk+XkOCQcQ~&+d(rm^z4R(I-mqvd(}M%vRfJrr?@}N7 zB&TBBI&W5r;`TWOAC+BXr zS`X)^X)ZjpINRllsx}-MPfznyB~_M4A+!t9Tq&JTwv#B(HdwIih zzm}@BxT46tsInY_MQ`}KJ-2O*Mqr&7Jt09=H5cs7&VV84iE6gN;7_HsU78%r0X@S-ecVRXvE9VUs}5xII5&Wh_(&QhuKi&}5+#k=L-&Ly_yB9HN%`?=@| z9(9}_EguQjWA>LiFAGZ%AOx4UR7FvVPsIRN$(q=+Epj$!M9oU@d8lH#x{nmK+r;N1 z#7(Uj%t< zM?f)~`tr$Hkkv^so#h*7%fGZlsodI}Ssl@s#sUZ>YD}70xk&nU1~@9Og;uAWtmx-R@EnG)&aNw@h7Hv zOX692x^zx?SN(jX7;W7wld6t=D{g2}xekmzOPGlD&Bl=saCo7uQe2#bBST@-m+$i2 zQf7;s_ra!7yr3MPjme0-l|2O`uxPEPE+m7bgwSMLW$sx~_1evtf8DB1`2LT-<3YODbx>ugx6L&uBJ%en#hg#!)W$vjPUC zI{IO%lQeVv6sbw`DvhDH%tN;-=N-_{gQL|vyK61NG0nffPTX=Jr46@)I1-4|>v7NL zm~F;OFuo(Ja1?=qmc>zGxuYZGMYQT^pAec_VzLTGGMCm1g3L(WZgGusyf?g<-xLkm zd-WtWA1*x_!b~>o!M6Gnirwqfo|R+HR4V7mB6&wn(0!9!u8ZtVUYYKmmunv+?WUmL z>^8;YtQ8#?TPcZyqSpnN$}8PKr3nE)&6u`9?tXZ$ol0X+zOU(J$xTMq*FR}lx-`jx z&3%y+;&_7Hi1f~OYy2_zYMJ=CChm-)8Vx%+xR|fDXD==kBCYmZrp^4`3o#ZE$k5FUAmHwkgPl0mJILHZ{2BxXH*(>qWB-*b2qT7H z^L-)kmd~-tb;-zA%aIk#7O73karFA?icybBHrse}+X}7VW?Et;;qaCJTNr1l5?Gp( zxW&F7QzES9KMrV1lN#`@`5%AYO(|d6$_1*mppF$6`V^tPD_*G33&ejjNj$KXbC#V6Hr7sN zgh_)np~+89qRoFgGUH6$TyJKrqbS&`B&V{XL*hAUN=8n^MdwDM^OYmEZ$Ue0M*uhv z^h#1m=;9mAE=;gsr>A{SEGQ~+b)SSK>V1eaU{ORYWM=?{N6?ndGuTboev9NyoB#*5gV?R1(r!4nDN#9#rctNc_ zag=a{d>_!oi0fbq7K}mB^4D(B4Zw&fD@yfchq6qxh)eKkLqkL$##wkS<%&VGjgA?Y zZsB4er#dda0emmndNqKP=EKPS5b@UK*=65O|aVWOtiuMr}G$;i9|)z zLMMfsHubX=JP>^wOZ8tSKYC0FO)34Ifet6%sD|qObLz@a4W#Kfh`uePQx;b)a0gMT zU|x+XX35f|l3m&dRwzXvl}2nEF{4qJkrih7Vc2t~EONa9g zGYMHIQw`^FZFaj{U*VX@Js9j?XlM|x;a5*e!r?GK8q+rtu+bTKDH_g)89t^;xo3!R z!x#^M2*}-o*k1q{^5_L=M+nQHCjdbDz`s7=eML+WVd^9-L>?@G(gL{lg0xOz!#uNr z${}D6sCK{sxS+*F%XXrGX~44r3}Zu#nkyhg)ACq6qSy>`GU;z(DD7}Lji0!}(b1O_ zK_RQzlg|I}Hc?OzWu}5{&rOxKNdlYX;v-&Iz6e1>*DI9Pxt-jUX7eG*jl^PnZkPK5 z!mckwts1y?%np~*o5aL%8CF#S#g~8SL~OkL-9IlL@{xY&H8B$t8=jfCPMNnI$1!NC z{WB>e98C$>q@H245fv_zlkLU_DS`>flt32K5MM)^Q+6o`v=i8gBXF+?gY-HWfN|Es zAW~pr_|X_Q8oV4c`*j|Tc>ks@cEhwqNF6Ovd`t-)CEkJMZViHQ7GN?mhVB3_pB46b zHX@Hv&0h=VONqQsyQ7#qLXlM)2^@)pV z10^RBx)v2QlDDPd8bCB59|VXs0~3bKJmSSK3R+%b?Q((J;t>go?2{>V_5HW{Ywh9( z$KfBKL9cDWN_1+nZ(;D;>ljQ4iDqS@DZ-V!k>c&16j)ra1f6{(x!zaR6ip+yXY!_H zFm>^|Tk2{1=UF5%?dg}N(6QURQXGIg^Zp!piruA|e!Cd?3+EF^@7;*=-!N;Ha?H-H zH{I&3?&dOu%I8mp=FkqdM3u}+B^LK>})T zxI>7KpYU89!i;6Pp`&5jFE%D7`Y8GGA(%ukLJXIfwZxy098S45)oH2zXn>M_3;bm^ zra+*i@=Tra-LzSzL3uZeIWENuTK-hd@a;S9d}x;C;b$l*K|C>MWhWPXh)9iqlh-We zJ^PFh0ahRi`OyG1M;A?vM!$TJX~n(;a(Aq2~XG}*ffXAfs&#!udo*+eP0#1 zauUfqUlxj9SGtTX%{K9ayy>JLMa z-}I$rE%Lo1P#YB%YOYf2mP~$mFhhtFY`jfS3e;jild0ZwK(ZHFjn1gWGercI{R`2C zI0c~%&xs`Tzo!C`#`>v@^fb-HkRlSA_-e(W6X@Snxm8hBHOFdF#9aMdC^4p~BVUBo z@NTE=Mi=_2L_fyEOG2e3tM-Stj6>wmYmSpPoE8M(BGpA~|3%|Sn6f$2$A@+G6uOm3 zo%d{dZ9glUEnye-(F8&j%1UtJgia^!L^2L$WW291<=bxJQ|1-ZaTqPBs>l#`nK;IY z#q;NvigJ!oqhdh#l6TrLfw~@8qt^ol;?NZZc$MT4 zWGJtf%wWtEZs&-27X^VC3<;rmU+@>CLBW=`3uvEenj=o(EvwUF}q}L0CZv_uj z2WY05pfFz<;Wy!&V`kygy7gN;?vP!^UFM(9E2t(xV2KI16~WRa>Bi|Y600^~9e7V; z^yn7j-QL=1Vj~lwF}lDw36huk1ro2HZy<1t_oD+Kl=;}VC9?o1AADkWwlb_sPTK_I2&<;?JyQ~>KF~nyIsaL~kJ46iPEAYR*zXFe7 z8U-m-a&NT#?3tK{sWQ}J26h%bG%4S4G0SX*SK|9)A&e#JCR4AE6+tae$|#@PmXsO{ z@A94WCU;UsrqH$Sg-pGav2$t~rm?~^Dj@^OS`jdHYy#POwv zihS|;FS?Zmk++B!`%M|BE*{xGtud{z3NnSkGJ1O_l%#ZBSR@I% z+%t!Iz@#ciI8qfRh(<(NDz`T-t#d0x{c(bgcoMqLq77L3S|KvuN7tU2ULtfWwbR^z z3;K6LOpaArl#HtpXLJ*z%G^RvpVC)CA!05bPc`7HS}MB%4MYB(KJ|)3@kT%z?-j@W zh6qw16K`sCWb&k*8u3Y>al}zmin&u@BU(~0PIFza*8JTw2nAln}Vq2P!Nfn zpQBi`eTjxl35Z^u9^$K6Hdl(%9TL)(;ObPYGp62!frx}ntidQt@P!+-<^`?0%s~rKvALYefl6eXw66~vzT^i-G zD(o(m!wn`S2tp=|z%ho%EzdcS<0nFr50)@VIq#2rsPlI4Y^t;{nS}9B?J=EVozdU6 z=!`<}NX&H=kVK;i9J=#t+ydVnraR^0#WX>hx-PEq9Anen&Gk6b>K5TrvJg7|JtG(&h~Mc^6i! zK8Aui+S!*XgavoE1N! z)k1!)a!a0UGQ8T-JSv2`xs}d_bfr_^SjBnA_~f9rsNgx= zkyD$E9C~Bow-_QYLORl1HwJ2g1)fi5C(sIl(P>UM2nbSo2_zL0#kL8`6h^MBGk>^F z-6RPbVp~b=L(Vm|(G+TQLWD-VwVGaU{FX-xHX~8Om^sSiYFKd_XJ!W6&d{3@MSA2D zT!jdLMzNKO=VpJgIUD4yEu?~NgtZiEqsDn8uiIovkx*n{+$`Rx-W{a+yx6k{P{?rH zR)u@JUKtOM+E!QdE+JnI1zAjO-bV9-5U1c78cqka0{e_wS5a&{*1vf-ZnZ5Qg6+tI z9u7wjqf5JjG7eRjS3QJO6f{Kj*P$mb9EQV0uP2ZczE{#LDE)LNU8O@Jw;2q86N`-% zmP&)sxvtHEPPYEU{pmiHjY||FuxB)3Zy(J9b_GxvJQ8{aQL`1mDOiRoHvzvhdp^V< zhL}Vy)#A7qET|mT1xku1g~(1uzN;*J&^;ItO_Egqf3i7uh2GBgjnNc_SoA9IE7mby z3-GnZZLy?CQ!?+YRgvi?677+cB0))lPLqcn?jY|Tf^Vhx_gmzzP{=j-2SA}aJNKon zTy7$)r>7=xQ=}^yS1Ia&DjPXho^L;UQ%|I~AR#s2Y<4jTwp?0eR3T_y59fu#uAq%j zUCMQce<$QpX>U6Wx_%YYcE)!XbLCrqD|(kitIS!(EHY*JxGU9K=&g}!@6ut=!apJnV?sJXt@{z%AKP{F}6@xQZiCSFkVi4FYs`H1jPBmSh@veN>cH z=&n7c2Qo_SD7H#-oj8QQY>3HZ>iT@awg>{5YIIw2CMEQ7%v}SfG?Lu!s9ljq{4p?_ z>XmDhM8G0E%cnv;QD>ZtT)Yq(+jwJ3%z}Cl*h?qkDcF(7F8o;vat6wY(uGMGe854F zE~X2*iPtcxSgA!l5X3c1h{VgNQHjciLh0&Ndy0a2VtXx6NoS8$i$tOohFFZLvMZA$ z(bSs-R`yv$uXpXSMM@$r&dhU2AG{3m?X-v0t%9T<1**;wu{Q3&9kx{Cxglw-W2>xc!nl!Khzg ziK_`Oez*H1fj9BiF+Jr(#xa~%s|C_jS_<|lR0%!GmH7l90Rjq5^E5{i_nRMoh8ck_ zEw+|Pr7GhTpDu~BXi!jIDU&!V=7Dt`E0XAnp{N%#tTTldf>F1UeS%4nxFuE4m$9W9 zhb0cVyo^CyEKyIEm6S)?qN_9Mv?9#qWdCA?X}5z_P=abqFl{rwp9=+-=J(QBMC)Vy zy~f!O2*;hbaUkuA!++F6Uicg9+M3X@hWvT_F#l+emEu+4tI1G8u&R*^^Sad$#$%sW z0bU5HA8erU4Q`S0I+5eDIufTYjzQP?%UfxVG@DOjWG##S#T65ou_`eZW zBL+Q*09NtmRL^-XYbj9<=y7aMuT22MMJl-CFPG_y5*?OJm^`EP zGTmXl9XRqEe+BK74*ijiCiZy`cU`TRyDa^DyIXY4Dz&6oLq)y!0;5!E&57 z9BGs@&4IJ%M>oyoC#r~vnp+N>l~^(4o2XZn+={tLTim%NEvzrzx)&lP;YPy3{g{?! zQYp+#)gJaY_$m;IVGLZiCH7YuQ7OO|zzLuU;3uFhKnP#?fCv1=UU6!lLPla(&5ba4 zKe+KKTSqHLM{!JHlkncEWcd>lqFvgPa>o(D3{$BjYFP7Vr_)zkn$~QPiu^*4K`4P8 zXXFRleZz$`IwD;lg6@zg@!Z!#TQl0wTQ$PV&jZ_{vr4Pwc6&W7N;%q4B#)3*h5tt@ zv!+Vnat%7bZJC4AVI50a6No(xi2)mcXcPSe9tD*b`TpVpzznhiCJvf*P~^dO%q;6q zd)bAxGgDSsI{Mb4UMd`iF<{SXNX$;>&$~@Zty2Tb<|HU8>r*kJUC>Tj>m`lOS|nMu z%R{=^0YheV5K8n`&^(&XuD)c4G2+7XTJ0}o+&7w#+Sui&eOI@IVU#ffkV@RmypX5C zq~a%r?;f}n00;tfa5Mo2&5CT~jy}JJMWi(#R>f#?>^}Nwg{agfxn2UxHCU=J%sJ6f z!RtieGIR2@vPFftH3DjUml(06eH%m0f;5?nOgxEo2)tB&_nD*Al~gkRH?ZOTFsTFB z&N15ygVxUMk#ZjYuh>_~mLIermka^|i9|MWPtb2mA*XhwIf>&<>P|)$d0u~hE=T>$ zf(aA^Ve$-X`toZj6$ooD@ngDYjB-0N!3{E&|Civs~`^Xspx3IVz2f z2YJ+cTJ?KrueSY1wr)*VHRmjE0U4D;p!9(0kNktqA>>uIHX9(t2?P zS7AGk#MI+B9tKF+@`b@t#r)0USb~5nt1vG;gzP7WTZ>c)?ibUG@s&59_Vq3IoOcKu zW9g{ipmx&A8+vIm#Q%sSA|vgpK?AD^l!QtGVSh1!5!Q6ltGDoqceKe|TOPxl z%+#eT?YULF6INxNt9E2XQ%mZfb!Ys+I4Q~mKm3}SOwKF1XqiFyVb z`39xt{qeLGJd&bx4DW?7gM}ZyhzVs*Xw{v{x9Sutk8bN0F`gjUu#B>SC8$)X%>HV( zd=*nPJkcAf1Md69T0o|Zkc~|^zlc%#w&I|m8)+k( z{5CCkt0rOsy6(_4c!&k?dIP=*=$QaIPzk*$>v~< z2|pJ90Ksx8I2T^N>USdP2H5|C8=0VWDHIEvk)tiL_Z&4XZQE>1m9T9>pI{E)pKKNd zslEz<1pteUYAcjG7I+BlN7(Vyws6+7`zdA$&0PZNc{C=_WDQjXuDsaJk-8Hxk1u2# zk~3k6AmRty6$H4MToHTZ*u&#rnWr))Z45h@}pY4-Zi)y7qQLtym%!y!$ z3Dis4eEseILQjw$f+8gK#bNS+V^^Ue@*Lxq5s`~;#6W{SR#K`p*3khKqKR0bob#=z zGh=AlLmjaZwlUIR%5!7aX}xSCnj5#HZc}9|nR_QA+YM$`WzeVX;9A?Ft3X{g5<*B} zqJrj-JII<>`+at!hd3ALH<&S%m4~-cUj$h?FSj36#}r7AYej`jsU275y&oodK}aE> z;hgwXg3(QAKjoh!X2o=YAu35$>pZ6-Ow^8GybesxL_Rv8&RWjNOiddS1%K(DYL=xC ztuHhvW=cNBG*{JiXGQ!722HS&)MrKbOR44FteA*xZPxXnU$pJE?26sj07QFR`hOUM zn4_?fjRAre@Z}Dq5Qk)=#JKgwtHOFik6}ymW0*hTF7hA+G^7DoZhFHl1b9_$wq3Hb zl8VO9*W6nq@Hc~&eeD&GQK)@^MFP5dP3yh@%>qONFE;{=US9_3EGLlR*`@-B3d2SM z_G%IZL@C$;Li=?k)@;Pdh9;6G%*Eo6_9Pyn`J_$Kayi^j%aUqSM{!p2ks_LFdqqk_ z3m87}c_tt*1Mef*OrN&XZQ?63`dI2|Ff%g3Kc`O)RNBmkTA{1xw|%eS&Ce3z*GQO# zTN z%<~0nh_rY`2PuANTN8$@FAe=wrly-l{r@Sf&o|XDsQ;3zL*S<|Ix#_*R= zY|TH>a?T~kBpy=rD?2S_NC|esL`))xD6g?X@oRYoMX?^ecu;qpL4qpX<}IJ{RsUP} z+T4g|#D^X^HGjxBGc+{99ZV_#aMk&OIciLu8J$Is2BQZZ%ju<62#r@(y_Z<=h`2bn zX8g0EN91R;j}qyOPCq7k*mM*Zh^$i>+~iT_L8)EzK|Y(iZ7#Tvnt4F)1dfm{J?#TA z612viJq#9kHj5~K0q|nspqft{=AJgScP!}TIs9C-20#7$8gdh>4TDI$m?ZIPLjnRE zQ4af1NoC3N>S?HFrUJzgh9$TLxCzwP~J{0Rl`LWwGB|D@O|s7 zXdxx|jVkLD1ZI%UqBJW#Tak2lq^}(TTnkjWnL@(k8bM$AYzFEc( z^NxGtOekY}dl@mFl;&7^6Q-Q9&6-w;SVAct?66sgzLSi2pqw{0>?`ILk^X4gWn{02 zjl}@;n)i1SZ~2+#J`&M=m)8YqVw)0|Px_oDITMrDsql)KuqVv>cl&JTh|IrR8GidE z2=ORi`9nD3W(~P7t15}qwQDymdNnz#8G=m1o;=M_IWl8Tucu>PN)XivD5`lYu>KeI z;uHv35k;;>n5C=YX_op18V80X>3`#(huMpo%>vu=2>|*C_2R{m`{Y?a`Kss4VkVq% zgh>%hFzCx6eYmTp&3SZUt`#zpfL?~P?G62J<7O!UVUoW*5!QG;+p7kn%322!PJ#Jb zAes;$O#i0&QG3Q=QLl_KTz5NO;7>Epy4bBnkTSRApGvQV#S~GO@(9;FdOI{Kc81R{ zF6-&jM{}9x>1vslOD7oCRh%76nzwAyMNmCjdzLktNTZR!PZAWmJCTXY3u}C(QJ^yP z;m*VM7t%B3V|2w`0Z}(^x@mJI@su_kbyc0=OC)#9vKja8B9-}EJvoh4=@a^zD_dts z`j(PycG0{(2}7F@E>ygh(QUE0&QUz$5v~Q(`9C0XpUs7yIzKTZAv@6t6Uq?(kZciA zWACIhFi++*Nbl&3qKs0!NeH!}A9>gKMSl32R`(lP`{}~Ue^ib zPW1@W6zN0Sm0^wd)>oOtJKvNeC>XV60_?GUPOiw74Dc2cNd*T?zj)a0i(MfBdP7e+O;8N37IYsG~eEYd7Qol>= zUCQCT8ai@ON%FDG8g{Wv(Ryb$Ic9QT{(nwCPaa!w5lN)BiP?emy{R+Rf?BW9Zd5W0 zI7XB=f*Grf@o!(hN~$TLUUj03o(RZJ#F;KFapsXk@CzczPaWF&K>z@f2VVrug4O|$ z0uxzq9}u?+ZChrG{m|4Tebd>)ydfFX2ML1FJJM@2-_3u%iy}Qyc6~_&i1D)Y%e2p; zsr^*N677B6BZ8kr5tgoN+yW(H zGgZq9p%j}lM3B@W(%iNRo7<3TrJ5pfY6DTq~<9Y-XkocFW7+iVu2VKm{?>6P%LBm0@ zH&TRA6@+8jD9?STjbUNR)&3&OVTiN$Q`J^CzoS&;I)S4D*K+m4l1O-6gf~k71PZ zpN>B}Wllwb!ezbF%MeF{VO9f2v@8&SdxD%qGz4m3{ys*TU_KVcv#5KQ8GMcl6K3pF=#hpO!Y5sr!fc>zhrtMhHOu_>gRKpCF)6 zmmUy?#R)KC!JdpKed-inDz+8I+XrZYMC(6O7&TaOv#C-g!R(S1nKOw;p8*~}*g}tx zeL||M2>2nqU&^F!wg=deDg)sfV3D=qCASqn|iDB)@AQUc@w3&kp&Nl6#xATRH+A4Q%<+U*0bvA zhEX4^CUFY3VF(oGsw|3)@ilbJ4r;`kmT0(fb_no+BNhh}0#u6TGV^`On{Htu$fU0{ z5v+LTyR4^QR*1AH{W8{y%ycrP+{#i6r<{8*#^PY$Z^t_B!wuA%Sr`?!&USkCF)+s9 zCMIB5Rtnf+>C~D`;?UsW$>8?=Nq^=4i`2lo>4*p)^9G&Zo|`Wzm&{1Hgp~O}y+tN# zrR@??iXJ8#W>A$Xm?rEOP|NZ#{J!)ph`|cQX~5cOl=gXi`DCxq@ul`LP;CH@qcqa zQ4Gx1twJu4y-5}3I|m|#%**u0-SSJkddmKUeL<0d@c88~s$59J$ZK%2Kd_w$8I8}_ zg>(4@0|jo`YIAaxV%pfEQx@3oje*f?sNjt;I;o6|SBU-*bcO-aBcTlU^Y$x&!t`Zf z0nN>{ZC9%+vw=|Zfl@=Xk_6h9J)(|hTND<(!Awu2*jPm21e3^oU=mJ_=Od#X8BfHf z76mU!dk;oQu#~sh#Eo`YHc3jfC*9L-=yjL&^T6_Mc1~r@tRYiy43tX(SJ;by%4#YW z=I;I1NB5#L5`9czV|&RZ;kC#YfJc^e*{<#4It$12mTKR+_Ii=Qwm90{9-N;%e2<5L-K#U-wg+UJu?nuFR5$@v6 zibqSWX1Lf4W?4<>jU1k{@0^LJ;Sp>yI!zBu5icEHY?qB@N?*QAlBl49F+ee{uo*ratU>~d2v7>Q0+lX@-_6( znSKN=+DQAL?hRf%$ZTQ1h{AaKZL=?!5qq-DL&?YM@|Z&45%cGrFUs8QOvjqWV}$EYXs!Awa&oGuw4$-K37a&Ct(9BM zI#&%*kDD4!xm>Y&Xu~lS)+Z%CcHpDFZi}7izE$9<=#N5@ zc;s%LngcyE{;fr=BXn#IbuF9DjSghAVZLfyb>?0xU2h`IG3kX{hpk@NK-ruNvY`}C z{}MVS^6p)n73*Tnk|qlkHt@k?68Gtb-IwfqR!$ecE#Iqrv^m=s?{(#WiD0!Pw<61m zsNaE3^()gV7krlgR&=-3hL$(At#t(TukbK`0#aXH5RF)aALvbfyI0&)X*I<4TwDc^p!u=pdPdhT+7s$OCY$UQFYvmwukd7FHwz8m>R+8S^13`R45S)k_pgDSzIV||v5k5af%;SmD%>3V&u1^YDGjI?zZdW(wE zk!v$=mOxtl`*3rtBavDwu0>)cNfki~o=3nSS9n$3vsvBI)0QfARNwYAQ$uv_M=1^} zT=p|xNem%kILvspEhf$KP>zT@sFs|1VsNo@A*jyIyHZh7l8R36{nGNTew_D`*(4SW z!iSaawRSkNM*+Y5Mr6z-lJGMe%r7^wG9l`nwymyL#B1e^n#8K;+U(HYcPU9M-W14A%oPohI>`_kAfqQ5&i7a; z=t83x)!sJwe}x02qaMO6$&zUWxL0{ALJnscR@(@s>)u5Z`6fI_;ft1l8D=R)B5o@} z_FG4$Qkf?Wbm_OiZW*yU>V7P@8~}+Mz9n9)3}YYXO95v$K1G>Tx=1SWmSe?enW61s z%{50&m1?{x-#g3N&!_v;jo~@g1lpBpeoD8Oxj4Er*Gg2QM&eZ?qd+%EUly0mDp=>v zv9@|5Tg^_qOAn?3J8N|=wDZLzpL?BmlPWJ?4o3X4OIO95&EiPACv>S_vDPtU!EscO zg=|k@GBms<|J*RY|AQ%+Hw4ZqvO4w z4G!bXcpG9g&_}VK7445Js_XuXz@k(FAiE=6uKf;`9BWXvZRaYyG$kWTx~=vS3WHKr zFL!Blgnlcl_MoLxaS%0k)iIu@6Yq7x;Yx&xIQ~%yL6le-=i151j*=3>Bxgk_Q0%mZ zliWuTEWTum?9q}-$9Cjh{B?ePqWAll`(~AkzF;=;Xk~MDwqg~iLPW5UShiLOr6yvz+M`^%tks6H-@&a^d@>aSsQ?nxaSxXW5!M)>O@(>V zD{XlC9ve+3PkOMnBZ8_Z&`7)k$5E0+(JR)K|)rYEGb5YlL-H@*rueS7*%+ zCHxvUdrR21Ck2pH9tlaZ#A1e+FF=z5<_Vc2PwVK%)8*`zsp^?6LfrL5OJ87VOfKVn zyVBxb*_;{)HjP1LGnmBHZnGQh!sWJ2`j*-362o=OuKmvavrwZg4FqIvUt$lX_jBFvWABrlYxtOHx1wk?$^ zN4kj}F7V2zzC*S=iGipQK}G0Ic(BEYcZcXA!B#7ESA}ud2_nFT!HR0D8SMJ#Dt-gA zdhB_6Nj|ANzhUqh497BUdSNw7@|<#%f-TCU-y^pqB6yV}7xof0Hd_-0!E7!R)Bwc8 z${8~^tV!ql!%!!fnjuUyJ`Y?&(t9%V73|IW;I(-W<$L=`h4FltG)lp6UJ*w^WFTHa zY!^?FR*qn@QbJLxSdk?oX&P&lr+KI(4@X)6fw|<35ogIuoAb%5&JhB5G>s+lX~UF6 zzwq^jjkLo@(td$UtB6${2CT5u4w9joZ4#msO`qWq_aE$M>z#f@F5hKxh^la!C&4H= zjbQ-FL@4a5mP1Q>+SsHq=A%HJD~dr9rdMZ?|E8&slj4x(HVDu-lA?DR_OVQTcog@y z8BZh4XZ%EiAU=e+bQuOomtEPSfPp;6z+R~}LNvrmeMf07Q&#k)u{b7IC#`c;VR%3$ zf-LAF%8G*q$;c+Rye`E;>7p0SYh^CQW8if=Y)HN2iwC0gFAB!7DwA~~YuyGhzVaeW zbx#2dLb2S1nz-bAG+6SM{i5QoRLKb|Zfo)!_A0^gXvoeqL+<~4iYqlvG?{IsDGFC_ zDk-BmCH*gITMAeC$>B6IoXn6QG3((}X5Rh(dv8 z5aT`nX^TZ=)*wXB_<5hJP+#DqX4kONRwCGi)#w>zh$DRjEV{y|Lq3b`B*VTLwnvn8pEXX4O5EM1$g7zG15uDSh68zwE0JY& zcA|Nx?#($pp`M#fxbJTCNW7E3{DlefbQK{!e&Eebt2rVnSSt~eMwZDNy<ZBSB$iS{XUc|JhO|NTt}!Kt7|(%!B$Injo6Q0nxern$C=h zBUE~2D(*=!UP>1c>{oeC=P*rCV&SGaNS;c{b%ijHOU60Vb`(Ew^{wP9Gq?I6%lc*C zqF8jSbVC%tbzd4z0VQzi*hC?-3kpdtf06~lB-v<<)d_(&WYHimvS3X3I6qzg%T}amw z+E5&S9WH_=8OwDkeI4ra-+Ep-zxj3?VEZ_|MA&YY&ZoQ zvo-`E3N{cHa{_5G)^f~=7&yo@cOGOwm?$7P0_>ZIh#~;EEQIKhC#>*e1S}9%fsABi zZ`Mmf*%pe&(P8A?nG`lsm5Z4bR+Qd>bZp&Vi7E{@N~`yyuhso4XltCEt7Ef!p$b4J zNSg!qg`y0lqWABV2s=;jR%D00Ag@mDUPqcLtz?-F(?vG$+*@rQ z+f|RWYtwf%MX=_3Ih$qo_x;qIv7air?bI7VJ#?dL zF8t`19^j-x!|yVM0Ek?aNY}8$AO(P7izggY3{!89_DUg2EEdRL<_Br_?yE^MlGEot z$K_qf5%W(E3o;27EXb3@`dEk(PJk9-*danap5W9D)Rn*WeMOTqGGUj*g=bED{38c5jGF0&b-D^;biYxdQB zL}N4x3^`4fR(x@0okJA*-lTBn$jzYtZf{q^MA|R$2-JeVOr;)2wmqE7h8Rnk7piaVULYMKphhk_g$#O1 zJxUE{1Q4=afq=suCfXh=2D{;Qe>0eG+$25)1Al)AIH$wq=zhvG3G&I4E*K+6je`b6 zEdLubBC7;2T?FaeYX&Sx>U31-NeYLOywyl-&WVRq#ngh?>if2EE(Fnb5YE%SlD-Wl z2`*+7qL5tlZpAOmazSxEC-zobzSKov)-Bj+Bi63fS{&(CNbzX|*=Cqam=!NA816K5 zUft%<{DB}t$*3o?&2m8uoiXVTee&7lDKbiScLJdZ3M;)&m$qV83b>P+;;MIe{`k$q zUreh2on&sNX`9LY(#ObLf8=mt3;`?r1UEx4`h|u-=^jnE0~suS&P_OZJGig)Sx9gTdTY*c(Z4JZ%95$LE$E2O@fzb_ zOWwT+0EN>DH=&d%5V9;W;VI-3laKRviouggltKnCrwluw=g}NrA(m_;(FbJ~iU5kuhiGCpSg&PP{6@wr} zJwXgPBsC7*Hy5$XZCP{#rCBpRL~@1UgW<+~uUZ=8nNx*-Ilm;GTL(D(Gvu(gD==hZ zP*f}3xd@@j`LGc}mb*;EEbFYDf+w7WshD#_YaoAwGsKb~eOeY2^xkMt0uaRV2#1xa z{}PfOS7Aj1h1(KKQXneX@Ok<SR!z74vcAqZ2r&6q+Ov`nB^V>=Lj@a z+sM%S5JCrlDpKKMAX01vUEeHa-}6saMG!zG^&-e&+jfn^<=jb;cAHMK*&p6T0BVMJ z5*MNsO;4*0=O~Rj#u%)eS%EtKZ;?-Cq4wSV(l(9r zSmo4QkXx8cs@5ZDO%(38sz5RpD1tU&ZPWg5*!dWN>pdVmcaoC{tHgGhf?< ztCx#ZH09gW`I&ZF(3h%Y{Bx8*W0p*M9#PlwnFIA!mNh0{@poW#*?FA0`=To!c`7y3 zs@=bYz2P3z^dX6}?LS7<2tmwQyBl>Sp-(Q)C}b`PQdyj!_Evq88JlvCk^n*G%eL&& z3ihF&NITctgG9p^m_GNQ$Hr?1rJ_!wtHS)uP1rhE&X7DS$iXMo4LSZ#8{FYZf~~aX9%jCBDfXN8#w~w8URdg&WmCWO3~q3W=ljf6)tp zmB4_|Z{uGl?!mAFCR^`CJ=5(J?fh-}n{VO@QplV>M=!DX66CEg&Ti#ibS+m(B_vHI z+5gmfOGCBVKulxUM2|B<@24(JH5p+X9S~(-m@rAu(DN9YK(vJd3G?EeGw@;6k7T*-zd>o_M z1L!zj%B@Mu&F%=Ao=|egL-L(^U4{u!BiDSuoiXVUlrQQlVkj{ZI{zmGwP??h^?+3T z%JMeXO@m*VkFh;pn;apTO(UQxrq?8SfBb*wHHAo4f@xMdkwfP9LH(wYgO))z$E_$J zapVC_3IYKPJ(^-LMnhg`4!a5{MMZ`?Pg&NG96f-F%r`@qGf0Y!Kck1lOB%%K=O?b> z?!qO^+%BS;lBYimT|J~|>J&ec1it;W2)iob#YBpZ`sFlJ2@-VsY$_67-Q~q4^0sd@ zF4HK{-l?X$_nsC+PkEIi$)h8bxqC`c5ST5#>bJH6lu?=t)7ow(FySP(*aY&FE=XmZ zQxnR%$nccaL>ZQ*7L>u-xCKyYmJ3dLb37^TyNWM#;b>-+O0jm19{;I*7S!GrZX(Yw zdV%rAJYqhc@KnM8ko&U7!?{DtI=gstOGp-Fc|0M=6%L-Qs=3sgYBThOLk_krRETqx z7R+2lkwFc4T_v=q5X&$~0u2gU(9)tXD>=rpnbhO#falbaLbjNePBOtT%}m=TnmBfjTA{x(v#d5eUXNl$UCb6epOH;6u6)+ zd{N5@DFLw*{MH}tf={VC*kE=$Ffr@+4EgSB!BdBr2Oj*nREV@(w)cv4nEYo3b)W-cS+kM%ZrUij0=O!}e_r(}q+ zh#3pCe_ohD9=rEfbzZeO1ND|SK+7WXVqChE|&2GWML%2Qeya=|5isqx}sqI6Uo&qFD2qe}o7f8KWjU%(!w* zf>~5mC;ZqJ*2HG{oT*XHoz_Ecq1|y$OBzYntHbpd$ydZ^=II&W!icesX~lq(>*&E> zIv62abGt-F9qNJd9e@BjGe^+Hxboh=egjosUL(U_STzmo8#wY`*Rx0C}0qhv2*^iVIY zdL>GSi{QW4W3Bx(TyFs*)WN?}CGeqpG9p^}Y}%jm3#@<&vCf%bfU6^*L>Z#Ae=bsm zel=t9fZuf+L^dsIPw$|XXJDnsh>e$+`h;NGp+PKZ%9azNJqjJ)7uVI`38?`;&+oxD zcTfW)a$N*?QOu=UYua4q#(0GZ#IQKQvcV?;;Eit5p+E$zq_%@!EGLOM5=w<&)^P>X zVFoqA;+zho4Rj5@4*(Cc5q1)m5sOJkvBp?uhRVrMrtw7K^PemBeQGS6ZpW=W=MNahzsz{HOuu2s0& z>IqMjl9tXmkJ5IEPsxTFjAW2-On)>zngw%^CN|F}B%s80Zy*)DWBe<@IuM|h>lC~3 z=oc;cCe|lP=M`$#XHEPRTE_AN8L+2%p~YTFJ{f)^^hvD3-46Y~&7hfkeKFMztXp4P zlcyO{d$?C?d4Icz#mu=b6yxME!X1iB{r$gePxRSu(%;xMd^B+7clVa5<4H}WWTT_i zY{Qi;mx)H>Wu15^6v<$rQdT^8o@1s)6~CPmAtM*8{54ii5}qZ zp?lh5zI>IWX3{8IC5VOMS@Lg;Sr??!}lwIhK!Qh&c!rS*m*NGM*l0TXk`kM zTtJwvS6E2hh6h)s2Gt6!=P7+pQ-mK9q*pS#SpCYe+}iy@E5}c>bq%|YN?jBpg`ubr z0G<CIcUC^XuOmEC_djf{>2gChw=)=H(ss43g>zOyWD zuJbT*)YpVYM5Mx+Qr5J}xcihX2V7C~O`%6vxCG-(e3UxXUWaVP;x}}n6Qo;2eT$Jg z^^%&>Zc-gHl9!jNC$o^M-ir)zb|OOja++!uxpK9TB1FiQ4N#*QV-zvPm{!-H{7UC$ zrc%*J1Q3)EN#kL(X21SbvDL!Ck~K`Sm+~^H{%89H$%Jhmr}5Q#_jlQ)rv6$mKxZ_ADq6Si~PRY+t)Fv?uoV>teL2o8aIR!8}iq%G{^> z`BwZaDoWP0E-P{^qbhsFrK>Jx9GIv2n(UJGoP_-vgb^%OGM7(u&cQ3`|5ttwmT#N! z%~JcSFG)}6mrd3o^rCE=h@mVsg2*I=g2;^K;YzZ9+WoY$>NdGD7@_w08lesl`DET2 z9u7d{c^U#>V;aZMkTegX(ju)RVrafeF`A9XL}qdp&%sFK6%3`*Ro!qzB_X^j4FhQO zVJ-LhqLP~T)?doD+MGAMO~x$ylvX_(@b^$0jSg44ry+<&u#k7ZTrOp%55&hvD^sWp z|Hp2JZo1p+gunIB+iaUc9H113Vc#y&herEg}rzVTcgI4gpoMCLIrl^5Je zp^%*9{hC0d%s6w|)U}}{Y>$Milrs`!OzF!utlO7iwCf}aCoAzFLx@s^(wHq0jZ#H! z)A{A-Ybu23^?5nw0-s8US}ZdgB_{jVwAQkyc9SNGQ>J!w#rxoh`U;DPZCJWmggUPo z?7f%G^1dOkwT1vr_$wyibq2Uns)0nxjX9=_V5#)R#pF8g40P<{mU=deO?$T%Ib0Qz zm6sSz`jU^;#x`|tJKv{Py&wZD;ghBl*D*d|I5=DaSO5XZ*H{ACU4SUKQh-ys7c=^_ zBV_{yKD?3*%wd~|R|Czw0T8>)4|1K+kBr)=9@+KQY8$u< zzh()=xG|bJA>s`thwFt5l%ViE8!A<}({SHFN4&)qlV4&-D<;=hU2^6Yb?ml=_wPt! zuK+-vXvkWXrE!pAIMn=Lifj&1oQIg}f-0gZ=sCD7f+Q=8P|`oqvx!P=4+3qdH%Afb z-7AC!Qw&Ps>4R%mp48-w@L@4Yq~KS@J=PS2}I*a?V_m|;K}b!GObqdEmu>1n8cjrU(*O4H!|E z=owzF!&^;|S0k;!3>N4(+5lVTg$_7o1NTFMK}!}?_{h>UFr8EcqIQ3W<%thQ_*5Q6 zr7*O3cbDndnch+EVBk1?2kDta({E^CE!S{g+>@q}A?Qsavron>tQt{)HDNu-1b+g+DbJ!J1O!MYIEmMWrGg8tQ#3*56^IATMwxA>6 zu3AGdO0T+i$<5%{X>)c1izCu#u9RS~eDeYvPlOV2F-!sz_{qo!szXu?EHahsaDyUQ ziXgQ}U7TuaPHR8XKOuC#P%71CuYqX@nJV9v==jP8ir=I%oCAWpgyy)II;V0@@K98# zdkv^a@9}Or68v&>pi!DQpkBMm3XpJu;CI{=O3sWiu5HOXDt- zaQ-T@O}NRN^P-yfg`8s;StwiNOK3dZ7{EM74V+Hy1bnPks61D(w72=JN{^F=LZ#8D zQjqsSZq=sdKL|&{OJZ>tD3PjB9$zw$%;*L`S6o6uADE^?mTd5mgkX`2xmdKkH6=qp zT-To_p=rz9L;#LH!%HekYg;Y;#O|}_urXe9CX#qN-BtPwH7%~a(-LPT_n_Q?5VFy6 z82Zb_k{{}X`@*4CVR|cV27yJZlwWn#x4F$^Dn5c}MQHh=t0kOkHi-?Yi>LP!^6N=L zVsYbl7!Q~@!m;X7^B@nXwxQo{#Wz+%4Kz#$EihYW%M<~MI>4t(){1M2Gk4fUY1w1S zfKE%X>YF8_?z})wDCwo;;!#jZxUY(>qkO5WPGb?_%4aBh>b(K_4{Rj#hD_XEU!u4y zueD^z&yeM`K8F!QF!{B^RilLx`aWy>EhH&8JSE-6=4EK(2Ce;!z! zHmLCA(<7%FU3hQrVUHbA!DfjrTXBFs5=h~SNd#TCkj=qd;&M%8nsc>GO;Z#^k&UxN z%?)X<$FCw5N*=B#FNo&;jGi|FgCZ{9Vf<6wAoLpc%dH9XjCjqYA#%Doh&CnsUYRd) zl|jL3ECN0nhfJ3^b-M$R36J3^a|bDu;?KE9+qd04`djCiA`&Jc5kuP+s4OsV?ANSF ztp_Pot`vEsMpGeMxp+YH8?mMPzx|e0k;b4s!vvN&woCv2B<4>+0xhYD-k%(*Cp=~x z)2S^XdsLKqGyD31G6`d$7L5=bz*)qtG+!tclV%5oh-_ZaAOSFY5Fy2m9!A^>m#4F! zWU20%xZ&8z)prW;Cqj_F#~&OIF+e%UnF66i|J)|Tif~1hOja#VqDB+EjBy1&xDdES zu0V0X`;Cx~jjFBQ%6Sko$O_5li4gk`LdMfhCp=-;iQ|GR{`(&gX3=?En|T!AIl*NK zIZ8bPN*Qx7WV;PDusNeBIg04hb>4sd6wpxwJ(E*#DPxaD3!tYz0zxDn@lFgdSlt6= zQ%PzBaIkqh;pX)|Vt*zRJxRYYadOCW^lE*NPEM*lKL3iKlFqEU#7;HWDlq}FBjF1O zXtpPW?;Azl@oj5Sr=qdb%CF6LY4E63912l#v3VGTd|!Z^pVX4N6*-b&VuX<{5l(vf zF&mki7khpf6CPrN5k6WE?MqMyRv{LLQeE+~*Uj*I7>AKD@(6Qie9H1d_e3Hmk@C3o zk^FL)gHV4#g@WT$YNy#RgElnJ+u$yQlE+*|PM?Sw+licaa#iUcR*VJuknVDGY ze~~(}8OCmtp*X)(rcRWd!kr#|o-M#sfoc`zy)VV22FC4PFv*4dT-ARA!gLeTLq(`c z1*hq!DnzO9AmH z{{QDbQtYHcqBmw_3nWV8=%r*ru@f-7c68E4<-St-ti?H&RHGnzjZbV9Vn8&Cnc%@J$eu#u?~!Vq^2XXM-oY-pwNTd z9!h2~ZI;0WQ9Q*DHrQzic&1W9gY&J#rtsbP%aug&O=oufbDZ$hEIVa-?(kKLIJu`q z>^mpS>Ih3}BBYSB31ic9_pZmaE{Cv<63y?308Bu$zcZ26u^kE7>oVqRHbV76-CH6c zV9TDqVs)IQ!ekyH3@xFc5VRjIS;RfZK4b1q9O)dB>EoBbG?gSGE?`a>5vZuH3K8J?5X8I<2xRA-KBb+~=D@0o;CK%27(IkVq(3 zT9TR}4)~*}W>Qb7?p>$r!l2ZndtF1;=^)G$h3LLMYBJbqylevl&>Jj|QzCeEDOef9 zIzv}#Ot*3u&=_T!y zTV2Zc9gnomJ-Pe*c1#JM5R}gAVk+vg$2EFmyhr`{5}Kcf943a;N=D%&AT&ND(wVh? zRW^idW#xSr5eIOv=Z0YEMlEK{NQZ(x7hxSgjn~~@=$4YXA}AJApC~{So@aq=UlStn zlW?pA6lfbIp)R;TM_gaM9i0n0p*kcB+AgSYpZ7y=C+hV|3`Xwh@?Gu>f)~S zrTpT)iz%0Gh*+Pbj=#8)5}HArVI4j=%BwwoNUbH+RM2nuwmNU)QdAQ2ltqYNO_3{9 z2aVB+(VQQ1+ERV)KCAyyr!}_n+5XpW{N55%>ShrgA+GuVx17MVNX3b72!;WI>H5xh zYK06{Mwyd-_uUJvwfMY&sPC|dDe3Eb7CU35TA}|iO9LvHRZj1~=-CVPdh3l3^lZfP zO9Y11Iyrjdc_Do!y7?c%(39yMHSN3=9>ZqT4TMvW;&kmyZ!?!DXPllUzIF*$+YX;) z7FyTFwj>!5*$Mmg{-=d2AJ0vJxhwJOVQ#f^nA(fxNN#CAP?5`oZ!Wfzb${Nm$1Y@v6>tiQ1=X>yeZ9X_ORcgLzRou!e1D&!Axbb(boiPv zfO{9Ro>h|*c9W$762m&m*Z>)i$D2?KQwcuN0i6PbV zdN>rLrgQbyPj;fK8>pXMj``NO)M~^zIai;AroJ|f=i{kn z9n#y`*|%5z*5ggCk};}#>U@fJDbW%zs1(J3|EgSaB~$S}{}S-c|COimb4o8_EIPuV z%{CSug#WG)C4382c-rs9)u^=t_f1(63}vg=yK=uu0W?)tCUQW3Dp#?iAMZE3as3VP z*XmN-rigiXd3iOHUL>Ph7? zt(ii*bcIZ?9wJ^&?FBWwll2y>J1aMfcjBq;)5YgmSgG#+wS3tLKPqCVH>EMHchHVI z#GyWKdS$H#UrTIVr>R-0L9vpTjEWWl7&>ix6-`NmhG>KnWB#|BblwwGDBkOi`4Fe_ zw|}JWW$2|6rJ7S7*0;|hIWHGCpmEYj0$L#?HFSL3rAsin;%zYmlV66yQ4(W$Hi)j%91cz> zmGi`mVH^pAaznZ!Us`lb6?gG~IKnt(4KYi52_;}4(=K4VJf?FMQ5l9F&Uh#7 z(Ki%U!en8o&%@Yy;w6Ggu1rdpTf-7q!ukoz&Nb&WP0g-kPr|pOL;J3h-1f&LQzOCu z#_+?Z7B-U`n^O#s`lnZ4&%}ezXLA6Kw!5d<7Cy~#ZpEDp|G28NM-_x5*Q?D>RY)R3 z66uPxR=1nG^(@8PqV4-qXn%v*HN}#5(bvs8T6mS!*0->1X zph>wd&tpzU`NTev|4JR|VpGF`$)Nd>i$Nw$m$yL#(g`K7#1L*7~2 z?@S~Q8Y@Y*3Qj1^H(>;POGr5LmO?UNS&dSp6;a6?gA8HZ>Se@sTW|8;B}zU`3Dqp` zIbR`4fwwHLyAbM$Srl{33SZ10L|CtvHU&r)QEuBsa?{ic>F&q zy1S%gmvr8FIU*PX{NR)`%vBB}{HLeY2Ohw8X8{oEfUv#)_*tkIK}-{e6lE3# z7gZPF7Ht&G<{o0eEP+osaQME>VDJTmT6+iPaG0fy2Um?qp5j;9N?6Fpe`JK6g?xg` zdhK(v9-RAbiMN)hqbVw_ZL%|`aol~P9<#<0Q4c~8q`5S$(IMZtHRh1t&(;PoLWC2^ zDfd>_UU+ZAuEqY;Mp56q$k*2EiXf|5({t)&9Zwe%s);i!_+CQ)W?fN%qSO)NJo*R& zwsG?9EkaNuF8LQjtOn-G*AsOic|QM*2|gG`03}86%e*9fq`7;0OnQ25xiQL!$^DEI z78JFE&M6~;DzS3v$F(9~N)0%~(*bQ$#(KOx!63p50#z_bJ@sTm1XUihOFVgX1u4^> zxPy-XFpOD}E=UVl{bSCD-8pu=a^j%7|BSS!p@=uCsi7A-dXmNDA9LbFL>>1oY+26@ zfBs8aITlP~;iMR$I-<6g*bvkcgdvv``?@^(5$>P#mX?#0#aFyVCW!rXzleH5BD?$6D$c9dnWXTuc`%Y=MdTbSm1t1^YbE3IV>S`aA- zBi%{gu+Px480EvfyfM*DVdjMNi~{I}f4dSY6L>}%2HWj_Ks<5~+;FyIh{zJSfvHts!bgR%L!F|=Zegn&a_Z)q zJUzZsO{q2z6s(~krR9eratjGJ(7p3jxwaqJ%ed>m*eeSt|M_nl!fI*=9n-j>Xz82cYQ=07RRJjlWB}^;r=2 z+(5x=Au6cRxXJ*F)+|xM;G5pv#&F$8b?ZBxNxc$L0MX`>1n4K6{;-Ny*hI%t5Q@n_ zHpy8&T*U8$J+NW2#F9=xjoDnAnbP{BCffRW)lthG6+~E7nmH%7l$Bplo{K|BUQH5y zOUuJTs2Adg^?2{58H7B<36dvN%$E8lOdYPYONhf6RP_I0hG1BToU%t-ZCe<88iom0 z(6ATsc3Yk3)buQ)ZeGTelA0Ii&1`F@0uQp;UB%L|&Mg9;$4CM``7Qx7B}uS?(^k|( zr6~_b13{?{PrkN~gOFYnwxH0I7vWpcpJwks5QH@a-%7!v8AV`4tZLo_yYJ(?*&z3e zDn?uI+bc1g0#7AUH5y@l?+qo8+seto}1Pfyl7eD=qCN38aQ9plHN@u_FA z=JiREgb#uhp{Qk$shX=$ge7Rr(K1}PNnOameEz|3MX*lPkw5hlq&PLli`-I_ozOw0 z#u}JpQNpUYn!<0MK8x+8O&0ov@kTwGjgFFcxw9ZE%au;U{-X?o%*OnBH|wzDvVMHH zo;illS0Zzg4p(BaDo!aOq@|c^V}RYd?N$QoK4EDavY)75L`VJ>^);r4r6=3i+DnCX z19a1J)|#ZEi#roqrB4uMYNBG)2kP~3@}cuJ3#C|opqwjUA~8XBL5`-%*RbEw)Z*5t zyjK_|keTw1k?bGG1LY><1-mw7=;gj*x|kK9?Dx*FQuBo1h?A_nq`wk4*BmpYq*-j` zBU-2seoNf@_qdbsc)BS?nW^9G(C_x3<`I%>#9!7WOaAB=emNd}&k-1q1(5NC1nyi{@IMwlIC@p^d7UDhBv0ebt&aV7YMHb z0-mNdvI@HDni!~~Zs|Rd)5$840?6FX&&5SVjrrbU$YZ7=dW7gYKLWK0XX7?Y0LTRx zV*|+UV_@doBQQ$~8zHBuIC{&^yQN``V|3mL)+U>Ptig-d)vnDQ<6aKkTE*;r=_S!yw|N%E1lx&|?(>p$4++-IXLI2b9}ALwT@LcI1?s ztg4EL&tV!#IDpvYs0ma+B=k}a;Hl?SN6K%&idC1wNqmpKA%}C^(6YWMDH|vT0bC~E zz3fPW#}+5Q)KD@13s{WFa1z;y%X(i@l`5Yx>OZm{7=q#PX9o6V+&BC5vS7zYrj3ky z>)V;M#DG$sg)3pTNNo5#c}JM%6qLBMT+jqcf}LeIn+C2#pIiu}#|PH^+DKQqa7Zi@ z42#7LR>e|xN4HSLnp#m2Jbe06j4X9+W#9jCl%mtVNNsw<<|hmpfIq(2)sZpxag? zko;b8w6uOHt6sftFt>UtFJQQ}aW!gvOj-Ps_l@!OC$_xl%_j7_5X2cD%(;;D8i8d z!DX#zkpQa6`2R%t$J~HTh{kGCg+ZX0mOuNAg`(6d&AJ>=3WO`IN<|g~gvQE*M-E* ztMT$K9dj8*F)FxucXbWI!3sH#+DQI~wR#5fO;Uc%iBeicqL1-pBe9TP|K_O(Q~rc= z^3c+483lyI6P)1YQ9{Yj>Hnpe)qgIXL2!3QNWH9#trlZ2IzGtbY)YGjy<{2iM9hZ1 z>C~PhP3rK?bMkx&+W3s$tOdHTu^$esJz!ZNPJ`V(qGz$Up8TsMZW!UfW6uqR*{jRfc&^weAr$Y~rg#ecF{vKB>!m4;sA9zi(T0z*wEFI|KS;1t#q z^86&j`WmSByp;u0RuV34u%DH#_y3g3<~{!BX9)7yTG9RCNo1p9wc z>sz0FNnPWps~r^lnx9O5E^v$1Hhe(O@s=-<`v`cgF9v-Eyb!1N-a^shgv8!9-zTo2 zaU@EH#G{(ga8k|&F^QFly^eQnW01&gC=0KT&Q$M&G*3(f)rfMBB| z0-2*AEzlk~P~(2JZaqI)b;<)$M~#mEfPxJU7TvHbs`pOwMOhI3n&gcZ8TMeNg0$=7XGEIOTL~#;;C+GX~+Q7U9g@q=(os)Ev9tz z*jaNZcg=G3=*N=Lcb4rnBgDxuG&S5@juFHRQY4Ncg}`G>=%vL(rMk+ZB5? zeYosKg54!@Aa+YAO~N8fYreu-D?0UuWtk;$TU z`A8g5o>9gGycghFgluUKT23=2!4ztrDv@F>*C^UFi;?Es_n6z&jR4Z-^dYt}j%}gA zyK;z@Bm@;A(7rQ`X?Q6#k;~<HSyf((+iejl+MSd^b=wqe^ob2D?I6lQ&o~BlxF1 zOU!gjHLD95Wnsq%G7BU7wq)Q)#v6 zAdU&}E(;UuNoqv3MAw-3+y+Sr;ym6*H2-F1_(?tWvhksYDp+cT5S0t1U!$`>-i)H& zOCMyY{*6J+5`tSAJ2ar_sz%)0@>qHqTbMv7TofE*vYAiEbK}pexc2q@kSyuHF#lOt-3au zWX_|IqN!w{fG{?2+au--<(idA!U@5*d=s+18Fk5QngY>RVm4Dr;DjXnACsFOR4*Ix z9%}p%)0#+&5s4jA{EwFMJf|6fK^*|Y?GD(ENO_@N%Q`i@9F6zrD>g?S0RYZ*hP{$Fn~cbffn1+^;t5$T=r%|xbb>g@nTyY4^PY`(3Ggb%YBqHQTh6>oHaeW*$yYMZ zE>RbM!8p`2s1f*(QW>wdnH6iB9GcrdmMU5m2u^Ge@SkXtMeiSt`7zb=6RDgLcG8(5 z-PHhRX^(QRP|+xGTQl;2b8>_+BV07Axd0O}>;$A}M9gSHfC!*|PP%)=sJDw~d&YUM zH3J@Vgbbb^Q^1htR0*;&PNB*k26;1dP)cE{=Z)rvOdnH@Ev7JyII8a0k%*M3VY-VA zPj6=zCr0_1NVylJA@NwFGbiMBDtkF&SGQC{mNm!>I`a6(2ze}|4B|6rsyOmxbQE_EdnQ#~Wl6+Ogm{OUV8(=%lr8k{ zrlz9~5MdK5f_x!IDZOrNm*tcQ(0CmbR{oYE3SJoFN{T-`3Ns+|+RAssRM-gA|4Ub> z#fU}1p9po~7?b-A7$~;T-W{+YF}j522&@#nI*>JUl?p7>OC8_n;W&z(teF)QwjgtL zD;;&SL43OHDt#oW#yU1|TjM=_;)x%;mOe^>aynJW#w!t}taTRKe{7Yh&1wcIEXcFR zlwMnhdLsc$&)R$jwz4de07AW5p-lSI zYAK^$Gy--krHuz5+&*ww3WD}PMtq*XX%peywhbO9=x6poS;MG(NH|hQ+*XF6*iO}g zl00HyY);!^Gy!KRB*{~{{-zF!W$wpqoZmgVxvAxGF?t<6i>#Q>Y^P{S zc5C#P`|~%@wr`mDjMfPmnCf#$F`fL-;U&P46`}&4s3lUy{&r@$%}5N;DyjN^FtgJ_ za}2hGc!9_tQB)Jh4nuS_&o#pnk8QRnBBcH(Yy$S4pXoBCvi~+V!iVr!Q{Xh?Kt~qD z5xSxk$SlLeC**Xo4j~goyeb*iENcNLS!pKfnd#?9f|)0kMR*+*zf0(JVHz`n5+uUR z5=4tIkr1`lUKRmB2=JH?wEr@;L+onCcp~rnXhTb(5k;|d1p}Ml*o82&q9?G+6fmR> z`B*<9lssbQBO=UE9tPR9`fXLsc2@QM^EXPmn(>o+-3YENPJU?SX8k&}qnNQZ`4FI7H^SK-0G(i~}* z5j{>c(>VKVnZa)6Go16QLMo|eQt07FU6?aHQ!@(lozb)s!wkucO2&!4r=4(r$cB#612w4LNjtmGqN{=Qkp@v?!?3+pycC!YIR9 zQ;;puU}(^dj*SU>bNOjM`VC9+3Osy9JLs9vZ1 zcN}f2q?uoJq7gOaV?$6qb!PQ`E-%ueAN{+$Hm>K_x<_95`ujFEGS|q3g}fIJ*q8`_ z$u!%{Ji1O@p|(`tG0^psIB^LvB0|)UEWkeO+c<@-iQ;LJt4->g?rJ}0Iny`qY11#F z%rFi?j6Du}+GP)@L_+`;lh|WS`pTM=Mu{V8nyRPm-g!}(_}<0NR4jL0muLCsk0kQj zDwfW+_p~CF)XD{F&d`CgD@5=&;+qp#4x}<87#ZI#fCo7?fle|ii$E(M*au-eNUAUrK zPSJ)?;yl2lxO)_m>MGkIgyM_SypF3)@|&+F%k2TORr3l+9@E@j3Q4jjnIflVQ>o=r!uAH zjmhk?=ACd;Leh7LU2?)d)R-abS#S=3yq!_BEx}qF5n>OscPy3OUi-1kN6}dwDQJ^g z(-9zr4oI-5Th44klGWP4_>@nq@(DGns&5GAhQyn{7oJ%=9|aFJcRSbTgy7N5QKYpu-58*e9r3!YeJEzdk-97TwKaJ>mm*d#vfw-eCT7r2TF5qKN4 zIc_tINmUGZuO=gmiQz~j5oxrFyt__16}X5vY%GZx7pnqv;sb)kI;_(?FB2MD#})r# zpTrODiO;?Lg5%3o$S)eSHL`QX0u75QQ}+>80*;6{M`Z9fCX(7tUk480a^5uT<)`H5z5DFN^poQm~JMxPQY{Zyp>^ujG&X1s38IJD&Z4dMxxGJeHV@(A6p;jL^|OM4Wq!m?3-yxMz9@o4lOcmUAjI za?Dd9HKP0%;JqkTYDs6CYS^kC@hLn*c@RyMa-}#N0yaD70bu?iSisUv3QT2np4khfqs1-zIDTLO2FB50+R#j}6E zWyJ|hr^NCUbB?4%Q&t?;>y73Q6~+z z0VfdGycAY;gNo2cxw(&w4@*mH?VIu`xVwoHvzuvi#b~aar(VTz5NSng^ef-_O9rt)Cnz>9QqJmUjrBsRw*+3Ku zsZO;DY!fLai5>l+YzjOff|JyA5u%bvoqD#dI7*iMm}&PfF>R@{;g%|e&Y*;vacPWB zrG{tWcb3Tj>~yI5$B$uEC14yDE?KD~L+G}{_lJKo6Ku(bG&7}Q<*;rCm`<&hY9o19 z@BFf14dW%&mU`fpie@ntG=d2J$VI3{*{r>_eU)I+ z5D^Ghu`Uk=gdp9FD8N3^8&WC^OI#?~2QgxWRKyj)oC#c2#JINBu)*1jNLrx@Q+rE< zCOJyDYhdb~fg}w`v|^PYn95UjBce3f4p@NEYa>JBjIPr^2vK4tQqdU9qA?K;2+m2H ztrSR66$9)CxXsR)Lkl$S7gzWOgvT0D%_!0^Psm7qOKT`*2?vMJPLIep1LguOBQE@< z2-QW9&TeX4fGqB{Mp2#>13wwg9=k9U?Yh zBh)8Oyn~89`jnkpwu9&)z~TQklDCpC_;L^Hnxb7w8)koc zkwLCn`CjQ9l>7N`>{>ais9yGM6Xr9EZBvl%t7R4n&%w!X@hkLts&*fj zU+MJ|a;ALki#_8-bk|T(W-((ZAj6VTLAiMw08m7ewf{k_d3jv)!Kdryo?5C;q2MEj~SG@brI zdc~QX5dt!~>}%a7@=%LO-$^xjHnjb-92*3Ed(ytU+jbKM8^bqOVcsYx^& z=1U5U@JaT0n-Po5RMh2iE;n~MP^AE*Xw!xU$~IrcWgx|c(EGkxQ^X< z4Jy24sI4C;iGRwAH&hN?{;bT`G%^ZzjE^$)q(iiU))hGkT)}t3s*UH*Lj}?-VZOT| zHHvh~j9-SZ7Q6mf^znu}8v!bpoiriV2Q|O*Hb+lJkv_M7XS9@g|61^_yHkmrgU1f#P*P3H0wT!@)-PiM!JeL)i zI&pe1QN~qn4-zD~;R!c1524E|Gnd)iq}t6{R(k@B;w|Xma(BvB7^rWhf>35C;7`QX zsQ#VzW$dDHa=K)b5szUSdl|5iM2cG@^E3a}qpvbJ%B@2w^qYTQD<|ydE|a)~kqQY| zc-g&|3d>}0cJ&Q4jv?mf?2dnF*Ii?}FSio&$J*%C-gfXXRW`LfI~4FMo0yY4B3`I6 zjRSS6i~{}Yf0d7CTdf9%yp~pkwK1y)^5Q3{tGb1yg^WZ(yre4x=^Z0og6P$Y7)(wH z@K+T|>mwYm3WC^|6|W*bU3hw#K;04}x+*0Q@R}yj_#sG)SA=(A`_X@lFD9VuC0O4} zcWp{?;>9GWzi;U)s)9s(!h-!H#|)Eu6uA?uqKqiPY84@aHnZET5gsr%Em(&MS;(8n zU1jrpeC3Q`76{-EYKLPg~SHf@bU>XE+#KJH7xaaTESjM85{?CSd^KCG&oQ+YD9Uhy?Qn0!nlJk`9j`G9O%_+k#nF9|mu;?2jJhK%;wMSyiH`7) zP?zGaw$VN$DA?C=!lrsXZsy`6Lhd1a&yg=~Fo7^Vf(X?}x4?R2K!G_o2&1$)#%ca@j`H#?q7OTWXNk<0k9bI;6qny;aTcdGsmEa zPmTUn2`~M~LlZ~Hm}$Yh3Xn!#^*Fsgk_nFTcscxK3=!%|MTCxTR9KSTTM7nM#+`}*Eg7{FpO53poF&;mdJV;z+EB#gm zARfD1tbSS={69ff{G#6?s0@c3l5}%54zEv~x7z!=w0!bdJHm;A=xT+Smw4{J4BZUZ~z@H$}Sc+I${AfB{>L#Ml@0>X&+G(wV0(HC6)8@Su z3hIy;tzPsiRyAj9ZJkSjyy&{edA#aFifvt5_kLws?Z?P7)5b#vyu)5jRc=bb{zCZ)ItbIWrI7pA6`x69vHF z^$XfE`iOxfPY*8t90T$Nm?$O$3BXqwgYZn{uL9|=i0C(A*cO+B zR)kAoo##-~=7A&$5fl=G^tcD<>jifRk0SU<<Jlqc+^Eox5E`7BS*Ns}0{kCsN1m$u2vWDyC zq)(dpDj+}+nERZ(pfSsONHnP!L6eR>l85yiKN?3 zn4Z{?w5~^|vhZM!PuUNY=@lY9fuFnnD6ECFAa5(7en+P!RU(E`8V$rbu`l+oMW8n$ zw@qsBk{@y(*h?`^q2l5%BC-;jURF3KSkwkm{kL607w_9qJm0tX1H;2fcqDFiZ7=ec zoK3qL-7fdsm>)vS#FzDVCagvdrka*n0O}?CZu02!II-;6IRl-RE8CJt_4cboTJ2K# zH{g$L0aaLs4DlTAA87>{)vbzBHS<0jE$&NcxVuCz=cElWTj!a!a}ZkF@nwYN&N=%| z3P_Uw`9iQ>?p~2UZw3?6h!AfCKUSWM$o5{m9JAEADY1R|#VBGifdiK96)IIV*a;R^ zGQ{K(aS?lVbFmd$E*94p4$ZJ+j!nqw%W5_XyrZ2UW^7c;)w1E!ugC0DvZN)acBdJ4 zjkWd&l4ttgtoF1VYN0jMXe&ia(8y+I1F|6iAu9Ai3sMvtmogDsr7Ait2#Qogr-z+0 zuCQJL)X*BAa!jqgrRL4uwcsJ!#N8dLP^rWL9shUG+pX%&u4y# zNrx6O^1t&}#5|f;afAy%QVAL$A~Us`xe?5s4ewhNLE{Cal1$ghXe#fd6gZm1u4=G; z!^)PUS$o953iXo>FhVt{3zrx*W&v6f6h19ScuFkgjN-B=zx!2aVF7jxDC7j(ON#*- zO-)RkY~w&BV>UVFoYWjtNahZ~BuSNQwR`qF<#&#JTsu+5?(IZ#p;@~ZUsNBUjJZOK zrS@}aDx`pd+oxeVMJ8TVXOdYs;}Jszd|@WQ67WpmTzs#Z#X^`5`TQ$4>$SNtvx`(2 z$RTj302$B-z-Q0!DyVfb@*wX+;htW9o|0xjT|$&YLioq&LC0BXMD#|Mul#kkglRWj z))Lv`i{$_8ck0F9QYL*zWNAyu$h%`c!lAzeKqP-Rr|v=!YRD2@v@Ti1v6i6w z*T2khahjP~C15I+sz_3C&j;utAoPsTZ@|L655-xXiIwnw=~}P4De)oixtWk|ZCg6kV-G*zqgY` zmbF)z;i*`SX#Nbq{Dkxzkbc0DlHwF|rE6!S*!A&g5mh3Gc4Cf3tIj#EQw_1!qLy2Z zuq9{agynuBnyH?pnxn&W-6k-ylfB5NVz_SWO732Ulc!P05tXEGcH(Rh~AakC$Pa52&V%nNVhO7JsqMbwcu{ z9_d*KOMDkoDtha9)Pg)VY=nTR=PSTU%#1`{G;*;POrmB1jPKp~0;>zB!NI9n!#9}c zj=dZ2%N<7OaAMl?7D3h>(}+Ju z(QSANLH&h5ECy*#VO$^j^W>tHJ>Npt46VJR^4A<2IZ)yc`tbv2E}VV5l}~>xRo5+u zMq>jIcp>qmj%<(pgh^MA6P_ll^!-I*YN2JXFuKMbO(TUW*O!Iy+YChdw|H#NLnjW@ z7${fbXI%0pff1q8y&GtTM8-Okc`nk4pcOSGKvU!g>5(oYLN(bnb(=4~z5kTd>Dqx; zQQI_PUVhrk$%z3^AH$xCW1^cq{>OX&XFMq~_%pP#DbWm`o&54xL6z__OqAQ#x}lFv zJZdA6AK8(J44->DZOJ&rd=~KwD-7BK%M#}cK)YfThTdka5#O)H|lVo5%f|`B(OW>pQu{DQh1kd&bVcT9=M}DvR_rhA7<&6U(Di zD|5oo%F&W-xBz8T(d+36Ts+58D%2<|fOnlBh0-3VA#y zMSVO>2;|+!D+2Kn819pp2mx7(?wlbT>X9afTnK2DU6^QG$2zI=N+;0}qDTvMNgAlI z@Gyqb8l+3R$=bJ@pd<;$4Lbct0-Y4;LR4a#eGRn`z&>2#8Zt28Y%1^4wgVi>eddX# z+5S{rEn!Dnf0tcxBb}l#(F4)NPB=l5G5PM$$yK_#xLXr~l&4WYs*5nYGylRcFNBi_ z^LL2y?1mth;*MqK1Z4ysq8=kMTcBoDpLb2$*fFg*-i(TqS8imu>PrZbv!HzV2 z9Z{Ze;$K{12Jq}nVHRvHG&c_Y9SQ;d(X%HmErm}kZRL7p!oT`+*Oqqp3>xI<)gLE1 zeOA#r_h(LO48C)=W!d`;DQPuM{hSqTir}cA%SFy8 z1Oh<#LPwza>@rB=X#^(;1OYnLO6J6bN7S(wQhYNQs@>r<90!A)evdDRA*{#{1vg>M z#FI5e_-g=5B?3$Ztsp%C^zs3Y0|gc!2Vz_o^j_XmO7re`rUIBvg!lhUJ9ikQX?Utm8*Pd zAxJF=DUPKtmB;=9Oe;MGq#VH31hIUN;UH%U0?3xjho50S5tyCHNpnH+PX=6fij-CGY zyy`$Cli4tdeuaWUt)l#2Xeg&Vrc}j|VbPr#IPce{?Wr$0h9c&*)dnE5B0?lWuag8o zteN@HS}G&S2=f9Ar_dmf4{SUZo9^hJ02HCaixlm zEYKmk4pdNNbZf^W%#BH*b`kQ)Uw&SLD)5D%OzUQIRvT-P293;?iT=5IYZv({!Q6;b zpKt{bVm%&OkRg&($S+|!()ONY2rdNz9E_PdgZwI?HG@QRSHHME9&NRfTAYKU4fDrpBg6 zDHWGV(u_rkbLEphm1LZ@DfqYOA@{_r2|A-6qohThW3qEE)V0d^dl`5F!;mlUEQ`1?S{h*j`>Yv=Html z!?2l)=LQ7V^Tt&LKK-AGd{vN$YhoIc$Y&92lAm|j((vSPZLQY=YH~2?D}0lN@?jM& z$X!}4RJ08tnblAB$-I3H2ShD8&Sg#JwY!c`Ewg`-&qo8RF>*rQl9~kZD8<_@DZHw- zrOPyFGsjfu72VuR!_GLMdXlaG^(3_;EepYW@5A#L^EOuE4k2~CL>5>t2RA}nuU&>o zxZ9Nmge$++PRAp6hn1hQrFG23Cy1opKP>w4ZxMdiMfR$+HXW*31xl}W4M9kU!mB(V z##4)?9vM6Nbcrl9ilG5=@Eiq^$UJ%T6~PF~rZ)O^pC6|qP2XhoMCQb_y$E_emvF8x z5x7+fEDi+{ne;gg_*veiR9}mH#mR2C1W>+_Y#@x|3s}|Xxbk;|X6D*J%1vsfZUnh~ z0@O>rSP&Yv&FSHS-D1v`rFaRKDP9Nh8P1BOMCXoC-&=J?oy8?186ON)%!|7OcJ`R9 z+8Y+h>fI#*a$kfqOkCS!ioQ3>dooI=3(e==V`HS(vrzs15uUgwX_Ku~-4HQXOb2tj zO>WHVTV8UEb2SNv=Y6F>-?J{4(he03i5Swmu%+58Y@l zpjz6rrrB_BX5oe57FOI8j;L%+lw*ERV}VS%6@TdA7+j_2)!N_E{$iQXvWZUE(AK_) zr}U&wnM9t<%t7bR3T)q*3E~p*PO?Nrl;&FXn<3^&!fs)iT&$K6u}UIM6YhsQC@NZf z@zag*7BImxNO+>l-4+{=j*=7YwT$~A1k+}%Z#NpO3Wf$9TYXF02fC5nw0H_5kXIz} zQdbVwnnxyESpd7Ua9nae>7^F2bWlsBGr8F-M+AW*nmE}%x>p2tB(eyG(h$cr&*fof z0}(V3$Kj>U`6rgp5!-#Sq*`)M(DH4UvCUMep`}H9#xW+>?E;vxFBcISk&u^1vZKye zb|{bt2}j*tXP=GQBPCEP7aVWq5{%6f+J}4DP|=TkV{tK`ms%|4xVzDNrv^nO`L3_i zpE4Y@{uB`Ip=5dvWVz3L*QpUQF`*n)tB-EHNPJI|Dd z*Cr888tK*^+qCgt^xq|}kxN94vd#}`xWhX81(&z8pIo5oAj~lTVXj;6@|T00hnSkl zmaf4o=4pS-%?EErS2rT4W$BP;lz!$uHc1ucqFp*W;~-!%4LNh0#T{AM*N=c;NVN}YwvdsN?x`>}u3+8~#%_gjnG@UuZIRdSr$U6!M(sAsP z*g@r8%_=~J=?zKKewj>@A+rVB-k~m~#?UcLr=u^<{SQqPlHXa9t$VGbEeoU1eh}zZ ziQBR{#0h;`pE_4W1EyYx5o3aWSj?*^NF~roCF_}-v+8f%$M$6(3gNje?ZE4^wxN*a z)2{xJ{3EGwiO=_09{pWO<0cvB`isK9YR{Q3y4x+=PL$R-=&tz!OY@F+6T9<_-_bX za*!d>sKF=|tn>Ry>~Ug27Z6a-%!C;_JBs9vbKgN|cz*)i*X-_Rmi(f3(BQKn+tSZk zY|@Q-Ra=>_CviDBR~>mDD;#-=JjG#ZBrQc8xr}xv$0|~mr8IJpq;&6Nbr!EtvdY`J z0p?01i&ScMho+P%PG@Tjp&9LHznxHFyaQS0_)Xt}@?~1_ z93!%{Y1*$z!l|?$0V2N$piJI}aq24isjJVwhxCB1YZN3h97>3V#yUv~S{21nY;e$& z$~uF8%m+jM_ZU3KkTVUm5rP*YSp|F?VoV|{3De8px6{*v-9LjUh4y1Bjw8_*{G_h_ z*9nyoDK{Y8N!u%sq3^gAQEAYzJYAi{)sQjaByKK>-BChljw1x8pj3`y@Y#6g06FGTz@Sur_jmT$A*>`qeVqS*sKq+7Zocq5{*XXS`5J+HXf% z7dCCK)K5~Vj|nu>LI}-Sb}Q|7VcRcJ%=sX1R(2}gerbK_!gi5aO_+)?O6x$>=-&zB zd36&0)=ARaR$fXHJmnf6>wLX%7#)F7xA`%5a?HY)R#Bp6+0_ZguH*Y#=BaNW3lqmn zN$obqTjXJMVjXwXW6z%HT$uUa8yXQ%Qk}So)Pvso?r9`T2%XjhhkFp3?2XjE;(Jvh zSB@r%-hxM!b2BVCN?OT@A}*;(TvYfjJim=ey;a!Np|#XD+dEC@n5jiejFzdoghpH9 z+F##!ScO%pSp3&foz7=U8FWOG8Aa}3TNh1{RjE74`e8&Sb+zlf(@bTnn=tPrD77%x z+Lt9u^g;Hr^`TH-W(Y|IQZ;l!g(H6AMZ6`S+$}qjh8oG7hkw3PxfnFYY-c0P+qWPl z3UeaK=gboMsH&@bwZR}mQ5mFn1-g&&^OUp^KE@_%{GC+vQHcw-QV?oOhGArDatgbn zal367ZP90c(9E(#;GpO0pVel#IrF8tdRMITdlUJqu}zwv)8kcsG|X)OT!TgkS!1d) z9C8P|bunwNyK0U4A_kp0J`X5BXiL?Ak5UFbSus$PW}@5nih_%TBMHq}W^-YB6OZy+ z5VsHMEyvOi_7x?)yrl5F2`LwCk||E5BuFRr3W~xQ;%++BhuPqLIv#!*RN=cn+F$Qc&2Ht2w%xjp ziJLT$vM7RsrX!wyT*F9gt^PaeTc#!yyn1TeGfuiB&^Y$%5R%=31iGRy^u@F{Nc{=$ zaqDPaLEzFsFIMG(#msXRmRDr_AH-E_g7Cr+VS?{IEYjar9ZO38&GG~F#$7}Lv><0u z3Oc5G7<%hPJO1CSn#g#wDJE=#DX+X934ZgVzb;>Chg-(V!jhja87p}ZX!6SsEmV|| z^=Z%5z`FDFEFw@#R9GZG2=-|Q9brwfNx3`ek}e4uUmo`4RycyUz$MJN2Ujggtao_} z-qUGOB`a?em^kr)E}W$%`B^ciScxm`9_C*sQk-t;-`?@ljD(TRhRM-Nlgi>3XW#g8 zGrG9&z>!M)sV0n2RQ?)8p2&1i^?E@(z!7`b+Cl2x%Z&8}QkWi|QBc+0;k@ayBzliM zpr9GtIR@pn(-U@mCBlm36z{TkLWJ`%1i#*Tzuf7AAHZse%G7MBWAmdCY1apgD`=?f zNyH!L(kdk7hRm}i0m;9ROq!8c6_l7ur&hG}4P6=TF|*jK-!>CICTo_MSo?KO<$3X* zCx~1l@smeb+r>RU=vo*OFkk{AaYCF~imI2-vDT7>J|JATXVv(kKQnxSqiNUONbkG& z@b|HWoaj6OKXlCZsl9!r!50ak3J!}c^cgXjp^ksj51n=*62*JHStRaekfW0X@*7?YX}f4eoixc}{#3Q_(gjRQL!`jLjFBUd32{x{9VDcXt-?KI zR($R}kSz?bn(D6`yeCP0n8=-I+TSJXCEMz*F4&e1q{8eol7MXQzp3PK9Gd* z?@rP|FO7$L9%@~*6}Cks#GKft0^ru5yksUcABb7?$U0dYE_(I{)Or)a_u3c3Gez|$jmo~& zEOHhRNAKV{1;l}bsiEx)@E38Y2e<$bH1q&l8gQ`2N$?6m=>RmgfCRwb0qG4WV*_L> zN8DCrlWS}|pP+Xuxw!`^G9uQ3@_Qv!5OQ+z-hlm8xXs_#l?f3K$Gp`K$L#FBc?;=G zAIi(%|5kvLy!1?~q2wxC|04A67W5YhDkgkUb;8Ia>`OSD=gU*9Py{xg&!+Anf~3U+KQ%4DzM zgnrgvbBJoVCDcVb+uGkgoVw{1if#%aI;uJe`_2#A$dk2lpbkb|L_ z3rT**+v7Ks;=4^9Z5HbJv#`tU>QzG9seG;tnS8|_#`*@$1hTXetx?kkX>e@<*VTr3 zy5kOal}njZoFLQxHRX(u^Cc5;{1InSv#vS5Y*!W=s^@ z>XqZ~VH`!{Lz+BjxdwmUTU{d#n8(ifVh#;MC`AgSvt4gEwI<@r^+^&o_@~rr#F3o5 zOpV47r4x#Pr>^TW=|Pi87Obx?6eOkEoChxix`OI~!~peha)>B!2iMF-qiBgpojyc% z*>6ah`iKq)6O)+19YJa`)nei`;z0Q$s_B@q9aY`NYLcU14^!80V- zlqor43o2GyVFGoTAhEtW@o;t=4lQ{rOH4r?bDS{+NMiSC+v-SCh5WZyi3l2!3b7_w zQqW>N)B<%dch&lWrnQ>CRK{SepG+l4#8cr$CsyZ3ZlOmfdpY76YRP^IV{&pwY^A_1 z(Bj^Y^}I9n#ns5Jr3`^4uRo7A!5C|_mf%*HL5(yvl{WZe%blCt+>B8z%Ys)GwA~n|Yh~0II}A}GRg=gL=HNz?WZ?|KGqPGoDc#j0ic%O(%MBB; zAx%+~9maAMhruw6u@w9mRS06AFuh`8#Nj}1vD{3EuXl;ZUI*K&4(Qk z{_$n=t}0|*cqs_%c~XW@>V#N~Ot>-Xg>>_hKHc@Q&NS@B83fK z5#!>QjA*E-WLF&qRf#nsgP=MH(E@_r4jxt=^O(GfH9zWsbP%8YHNn0-HH(8(PlUS1 z73v59oYh`ja(is+wy4jUUj8VOQA>H9R$l0g^4E;oXp%Ky zh#}0zUq;cl%J??jwN8bA-R!1ebiTIuqjVfzhO6?QcJpl2Ey7Iii9iL&*1-J zctHee#D`0;rG!^RMxfL^iTW)KA>$T-ra}O4jfUeJ0bqoPV2s9@4xEw=k*x%@NPK>D z<~N4?_$yj$@7L$kpKmVnmsNSzN65oLsf$n%qW3;-9jx(ATDfghs9?@)8L?@6G^r}N z<5KM?mBL5B!Q=g&m>Pi?B-4Q^!*XK);cOA=e1b6{f^WRvK|g9Omz< z2{YOO15(iKMDIfjt6iD(spu_{dF1Bq%CY6V=mR)On^74Q8_lC%XTR^nToJnn_H;c7 zll25FNmK#iD-jeA4+UmIeCTbo0miJr3VLd0ew-j<14 zw88b>`<#PB#kr+4;PLG>mmpvTST|5f4i*@Nx#BKd{K$fD23XUl-)TmI8F_gDuJm5_ ziUDGD3U;Bqf-cw_Teh#I?r^Lw7nD!AS4STL5j0Q8>Tkir%u|i!Ay!P1K@JiEK1%QWx78n9jWuJgy%lPJt~m3j2JjI}w{=pE-dA5YAp-IeN!3A?8g7 zE|4Usu^0@q*ep}5nw?peRH(%egOL9<8mxTsR|57Z4#p(; z-`bKN*-gdS+SL7wB{Twu*v`}+zrEYXBk z3y4LT)Ey90l4|(Khc0rFo-$Y;ZsVk#AT2qnH=2FkLt(9|*dCG+(349e4wy%#{)62| zC%7~Gdl7*Si$~1qgBJQRoEEJ8eZH(Jjf&>63bW-FU0vK!$yQTkg2;v5dC1+d2P-56 zlVS7(Sw3|XEmZ=nxDnw1CSU1`8LhdfcPq-1IP(&6Bgx5AC%8g{Pz;B|IYW)#G)s7b zwJzU{U`XR<@p#@+7U35B=dCYDi<1%xQJsnkP2bVr%IZ$8OHfZ0xdXwJ1+h41z4vn% z@h1@GZgsU~RPQ34=-F8^1pZk@rmzcz2bM*8eb;`%=*{zqOq1N9U-k(aR~S~QOOhFW zMv^Vvg*B+o2%EP`__K(yb#q~7ViBmX5=RfO@6h_M6eao6jbrYGFsn#eWl!C;xszE7 zSG;uVKNV-hm0I_EHm%X3lBXJbL$SJ6+Oa)hNK6*o zKl@mp6I;lpS!)zKzr3!@()gsg%*v)3R=}bl&%%X;)3RjMXLI4nRLvZ*uXiV1r-nQ; z)mss4oTfz572Sox)9E}Zy(_vB3i*{PC%~6h?zM87K~34|`h2o}slNj@{=a*)ph7q< zss$t^s!K4*C{I_Sj)q#PlXlADheXsQ6OlzxQ?VJDy0mcu8ObFZep*ycr?xy(X%Wc@ z4=HGR<$L%Xg_ukW!lBs4NUpJ^*he%7o;pJ#zggl5cgFDr?!i`Wms3D=iB_?IlE9M6 zuWLwZl*;r#h!T=kp0OrP{~|`~enHzpiRSb+j1;e2U`X!W%E~3#$>uXW)MxEmq(Io-`UwZSRQ(8?d`3iR%4|SuAm)+BVdcKr%gyXi}gKsn~wohkLep- zDw#egFZDo$n0wch%Kez>V#{wWIy%dr9%DHSGPAI58p*Cb3cBQ~iSDX2{;NL|&qhV) zb23XDWJ#KZE}zfy{Md?8v^}exteXp$(ONm!d!xXnO`-->LESnDc}PYic&u9=lD=9Cn6wyCS*X{KHm)?>Dr&+#3`64l2 zCTU5QpQ#7YM)Dly@W^ppmF%p!f*q1el_?S`rQ$n3Ez~y>->0Mz4Td?$V!+Bnm{63d zs>va)AYnp83o-%Z)8Mr3O@<(5w z#ul>0Yr!WR%nlw!7q`WTWNDZnEs8;@2)To^T60P9oj7HiG+k7ekz65+$2u&>t-D3k zi_`m!bNG{?9rSk+xuNQrcgb7TUYM=M?a}*ofgTY@}IN zjF#Q^j&N%<4)O`#zw2&zz-LCo3EwW+@mbYDRsd=k#U{lk^~7Hp{^p3 zD}~NJ!&{SknbJQ|H&IRARgNs=ONijK@k2Gm;QADz*Cbw?^6%Q($fqL& z^mz4zP(XM481`k@;-CNNG8OW?8YaN=ILb*Hu*=jm`7GJ%Z-ngtEZp_Y5g{tiajY6+ z5R*YBTwkKl{}d#u=y1;IB<&z+{j7yp$u<~|-yky>;W26iD7AHkgxTdgX()l})PyXC zN|6wOA?#VmxY(S9*}*;RCjR=SHa8;S>*x{@hjUR~yGPlb+I;D2qzZ%HAY{u%%Mfc~ z3M-@&t(u{Bot`r6YXe>umZ<^Sm?KL1&<=>Dud#Y@0fH5m1#WeeoYR+4H%e3=uqAYS zgiGLIdvK7w_&UU1ile_Zgl>1^x)j0LB)Iq5Xcw_9)=*2Be-e)HHSd-U5Rw-9UDUtPVpH(1q$)F)Imm^Q-xZG?;FC&Lcvs7(lq%5D{T zaH1g184z4SraDe6^J1YRozzJ2m>`BdAe9xvLMjP=KC=%6@Xh)|_)6rF!ul(i#DOLZ zi59wgWAAJYPUF5s*9xX4LggN#7-FWt5#k*l8}tnZB}ADqXw_JQHp8U&VCBB1rh++za)*2X%&`JiX zsLUNL&No`HQIS>sy~Q3B8wqAJU86ursJ)!431)wWm<*JgsK~W<;J5|H8#>+OlPp}6BVa4^B9sy$&HC-8OYBlZhtL!@WNC#{2e_qH=M~8gmlGXO zw?=}oEj_7?G!+D1UHVk=rFdp_tSGtdRW<%meG>~BIb$75KbNkGJg9QS@6g9dkg6+3 zQ%eqPu{7Zf$WX;DMG_~=2NA6qddH8Tf?C|iI>}X*y-?5O?QpXG7MhFb+S*I5+s5bh zAgtDSm$VBxYwnAOf>wbp%N;6P2bx>fm3gYUF2tJVYxQAu znGMvWQD4DqyT|G-371n<<*3S!tty~BfWn^3r-qSBh9stTt5Xs{N|)B}$e}clx+J(t z(d1mka}Vxp=G^-uI@!mmIvFG>V;fLFbaQx9mLQjssm z8rsO1nM+oTTJg-d**w*1S(nE%K(g0JplP2$cbkG(5T8J_ya;{2!g0dnu-X|PXLiz- z6}iF=yB2OE8ObyvZzkitdg4r=Xv-AKS@e-TNJK}JNO5wEU6m6XNW+Y@_bO*B-W$7G zQbj}0Hd`QQ&6e@(CajQ|c4pxIX7Bl;@WN)?9&TwmZE_U3Vy*tfwUDAG+HzTQdN+o0 zFEE!b@TJ)_4A^|t_U0uT>A`<>njDDemL9N^!*@`Bo^r(*6s$yjam9Nzk|3HeEAct% z>slc)6M*najK~+AZ}JEQ0bZTErX<-Z4pZ&|)t-syV>NUwfUo2)GO#I|wM(e1oF_}( znYJicp)9tUD`nC52j=7Dp%zRKl^4pOpE>d{_1JqR+LuH~TfOm4OeHB6o$pYm5Y<)+ zC66V--6(?DCR3hHeoNkPKk?7260S#m1-^*a!^w`$NQm{->AUQ?HRw?Fu?#4cRW-K0 zwxRuUulh}Wd$patc}le>b~{+Rm5+uHfduiW5#F~&m9$z1o`i(KlBqvF(mm=yoWwS~ zoJNQo#Zk16a`a?k-Vh#UPz4VcBOmfZz~e1cFeVYVcY8hDs;U4jr_Zm5)D<8`ke2IRwqcYA=d~# zE9Dy;`dz$uj15PTVh=rhVkW{MO62-pL)ZM?F%9|uB?oE3ZK)#`-g{|fQTjtJKQDkZ48oHK=i(LA@0vT4S-CleTMHmE5 z&Or@hW?Hu)SYXWU@_ObiCn`0wf>G7Fgg1Ujm>)~tfP}_?vT5n}wNk?P)ms!_t4g|2 zYtcBQvd(GpWsrsO;}%FvcXNCVNXm))W@ZII(k-xhYj9l{EVjz`0%FbPYT+PEVam>W z7b+?zs<2FJ&4!#|4&SL;Mo*|kzZc?XMd`biP+KGC?+USI@Yl`)`Vkyfp%zjgDzrR< z4lJ@irr#nWH$<2Se9AtDQ~#`k&So}Sz(4a4P{t~?5Ouxh6z#Nvc$%sBkQzoT4P^Gn zdY0@(9r~#qYOCy&N<6y?tk5l3utEi=e&Y;ShlN*l3@}M$$kH23*$ffq7EOQBN&RJM zmV<-};xtXBpyJ}gbT#rcPY?F&Ggk%WO^#HDBZ-O#pnQu5pDkl;!qLjR7*W886sM&NgcPLaCo79HW7vAnAgf{CvTA|sV|2*aOKM81g;lJm$61&KOe~RSz4PC zq36Z$9vYJZAa3)we@%~I?EYdF9q3;XbO=NTR=F91omoXfuDO97oD=_lqEZljq~83&2t>0(^V>5rey;uIbp7jp@ldDNAuPMDXQsbk=dwg37E9&LgWi=Z9kw+ zCRkHVKL$dvS|*Z>nEzD@{Q7AkBw*h%drnFdbah4p(~Xc|U;?`*-~a&20`33+5(pKz z0geSc;c+reb~|ul_=pAYP++;uAwNGo+tQ1^EL!wc%sAtvWcT*B_^I%Fw+RbW~{6rCY zyzsecB{1|=fdRZ1xU*T2SwHb0kxlf>8SN^l_p}pW)<{ z3eiD=4%0~GVHhfbBmvUC;lKrkrm_F{Sr{24PV`vyJ@q8}d5uN*pLCgu9!`DIT&}{MuGC}k{4Xx3Evy>KQ$q~cU7?+zNLyd zP~jC3iJ`3A)rBdDe1iM;#epI9k%=I)jW+BmWjj_STl6F8uZluWM2sVTRDHyH;ZihQ zQk@Xu)B{YeQiZnEf90@6?qICB`4VeP$6(m=TJWU7L=eCdeBB{J2awuemsnb;@UQov zqZcl@V}c)9Qtxq55-jw(HVDTwp>*y?dw!LFeGMmsI~W=^tY&&IS6O>IW6h4 zL`$V+YxYckqSF^lS~Ugky3p0|P793P)wh2z*N8S0C4I#xXyQ)(fjh(HcyUNTQZY2M z5foBGu=`(&u(01Pr!oD65 za&h_#NCPk^-pghr@poh-f@;t9Com%^?WV-4oPmmI62k ze7*95jG7~@2_%)ujIs=rOv1uZTVV9~P>(cJ{7GQo!EOrZ{Z#qItjBCnsj&s+!RiaQ z>39Os6cHB*MOqLDt@ElRKuzF1v5Wq};w-^T-fb00pJy0$?6(wfL?$IwsSsIB88VP+ z{ohn+`p0ZIM;qM)LvNc zx$NX~wQJ#Dk7BN{F&|;~c-sdkxXZ@2F+p9Ci%i}8SwUYDU=BCB<3dec%)rwb)+X$;x{bI~i8ijD=%Snmq~p34J5=m!yPH3>j|MDpy{7*x&m{Y4vQw zdHPlS)w*kUs|?pTIwFP9?kRIwu_Xv{gq3tE0|`-BmyK-6KL*hR^^MM3P7?wNfnl`* zq`1;ZF)<(ld|y;}!t`0D1#$)%cEix}q8%E6dUw?#tW8Wyyx$SH=p#ZfDYMP?K!_MH zAZZIskttI&hEHkiXPt(hQyvknl8!C*V_ESPkdvV#xn6@CR4z!9qPp%avwrfY7zjF2 zR?u#l0VLi0s)&xEu&tb8a$2n~Xx1DH3Qb0ZH4J%U!OJyim*7E8*_bdmpw=iRyitn6 zeF56VY(@&4JMz_n_W4Ur?^4+;KyW_nwF^{0?IzDMW_vCj|KSEGnYmVc{2O zJi0?fEgJ6=$1UBU^0GvUNDNE`#I48@c?DZg5FsoVSQ-3If}DqkwO#xiq(htcT4KR? zveDCowA&$2!)c;$ZVe4n20%(=z1u$6roa8Cvzdm$By#KS#ePY1XL7W%{{T)PrzRCx zM@Ws57R;xlk*w?dBoC#mP*NN_8kkN^Y|l;3O^#m@Ek+NN_|dxvR@8=iGUzYQxg$@l z=A@8Ifj-BT{`F#<{23z}Hm+hg3_pJjm zukrw8H!aK-mXoqdJ348#TRn$Ifu+d;Fgj};!O8^ z^32k62uVR?8i6@!^cRKkTUO~Wz0qqbI_7I2O~1_}sYZ3X>f0k>A;g(;wB$Gpfdj0m zl2#FZu~s~Zgh^Zde0=3`N%)$jLp>8_(1Hn#&d8CB<4GnEyZN|;7g>GM`&A+x9jdHB z$Qwbt$RQMD0k&wNDibrx3Na$K>5S#U4eP2A1D`kNWa@SXekns&b`>lCx8X9q!sN3fwv@36Tef7i z=FZHJC#h@_4G%Yg!XoHdhT<3GnYSl82NAOR_91aZ;i-`j$wl<62q61>rE2#Dx^+AB z%t=BR4jDmXE)WFTSvd1`oJ}+PPi~1Dj>1`&8HA#L;D>5NO~wT88RhH#WM{Sx;a8h$Fz*dS_Jk?l9C9z57({dJ!ypYR62v7&wn@K9vN0($St}A0@6qxW*CvTyj^eYh|I(>%RCW0RpNX!A&{#WgEc3w zPYLWj1;M5)tI-%sVB9z(3AIBQl2YO6^-1%Us181x#6xA0Mcn$LhFpq( ztHNIh>YhSVWf|crM_TMKNRXq)oGu}?T;IlJ*b+nXk%-fa2S}9)r6w4bSzCzV;Zy8% zi5Er8f}8ZABW+jH29gSfB}3pGg?r|c+Em$}e$ek1IVPWHHJ_IF?E>q=R3oTXi3XP#O#(ok1Kjt7yf_7Km3^uO5gW<`7 zyiZv4wG+xuc(qt|fjj=f>oi#fuveNY7@ZxZg5;>A*S8#jS|>WZhZY}(D&4q>4JifS z4W&wQoD_(yV``$t2TA#lhyojRAqxXPKQ)Vjw{NS{457(Bq)8U$^kR~{wVU=UY~qEn zuop!@V4bdS7hO(WY7ko0+tE);ahHN`n;8>FFYFbgj#t-*?v-pYvuYDC%SR23kXN;1t{79ZX|R{7c;A7OfAE*hN1Gqb`EBt{}Qs=Qb7IfWv?N)bs3 z_bm#VSHCbHX7EO68?Lz{?y$u%tEAiS~b*b@fT#^w96Y zLu}zmj8FdxLw;E>$mp4dk7?V2(*L%J-sSL>Ng?lV%D__h_88(&sn@L)e1o<~d63(C ztszL0Y%FS@6rh~f^YLSiELzwEYFRah)L{!Sl{6KGRd4Lil~XFr$T?F~rb!Fs)l<8r zY7NxMLH97$)fKqaev_Me1zChHN}9`ES(zeakr5^du+#5XMof~b*aZ!KZjgEOJ|rX_ zX>5c&z_%OanE{}EGJcF_F-zHt47C&QaEaOV^MAIhNe)0c4ZwjwOSM^h*t$)Z!^&z=1Ka_U`2 zmb}~}I*9&FtmK@-Ro`ME3_l?UJF-N}MIu|6OX&iLbYm)%30k27VF3No>}TW#FnqCAp0F;W6mlh#$7V_Fo+$ZBigqTHpNl3 zEQsstVwftiYia`yv&5ppxJ8ME5oJ$gJ0Cs83Gbj=i$8v%;PGc#zwZ*STZus^X#D=! zMEy=vwffPyaZV&-nl67QRv~e2&2_b1XZXz<6d@n#!Z+CWyRW-dp==2OL_U&4Sw~+I z&sMF_%qZ0C@kHiA!T8sNBJF?vY^TZc#UDiklDchvRhW#&2`WemU^ASA(_wbi=46fZ zHn+~wF;~BvYR^o0GS>hd!RUJtVijPzK#fsTiWSNO<|UMJ9E-Al3{No_SjKw(c&#AS zD)V1ItgF8?LiY+FJK%#^h-C!#qh>0^dadYY{%uN8+MPL6yDwj|ukZ+=!6Kn4ROYI@ z^&w6?D1`(Y{Uujsuz}%jFi!%YCQV&hJZuZu&6h&Vp;RtT76_>(gTp0-u)vjSu2{(e zahb<=m7ve{a1t*bC9qHegW&NeQEVL%K4gwFN(0qjkwSVNJ*ep-Gf87|r|pS)*^aAs zM3Z&QN>4V0T*=T2;aILCp2!${@PS~CF9I@ewC+Czg4IB02f^e5sB#C8SZ;mgPu3bF zs+?g)#Pc+qqw$`d6bnd?!X-bVXUI?btgd{d7q<{3in#xt62W+&1IfS%;8IL(El#-Uvb|qH!R{ycrpOms7DJl7zRe>_v%SY?R=i}h z8={QMd^S)aAN+^}Ga?EgFONjnQKeW3!cv=0x#W-6Xr|$q5~e_o8A>Yr;^uK{dtBmv zD;J+oUx7e4?$wo)iW4NY2{SHbvokmP+AT=kRR63fM5xA~TnGf!iAB|GPHM`(3+86s z+aR8|#!==B0E7adE{`e%;?VmZ@0FTI{xK1dG@;~#rkj{jHNA5*&(>=sjhmNBi~9D< z&1b?VO%fL&TuW|SF)0O!gPzNB?bPqXd#Ys#z4dH@i0%zRfMa4@>M&L2>K*&vpFoF5 zv1D61smX-WIW&Q8y>g%m3+dhLo^vUf_9LS@AZC$-hOYH9= z4B*;VTtfJK^PMGmoo~;}8*N`0*Gj@%MG9bE7{ZfYa;p7uY}oW9+06|?AqoFIwiuG@ zEe*09T#t8a9@TnNr*ca4+vTc4&ZJud2xT^z1k$dgB<9N>a)h;Ev)nFIELQFPvuF_k z%upex%l}omT6^`e=Q_4Ysab5vs>WA?b5ktG6l}V>Hk5Q1RUbK{_IjCQc&l+NgvEii zG+aji*Mt=-h2okr~@!_5EjW^ zf5UwWr}t(|vyssi`W9D-$%IoK9Mun7blR!Gl#1Z&K{V{)%K9F@fKv?OY3QDFC`h>z zCM!gtYO8MM*eYJGB-0oZz(EM%1-pk4ZcM37v>dFvq=&Rw=h>}eEwJ@c=EzTqH~(%X zq!fHK{34b1d8SZEWB76rMH5QOD2th@PFHpmFN;z)ESbH_lx2N3b~t{igb zrxiylmxBxCSkW@gj8yi`sIHkKAmW@IkMr|*A_VuEXcDZ|=W~M|-l^C@$RT_+ZM&h^ zxKu@@(MizT!%^0n*2U|7wurN1Auz)h-Q>9~bWBx*m}*Z|gxQbrQ3^glK+0tE+7p77 zf(&(lK51V?h-W9++oP~D_>=yT(_yguxVofP{ZsKFEhW#B+mq}xK>MA%&Jc5YueRz$f27_ zyHOc;rBf9V9>q7AIPqGTZx2alu^s`HOCS-(XwMBZ#K(KCq+M_!}6pkym zrVuSxBP^fF9iqFvS}FS4QFVqY72QHXzjBGxhyQxHXw-!UbJe_l&) zO}u&7MS7dkZeSUlX;c}LlX8@%&+9BuEF;|AnNZRXDT^=<8W}r^jsvRI2q0Ko1c-x^ zDcidJJzfR>ppFPgK$g%^&t~wLv`Oo{W&&UOtvNPGsZ(wKQ5oQAPk%|8nG z>9DT?vBe{0tr{Ym*MV;+WWY)`3n@W_W84eKmE?)jYl7z_)uiS%o~Wb|CIXU@k%11= zzA{+=K<))-F!#eu5!qm$FFYrDhTGD)#3nRV0S^>W*i?wWi`xToEn*(fu#JIx86Ng_ zm(Vu&mTP-~q4A>)X&8WM&;qK7lH+$0TFgnti)77G#!?9Z)j;u$uPlJKr{DBX1eK*P zNE>O6>c{jH7kz{66C1~SX7X9s_38PGppH)psXIqB6)kJ8?oQjjnEnyf~!U_{b# z=a<1PA)^FmY{>Dw5P?!SDKG3j1?W3^cgz$KzM_PLB#ZR6tYuXXgxuo}sR23ylR{~N z0_38uB9vC$r0s(SSawcWc#1P*Cm@=G0F(vH$K%03B4?~SPEE)YV62r?{Ew68=RmL< zQD)j9;Y{cMd*>wFYaUeqB&Z;47^DDcMl_FPkKub2&_*@;aHIYPlGke@*;u$6dA=p&9;Sc3V^G($EvG{ zjZ<;kdB&F-{&Z2bGdhPb3QSUjSpSA1-b3f8B^t=P6}^N3L3i$34@t{sV$t}o?GDB$ zY#Vw=I)Wd#`7KAmnY$1m&Ed{7THbk*RPsAk)T5_ak7L9mLyTvdT0O9AcIk3S)6ZNV zH>{W;)&*l6p56@9PF~xm?GLl9i*+7G$TK*k?06Elk_QA&lIEMbWmmYzPO+U(KK z#f1u7J|*01_TpUuNy#5y(N8>2G1J2*D@jz=rMXmgub2f4PjF3;y%)D8&OK-yJJX5SF#+-y;rftt1)h?h3k8vBUT_#LN>-7^FG5{ zd<=^AT&jx67?H^KsS6spceuC~>eA=Da5_q5k|2c{bcN;VH#C5fv;91(ncz-yy=%U*CT4#erDnxBXG*tedBYis zCN&Mc%v)sY4Yk%Fy2LnDL^XW6;@O0E4)Q-6+kErJeez9%o|7o0->7J-Su8Ko`K3}4 zGCM$k#)*=XNha|#^tP8a>sL09O%gsNIzhpTR_mtpO z_(Z_Wg(fX#+vak41dfO3zjOMwB=4zHU~L5(a+FXLF-Cp{U&AffxYed5Y3Ckgh0VHi z?hZG74c~Q`%zfT>o!3wQIqjvpqaj5$l}+Z3pFG&dZ$Di8DZc8odkw|ct$Eb@BpSW% zx^oOU5L@_4s;iC~ojh&}3gIc7xJl17Zi`hh$@Ch1d5q=0cN`p$YmFps(DrYd`~GuchWKtS~Q|^+ufb$3_EAOq{TR&NN#6W1c|ID-hzpX zxpgYnE}~?me0#4&aAVW>-Jy#lfi)6XhHxgbMSSBSy$ekITZAC!jKbkY{Sp*728g0# zQ-!}_(Ks2skVdX%LB?u55t=hP^t@_feP&;BIf!8kU?sL(q`8h^m?>FGm2h>ICo+W& z2V*>Psh1BTBYn=VF|C5n*3czY@*OFfPNEF;2&i`~y11cJlmGE5Y%=_oGN+X~YQhO7 zJ=}o&4C+fB^z9(A7^eK=p*JpS3Gwo}AdJC6>FVHuj+Yb!buB>>bWH*e*kTek23yW$ zT4NHTbdrEL0#HtkJi#0Zz=Z@Dk0?VpI0J2)r<`?G1aT=!H;{tFgvd&<#mLYw5_u0f z&`TYI0}G68Um0S18YIFn7l_rsO%703f(RB;xa()J{Xyz&9ht(WEiZlDBDEij1%5Lq zv*pk+yv!F_kOTk;Bg6~7@b;k%5dwCyhH`jKq+mlMK$ze<+8=K0T*1zLnhh2?lQ<-+SzwMH?0`}~krE)AGr}J% zT8vyvUeQI@gm)CK!SoB&YLMs&r2s3<6o8&_`1U7}j(v;bZYdaNppk<%$WSB14Fbxb z@M>3fLYi!@6HXEzpc2Ob|1iSXqAFI=TdX$^Xyh_UR{KqSGMMea_J9*&b@UXE3nCGW zT|bNbza&*t)=WW8>g7wWyRQ~!tbs%~>{<$2CS(647@o;Q&5GuhG}Y245$IWh4IW*D z94c|fL`npCAUmZ~2Lq01!b<4HHeaJJ(GwWv4=Z;5HJ1m7rP;{SY7$!Ah&hWp9jg z@7=vRUYx{&4xM9%&2;9J;RC!^y;G5Q^~NzE`M~xSXVVLOx+tJp2O(LWU#T0i7A3gC zg%x2u*>b9{gBS>gy%>qj6BW40qbPe;`>~YqIIPqHA_~c>mFaGEm}FF;a{eM;V@gVQ zBunI4kKasxCetjm9uf0@_bahp`wtL{8bcXcSmTcM*Awg^@_Vb%^e{K~@NOo8(#m zLy7+kwgStPMLnDNDI^T5VRbKOV813upH{iXuMpU4o|X=y+XV*rq)CyeN<^0c+coPC zBJs$dD#TC|jm1!P8A;)gZ@JICVr-XvLl@$~7_l5d6ki{evdLa%vv{s1v>i;!gc7xY z_9PqM+DN0$mPX+w=1di-VQr$6CY>-<86I{T>j(U;(9RK3^el-BE>XgRiCvFr@&?r5 zUbQu!i|!PXpK@gyn!-Uq2%C6tn^#b32&D2Y0X1gJoxnC$G^@JYex^VAuh$CeDKk*O z(s&9-OTpRhNT39WeVw=F{Y4kdf}^+WUDf(oYOc@u_YnHdWFUdan)eQ`?1enqx z-28+iJhmh~%!h-N;Md<}~VoSHn8j(&HxrNBXwkZV50t zJnj5Hw2x78T-_yKCZ1Fj@%}`@Jc~>yA2F9$nYUvYeLp+{QM*8hVs`u0(422#PM!aVp7ttEFc2t6p)SF}q zqUvzv`C8J`ujyd7Xyy%Sqaf%^E&bt(&jRR}Ut6BH?ofqTUmQ8oGt;y5q`%ljP+iQW zo$khCT)!jHt}`Q$$&?sY=wdTDGR>}r15Ti`6}m-jB4J90Fi;_IyKF5b2;gOuYCw@8 z5y_F5jUnX=KZJ|iDhu|-Xhh$>#7S(+tdLTgO9}yHJ>9g*#3kpnifk4A}+|kVG(4Hw(Ur^d>79J5}I2l7^m^` zf0;ih^QW$I>D`1g6qt7&{-_jvMG7lbKGwQ^t|i*cWL+1@Cx|Cz>W|(j0>tEnN+`T; z_*-dj#txJ*1b16YCG}Ur0BbEJ*zoZ{53p z1!T%86{O`O$E9vo&m&mx{t|3vm!{u8;ZSm3F?tY1`er=%D4rTG9au2Svohwg+KyGCSwOL*2zvYm8@sO3x+UPV)I)tpd>ks1=}zVQdE@||n3-E?VSo+*|6 zEYgiDJn`sWCYFh`pSF)On1YZOgvk~@P}%#idq{S$q{LKZCJcCW>K+A=aUxd_fGLC_ z=uBhmbm^|iwER*&{6&bFJo>>jA_jxIB@|i1>N4|4MJ-(#mEw=OgQdzfD%N4?k#;)2c zsVx`pxzs3;BcJGfq7^#b<@(*=84S{x*e3*LhfQ%F<>7RosMhJDI5i<5-qvEYy(8Y@ zv_hFRbdrYL2614jDvV+&FAyVM^x1mqMrJW1TRe-IE2f+kOja8{eiW(Vh{0$g6GszU z>iG(^@I@%TxEhuNk&MK0UFpu~WTa=!TuO>l?9+iLi-Cv;p&Vj4JCR8yP}*xYIK1rX zcjD}w8P@!_M4V&=@o0SQM_kmz-*RnFP?__y}R6+>arK0Gll-{k9zEaC}&wGr;8 zb;6ZIXR)D!;PnWV`G!syQO48T5fssS+(Y4A*QwcMT9k$A{qa#jk%Ea>jlYTQJb3)| z+3EP#vWSFacx6(r)OC9={QB&XPRSLyt$}zTgwYUBAlI*c){;s?1I{O;rER#0V3vC( zEc19JY)LqnN5>P%K$KJBs^RxjP_~}UD`qi~Oz1>vnQc~Cdb>xd(OpQK#Og311)$O# zh{a&xbN(1)BeRou-bUlP^9d9=Np$%#P5xUok{V%{P$-H*Dh*z#w@b0uA|BFd$K*;o z1S3%iIv{sQ5xzm6=V?xTzeNbo{5caw(VSd#Bha|$H{}$&AI8zzqY*L76erYI;4n<8=pM4=Gq_>Tviqs&Jf{?!A>uLMk+N!d&6GQ;i2hf;YZ;(&~ z4-4#QsaoxORD1QSzwG!HLkPMkt{AE@7Hsu7m{GlJRD3&%OH=5U zH`-j0ZlG3QIQUm_3|qccWXZh(csh=Sk`v64IM_HnC|M>i_mMb;CAfCUl9cHwT70Ry z9b_6s9)VC7hY>LHik4Wm+huDKA<=l6Y4KDVvs5TlokPWAq8U6J2!X8lz^`8m8bXX zud1R!FWJWm3mdhfseP#%jbSzOR)=lwU&kOX)P#YI7K;k&rD}bePqE0?dTqB-xh2fG z{SuLwMs{L*VC=2u-p{XwN0(MA)$?Byb$-1iS}oI_X5Am9j4co0VKKHS-{UoEfo1O3 z)rjF-VJ!+pRP7H7SNxYzv|lf`JIzDnbq2He>bi@}KFyRq$_uJa;!CTjj(Qf8&+W8- zDrVmr;X?z^L@I=4B}BTO&F^5l<5H2yK`gYcMp?(N*esadl5z&KcE65nm@kZ7#b~3_{sM-^`rEl^Ud=m@*D81<|$W@sPvvF+X;KjWP?3}itJVl%(t+L zC<0T^>^3jcScQob_7E$Si7N)Fx2Cf&kW2HiBIMOxqmeCqY-`-SwNveWb&@L6jZ4JY zL($OYA%Ee|yY@((vwomVG1IK-mTM;gOk*KLKq@rW3N>P=bmNug1U;QnV?vSuyUVcJb!{L*(PhvHencTYfMox$(+7w zIw)luiKvOY5n--Hy|mm0x;tnAzXJpr;N!$J2t1Z zcl{bB3Z4N9R#OS#8B|bM(@d4B^Xxm&ZNj96i(3x_SX>d?LqeS6B9|~^X&Y}3E~@o4 zuKOhS?%#3Ur=tF;?;Vt<-H;1f(%4E6KWf5bnO@IP2zUxnbs)xw*c@vwpr=$UvTDz+ zojSnvz2qQ-Rxr-tqIM;!P)#S>Mms`k3uh7B^e0{IJfNW~amJ1tGW5`33E4FMn0m}( zM30xXp$SLQB~Dsb$Nr31k&6Fa0MVRMHNO0 zb*C%LvB8^mYvpP`4{Rn!mev*_PP|84BoYbBUA>QQN#vMg2s&y)buVJlJlSRVx{gmgqcfd3N3Jk~UXHUZ|eY{%qIF9K&whi&FD z(#>3&EP_~UB5~17Ed)R0bv=l9xw;92Z2|q(1y~9?RL$IPGI4~Y49qLKtpr>+8A?h< zd1n+A>d+zN`iOIw&YNT~d z46#8ZJk|_@K?*YFYNCD-oiosP&W*%9;R`Wd?}Q&;S~6IL=jYE^;8(B z6I8QtdT=o|oh_Q^1#OmCPUQ3?H4T@6c*#cce1k>ZCg4k$Rm4crekh{V>IS3pn#Z44 z4?gR-p?X?mo_Irr^|c<-pNBjtS2Ylu05;LS*`S?OTllk{q#BB;@o#Fay1F{>V^nUP z#LQWX?_~V95fXHdW=uiTOi?}98F4qko-Z+)@tSbiPsv+UG}stqN)|D&DK*sEhJJ}f zt0|jy=0#FJUZtPUgB1LDWIIe~$DDE_W8=a<4U{U=+t5h(=&9jsIp#KP6;Wg*;_EU? zYNyJCyvoOIAc#8xM)_8ZjS(q;bS8N1ZJyhI!3lX2gjrLxmN1Tt};8?gn<1voWRlZZVRDs!F_j)uhFc z!Wl(IdJ25l02uOY6smvOplY?>HIZcez>}GjiS(coboZa1FlZB)>q6o2N&un3_{oPL z!JLd6c^7MgTtqlM@Z?0`Fa{b`cr{YzBn}|jrGZ5_1%@iB!F7n5FRfe=UZ>K!ke#i9 zle%RukCx^dP^m;;0NS|*t|OM1n~2Qdw#E*i$~&aRaNTGSAmKDUEvCNI3#>H>aar6# z`xzL!4|usk=e7oE!!TKt*syraHHt`PDwQT9P49=`*4zyKrL~AoPOQOf5w=u|_33$a zt;W;Lr7F}~VHmyLX80Q&Guh_ht7g=x%b6#mqPl-B4V_$#R}{KQrMqgwTos&>TT;n- zrwi6gs_EJZtf|GvfT_73AiXcG-^(2H)O#bHQNncsOJCoVuQGkcJ?(&~wYX6tm9AkL z0OTp~JONA0CBWh-xd)xtUr1KDNp||-Kb!SLHWYtlLOiU;R{+> zD%Cy8Ch`@aF6t%*oSO^Z!|vovU&b3>G~Pt`f%}wh5LUlr;?8!Fa7v4z_cDXiC?{`w zkxyQNJGo#aK-9&bnRuFeyokviW!Dt}pya=-1N<6W@*Q!Xsp~PK))<`a?Q{p--rUUk z%%$tp_2C_zU17C$BJ$D|nr7l2=E}8tRj?=eWA!6);S}vks~sN-|B$*fsWaw19_%;N zmqDfKDmNu7I}7!b^09X+KKRALEArJ<4}<9UtCmLz)jZj0GT8HDZ&O)QS!n0&KJf~X z+KC`07E>tG%gR}0P-ZWmH%Xm;GZ^}7{~hw7mm-(qm|l`ArWN%CG=&dkAt^f2A?@?Z zE3ck1Y6QfSgOnoRv6)nghruIOAh7cWxI(9*Cs8-j)M@xvZlq`6{02-RD4HI5Nao!3 z>BG8_;6Om&0RWMhD41(S4B(1jk^`s1MFqU8lETV4C1?wPONFrdR+zS7Ck(tr@{g0( z5UE&ygus~{;tYrBno`5a>N=aLQVDnV3)T%;O2xcy`BI`>&+OEnX@osg`;Dn1HNPn% zjOQ7&_i-TSrLkkFGiB!0D7v9rO`64D&)q-mrjQiwHvShfR=^TNBARxKapur9UEM&n zmrOLOs)(@L1GwvdPA|nQ?IQv_?F}$IYM1tB@I#PQ1uaGpnU9PH`6O-`-l7ziofTV& zA!=iOV^jB$mU3xg*iCr94q472w#MBF9+~C&30Rqq0p~;1$-0m&;R7f|Jo=~ zm$~JMQ53kp4jgnsxGrQA+{s2$MJjJGpQE**{vv*+ru409GAEBNl}$$+tglwele_VJ z^UrTB8Kx!#l#GarbXv5%U)%dU1x{D1{K>h9IxkbsDL+Y5SJ^*US-Jz_RsQStR^P># zo8;`9&|A|iQjsjF!a=8EOHW>-;TTp1N>gks%`l3B`HL&ova&d(M%3}Qh3hGglG~s> z+_&WXW6iE-7ZR^7P(2F>)m0HQie>$21gIcFpgQJFw|3g2LnS(BPJSGKg;N4>y_jOv zO93rV5F^sZuHJ4@dRUevVad6iv6IA#>T*CkqD6$wB&@OIg+^H))m3ipnW7}@DoyKt zNrtdan$2^{32N*ZqzW2H?+c4dG`wk0I-L!?z(2(L%hUb2DO>J*jbgY)Xfnq0nx&H6 zT)qAgCUO-M&DdJg3cg<|O~N)+?8WaH|3&RUOHn|p@Uo>Aq7l$i7oWSjxyF0Bg!e)+ z6htJ7xqHt&JhT-jP1Q*IjJn>*Y@XEST$8EmDa{b_7D*W*rrV+k`?Mn0<|6czavjnK zg%h%e1RRL6E*d+srkl|*226W;-Nf>&^3m|?o0ew5E!ox zR;7s=3^|W<`5y^>K7b%1!XH!DhePwoP;-wLmVTlB@d>s1(4MJ*>=cHW=&)&y{KQYj z-xgJmv-rtZ)l%E*J8M0hLPzZuIto$98G_775=3oOjkM+pP{()sQkFmy3FF%3qDP3a zh)r$Hu9u=ETUt}qn2@qhBgzj{z8Rnwr zaD2W?XGVoQ1QfP@NjWLD8_Fi}BWe z*ShhSTFeb#$1aIcTw}?c-42=b2;s7`_jT5H48IG)fSbhJNTZK;Bdr?QqOfnqZ@IQ> z4TC9%N8zm^9EhEB<=Yp+2y_m$vKC;-d*=Z`^O~bW>aQZslhDIOMXaORx{mcG#N)H+ zRDWWzMVX|juO=BBs_?2b2ylxVNZhs*b>PmL6CRr8sfCCx3xXJ`5h9TGRW5vo2aM^= zpFPOL2D@1=RcBkP9v-m>Ym4czL+vG~Hri=2{<>=upE~Z~OPK!IW$mf@o6&qxf7$6&?0p zU%skZ-|RH34*m(CwEWnTQzm5|5eUTauZIM_AT3U|6lk7nyowTF|w$=0& z>N7Y0vy~Nl5!H;Du)O#SQqQHgB}0n%h?{tyT)K5%J}yr`2 z;kL4MRWbjkb#J6xiWqtd0h>YL3fjbi$yL4@3`viqna789cmsUoXzlW;Sq3#vb3R{J z6%AQ+P)D-eyM@%yY&#p8kHkm;M5B?c5>@6*Q(FlGkY1@Ad0GNtD+I?n^_hPZ$m_H^ z8Zo+vk!CVkTgow{BWYvjvG&^h6?I1Ska4Hnj&kO-;ucGWS5VN0wPt&V>VId@=^D&PX#lQ94D6&K8bqLvL7qhoC&?9#Dq#$tT2mtNeA`2| zBFjcaA7UIWljVR%8^obX%=x;d7GXGwsMlE$t$cGxr40h5#Bl zahU5u1p`Z2{6(d@lJ#2FT(iZgDI>4E!Asah9^ysbYPk~>f15s6mt-QD^T42*H)bI* z@R7#xf{U_y=Q2N1ghpWzyTSu+gc>c>+WPmeHkjg|x9p@tmMHxdZI@qi^B+!zh^MG1 z+P9Nm-MW-q;uCM7K)2l;t8Iyrd_{z$V19n{r_(kw^GHiH>MUAFc?>YW3bA}ptkkT1 zu@y{lDXDX4>5){2S4_jvH#W}|=Dw-1_}O&-v#ldAv>RBVN3|WU_;67CHIFZSR?*8& zt=3qnJ3=r$gyJ+prk!;wg6dT^HfzV$S||PgTc4ff_=={;fF6mm8F}co9j-GCd9z+u zy~^W+@QmsU?UwaC2y*MIhsuCmW1|yOLt3|E%&eURFI8{?hRC4-Tf`rGca^Ckq$|u_z03GBSlxACf!?CkD4mn)Y3I_ z!4M~uT!|n>vzOJkv#m3=#ieZc5^Dprpp0mgsN3A+IekW&lCQg5R$UP*v~5YMe2Mh! z>c5s5fy`X%WvMuG<_NfhjK1KLf+&N+@FslFqH#DF+O5n@z2+Y2m`ZFA1q zk{UyEUj4J9+519$f$+ejM zA#^;*3J(=T5>`ijrqb}4OHhO+36nWG8NJ;F^Lt4hTyF|x#WF|!^w80o75w?fB)H0F4 zQI-$8*YS1SK0!Kqh%sW%#UZ5;MZ#8=?V50!b4Fl;IjAnV!z5`Q`fGMmt6kQx=qy|= z3KSynoB~l$Acg}Gh(J9_-^~bCF3`ymDY3*O#y>evgLwn&9Z2uOVkm?%@UO{0UW=Fc z6Ou%$hDQ8cL~T^KYJ{pa=3k4>L~H3x8b{|i@OBTFj@0TIfRH5U#=6t&%W8!|FW(ac->J5M^6$e_senPcvD|*&Pu%f4M1cDXqht zf|MHi2aXQwfT z-Jdjv4Z-%O8MJGa-(Eh}(>9*(R(64};wg7t!jIaLUM|dcVG31x`Q;Xsf@C)edUSiS z0*Lx~JX;=i!*$}E|J=pQmiOL2OYgyv;_sFUGWkzJ36yoX-NW5w%c~8!tRx#wnar2C zQ)cWKhRtK2Tg!Tb0AMLl6*+LiJy7$Bi*)dR|FmQYU}@&w#6Mhv(eh#mWWEF6}UfzfBxccU5FZn^N8 z;tRL6B=Tw;y91z!#$z#-o>uL%K9diHLRQ(g^Hf^8MKK8YCYq|PI{Od9TYl7whB5(m zrtoQmWU~0oimE!|v-v5ZBV=MlDVZuKsM1N_*r?zj!M*PnA}E!(VZsdK|Cu_384o{f zFzpDbO+X_aE5|5Z3bauQLc&b1v$H59OV?kB(kGZgwS@luR^reRD>8bjnNJ! z28?~NTgAFJ(ha;C&z{F-;eha8GP7kZSiY|DPfBs*OT%y9Fi@!+w@ci?gI~2wS<>!$ zdA$5P9fP`^{D|3%6%HQXTBne=BmGmB;T?EI?JL>s+BoV`X`+fKDTDlD1ace*U>ATC zen=Xw-Z!Fa0L~LymtNYyPs=A zg?=!Pbk0pZkV+tgAp!uHM_m>Vr*?5quCbokp@Se7#pLrd(mNf zwxhnhM7#OToaIi9#pDB{GthWha7Ee3OVZaf-FMSBd(AZ$A`ZWZN9|T4n2`i!DBr|O zh1OjzoC+p?gSAuWEH1uVRe;OdU-?lvrG&kVDPa?{bAK?b&AkDtAs>aQ0HU@~|DLfa zr(E>8Xs4bTS%CI?{@1k|THYVoT|?z-&sj8?5u%ue7_PVbEpMSuF1Z;Z6Puv>WjD3A z0_L?VD3P%xJV4R6tqIN8V^ZuYVFN>vk76wSBHKfiBk2=K%)o~@>_*sSO7zQ0(>
`d?Kbrc~DsVR~|)sFa{>tvLLp=Ci#=5h;{@QXNb$DA|+ zGbfTOwrLvdSB9(yTMnh&0aRE>u2Ye|Kt}$3AlMLN+aXg$7Z1~HGTZ}Q@XRp6nE;*8 zpWwJ5TIXYj?0(y(O#Nj+br;4stXy@Grrm3Wl_ieyE0x{zVM=!i*LdM9-fxJ%Y09Np z3~Mn-6r}|B`lfhOaT?v>Q;+_|p@{`(X+M5K0x_HC&rB>8wJD7^)0ZOfoG24~&XuG+rbKl%>E;uhF>`?|OYj z8{phA=S$SJ!bP$%01Ho+-oj2yQpzKh$KdS*jD#t>`oRou-fN^=vh(`pXx{WzW44u69KKp6(RyZ71gyhWK7;Oe%nwmpJj2 z06*W=h)k+?km(v_I9{PfXvD=2sIgTK*fS4OxGwi#t zmCZGjut7kC5ts^oLfA;qMoIUjK{uox7Wkc0_HQZdY|iCeiuaF;;vc&CzqQCPQ}>8|I8%$<5dx07aGKL-BXm zF%JUMsTOpMY0(`BX*b|l<66A%fhYo=;UdQy<|b8yH+A7qNt=5U45`t?cD0vWD7j_k z{$u@5tvr?$BFAkE@=*$|>3GWysEhBQi$o{J-dPK}eljl&wCJSs+Yi_N^%^ZLI8&5D z;l>Rl+_FX%@pfg5Eu4J3s|yCyVbTcMB#P2c%KCowDAk&lqmx&I8t_{e+gzhDr4!UQ znLusRnGpfXSY41`peE3UWs?p}4IVyt6N;W=fSzdeW&|@Z6ne_`4Tx|ILu;Y1 z8RWz^Ybg^Mc1uRh3>Cs6R_Kl?*6AXx7ifv95w%n-u8GS43&3oAo+>0Tq1KrIT7jGn z75{@WyQpUc%McxQ;v3N@+Z=^9bD^E>u6*sDzh$W-;yu6PxE%5v8I+grxm`(PuD50X z#Pp;5`FIl56Y9H0sLkDoZcZiB-3npr%RPZDC6YEQ#&BQR~4A+r0(?XXv9`I}GCtg)3y zI0-~K-%df{@eY$oYBK0{h{x`jnCL^b_1hO3t81{`UQYm4sCgI!d3Wu3J zow0*R+kXK~O#$!#r&+lkR9pC3b$3vOj2U(zi$rr1tey$fG(7PUoQD(mMPGWeiZJ6V z-^yusnJ}@3X|O?WBhHQqwQtp^%EEa#NJ<`+)0d?Sier+R7?XREB9~uYMBTDeDlz40 z0N_1rb3%iiWkDxu6Sd+R#yj55FVwA#oTHFq+ykZ1cDT zNPxZ`@m`NU*lA3}4KrM7VjjtyC!O+gt`{;5vP~PyY6qhy7w7Z2Z-iH6_nXqqr*@I| zFcPuO`&T_OCTPvF68Kc<+Xr=c|L|2TInE@nGpLPs65yjnZJq}f9v3=Jxwky*BD%@#)+hw z6&F0dq=C3Dv!j9eA6ZB{6msHDw9u4h9gjUyG70*HFkvugUXk+D=kV+6*3t6pkWKxq z5nW{{YlC$YZ7;QcKGXnYs7-vr*XeGbLmF!(sDBT*tPn3D5wB2FM&uLy;7FL_pf157 zUhW-;x&mIJ2S^&=lL+9=azT(8DCyY!c9W7F*fXM~C>9am-V?N5 zOO0k?8+I~)Qa>87t9XfqcP)L5!;9d6dGsv;uBazLB_%?NU6t%bS?GdJQFuo(x_eRI zdArZ%mQ&{VB0#i+jKyVgAuhDkd7;3;$m(L<2*CHIIB>KbRE2xj=?$*87S25RSGBK~ zcA_N}1SJ!a5w?QK@7hT_gp+&?z^=@Nmz!#xOnoEjomZfs2#EqQzg5*>kU#bzm{MM` zHq8hAs-fr@1*+^AF^lZ@h;bf7qUUblp4ZuZ~onQX8F)|V4#tihixycuxZ`9iRCKGrwJDk39WkCVm|r0qAd}UaPEJR(st<);yT~alKH+XFBDc9B{pGk+?l<>vG-ol? z)Qr?bIBK*)jAg>>w8VD+r}Hf?Sj_=wj#pAEkHHcRGAu52E`x04Z>cTECaxVZTOvh2 zc`SQVE)dAB@ZC$Q&6JU!O?$kF_+)!&HLd&m3d8T}YyrueL!-Tjf)$SZToOaao zodQ$vM<@~DdMQeASW4o-5*cLCb8=99y%9V@V;9Lt?v49%Q=}VYN(pL)mjV~O1@uVGKgnbEav=fMRy$k@@v7m|}DPNjPgE%0P)#ap~DyX4{%3$9t+Ys3ZWmnvJ zO$$16(yr*$tzu7~(A(~0M+La>o0kUngWgJFc z)R$x~Ru2RPY30X-M7f+`p9M>H(4;kC%GW~uj5)dNXq%tAd6#Bdd z=%A=74W!{G8>C$c$Y2ZcbpP=SrMr*){IsLbmBULsdp`+#N~7A6zE0r6 z0z6ds9CGQF$Ea3F>viI;XWsDIC1(H2jk+J^4}WvUQh#~uK)6>2FH zI=Zz$o04%=6g~3jgG5ORfS4nm1ihD=+?r`gZJ@)G#wd%2>{rx>(Q5ttUTK3l_E6K) zMFx@BVsg0{m$>fhip$mXIc9l|XF6_dgoYI2P{^Px4nMuxSK|;@G1^v{6Ost&{i0I$ zSd({!9bzTGqeEcIo#D?DcmDSb?}fQwU)^U2CEpWf7?~f-)j|8GTiLtm5EUt z)lgbnNkM?>-gdRO(5JZhWYbU3Hi3E>r&#M;e+y+l+=z9hA#pY5EHb3EeR0f@&&oxC zYiCLrOLpLow=I&m5Q7BUv(p5JyTQH5`B3>=WS&&qCD#>cE@{e}3fyF7$QD5?RxFr_ zl=o#LO6{!Fjaup^+lR=uI+z~Wmo@qLC60#7s;Z*A;8%1#4~Z6N*sCx zfan6KD#N`qOx;ue?@LI3XTNaxaM{D;W)8x-vq8q+gMky=8VLzE*1uJZx36`Dy?e@R z2&Ce}W=6{J7K1FcMJ(@T&b-$KEz#VVU!{N2VwM7EDah>aUpby*EZVJaXiAE;wP4Dib04)#Ho0?TcRMC^xY52SRYw5k|RPblNHfi4VOCrsNF)@r_tx8(r zPjl1MSAJscA4L!`5hb8wia<&l$<{h7o5#yp)l>hx7Db)9%8AAabe>{{aJiNqEd7r;mai26SV zOLUk@B}$#8+wQl1eB9l4as5^<{zON9_$@lkAvJfHwaO9ZQ@=?;4uNY>>Ewc^h^H_2 zr2WNI{c+S}VsC;irW&GUOm|hB^5V$vuP>0858^1wL9#5BIO|eP%39*SV#K6^m0Qj_ z1FTP|LMf-`w&jiNKbq* zbkBC5iVRyiMpRan$4(W)^gjmSS`-7IE?W%=3ui?>YMO7zkhNl$g}a-COD0MYM-|;l z3zKuWjUqjK^=EF}(gLxt3FYx6nI3z;n;Sq$i;ZX0?IT(QSqh#*8`X{5D}R0ZXMNgs z>zxSj??fU2Xjz1L#xe*o^h7g`^@xj^H(u)g`sQfrvb&1ePZbhs@yKToDODBSvsw9f z3$rw+MQPL$qkls=y(XlL66s#e4$_o(L&jLp93+{M>NAl~Q&<5EAm1h-3l1d9>X-(ndsx)q!2UI9t zEPT#CbfeoF}i_|ilF4^l~!;+%v~m#*x_ z2uNrCN%{h${~3isiQr?IX3a@L;Y5+nNEA`o5%xvesJtp+#?3FxM}UV-k!3OoJx9}= z0?4Dx)|-NiuEc$wX`}eo7RkO&&8@zp-a~Q3k+w~OxBinY-wnMLaldpfklun$w52j+ zwQuIAkU4G7Wg%W;>8$1LWNSJPmIJ9YPrs07vvh)N`iE=cN&L7d3`ZtZr`S8=5x`QG z;@D5MrZk72091SbHiv&v*TeKX7Z)s7F_;u# z9F)7MUYcCX(knf_q-J@fp4gi>;=)5sE>Eso=e!GR#*M%nqfOeFp%T_+lHw@dMgXl; z`6}GzV?jaQxsQbJWS>dL&0IDb002ZlyT6;U73ELfuV?aN7-SaWL%D+TRMm3Y?dFcW z^ojasp3b8)=t36FFry{ea!{+`mL@}VgH$MrxBns%UBad+F4zO0#NyIGu+enlu1^C5 zp9+@%mNmA6n7Dq5ko#9O(EwBrr$`(kq+$Yy))tm75;U1YoVO|`My{aC6eS7-k6)5a zqwnut_c{oRE68%pYl#{(>;?b%l*TCzfSg?~jpc{L=XqzIJ-@FG6K~d{2t=XeJkoJAdTZJ=r+*<4!(KUmSn(K_RZAURm%#&v!R@ zPEG^@LF>T)O$tWP3c_J0wC1#=R|~7`cO7U!j@_QQd78%hX_Q@C3qvZGCTz6v3%4_P z$}E#l3`=GXNApZ?i!)1H!APvF55WsZv7b2X`AYQ1xbk!2;C_V-9`^3c2@Mg`e5CaYRGfb?ci5w$6a+8tLh?Ge^ zt}gocHoTHjJmRmLL{n_+F-;ZR)>Svkgwr5(f5h=nxEW)3Br@5`&9GFu;v6(8w=8 z1T=HUnqgrz-%FUWaFb%4L@wMm#hQsNDq3UoJ<+5b+U%E56E3uVlzDR8AA|uQiZX&D z#ZnSgA$)HalR*wY$~35x?^@^xQK$b>EvO|sD&}Ivze=%-MuVo#H&lf7#Mi>{mYp|A zks=ecYgHOlt#o@RT`ZdJjX^@sjWH3GZsiJPH1mEQ{bvSj@{}H{V@vFO3)F6jUMu8H z`&-e@BPyF_<$iK%*jrZ&I6NcORFUl{474m3`crv;2!eFMIK(^!PGJNzLZk^(3@1-g z`5d^wenqXajzlot+#Noc8qAhN_Pp+o1!TP z(IMStp!_-t1^^J@3L8K69|-tkjJ4@PA{t5!q*u-;EyW%{nZahF7fDg!z|borLPGLi zr7^(0DM3IY7jZ8X3fc%8g4*KVx0T852<*`=V$PdJI)|}vh)x)$!6~%XUZjP%C*+Yu zZ%dEl>P*a#=DJzZ5`x(iCPz<#HON7Espzj=HAT0akVw4_AfxQAj5Q3Q{ zHZ57oyt;N;u5iZhmrE%UdX(H$cP{U=yEU8 zQmej#Q;kqt)wqTZVwGri2%8%D$t*PDiVUmlC4;hENJ^ zjuGGYdnng$(C#{gDZCQK5m-{`1T*Mp1{5ZM_dIFK-BnQ=eh9K8ysbYxk-{MDX0M=$ z@+P6qn8l|Q2X)I#DGldZ?$w6HHeJ^!*6CJ_tgdVqR^_Ms)n)J?6_i+moU@?2;>F2+ zG*A=eGZ2Q*C9hRv34+p6@7`-&F4-bu+#swg8CSv#m4-TR7H=;%X#`9oLTH!~fjx;hvT;4hK{zi|MvwGoUAww`H9L4GT@w7gF9mT|J>%Cc~7 zzR}5Ma{;=lWvf>uOnM6k$Wi#|^$&vS{nkq*NfFkKW&g3`cadbRr9^Z}z$!SBR*X3n z0UPzpzicECwrE2rk2nu&Hgwh1pDI7zR{eyO~ zBtyq(mcGl}(h#p9isD60GNv%Ic2kDSWdLTAD}7dh=Fv(yWh)DoQoN_VGgm}vr6Im4 zT>=(uOmp)3RASNLbOGh&$UyZXq>r- z;n_W)lc{Terg@G-!S(RDWblkn0{e&6DyxcApisYtKgp=WW_}b0mkTJcz|}mjo(yu- zNQe_XE_sx^7Ok(tLkWbl#p9Yyv_j_1-qU)o)5U#ngVG63Vrka=Ahfh@l;(-@M=YO$@d_XwZbM>vx1`pVvNdm5CSYl&`%!4bO(+ zc?mYSX#8cR*S)^Eyc-qOu88)D#+ZEx#8+WDzgXkEb`@3E(t~F2Qw3SK-=p(F|M|_T zT#)W2<*ie=gy&H-5H<8BwO4W@{z+pG2AuFGgtGbys*@1t5QXMNmM(7Wp(BNiTT7E@ zvMZ>x?8b-_G`^yEm#bISe4xwVh$K7xj}7+?l&x#_h^HaVdon|_2>ehRSwzGFh`=j~ zrYFW|*A*``n+{6`=~$**5ZfLHaAJ7h$zWmb;UQH>2bF;<^h+NMC`IUrM9--wy1A)* z7LetYAY^r%lxV~%(1pu$Kr=_Rw$QQHKLn5H!or6fae zus4RX3{j}xMz6zzYpb;`P8v(8qu_wUov%xE&RF-^n)$QSDN-k^kv|jhaJbX1eK}Aw zyE1;Hy4H>uuqJbjBVz12sZx|R{mb+#DH`pFRV+I>nau0vG-$28Ptr+$l~ysSyxP{n z)B2f5jSo^Z6NIykMDgu@cjTXw5Po8`#rK<@+Hs&XXmo29;%<2tjOx)z73dRj2 zzeTJ6YhPg`(sJ_EsqP0NoZizaE#5N}sp|Fe@66RHAhZeM3;fdDwO zx1}lbFJX=(s}kJ;?`KJREhCXC2Hr(MRQQCHIQnL&K?xPJkLOE>&`8WEJ_I+03v(tD zR@kMyC9?rjJg1Z^2YC_R(eXzRza3=6A~GuZL(&w2!n6dr^chwq9SORuHPTZ1r?e*> zNs6CFMGf&}Ekz8K|JVdPvC~VkZ1oo~yuVCC4u&V~xxVFNFajfmQY#gJn2w4O)V!|` zjM~+3yr7i@`nrd8yJa}XhW!FOj3rgz#G&HP24o-`V6y07t*gC? zAgB=H$g-|+bOa=DzayF8DQuL=8lczXAeRLJh7(|8CXnROl8n^@&fIo81OkX?;x1l; z@L~Tq1o06N&GJaUifewUNOEU2$xu94tFwEL`sMb{s$EXh9&T!#PNI zk~v73zbn;R9d5uMLcuf49ZZw|96;o?O^X&gy>8x_R`vz3nDd;OB;>!3PW5hrMBfe< z{(5qe#c;(T>6(>O6^q^&`<3g3FGwXWP-Fzxo8Y#KC-^GJTYO2Vgn0XmFqsKLP*5(q z>nJ=&=zAu@MsQ<`baZW-ZGIUB@1f)a9sE-Yu*heDuZU@gg4AOBqf%3gIDdmp^o1ct zUi)budxFza-76r#G0}9fytB&L96>6zQg!iL`Wsag4PagIut@YlH-OVxt=F zM4p48=IB%(Kj&m27#HZMfn$@2o-sn~oJ6Wz9^PhP>UyQj3jos@vnyjC7VQq-ZIY>j z32CTIB8u9}E}~#W58%lU6a+<^_&@lVCNTx^;-lsXX;%sK8?ApNN~qx#CM9{9Hk>~e zr8B@ic)rF8IGBCF#y3^&NU;3z zYuS@|bEexF9#Ij44}5SBx5;yk`@;7{R~(LIu?Dshd}KK>&6j~JR+L*mBO>W0AUjM) za%iSpVQ-cv@bC$;D!?~xu}glHpD`J`Ta)J3sBWyRx4A~Lj$J( zq{69O+v!`*(sjI)xglggSCK{JiZ&hD;95kP%J*4F=UN(#l8Blp(e_VAH#rP-q8ckjU6_4JyELazlnxGa0`Dz zfN!1z=fPYySZ&~Thw*9!Xe6x%sH7GnQHU+Xldz924f+&k#m|ep)QezVFO^C3qY+Bu zAf^hq{f&d6J1bacjw#a62|*H2hw|2}TP5w8bZo%oK2c7(q7aLkh>R~)B&yfsxqgoJ z_=dq(`5_KP;K_1!t0~zS*Ug#JU3dJiw0hktX%qHxZQd(h-AWuvX1oP~Qoh3#z8Z2l@dj@ zZf}%yP`s0|IA&RN3T|DO{-OF}>V-1b!r4`!#Pvq{`$%^8xA3Rrr{obXA!wBti@C(g zTHgPm&aM`)-m%?@5(5O{dhqY!pLZusea_i9mO#>3XQFjxiO6u@OjKIhtls#O5<9$t z67{_GF2xqQf3e<2k;k|Hkk>*VQtHJPWxZ};Qt8HS`wC(9U;gQMH}DtGEog(tD7gn* zf{Z~07zn6_i}I$XTnEHwvSr+lAGR{=VM`Td5gG%t${WWWSXE)mL2ovap>0zN%OeeT zaWjnWkxlSiVXQ|Tlv0*nf$NMZLpr`{OR8j`$f?AgZU{IZ(l(CtJ3V#1%B9&0@-RcG{OLaWgDL;j1!t)>#Q{s773sxV@`%3)Cx1 z$3-q0Nzdgrv$-&rZ3ja!R8y-oCkBTWRS?#8abQu2i`GgdFUT!vQGs1TYrNe8!ndZ|?6g%MYyw_K_to!uqrwe=HHiZ!vXbB$mp9Rf+N{VU_yQb(c zM)M9+{v}B(dNGbmyp$KSc#*&13<}$3JVsBfLjr0@8Yl*#y%A@qf8551k(MNQfxezM z?^(g~^(XhvlhZ8oNFgPXVJwl$&QhYyRFWB8ejC&}rCq3_k z%ONg6w+K?*Dpyp?vC3K~m){RhiDP>#I$$7f0rBxkw3 zP30vJG{+v*ZzL-M!-pvxQc7j5dF~mc(B@DL>xbm~yImaLw@P<69(LM`g1KA{0V5E+ zhcNs{G~tQSO(i19Sh^*$p}G{a(4hi47|S6|1fVc^lJqiXd9NKXAcWUoCIM3;S|b`V zM)$6)2;5_I*6K05JzPMMb$HY4s|?mvSvL>#ow%m!3)+KLYFf1dg5io5f>4zTeQ32v zX_mDO2qW>-UXHCTw-Q)n;f@qSnvoCAJEKY*o^M5ua6 z7aZBWoSqdi=PX7t5{s!gTCo#}Y$lWLRY|R*+r3QQ!9Gl0R4-qYHXrpz<2=@sogYdm z`a)$rtvk75K-fnIO4u2jOsr+p$NrSrZ}|Iksm|a1rYDTmBl;AQW^$W%%p4*jV?+_t z5~qZ^g;*gpQ9=v**rF2@;8WBVpy8b@@IiQ9F>uotQ9y(j5~M@x_Yy8pH|IpwV&Aty z6rJ*C^3Cx9?(6R5@gMU)^W)4=u`_YI+?W-cIB*9NeEJq8i~an+L^ONdydioWA~iur zG!^c9so(g?*eK2K1LwiLzL<0xT_~nJwCd&vi;xx6gaqKW8EH$86G0$5#>$=GA!uwt z3waIEY~PtUYN<=h7G%qmi@Ckbsud_srsf2Jk_BO!+ND8=^)uxgXw1MzD8Dr8zaz_g zA`|wmdqU`1+TE?rTBBEgYfmr0fin|EMsrYkrA{-gjKAP3{ROJki09&CyBLzeb+3Tp zdZq*%sF4=Op_Dhd1H_yV1w$px=~6$|z0nq4lFZt^uJ_RiZE2R+I=tJ`6Pl=dFWtZC zg;siZGzLwPpxxmY3o}R9CdMFk9c3@KZoj#>g#z1!6ogs*G_EP1?w$^*`C(Z54Zm9} zo@mKIxYTZ{jDLgOQgxTk)&AP$&^LALMwtgmN}gYFY1`bVnCB6!QNInjK`3bd_tCNP zU8@<`Tv&#cw~=#FEhc0m0m#b7sY#XXvK0r+Z`c=CylDnEFzJ1tM7(wLI1>gSgczFZ znbMuN3T`l%l<8B&tDjFW*$NUt?6nFT3G1xlTOg`+e)f;Bmpaixi=1=k+dU28Buyyy z3Xj88d_~fbvL%$1H*hIKL^r~uGlJ+YKSHmJz&6-J`np$+fLICB9ro=lIWmRBfOC$P zJIqPFSe=d0CP&=`IrB~IK@bcwWO^`N9x?9gNHMWS$ty4J6u;P+#r^46p6tB3?V?V%s89q~qkcb% z#Q#&^iq2MzCe&0S&ND(;thNf2S5%x4j_l6^QHMNGZXq zTH}hOVkClfvMqalvU(ewCdM{Y(B0+I%mRJi~!NEV!xtLn*3%P>WO3decb+nY4mDV1`Y(Xwy-7q*y{Azs?mHp;RS z#T(1+*LwWE4FwYUd)cu%UDOu>rbuGDmC1T{onu*dvh{7wrvYn+eb8v^5i(0*`hRH? z&d8)G93V_08eY;gr;$v@9?DXRp=i+S0Sh2Sf+x-+=x+Ugd6S9>mZGfp<(~Aoj9QG^ z5cn5^63f9*Wy{)*P%%Ui5G#FL1koN_CQ6AbSM|AkyX1~5dxZ%x$)XkruVN0F~F?$y#QvSaRyv;WO_|1@YR1uayssnq42R86w zIC)fIYq-Wo=z(?$_MR>?B#kbDAUFg@w!wZ|t>@U~kID~=5hh;9b&csCBVCK`Q?3iEWGeSm8CpcOF&IK6UB2X8{ks&f1mkV^)RG6C<98v_lQ127 z>TsLm{(aiukV2ZJFGzQ_`V9#y62eHQt}de_1@Qrt|7F`Z?a%9zIvh=tb%PLCFiHma znZ9VE9~q?Mx$jIR)G<%tNccfQCCpMZnJQjwlzUS8!PdeP%W^fOB~0G3oK^w^qXh8C zBM6h{VkFW5WDo@gh>wUX!qj6u=JT%nGev3Mb&avXh?TZkOp=5g&mR~W09#`QN8Ga6 z>0J-eVy^`0>(SLmry5QeQl$fEGiyn0AN5v4xN?&MkY9}#ZZ7=3JAkv{U_s^ceLz4f z73y|bY_}4A2;lcvvJGvim89_b8(c(1xc(T@5bdIfG=a<=0x*1nWKy>D`O0m1!sHrd zIyzgS92&*r8`I>y_GApnT+v&G7!E~7=1a(yQoYxyAW369Kgu^(5^#=WMkcpsZpod3 zp#VDJ1HCx7AOx`t@-n&OnW$s;t@Id9i@L7*(F1ImR?MndNQZdG738ctLEsRBkW{(N zCk(^s6@KMt5{HRDf6{6)3*%zt6x>j+%Ud>zUFIj&|Cm&X_FvHeF(!sQFQPv5zT20< z&{Il?&~7H&`z^MWcYUdb|#7kpPJAVlY!!0aET29PE@%z zYQ_|U;&F({g~t+fVwzeDH`Q@hHJTo6o1G_X(OON;Pxj zBlTn92?2vSgeOc*sI;K3Wg0-6&cUyd!A%M5k#t=UELS-^CfKlW3qF!{)@2CGuDyDv zW^JSo-!uV(o;MOfV6fF0m8G6}hX7)fv^*y_(mA@p#*?fo` zRn1Yg4;W{RQZD@aOuq7s2O+jrkZV!7H&W#TeaF5>>nnC@k-N(0c-k}`ZinFwPI7HK z6WKNh`qJVMQL4hkW1lf3R#?F!2nrOz@W-4^YFh}{&+2<{O;PEiE=jL@dvB|sC7o!M zXuDkOl_fp~&Ip`S7DE#83MEp$Xg#vZgQKaI$0OGLM3-VSNX2s&%je5>ul*XOsVUYl zddaofK7b$+-YgvVq@wV~yeD^+*y=w0?Z>JYz>-{)YdxP_q@oO|OxHkAzfvdPS#b|( zD55LN632}5?r~~QGpf>mYaRJ~#ib{2l>k(WanM~}>Iko}nO{X4r#)(#6iSR!XN`5p z7Kd=6vUzSla_&>pVlGC-ilJ7z`gr@nt`f38OcM{Fx)Xy4L?%7jjiFV5(|EW27Ae?K z85)jy3WsA^jhPQ#x`v#&v_o4r$^Ud`q3mKJJ5E7$H1`tlv66q~L+BI>-8$EG`Sm=iM(M1WIa z;F2buz`8{*86^2FSy9%=-~s)aK%%(OH*O^gTXg#Wi^lBkDb7Ro_hp1ar)&Z=#_Oy)}U zXR`oU6jqmOmoy);Q=$nX&3((A(=o1(OCX%WW07Anpct1;e+T;#+lDmx3Uxz-5$NQ2 z*N_t%uGeri6RDD*wjr_{dWBmx5l^Ae9qNKeLGe(N5|B<6(fYJ;R;JFi>-$~uZE`wS zSIhOE_NYa#PPZ#|i)gTO6wq>D#LW^Y0a2K)@nkHcZSwbbqN6S>?bS*Zf%XM)YEyW~E(wU{TvN-S#NnH%V# znV%LEC@4kTZ)2^veH;OuB^3vJnIa?Y)%Xe5G(Qc5VS@XOm1N4+Zr++HUwG@DGMab|0N@2$(GcMqZocmWiUjO=4HOiy{W~!O96G~-Zvzv zF_G2tRy3)?=GUqejcsLpDJ52?;M@O-RK9|Rcq7fuNZfrn9|UG^&D5dq+Fpz}<!!cjuSEO$e7p(=LHc#C@LmITo26xhy}mv);a0;gL@v+T9MO;UK>9o?Bd zr2hSYnN_O}-^$0E1FHfV2;4+Opqvd_3v@3DLhzmub)6qS#Hsms73g%T z3_-R?Z3J+J%p%paB7pDyfoFx8LUydp{s^+jw^D{)c-V#)A;C0gqKa;72N{4gle8Nq zjY(@sNEM=p#ykGXz1x;4VFC$~DKxvo$Ui$2OQONiG(V`!vQQ#Tvjgq|!>DHukpFKk zTfw#M4-}CU>E0Gq9Zh8VzX`%gl!IqLX=WMEx5;RkKo&w&Cm-j2vxSX>E>;x$n8!NP zP30=_UQQml3S|{<_+Ap@q=+hi1jDI-KE(+LEbW#M#{rV9lNYVDJ_AWOp!ORvSs1qQ z%KOL5nWzlM?B^#Xf=`&#A;^vFG!6<5vv9!IoFNm@+9P<#HFQv+$B*d2aEO#+N2V1y zEiTYAquPvxz}iS=6-BJKsHa1f#HdN|Oa~vZCLE*u5(Dv|%QUYAD^8JU&S6qRNOA)2Vig@K& z&>~hNBVfJ+P1E3=-tBNY!zsDC7oCq6(N2r}J1 zQmpk+K;+TCYe5Lc)tOxM<#Hp7|KtBX^w2v(Iw_pzT!lr1XeBT%8Abg0Dzp(BIMegR zAkUi--}Lf=fG8U!_ZcwQ&I(iQ|F0L z6H65+_;j%nigV*s=Egl{NZ*qC!i0H<5$$?)IQG0c6n@n~0#Vb(jspkoM4Gr`_)DnF zCMRWB!{yC4+|#~F#?eWw!LZ0tVUr56cPbKQ!q_2or%iI{4lI}0~36eg9xBx4rlBur_@ z$RKc6_wmWRjC}hhLA^SXA;~)1!Pfz%sGWhx%gEOzj&4%>oHX7*EL{9e5k%1$t3vFJ zmZtu9EE&TNxnj`-La@*yyv2}ZAlr$ozBPKPqhFqD_#s$g{JTa%y9Gn9faufYUI`(g z_>y4>@gu7Fo^_=IGeAv|j2m%SV^jAx{FOh|0>#as3t0tf1acd)187g14d z_M$Im9j~FUGFL&&B*P5u686Ig87o#{cI+hHXK_AlMTTk@eOMnHsYfH-2iJF8$G~+7 z!;ZtLVzf`gj(ox=a+36~C3|M5V%eu{y}fkoe({@Sw{i_Ym`jGtqOGsKEj7_ep@Lg+ z`WQ&e$_Cn$<2Tf0$XdYSiJy54G)-SZ84Hkz%ojr4l#&ek96*OfVCR1ja~S7o1yIL5u;E~I$@_mj(x{L z!X)pu-q=Zgz}7L=5|}E3TeJ<2*g40^oTkqc$fxU zs_`CPBJ}Ztgtjn4?+j7UFc%{+QECmLE}9sJui% zyvZ<=2ds7)9x*PNE!oN|q91ASKCi~MmRyRp3@btuB_jk$8LE)k?G8akxD^4K?tmYn zsDp+UftG_Ll>fp5QK;if4VHW;O`(W5#KL$qR#W0^Nep-cP&wD1cEE^Uqd6JkOR(?y zaLZ3D#)2X}8K+$O77~MZ8XmMU- zn8sQASYR*-NC~G-AdaRPvzvsH6@YQXij)EMWUU&XB*}@gzacl)Si{UqGL8^HP7p6E zj(G-Qkdu$zEXWsRt1=7bbi{CsTy+`aD=U9Ui+5`)$h)ln-O1_V^FSS+Y>S1NCPClsiGs=Xldg)q9vmq;I`eK$ZzS;(_ zS*P*on^n0cE4>c&gJ$9swpm` z0B_7PYMPtHmZ#hxClgFx(`~V%A)5r=K&-Ktb&ZN9IJa4K-4;U9oI3}-T+!SaWerGA zjcOGm;`*PxkNHdboWoA&s=FRCG7A@q83rQlzlDP0UO^oD6LB^jIDXJcqLonGRk^=Z zB7q*63PAM&yq+56?flYn0C9yRVCe^P;&e6+S)f}UFYO*M$`|aHuowQ&Vr3xD{T5A7 zfP;YEQ-nk)D8yy#0|+s}P5uy}G1y^+S8#$W1-ec5pD##aaJdop_@=+&qtq@6-gB5n zzZ4tdiZ&S11_@zb`htI>FN;u&f;Ip6Sr{BYPWOiRNcs!<^ZHKtqWRMKndTez#PpCd z>nX}@W}_TE$O{55)5FS17NcMMXLv)PzVd^-vq%u9{V&N7h)NfBUugYi9X;JQDibZQ zOS)cL(l=i~$CP%^QWJR~v^jmqnI*+AGsOAe!w|iS)(c4;-7p;I6TwGG2~|fFDT}r` zn7cXjVsXPJ^)d%PrIFl3@<*DKV4FiQAy9?cc187PHGB7@yA}l!Qw>TOELYZfAd#3T z36m+KL%*O^rgv_nzN8!H@|1EE%W`cSih_SXUAgSsjlaL&Dan-ftRr5FV{v&Mp@1~> ziCLMf8{9m&z_!VC9K3KJhf)H+UL0D{qjXe>k3k|u7Of+(Jg^3nw9Kt<3dcX~6{7b- z*bFZfP~z*Q6r`ZI3UlFAyD`JOQUt6_>yhvQlT3p!$W(XGQlcg*DAo8E9jz zX)_73mwLSMd%Om{lS5(%`>rIV=GVox_^hve-FiHP2`><|E%RtQ+c}U!a1?)g|dW*#($hF5mW*J-85t{7`P@jN#R#2JZJ*)GJmb z-rn*gk!!Va-z|J0D-l$DTWUoaP0&Q>;>mb5Z9KoI6;MWT>`ayRM^}sC31ty@2Ga90 zKcK<B=Jzp%enu znOfFSsS>pGyTZoHbpb#-Ph!2Q!KtYt3`5=#dC!Jh>x}WaEaY?E-ib>RJsZdhDgF zoxIWZKuMH#ji_9ZW^ny2-V!X=bAFo^0MRZc#WkMF_WsM_PDwT0Msu|8JKt$>@hPtJ znsL@#xhS6UHq{e6A%Q>;C=5zJLM*=KF2*I2-@fc5OQ32nY;2_i zvPDGxAR%7XE%YW%Gq5JcbIQ+oAGQhvFm;#x!E&gD<6Ib^z%}JqWC9Y2tY+tP6Ew+` zKqXW(*iVg|hK*eN~i)pN*2`a#ZdCt(XQ^zD;0sLfF)VR36Jef!P za*{g=Fv2icLb!!(Z;(08T28$z!kQo4yr5H8G|MQ_6-8EhFpkxjL<(0OE&8n@l6y#q z5LON#rPq)aa1cVg5{bY`cP`5RxE?tZO&JdI5DDs#t!|58k4?l6d|?))%LKopXxip3 zqnAXYD$9}wXeLCdT*AABGA9FLL}V}JO(=$@4bwMgi2Wok^K4fPXTQ2fLk{A#EUZZf`SX&XSM$_ zB0JF*>e2U$uoi@BR@gI{7FC^P*LNkk>!#*XD*Be|beMU#nv$|1x-Gfk<;Hq^(=sHA1#@q_F?nlhBvwfL~=xn0K>0@nroR(jYAWo?;A5CQESr6zE4qN z3dVWG0`OaouIx7Ke`zPrSmz@JOT8x7#GvC4h9O_G&IkcYPznes?^@tz!3DXdlr>35g1U>#^tB1;aUYZu0w1YN)gP@;pgt2d1gwpuB|G{1x2QPdiCyihyu>HBEVF)D9 zRGx%rtXo*1hGyLuZIbdL=G796NJz#v7EqR=Ag^jmrg!(71Xi%~Ob1X_!Ep{zW+z7@ z%ooVpjw%4IknmcOHZ8Upvx-(qs+Nb8#pt$>LDaS+hMR%PJPaU!rE3^PVd8~{Dd}?$ zu>$-n8uTK}l||9FegL(pAn;BWodkVm7a?*g2neA##657Jr(#h)rshgDWfY1{(-ZWicNk@IY3o>;fE7^Mh_h(9QAc&kC>E#S zoQqI6L9OkDaSK2jK@m0MdSRkqeNHd2*g3>~u}C9NR)um8^eS@a3aFj#4roWlhJb?1 z5$n4UmI;+Gb#@C--J>?Nw>L9`}$ zLg!~_BvtoE!Pp8I?T84iq)d})L-J-?xmDWk;!m#ek`S&_J!@?@|!2n$FM}& zt|&ynJ!A7UMa@~Ibp}`ye)tc8i5K!LBDNup#lZ+@PY6(E&w~mDU7`R)z|DnVR#;cS z)23T}jRl20US0TQiwG6|4N)@`G7~q%k8^!IpN(-^2(z4KXOo9AhOe2s3%|!hh{AG} zy=Y2sYM2TYFRvK6$%ufRUIu1on;`tEGr}Y~*)V4pgVm_^RNBli1h-M%=oUwwQGPFV zW><0&(wUMXgK4xcgCR(Lc#--#aTlXdTdAa@l;Kk?rjt1MS5#b>Q)aO3(26sc;q0Cx zVK;%|SvuaZvYDp1nxh*MNMSr3RIOW%9-bwK^RlxA*qWvHIh-*3sYSClNR~I><;pN5 zdbc{Hc0>=tPUoZbpq!|IoLt~-m^7{JwJVAu_CAd^}P(J41chVVSJr`SnBA7;`Et$AiHpHAMWmV=-uhmSE9tAntAVbK(&SK+BAJ!SOteIu3 zg%Dhx)cpEPi?s;Qh}RRS45I!fHa#l_5%}^h?}k`Jg+)j!LIfiX`UH&*Oz7;w@p`qg zV6odAnyoIRXqq|)pn{!WUxMlKmWGE|hn3z|jD<)T5^^Jrwd1G>0@zv}nkJy<^v^F%A` zB#h+s(P}R4B>bNhP>MVKrSuyBg)aENrcN{F1%TuyZ$6yWEsQXc29hxfZCjaz-RhoA zHU$ULs_DhBc1R|;qZ1@rSMg1pvx=db^?nNC9TmWlPgOx8}RXy+TuH5T~~SfwS_sFYE**~I?t?_|G8I(D_(xKL+TMwJJ{}FlF9KCYFCL=+8Dzx&6##~ zM*T{43dJDog$Gg~i6gjcEVE=Sw^oI^6#yzXwxtXgf2;_74OrL^VO)tmeX?5nU#G=ZL5Zly&t767B_#GBo#uk2Vk`{eHl2SR{P>a|3x5e!Rh-%s) zze`H6TUql!{0ahxkqA{RpA5u#V1O0aB}oG^#UW1qZHYZP3;&d(OK8GXdHRM(?_hzU5b07onnBG9Gk zMOL;lLKnqVq2i!;5nKZxOboRe_=H@FrfNxj3f-mZrRO;asV{dIZ&)iSBxt@9AhFV) zyOc!kcm8Ih4=&=SB>F(grrbr(HOV6an%w*$kTcjg^$6_L!TYx>nenJwk;CB7wOvL5SK&sBv3&ry?$&|?&$UOTjo zcGF25s5L((X;tp_v3TNMW}z^+#R@%a);nZflgO78P7$t4hW9_k=k zOTD7UO=Ql|+}hs+AJW9WCRB?jOUTK+gE_y`gg~HEt%ZQeMevZ-7`_T>^QtUWBa`b^ zA|+8(;rXt4xj5XoXMURLYl-qGgf6qzU_lR54-u^`e$ZgVeWF3YTECJ@#_G4AB^9 zMQPiZ%2}d!6@Poz>z3YA*sjp-E{a3SX3axc!)7(s+l9#N&^@JK8h5K>d$*KG3B1!3q{R+c@2 zKoqt$xp~AeAQhNzi;OqJEKZq2z=4$`PLx-F`5`0bMYqvtf?6v_XF24fWDRtq(uxiLwjYkKF=MDI~w8b#O zD~iTOF1D3BGkQ5}0O}FNFM>~@2$Z7hg#&oaFEggy`5wG}IX5gm0R&ktVg5>SB+Qwx z2PY+XmtHTNti|aryhx$Uh~TFT{xH{(&O`QSt3M-K%mkWa+=lP`K0Izag1>}OvuMQV zOP2YQkQ@N!C3ZJt(dszZtOkQ}{{(o{ohjeLWbwj?$1qv*P#KVH7_w2S{B%W-ko`SdC#8EP!#_4M3 z%=qsVQTCz+r6N(gZ$9kAF6!=AS)&9+5TR;8s74D@wdX_@>1Dhaa3cm{70yirst8uL;mv^ zNR3*XuVG6YlCHJ|)eFCIr;3ER?^=>cx+m%N#wm(FN<-BoY{d4Jika6MNtskb&Y>-& z2^S^*!-kyA9!B)(MeeJ~eF6LUKB$N&w7APv#WvNMJPffA1jw6CWvCSHfhk-$_<*Gq zlCLb^nI|37luVFf%+?&dube1pce5kY? z7xr9}F4b5lzExOn?YEcu*;<)H>Rp`MT6DC^sOxJsr{-u|)>~Ph%C{xeuNg3%_srWh z<~&RUQ8Jp-5P$L-o=z~$dTsI&_dl)B_f~M z&p<}T4pd}SNxT{4j@k|T*Ue2-l3%Gp*qve>Cn+S&C17ZfOI};(@1CGh`md9U>wcDJ ziV#s6_c~USY8`Qztnf@qpIM7XCUxxOpwTUZ(e})Y;o_ z-!tLw7Q()vqTa<3vrgTR<5Dk;n^jlNJF9|mSg5iw zPS56N59wZWiJ9XzNCtU?Scf2K0iq4zB~DL+9cQzV(F7MF`RKZw!?Y_=aFEJ_iMn%j zV1kpftVp!dMp!VPBD_qT^-dqJF(0wZD}-C{eUSwyX&u8jSsM{u6qW9w_256mj?-jj z$e85T0@Vp7fwJm10EaY!XcR;?VJT1D5!nnXucoEcakS_z?26&xm?o!I;zMc%I3qxaHKvcP5#h?=EA@|6 zH1-;X33>w9+d_ttS^;ujn08w3ZJUV{_;$^a9-ax_Zf zr+RDha4d*}X)e!F0Z^tYm+Oc!Y;Jgejxw^79|&3dONT7`XVI$d>?#~0o9lu%lQG)R zeWGV3FG)_n?ce3l>HkNJo9=T7JoLVw-D(Z`Yg&R>MzXi=%01E}ysXKI-q`9kDLS6cgPXUC7>6qte2qW`QUC{B15kDo zV-8pWBESF=1Ovy&*|T=QlYyXs?f@GARY%N)0+pP^mSZ}MsvtjOVE~B$DKI?2TpcPN zn+z%_-)Y8{cQndE7(6D5NyEWDmIsfHgxd-BCr^-er#suJ-N-xV&_F2D?%>Q=mwVDs z%x6qT>6HT{3|{aFkj`R(ns6nt#?FEecx`Ge3E1k#vg`TIg6<45yzoPI?+o;?ZyLvJd{(z1Pe%FW7*^BN(7Cox;g_ zV6G1q#H7*r}bO24WGiOHempSf&c0D==m~(anJZhVBXlAoQ&I0QBkV47abIV-5Sq*CT+ketk zxEo5V;>bgR<+UOeZ)yhz^-Ha&@uzM?ubfxqb~W*L7o zJkF|Zv);-?y5*zI5Lum#?a;f|-z98o*1J^b*F1n!I*Xc7xP#xB#=aVf*UBekw-$pK zW^q*Gq`(#5-_sExD{!lKZcS5Rj68SnU z_=y{*B`93B2IUF*dJGvPTcqfxHvMXCVzX^U1x={s1I0Wx`As3h3=na@f8GLc8t@j7 z8VDZf8=xQ%AV3z!Fy&5w)2MgxOe$-Z8n^RIN0SywsKYE8ulcHRNO>bhK}hDzS&X17 z0t1+Xf+b;^nC3xnV$D)0RXey$d0;P}3Cz8?tEcPUZF2A(eHuD5Y~ltk3k{{xt z!`wytTx{!B<&poaudc>+TBFmPw+Y+zQlSzSy-sfdxU9V{qNCVum7*&cVt`bP*k%#< zFhf;u0-)mFZ*M=01i?H{F@)xnf%wcXT_h>D8Hb{{@EM=Yyq5k;GQqhJV3P$&7e%&M z$a1g-5cDYup%gh+d2)FI30f~myzXc^pow;o3JgxDghC_8+m}IfJgI^vY1lRl<#-5lRnUjH7$tw5X$PJgU`Lnk6tr&$J9q2%z=l@=IVs`3yiIk*qRASx5=FTMvl<7vWvwmVgjQNqQc|c#E5+11E84c4W^rNY#cYIqsSO%F1GNz}rXry(W z(Fx+EU3mv;Pd24jqgzx*>rmCy(S*elHV)eZ?$7sA1hNy?H_ub63h<(^chwi;B=j0& z`s(eZDV7Me5+${ZR@`(~Sd+RXhl^BL*ICzPNrZGNN_`;|leNe}AwufR$HR{;;j1~V zAsU);XqoE{sVQ3G8>y1Yp8BL;`2A0E@;FXBon9h^D&Q|Q*3p2sGuaO~lA2Q5fy=-xR?4lR(^8$>s^5w7eyhKp8Y3AhN_c{SuklMG6w=3ncj0D4m7jDk$u($(SD!7029-KiN?@m5#b{~hIMucU6gQwD}?J@XCZ=U zq{8l5sU7!hZSk9b+XiG`zzYBPG_%9+$w10wK1h z?*lZAhB3q5LNptjQHHXFoh$r46{q4g?vN6F|OOl&wt+ zHYWh@ihR4DMV=8I-m37aB^;)5QkK9hnP|0AJlew&FUl`qSQUhY^34*vj2Sz1wGhtQ z(Df7cCE~c&k_b`-dr47SK8nkeaJR}IL6BMRkuu-LTB|A|*-ncQm))B{ZYuwsySj*? zhEvgR@2K7w`Kj)!Pc7{VBkt^FQ6$o~tZK}C?uf6Y^t~q6=b)MLT%GKxc-|)N4wiKd zUnP|GsHAVoPd=LhuwBvIYEbzH!e{M#FWAnQ0^^grZJ6QZZjM~CnEg%;~H~tCZe-u9%fOc(VL%o z#7%1K@Yb8v(qhx>{N;ZT-ezWrS6|OD%<*X69XoRW1Z5;#zqL>7^gSdN*pSDX@PeHCd31nnQ%6q)hwb@=%?lIpE!Y$!ZR>?J&1AK!}Q3(dxkB zo-HM&;D~OJe-fd}&Lcl^`RKRmk0ec-mr9#7TaKOo5DHpLeoK-5HoJ<*Y?5^b>~so( zOiZX+kD)o~-IRpMJ$HXIC#Z;KGZf;)K(m}*QVQtd?rZ;P75&k?mF3s0M2bCI@f%CC z5NEL=@ygsRnKdLGgf*^nQiGx2DT*^U-0IF`au$e3WLCj*7-Nh)qGY2fz`cL#sD(`^ z*|P2jPGc*)$d?x{+^^1D=`9%y(4$WUF=&S%s0PMB(Gb;!UWgF}{zwb;$lT&_&IVsU zt7hseYEF+sqq;`jQ_gYn6NK;UxKUWef;8sv&1!d(>MS>)rJI-zoa*LMdZrIps zU_wxojQO|7V)~{#jC2T{_M!y&XeX;K*5{asBv|XR*wC*CqISV&@N5zfWcT_=WiEjg z*_?=n?Bq>#F%5f!irMj;yVE-LmPq2~O30#y(V9``20+1*a#^c8C`ZBjH|}VL#oUQZ znVin>BI)moW>VwJ7C!};kFwXr)?XLb6QV+X=F5g_H%0Q{YfL)lM!gghXG|oJit-Gy zJ{JqxI?46E)I_|Sk@aRGMKsSMeIz^#R&`oGcfazOD0FNMY}7d^ z{9zled>gX2d5jXGL1P3Ln{ajAlp~oFozpdOT(mOx5#LUf{8BBpYd;d*E)7#}Yisi+ zNn}+8khEdzuHvH7uh5GRX_sK!_Bw=C)9izKdbn4*@bA)-=I+}$b>D_f&Ce_>kr zQ3SBo(0L^(Q#C$`VeM;dl-0{i@6tu-)B;3ou<{2JKju@o(aRXtQY>rW^hlu)_Ohwb(%lgvR+sNKf3<;Iz2CUb1u=4Yl-g}t zg~chp1c_Jg6L-1NroRVE6?~P_X+6$KE!=f%hKk}d$UuPYsAzfW zVM<>b<$~+ps-n_Fkd9%X0-H@33DEsaUb-dULTZKEY|9bDl4Qdv(aI6@Mh zCIj!NaYWQXF|B};F2Oj~u3`~?iK^Q>Hdb+wDP+S8TkLZi#Fjfl!^>~#eomvK%;Y@w zIL>QDctFMBSR=lxc3F~*z?Dd3Qcp&mM^^I!Sb~KU#4)1Cb(HlUrJt+#%x_P~vgG5H zi=w4XYWBZKYfeu~FDbstcQP_Pk}FVEvjrItp5cE%!H2qzRF;yLHuL}}|Zz6Xwek)t~Q8edS zFCCO!5TKELPL(5f^!2I2knZqF<<4ZlJAPwvChsVW(i_h}h!~5SMXPjJlO|tc4O6hs>_pD9J9tZrl=Tl|bl&sn0U&_PXbH&%Yh%WC1~~aJ6!0O&1Vl z4~$dC><<6|eH5eSR8AlV5H}I91?QEX0K);00a0E+^67(JU#&9x(UG=l(dAm~!@VWG z!W7Zm(ge}bG$eU(g*QODhfu#vh+v`SMj)CZLLS`0Zi0<*xP{h0tgxaS8K@2Leu8v* z#pHJ0f(`c>(Lo|1JS*XYAOaX}AgdVqWcn7fu8|8(@hv|he^z0u^Na?Zt zqlFEp{B$M|B%ZF*y)Nag4V4u^NJ+GQYNLsJhBP5@H}o5WX_SqU=%GPDs0a|Wd=+{K zg4fLUWjX$RYJW*{?w*!X27l{y+VuCrp6%3~joI?@M|Pj>f84_mjp?V-Lczd#-zm#_ z;u8W8XpO-rlv-1Y26bI%R`vY&k61>@nHXgeB_dVT$INf!)@GG)#Nk7bEi zK3sBlu99g{>YFHSXWenv<|n!)bvv~ur`C1w zY7}o3W{S!xl}E~eA+_LuZ0Jj(bt&5~XiAX%6Lk%Y&5G(X#7Vmz4+dJ4Pl;8Kj?G=I z9yYwv)%w+S>LeoTF=ivHT$85CrAo6-yVaSJPcJp_L{XWbF5~QR?%8XpeK3%WSA;xmXZ9r>a%*f`?M9k zZ?``hqief@rH|1zMZ)q}@e{}WqW#8f@dVa6K~~ed#*cM3>aP<^&`~w+_rqtHtj04& zt?Oek{o*9~3*1_Tu>x_hJX`YW3O)Jp70FG=w@utz09%XO z!b1WKN)iB!A|j8H7-A|>6tyE+ddPbasy`1|%{8g?gMadFMB6z{30V+WIUlG%3Z?Sy z-Vwerg3l*@+jyD2w966J@;%O*(ZN(`pC!%D&jggIIQ1riVFt+G;WdF}Wp+O**aM6gODNIDcmhC4a~mTWN%_Q$a-*{jiG} zO5jYy)QlZszGlTdB&$m4C_!g*xf{^GWd}Hx6czt+DlGy;A?4-@MPpDUuK4j*CN(dD znV6sBX}vNwC~bQIPYReHHl4W1E3O+162ac?zCYmz$P*L#jm=6a73s!p+qLD|QVS}3 zpk>-p6pmDu7~6mg0JcZz2N=N@?Ip0%3Z*bgg^}VBVBvD2>5-ZtNo9$gMJxt54&Y}J za<`B(#2XndA;OyI3G^(cU#ZG@TAA?R37Z4 z-5X5`(vd@Ny;WKx^$)rok3if41=)Ptk1D++gt6Jj^74d&Q&2c-*wr4+g zegBZ0I;2pD0S^^)ncUeMr~>Hr zK#Y{*<|}+)e!rd2&lRh%ScS`C=oty4fZiSZ7)ulAKiN&wuUB@_?09DZ*dW2W=LH?fhWyDLJ1-I@fJoZ-lv@H`1YyO9w z8mbOG>&$@wV!1H=Q<|;b(P(&pq~)X#a>8N8grJ*u59Y12B;xIOmuz#R)>+io15FHcvFmK0>;UoBxf?trK`f z?FA#Z2KgyUU;p@77#%oH5mFRA7lRla6$TWs7Vs8d<{}@np0+NHI$Hc& zoLv}QMBkt~MY#)7&T8j$f@z*Lk)$N?_{)!#iY|dVvau_5N$hR~*L19mPcWK>hQ*k* zvxVS|XF6ulI#dVoA6i0~V8-^SLg@oh3XUdIsyddH55p6xLC?A$t)6X%1j?dEHg>Lx z|Dv$jtTmA62bqJD7zy(puQQ|L^f=$nVj7iazD_fq_qE2Jkaz|*_M03LDj{2t=1zQp z9@mv4EnNiqv4W zG>Bv%?OI2^m`s)c^C=;PfhXxYq8b_1B>D~z)8Je|yQ?Yk;S32c@8nNYP9P<#>W~pa zcocfe{X#LyXchAx0g0+e6^v6!AIulD$LPG2uMzJqZqPvq#UrzDzCyx6DX3Rf2|_USlQOw1yOyE+@4Yj>mslu zDN;i@ViUN!jTCyVL=VF2{BI))=Ztd+!bqQ?ihzFL$pQwdk|fx>QUlWxGKxR{hi3_O zkjrB8KsU}6uHwL9oy_aXsV zP|(FJw9u(eqKvyU1?{1&EjhvjV6T_@48juk7Xe*TS?I!wy^Z^)F%(RV_Nuz)9gOT6x90}4E25trHRBKoWrs2N`f#@;%w5&tQA&O5K>oF$cDSx#0uI74B-f8bgz#REFRP-OR}VI6(_Zu+vh+&>vJbR~&TIgn*&boTGVxm4#W%>vaG-d!5wEi^au z@X{NC-eu{m=}0Am;t}{Ol5E6Om*~(M-W)<^EV5EtzQPX^ZN!zKH=_SiC%D4+lX&AT z&TOX~3t-@hDs^U~qJ@2#WU7^;jGkYYo`^{&M;>w2gOtectLX;0I4-NOFA;Pn`Di2~ zR6YdtK~G&Qu%iY_Du9srK?q$T zM4*p|4D(0XdRF)X1XTo3jIaW1B-T?ti;x6!Rp_;A|E1&XJ!whE^I3}Br*K6`-b7gJ zNdpY(`|f%2MoB98-Tiqs5Kn4c=yLrULBDYvvpemW!WKB-(tDwXF>PdpJ4eiMO6c`r z3<q!&QnCuNK+CG^ku~(RT-hUmQfF{o? zKqJUGav4EUc2^IH>w@eLStne*v%wG*JJ_i;3>Rd8@~i39Y*td?R^Z1%3t?9e&O}L* z2MZXVsqKw$=2GPhXO(Yt=UQQ3aahjt$={w16%wZSB|C$3i(4mG&r@9*-!{$Wr3fzA z9{gCxnw}|K&lR=THZAd{8AmniQI0}iwJ8RR6D7Jx_dQSe(fVhm#UZIS>hn!we3r|t z^&h}Z&V9)uS<&)7K~OLGSM4}C!tb|MayZb-NlIJB0Cv$e8PlU7)D35Z(*wn?pq}P6 zPh2gXk#A#!3nXxaqjcjr&p8a+vAbBjZ)#ZcDv^5Pk~OeLHM^8juye1Vg0gR@q$aY&V!PSYhPUB8fxsGFe$d`|R4s#8~M zsg7O-$b3s2%NUJLwc^67u|#HG%$r|Qwt}ymdgz8A+ZCXaUqzMi zhI?K^JxmtfpBT=SbSc)?r3^rv)y0`Ktkb&DhRx42Db5E|!zaQptupN5&3v19JCO(8 z*iRkk4Oa@7bedx&kiWG=0s@1U_gv4W4P>wd8@n*t5@JSS#EE35j#9o5 zn=6NIZK z=a4xtn9$URJvm48l!JHPiyYfd0pk%jE?Y??^pv8%X!|dFnP`D-0* z`@NF15H70K(RoZFo)8hv@U`WbllAcK8+30JI;J>Wq`C7*=XYHXNf}`bdZ()^t%_L5 z3bNj0(}Gkf$XPqYa}2a-VMZ<;%z#Zv^9g{bE$%Vc&7$ak4W2X;l6F#NC^xSnQe{MI z@cbda*VAm+Zjn;4)GW13T%e95JTeSEhm$;m5hT_I#x(6r%~mGV^EN%Ob9MYelWq(> z!o5gEpRlJc`fX!Izx8eYQ3GJTL^NBn%_zuUU`6P!#$0nQOqdj1 ze!=i9X1w%p>D)FS+LjHG61+LZilM(wz7HF!V96OO?Lrp=k|<@Ksr=r#K8qSmbh7Bf zWFR_pw}-?WePEP#+oVYYD3WJd3~k)3Pvf@BlkVqYO*Po%4N}H<5&)nVS+LnHf5NFHS~>@;@+AtexX8T1Sd|dK_Fbm zcTUiHvL~W4pNN4pp|D0Waa}F_e}!9k-lADQ4T1iY@`Xe zPf8HP;zgNtM51aF(D2wY*3ud7uN z711diCE6`ymKdvGa`B{L1JNkLGgUdTJdrWc$XWzTB7|V0BhZYDYQm!a72z>4_A_Wd z+Vw^5NFyF(EJ33s?J(U-o@Xt$#SAgRMDy9mxf)!PIQd;V{i&xmVELC>!CPW^w=Sew zGTTUKp3mYEb)ti|M)15I&%R-ZkAk6D2n%T%ThJ=+u4CP?C+2NbT@bsnc?oRU0VZGS zgn*>0EVQlzgRMDo>;QDk93@fR+!Im{bA(o9kg5k941U7@rrY1gS(E6R%h@J5pRD zauGO!(0RgL1Ga1*G#wKC(fx_(d>3Sw4quZ=(vC%#Myo(K=O(b6oDA9J+N0ttn45}^ zCzxFb;`=XGu8SfeoFCTB9Ckz7&ii{23x_j4$`%952&hixzDjOiIYrH-hzy)Uh*FZ2 zHedWx36Ms}3DPBqQNSBh8q9oqDgwcU!;(yTtK^+pmdKmaQ*LDU)pZWI$&N8VlW>fz z144u=h6k5|M*E$8(Nf(*=#f*o2-s(e&0*#UbnT*G!r)1fJAb&ygan$$hnJ`0ha zk2jfgHbS$csYr;8+k~k}bqW_hCtB_FFDS204%`zHj@C*c{t6ayd|F9Fv{3%NF=C0lRm3cjyd8MWzoOM1s?!SBw*(plaegJ1aJ{QKRNt%>=9wltU)AJ8Ak!r@fZ(+A zREHk2P{hP&9pr1-W+o)@IWs9QsADBbZ8*`D8tQV1yXevi`W27TbkQrVOW}Rq-^MJs zs7u2KM>WZ`V2m5W5~4Mo1!iMdiTe^JU(|RND?g~m5{_&^s<9E4O&@l5o9LmF7hAq7 zO+Vaey)BaE;Ko#)56n;S{D@)&XX6SIXx#;__@*$JXXnEdl}QS8DSqNE|lCsCiw9BvXTDhS->9SAe0%?rmJj`Xh+2Lu>T}FMGaWE2L zl1ZVMg&B5_&S>6LZ0dgsb38ODjS5NV)oiZ3CNfLxg>Ce&27IZYDWa?SfPG1Trzadv zH@elFK(41IGTLPM@J|h3#yOoHVRE^p2g_NLR&BV}T+LEb7;Ln$)z(+d29Fd+YK>Vm z7SGfP^sS2APYCJwNy<(^G1jaMO&oVu=}v^&uPJjxM9_PzMH)yoT_|dZ!?$Y{Y&$e} zeR_Wix?-%YC~0R|P(@zC*=aaPojj{o6YlFpav*?QI<6t74+6+;nu<)#2!gLbC~_H7Cy41aGgE zC36fjV3J;yOw=U;xK7Ok)S1pa(FsW<)jLtA^L%iRM$M-B3?H7bQ*d)WSzIvWeVB{>Pb5fJ>Nvj)&YZ{F;hDyyqw`1LETqQCsvF*F7XkW0c&viaO*yWFobwNSBD)V-6yLaY0wA4xwbm zZ>yLu0Em#wuythI2iKNs_)2$W;$)O#t#-Y3iVuA$THI#))jc(ATAIt|U77iwc$14- z7>Phc3T8H{)~&-zlicaE{)uI|Q&lF)QHh)gW{e{#Q5D;pWe#|*Xp`)|a3@Z!%*7v? zWfeon`b}ziPa5xYaDB>YCV?7(HXXle9JtBp=e0v~goC7HNCMgEC5ffR zSTN-kSXB7wspTeu8MZ?+d&?3D&Qa@c5TUcCU_thS@Vf3=LWD^gNTfE-g?UA#)s}K6 z*z5`{_nT7-|9{m9g(`KqR=Z&ZTVOqldec)8m2;%CIm zSj@r{-#Z(3qLoQHQ=-eH!4UPwy*pG}=0OA?2{ri zGZEw}bLdHzVwJO67t~!i8uhLIUDq8#RF6m;yR?~Rl(+05ml5|GF_FD9b5_BW;x9R( zB{d@p_{)$sR)S?TC=9(_eA!kfep2^{mQtxiP6D+CGzppt@C^455fR`L4dxJ8DMF?thiWCV# zU_!o(5FwBs1_6}Y6+e@-n<(1bteY<`W}}1^nbI3?<>7owyqSlEccAlo9^waEdnmMy zb>$2|zWWyo{F@6>G_shABktG~A$8#2?!rWpXYd3OPDO6W^<0#JHf(!~-X=vDPky4U}RdFcKYbMQ?fs{UQ{WJ(pCM4w9Ba)PpE0CD9b*cA|%@rdBDKTp{ zOT%C=5+pwqx)xHJwkn2vo0W%&8g2t>7xMAiO4B6I?m;pZ$Pe}TmE##*K<6KF?!p$d z1={XzZMNEJrQ-TNxs^j*TsTF6r5l-*@Vp^eGQ$Wbk6Tt{+bMj@^Z(4^&R@+-Q_CD0DIvaQCF)^{ z8OjTqyRZA-mi-wXdf1gq`!o#9MVMih6Kd3Kwc(t`o$|n*YiJp`DmM1PZtVkHgR;r! zNzG=wnXXF__tX3_L)){ot|-^}Im=M1Ef%CgPmjnD1w_}a&G(teR6jUV==&a8<2BXg znng24z=CW-n=2)ZJMmR-v>q7-WQ1)N!cH9GA~_b9szjB zS%@F~s+qJ2Kt$r?`pD-d#DCcWQRpLJMmf21mA#b{!yhtKni*rUt0k6Zr$@s{3-FAqt*hYd9Nan=ujIfnhy=1?tXdD|H zhL%xDy3syMaUW&EJa39A2fjqRbd;P{+8N1h^vJ07e=}K`$j}-Ttphl&(T=7inJ7aTfem-A+gM69~eUG4|;Uj<|(z-;~MLNI2wk1s6b(b`2Lv9d023T4tTdqgynZ zert;4OC_JEFUL@WFFcV%%3^t~8h^9ou0>NOo}t5Sc8Q&-fmQoxYv~i`uPBG$zdhBd zCsPmyDP3Io|s<{R;cfY$g+ICf+m&aErI&E6D!+Tov0%&OC zy$(T0Yvv}=0EsAUDnxTfCI!F7#!lZ4oWnAN7Z_)idYXzU>>|u#d+loU5v2htx?x@mYGQlrwd`WPPSO@ zffA=Zq{U@cQ5JyTVTt|?PRYj74aRX7LDivHSe`st6jZ0n6dEkAEl_#ZEzHOgOL6I1 zV5xlKs_6c7DY4MY@>IMTmaOtt$`LGyhwbgi)Jr7}>{1mK*>+HL)b-zh!~ZTvRe*mrYt$75GGd2clIH%&1TDmOBT2Q(s)7H8vjjVd>;bsd2!>EmQR(zBw!{_V; z{|hLt)PLCMV+RgMkmQPuqFzZHzIflyW-#@!cwsXTQ)Q5EYjjES6$77Es(9%feJJYO z@7^WsK5j;`Dxzc4sJ3+FW*zFY&nhcoj3u^$ z=$p^}FTBNlCAliJXomPy##VGS&#Mz^)YUlX><#%!9c8BI@gc)u`XsZM5s@Tz% z2pO@ZC3DgC=^2s^x$QfOI_y?-jMRS=Wg$@0SV zvhm)EUlhW(b$kSLmKUY>=B=3&wO^`st+;%7mPnDitxG~8j5CkIyAu-vwlrN;h9Z+b z7>r6%N83gyl&0372|nP^?}hi5=A{TGNd^w1QWHK>87@d7rQO z)(C}oH!7Wf1JJS%Qv7?QNi>;LUM~(i9k$O)iAqPFxlZuy0trJ@zC;X&B_vE%pP?gt zHcjam$O?@No^mEHv2=$JsuQ34n=o&NI+au*Cf1QjL}Ez9Y>gTZh{v`Fm;M2=h1?9f z&Xqe@al=r=u$&tBdU2OIG<;TjK8567N}0z%W^QY9SzC#P{b1;j8!8VvBbr>jSJS~? zR6U1%biif!{g=E(EVPypuQT}s$LTu#u*yDMQzZ~*ab<=>v7@w_UxdKNu0!=VEJgDHXyeWpJR} zIt7dS;K!pjdyU$uy0cBS$*S+5 z->%&m{?Gd*2QbU=R9UBK`-aG{!Zno@TJNNuw%mhblJi0cW%Ca`=ZYkqb+1SqRx^H; zRFw6uuInB|J}EaPyLg{b;L*fy7*?9z^4A#u(?#)M84g=LCw|utgtsG@q$D~1wF_A{ zbJ~M>RnFk_NRcv(7aGHnaBXIe!i~>cFwqgimZw-; zFBcwaV=C@F68rpJQ{v23mO8AXfvwnAP|DN^FZDxzh`k=9?8o^jMhs z!F-WYX;l1dg34Y{W{;8`V$F>}G*1oNHHux~u_2GLqT*jv>>gSr8A?YG{aPIm%q;1i zT|Km{PKRrgje%f{B0Sm4{!{C=QqIt)y-YJ~!km{SWImlmeRg-dkC!Zq#aD=}X=kD- zvYK@Nw1rd5gGkGuiDqLMiog`OUGMj<&lQGV$pOuiwqL@JgiRR%62PwzCN?0r| zpXj}#{-+-=M*hKXtcsD0bpNDB4+UeGtR!yKkCWYPcZG}O^=De2nl~B3dMR8LE`=n= zA)AvnO74qtzsW6-mR@}po_4BwHKMH}L)K1IZ|zFy!zT9FFL#^%^DJ9zG?{NY@SN@n4YD=-=#zxMz-Vu2U zi4K?bc?vQntCAf$X!*OWdU~*I8~$MlSyaqcu_JiZ<`el-6FQp3XVyAs4ZDYLB@RUK zTsq$XrPNmL59%6UT{RXDL(oqVJ(#E?Hwd!^iEoGxQ@_3WVd%ulo}I@b7pK{tF)jNb z`=sY%n)0j?Y1#p^XjEO|e0hk+PZ_X9^f}toNS?B_izac2(2>i&aHld8ET+Ff6-czk ze$bzGRECQC1f7y>LhGDgxR?x{6*%C2uYSeZgF!e;{M(H^Ax%QuC9Ls*tA*QlHH zpL0_6L-L>2((8)Eqb_|GnhR`H8#jqm@zf>Kk|BJ3&@VMi!Q1bWB^b_Hj#Xi~rp%dY z(O=2YA637fN>I9~A6_03q(E5oEusf}m@sBd*e8>_E!!JXYbKZ-b~Kv+K|sF0u_+{H z3cR3P*Y1n_CF?C060~i4BwhKrlD(jmUW9hbnzl20zRgsxiCijnbvq`kYo*X46kuz2ePZGjc>OU)+l8U831rW4y%uPbZu0 zJ`B;gv709+LE}>NMv8u!%;EF)390MXwXZ6;>tm*})S}^#o^>bbY9pGj*=|wgcO5@6 zbk*5`nu_)M3~`Z!E`FukJJ6&SlE!4reNNc1D%O%1E8f|HU8jsxa})+|n}%0lvw6xi&f1nzuwT^dP?$|ID8DDvVQv01h}(EkSJlDU>Y~%Ono~O< z5yq*;QtQYnBIz;hY$JBVAqhO%uAXp+N*shA6%kcqKd!*wA^wZ+CR z2fw1{cH6{Er_?Pbw_inFnpCWD5jDRciq2R=nv2sm$r*Ro5@^;TSKyx_4L`i6HkVWR zYeQxE%iKkW%Ja4tEkKY>+Oi zNfhBU6X6f{34{lt=xX#UvbEEFG^y%nkzn#v_TCjIi6>8YxgNev8vdMsl2V_wr5k1P z3bKY}a7Ym2X- z)>@}!89gGXpK)T85&o;5u(bU|_>1ex#EaQ@DpmjZSr{HMPU;WpQ|lb;M(y41Hte+P zIp!oRsLI0Tf*#{gvGKxS<{t&wpnkh28UE9U!l3q}9kt*%rKCkqcnYPNL zwX$cG!bDJOC1dyN8%GWM5v$mWkv+jnY;26|HTZ6Qpn*UBQRHDqt_3zkTO7Io%i03u zYx80t@wdWB6x_A#cVI)rV^}=mASRC4)_jn`2qjoabFS2M>%|#sylg}++`fv9MdDd^ z>vLqP9Hh&h(k@MYUVDxaRcCQYg!Jcj(hbV2(isSWr@`=sj{H~#uY6?-O+esY)?4V8 zPnYwyuftYGKlkVw7tXX;LT}TocnaGurYWhau>Fb&C1~D}`ybTcZbF6-<)3RVR765B zZ`ydhu+_{G9aAHDmR-`dtu=dW>0t`a&bMwlO zu_o`Yv0Lm(VXpbQV|>;-Zvi9uq?1v^z~tr;otyDizm-sW%CCV4+3O;fTf*W;&AZ?_#>_PrO|LB6Df{}ej1u%_#5J{=A@?Zv(wWL}9Z-8)^ z<%)$CI#^{96=7pBqNuID1WlolSzMv|_b!C ze6*&XZ)lbohWCi;LcFmzArATIV=m)c>rZIY--UzBV9?PgRxXiaw}y(_$y0m)?d@d~;==?C4EB&WGeKF7qVU

rsn<`gq^TMy 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 z z;gpP#4r4xvZTkrJg9L<=Ra57r&e0|x78AhhUK zQ6~aR4>W7dm(z1nC9C0a{XEE9C{>2t;7J_Q^_XqMAoj6lA`mqOu!p>!HdGs?x67_R zsb&cgN(icdUtrvAgw>F1{BZPLPoqCRu>oOvC*87Hf~G}2WV9EEk&znXo_WRStFcTF zDDz+GQ3}an7SZKcLqng} z5Wb;dDYV8uAzA+mSXJrzY}YRnxwS4qL^An!};yQ>0l zSCSgPD%R9?i=O|EDkq?XH?+EnpII^1p-+ z#FC&XGX9?bnm6K**S4HBjj&5{+heMcq&v0Act|KKY7ma2k&i6;alg4(Kl4keG*&zU zz-|~33XV9Uz@p(6fqfvWZjZwf!&3-s^@8PgprxkgW$$GzQjs5PcxWmuR*jMdACmK0 zv)W`88AM@DR~38OPAR3SS`$S=j9DP)f;l*m7!(yvS!I&Bo+)>xx*$M4ny$2&9~Ydu zE5lSB=XqA#=IhKIxg$j2LrS6kK zJbb7r11XRh&Q@!e{46Ebz?WgZ&)%C2tV6ZVDdjVp;)E6;TetEeO7U-Gog|;mq4~I2 z7u;G<)P&e;lVKLMh@_%nuvTpWAjZX9?5NR0nXKO&q6YOI$O)D~}HFBQXHwna8DH0*%g}w3GB}JL_;vl69Xau7LVZ7jmMP_00^_L(# zcJCA{AlqQG6&K7QLkYq1&GsVSUJ&pgaJ@ze2CWAbmf-0`I$T|c4{lHUQD@SXT@o1h$QcgMc(F#z*K;LwyfEZNp&H#Ngg@l_h7zST5@nC`G9+ zqDSDB=-R1!H*bL^ot(>T(TOWdG;+SipH$L(R<0*qrC#}4h_ho^xefBVrgHkOq?KJ{ zpoO|(tG?oT;_M;J!=E}?yqT<6364wQh%#Ykqn!YTw7w3 zR8gw5+gPaKvrhrWjsAPCI}tiqF@?mQyS@hSib3)TE8PT}PLsQ5M*6+a?^|j$(J)?( zG8ME;o#Ig}PP=v#g=hEfc&YTEY(i&fLhSN!uk;C?QJlXp5W1%Y1%xtA6DfhEZ=6Ki zpdqS>J<0u-$uc&;v>TRsYS0lS$_IJPEJ)A9+Ozc9hcO1|p^2&}k2njr*WVA*7O!U0 zu9&I)&4Ii@KHU#&CfMQ>rA*viTkmJxA>KvrIg>*gX%RlHvkROWWl!p&CmpkHV->Bh zp|Xq<0)p@{drBNuP=k7qVgg;-Ik8SSNp_tV)eZGZ)I{>y)L+Bo#_h@(v_mi?L*K0H zXO>JIgB(OfoRQa@^S+p(4nfT|_kzU_G3QDFsZsG5_#Otg&L^v-1VF4#!Sf{Cl zi(*$XpSZ3Gy*ahDI(&>01J0s&q9}%rW6;Fm+>Go^5h6cSY6-yAuQ|=Lcm5@=j>-is zg~W&*vQ{9b8BwT+x4&6Ut07Z~C!J*@E*T|;Q4-b)cJaX?xI<`0)x>Y-5UxOxg99{d zZiK=;9Yg{K^fpS!u?3X5?}PT8yvFv-qxM|~mMBsZd5>xBAeG0h5HP0ZQse#F$(kT) z5_644+i$p&ij2w1)-u=KexAUH8n2^Ks6me=q_b|?cgbaz*zI%)#ekYAwx-K^=n+ht zwS#@wPe`fNp0-4$Phw}W%jH|Y1rUu#6ubuul;kX&6#CrL~=YT{cFBy;oFZH}CRB+is2v=~Mr!R-flWXYbJd zoTL)Pn4>Au2in$@(o$0kcCTAKNN9vYtd&hufKoiyl%cFlerO68uzC3t=%JVw_&Yq@ z6osW(jVkngw03a`t)w~FssRL)-Ik1I6BXs~?98sNRFW}HEyIFIK=$J>HG=4~>=gvM zOqmE1Y@1YsmLN%0kt0EQspGG{j5w1XTp9HttoEcXNi$|InQ0ybqRMH zWKL+V`jI)vdhRGwo7 z)B8fq%^0YW1IKs})(XYjEyvNAHHc7G9(8C46%Ld@cR zhBUHKr55=FS7YE?6Ou<}F%Y~W+%)5CmHFkaOu%N`_7i1?+_ESpczwd;H{t*_-~+Aq zB(*#Rc$83x=i%~|ILq-snqmkju`9;adOI{VGY$uI6L@yLS*x>z=Jrz<4+L$l4WseC z7a0UAfFI+9rUAM{oZ-eG6o08O=iB7#K(U1xPJ)suA~kVJSyOuOfTo)VVoWE&EIIx0 z0MpGi3DIp5CdL6@MRN0p5q!^Uq5@rxDa+H`X@xo?)w&P>Rh1M+4$*3pIm$ZpUQ$uE zqYBh16)n;@lcI4UtaAokA=;9eDTYEzVf>}MH&8Uq86x7>G%;DVeEK| zbOzDw&r3dmaB?Y_#5*@FHX79!ES)$xLLZrND=VV-`?WmgJ$3cRGmjv10{+u#AS;n~|>y~3o8B@^F z{e?Icdmtg?&36TJ5m*;!L@ROSDu;s>W<}vtLO(?rZ@vo-sK$XuM5-g`B|)Z(1bU_o z#cL^(jNh%4@Op`98_<{tbtxhRYHlEGnY_@L?SnGDW3=5$6Q??f@V-u@Ju4-@61b@) zh_r4DRxNF|440tBPI9tCSv8g`i{Q6r}s9@|FqY2$@_&|vPuT=Q@ju>UI7TtpxMegZF4BoE~03(#!U;l zrrd5_PN@V)@H8zVG0RbUs;=vvSiVVIwBn>IlILM+)&rB*~YQq-EXZi7W`6Uw(aRZ5u+m14x*?lD-R zRXN<@M^2!hM2J_V7xg53=;Md2am&n|B~qeA4OG3nW+URnTPcMzHnJ&um!zY%cDp;J z1$`z_qe(eVaX^vorm@F?_H~&gX9HDQi{rH_P%q@_Wc20&> zB&0X!X_-Ih-yYZS`=c5(e-P_xFcCZt7d1rkC=`|jlcH9I0clSxaK^#pg^?!(Bdi`4 zBN-j)XcSeeiy|Zx(mc?6%m;S2-#+X*+ut$PQmHv0<^uMABvXgH-S7!bP*gu!=QvS| zA;i90EcHZ3IfW`xpiI9Mk8zxH%d?EM<$^FZqyvcqla@H~!}MO7?VE8_*HRE{(ex#R zf@5iWTddR^%FS|&CQqZtM?RZ%@T}{>sMY^}js3ORV97Mu${6yfsWYcf>m>#N-_r+Z zR)UT9y2eALA8z-um?59MN)ZO4M;b-~_v9s1WkAM0G1c5fgy3=?wM><()Qmts8u3yw zIcI@5x;{6WEMVtym|z!T{9BB1TtL*=1YFVFx@j2<86ltLdKDK)^Tf+CjsjZ(>O{Up z8P9?*ytxy!CRu z4#Jm=ruGAAo9$LV@Uk;bDBQO>Qf~TfGAQz@hAPp;Du{~2%Nw&g@lPe2kNau(jF`*{ zv}BO;6}wser@X7XJ$S~G0T@kT2o_;fk$>{2KWhop^Pwi?qtdNbEd}*a*evRTukBJx zo$c?&NuS#1p0t`-mPSDoN}`wy&xY<@Q8MS3#%JizC11h9EX##LD5m)2S&h*udU1y) zWV>snQymWzN!UyYeud?ITv@&OeanAoa+(V5CWwiWQo?!(?ub`T&TLNmo+kBjthQw7 z9PV_s`CA_Te5iBgBvp}MS!B}%Xtw>Wl8yG)B#YTm7>yEAiN|*oB0z*Zn&x7ch@;`; zsavk7jm|SBqrF+Xi*afZrNfGpDk>TwKvWy&2A;U#M1r4uux%Aalfh4>-bgL26(AHj zqD>F{6sf`Xs4Rx-(jn4$2jsevlRA?5uImNSbMRRh1sht7eRFQ~cM(P^KlE-m%@$~{ zvJ5$3X35nzQ5r(>FDqof<84TrP);dAp-M=IRz=2=%qoe?I-QjMWVR5=edxw%=J+fY z_?{N~c2}T0JWK!2Myil*XDxV=uoOK!z_#jI*gQ$2op1CQgmbu^e~tCTxLB+H;(A8c zGWyy;s70|Sg_UdJf>mcm z?ZOn+oZ83>T`q4_Mm+% z0dbl?WM)+E#E44kluG-N^i6dBuA3^leNs$(qS{bPAK%4EM5P@ba}{VOQI<+;oI$Mej-(?&Mz=!uam2PP+Nw4Lw1XiMVzi31nm$hBY_6e(R9###6YU{> zY%X4m-Ze=kBG(JH^%DpMp(XU8d}c!V=3v=q_Zd!n(}*KTs>w0QSjjZV=SWFMp}C5W zqticWfpF5w%-L&?7~(ozV5K5*j$9gax){ccYgNl0)WtVt)^Z7sUnVb@NZY01f`Vy| z^O&F&L6AqyiLplbY>AJ@D0v*qpc#!b2#__y7`HLN(gcX%6~oN3K9&5KOfXLZH=`us zeb^3@qNXAGK1cd2YlAtAKn^9j7Q#3N<}$=DB^){;tfBw#EQsQ zx?bm7PdV=#mum~`D>Wguhq{^iNm8#pbQT)^T~?$rVy!`>Y%DD`-6Cv8jj1tFFG3`-PnqMIYA5Lmfy_R;9WXD2b6EtPw%N$^Xah-PXq9q378mvMVWz5}kO2fVo!!_z>wNXf@r|V4p zLgg(JNFKVF@hG+NkuF?lYN%O{o14R+ym@Ys^<|Q*N*pR#;?3GAzKyJq@J6$;~)46LD%IMC{ToRSr^A!q5dK7V(9m}vZ`q{{~%hCRgJ^oS1L~G1`=rnUL`xttJ6iA>>(Z| zugQ~w52!P*&kYy_HJ6CEn&+_&GkDcp?-=={cJb*{uUv4W4r61nmS6s*ZR5x2ONM$B z&!AXYCWS|^P%9UQBvvHjzfF26&?d@FV#Cu|dJJiDc<@pj6zp<;L!88~$R(Y-%+?Tu zE0G8BN<%~~bzY-2lHFdo+9Z5Dxr|0T4CN-t42U8(i8dUIcS5ZNG(WN|F3^L`cJkiKt z?|NkjG03;7TOa#I9GDu^<L`kAeZF}(u`Lb8-0Z9{Unnq7>)uNY`%9#H>MlM zx33c^$LPT$S0(!QL@wbJ=Gt`IRo%`x8MBMQAZrGc)ay%-#2U^@S~~(uzI~Pmy3oJr zP$=t{n;{S-w*z5?<%QT!JuIKtzo*$M?#E6#^MJ@w;OQSGj8OOQMV#X-PSnquw~kMs zhy>$sV+aD!j)0vr$rX#A3|g7EArCAr7z|`WAbB4Tp)f5|@(!B9h5{d*H$p1(o2cD3 z37o*hRgE_365(T{Mhjh6v?wBoN~46zs=tdSN!CbC!C;i;@fEyW9=TE+>}?SiK#Va8 z_Zn);=L-SEl_s}Yu`z_OaYiep*>0N$Su8l{9rPMRl-sPT>ZF+^#4D2;=9hq71V^Eq1cs2rO)XYs3$8Bb zMGRQ)^d?EjtC&QqY}nt%*v*(n-I5Cjz_2llfMRAjxO4EWFLy>*(VSkaeANBtG2Lth2PP5a3_tPG&TM z9`0nGDTmF@e`sUczS_U5VKTBJh_#KBr_e0VY+AYHq53HOh4U1ZU#|_Kt8|v@cYL!~ z8l|;q(F4-`Wf~iM3e;>6uGe`(;V|$@^7@^32uS8e1T-9B(IFrL4zkNwNgFWdu=Si3&tBE{KQF4KW5S5+WK2HDCDv2Gb2pF{P>f-kuSH)i9 zY)Gb2$|=q@WFg$5^2f*lR|fWSaR61?r5Adg@^oU&e#snm>B9YV%YqO;->3Qelx?a^G4t=M zu;>Jg3RNdcg=2`yf2N}zNb^(gPT#4rQ(8+twkVy;%v5bcpf6L6AV%rcwFE`QtNHF% zZw9-BO`!eEw0UL{F7NJ*#Yv)K@G*^S1hF?ArrTvKk^;a-51>g5L;3c;$Vo2Bz(K9K zoiPMbGU;$;D3Z&;wA@V=$HrqNZ4Ky!h+vRz=7ZkR=i0g!%;lkOU51HLg{N=l#T|fP z29VTv3@IwGls2!$yF=~NpW~BX%tUf>&NU6f)l85QM8lB?RAb_ieSWWv$p#=HJPGgO z(PvO@!Rf%@@wDl7Efy#Jg-Ld#!q>Pgk@y}#&oHA|XcGlx$sTaQ4m_tNny{owKbXiW z+7iV8t}3kIi`mJdDBeOxR+4!sY6GRB)w${@P7xwGNq6|)K$_@81QFO23LuO^Y&NsW z6ekK9Lf@{|f29+u)yoe5**L_odeVKhhNFRKEiB(l;uAIE7;2Q7W8DVZGF0b_6y+mH z_nNLDm__@as4}0OLRumhR7GHvN>`-$)+pt>1ec7;C&P5h7`S56I?vpT%EDV+*(=%Ri~`a3?X%Wp#_3KcnhV}4Z z2mtkI=w2Z&aT9_vSRiZ2rF@)2^mS<~2c3HNA*897XMPBbl&ls0s#NSZ%h^9$u4?M3 z1Cnycaoj*}-vUo9Itp9Is#%Sa%U|+YqAQUhtR=?-*>gZbgdkleD|9{V$W{|#KOse8 zWSVT)yPu?2HyuMS6xb!0hND|lb#oyx(2-4P>VWRb2FstGMWBo})_iY-m)h-S4prdK zh;#Y4fiNj`fg8u3&cyMpG2R6B`jRR|;+q|2JBy}4mATur_?=Bz9Yvuj*%_on;&>#v z#C&K(!*5coimJM=DcS8L79spjqBT@~9e_!^n@Td*7g(K4b!eY9 zD0Lj`wL7%8C)i^1d#5oKcyzY*noZzJ-R9idTxGuI$u1-i%w?6B_#)5#-3Rq*801mg zNBOpW?{4P?(nqQW&($pMCeX@?frrRn5yg_S&;5wqhM_1+^tFje^V{)1p3fe z)?EQFOL3I4;~9Tu3^b;peso*DtL4m^G8Cmtx1Kzch9=XD$4eW zDo?0OSSwiIrn7`srDar~p1wMTY}Ke1tej1k`j@qs2F{p4+S_-OFHnUm0?@dWgETh^ z@(H7T>~^AS)!}j@=IPqy!2&^bxUPwEN71U*`}KaBx8@PYhO_N53jl;w z5WR;L`EbI$P!cbpi>jyy9gnW&f)wd}CeK6i@Q@P$T_c_SI%V@Hv$OEmEYh3zot*9bF6b4eS?*1njq zD2}WiYl??Ok^p~s;ZLe?6pz!sy(h?@Q}S9B7E$fRD5m~TII(AQwV1CdKDFZ<2Re7L z4>8PQ6WJuu?BH9b(U(w@qia-&bKNlJh4RDjVsctuJ2!({nIQ7=o?ekJUlBW($|=w> zQX(k39rETI+FHzg@OL|qBH6Q0QF}*}+{ANdXb_B0pBo2>UbChqWM<=g5EiV(P)dWy zCy^wvPCUg0y)L9tG8$wkAUeyYkQb#Z+$Q)j)tid6aE)K%8Ds7otaBJD^8j96I>@~l zfi)WEYazs}gC3zd7+hr?8Dm{QN)V?Oi0`w5a!SW14G?p&ZBq|N@0KA3G!X5m0;g$c z6E$;UOrVH;hI>_cT3*N}*X?F`GL~P!i*6f6w01=;JeJab7fnu9(O~{{@0V#b?pZqd zvUCmLq%$Q{qb3B3L~it%sHJ;4^a8(>(0K zFpi?dXug#t0yKBvZqc_gB8?>Y+Ty5GD;9(zG4zOAsOhMbQ{`aCLYVc-ScHkWSf;mn zlefe-446uewGGH>9omXJggGf-*-1$0d| z6gpy0y#y4NA_1z-HdtXmpJ_|=(6I<)Z9v8B8f|-4RqUg_IjAykI*;H79UQ3YcKy{@aSk3 znbk4&@(Xc~K&ViENZ!#2%Z|{FO?p-rESY)$@a$rWp_ihHZMKPc!30h8l!myfmhW`f z=9U1@;4tOFd0m7et$5un{6~5t+(+GE?4uogy^eQN8ZFeZ?$l8vpOS$DmUY8QH7-$? zG;EnSi&HBKppa%cAb7sy#Spp_Ne2Nz<{^0fmZ?cYt$QQYsYHdZoF&gmQj7N%Yu14J zVhyJ6UdWP=l=)YAA0XXU_b`g`BQ3}JZ6wA?jPx4AA@Dl9j@xBTEg*#=R2k(oC9lLn z!SZjuVz3Pr4z%MCW~!rvPl0V!_6#&<~Zd25P!+ z(j!RrDkQE<%l$coO`Wd71u&s=%`bLBw`p98=EEfN?A}GCppNh)$Yp!g@GI$(DE{ti zCE@OlA#_>=srR+=9*pS<8dOH{mrvi^>y-uYj+!MR7v*!ebEN2sErQ}SMke0A8NPkWD(E5UQsg})6j_g(Z|+L3ESp%j#R z0v70tx?m$@6j6i7DHx)Y%va&o{@wKMMcp8t#9DzYogvJK#d#4BP=*GKmZ3xz@3&(J)*tM7Ty%%|>J3bw?W&Mf`!A zFjy}cT*xlPjEchi*=j3cVU-^;4v!Ksf_%lU^-3)G~7kFfhk|FV-x?Fp!?c5`&6Azd=}dyHNit+q>)vFG3gC2KnkFyW$*odEazSZ+}h9zW=Yh~iTTm7(Dm!WI=vpir#6gnPCR}-4bJzwUd=y`UsW}vZXTkCv>Urr-7A{eYie6yYAlcZqrt-a@E54FlUK%`dM+#jw99 z$WQDjQk^frP&_7gDY-6c5csX2+^A7_f2dLec2?e{ETwN3N^S}up_*#t&1c(|gjm{? zRw^W25K$c>q- zg^*69QYLyuu2#$6vQpWmAgo{x;@bVJHvIPLMr! z1;$Uus~;qze+^_3`7$BvU1^qRxlH;w*~^B9W*+r)3`9nQUHu1{KtljEEC2Xe7$~z& z22TZ>1Lpw;{<8e``x5wQ<|K-uF5UV{s;(?q1T6he3mN+=9!{bJ$eAhyk|fh@C5l+j zheRDvTSQ#ottjsvDCj*8CFy*`)H%7^IZF}Kt||Kbg~8;9dmIeIRTRzr2}~)sLs^lr zSXP-sRo*PkQ3O+{h=N(1MM{{>f-(qc!3cc4wekCkP}&VsaD{A@-u6}tVH8q!OiGTi zX{Nv^Yx1ooRiTHHGW)6wTFtt5j3cUi% zYy?=)Fa;wt%U?B9QifmK+A^fi5DW2?U>L&TWlARr&ne}At>*W0kJ%MM)Gfk9N*Zk< z3_=-+4eaNN*~2ld+yzz5I0cv!0df!{$e4MFr%=s#DlrVJv_J^sLCh;cByoqyMp3w* z{=!Re&;Mo9RypP)#4yPd4`PJWKLtu3yCva=6OuMta#{J)%;OGFg*-YpUhDMKM@H+z3KY~bnkO>dvS0#WUx*_mTc^P1Nz~AprtR&i0QXlTYC$A3$I${_qX`|=+uO!Tb@nQPmBilKHjLNsH90RV-GqCw5J_d5hVzNX2*czD9_~VPL)B$?9J9xo3~N<=Q=k zFzgIrK0~EA=q@#ROV_S=Z7Q|CKZmC1YD8$y}z6vOy7!k})5an5|4s8zIxkWoV}t3J=8dhHdV8WSO0 z6UVroCJ5(C1lsvgo;;g_KFCfK#Dmb-a5Yrty)i1{UY4&gMu|uj!mM|W;s8dBQ66Y6 z$eTtpCIr&1xfo=L@+*fBW(;x65u`A;UzTdx0)eBdeU_0UP_B;iSgkAEi}o$qBqK5@ zrj=(<(WQB=5CafL5+c#W7>aB`HxuzagMKkOJ33yvQ3~OLEJnD{ehJj$g=V6$HT9-` zjYzrNByqwxi1EN`IN6TtzFfTaF zq8_49;V#Q|5j@w*S~Dt%u&7@>Y46Ot>(xV$#9=GRx^ljS48oZ5pHxD(gRHj*A|a9{ zj7KuiNlUm#LykD%DKO-XOY*i_;t0Dd1PO9zFw%Ise!2SAn?8oy55KHlg(0YUl8DNB zeWk2P}eM1p?ICmz9#IF=Iy8;5%6gng=nZD)Qs(<#lYMe7nfR|#ZpwWtcWZW zEH#varQuO6XJpsqVGvUQlRp&c;;_^p5kyp;kC^;|ay=r7bz8r@Ibi58i{#|?Aqs{Y zKmYf*cNvFlGmoD+K}I7lBL=#!}VMYtBgnGx`BlC13?_I*kj@guKn77FV+3^G|@dXG_pIhy1(Q4=!~KuH=(PSpFZfR!E-(GOQlEF-6G(=67BTTxI5vF1CBC1KloPaFD_yZJQVYZ;8~EFX?D@hag- zo0Od!Uw7#({D|^QkDeD;ZsR3tj>lTEcBGpX=a!fECCzl=oU0Hb(0d#tI%MPO$sN@T z>96_w9RQ4d3t<*3MCo2wpcU=AO>j@Y79}?Fk>07vQ>g5Ilge{X(Lmh&HXXn~6-`B| zV89oHKqk-Pu?@Dez5TwPj|!V37sZKI#}Wfn+8xAteT{D1v!rjsqJ-m8Et!MYL&CR8l}JN?%veKT?H0q}TOZt*tW&R4 zAa05hOxG2m4&&+Z&|7*O3f?kgD&A|9zet4Rc`@MV4V|=X@Ldu*s-2 zn&Z99Zi?qrK6Y6DNQ`k$3Kk~Yd_vs*;Gvr;iQDU91*bMWWbIDep-yeJc5DP@^$d2{ceU~oBxT{K)^6R+v!tTju26+1M){VlIz_0@7N`B%He(fx zzN>yq@<-1-rt16W-#lG-JiSL|`ZWe_jnP^x$IT^Gv)V%aQc2e-1yMzAvknl&1V~D+ zb<{m97pr`OT+t;;W=B?XY+|<1sx+Yo)${*Ha}w$x4X#8)vwgR|CrfNYV6eI?qM`f* zGVy@r2@?zn(Cs>V?o*FkyHVL;m_f%IW`Gpxay{hyNh4Fx28GHh) z=fQ`20!UvBz*aAb;c(&516T{exa`RzSmGw;BBYv<@<`mP7^+3#RiIT0JmbC>hUpGx z5`0*n#K$m}I2wl{yE0SDT#7D;!IWSMfz;R>K-vzVF$#oNYaLUCFj*y*9}pSLXLF$b zI)oR*y3Gb^K60+=F(R zB0P$nwhapb^imW?B8iYSw-i(jwvC;AVsXb|483J0M7lw|*pi z%(7qEC1!2Cc=I$3t(w_Kj9rw6VZgCZ$oVf4(stgjBp)Z;t$8u}3jPAA-;n6pR}I4< zu@Al8YFY0ongfoU=O8wuKJ=He^%IkS$T73+O~;2)#}(oMw%-bhc06XC{hjqY==^Mj zFT~YEtJPiFMJ*1Y4k5nx@DDE3B=#hW3lF&H`bzso(YrQ*cIICGHg^S*~Wt zDQ+XrLLR#87R#Nf{}0RdXSoJ|vmkpq?3*TxmKVg-Jnot2d%G3UF<&k!-Eg@d&!4cH zmg3lXxS@*pyGKCk=6tflQCj7^PTUfr)s<|s!MHieX#KN4i*j^WB{h4r2vu|RSMCwY z26}@^a8+VD5+DH=f&(=`p@Ap>U95lr#ee`P5E2aoSUQ_C7C0GaQ@EiO2bc%~J&7eU zc7}}$?jbP5T~+5;EWhNU3FOt`Lde!=q1g$AaohI_k+uDp&(oYCJp#PH0^LbI|R8d>|K zJv_qE^4Yg1ChC+?!KSTezU;_5V=g3ktI8;{(dHCdOqZmfALQAOmWCavHPZ4bQ`*>y zbxZz1oil4RhAFU>ioz}wWXraDoa*cRj`O87QRNt*1%COOLIEBM1y85TaHbGr2T^vX z0;F^ZN*P_q54FIrP$;Ehtra~;JNy4!{%90QTp*2+tQKc@eU!mxY0pU3h$x4<<{WQW z*!Wop)DLoHwF=XTU08m%)GA$YM6dW-GE4PclBCHlRQ3oriaipsXWjoLM#h&Aq@G0o zIfR-(o0V~mJ)|A$CuM{ruYJdv#;9kfOiqO*Cgt6~Z)yyA8(D4YT4zy&xep|>p5LYH z`azWumxaHS#32yL=#=k5kQIY$AsH?HjLn3k-@Yoi&4_uMxtK!De6=mOJtw1LPe#06 zNZw{Wf#HWBor5s{WZaizSHk|Ul@+bW zEGK=;9b(|fHApp?qTSZZdg@Y0`XZ)RA~Q7RV_bM9kR&zN`=S11brtdP>b0)7z(xuo z&@VwE7=VvENJT--5Z0W$`(HAL$tOjCVFqBrAEUTqouZ9S*vEz-j1l4lKoA5u&i4{S zX~09i+uVC(zZJAaF;i}npCnP7E5vxk1W?NpYel3-OgSebD*BFO*4uG>7h}B75pGj_ zgICnj2C}hrw7FJCpwpr}$qRzq$uQW(zZw45Ec2!1FH^7x)}YN0ipi800vYYlq{L0yjcY{X*4UAj6BL42bv$O;EK#c(L89hGCd z>am1Kt`R0#>=H-PeI8Cdtq@`qLIl!Mgd1X5`%p_rpow^L#9T$yHY`T&MQ~dNBaKrdTr6^2;gB5| z-iod@37XVd)!JVXv>TkaL1G- zYp!Hn*Br2m31^}ScB1OJ>3t;Dopeo$uqGZV{`n9Tg($EaN@#(U(TDHO#}uW?q0cna zUPS}}>Zw8Y-=uf8W5S+k;0kC}$8GS(Km3IW+41bKdcW`PEm&0t z$c_|Ye2`^L3BgnJPOEETl0^N9fml8dLQJF+rix&fp74x~NK;1C^SrJ4v6u6@vU(8H~DaNZQs{LjB1bu7GVH0WK5)_6BhdhrNhV zZePvWQ(eceV1tcWy|f4bTs#XOA+~RlF-dG4VcRI-p$+)f8=-fh;|b6f!_bo@kW66k zz)Qu3Y;JUXElQ9_X-+~)WJsSyEi%0s5xf&349_*)sxSGX@vvl- ztzFs_$Ng^2T{J|=fVdvS2@N|T<@DcWC63&Z8>79CU54N-!<3XBp-d)8XqK#f@{%hr z8jHv%R>z1Y!CDm$Cr%hyj)I9;*|O!v#MB!|_9b2wU?u|yOfeO;49tZjYFoa~Wwv(< z@x*$L5l%dv3ZmG(Gstr;d0u-QFLzEyv`{L6E(!sTQkmt*WCby(M?Kry6NIfE!&u$~ z@IwvYsSiMB1hP3XJS@$0hhzCmlPnhCi5~)?h$2WK5K6!MRD6x-+jm|2QPGB?61X3t zlxc}KA)eAH#~C;)WHnoK2PrU3849412Y4&Nek0V`2@!GAGAfAQ++jo;Cz&2FSpd&% zkQ=MBAH$u{zl1C!Yv`S{=3OIFi{XroTl8~S`w`GaLz*+{@2b>~-CZFlD4N8$h81hs zrvnn z(U?YbI=%P z)|#7byPTR_yYXV)W<_*W$!QC}$qWHh6@)4fw{i`~V}rgcYn&Q*k)04s$ehP@I!tas zC>)F@4Qp=+#v0K^fZTBHA)tP>R@3+>LM7aR!e~&!D%F+wjEOfRLW#A{dG`b4Ym$g= zfhg4|rUc@%JaXO=c6}4Kmq*Zt5z5}uLu^C*wY5?;N?nAw+7T~vxbG4ooTdt3Kre{t zJ@TQN+#mhUEKt!>IsPRetXZT8M#lz=it9e#i8+H88PaW7xf$a)QKSl*H+E6GTjXZV zo4P*S2WdXdJHu?=GlU~Nn_Ty_ISeJ#Oow^Srv8!Sh_@@1==z<~i-}30IPBPkk60xw zn*(q5DujA|>i+mS4r{~plvwXxDfCR|p~Y6okQhnjD!Noep^#L(oiuta%7V zLdYFpntmyE+vSy+9JaIazrf&l6XarSDLZ({_$N(c--70Fl4=|$AtM37VoG00N?w>nqT{ zRUrBW;t16j!&KldB`rbH%F)Wyt*3d~oAaR=Ec#eGK*TE$n5GY+LB##dc2{03X9clw zVD_Z%@IV6q6HpX@4loaJ3V;9(Vq|J3%?@SusRzd#MB~v&j@@%cTaxK^8JL!yE-LDG z)v-DsBiR^;Y?Q0}*UXTG6z-F(;it#nRIcs+#TkknY4}%Bv?M0UNW>2eG6_9rJ6y!s zOOEl@YTdk3Rvb3T8F;sgp!zNu)madTxF`Nu*sri4(kxYIlSqrVx|B-PuHD69}QyUWEH@!4Mbstk5gGJU#VQj z)7i!7(qG6Rk=P08*GgJsLkZ!GGYjYlh`@v*9MLHIhvune%k{Zg#PUhEoVPxOqmUMg z#Ya=ftY1y7);0Swr56J2rs>II=h`&rIL0g>v?(Q?}* z2<5f8H{w~r5lvu%Z$nJl#=1ybS$9%r=2wmzlK_gRc-ZAKiB084V)5XoX|2*^_B!mH zhF}s6hu7o^%Seu-*w9xUh+E5Gy4Ka zwzWP`MVtRmZ9?rEHNK^LBwL8sa&)~QMelhSl1*`{@owg#h!PcgX4Hr{DXKsBw-zjD zC(9knQ$;f@hsku@$oFhkv|ug~IH#&ivsBTu?o=k(<~PTxjsaA<*7a2s{>gY-szo+* z0yYO@r*8H!K_kM0YKR-RDTL-Ep{Xm9Z*ek0kTa{F)>>~(4Mv33+a+!A%ZJliLIlH3 z;3B0bZfUXBh3-}&A!+SAv=WhQ<~tfF#$^xYfjM>|w1{MK|Bvn3vw_IQyU`}SSQcmP znyj1(V;K596B7Xln$qu<-cdTP#IK1JV?irl&@qT?~N@P~u@Kg5fxUX-*al zB_gu*FUduY!x-w4AF)xmawjt;{PYJV3ISW+%}kuq*LrO)49*K@gWTFday>4PiRPU> zu#IXQt{ClwDj6T>*~{K!dLWYQk{%Z1`cn`Tt)98gW_PWBKZQO|ydp(=4X~aNN(sb5 zA?Dmp#j(|7z~>?Tsp ziy+l1o)HuV|Lv4nIBH7mCVth=Mo}(YsAZhIZ&J03>c^^7iuL%1F@AK^?MA;LCrM*- z>(;M-Dz`Xe)pX}vuiGQ_mQI8k6_CbGOMKwbCJG@UZLHq+&Jh=5r{h^G`;s7I&G`xh z(FBr3Um#OR=pAW%IK~N9WTShOwcor@9@6-qWx}9p3PI@{hOXyYqe4terpuE5^iHx# zmb#*kwrtTdWK13l=~-n9|3fpPbI!h{Qm@NR-W@DjetXwD#Gffj+`hEdH&@PboomAL zTEmPn272GB*iT%AdYq3YN!b`|1ty7tQ=R+0jSkJWwWUUl;}(HR(b#Z8;0$v;BfNko z7945~p5?Q%{7hB7xe8_3ja96XN3}>*%BXePm-!b6K4g4sWHOf6n{Z@z&|5I>*Z#A) zk9S$(%btC46O4tU%IY(b|5UHPsUTSOWS;v@>rw83dYY-mB{BI7&h8@AP-fA{n(lv3 z#_48>Xc+q>QfY|2mX!ZIhZ8Ve2qWM?9~T{_4|*d%soD3*BOLC|U}HD+iOfU65oy}} zDp-tS$bhL(6w$6bsFb1N+V5t83Swdw-o;NXSKHPZ&Q8lmf zdcru4VT>l3kl49!?FQ3(Kao+Sq-V&}_24R-t&b zU30D1VoA~byYyLcM+MRNJh4nEMH#3gG7%1xAvL<@vF9z9LQqjlA*l_U75@)&nPBLg zGoHyp3a!fG=Z=hzXgiY~ee~Vn7b_PUE*-?Wc^j_w+Nr2)Tc=j{iJVkZJq;^FU@^X7 z&mQbl{CfC{R3MF`D>2@w9&;nK>rkqCY5(&m2sas8LdQlf8q4KM1j(&V8roOe)v#(D zJlqX^=+Qx(zGKIhseUpka93r22_ZmxHx`kLteYP89lwskA_;SjT9^CCgn_hwZ$no; zg+QEBQIibD*E|s>=2P|&T-8@G@Rn0k^4j#MeM4ZfF|;wVDoj^9KPst*!Q$ihG|!Y> zE(X68@#}oH&abU>KfAS4d{dCMYM5Fi z{*8>Csg6?Uih887u0ZWSV0Mn7l?x1?Nr)1Rbf?&Lzf@ZoSif2SyURi_3_OZLXeh)9n%gy*o zJAHy@53^l;Mbt%Fb9fYdQ^(j-(IA`r6&S`fe5POBjIu7r$r;~qEI%9 zBM~&9MF{|iCWSJ?qJb|#A0OmMDY~cme0b`suZ6Oz1J2Swyf37_m=%1?nR>Nl7^JCK zVDQDR`cZf{19^mselaJD32lsi2n5GQ)c;LQZqly4?ygq{W&+M>*I=RAd~Bks)!{<< zRhh>ivN@gwqNwjhm%8$^y6LA3x~@miLqI1b^=9-SHM%ovxQOGo6kEN{T)n=Dg<*$1 zG(blYi)f-mttIAulh+)W5fhU%tk@LJBe~3RAcO$0bRvwTD#l4#ssE#SoASRtHR%wA zXPYUS9Tr*z^32TqSbbmJm}5R36+GxoA`8>~vTuYdJ)0z==7Ldmpc0NEs9JSsYLvEE zi2BWT(mET59F4o(?~QZko^q0sc6ACFMR{u>_vAH@3E^FA%1R`0J=boIWg*0vKZOA_ zo>XXEJ>j=w3C>GcXiN2~Lsn8MuNy-JC-6$Hsxk=%L2@KV_|GKkr#%}*7N3iZVv(eZ z4OOR~YyPrL5`|-G%P~uT0mmME&CB}WBgEQFAjR1tH}6R`FFz$HL`;b1!zG`FAnc`* zv#xoR+RqfTTB*eAOy4WkybNJHO&f%Q{RisPQX^0(_0CazNX7Y!7~66k>Pw9Nb9Hg- zMl*y}r2^%{`umPk6ort=&Dx4nz_;zX(k%QJ9t?4CS}m@!Nf;vqisgb)sx>esX`4(ZXfn<=3leNVt3E{wwlJ4cSfiFmP5tBjHt8I_ z^UM6LF7k3?pAxz+<4EZ)==!xQj36;hjD^rXl;v(7mIsHWGI|VxlG%uw5`-oHZ&#TQ1_)yW5J7s$nK80q#mk zcD~So0?`0<;k_3TvM50MRjFcd#aKHMM^6zbyo}w*fkPcAQTX?#JGFo$tW*=ObuuK2 z-C2UV%K?*_`dBiI5c03!G`BCDLK#R z5jLlqS@y=P#c=N&UKF>9+aB4_LNsO3^xyv=oT#A~?2Qy#ZlapKBbY$5s5!MZK;7mu zGt!ajbh}-O5UX{nx+rSf2h6r0^q{P(j`JU!yx!j_(P*8zR;ep&BZtqf2s;pu>|N3f z)TxRw=}R-4wk*J?Bo1)sRVY&AYP_>IxmWj@x(zTjbF{2Pjmx7?~O~!N4m*qkH;AzxJ^DH-+ zX_g5$%T&(^(b^7>t0DMSI&1v3YCfI(_<1W7`KsP=Z*u8L@Wv1mhQ)=iKh!+krU@>B zCyWGzXUm?+88bLEqDA}8J8?@+a_TK+zj8XpnQ zUz9$%ewAgv$v*ULxjiohu_?4ndQ-F%te})1NxHi&3VFM0@fM*Y_xoXn*tHXUYQh8P zimpPT!@<9?`)L zmilp)By7cUd9bZWm94%ZY%(`dDt>S5{Ur`r6NAoV5Cf9I9Wi*wb!DMfIjT3+DkPD= zB|@ChHp@{Kw;HQ{7@am6myqmacy&?G@2n^cgy!6;n=YcEUc32S;R=J$z-DkIiG{#| zLm;*w-T5BO?NgYiRJWEEM- zaNkcv8GuG3!-NrlL>ium4JnCG=yspZryBZ*aI%0jKY&w!&jKg}a3w%KZ{cbti`N|Q zt0*2M>#=y0b!(wQMWQKqy;uGM%ETEjsKk}M2!QQCMc@{K?$&c;IWSh zSRvuNYKa(O$whizp_kLx6~UjZEmG~`Ivjgk3#hAx-|$S6-I5l4=YqZx_nAFB?t30~ zIt+c>O4V_iklcAq`4U!$j+506PDF-lH5auam=*bjh_0?qvK^om7l<*JFu$}e(8OK{ zDK8-4+5+ssj=z-^#~39jSlYTWW|tU)#t|70nx&1{7WRyvID&Raic_XV(>;7M2vx4H zixfl+dlSMYggrkB!oc+O2t9~(56e<64}NHhDJ?=MuaS=idQRx&@d=Aq{aLmVNvX7) zW;Tt>!x!j&hg3RoGvU%)MmCP^H;O{eDtzIJb{qzBv12KUbo`;?)(V{fPL;2EVCg!7 zNem4t*5=#(G};fV?kz}nB{<;O({m=6Nar6Gwe5vV8aGyw=0 zfR36FF;Wm&*x!zMVcXU`ERhrv@^}frium%DWCQ{t7x4NlMYLx}6yF9S-oh=(qfviE zX{c&cw>^Q}X+iy2Q6Yv2Gy;#meBB1=IC+w?3z_ksF92^#8!UK^MG8<6MY&*VtxN#^ zZH3GysGUSQE9mkj7!L9~2Uig;ftxI9atP=>l-Drcb`>WAG_z`sQF^#4iz0^?zML8k zxm+UF6L|F#wt&rSAxL4EC)5G1bBHX%5LofcphN*ur6;MCL5j2JVo2<$m@lmBEacNI zifqP8zy>K;%}|J&lyL@iNwqL0DEoV|>gu%MF);)~ezh0`GU9UkEMo(Kh&1!p*mD9I zxYDL&P5Ko|9{(9cN(>1zW8)v{fSYg|4C%?;LWtDKA{qwCa^==@f)=RJmzNi z&FNU#2S?0oC#pwJK5(&~F*5>tN|AY6hE#0LA%cDxi7XuzFe7Afg=A8GL+no;R0OLU zBela2eIPHwSS{g4-5&!eyb#jgD&Z?c@$#{rod9zSaW}XSz^4&`@dn2(2(gSA@eeMH z(aYcOJdyT()|#AX9|hwL=oxRA5k`f={t5RNxZJT5+Nw~ zpa^Hx5LUQ*WDuIo-c3-alNg^w>XTU&H4wF>a_nK_*cc4OE~_hVq7!oES~h7osT|@C z7<6578lhCc_QvQ>ro$6AX_ATBP|#oL%(a#{X$J^Hx}}fCMFI#R$GpGC5XaboAoG@? z5`}bF{I9?Nw{nRD=x)S~!#n}Ly`9zjeM%9aREN=MlxWp??fd?LzJ!9)gkUKG5`ZmQ zO<~46k(CZ(u~bA*WFSp#rA~UeWROIhYmU$JkNDhPuv}l+FO~iBuQ=xc*x0d)Bn4^M z|7REkHc0|%V-7MDoOIWes`BiT-AV3snOZmHZ%rtC?~AJGP>d^aN-pH$fb_ff=-gR+YR`3^RK)a*qI}kbLFVD~2hAGZrKE$;L#D7H6@}8GQkglRmQQ z{+C8LP^}4!xAC;YY2e`=grtP!$jVH@af^t^bL4U*ooOyMIs81G^sh$Y@~aFcv{cn7 z=}eFU5L<#ZVLZ5&x?D8GZV+L&%B)}89M!n7z%Y{Jno?&I&4ePjF)W!i-cdmey&%q@ zw0e=V1*gw*BOt$f+#ViWyylpTPB#k1X|N4OxL3DF2v!T^d*t2JTL`keLqy#jG1fz$ z3{Vh4M-8yR-J*(Wp#rG>dFQ3=70iViu!eGodgiI2Kq2EETx3<@Fd+iI>pvHkv5-Ow-ZXn|wPnO}`&3c0Q8GqemweJq3-SYDPJzU_ILHuiTZwYeg6Mmd09JG1JMWxx^5jXm${;=!YqWq0W~eA1|b~2U*}8 z3UFuDl^EK{?eTIX*Y^X}Na9Nv|S3Bu>;DN|tTD_H3@g0KA}k}!0MNjwGW?wIkr(a$07e`+37s2#P9 zbz(Y)qgC+oB?1wct#;zwvl4~)$~FoB_l<*7M;y%MIg-Ux|1G_Fu1m9LY@oodkw>#c zNa1X0k~DJdmk2ssWpz3)*FOO>icV>z6ym0afiA{sy-3XAl9aM+3OEpwZh|EtwSlbR zvGdVcB2kC3)U!a)GfLEiX$yq5m;jwNWO|^ZiZVrcuBuRinF$yMT6 z_)3*yNOUAc1K5Ql;rkIpO{N1#&WJ>jlJ4J7tav0_EM)>E6gn3tT>K-c%@|2Ia8s{e z$lRHDV!@gSm0+rDsT#Mf#~ha>awTdEGkF00^Y1*7>^L7?FD_S+rJb;L=ZeN+_HB+x z(;$)3@n)iTwg`ToPEhJ0Tu}quW6JD4|S86YBn=s_5;>{}SV{7jW3rL(L(b|%j@ z;c%-LBur#EJ7PgKe*k4 zGcV94O{0+cQ0uQJ%rodsW(k zv49s!Cj0_=Y;P_sneDr^$uCf*YbqasUM12k>^-BhXz9fBZ=Nfqao!Xv6j)jvkO_>r zEQ{&(m+lbKYH;_>5u5x6hv{O#&4iAjh>nu2N{c()}?pq|KuEYrdq zxlSOvNG$hV)Y8H}fM!yc=*;&oDVIEt=lT<>(Uk5l=+FLL-ny)EC#y^(TBx^tVZ9rA zZt5WzhINal#SN}9YsM1c96~SorD*fF%|em5a+9f2_w^O3!?99-n1p6G+NBS5lkH6R zxKx<=F<0;kpJ`EJzUrs)gC*Cd7=`hyUUOVtV%Xq|uFjDJeK^N0D&9x44={(}p{*7H zVXr`P+_^qD=!CM#YKL}gv&jSu;UshO zbg$gLz0)uE!*LuS2qIpeR)M`hrt@$R?GXSg7`>Afq}CcSpn5zSAs&({(CjUY^p?fg zcE3mB@v2iHZ5W~UiZS5|D|V|uD^q5Gh!e}$b+U%^sI4mrFn5=6=8olT*2%>n%Ye8k_R%0xVD5}O$0eFmnvix#zkCnW?4KTDMWxy9x@!=4J>bq%iKs)<>~fN zr9YVU(tCiYPN1O5`e+wP-AIwDHemCTqN&jjzMR!n36>*ZSKwMaVc~Uff=Je9vh)n+ z6&BKXi0hq8v|wi$lS%e+aTqm`%v3TiW~Da|2mfAYzVi&Dc!BRnAXCfY4l;P1X_YL$ zBuzYf+CKs*r7pMmuWPCDxMJ)+Uz7I z+evH2tdD!QeGnyGee+@AG*ygMHNq^)Ur8Tin*JcUg5$QZ<&?Z)bu^&$-o=YUri18Cx#^+ReC{ci z2$NqL5!1Ci(R7q%ei_LyLzHnhIh_fEyfbinbt15OB-`1 zjW-DbG4if74sLddJU7XAsKM^hV&WH~Wk{4(Ere-h5X*gRD>$&yZ?&bforX1+((>ry ze+eEZqy9LI(}hAu(6*BH%sQ_nql) z#XJd#C`us{S0&S0VPGXO$xgCHfX_~TJ4y(W6?AwQ#$!n<7Of%B$sP)l9hJ69n~;Tp z5Tij@;;E(x_ebj;#7EZgv_*mwXgaP9|B^sR7gT2)xVOo@yBNt%Q9MVk2J+)7wZ|PS zgr?EmO<2#z`3+=hf%&IqiC6d?R#_Pxw{*(%FYRq*WP^l7e9WzZyb` zk`Qi`i1XiQCvz^!lJJTzjwXHFIgh65ztvI4!M3QdqT@;hmcr64c#iMQ)R!U&QNk#= z2?3$+E{KNfcoavmvJ-EYnjb~I2qIB_EN(%SZdaho@pGh$WU|2y(Vb3}$z{2YYGTXL zgn@rm6xGglC`)?QVYPgktW7HxbK}~KhhLp99ae3!vw;RE(}4(F9h_lOxq;=h)x%_+ zIcMSwg>y|p)tC(Cf4|{I<+Cli12&1lynY{WVX*u!AK+ldkNMNkLl~8qD$(YVwco1$b+7zYWRaEnaqWeNMNWd&w~b!H62Q3x(5TXdRaBo9VcfK3_xBMv>)OE*tS=fzhR@5DBCn zFQcuCVr?uLqLe*V#6A7V`oC0WXdGE_$^P6lw8Rky{4Z@)-rj{Ba8oxGeA;Tu{zM(N0>k60tY;MJWI z5Tr_pdwiAqlM|vvQ*lkT$HH{>8cYwOJ~kYQA+UuV^!)kBlr4laM64<8!Kn(ZEJ{?E zNYeaUnL{@e$j}f1K-;C8*;i;%MwsW_$~>4>D%L1lR&&F7U~I1T+#RPb3UOLxBfbSO zSWb{@W9z1>KeRUX8>K3n`9C)ZayAe&EWbEW>WI>`-LxC99; z-_!gk`vfu&d~lGCV7uTCWZERb&?`WtKs6gG#lpOfnOqwJCzcr}!g z?j@*5y5h^S7>I{#JfzqiDlaA0C2a08yoF5t*CPk&s2qR<0(*3w-tip*0LLvrj*+iid zmAKymZ#P_x$l+9#QVk01u&ml;iYH-+#K?;g=N(2lER?cCaSA1aOq2@}bZ#!>(1K4r zM&Ts56Dbmf9if0tVJQ?1v!!*r3;9%{7~JC17=<*YnWLFe3s@a-qX0TU#lN+RCZ46( zRwm;}BdlIC?R$HuAO! zq&VR6wK6dmX0;%6H;%Ouv?6;5yf9o2+2g__+ACzQ0{xJ@2y$DjIP!*i80;B$%TWd( z5HLf#2za;!eQ|CpLU6Yu!s$lpHH_3zPht)Nqj;nq{%cZI48K_zMk^S)O`Kn-RdltX zF5$Ta3ydlmH}qz@+_QXzGdf(H1^SBif1Se*EuZD8S3mE6jgNQB&I?x)!C5^e-%G-yKFp|Qr$ zBqzg!w71tO=M|ze|7B>a5M-!lta^Am8`l~rt zR?vE-*M`7irU8L=llvo1Ru3RoM=zHM9X`_@S6JTSwph=UVm%zqQ8`eP`idiVe3i>b zHHrB`T;rr?&`%|Gi18x{f-)Enk7bLF)KiWVdG)$0ADZu7Ycr<=Tr0nzcQ#(@wgJ)k zdBy7-^GI5>S3+}zE|dib`?O7{6vS=$(`T{TNF7|u7LoFSFv_rETj~XJ#f+Z`zfi&A z1mQe1k^s5NA2(CO7(`S^JL|-%*fD@Kz%GN>0oz^#(ii{?_izJyga9@|Xb4~cH1z;K z6M-0jwvcTIJ**_06!;2ogoF8tha_UU+>ffY4*<~;pK4%0_uK;f>$@t93?iRZ20U4g zsC?>UeZ@{l)#YC<6vw3xJe?;k`5a-4!H5X0FkIX5Lm{Wg#20Ysk6YxnTP_+!R>U%d zssY*ml+?@Q+a30%_z3bc^R3CoEgurxn}Cg&)o4;KCQXZ#@62JMQ%U>bU6TvLiL$fg z>fzVqkFa*hNlw=+Eg3^w7DK*<@QZqO%yPqy6gMe-9u!N&R?jd(f(jg5YBGllC+cz( zH_U-=<_Xa^=6<4C^B5)E%3Qhd-i^sE%}p#X(bFlWL%1=z(DMz&DF3=)IU%qWIRR|% z#oQA!9=R~b-Hmj}%I^+HS(Dk6ZPB!AT$t(^YBZBQ>J(uPkgO5jzWC+|h$*bzW4RHd zpjmv0b|Yp;ls))VnYRj>PZcU0y5aQ)%*8B&DnsNr&gd#D$qtw##N7YmQ)~1ja?PMC z$u`tpict+KLGB?4oy|+|yhq4}i+(u}GmIBk=-&l62j5cZ%gkrl_g zt3XOFg5h1ZC;xwr85rpeAAFJ{otv253o@3VkD?UBl}>>N$tIP8OCTJ_m?`OzY!yYC z-5DV>iV<})E|)2tf9Y#MA4)P-Qpao3=#cS3sSsIys@b(xPT=NBPjk|Zr3|;AVUm8R)6zrj#qzH6DDI)NUB|{tStGy#e_a8!FkbV$XR;JDgRcKf=7=BSm za|{!YcB|%0cP{6nM1A8XS^{aTwek`|Y9=lmHwpAc-!^=M_{Hb#trM~3lCNeohRED? zMCVb(l@Q;ULHzT6$e?GR>kg!i6ab!TF-U0*=vGJ+>w6o-?hbXh5?d0X@a76g?NNq? zQ-(QYfOk&*0NdZ)u!@yUC{Egw9^kEy*3?+wP^uk#g+5z2u_9J=x{Fnr|-XF>np33Y!rJ5Z4f1ugsB%PaPmu!7WNz z;<+8PTG-!Z-}w8$K;iVQ%=A|$gO-sAhB~%QJ&e_a=m;Bfl^ay4<@9?W}KC-;6>HGyK!FWT&UhyetN_X%!%oSEQ<7KAxJv>T`UDD#mtLz=(eZD4pUYX0L2K1qu5~D>!vlqBewX^ zMa2hitaDm@aW8Iots>F95DXN+Z8Jt4vuJ|ch6qxOnxmKu;Kv}1=EDAju?HDiMs<5; z@SVEEDpK($)ATE9kFo_1qm6!eqb@_zf~Ghq=YDu|Rvz*qkUYx28}%-=s|Okdb_}78 zfSQR!agZX#VcZ{lK*n)t)to=K5jOF7h(&0ar_N&nP)QTEfBuBsQ=hkUvwC6pjC~&o zo0G`kY}utFlRw$5o*(IhQoc>ax}5X~(ityz9{0(>Cg^%D1rW3gx-ocxmCEBYpCbq$ z_sIMxj{t0GhX;C~82wS2G32dF&mP6iBwT#GVy4zZs6K!r{IF=P&C)|l1^a56zysSQ za=FfMLj6XViIl;%U#GAQ_H*SxId5FezI4RJAPpRz5IrI^tcoarHtOr_MoUBYH}w?s z4OsoI6_qTIBMzp)g=33>fgl!B#%xOb<{H-*<}GbTutg4}I7?pjTwN7)|BVt7bjB0Z z61eNkqRae#{nF${GvWiK!)MUaz)6RXop!H@(kMYF-_XcBBSKcVFwBw~yS3#`h3nya zAdFUQ(wrGHU(Af*$K+zfCCRU6t#T5fRU_@fF=yRG?G7$hq^F1AP*sHez+J3a7D7p>JZU28F685g(xI*KXs=br75hWYAry2_;+Rv$#u&600EvX- z4AhtpB>>VUMsf)ut(=}dV9}7Q)<=jJD+_emSU1)oG1(f zS5)sBa_}G<5+_`rsma3;uS%qaBXIu^4JFA==iv@r zJ#i!~87RdQ^=4J2I7qZQQ9|1k&`U{%X@$<|eyIUJzn7#j1Y~iopE3_JCC!~sMNZp{ z&yt~nd}RhGhX@r7OjH5_wvgq@RcL?F50u#4Ff>Mg8_bE^AsJ%#b z6s+UDNiC%}T0mG?P$^{}6?jj~&uC8v<@+iF#)pHOG*@Oj7W%D%OUD4X=s+8#zAZL$a>l z5E()kW1LT!0j{GnH2t{d2w5wS39nBbJVriNe?5{VE7N`B5(EUNwQcaXQybJXEO`od z_Q7ALWXc~#N-p-kULrt1rVS0GZld1TyH`O-wer&v)5%KO)TBC%EAo+kOZx@vW2<`~ z3=xB;=59`r>W1!Bj_`{eh5(Is_c5Y_Ij(kP9|MgZGdQZTsuQpFheIkv9C&=#keRZU z;IdgORhc~rv-D`!4NUbHDan>(Mt>9Ed*l#f8_#x!kVdS`q_OYbUma47oU-m}7HP^3 zdW4b?Bh#g_i;$@nz5PioKV|%-r&HY}9IZ4ADh`gUNumpHDHtRbb0VH@K%6oS&(slR z$fRzbDn3SZ)IIf9nLmMBk%o(6FO0QRq7to%I=k^u$5i;SZ%?A6Ze%1Weobb`N=AmT zm&W$~y|^?KA~__3XQa#7vKaztnu&EytaPLy(`ZvhZe=VKJ_<{M?RD6_Uba^gVn)#4 zOejm%TptCvS1aW9leL*e;Snk%tvDJzs~5O2idPihk*85uyJ8?JUROAuDve25S(S*W zy=`lRtMIxYg*+rwAS9^zq#?1DB&GI`Iq=B_E&}%kR!W0)vl`y^)H!qr<_x4L4J%+M zDKJ%_xX7y3Y0{M>E}kd8#%D>oStc++#M`8fA5AW~r?w?W%QQ40J!B&TRr$7O`@pm0UN0yiLfLw>XAb?C4qF zB08l_+uIGCYKY~wrpUjLh!RMc7g~HyeG*8_aTthdbCEf$ zvdX}&59vAfCh##(b-o@$4J(G86#4X-=_+3> zqS3xDEZ(Pm*>6~`zg?a%Z+T|UWh=!|WNOavPaRc-oqcGkG6h;YGdRfwjO9^2dbsf7F-C={a;p zF)+y-EN~aNYQjp>#iHzEj+xP1v4jaI z;fBj~2RNBLsGWS%R%-V(D5>wtP*Bz>8Ui|)oKmxAvkIKnB`1dHNS?!_Bwt+>5d&$i z(R9&=*|LUg(=KCiuyn!8ZiluQWxyIn3pGNuNA&}yQlhH7q?y0jdbp&O9{ zlgN1KHuS)I<{r1`&YUuJ$ThLYq!8O;8`h36f?Pr5+c%Uw?zyh)&1#RA*j;vM*#(zGHKi0=QXg10b+m&(I4 zvk0F5?msDW2Jw!O&i(J1|95HelBxz~{Uq>@o9 zWdaI{&pV^&nx)|?qTufy%#6M0$q*F%H>Gv6Nuo(S5@8d0E!l0Xz2Jp7r$mhSd~`=* zEL{#K8`5!KLUg{dkp$3=y(-MPiff%eL_BLc`@Ns@_d6>uR9ngWojqi~JLX z)gsVmHo9R)1%?^Mf^|MO(?xMz@gF7uSl8?4g>Or$Mvw6tV*|YIKIe&Mv@`N!F?~Gh z8m={|r7OiP31SZ8t&=;8+EJS)9W`iAsXLV)%(Uk$)%X!;lXzHV2f3rO5HO>aLdHPC z89@vpF#8&#LKEUVi}Wcxb0`*G!XiQ1W)wuY!?Jz6UKb-^L|C|Bw+xwkUKN{~)Q4J_ zQdMwzMUs)vOBCoD@)H(czFFbY0w5ribIpdch-B(%OP!nIW-jV=KHi`d7dZkY$|tWH zWtlxh14db-XTlxZJ-DT?|NA~8K^Ms<_& zmG#JCF0VlvBWiTw$|sJ0yI?uwr7aPkPhZY!3HpmkGiqjiwcQZrjV0nTZN}I3S0h^b z>Lf)VlaVk$`(b|Ttbz&}wPPBQijjLi90Mvg6BH?S1kExr!{Y=;M#hWLDf+9<;&c(- z)rd=Dc-(0;eQ*g#L0v@sA8e}TApj}jaDHQUoNxdtzA~U!~xN=BpO|u^wN+crg@{oR5#uw)AKJ8cW;|k!~ z@OPrKPMC@KQkDv-)K@3yQixZakpxD5Fz)G1Ah}y~oT>=m_utgt&x32?g-16G-z|m7 zX`kO!Clp0Gunz2q`$xzb;u|xEAt3c+!kEq|qOAU~Mi5#|0GA2rMksA~(hbUti;Flh z1Rd@_Mn^rh_=TB|;|)Mw%9gZA!2mC5(9v@3NUG{o4!amCgxSf0DaxE)+o73oQa&tNdNNY$SD8v+;UA4@-uiLEmD)9#Dc)+J+>x}I+~T! zBs-K{?DDL@jZXlV-b28;Qg?$-=)hUKYwQ7iCmTqEhnA3`oy&d_3b1b{`@ zh**1L4cn;3EBwMSKA7r6fv4DVg=baX-MFKl4=yETaz(JlX^AeE_%K3*99*sk#S1j1 z<&i}rizdCmowF)*&X(Vi$1p(Y5&~}fB&wjm1W>M?whVN|GS*!}bl3^bKPLb1Q zUL}c2dlkJ2%@aKF5vjUYFjE$3yaFLk7U=M65`(tkiYv}LI9E>I^lZH2gI+y=VnpbY zHntaQzyWQ?fhPQbmxU;Pfwek7X8_r1|M*#`D)LVBRrEyiBk~FLUHP8;XZ>5|Exw2t z=nh(HraY2^FFuKh2Ua|4lZ3=aq`OXV)sU@7N@^erVM!tS3eQ*xcyI++M8xo=BZsLH)4>XuzYVd=7&qv*Zc++iW~l^EW~C&} zlP#QZX!iBXV!6|)Ok+QtxLo9q&$0}}r<65h$KayK-H~R`iW&A2^1=$VafnZWVk?P= zvz4`siw%)dOip-&v-CN(2r+@MC#954jSH{dfS)TdH5Qjr(A%%fV-G>{77?S46oW`d z!df@gRYm7aOIDOrl0ikibo4`@b*=-BZf_Y^09KNWzGRr7VjR#l=`}Ic)<_x6S~9ju zu4uT*#Fom=9}#RO>gq9b_`tg81~XQTRUk!^yy*_?$RQXsfrCQrCxu4fOLbS)4PmX@I!mhN z#v!gg75dPP99X(XLTE%8jk9oko1l_fN+BfZ*jSEs&OqUm%sZ`!i5bW@X1NGtKw ziNuHoe}7u(yjYf4K!r4X?uuCH9Z&lly0j|N1#n3xS3&^Yp{eTjEEM!jPK)Ij^uD7f z;R-`L%|}Evjx#avEd|a#5sde)E~ztxM`pQVLpVx}2%n<7h1ie^BCvK>Tb%VGkW;4S z!DlJ1rb~;pP02>B^JZ7CvP7&Ad`g>a;I1T^9n$8Fn9mMV!}rI`&-}D2f&`YjHYKpZ z-|bQ3d^ZW`k)%YBf=0p5iH2J2uqK8igOooQ*U=>tUIVP| ztYDmfocPaxrk37&d7RN94LF&V`0Z#&C%36CnE-FwDruq88;*ZB_aL$2Nu?cKzvOgj zyoHSHq-jed4qxE^DvJAI9R#J0qe_f;RTn_=OM$b zHm)K9XhIuvxx<9`PX;|;%8_J!fmW|Rcfgz%Whk;3Vb)GFt^y@469F0+x5FpwYA)1) zm_*4Ms1+ah*Zvh$2H9fwX|i!REQ>_tm|)E$jc;xUQ5_&TPL}`YnWc1r5Jd>H?QM_; zK*_902iV8R6qA#z0O~gt=dF4%W+e!v=g9p(N!ouQh+|qQP^+Z+D+(`5xXK=DcW}%6 zyP7aH)&3?qNKYd0n_jkNiw@S{$fR(Npol++8n*dDYE425O5&d+OteiS3AFY>s;TqA zz}7Y04$i#zvds0W?jX3*4D(GV!SMRV>=CFJ%Jxxw8yIas_cHwz?< zSI_u|wiuMn)lMWbV&s0HkT>+~QZp0if71xE(wxL;_YHa^;B-kE&b8?;mN+D3?m3sV z-B^6^en_jqE^FfxZjWuHIfT&2%q6s066H!uRFMFyWPXg@F=a{G1Peb9YRTe$Sw*A0 zv;L;`sUL=JsZ1g$gSmBB#VJb(+cI|oB*Bci7SNiovTd z#X^Ek11^SpaLyu6@fCY2m{$lQ3)O^e)m)T!VVvK(26>Xy^XQy=^Od91DjAshL*15y zx0!Na$Ra^AOAZ|g8r_6b+gW)AML~NL#*+oJT-bV28=tu+&Bak6m-Ad3lc{RjAd>yG z*AXGEBa?Z5k())*T^6Ey!uHjD5}VsSEI2k-36S;b+GKqpLawvuCTdeYm)GIet5#Q| z?3%%IFgB5&9>W}E_KoI<&$=Y2ZnjFDEl(%%OB2AIU{ys%JzCXsBzjV9K}r4yZ7x%m zgV3Kqr2{USB30~cpAn+{Hc{tlEyaPH)P%m`iV^-HKxRLPLHf0PuxzA_r9d`VL}dIl z%C@W6sIo(e$)f#-j;_*ti_wl+F-vsWH9{ca=HKFFhf)3fM`GeBLp9J;F^APN6q^!d zO#p~3lxekl{@LAVhDw*W>qSEM9toCCq^1A0LnSkQn^iVby@K@@#*2&}zlvhSSxau~ zpYXoN$g-fw#|BS&4Q|rfj$@zXM=>s7eEGTvxg=x!uwAG_>0VN*N7{#S+|FInJ_7EE zFixjvg(Qs_-re@vHfN#80l|UOf)ab`VAC7|*gkP%WuT~F<*MF70*yiHz!Ar3P$8Qr z0~}4GhjrlNjs-9yR6li?4-yIGKrBAiSon)g3#)sb3X?=kAQbAaRN21NzIk+@%z|x~ z+V|$5Ny~d~eZa2WE#^j5@A@gtBD~EI57_~7EDxu6fOuc>qDPk6>>U*7_EA?ot1w|D z7XLlX;<2;kaHFl&XLixiko+uX9Ci3r<;lX_Dv{G6mY7mb!=cnd%1mQJ*_OdIOmd%v zG6Y7MUya(k#ns98b!E&ux;;8*tB$!*uwQ!m!Ffy55DxkrBh93&m4-V-k5zNPZQc#=5E{!x*=q7MvzK9-Oq9(lA-4Jz9EUbT?N3v7dP?UWo2d`+Zl^rKuy zl8XjE4u>4(%gMC3BM;C|NI3IKvRs;HUxM~rreZqzk6+Y zR28GKQf8=6m2c3FU5OhvXZOwMGoWRIA~;kFP9Czx{S0%Q%ERsCSi~E|GqJKjemdR; zW}N|sp}Sb>D+_)kaD+l@Ed*+R;6UdR6;H9^xLOu!Qh7AAJuDtaXK!<@=C8|cFfZQG zU!_w}aT%fkl=YEZXdT0+?u`aWCDgUwK};rzQVNO}T{iqXEHtuUeX`gQjVE(4ii#0< zluDm=qSTADAui_>#hP(|Iv5t_24^-SE6e|-PYSw4w%#9N=)z}ebmZ$0a!N#T_$O<~ zNxElpaaBk;H8+J*pye~(XNi_bMiZp4^B~%h=Mh%36UTbYh(qk#oA^~Vt>4ACj4{3z zJy4Gkb0N&#T`x?M!x*zgXRek+^QpEZm`pK>**Hv@SI(M%AAdlNUDzkcK_O$7dOAS6aGmWQ+b%@XVSfj#1@36&g8G#G$Fq-G6e!z7fZ z4U?W+lAw``jKgu)^0y}QOU{18*r6-j=L#2W#$}u05i?K{PppP|U%7u8URN{w*ls(GQNNrh%;_2;*?J z#QdjKE;g6M)X{l*%SOED9*S_*QnMRIn~B)eT#ZzUbI5glGHS-ryHVzsQmHm zSPOGDo+@g2XrMizlsO+Iv;crIxv8#l$)7JZl$<3Y9NR~wIG~6&JMmYCU2VKklm6)) zr!mv?z~fIr+(Hp2+B}iS!JAVgR)qQAtl6#LijK8p@s%l9n@#?rc)NaAVxqAJHsARQdLFP+`kOl&y0q|RVt}$P-9Ofpi1~Td5iZTjDc7k z2d>OLWI|X%IPJAiG4>cJj7wYEpgDvp^sX-}$*Pwbw3 zoYbdp_fjFC)PY{B+jn|IGXWDU#g-7|w9JB+(Ze0hLR1>JRfo)NkM#0?ukd)G^tU9DhDm#}{w8^!QNUE#IMfF&XyingQ ztCdC4&0{a1{MT+)RKWgWP=C|bnZ9-^BJzVw`r#Nb2^8{RvJ(j!Q*!U}oh)xMe36ZF zDYf~r!q;e_vK2}vHz#UNY@|{uv2TfM$MzJiQS2mY?D?dyjz&2F)J!2awn}t15dp}NX>e8*5%z^*om+uV41_$C9xtne zT5W2K&`~avtGZ)m0UE*VBWPG=7*`3`Arb=}wrA)Tgl8i1IeV`{N^3zRV#sSGbiP>; zM8`|nW3wU1O*i&CCapUm}1(eKmbHGd3->r%zet^`k?iBz`5^3j#)VVa1Gy+(+Z3 ztF>k7P!}w6b}?-q{d$2`h+Jcnq@w(`*%osM@80O7J8_?dNf|Vi9QlNbU4sa^QQ&w8 zat#+}AgG%4Z<5tJF%=aXrFk?d!#OF-DnhwWZya6|7U+r!WNVMuz)9RCyf38H&r3=b z>g5pWD6KdfR|o2eocMnx@z zMIzoiT#TS8*Od-rm6SOjj!VdqSTSYOw`}udwYFIN54zuMVl$nFq;0v}ma4;m2jk^W!QvDA59Z}lX060vbX6bJU6;>$om&P`uQle zbXQW0ayPm*%ARcUC1o1bXob(eI-N!-CskPxqqrx;YJwIHa#Gk(wr7ssH$BXk%8x-T zpuVdYIWriv!it^bl(7+{Ysw3mDJL%Kib5co8#OMR=s59Z;dm;S!d6EPeI10dcc}DO zYLy8>fX5&0LRF<0W1)wMdlKn)P$^s2^lz}MB9T>yWVxZuLs z$|vVsTZ-XnmLdg^<=w{reMdhkQZ$+58?aHHi6ZtQP@dXe(LQy4=zbL(JXZGNEJeGu zl)j165u;RRCT5d6YIT#u*y1&eWmic+7ew7ldJ1G=_MZ^$yDxMTM^( z?o6J`4A#6P3)Qce9FOaV4R8tiWW!z?vv2zUN}{;yADx zWNZQfZ>8lj{f=eirTy-=oNZRZVm^Z3C2Nb@^?gd@qDH3zbHPergK$Q;FOVQ?6Fdo{ z^AxJi!eD(vi7bY5A*-JW!;!ekjM586DKQ_8q5dCB*n?hL2?dF>c>3;(!GiC31~lx` zVdZ_H`OR#?5mJsausj|&$ThZl;5B5#bn#=6rp19gAohjLJ9bKli_$tPxgJ7GavH`~ zRHA^uu;039G)p5bQA=W*L#z&vhEQ)dy^p7Brb`i zQP!0OSpq%uADR~Q&Zk_@7-w2abKsfw8E7>>^^!r!0bc07B&*qTOLiG!(xPW4(_ zQzvpiN5|#ly;{)h6;MU>$rUf{0E_-$h83wz{drb?yn8CQ63b^yMwR9^$$gB$$e|Aq zX^$W!->UXH43gvtYF;50Wi0=!>UOj8G{*zwgn1*2*Pbp5VFIX{-x24^xG9aO!BHL~ z{giE6&4}7PANgnV0U2SlZ=Nc&!j>FC*S&yj209nXB(-6ZBwIJ;=o^xAD?5+q z`bJ!P-=v}#IMmNU_&FlvW9(HWIN>j6Y{ZW#?JkI(VT5TFB1O}rnJh{ikH;Lwc`G)W+EZ!9|d4-yuA@8MRQk zkp`mD-id3uo%GfyQMM7UTk^E&o)X1*CTm)^=5 zW;}`4Q#B#dLnWF}|f-6CpGhl!?wZl9Y`8pah&hWDE0IV}3E*|R{HDJa$ zDhp1`Op~P4&Ke3mF~3*2N1`*bwi#Hlmt1%_BH0hMAE5w8MD+B=LL4$dZ74|MUEYl<$7Sih0;JLy z@kKfzyS0Pp0*E%Cyodwj8@$udzjG1OjW2A=hz^&BA6o+yrfv8YsCdDILqj4{G&D?Z1Uw z%C|D#AsU*D8-o6`7^{V8#gq|vm^qWuY@aSvNAt+35McP zvA|`q9aFPe>r$FSG!vCXZO>Xpw}$!o4>;8ga9l$sAwi%kqz_rMtu5|8pM1E(QgvEq zJ~b;1h`*fQ64_F-S4qj`if<@Hi#bZYT&2I=GR=i7*Z#W93K@kbWI`9 zfJNY?o2_Ynl|tpZxn1;C<*|nG*58~7Lm=zdbvh_bYRwl;kHJ-gC6LlQlNWtyl`+Jc zB62qfIpUwQ@=Mm$i@7g`KUXmwG@6X1;+<_Zs6&NT)KWhPLd$%d8DCs2+mq;`afxYK`<34MOw=c$X*%gqV!gUs zsm(vO+Nad;vcF4S(}??t1mgv#)U21AnPPcF%?K)~qp4RDj}pGrZF_mnpDjqlK``SR(E4r zO2{mz%};TDsI2&2%301ZO;jyTVXMk2NokF)1zMOSY80qc#Twp|h#{Zk7^0cPVo(BT zO8;2W0^p=5r6aLU%ArX{YAH4sR~2_WUuoMqX8k(f$cZdUe~PaGE@&G3yY7Vuo3N}0 z&26(hUbP0YE{*g(L~m;ClW@X|`5orF@S1H>EO+(n)6_zcp1`WP=0RAXZEmhPVOa|0 zvn4ntsNK&6q%U$+5c`pJUn!Yb;Og&P`1&FYckfA-)>5fmveIYnjFxq;betSqUYK5* zIF$ykP*GCG(Jp*Pdg4lJ)cJ#5}P@ITT?8H+-c# z@I*x8=wb1QR|WKfEotzxK$hElHdIF-lkASoBj0HYavVn!#CElYRhNVrV$OVOk}@6i zfbO@C3g|zJG`P(+v7Z&w#*@Cfb+5UaF{d&YrEj!GQ=#$dA#Jhznxe_Ginb-o(CICl z6uT$H%6x?3DU>ONewyYf7{*EnoxTWxif9X=ylmx7Qg6*{V}_5S%n^Ij2xQ}V+SS1F z({ZkwU7EDut}F^SmI>x=yx2?m_IxV&Cx}-i_Lfum{iJB_ah+R*5#gxQq<+~{|HN>Wy2l9*C z&ao^PL?eyWt@t`9EK5d=q;Fs82b(9p;v_}s+*Rvn$JXYV(iD$b>;fW3{#h?35+wVoBD|6+gBBeKc}d_B&Tt@6>uzRZ#R# z)0uj*$B^Za-yP~94vp>~ZM~%#rCw1L1ehJ{Y%yF%+@}%DY_3NE<;u;si3cl78<;*Y z@9Hpz$>N`yW1r3UXy_x`u&>C<*j(fQ~Cx9S$~vvgoC39mIo4TCX=`(q^Iw8>zFJpB0kxF3Drk8=*(}By zeoQLZfT(mPf~X?K(A1Cxkpd=-;A^0bK^j&+!$e9StNT^ zYpfwS4u#}W?r$IWHP4eA2r*J4<3NIuQoOnC!x^S0gBs7k*}+*X)(Do_j@!5(Lh}Eo zB!Wf)jE}ly!pU2p2P)z=urq+N9p5!oaeA+<6mF1hhHQ>Nu2@2;2sAOKBN$eDp#!#A zGUvX5Ua=Xg;sJ$dV+v5l_aI9DlZW}+ic|y`qd7!0~}7K&NLNAt;6L`|>J4$z#3Lh)k~AomI&^Knh_6 zc5|PdVVYh+vfMaidsT1=p?o0EVn9@sg2>j{HieKE`lk`fE$mE^G<4Wj#>S_*?@h3M zh1ts&IV&3sJqa|aNDI!9ah%YlEMf`Dk`7Z&a>iU(BZ#o3z{E^)(F8I4pzT(oqMo_d zZ+-{Y<9D<+BaC3UEi=SPN8}^4-}O1(Vk(j#8O8f!UNHRzI}}n7gU~<= z#sZE+!YKwq`@LW)Qcw$`p)@V;FhvZZbReZWL=&w7I5CEIl(0ps6`3tscVQ%pK{4<} zH;UOqSP!rjf4Bn>N?|>{MF>SMv?s$7Rg3a+Cx_6kFj?o3^8bJrhNN+^GF-xZ{c{m%w`z* zVvQyc06;*$zfD9t5Szvy%0607@2-2+mMf#w!me&CHMxyb6ux2x;F?pOf@~J1iD;h#9PcILYst=WfbbyS2aBPqq;WP`nhno7Gdcq%PK=H#5lzyXad5oUOOe`qo zW-SR1GI2eP?mB*?I9S=Z@;Ib<{k3=WljD!x1(nOIYwAz{rxMe>F<58JatxDqL>1rqTKb00C>U0by#(vgS{s}T%gmb7>z2E7^ z-TsnRJg2U>n(-nM=_Nnj0hb1X&_RdLRCD2DgCBIJ5G7e|@@7(gDM+!9C6y5s@C0274 znv4(#@aF0>&I~#gcGs{T%oVx3#-|>fA6Cu+{E3qGO7VnFxRo5F7hsORkr`zuG)Z29 zIiwdJCyQ`}7GxmuUnd-QaOP%FO$KMYFc%_j#iSJoUH22bk`jcM5y8+LB7IC`DA{V- zQ0E9UqeV?xCflN{66TC{cvmg1`3RTZt`%q=S-lCwYACK%XA71!fo2l$8$$^)Y`>0C z21GZSbW-7#558sL=Vw9~=h%h*v{?z=z>Nn;pC(B6VPx!#3I2viQkE6!KqV%rVfTh` zo){78l-22PUL}Url>2TdjReA-6@&T&@BA5f40RcL?H*(H`aqru6P%+8l04NiLIYKB zphb{z0G0619}LTk#cK3;6GTVqd$nNgQbB_u6)2v{>jyh&MIYGb-7H0ZX+icO->WeH?Kx3uV!%)oq&^{rOUEVx2zh!IUMc|eBm!uO z76nxujzKUAV_T&yUR61(9$mJXY*H>j7OE|7qL9A zBu_He%=>Z^&gJwK_kq66jU)!}Ol9ygZ3B_qDX&wP)5Nf*39+5YirF669REV83rb|{|daXKhsTha#H@NrY zS8t-}W}+dsbfG3T6Ji{LJO&{^ZacGPHlj^#^5i)lA%wGfo}=(7>Xj5q+dn_7uxOco zXiI5ZP1^VA1!5}lmE}Ey_2_lQi)_Y7++6)nM8_(OXF;Ych{i)asJ1A%Jz`T=IxypM zm0g+Z=OOg$?v<;WV%Gl4e#W{omCyY6Fv^1&yxqw25IGjX-YSF|m1nmg$U&%53`ZEL z9WJsshYEVEs5JK7Qzaw1 zN6ZV>(#Rr|gyV#jXzo0{oD*5be2;#{<~N4Y;_cF;bep1xr_R8R#}u?3wNxjlT2oNYdo%%z(YE=IR5>CWKJ1{ zCukcN(OedE3*e4RnfM(KT8Dp^Mq)ut-0gYKGKfNw255{&IA4YBK`mr8bM4H!Xaehv zZGAChIhc1b+KD2^0dU0yH8gmX_pRozkmmW~gT*TJ2ttIM6=jl{sO{u&gxP$B>y*rB zrU)iAu^=aWhOaX@x11f|Os zxP9%Na*F%(?h3&y&D$Z^R$EkIk*{P9tB*xBh=QGFTAmHZDIV^o=T);|crp)~sU1jZ ze|yAH-gp#MYd(yTkp&ibJLOLJRbrezIRbD7lJT+5Ds*%!P;RWB37=QFz)hTGY33zH z@fb*uiR)s_kUZ=TABtV6H`wGu`C&Sc>1T^}>Z;>LQpvhQN-^z216ExOKva-=(niIn zl%<2|tHKbtOpXCs`$P$mEN~hKb|DKf=*rh)T9LG|P~-G7l*DT2A=Iop=pt;XLmQSX zKy6>NZJu;nA`BD)-CWFLP}E|OQ6yI?t6xs}$tl+a5o%c!3W9VpXWo2=z~enBf)N&t zS;_Axx+XEhpMy5~OAm2Y5W;blEd`CU0U818KyJ}P2xZVk;x+aD-XJpxtPZFv$aG2E zSFxI!_2exeR&~UXAq$gR@K`ovw^@x?6EbsmNt4g5H$#kZ{W2>ml-A1G?~#ityCR=RB;1+yA~;{U z+{840wy)bMXsWiHm2xWj%^gAc7fywE0xj2fC01MpkNp<3N6G6s=$O}WL| zP?uWsxthLecqj*6c6;lrj>~yFUWqWhcGN%=TF3o~WoE&g{aEH;<@{1)gf-%|C##uI zvg08W`eqRf;^+t^FMqpb3ReG#x}N#Uh@}bYYQ}H0=mm(ik}`zg?Q}-f(Tba+ ztc*{SP3*Rzzcm@|fZ;V-<}0ji9k(To+OFfcHTZLMaR)%R8^I7$m^pfqor%cIj7c+A z{t-3EY&d6oV08uf$r7voXDa%Tp~5C{u~Q@TEG(VURz~y9FBNSJx1?uJ9iwaWr5Pho zREh8=Li|yP)R<6aN{Ti(;prqR=}#pJ5(wNEVKh8J8XqKSC?secBwnV|0pAWMRzBLHiegRq5hY~W<30+Yj|~87 zfjS-OSf9rk^z1df4_a~%cFQzv3W*6^6w*Z0F;0VkqZyqsFqRxar^^nbYTTM}zB8}6 zCQ})$&FtkbrD@J5>P&fm2wEPrP9viRd5Q|@qu7Qjs`Qyg5Gv&^BvUY77#2`R`^f4o zUtXD!eTdBGcK)3GUIuh8w`}Aa>&qK}AVL?9$1D=bn2hkF&wMO%JvJgqC4qzpG1OMh30#TSvI8BPnY`JWhi@50 z%A=IU)U>4~DFcWP=;jU#UoCXi6!8YGXEkmQ_?W3uFKekv3?4go8JG%Mje0J5 zvOQMlQ)?D4RWvzHjt$$h3$(J>Z z2;@@LTt^5%>xwJ3lE^o1%o&hE(K>GLvMM3L`e}HJ&XyvI5?ol3J&4FG*_B)Hu!2II z>{W>>I|{22vrGL46m&}3t?Bu(i_V>PlkS&xj^Tvy<}G;gnr`Y4fS+ z87Q6NfkUztK|8dKX#xh+_%t^)SVAp(NxD@8Wzt8!Wb}6@$Ej=sF&!1rYI9Knr$$AGYvpy&>@6& zOe;|8p1}r4r_-FXtl?9id5q)HiKD-o{m)@c9t0v~Ubl`}z?=CBy;rWm(@-`tqni&L(hfli<{&(uG zvk3C>vN(G6f82DVb#&^-U4-F9#SF6%A|j&eG-5({=N)>V3_>|{BA^9o&}AorU*ACx zmv#YlA7U%OO}QZz^kkHako1$v{H)p-r1$ znDm9oiT0`HbbuNUYb!&H8;yQ)(#(?TrU$F1l(9dId8kwkA?7&gotyEJ@%;L2aD3Qn zG@4f;`KZB9wkB-m(dj>G#OiC6?oa2pUM?Jne93NU-ZnqX21MlRWyET{=K`;?MZFE8 z$+cf9pah*tqDNg7yeD+~fwK`<6VrFtySkt$Cq07%pXi3VxqGQk37g=iy7I3Hrx3VSm;rdg3G_eaP@@ekP zU(gPqQ=W9KX(i2j6iCPc26$bY^QASaj7!3VX%TXhiunx!DOKSD&`)|kOxF~<=`z*x zZGMgnw^lE>YfHOg>SdEqN#3dbrn(ZIfh3B`?x!qn zxsA|U43D}R;772=19+lKd8|A>jvw!N_wqy!r91I|V zb@Zuf!arf-Wt}QJFr7k&zs-`z8w#H$t}ZVgdbGSCzy&Z1a7iLi<1WqWPGFsXCF(1- z$NJ^iCDKG%4`*^r>J_P@d>~V{GQ6n|pVP#A45A+9k zF@)K+kwhCK@scFprRfSCFlfeXtpuZkc)?XG@sq_xplHf~feaDO#jb1PnQJa6L2RHq zKR8+>X(6O*!n$U|6V=1*f*>t`gB%KgrEVL^e5v5XYoXwXmpuvW83<03+f$A6ad)I? z;*pARLO3w36V@s;$E?Pv5JkHJ(WG&+)SO1iJUkQ7va=DJAbTAHZR}n9w-qVGQi>sn z>za`In%iN9>lkerq&b43hs8{SnMxv-1r=_v2nhqOtgY_Al7iw?<36~v^qgy9#Lz6E zGmE0MbJP^Urmrl`GkcH8`dl*(DPflwS3PtR#z|To*nxo)`HR7i)erIHgea)vDmQGK z$XNUsvj=H)epDzR?eGezy$aj~pAU`j1UNyCkk%tYQ>j--ye|kbOe((B9XEeZK2ZDRngGwh<-KAd_*Krqb%HV7DfvZSslugM{v?U1p?7 z@lI}PC?;V$7HCco}fMiuoB zuP_(TW&0TR^p6w~dFAl-o-&;)f)Q8?{wwE#xb6plF9UJhOGufK?$>dJvSThgBifDC(K^OdMi=RWioW)^%2^n_`NUY|_ctZks zH^A08TE*qP{?Un%_MIn<`ulHF0vMl-0V1jK$f^tBA``7*l=BoM}k0%mLU!+f|4dA7H)=038wQ5U00;Y zS%qn=(>KilNMejW1IT)i*P(*#r7HeU_QQE6gn!mzLthHE_d`4hfV>pqF&Q;~dZAi2 z%OUXKKmFe;gfNBhTNLl|zN2-0J9wg<2FbI@>a!%{CSXF| zy4~b!flLSZCd{(PYr_-iR8(b28;Too!8<6su%!?xDVk?mACZlQRLsMLlkrbn)?xs< zl=yGIj!qQ@Uq7b7c<9C7FmAy9=x*3yyaf0$z=1Cxaho!8B#lVlVT%&JEM(;bu|rda z%FeFcR!ol6g1hS8_x|jxEzHw|ZGF>QI+jr5^EY~LaxbeXX91I$*2*wihuBmQN)$NO zlJwa$p>So3h(^LPCMdW3?Gj5fR4Fj>=VHphk;)eho8!7^e1Qj3;FHedC-bGQ6kX5D zYM+Os!^jhpKnn1XIz+m}VM&^&b6Gl{Z)4(p;6+nXe6Xm^R@)O-DUu8Om6(vVl&~{gn6se5B8ekv>NKc%{SFd7j50V8Vkp&FNgw(y5 z>uV{_{T^Q*orO+Bq@YS11lbMXx7oc}G4J{AEMIkcO$K`38{dk!&VyPZbB5T&6d>&| zNYu>_#-(!wLF+xP2r1@nUTOzHmSP!6ffui&a*KB$=qOj6^EOA%YWDu~@Q4ZxX~8Sp z;`D&VX`vc0BI8e6$czv;z`+EFbQGwB|R>^7EcZpx+^(PW- zEi=7qQGs%nkFS~wEbx^T400p?oPJ6j433Vy&gM@aDk*d?9kNaBYtKLOKhk$yz*p zU_yep4AUiKA~hb|s@qTjEW%tAW@`KB(o+<43;`BqAx=9Z}UKds?vr zUK(G_FqP9y+P!46la)m7iAitQ-~>?Y2r*g^t&$%FhoFoWc=L)lcS%T@|4JgXQ7dAh z5|3Na8bzg!gCMk4%%QGz&ipligyq{cKELli1*%)Al##OAm|o~akRpJ)6XGnrv_0)a zO0E9wh)7V+>%&r83PV`II*X5LudqmMXs^A8#k#Q-?;(<`!CE)yGiJ!4_QIszE)({2 zH6aToB0Fy?OCVnkA#~^NbesfFb#1x+M2*{$~$y2?a7-%ZP- z<;~MBCD)!aPGBN=&*~v_R2l2VedsY|Eb+CYxg!9>udR|9-;AFoem3 zh3v%z0nV%MgF+~-iJ_LwsI7wJtPmkGIM5w!!Ki9x_Ohox z!%w}AQ3{1SuKj*hy+gP}yRp#`aqD1uK4#!t14vJgA{c3N>0<1~GmvJS6d%e9hj>5C zB+QLNDJC%hpDZ0^`v|HmIQaiT7qbhZ=}=tLzMejDzG?oezW_foe`G(Yxri`ooipv5 zaHp3O(Gd?>!b5oebFo`k5|edTVJf3sB7)=zU?f58Do6&M4_$Wi@51fMpGWerNzHD1 z{oAar2`@b2Za?7{49KpF$zAx=CHev+c?S@4g#bW{0Sr%(w`|LvQO7Xl9vh@H0wf!t z(FNhGQ@?XBJmPKOzCjl?{K~j)TKb65WAtq`J`lpJr!2aOSfrSj6C?Yav#RcI}Z43vg5@4aQ zyHhLlX-rylv+izxvg)+3`lUFB3BW@E4ie)b3zE#}Fs_$#;gROEcOH$yZh4h=YM%Vvn$EG3Jpzy|fX@eTa0!%B4G~D> zS{#l%y~*Z& zBXAOc%>wKR02N>(fevA?s82=p(*+UTuO^Twgk8mz`qD5 z5{LCbd@%^_k}j6BE_y>qx*$~Snrf+%GO|xi%3jIJRXD#1YCsWa#J)EYO<_|(V)N$x zcX;1Z)Zr9f1xSer;LHTr6TpHT#R5~GvCJ=8Eq=`x zHSLQx43y6?H{G6=p_k>~(bVmobbUKq9nRZhk63#BpZs|+&LjB}wr<*W-z>`$W4tzj z$OdTZKUszy-AzbJGf}$4wyS)*5|bxc&-LpBnRq1BPudcbt9`l6HkS{`mP} z!N1+`bbPcb>tdB)_q_Y0Q8utNs!OZ=|$i57~MS&O+0@Sfm*|MhnuPJVa&Tdwe ztkL*)zFs%3W6O>t-FS7q6}qXkj=bs6h@sx??cvq%rce}$XQ~!b!1Y?jX~`5~3L!_l z{)s~B)1`;U453wW_y=R&5I_r*4FF1D2)qCQQ-BK00000dkO&}l;2VY{Q$~gWhJj>& zZO?=cq<4dX2<_1nF2FqF?F?0}4~L@#sJPdA+Vw@qsMsmaTH(3@c1_Fx5J7fby;;RKF8r zX?auOkK*Ae?`cBmBSgh@HRTP9eG#O$HZ7LY_4yXwjMa)+r{#SHe_3}u5fZV+IkE8U zb>qW%ZBsXG`vSbwtrt#_cJqaL>jlU4Ci+_`WUAGVCb)Jj%1d67oe={Pi!a94Zf1I> zrzM|7!syK#Vsu+d*?EHS#M<#Rdp3mdrEY7{ z@E_BJN=XV{;ECd>>i(ROD}U*J%NVIptnK@^Xi7tv=@$_XQCyq%#bHaHfr_W9i=(jX z*xm3X2#A=ge|SKg0tEd#n1D;wPAHfnFqHy4&j$=-O+|%gNAJ>7HGyL&G4%d|8=`L2B-GclsTF6#!h zCIa9}-jim-)q6~_5sG+|*l+D|wz@hVv=&i2xOv-BT#OPc(<7Ctyja`;Fo`8G1@uJ= zDrxeaVpk{l2w0+7U$>!)b?Be~pO)AGNBsZ_SPi!Lo`asshcw;6?SU_vVjdogg*lf> zG$nwF18_hDZkvy3q)Alq%M~af)$9>+v*FIA`oY2g5kkKK0MsCKRXGmeu3056g|f7d z%v-G^M0m|heT7c5xE^!6nGV;f|=|-;lW?x8|X=TigE=z)7Htk!$DPt5ZzR*UphTHZuY<7P<6p{gAA9bHb65w2$FD$rqwTu3B>_X zPvB7ii@)du>MsZYj&F!Mfi?gH4+aP!_&3lVWNSiEpl2rwXmJ&-<=^n6sgvu7X)qEk zw+(!MldQxi*W%3Gb+fLzHe-np<|M;*3zRynvLbznBjz!pw3i{#oOPtppNC}u2WqrJ z{CL52yKS}Lnc1ym$RmK^g0!a!8UIC?=G3Z{*s29$qX7w428^w*=3-_Tecz`IdbrDe7sLCgGIT1;liiOy-a zfwjeAQd0-ug`6(XabdT&L-x(LnA!K$f)-VFM@Dz6`=Ge(5MK#Gw8EbRG>Y>r{MGEGXX zl+cBh7@Mk~cgs3gLxM$8VDeqDG1iRL@sN`xVvftDZyY^p!c$f{+^EjD@D0psow*7EPZvHL^nQ{9m;4DSnDqHv-~MRq_`r9FmnXt(e*Mx-9n*4lbf`gMxvtK zO-)fjTp1LAY;(E4lDprbyq*3ST~g-p`kFZss1!u5l&IyeOqW1J({6z%jnn{O^g%Sh zBcPBz==tV|q(U<>C=)Dzl~6Xmfh!oM^*Lu3i644K6z059Fps)g{Z=Zo-yn=nEpL_| z8TahXl^6uD4AvA)NCmgRryx`u$+D3oC6xJ&p@af`hBa!zTi~XeSzEp=hS+}AtqHen z2`N$?{v?>?f}Ej^f=D#DBs_&X8)Q2Wl;nB|Ox-1Xbz-Wer{#=Pi50^>Rl(*~T59)h zY2DuY*$8j>C6eFD?6IlXK=X5~Xsac}5DCsl{~7Gg85)Oa^+h!hHQ|7wcSk_Czk_JthGfaf z$zYM|8(&&5Z2{L7s&VDUx^wKolNkCQI{H$>D+`CD-MCdoX4gyO>r4>uic0Wm%Dr~+ z2F2&UC#)njuz5VkY3dCh)q4H}Fnj3jrT&}+J6!JL~pn(g7RUwXr z;Eigh~w&P{hYQ~R3LpKEwGF#!MD23CEvoDaftv>{*?d5k$OByvd0b0Geuke$0? zDI=0N^DcEtcz~p3dh%$!9^-)X_Ny?Z-sSQFiM>CMY(fPXh`JG>*ZjT5dNHNNp@R4N zu{2hu;YE&+>5J^iCdW8m_U3(4B9&t&L_la zouNG{m-M;Tz^|_-lc~ytmxOtT@mx(|yGkZ#B9B!iJ(|K^FoP z9WnG=js|Ae;3*eKKFQ&Nowq!K3=F|I%(00kIwU3yI|6~(>*=Y$_>)$7U7 zoC`=Oj;wVfSw|wMB`iE_A=;B}fqs0O+naS8P_g0T0zCl92en1S%Fz3hpom|sIL%#8 zu1YXRD7A+~UkG(rE)HhUBw&|-l8#c%j(U>uE^yh$%gt+!Pdnq%Qi?iOF2=76muT-+ zXz9gbMlU?Eg8GB|(p<2#MM0Gca1x+|m+?oAMLUh08<|&-S#$+KiQgoI+!(c?9}pq= zkM}~BhhUp#Z)97Vqm;Gk(-U|Kr5tA zO!KMqAemj482CC$xrbi%Nu3_Rh7-%2@m3;agxr9W0~(c3 zg^JeEyGt|@r^0lhmm$J?*2f~c8ye)n$H#iSarT0obDkklDeATtpXo_H-@lzI~~tqCA# zRGJBkjfi+c;D3?wL=>X9+2)hq1R@#9$fM%WInk5407t?)tO$M_Ct=43c!m@*S~EiA zA!K}V;Vj{%cuC72y)ET6aZut1e7T3XEh%%jEqb#UDk+n7pO84*IXlsiWX<`PNW_d%84pM5J5MKL=gdDYz=Ij zR^LUsp&CC&g_7jsLfy&~+ey`C*grzHPK}_|HDuVJokDht(_ePfN;Fw!ClgF;KX6Hu z$L&j-`>o(mugt3(43)*6A9b=|!d-v0K;f`#N&P%hY=tA{aa z^l|jXSZmKz;MHmcuGM^)cZb-=y6J)g{8CGsN_W2YcJdKTbQ0g(q~$D{x8iF)*e0!4tRF zm%y;SJgB|q5iOT_1pWX0aaCo52t0$xEURGC$A)}mSI*72J<9!tk>Y}3G}?tx!TM%^ z#ErnOBwWixAW+KJ?Gdpl^61@3Q18OI$ONOcVlwifh6| zl3ZB-!FH9(q=eLo?}eY?Jq<<6lbLYt>l~3qCVI6;;wD(&s~VBC4RCOR8e9|d8&f1I zawA7!x;a{p+$It|s}h$8--OsKL+mD{(K1jGufEn_d0n{rvOjNT{t@Yp(+S|fjCf7Q zRljq5d$V-M&ip>qYi z3@|I@U3s(;T~aR`NTW?5v=ot$?`x6LcAp@hs1q&sY#g65auI&Rkh3I!N5RgEsXnIBLv>8eHsUCb+FAmfFIZf*T-;&Y(9OkJRf72p^ zjUC6$*QPkXtKjdQt}w|U%LP{vH&EhB-oi^2!pk#rbNg{aS{k6Y0~#Ik$gvu`rSZyb z;pui=`wm(%#{@)#po5UnJud6PjciMtz|gx+W=kS4Cvh*S`vSm?dzgY4K!SEH3Uesu zu*fAfqWZEpm>^D&fuFMUN|`F5o>NO%Rr8twU?iK;?=@Z7K9stj#+7kJ3ZP@mqsOy% zBo0I+P9U*1tQ1nP&fJYld}k+%jBZ!;s~Ie&%st$_az)>C-3&ENB`kopc&9x*DsUH-$ z!Y~lSURE#6<<7*)NQG^vxr-d%L@r!u-ZWf9KqYi6Ed^$O-R;YTz`&&lB) z@W6;V@SSDrmP$h%11&W11ePnQi>l>IXS&0N+$_}AMXpxIrWs0OO5c=b?26K@+FcWr zk|_-#4ym5i_?JsH!5u;81XLjffoxBx-g(q0$PfPICYDzD+sTiLOjYF5vL10md&&TZ z3Q@s#r3T&f71p?Dcy)1#OutbIa4TZ=YRS4Yg9zxiFUry;c z6JTn_v9~EPW`%+@mtVjv$VQ)rm(oa?;lhw~iOa&V07CTt_*ob%uTBl@4O|Xn4?qtw z4{Z=q5cK9G%bu3zEfu9 zF1dCl-h)AOU<@NwrP4QCM9POgZBg2!@{oi|ICq<2c3PN<&2e8<%E-~*E`)$9Lbw}1 zs(HnvMtftv`lRuR>dcEX#BrEJ3JdVA z5?kBXWp-ZGzOH7TMa64ab-Fg*GU(}TGbHuJ?9*XqAo&L24DUhM_-jDK6Nyf}84U@A zWq&=bdl__78AVI+ZlHV=Z8r0VLn5mzS{%qd+MJYaeA0V)GOEm* zqC$GE+~+K9lcsIK8hbmIS8y(AC@`M^S~3i!f!nd+@c9O|JAW1WOy4@AicR~_|4vZR}ta*2{-vx>gz6mQ3i?)xks3;JXA-`SZgq>G`Qj;*(3 zIeY)p97t-W$?I>5L3le$q0U|^cV$c9gtEOjX>CSN-3n!8saW0Q$j2#B9#-2Xvt|%G zd1WOt9a>E%-Slv=lxn+)OZ#RHf{UGdE-~~I;qV*6==wa%6A=3rg*wR-Bj&}AIBA{p zk9dkF2!b4v65_PeMJV>pHTC~$Xq@H~wN#R4qkVS0(!j<&FsK5m*v_IY(JX@SqZos5 zt4z672*q^d@k|*Z?5y-S-yu#nP--x$X$}VB_RB3$-?tSLmLSgK;T`l><{ODN9t)78 z`+58O5}`9HM-a6OBCsq%gvlw}Y7sE7vE&@0>18`oOS{46qzPq1jxiFd+-gt!(?f^GY5%yj7Pz%)dP=2gr1}sG2SQcaObANCHzNwfiJ$E)IKF89 z*~T&ld3u}H(u@SE2^lptr+eYD{(mO7T6=b`q#ZWJO{**-F;u8Sb%@Fh zhTW_lH>Y9G+Byr7e4@X`gTXc3jrc0#{%2iR0xyH$)Xb8lQHmt-C~oF0D1m6-(qA!- z^>FKLF>8(~8J+5yZ^_C(g;!bpdLRGhr_3Q_7;92p2Lcm4KuS3;40|gl=TVWIeW%!! zRWvumhC>-f2}Myw5Ovpk2I$mii0dAPLEdd;X}D zZ>o_e>#V}Cy%-?PAHgay4do=~i@8$^TQlKV)oY$jQ^~7a$V)XlO;RaZSsloeRo!94 zP9b+ry{n->VK#($TO8UYf-vMGgh=KT z@6rl&%3E$~dLllhbXWOuMzdSeB=c3iLZhffD=!ckH=kXHlF~E}QEV^FWoq|Wqav`& z!!nIak{42oG#e$*AjXjnC7B7`&`9I{NKC8O&78UXHE^H{!SXo>f(Xzr)#am4u2Ndv zF8RrXQXQwez|ux8^*S?_v&B+bh1U~oMCe8EiVgtTAORdqCv;cra7-9a-V#&&2q7hs zt#P$WcaT%oR?=nU_Zn4=0~9#=i$8oAGCW@_DU-<#D;D*SN|x(T7zb*Zo1OUupkat~ zha7~lWGu&qgyX-e|84kVEshl6RyP+-#qqKgXIP6OC~6MDoSaPJVzgno2O0^}+({rQ zF7(LU=627M$@Q$OF(SlI1SvukF9Fi)B4k9!o!TC)u@!60-CpXLL?^fMidi~d?ZzIC zOir0Cv^x%G;Y=djB2Z?ZZNeU7UzVTp%iPr73P(6!k)wRRO#RFh(rzrGiYua1*Da<_ zw@HJ2QbrlB#Ymf2Ws@O4I6ZMaIyD`}C9bz51yTZV7_2tftArKjZe_W(o<4!W5QV_1 z9KvwBBuJ#xTh16O;?lQ0pFx)NpB$&Vp&K7k0`1CG9CZ=5O;DDKD7RU)jzci^ zWclw)hGu-Zjf;HY5knkv6a><8+_+jT#?Y-PU8{{DdnzQPzuIjY#{;aRRxQQZfHV{d54sM!>O}?b z+P(4yjXa<9p*xo#nAxJx;W-}bbgbO0`qds%(>0IsfhTja@`)Br3YUoZ)2n}7qj7Y*)Z4W9uA5Oh z+TXzJBZ_TWcCU_TNPueskG=qvI06cC9yKmZuhg&;yjc4XK;4SnuGR!0agLN~T%gQEF`)`4%v%#? z3s$zxhPN;bdo$(lomoD!elClF7M>EQG0W2dtnkyS9#-hl-o9>3nM(uF^AbtHWr60=Q9-&%Ht%QjOFA90IqrRs2JWr7(LXNWBQ7f>Nt^hwkz`sZL2uMus5#pX+!Zt;v@6Tqsy|t6; zYZ&q+LSbcZ57p;e*eryRncpBujQlg3&zSC#(?VfYR5$X-TRXRT;pERV=w`(dUccm= z*^3Jf=#d)l#iGDDO~sJNMVAFr9#aI<_*ofoZ!*r=DG26kc(oI=A=ND4=_dT~UIsLz zuEwZUk}7<6ta|(-^zlhKk}8;vWqqf% zdg)~>GF?qsGrUMkRX-W-NpOSnry8+okqi0SNaIz1xV<}&CMM?X+xoM_mW#2rgAXr3^JE zeaM}}OKg<42K|hT@8|`z*c93Z*@~AS+?vW=T@L{i6)N|(BBcna6+2CV6n_(Q6)n^d zB!hXGF)LQF6**#bsu6Ju+)OJA9mHxw2{>LP&G$v^h%5=$$?RDU23XN`o^Q_@b&gVO zeo|IxBcMFN`y?c&XbH%LbiRZ~=mxiT?0*SR%OYy2?{;5y7IclypqATOEp82N+IVW# z(cr`tGeu&4G}P5RlYnXD?y&IWG@VjbiXOqKQ~6kk~DXo~>|ZaiIWD#E=1jd zD4RXYLtlgPLUNRvyWuOO#p%VxtFA`r)=HR7Az(!Co$Bz=u6u?nvJt8fn$6AZ1U*wz znWL#deD$vk=8~!?+Vt81$jE$-axH5Fn@C~bhANQn0U3P(;9UjJS$@WWv4gia(-~@ESwu*nHtpwU z;6S?C>68LW0frzjs9)C5>Xb&7`I?Cust>-^^F#(}XXn=ds}G=xpHdfXicH>oV7)|E z(+_=N1Tax+L@YI08<&K}1|*G#kXTm9+#Wi}U|3<*Uv(@gOn@ z-couPbwe1jy&NM+o=a-Lx*RJ}UWw|%V4#cI2vE}vBA#9u3LAA1eVK31_Z`^*@+oa> zNF|>l&I)!?>fwY?lt__pH`t!LGrJWYVZT?brl~?xUO2mbhOP#y>7;BKP;CDW?oIBt zC-?05or$GsoSJq@P|0PP!dhn(kt3a1Yukw71?=&Mn{=Xrhgqv+R5M=ujB8(G;j&i7 zp{dt16O7~|tGeFbQ}cS1EPX*9F0mS&Z+mG-ejd||EaDFNgq_b8QB& zbk)6Lh^C~RxIS{c`b~Vx*XV$Pc88i7BanGQ7?J^FrVC4oF{ev%>w~V?ceaUz6iDYY z=8sS?l88&JQd*laf!qODAZX*Hh_e(I+9j&uXPfH<5Z54A6PLfkWJ=4P0No(!vR0^X z^>n!iAh$A&>UaE`G<7$r#6fGQOOkmwwny5Ru~rqKtTs}Wkfxon;4Fi#K4j=mi#cS( zY9lasNeRviJF36a<&UwtuYx1=Imd8Y7u^n#@V7isOX$0vR~U?v!iZW-c}8&*)cHBu z@+{+5r>BVSmeU$zR2zws?F?(kS&cEPU&&eTUVnW~*Pb#4<&pwyjiJ^uNGoSbW=azn znUSSnjuXYrZ%+GTYI6;#dSn+T)t-Hu@=8uhy6S)uM!OtvcdCAcBNI8=b(MvZYb{rG7rSD!hOxB6{v1xDd z6{N(MlJoZbe1;4gL%&qLY>{RA* z0E>}Vd_`7Mf^NiTXr?PKS;=w8e63+@)_To!3>t>uNEcPKn1_eRM|eAB8x|9t4>1B?{RoYF2%toJES{VH6>W z#4cNf;q5tbE;7|XN0L;&h|vpyGVm*i1U4r2yQ#gDhgVT(?Qn%dvB^@P#t|z9L8e28 zdA|F5qMJ?E81^U`BFG{{NierM5`VmPLv31QGrcM{E?WzpHpU^ATtALu3FV8g^JU3Y zBA=mXS+!TJ$5B8aj&ohYAjasQJkxCoTy7vs1~`r^mt=X8FGGCHT&c6hlMS<)pnBpV zQeh`fBJtp{tdhm4CU(7;y)|b)t69V}w z5rYI@i3JmhbpNN7mN<+g$s|f))5mlf@6+*)LX%0PZQ(`JR9+3vNRyRGuzZO(>Lqu- zX_sRl&{Lt14_9F!Jj@d~SeWB9T8Y7wjTwJB_N}X(^D*Vvr5KwdiBCW|P_n&&j0`;f z=6`G~%b5fFQSn)AD%y&fd7Yc9gmG9M`SEPt^bKNfnvddCf+$MT#KfWIgtPkVEew%8 za^_eL@(G)Y!_p?I5{Ij)KSk?}x;drU$#jzw1mA4o%F2?pDg>E!<;76c)aZ(J4+YuxfCmx^{TMV6>HKXPa7!JunvJCm-#P$jwaWs^z73xC71xTyN3 zso+$yN1I#qu^s_-+2As&ngPM!E>^XocWX(%&2vD{)6oXySMlpLV22i_sAZ30 zL{TFR2V4?*H5;6sbQva^v_lKwf-b_aSP#QgM!sDH-+Js20(^FyW+=ix!Wb(b$AYh( zRhVP}u+#FXG15e_9wKbQ8UszR5@;h`di2FID68=tRt^*}xEuvwWeZ`D5+$Iwey0!{ z+tc*8RER}Oe1u;_ky1dAOEn#Mt2;?YqJ5{PXA|eKHvN7f8V@%=f#-eg=dBfc$t+&W zxoRy6W3YoLN!0UL+oCDTcfqGhq!NA$vTDyEMUb$nxLAIuJ|m$QVul(xD2WOW>ZH>l zQEISZ{TS*SaZ78ZifRsmh#QIE+_c(}QH9w;H%qo{W>NxL#tiZV@!)cQQ1jF$xt7R; zuGd;b@?IRvPe{4~4~ZmT+!w#SBub?WDqf2O{l)sxdE{3aA|3Y2;`1r&MBxlv@3#2-1j5hHV4a0&D|0gv^C9a}ndt zTzDfIEn~JYVd>uc1(y>wHzJl3P_qPWpCS}5V{1DHG?bW8MR-*Dxy=p0PY0-U%jzJR zv+R4dbaqXrq7fqs^dBL)Jspy~88};z?E8KlvXq+8li++8hl|&w zfB)#5NuXuU+ zGuJe;*D)0nCa>l7*G85)Oc{ZOJ^;MRCTg=F$ zL|Q~ZgSDj**jVi~t*QDEom$F;;-K7chlp!fkg&tDB?J-mW0zV7dL*t)FE#p?TM75o zPtt^M9UVOF^zJEbUFjde^>R3FgVT{j@14_}1~Em&h|<*F@{@GTQb%oTZ>_ z3Z^Lcze_wr9$VLfqE1n!C3VA6Mwtiw$s>@qReXc{T$U#`&uVl8)|w^>zpd9EOzZXQ zq;&sr{Y?_qwAEj$6nzSjTyk6If1>s&58LMU1Ew%WZD3Umpt%=v0Fu1ERTtyMkhr#9 zUi-c4l!uw@EKW9}V`ey!5-S1r>nOcW<;A!~1q`kbq9EE+9d{l4TSCo(Bj>`_lOt#k z5NM6@D%D(87M|xUq$@{K@2hVcrlPnJf8V_0!@r_pLX#p8+#}$X>v8Okqir(m2HSEv#fqr@= zxKaw(bPJy?)3uh(=Hm$56k%ErfMJ6KAK9>;D7%~T`z<=724zDUC@T8$O2y5wPnZT# z{H{#H7orb)MR0nWPf2?%z@IygFBht|g1lVIYAfmYdu>9(GRjLSx4NrIh5GPHaRWT! z+IQ54c)=2c!%I&-O;aZY*q+0gQ=hQ+w%I?hQa9tNI;En z=m_wfo*`Kz?TXP&XeOkDC6?})SDy#V$#Lv#u~b?Nb=rc3JeUK@WkiT?w2QEW5>5wh zJe8jMib$el)wv7Um#?DABleslh-DI|YRWzAP7pIgI4l8>cQt&gH0-C2xI@lt9D*eh z^nFRu5pvpO&n%NrP$drDolOnsqJ&Oo-0mp_68#0<&TaKoK|=lwa}1l%jKG;T$2cm1 z1Q4f-J%ssEc~T}VQ#B-Y8Xw2VqKr8^bMEUi;nyp;8m@@A6M|7lYidvgmPYiV>7-T6 z$!*h<7I4oX5aH20l=oljqCx;MTyOo8&kr@S1ZVG0gL;b5+Vi`*(DXACt7(iOu+53tj z*iK#36;O}Xk(h*_0p@pxDr3bj>kWj=!T0wQMG zyEAaW#vbY|N2}M0vn&2k>y%XYrW4RDU=$EE;rR-9UB#d3Z4NWB8YKeMMisr$!Ir}sX; z0fbTxHx^2Glp)jHa-|7BTz1l)h^r~bgo)Pc^TPTyUMW*2L8lNWXC;wv7t<0X0`g^? zNe_$k&{@kXC-y_-)HDw*?j!}3cw&kobdmOTFWsRxcDv49jM=cIk+VA|G`q6sFR!5X z|2C9-Mor3hswF+}F-Oe&3u#;yfo&`4KTS?9AM;`4vX1zxqnY^eR0*9)@)e}{iMX4p z=)MAjpo6TlvMm$ZWhhe5MOBJj574|8r%1tOm2u@c?>TMRlORq90PGM3fLo8$>L4mE zFY=IPh|*RuV3o(h+@g7e6j)#%_Ng%E1Owp~$3(9Kf*!XBp9aViqA>4xtuE)}xg?op zTl})M;p1S;5O)PyBYVsJY4dz33w~+yuF)Lx(jXY3_>Ot$|9H_tBM-FE2ZE-n`kY29 zsJqYy7#czNDbVZI^If=>=frF!qN=j1L;NOzwi)EPXD)M(T8s7>@zi=Uuo@{eNpN+$@UJjVL8t!lxp0jvV~{)N6vPU7UTFk z=A4Z$iq$=@oj0%0=A~+0Xr2dv*LsbiptpkM`&{7+PJdF$R)#?dohc&sdfbDt^if|@ zuMB~^;PuA6sei9MJGeYZgaiib`NW#4V}bLDtz-M`E++3Lvy z++M~=G)Maq%KoR%U49I~-sb6+Pz7S63q7uy&k!NYX{+%!(uOQ#>yS}(E;A%~-xK$n z`W0W^^8S0nx(7$IbTYPl2KV`mg*fx-@6z=WrrO`%S6f<=+vg9|&s!ezcOS_a?cryf zsMA>~+R7J6xxJ%~g=)Ts?B`fi zE=M6sat@9E9sf33N<@~Zu&I6IF0jNrmS0-XhSD)NbIi!Vx7DIZod#R2AK#lQf@{Jv zF=C3l@`b=ePW4^mK%CqHxB`iyS7T*;710n^eK(8_%Y{&6Q}AQHKZB;MU&*Ads0|0Hi`-Nj%y1&{40Q77(k5tN5htkele#2R26VMi)+#z=$- zq;!p3Jac8{+60St0VLlI`m^~m@8UwioP_WHyXuns%F_(Aw4jmc7o#Z>xhSvse9IAA zu@9^6i+MY$)?nibV*4TlsObu&zuR4UGGFNLDz~!^;}^|skW`@rMoae0bV~$KFe@Lt zEf{fShlaa>1X!}GcD`O&d9DUYpKxw_35 z)Z~Fq;4*1j!W0vkkNvQ&oMX_89+RG(0~y-tN9GWMeiWl5N7j=lj4)vht!|=(eciYg zl+vUi(+=iN0rQw>LWKH+rJH;=oQb6q%nr397E7m`zXQmqgyk8FF4ImYr&Q#yv~vE2 zeREYPTca#3Qxv1&B$owca0blz*SEkaga^;`{DP`$6Nx*r)~cUVcwL>AU^q%*IE0-j)d>bqc%bmoKG=gGG2nv z%CWN-Sj$6c9t$>&9K7?dnII4+jo^x6($YDOt(aDZQpmwQfn&1dy!h55ghbAZ_fEq0 zDHZB;#ZGdzcjLGckvNrqc!V2d%t>;CXBpjK%;&IE+?Xht42jdYyehK!Rsu9K;Wlg( zEqg!pkQunA{Y+HmuT<=bvQ0ocZJ_}Wmo(p0IsqVg#qTAkHD~=TS@9F=6W!&~61zWf zF$J`aysM;$ifJ{NuqWUOYyjKp{7|R8RR>JFUz@l~?rDh-V@UJX<~b#{L;L7LC(aSt z3X(l8bgjX$PS5h?ViWOZ&b3UB4M=i8z zY^2%i*JPTb5uYta;+8>{)spya2+42wDPvid!p0nszzRrEf-Y7qyvo#j&QYbi!SR;} zy0yeg08XUFHP=%G;w(vYmwQ;^uS`&bF7~255+xW&LFrX3lFeF_n(^DRa;Jhm5pB zIbZTMP*RC4Jc>9#%2IDF+h>G%yag#nbiY2IcK6b)tsRGf?*wd2K(YtGn}qWf-QQ(F z;R>+`KKnSD#IQRqf$PXkMb%)?24HF;!iM=IsV@A2pegMt5tA>@(k3)3Udgh9{xqBu zSbjwFT6Z?-&*qbDe=W7*Hod_aBo6*gwRJ!$lb?#PkTwuUN-w(Nf`P;G=zR(Z%#*1-8L*NBe1sf^Okb*q*)$i(%DQ5BuP2_`H1`ZS;|>5)jR0ZB ze7XrUih$J>t63(_n7od=+$t_ghOn1UhFcetSRyDk!ehyRT@K-E%##$)up`9qjF_vN z=)_y*>(r5~581>#<9crhY}`oZxOm4UC}YE8us4?c)q0s_ssa6W%2WK2yebx-RU(rl z+OqTd$Q&9-BQsmZS!8%(wN0f0 z^~C-VYH`O=y`r+x{L=Sq_<%sCo=K*MTene}n)%O*w0U9IluZqe(&~g_;!P8|m#Omo z5@^818u!hF<o7gTW zfEC(-Zfe$2woBB|*8J7ULo;71Mycpj%QRPI`@oPN_w$!~kKfm-D_L~1_=+`RNI*YZ zbvzUAWa_@AnQpxVg>K|wLEO?72gg1ON_}`Ga{OG1F|npNbp%VOj<&0nuCK+>hqIj-Zi?LF8tSD2JekJ*&1{4xU6zde_2?!90EqlA`^TRSdJd z2=iYC?D?VPoqj(ASPwuZi~;70rs+AIwyNJiUW@V*FVi;jt5uTsDwmWpf_cqbn&0<{ zg9JB&6hVy?uMAKY%Hd#xh~eT(EfQPn?N8OWU4J52m=z$3Ji`?dtMO3sy1R~vN4OKN zqfq7xz>j>KPu0ITb1#YL@`B!+wE7mwZ9Xa2f!03-Yeatv07nG@7n(>&P2>1LS7sS} z5~76t2o}#Ub+>(Vtt@4%Xv1n2bEjpb9^x3fB+E4BKANxV%3{{c z$ypaOV=}heuI2cvejVpJ{b(7mfuwt$ab(qU5X5;9>|$mVYm%iSxct{V9@vTV-|TYL zm=Q8o|BhNRP09S5B2~q-Fd}Yu$IL-aE1y=yYT6Mi8MqvAX%iC0)BjKE@^(iYEnyoH zSQ2tYE$XV%t)uOTsU4$q)T;%JO)B9nUQ3xN$#Gs>EHRl*#N<@O++fr)zNqclF~6E7 zv!Y3LOW!Mk5RVfP6>ma>`V`t4zy?h)Ke7DzB=)&6`ddXA2X%?EF`=GQy>P zgG{q2mo<&mVNm_tkF_Yy(MpR09wELa83YmmOizxLx8FoY^u+-Jawotoal1sfz9d-l| zVvPX832AH*vRwF_vO;7`anLzp&L`s7Ps({AB;p!>k9qbgh7f>1s@m3uFzE6ank-HU z4ROusvo@y;K?xbLBZNtoew~Lo*Jw^?ii;SJoTDytOTjuLWF_)_)1st8&Oy;6jo}by z33)qporP&1&eQDYf5W)e^qP?pLgX{(%UI4bq}5nR5mh6i^Q(7L*y}uszWcCFVzSUY zjQU-W=jvZ5iS0T*<%#r48iuW+a!IxdG@^qWi+_D_1ddkFn6eJ!o^pb4UJ_@OoYUBh zLycOa(`V!*`B`81Wipq}pDWP6ANPssQ!bS$)k#=d87y)g53ESgtY3tIl=7Z6qE_j- z_y;4fM45_IJ|)L;E8MG*%Oz%PVaPg~CFE?W_~~=iK2A>jH_LC4;KxLm4;t&^X!O1= ze3wbt(A?d6HW8I1Q<_IA=+Mah7!vH$p4s4eGC_AT}L z_EqJV#0kAAk?I?iq;w{nbCI@)4#(v!nUbj+%dGcIV%@Z5$!c^e5G?dSY0y z(mJx&qR$ovap4lXLDV>yC&kHhJ$Fhtx#8+$2jIj*50mRC!R0*a_7 z1VdAqNGAm%^6O1)GX-_NAimNm8@CTJK@ebLTQ}P-q0J3?-E=DfkVPnxj)X2hTagoWMHDRu5R-s@364o; zS25sJ5V0a15=QiMAuKD`VDQ`%-Jg?|4{}F>K&lp2epggUXyir2W+oCkIm;?ds#X=S zgD88VDj@=hEs3Jhx!SP;`Rx|f(b(!;q8pCKM5Bflh|>G3cO|)wYV#88-FYeHDq;(@ z%ZS8d3=^?hQt;GNKqI-CdmD=F!3vum>uB&4B3R95rj07RPddvdayWH$^% zwP#dP0-@)U=^P^T(8RA|+%hC5%-PL@@QvtzsW8VrA)vwSt+HS2S@_spKmC z9!os|3Q@*I)Xs|ZiC>PnWS^JK;-A-qE@s>n@R8gXFMGJ3?8Mx}d_*ZTUBqA!6K-i4 zIvrYE!3-*c0V5NdcEu+qM=(No&N7w(fMx}8#9c7FE`~9z^6i`4^9CoH(4LgDI8mw~ z9}1W#x!GbcPS6rU4LoDa9N`gdTs_EQPbM1{L^3V_Asw8_bO=Z3V$C{!SydDgQCi+` zskIz zh?})Fq{8-iNLAffP8bRB+9%7S(Usv1=yr;l|A1fo zWLpm*Uh4Izy3cs9k)96C$9uPwnp0~q4owXMiP^a+S}5RR+hJ5=mT);AjpeYvP{5

Xb;HVWy_fc5eoiHD9483bAu(FpL|H2@OmWMr7pDX=F?8 zNi`hA2qic}GTXq2IZbJkSn?+rMt&tB0d8vATR`ck>G5e^Hq`bO;X0up=*+inLEu#A zf;V+pRcSq(vI1ePIzjU#1q}tUe14;o+Ze`=9GDvFt`qZbD7l;<}m~a zUjpQTh`dsMfG`#esUnC=d9mL`mdJTqu#gcEfA;>SM{qu-kn4Ti(=itL5G)AakZzQG z_DQa4ncPNJ(TkNHWF`q@*8hVl-jVvWu@shCC^3<0k^E|J)m2Qdc#>?CB+d(@)Pez` z#`I&lRyBTxz>8rm`H5B8TbUY}$W~(+Mi8#;m`bV}Oq@48+f-a@Y+ft93n*i`Uo^FH zSY`sqIvBbvpP4^Ch95<#iZgk--+<&nf+3A|knLRhk^x6SKJ+!j!rIgpqy zudOFCbWL#@YBeW9o;Q|7S=a1{P9obMlG@x9ghCe3wR0jz|6KV8C;WDRylK) z@9qV}7B8!1G1$38)S&rP+Xz8V z7@1fKS>dE%G81gdZB39zu(rUB@3lc5(%P=Z0uo0&d`rCx$a}+9t>~Q(B=z)304(autS1jq}7}ff-PpI-3pL{~VQxdG&tB<>#=8h(x!A$*24Q z7)+M_tGQcE4dyYv0(kQJFR9T+MU--R9^5J@8I&gwDyho)sMJOM-O2+Rq#RLxHmQoX zDN{BDWh|r`nP9+?aD*|HHZciF4P2MAKPA?0X>zXyK_)6v4qKqCYRuHpW&=8bBUZ(9^^ImijOlV2@^j{hsc--(?9HtckRaO`nSmBnL)jY>N=_%1M9eEnw-Q$2U<{5( z#{ogM5jCtrQ%&8bnM5b_fq-oM&3QY7N}IkEi?bnNfOSjFTrlmHj$aY-quhl*lxZJQ z(>oPCUSQExJAgLj#*v*LqaY<3Xxo5pwH)i@G>7k>ukxD8U3a;gY&f734GIc-JK};z0E4dwl|qX`ZeGih-5|&LRjL}U z?IjlE9*%nGkPvQh)`{buVQ1i;pq-7rQC>eV^2NdZ!1#%Iqn}Q zVbPb&#cKj!B^BP4I<8sLEKFiBZa@?8nb_RAXC8@mq1(jSyAe$bL?Wi`nPEdHURG}q zHPZ5JyJlLsZG6QLWjnFFSVllG3C2bQ>+~N;5`JU+@!he#NsplA|bA;jzADe_N0($ z@^T_?oh4YU!Xgz}6XU2D>=4T*6;_u~BX1>9dJj}DjN%gx)Uw-5@dwdi$z!c}^{HIf zxfjR!HLf7D7fMT)wBc83Rb*1dXA&od1;D^q%o3RrDH-+AEAxbBpj9~TK{YE_o`<3F zUtiRv_r9IV(duQadwONqM7{6P+Hh;WvXhCFH6kSm8k$v&yk!uKV77+uo2SKCNvHJl67kh|l88kVfhNv&byYHb zH2h1+9}<#qb9P3^NcyMyb3dPmE$WlsMQ7f9&4djbU$ytECMR!ODL!l0HH*Y!gvzE% z<+UaJWM(*xx&9f+#!bpKA?8tF7|QDf6PC>ODpJ*0sT=bt9^^Q4{H@k&V4aq7_VZ(R zEHNlWp9kfY(qFgQZ7Z%xD(#ciF|HOeP7{hMlT%|ruc)FSGPJMu#MNk%ctK7yrlep%$MDKHfioLgF##~%nd_XU*IpX{V+ z?ZM?6iv-c%#RCuEB88*GYoSQC<_(r|}L?lnKD*?l^xMy2slSeBgqi)?DW z&|@&7sJl~>cQg=>F}3;s4I{HF2%900rlbOUUl z_znOffE`AWfDg%lc@s^*co!Jvx^V!+8;6o9;eo4#(ANXC_WEI}oVXXv&Ro~uWDUsA z>b;zq*~B9U1n`1G7la9d=!4`$3r6$brfKDEIeGfHM55hEZ8C33>QL39-QSJ1ec4{S zRD~j^_4cS6may-=HttD{CPKojHiMRnHVTn*F*%{=h3>2fL?qZ#Bpd2PcYgM^vPK}} zaV!>EluHO?v=lGW;I|SiH{({j9iGT&lSO;cI=ALmq=!h%y!iAeO?oqAK}sz!y4|Q% zZ`pwdqzua&o#Q~BQHgO_w*M)Bj;nKhE3il|UA|#_B|B{(3)dkdGjnj_*2_UG@8xYL zy{%>2jTF7uxbU$L!iDu%rgh(^uv;x^ZxG2!JR#dA;o&i11}FVl5i%m7Fc}2hO^gjc z8ISxzIOic)MNeu**0Fk}t%*t+3$@@v)9c)+hv@yQMMqMhzK*W-Mosy%cLDkL)*F23<3vzEb(n+mTEH>jp5WI)lv z9dsoT+^YN`D~ha0@vj=k%~? z5+cBSj=)aXu@%@}DTe!GcY9~jNkbz$p&|H+tod1uc{PNK41>KNM>0$oTE#H518YSwUGXc%^CSf~%~4!!9KevIKLXdW z?X_*mc0^Y^!4YjKw#!x~w^3gnzCB$|xrBybV9D)p0OJK104>&j0k{FjjC27X3Xm9# zYvvXCuLN`>@OZ7L5E6+KZjgokQKBK^XU5v{V5s`M2feYj1S`~`TJ-V^Vh`Hu6bWKZ zDjM3~aMZiLrVaAlO*+RIq-PZARa6!FiL(8o(3O~s9llBFl8T%W))U;z77d- zjVnn61iw@PrWv(`@WYa*cG?n7PA<7uK}d`kI4h(&o`sfCW~E+3uGl^pqg}BUfP0I! zho?-~ze1H*SHe6u;VuUuJlyoahq`ILS3DNAH0!MVTT`Be8Ps1 zT*dSSsS+r^=x5a;|QJProx)06sOp9qamHwwqtW61KEM#=kXDc*l)bv}4+ZH8m zc!JnQj7!&wRTg&0zglBt*DS#Gdz_}A`gvo!&3Zy<+D~BTB+#=_=<_|kn&IRA=8|r= ziuTO{fi}7qqviOPFlbEsZLtt*>MO~Tyde>_kWcayff+GKA^0IkHom2AOASW8TA?sO z5!IY!3+74O{6Hzik&_)xQ?ydb1#8RjHFO5m#aJY&-q~MUPEe52Qvzgij^A?E&2^M+ zTy3imQS7ER&EpN9#M!x*wSLDL$ZqcqRxIo9UDUDS!=J;-=J7!|$TXH;$TXj;l0jmf zJ9*48UrsAkf@tc9OJz~cj>T~^dJx0+m#rj?K@}k!cMypKZoeJGggZ7yP-}=XOL%Dn zX0j@LRR?4(Tj;nmS*SQL(daJhTH)Y;UPdvDtWw#SilxMaDw^br965K&fw(6&OnST) z18>kx3<4%+U$C|GgzV3wuw4qFP*s!vm(v}_Tf|14gsRUMlRPT}>-zjeV5;Z@5ZIA= zmsm%V$FZQ&Pqs$+3qIuTEv7QtgPfG`ehni?)apf1H#<>D1*072D%V6zb&(prDmd0c zfT#*)0;xLWFqG>Abi!3;aG#36Q$ev_Zl%6JU=kXo-^$tnhD+fh3_}|c$;h6h|BI>qMwKSMPZN{I!w%N=L! z>n_S*VNBPV>^ZmkZvimpB)6`ae*V5O?|;yXeiEb9J4ik}GkJ+-O*l%)@Q@X%1luqw z%?jg0&A3y*S?cIFUTvpk^`87O1Irnc)~rUl&Va zwLV5VFPXPZMZa0TPLZ%LX^Thx;MV9Ux`u6}Co8QG0xz_jT&Ak+N@HN8u<|z&S}Y|R zyoUu_2j_Vc6|r)%0*-^V#ZP;1ovGYa2(8N!dambD}n+VBL> z)Qd-WOD*M*VV1|EJ3%g1n`lMBp=I1aJyk_uqIx{NjFs58EZ-zLJ7`~^*L9HOhuJKZ ziXfB7^;qSIMx*BcOTsLN?|{HXBs=4N;>T;2IL!5^jCiN>+c~8ad#N*(PJn=ghmT)B z^M#&g8O*GWXuATBZAgcE&G}2ud&23dm)Vwe+3@<#8o`1ld~cYL80edlUe7KJ*55#8 zD=6m_Dakbc0fxNTK(c?z_m;(NLxIz%J68zA-%-#;1lGM=T+t}B3Op7_G)P@FZ=!+c zCBt-13IR+uC*0Nx2t*8$QGsEPrteSnQqZd&kxof83@ep#YFxeuf*52BNydjQxoG;9 z$P0XvUtci7>`E#-4+LmM3IWg@3T9mw%lbIg=o3OE5ThYv9|+>Q$AYPJ55iz<8fD9r zylAa4Hfa$nwXP7L7~1jZ0-nN~Pvef<&EwDTtXxF8#05el(~A;-svs4_&I#_PWL;2v zz2WIJsNnWuRtbhe_$Car1-|)g^uzKs%hWvV0TH97u%qlY-tq-dvq(=J3pQhRbviSJ z8AVoFU)0cO*gg^}44Bt+UuaKJED zt@b59hAOKO7tJ>I`Eshsy2jHXr9Xc!AKL1%(#CfQuY!lX`$)Bu+sr$Y#@#16?o=R> z=@)hhI7v_aoVNYOlRhsWR$rQv9Xmmj+(g<)Q$tfsFa|lnJN)#9(}qot{+4B0?yKdB-OCZ71tH#=Bus?}O*Z6Nq?J2fTwM*IB0#{qEICHcP$-zOmg7)Q8%C zKD1wFN-ETiMNpci+1gf`NE++z7t@&*Av#=b67Hqk|HDU;=?s*s>C0TnrD{x_ z=n(YyP#j`gWKtL8gsOfgf*oNDCG-Inm?zj9l;x_z`BLnkQev-JSL_@2BT1JbCS+~& z7#U?d+AbAD`(mdbGww52av8`cuNDU~+=MEnIWH1wcWDxvDBlsNvKw2qNc1Wl4d*3F zO&KV}kep4DvuZ`zIe=oe)=J(PrU}4M{}jjpblSuutL1pmT?=DgGYztjW9M69VJsIV zbLjOG$_j@v+L29%O+8g#WT|@+Sp_4%Vj+P0UqtFrr*p{UQYoOSCW>sMH(>?*>`p{k za}1Gc`ktPZ4XwpF6kZwE<%c>Cp*qKVnFd^Ow_NXGf0h*GSK=WfK95M0sOgQl)E2iz zl3!kEj=b`PSf}2s*Nt!NHBRl(3t@4@y5h{rria>l@XXgs6CJnK5!ly)RYwisRLOJB z)O4dF-;H81Sh_=CUz4;_t-Mn%hkM;3vt<57LJ|t@VdTb-dlhiH2~Jqj=CywHc=|$a z$%cZQ*3Kr;r{&c7i2(-(NObP|$Ho z&c_J0aV<2!Qsv!ruS{sUiUtQp@sP=pC|L<#>+u0+s+ZHJ-DPy(GP9cK8URH=y1%qm zo4fQmWX_qM_q3O@xa3Jo;Ot1=CDU>eJkQs5zk}`)PDz-^+^_zGuW@@)eqab^v^*5@ zeS)j?(_?92z3h8#ojIzZe6kx>N^RJBQB16&!&cDXm;3@Z^XBz3zSTotCG`v?Vo~H? zJCf|&;UZS8{7cwVJrnnTk%Mg#TS-OQXz4Cder&gTXL^OKnTsZDB=XYmKN$Lb3zR<_ z{J>{JbFwnpA}*Hp!OP)IskY{!#pCovk96zx$X zLF+cLn4`XTqU3gl`RLk@y?rMPk5u0)`&}UOsoNB8og@Kn$nR|}M19Y6KhbRT z>Tasx4$O}Dw;_w3f;OvPTtw55dZ^Aag;z;ULZDO)g%E#4&up+(`RZKb6xZ`=R;6HY zA=VIVgtF?t@(SF;#a5vZ3XWNVuM3Y=2#OjDHd5aT1CC0iE#5Ame-NbCZz&kcSQHJ8 z3wxKTbgjxzlgr+Xbyr(S6(;y&eWfa$Q|pTS*;ME7hmzztVWL((8&X)uXDZPUzB`XZ z6NxtDb}X#N-7JCbQB6~8hytXH!lU;K)dQajcYd6?G` z{V*4Iz>WLpNU= zMMAftv%{5~u}Sxqxi$2*$yg~}x^p{c+9wZKlr#2r=wQ^USXD75jyTeBVhUY-7}l3q zHW4||Nj%6dm}HCOR22|SXjC~w#w#T?8Zgm73)cjKAF>ERrIkJWRWq<#7eYs6F2eBK z1qQ3W#%Bx#b$bOz9|V>tc)GGLHvNE4Auy2vhD z?MzUm)W@qk(9^CWapImj=l^VWmI9E zOJjw+g6mEtc(gc-zSR+P04*-CWe9YNYX-*l;bf9G-por2sP6PFoP6^pA(wMA7==p~ ziYC?2mbOq<(~)jU$&~NE3%3PF=+8t?NDBvvngs&-Tn= znz0dBb{(^}CfA5k$f{@M;81V;Q(HA31L0dqBM>WcBtsqyT@*}Sd=Ic4*ZYVeY3LCg z&l!isDmPvkB@}Pi5OJLG>p293_GAF{C{&87yZ3O zh-H5!@K)_ZpoHY`8yg#pyYNQ5uD9z0fjpI@$+RR}7nH@PP$d}&!Cb7E@fn2=-)bsF z$`K3LN&%2;B8VLc6TuL=F~5sgqzT%LCO?GOW)NJM7^Nq8Dj5DTg`uo45>kPGXOYDR zIcSz=>)3R0`ezSHU6l{n;E=48)Nzjo`(oi6hmkHR!y&vZmWsZL_qN}i zWs>?@e%E1Zw4RYfxSAbD6-fhlV_S1`7AS~UiG))!GV@75s}PexwqUaO7yAsi)emK% zXieVo77ARhISEu4&nWH)bUQiVv!BxQu_&*~-L+v-*ZDL^bc?jHlDNyM6Px+y+9Bt~ z5sFiwQ8;d1QdV9*7Y=Qkg&dA?#kpRc>4I)KPRDknXq#yd9HftO7BXikWe*2`F{c*= zAuwg?tnSz4jQXWuWyCdrWE2383Dd}6IlWJfg z_SSxPk?AYav1^{UYamUX^%6pf2bRL}Bm2>HGuEf6=6xE?gS^ie;t-7Q>4vBVps7k+NvwC8=gde&z33yK}}!5ppER{l8r|S11lY$q=?Arr;YS} zrEPuJZ!d37j|d7S@VAa!DcXyNge!K!QzpQacg@6X248PDxeVP0czc zBfA*thpb*=OAiHwv1n~yOWu|E=+$rOOlRagBbM(55il(*TTkokZYL_ivj9^g;VUoe z$i-Q#T`n&N0SK~flvQmDD2$QdhespW-ugIxebG9BM@%A&k|A{^giRyWSIv9^4bWxW zMZ5(Y%EpnvpOr`^rIB1jg>_lIJGFd^sY*B4f3)?`DvK3W1}bbxCp3Qyd7k7eKkSSC z`+QeYwj8MAL#&IH3Bk9Xu=gWbaFpzPNN6ObQx?vrT9>uuu!pgwSMNA;U~H-o7jBRC z&Ye+D7TJZaoD?_12dgi_DT$z@kJ2t=Hx#Qr7*viTZDP9jn0~seLj$d#n z2TkPPkwY9y$E~Zm@OY5xqj{;8ERz$;eTWMNZ9EZw@P~7u>}%xu7g&nMhd%`I=k82D z-vYwfOP?rIv;Jo>89eIs`7$~Q(j?x$pR|5AT=wkN?p}f3%rbn$5xzLc;<1NkYEg08 z!!7>24pK`Yzxm=XX($sZ&l{*~i`?G2eetRy8iM%sO?t zjogO#m&$mW!B%ip@Vm0o6WM$TePJy!p>*QK)LR944z9K`PA=Pm<7P!%n<0Xl|H+9sFH#njxpudmt_+b+VhV7Oa>yIrh9cN)yV^K=09Bp< zoTz3hn6!xT)+!{AB>!)aQSsv#g?RA8?mK5m94+Xo5K66b{+$9D()*=$L1K-pw%G;w zl8rJle8e#A{% zM8J12!_QzivzKoy=D4E?!9{_X{4Uyy3C*SR94zWdJ7}P>8DgqUOm$=pu_U}t-B<<- z7gMXe!RgB$TE=6pGsd8tI0I}p-oc?vy~i0gKQz01bjme5Nv>Yj5!a8lSqs9sn|O&HmcsrYQI=e|1a!v-s*g1aJK8Ms zo(HTb_C}OIrZHJO|D7DAQBZX5LzE_@6(>ZRE?L2mu%C4nF=&XR*(?KJMJ&6h?R>|> zC|^IhszSjZRhx*6lA^K+)2&mW z{4?u%?G&sm^of0Hi_n0jiu7)^AeNSAifJ?>KqgDE5a-f`Ptt7;e;4(jTn$2e7ixA) zA;G+0I!csk^FbkPEcFo`w65h*KfT^o3KHom)u@IWsGI^+6d0FNabp)WGF-HW4T?_w z>UMjHw!m(RZ4$3e5#cLuAL~LgP_nTD?UJ#m{SZzp-4u3KWmi3^IhmeM3THCal-xp{ zvO6x~m#uzIDrlGnUkN4X3TLP^XtzDyZqyi=G7Uz2+~v8ryeVvVZ9>zPNiEAcJq=7` zvxPj2b~lNx0Pn{C_*ob(p-%W$^(pdS@#^vS@7?Z1@5$yQO{!$IVynUh?QO#Oeg2C2 zGvrVas9>=*FOF?;QiCsGtegIu5>6nU$g-<+?)mFvniLuvBLw5T1ld zn#QZd$o&#;WE(`$I?pt{V{MK;u@&H)$)qeDXmen7f-&$t!Pq5$WQV{i0e9kLP0G@> zFWuruT|7%IPn2~vI&x(gy0xtnm8ciwx2mkfy5gby=P#H+81j@!EWB*jaKsNU0pOoD zCc58EBCo4s>fufLj#8{-eVnj{^5WYg`5`reK(PzRW-GobiHkC(uRvnRWKM9Lwd<`( zg#w>ARTJcVTztO)Oi5yp)zf3!T%CsYp<^ayN|z^ zrlu^d0o5HeH0?GuwRWjH6ra60YMeR^O2QbGh%^`5;w{^lgh%#&!H^$|2xC?$RY7m^ zX_crp;n|_`7_17|N{*#C|AqnSh^Pn)tWO3}R<4w+`_V=oD-ht3dxlBEf>KzvJ6_^G zr=%q=>lSU&hsf2|CB=GPDs1N52QM`_Ah-uE(~ru{qw;AGgNu^IeIXSLp@_sxVs-@s z(YRWG!(h}Dm#l(m7(8GQR4|3$3d@J`Ks6Z=4kf7KAsEQ$B~uyT?+VlScmbfK8WK%$ z*k+1qjIa@c^MBQHHuJ~9i4%xxjpKr_(WnDJId1EiWA@Zl5G~@yI3IW*v*0!sqMn2S zc>x(y5m1yP45rt4#KY53IS}CZXqt#w;4B!KT@&tiRUT3YpC`gG*(F3z2n_xg4a^-2 zP^A_`@(sjM)Dv7qve{%?1=3BrWI0100xpQ_XYw-vB59lAB>m@ez~549luoc& z)sCbMi*XD_MTlKFbF^xkv~^$Nbp_qvZ0W5++jM85T zyo`{bDSP*DfC)sWzQ>`cq9~@ddu7i?)q$O5z0-pT%ZXIG`4)yEoVdFgS!14npc9&!)dfU~x#pv% z0#JIQZm@YFd;b#ANCaT?dtI&Sj=ul)DcW1 zu(gy)E{V7tRBe^cXj*K98)niw-62)kyoCMY;hEGb2$)1o-+Kprb$h$dW>2EqTR6X( za&FyvX+T;~BE`#r^|bZs;t5ELH8dSTS>qqi((ZxR zHLQ0rG-K*0G8aFV7b`Vn0i;3dRFs$SeyD6VCfmiuLd6H6h0~C~JmCg*j6zdVv zt}$+mG*Sf1kaMG{Sk_+#E}}-in4h{Nk;d~Vp`qbnr;5M1YBq&Fs=r5-449fl>Qrdx zAE{DZClMyaTcvYh(&(A!Ohv^eC4}Zq<;=aKZIF#1TgVRN_MjAWk&EZ*0tiB7f$6i=kt1I|k&G;9+{R`=>rZJK~$r4KA^FI0jmJvr^JK{@dFDB20^ zgNd+2Y>RPZ{rIwTb=q=aFaDB^b|e7L2Hjdi!W z-VePekl&w_TE>)pD>a&l<2l(DQ)5ph7ixkq<9jBFG(q6&)>tc%)tJ=v+7QT%i2cZq1-*G85~wPP(t~NF+{v^pwL-%iLi!u?ut}w_ zYDBWV;nA#rZgv(HSjhI%A}qq9>FV~v`nN|$KK>=9v{S0kbMFpSZGcFcb%aH_sqWGX$V^G#Yot(*2E>^+5q7zhzjqdnNP66GX7KU)P)@?FcmR32%)d00kr#Lh;U;G4|6)Uo8WOst`a&+89%X zORolk37e@kNQQhaKG;8wa=`x#FP7UYv6+CU?-~F1_8Km_E4u2GWERIt3rnRj9jV@f zBS>CoA@zE9G{6ew6xHzoB5Iax0J$ir^x8Dr3;MG)lLJahxKlQ*_>@fLGXwGI<5@Sx zjAhqn+0!+cc1}LrM30}<9Pw3w%-qT5dn3#0ltvTF^iV0;Q&OwUio08MR!3VZorV0v zU?TBh=)9Jigp#DRn4SAEu0`iZOL@~NQZG`t)1<<(5YY7BI01GBAn$5P&F#Qt`l+~3 zP{xGCbh6l$cP?8QolR&=>n?oh)DuFH&{U-39uiJ+;DU*JK>B*Hll)QN@`U6O5cQTa zw%C$J825>&o*2~3hNjtQvi&8HX$A*%e5wt7WI528#J#FhO^vq5)6@pFQ443Dk ziBwK59UF=cRYI}Kru^G=A#iOg)K)ClhQSto40y}M3X9o$)R%V3a{1vVIv*5f7hM&W ztm64DpGZ4%6seq23sX~D`DBo?D3$%2(NGbAiSoX-S-|t@ zvXMq8Q$e;OmPV8431 z$UaM>El?2OP~?>&5kT3sl13n3%t#+kSCNSt+-jZSdoB^pP`))({ylNLq&%Ax!uqhc zM1DVu4W6Cs3wP!4O8g=t5U|0PmTj)@Ad|8VNMK$He@d34r zY94LtF^Z02i(yu8NFgvAoPmisf%E6(21E zaN1E`7IqN2o0-%P!+Ud{)5Ln53b^Hl781`T$&3pdTDe<2dS*-~XdzIY_XZZ@CF7y^M<;NcS)CE+k7X3wsy#^}uOax-JG_1F=??9xf7@bJAs+}?Mk|YjYLN!d zOCR{tX>x&Y{)XJLMJUK6U4FK2gyQY#DOl2!B4V@IKbDw3_t?uM3j0k2%H?`qZJAN& zInlEk8XcYJYdAtf$24SP^-Ez&&C$2ZFwf-*MXt(JKD(kM*4#umo zfRz)lHKf*F>it)@0`dx|WaFdCh)jkOphu_5IiS&r?LZ8JdH+Lohf=UTP{M#n19=!a z#1Ta*L?3__YHMypNse@K*`=a@_o`Y<(cVs8Urcxp1>=EG3s?kZ`~X`4e2&DV6O@py z^=*td_c%@sSRo~jF_-?qhdJ0B=>KVbVx%m9u^W)}?{Sxui8UnW1?ooozoKVCC?eT$ zcbeCID|EkvDfCzf5u$2S$m>JPd+6ycb2d>KG$!1Dm&J1T5KyH`#OiJu!VJER=kLM2 zC2eouU$<7bHH3#?E=?v1Fnmm$c4-EA0_BOdEUMA7oE7>eSTELr_=AF~`Z)~?} zwuyO_n6&L-Ng%HXvD;|?5CR+&4tG>!_xt5)8qWmmh#g7Ww5ho6?dj_qmQ1bj~P?qpdF;Xm~0Dyb1!ug$T1IvA>R^xQ`GrSTUfbO8nRNC#>B`F zL3#uN9MFx}7;*CwzZo=gfyf82=W#^DCM6_-)BVV#*wF=fxcf)Ujt0}ogy#QMb{%Oj ztvJrJ?)Z+#O=1ElCx}aH*H8s>0jwq?=C;g8Liq1yEA~8YN}1+F6`xyw8hDQoVIqUR zy{s}WmM(d8K1C6>j#%Ui0*`ABC}wGn8>k|LX?8Nn@`#3Dxm?q}Fygkyc?F;{+@dIF z2p6n;)OG~L*q~vH1zd`(mLsl82J3)}H3>M)p!CDqX2h7i4JU)aVs^;ct1o8P=(Tq* zjI%)+Jmvn=ghJT$BO0CxK_Xrm*c7nrj_W^3pAs^~9*WoJM4GIhCeqRwK|=Z%>>8W0 zZx*(xessjlNl=0gR9xud`=}8phoy4((sE4sI}9s5dTf;FJGh0s7(_7>Gwydzk*6>( zu&e?gD@h62Ex%S^K!^qP(cu!jH_+^=W^M)?&G6|f+jO;Yol041`+%6Cf{6@!$ezpB z0A2~2R^v6zG2j%!7;06tt)ZRtP<0OktSs8h(i<}VEMF%?K}J1cOHgF|UExxQ(UY`9 zm-qa-TuCkOxr^6eX|}wzosmC3j&j0Q=A_4>*?LKzUD4v* z|1D`f&xbWY6b5x@IA-WRwKwqi+SZ6+>(tah}KAxYfn}|oGR&>p((r@%r54=$@GYC0xvc z7{TyNRZ3Br!!=4xKp8kZL7Kf#E1+Ru&jP(iq4xmpWD3v%O$%5i5_m8FhQoZz(_9rb z*-my}B$bdab_qHaSzjMWx{d9HH-p151k?CvxwY1ocbt9HJGt`_)VY`<4oIFA8bl(K zLj8K^o$OwH`1DsoE|mL+(7BDu4rDoN3Xk{X3vzVxO(AuOl2=BJ6jjQAi`W&XLz(G< zu{v2L?%Qg`-*^9sS38Yp@j^@`Fs{IyfK_I|P=K|-AAkUlKxoEK^98IiaTf;K9kaDF>zVA?>@(-};c45+%uz!? zxnZSs^jBHH2BrLy7G(J5io(A+c52V^+43^2WlJir`sqvu(Y9>aRz1dL4?-H~YRmUb~I*-u6 zhZZDL`uZ<5tyPW_=~Eu=6hQ>A_%?>>D(3Q1t&pS%p=<$GF@1x*&r2_B^;#1Q3`Cp z#v*L`JMv zvnunW1c@nfSd8S87GT~QZfvA_|M$@Aw&>Mg^DiZ(ugxg>3J6C zG16Eu&_Cqs85HRy2#z_Le{kU1F@FbR1wwPB!yrGY3o&c>4B(2VZoiTpxu%ByJ}!<5 ztLet+Xa)12oeD3aeVQAFsG&j(CsV{jjuM5fmQ0!fIRs0P12Sr?uxN*PtOVm+S*nZ? z8Ycsw&ojgj%&|<8!rC(6{DyagLlDvSR9m0~!C1^wiZ|h+ZIwafPV0@TB9){Wnf?KJ z6y1F zJms)wyiupbp)N?uCHp=#O!o1l!E4>HRCVi-ey&et57)QOv?9xfH4zUKvLyrwi-_L{ z^azM~i%@R?ln9V-gYYf}J;3r@rN;#TI#A<5RrZBmz+^|ih>W%RkhcBxfMC4H?}8S$ zEG==?Tq0EqTF{>2QIJt@9S3mr2~(qNnJ+B@ROwHYv&B{PzPQ#oGeRvECjv6sva?S9 zk+xp1ab_W*%CO;Cx*Mb`ah=xILV1X^?iN1rY+Q;MB#Qm^>nU$xBotAD!NBRrDI`{N zO8x$=Pgafhi6q^3!Gu*jFIT~f-hU{qEMG^3rrMH)#!?baK2sUeebqF$5bK|WA|Yqa z?e_Yc6gX_BGfvVeRV=N}5l-h>W}z<3!W-PHEFn|!#Fo>%?;@GqdAdv+2#|+u%a9Fq z6#rBI854Y{?A&lBkMadlSY^z_Pn_+;LZ2o8?Qob63-&2Q#6oG%qHbfmu~K&X7tV_D zOu)e{ior~*5WV{l{;KKCRC!LTesMePiG`8|U%D+>!MV^Cfh|BJ zQm^OO!#f(@|J93WuFRA&4p#<7EQowO%JqHWcvShJEH11-yR^=Qay+{j3yVPhQS zAkh7TT5sWBBFP8B{VmnnaJO#hzaootuL}En?ovxd7EF7$D8y7Q)iB&-!9-5nzY*k|4};FoWiE*#(OGJPToXz*>5Zhz z%4DeSgrm6J#w3N|gn%VoX6iwZRWea}r9lu7l!R{3f~Phdx~gA)G|9_Y?BRgpNsLs9 zj0o!|c^Dc(lFnpa#PF!1?XUJHG5l%9Leh>>VV#blayuay$10D!)B{I z2?8H<)r}uYW@`^WnZ}Jax8nZv1rQ^}5jK{g?g_b)k~Sd%u3YDSE#9$$5t9!fU=?h+ zj(zfAl&T{5=xk8v)dG0ZMA|8!Itz^52Gc`1XE%}%_iAbmM?4*#2@tDD&k{`Hi-6F~ zZ>r{qvlNJwH+j2Sd=U*4x@FIzyOk2JXlI09FN?5e#HRJ$5((Kb)5^bT3YCWPn-tg z29Z#cWAMP{<%P6e9fd&}K$UYsCf(E6@fRKIp^Jb~LdP9emTD=PCH#_>wL=2WRjP1* zqLFTip*q|P=zBkp=*Lp<;c()T`F(jVEPHOE9;`$A+|x9*I>qro%V=q}_|XoF8OR6y za-xRk4Gs88CaZFWqN26W7w5*@fO^mRHl)bWZTw{tP9`bBfo~Y4)5E_zHBwMDc&L!( zm1JYlN7T7AT~1jsDQ>?u$uzb^@(E&nJXL{l5}apy$|YJxMENPZv!fW2LNi{Kv$9$F zcI&h$qK~QxeYkr*IC4Ttdyx_Nl|i`+RVp~?{`v{NGBmAeeHDzQY72!|kfKoE@)T0K z(25UwD`we}BZTrP8f%}*3?@~wja0yUIvx@Zb7|ohl`R5G#VUnaDnB}*lZZDG_}pkA zOQBUj!sCR+6Xrq<&oq)}<3~CeZAT${gwUovouISYCgmlgY<_2Jdq{|_x*7UQ#gj@J z9V+dMXWdJxF3fo{7{A0bngw@K);jKK3d1LxF!@)MeacOqR>KnfJ{i;4)ORp3M9-^& zk!L+bsHc>2TwaAoaPs0%%9C`hFZ=I{lWRQFSQuyb@c+&1vo#SFHNhsbL21$OkoKQz z#s2NtK`r%Qn0Nh9N$8kbP>7iE1B^~dN>6?#ozPU-Vx!Y3yaVYsF)znO{Q|o4LGi@s zWK7O9Tk`BU8CW?~rYf<_a~L?(ZC|u8;}d4vX0?TGvlT;if3wN5n0~Y4GG`dZ)_jj%dkfRpSZ8h5@?tNaH z2U}f5MT@o*Y;i*ww7uojQ1M;g?W|CSl3$y0QJTazHW1p`Aipt+E-`=kgc1 zH@PuHUE@vuAk;X7dcdD3IB{UrwjJKlrGQ#KzodarJ(Fra<3I=KUYL|viYbFP)yCUL zG=HHEzF{@hg`8Ah%O8Ja*Wn-(@wZq5iJU))q)@0;F7^uEu8u+uKqN2?KOz|~yacMv zV^eYukDzf3brXkHVM(3+n|)CUu}_gicUE@#LNu8+R%*XSSq{fRy0t5}Fmsz6*~s)S z7yA~OYVNsPwWZojOoZ1OuQ6va!D%LyV3A(784=3`p;+AhP$+mk%+)>x>sfDqiA+^D z$={R$n~~gIA*wqXE4WrnYI>ApUA|jLq^21Wac%lf81frLIzs7kd<^jrSmnFnv`~fP zrlFczLlZaKUwBud;H8i~Zs>Tb9HiiiL_}dF9!F`kvr6bs{Woh=!##vVMM17Aiw~(8 zw`pumJQ}*_wR{ae`Fg|`kgjGSLv&JnOQgIANGwEBO-W0^7Z6ht8gq_SoUCcx2LL{h zu7;wia@x(u@qAUY?_lYFS@GzP1Wn9MgUVQ#o+m1uOycoD)lfHB%iER>4xKG9jyt#9 z-HZbrjONb~I?YqWfg&A(C&udI%V3n9Z%f-EQEoN_);k?Xd(~fz409m@aL_*;QKB;q z{1(>ROI@0F8?*wElSBb?Wl5si%|>D-fw$hOWFTE*Tqv0zRX-5sFMGy@=9I-64@{ZRdsoJ5}ppUxgF>wS>mR6!xMU zdvf_f)n#Ved6&-;&6=EeGo;9<6<_k79Sz9qDKuT@A3_83FFF71HFn4<((}?>-byNQ z63IbR`6M*3q8)KGKafSs7jr!&OO2-q&rFObC#>Z{LfN!{`KU69Rn*oVf^FAU5hn8C zFwVv;xRmeeKvl1t@%xF_8KV0~5wEF;f!t*-TizLeOrwOEzp<&xC|i1%odl!>)=F!R zTU$Ff+iiD{-qy$2w8&H}vYt>(UH)DK6JE*8>Tiv`Y^qL$M+?~ut&4>sM32ELP^l2v z0vmIB^OU%iBBhgUB{_$3&E4xHYG-EdR_LUycC{I8-K`#j!P!=%rj|~`-!_VK)vs*8 zk*(v=+g6syHM+mUv0>)InBrG1?NE4(c|AG#>GTsgk(8XR2!(ng>AHqXYxGdAiNd{M z%O}LtiiBvGTbGA)MVw=LxBUQ#Zm1G=nS^v%Q`|nn_dJ$DA~B2%V*^M?=DoR{b2q_> zNIP;HmOo9F(nX?-))Hf0s9{lT`+9_aqAy)96tb~PcJP3{s6~R$yi?b4WK4`s0Zwt< z)nyXp9}zAYLGvo*0GtVrse%+WUHEe+XpL%>!+MhnL5R!*&KE1j4cAO?+9tV;#b7c^D7&Pga!@gKXknJ7*Q zz4GYExQhKbE~N0t{G5p-R(JjV(HKQ(5{zJEok?b-xh6YeS>GA)FMd$~=YK4oyB zMfjye*uB*`zUpj%JAV{99XeqzZAa9ir|NsNI^dl!$RG2MK>un z&*7#ODS7f1vqLJLZH)gB-KU2v4Yjlb3xwA2E1ZZQVUfx#B*KK{wzxRW4+$hj#Id%fe{*2WjHqk$*j_pk-5aB zghD}oTx~V_XAxR8#1qoZ!Xik{QIMxAtIO~p3#QqRmhz@#a%QkD08t6xeMYo{ssWw{m^T^FkA%G`yyE#zYUAKxm%i!!gxLo|EUP1ak43;A=X z@o3QOY%N}SvO8S5H_J~s#cpvAg?-{C16`55UZ?VyYO0dAevGl)e-7*3q{1{*ip{cj z_+uH=CAVSp1Hj`Zq%9#Qt1qyN8-nGtBR*M{PP?;Nbnc^hmct-U`748!+&-~@Z6G@Y z#s(V|JjCtuf;Mz)U@p>a!|h^Hk?wH}oQBJ{6-r!G(^D@Q3Orv6h5 zM!Q0x(r@tXm$>7ko-Ha<$t4InQ%tD(^T~1;P4bC3^(Cz^y=MtS4!*fC0B03li7vh{ zQ+5&JcJp&s*YTH@X}Sq^>M^#JJvZ9tagx~7c0; z>iYzEmgm&;m4}U4KMjOk754-;#zK~oTHKjttZK^E-l@rZhw(&cC&H6wc(c!U)2E|Q zTLxMm^yF}1ivv)X(@k!5e?9W6>(Ol|#Oo;;*bAkhwx5U@#qN~_o{l5ib#Jv_{zVP< zQ0%L8<@&z6LzGk>`S>sC4J-2mDB1-&E@)>FW?d1iE(EZhIpChKE1?ZUO>1bgR!*6aB>{Gjh-1t$EGU z8_ce>7s7D%e@j~vIyFsHsJOy-$NRH8F0KoUQ=gtowIYsatNm*nHL3S1!|1(7E^Q<{ z`1vg{ug#9ZXxYA_m!7Io?DC|M*!LFQ!iTH}{(JAn*6@D(y_^R_0*kmn^=7jl%PBm<|Kt5s`Vi7E1~m+ zWpjr12{08KkSc}dBH{0)>L-O%Y6=DT*~2*?CCBvG+KPmxstPj4pJ3afn>DLLvHKHy zC@=}dOrZNh@?9FDJw|w}v4!6HqOGqI-0ic=0xd_v0b3w+d%K9Z7e5gYXPLuvhn!nLybw@0s7RZTWShG+p z!E^Qp6>QDA$-EW7t?qwTi(rzPNaZ6XNPmjwgqOQQX7#PJPgL>`*x#8xiFP(ix&Vj_6K z!r@pEyQu~KSTGK8D+c`T%4&e?Qede11}lJ+0#nGSzMgIKyAQQSRf4O3gchqppcNj{ z>kUnr6+(UW{>7X{>a-Bx#>qTJM=M7V30TON@94y5WNr|c>Je}en2#0_Go1%-&*je5 zUl|d~i4;kU!bq70s*|U3g9fOe!e0^A$|c&rIuar37&#V2BPA-ShE0u1en^VUjZLDi zUTs|%Eh3505rhhNkt#&SkLF^Oow-^Op%EXD&XN77tXq5pe{QcZczdTAU?;w#f>*GJ?);i*7_rAL?aH(W_fC=A5S0 zs0#Q~y_j3(QO(u@Rfc5BRAs{bCSxjRG#^4&IIMUC%FeA-a)w~h9?Zc?mio*Z;J()s zGihqGs#Wn;YTFlBX55^x0Kqd=D5bXN(G#<(jg~IQ&k_kKNGUBO{pvH|vK^0&Rxw9} z`tlcp)C)2YV*w}%Zk(|v84tCIK0X@h%zld7!i|TD=re^|z3<)RwArGA-1~xkBgqB$ zc1+G{qcKq_njN;hB|@Uq#A^Pt+bkwE&s! ztyVS)rV9@@z)ipdlusBQ+!TTofKOQip+iGw)}X=QVp!EGxHMEgx^aucoB5P}s zEHBe(1gL|bJ1|rSBKvc_m7Lx32nFf9!%D#iX#e{+f5f^Wt} z_0ounl1#sBMa#$}flO}3)ZS5`Btdd{CS*r$R{9RrQLcHhY=X&+LQ3Tg7tcp$WxSP1 zH!!D*=P?&iDQ>$nH;UaCCPt$s$4~m)wozw<B) zl{`;+%r6l`wcK`HoPUIvb!{PTvx+h&wmiJ4S_N5k%_zgMUlp@<%6|Xt5f#UnDXOBd zCjCgI`xTVnm#l2Rz`!26Jr(PYu6tK)D^W^9NjlkmtXT1BB+Ura zR51HE;bT^r%2**sp(mYW7o=H}JBGs?c0-HYg*1FV>7UDbk(-uQT;1N9U7--i5Q=bJ z(P}0jr|dCgJN<^zAXwDqPo#B|LZe{Cc0~FzEwwxTQQ#yT8$qIbBJKLpwXL6p3nN?0 zbFxY6vj3Z%0U(Hc#2j?6{pO)=V|Z>jjoaKrqr0WXXL6KX`!Py-p;2%~;Ut`>Jegpd zf^5x#4TU7ZGD8R!%}zV_%TXqUzseDl?ci6lGQ1gL?C6@V3}O+Nj~rNAOFDv7&IMx- z0fiCDwbO_!o(hSo8nhm4xaiBY?#{j{g-UL(uK61EtrYIiV)wpnE|icObtda!u!N!B zKB_3YazT$ZQgzh!4SljK zyCu#St}2V8vS4G-;wy{@V3^sBd3CJfIU=?L6b=2CqCI(Cm3ZSd4<4K8KDMlY=Mw3wsG4=Y;{t)gc5FTt7MxrH;a-_ z9e3?Om6epZ6Ot!m9_+#BNT~fD%AB_4i0uZj#b z-L=5=6>@(p%?&0sr>36pbF#6LSdkgG&em--XCJRBJKYS`CFvOzAQCDbWl#23mC~J& zj~$|9K{C`6W@oeN@OEa8X2Pf@Zle4WS+*TflXHl-yj@;Pi?{@UlZ@i-3+POBL3seN)xexx~-qCt8sqr1d(Weid83S zn7ni0n>#!b=bbMwD;23J8uWnxM?kp00(%*Vx>65O{1ez*d$Kp0U@IxwW@=lpFbXxO zwaBoXT7xl?`X!*FSrhcUOi<^EYtMqlz?EXVYFAGvRV-#yn~%vx3sQ9iN~zji;S4o_ zyWt6_;IF|~L`GVSz!WkrZPw4KTze8M8e}TmGP86!|Ah<@9vobs`fMu3)Wq@llQPpg z)=qou;Nvdn*dbwu208O;)lkodMbj=Fku4MM&g97|=R4tYAjMLAVjPf3e1WnbaBxo0 zO+rpS4N6psI!OhV83ck%fNwdOekl~_!f6>A&~7=;s$ z&+P`|IBS#a3trThbjV7&Mw8EP#$2gaSh0RG=ZzCWSF7jC^Dgq{c7K5 zaQBjC()NTh%V8c#B<5Na9g)W95>W?g3ws`}N0jF6^iKyIv0=L$N0@32!f3N?2ubE| zG;6GVT{kO8qC&irCDv+%ivy~Y3e~uDC|m}BuAB{@8TmN4z@w53^AN@@sOaB^GTUne zQzXPbg0PJ=E8FZELw30t-#Hm*NAVWOohx!P_E=s)IN=tdayk)m;w)#$M@zB8Do2fJ zM}>N5VT}Na)T1A@6W}q9@puZOH@_r5K^7wi+xqk#}T98NE38$C8$$T zPdR4CS0pDn(6w|6Umjr~JY)E3j@7Y3FN1$bEF@V8jK2^bKd4bkAX2*Ni8XUe7r25Y z%Dkl24?)m&>WFXIB)Sb6PA6$31?yrN8*0i&q{PHclqn#-0zG5AudGxaQ*df|0&|^= z^B3g^S3wyBQ|$Yx3g}+3flv^|bo=had-1&)lhcWFOXFSdHenU?tC11{atsaFEd!~k z4cNJpDWe!NVdt^j(lo|D<>bQ>Iy>&1h_Y}u3X)?x#5un~Tm__G@uEky{KcPO#e_#PtAW7pp}NF2C%B*BJ&h6i9-0Rf(qL0u>=)*23TK(EoN%s>X4Av*?F-| zPj}BK;WWP4#Ary~qOnQ$F3N+btdLT_@#CWOfX|JJ+KMeqLhfR4#AVKdK}sw|u-FtV zA^+YA0lo-GW?(33CrjRCY@@h4XlXU0nFNSnmcoP)!7-33%%~m!B(PT$O+{FV)zPO4 z=1GJEUc@_+G!QrltYa=6A9q;WxXMfOuqApdiR5?`oZoJMU><@!hxi4l?t1%?mu4Ex zmoxKvxz1s?G9;u)l;W#F7y$}tETUO>uavYaac)G#)JlV6m(CNmVTl%k(`Vhr#ek_k z1LQ@e>&b6shoXi!B}L&CTK{7abBLOVTjBIMlhv{mA%K{m)uwY)_UWyEG*${GvL_&& zEY7+o?n=;uh4|hMp;Rf-KK#x2O$G*Xvh`QA0PGdT9N~0ZwGzS#u?%Q|0={cebaD@D zP!jOI?wNG?wBDeC6EvL>;;4Df)T#Ucj9NX4cxY5X#^{Y3WBUreYTn%^_LDe~DDe{D zvT6nZDhu#N`U0@TqOxQ~@ffuJ$;@G_GO=e>Ley7wY1OD(Eyl@6SKZ5j)D#oTEQ?Ri zU}GeXIQf44mG4=mZ;{}@8Yz(tk!;P@$VbzbR|5g(o6PPBrd;|&`E30RqMBC;cgYT% zi25kA1#KKM;yasi(c{3{lN(cg>2DNKLM(>}C6FnzOI#SOl2{p*ebN)(aRDOV*{t-d zgeG1!#2pM(w~WBMm?a#Vu|$6=hL%)qS7@%Do1{-+-0#W~BFsv(iu+<*S@YS6ACYej zJr(~el;+g3|9r&8A5rfe$9se$QrG8C6EQrt4qEf+Xwup~o|)K!8+*4*o`tKcZ3ywQ zfoNn~h6y+26Oq+%bP3Z_bH7wb4VFOgt~soO`KnyV=!v8RxJ1HNJ5B!SqZ>RlBE<+6 zI&Yg}3?Cx&{8->pBYTrJRABa=n5dwensZT;roZ_+N_(Mhhl*g0b|2hr8;v}*37I1@ zr=2X@@a%VvyYiIx(~M*A&tS*5HA+( zM^ge1M4y!y=H_%@JeKFY+Z_X+0NmZ*BgC0XU>R!fJ zvS6Vskj*zqKIcarnFL_0fklf6&rH@CbQ5`5PX9_7DK*p3q!|L7VHUyLQOyD+<9X7O znjtWh7=Yma@kK5DhOA5otq^D1tK(j?pRy#Cjx7N{nenx#VOv2*BL?cY*#^vnj4;tQ z$Z0F}kYpPR{wFp0=D$7V(jUn*Anl)-HfD&y#1QF(ppvS}_m_|u+yCrUQduL7k4ux> z9lgyK^dZ|@@r(bxSeua>EoiC-SYel`jR@Ml~ydwhH26MB_ewRJu7q71CNwy~nR? zyiVY#PM5)TC2=Va|b_4L!V&STJS5Mnx4ZGl8PNFuC7)%dnN zt`IT(>A9-}9u-V`^AQ=UX=c4S1^Dg>qqgjq78S;Gk#g!UG-rKEZ=k$$zg0w%IT6av zmZ7-awt_3cdl$X^y`2gvrHE0c6dC15BPxRVAQa&&31dotWz?|_;py5F<3w3y*xc!Q zaPEH1sV)0M$dTxUQIXQy`;{<8ohx-q>Pw8XauBLL&WTNqJVA<(M}ed>!`~O+tQ|PNcV! zFqmF{J~$zb6HTyYcwz0mqfeN^WW4VkUT{xRi)Y;!rz(iSb98dl4~f$b`^fgDuSTZT z4lNe~es(%tqBQvhV&VOS$yGNVOm|o^x7nD6)@!otA*=dyO3p1_U=$>#JdY)8;;JE6cC_xYeT;z$`4Sh8ZxU!bgn9Z42Q|S?923=1 z*BJA^uJZ7yOJi9BePxO};u5AQ8)pTH#FWWseQbXB-}ln%diClYS*zCt1%SvjUS~`e z1(WeIA+_aoAZi(*6L=s1B zZn9_(5oA0SaKsK}g2kOA5|rEaV)bsyrHxh>bk1p)Nr+56TwQyOQKU?^Y*XK6Nt3*K z&y!iRi^H4dNqLf2D;!&j9yF>N>jGw4-WU|^sUfTEw2#JMC^BY)S>VoB`ur#!uvCPp z7IB|ApDGjBVdKZ|ZqnYOfP(d#UaV$&i8Yvm{BN?|w@%CzM$qCctA z!p#$>Dj~rNda9}l?|c&|>3fKncjGN}5k##JuVTrDk*aJPso@T@JRKCBt2a*Qn3LQ| zb4*r6$2-Ac%m&G=Y>)F!Mgg!H&(Z;fzgn8_36X$kSXp|1mrPNG4UypF`Iz&B9Li<; zu7uj$0^~3J_HY#Sd2UNNH_qzbt;aHp9h5|tZD$>Cg6qW*XB;3YM69*2tJFQSR}csdI0L*@1j5TfPu#*ZP2--F zWPr@9`a6}QB4R}sLA;B(M8LHos!yGGmT{M{Q+=4VolrmNz%7`Zg%>&O#ksxIfZ4j-kH?S zD4t@ZVIDq7z=Wx7_odQ|4Q+gF(sFQ1{xSLjcRP<}$9>OG=PTzucVkzHpDf9}tR(~X zh7Ql|+z?~9DUt?erX zoiVj$IKbE6_X%1&;*Fky?;(a6$Q3>)5(X}IeYsmkjh!ztvt0elV_*|5p4W$pByEtk zIx~$f4k|T}xb{?YBP`uhNgxiK7m?kUXQZe}I4e?0ts%K)c8%;yrui%fzbYjRj&`O< zVX9)TIFj_amQKI6nFr+{L^idw7*2@OO%on+5Ux+8c?!v;*WI_HrNg)SJnYw#iH2(e zaqqVE1z@EK%8*meO=xFLiK_MRe=Tn(*VQ-C^{1iI9DQag<8)5NCIm1QDA5EzfP%I*7r4lChYr$Kg)WW&GD;6?3EKSdhFkw?){%2W@~jBbSHRRnE~0PRZcrlx{sXHuCGH0rOK^p`ouPxRR{8#x;hqG_KUEWQj( zk6%ad1O)kgdZJ8gBO^@PJhZqdgZw2RtIf3OAa?I6ms#>ecBxAC7;Mvd67D(L$F7w^W04XY5p) zPy8p$*vTL5(%y}Oh2higvDh^S@0PDronPeZea zQTLWZ$TKX{O>`@}XGrBfQCLmzr5^mF)Tn#YOH|;4&W<&)eGbIV(Z-f!W9yU7TpDuO z``+hY$zm7w3EZ$*_P}=x1#P|_10|pxoF3J7>;*P}(D@8wnLsdZ1*Wu~QB+|FX}?1% z99{Dk?(U!Pxtr3zF0K-nB=4IAY@}y%wkbQk4Ivtx_t-&fyX3h`$&mDlOEzlWLMBeV z)4N{I9MIck5V6`Q@`(%uTeDJ@5{gGLLG>(ZK-*Nru;C&(fcjxVZ2~1oY}`93d+$fF z3>BPHD4hOWWZyJIovOQ0e+ZVJKfzxcMj*7nhL_k0S3?f;pvB=Ud{n*W)+Xq0zDYUT zq@J&9q`FwM3Q7qlbV{<_j0MP)Z8pI=Wh98q%eihyFr>8=2}1Lih%%*S;`D-S{roh@ zhu`y}Athi%;yc2t#Y#H=m`2VEDH1q);2?y{sq}e>Sw@YOs?Mdypt3a#%f|#hInCY* zm9>Tq3-eac%0fKiMjJWwco8QkLl&t6pR=EL&htcqzCCD}(fR3s;grWvA*-mqYNZL^ zR55zHt1u(HNYdjUHDnWZ(}s5E*odPY#C;60h7kfzSaeaqPe_u4O&b~~qgdZ}s)aLEuMER%Q3f=&Y!*204`InZrF7UZ8G%?48QpvY{=bo^FSJF}MZP`X~ z$Qc?3ps%|su(baHC%obfjC%2ROA4u z2@`zpJq%V;CTGyfFmUq&?Y5fu1ZylI^$nJXixy5D4SWek5cBa0BK2040)x^Ehtgg! zqGLPCQd$!=r3;gtLctnbaWzy_=`m8o;UkbxAtrYSN^BLqEJ-@<4CttA^mR~1aA;_E z^4LhyrI#oooo{+!m|qMK`T38t8i;VYQ$Qgdxlty&e!1YAh|Y>orum`{wkZQ3ku*Yv zBBrE4K)_-MOlE&ke^(^<@A13?MUyDANb=0{7NI;Szr>b5>rsxpYG^e#9vfH;*F=R{ zcC+TkxN>E8h$s;M@a~2tr)lW`u7qV7P~u1gCny zK!~y?s?kd{4J_mBR4rPF(Z9Qj391RFxc!`oHvb$t)tl8U)>A{YG|5wMA&;2DiTo%h zA0IoYR8Cx!D;CQ#li-o;Z(`a6dr=aXIsl>j#N>^ghB?Hrme2+Q7ZMQ^=XLDJzHb|; z4p_~tnvuZ51&FvaGXI-~s2?kbV46Wyn}NKo`p>z{?UzAw-kd#hpPLYy>=M&^jOmfI z=Jgnj$D)I~j?`+GdRYa>Bio#@jX1@NYFv$~zcIQ@q}_AdWV%?pSmUb@te6(!` zIPkn)>BPeSB~?X8DcL9c-|M4!B`L{bp$qur|HpQC!xPrAnj%%NoJKE?f({Y`c4=if zS=(xQTz#(99cZ2Zmt#fc|1#YLDDx-r6Avc^Gn_i9rW~l^r1SXF2>g2F@h*(v5uQp# zB>DQpP>GRO&-pP!Pp*99gIo~b{zw5Mh2EF=!kdHyozw-7!?HzgilJJiGfys<3CJQb z5rHscPat{ak9V25lG?`+SNMht`>y1!BkIscY-qYZ!8lw_%=iL0w26#BuII24T2?s1 zwWFX_la20#qm&qn>3R5wI8D^rRB zq*YegSxx%}mS^c3J1c$~(o4ebw{R$MPGyMqyMZ4pPbutC8uA*M)Nxix_)A}SWTZ(u z06roKLkL)}%qk(Z$9?}Exb}|ON+C{dGgo}Sgdr2{0_qv4n?M98&PpzhHc+WD1Gikj z#uUY4B9M`03q4|E3q=gi3FO1lO6)IXYGLQ$6f2{w4YYkmnRA+x|2G0m;O)i+Ol-G< z9~vx}lTf&UjOTii#6t>ILo5cKumX-g-(<;{rs~_s_QV)Vl`Tdp;4pUHA#6-I5rt?Y zsS6p3an+>MI*8oEe;SNk@x;~=2`z0h<4!yD6=kv%0b$HCc~DvtCm~)<>3fD%B2PU! z9+n_{$+OK3I~_|l;uLf;sKl&U)ZRLZ#*!h12;NtzABEfOq4yo>dm_SD3Y|*K)iXw$@ipk$T0a5X_TG`5w8Gj0NWt1qnK82K(9}{J-0-x|*U&SeRmI62q>vDc zI0GBO3p3zf=873>;h%gt?@FVG#%L&iYK^5d!uPq8(-Su|;z{Vj7utQW!Oxm4$PjrP zef)#1IdpaB-nK%~^4p}x!?LBoo)N_IODFC-GJ~9C%4U_oTpl`1bq>A2$<=X1!%nJ; zV2Tn*X$TMX1PT}F0Z#W$K(pis+1Wl`jt~vLT2rO6?JJC-0!HRh3Wd5Q(TdATqu!B- z-5>aKu4Qpc*(6ewEqY1*afcjWgFWhAc%11AjfPc@?;553+54xDNXuH-PHCr1F=0P8 zsLkqQB;FE@p)1j-fpFa3PE5Zoy}5Bqvy?0C8!~1x;e9WuJ>%a++IQa`C4rOIa3PaX=w_N^iL8XiWLKbK~r*s#Re#v z8Xu<8`N=$?5G7DiRV;6TNI| zlp6>`%8_7GjWW(lile#lOtyZ+ifxGD31bZQekH>P$pw^)wJWp!E+vm=cE$+|E}5L) zUfU}v1q5L6>J<0$Jo%Y#C}_m094{Pwf?R=ojXa{ry}F^!G*2uWu(YQBngEom+lt6V zWc0!v0fuV{+iO6j$2iA@kMPtJn{7pexjhy-gwr?*qEwvcnh+(v!?~orw1~cm6|LP; zD)REM{k1BBAIAGA*7N_^Tn0dg)TPbcB*Pj1217Q;sgL~qOe)yvFHwM$g3v-3e1P={ z^9;er8YWUn6%69~$$rdS9lUo`2GKlVeA-^nns(5fDzs!k4FWotw4*6ir^gZ^>#o($ zrIw9kxSw;*oeVM$)-_fP>$Rte%=-E2KXB$pg@|b@U#pC@bZn{jQy&B+wg1TS1(Kgb zOiK8J9TLer#y31`5+6sh&Rq^*q}>4xP#J^Cx3DO%>Jg{X!dv=Jxc8&Es1;S+Bw7m6fH_nMzOlAy$Vl{3HFJ4|l5a~*-!;DbpD?~g zW>gwev%0X2Gd#Z#pr&~dtd?Iv!Kx;66Kl@3y1La#Gj1xcM7knA+ap8OJl)WPzpUi< zqOuvRZ6E=Oz)Cszgs3QU)w}di7m?HhIC{WbK_?Ab6YoGSxb@VTmsZ!+Pxn)s(R>l& zPK}a7;BL2m^)vy=YvVYhND%ig91->_a7!aU*$h)PynF$0&vOU{bSM5W)T{TYA(|Ms zb1amn%95ISeMZrQ_6Y%;Z5HQ%KVV97cQUvfu{Mu8<9xKthrFW-wpx)_1Q?nx>V#-K zlyh#10WWQSqC}?&T<;??Wh;J&LePEmi_32>eP(q!|(hA<{1SY~qJdV)&`N>XBp zHC`jSr=9Fkoc#!pw{5*b>PSJemwDbnP(v7jXZG+aBe<4jwc8_9L8Sny0w~3skeHa6 zS%GthiV&H1TtrkR*oI$oZ2w+E|hi$C~-B46I=30z{!4tAnLubs=Y?=^2 z6$^V(GRJ6?Rpw-TNzmt2`!cB@F_ZFk)3FXRz%d-<$F42ISncTQY_u2Bcuv4sJJ=_YreR!EItUUDngOwRAf5c z$s!j3iZWS*``~H_ldRZn{5>oY{$NZi4mWu-iG6#TA$riSX4813D}qIJfabe_M&j>jfrX zcOO;$?n&3{NCSd-7Q&3UZwakp#-~RbG@b`!;;}x^V zEOTMFrWEfOf`#;3Osf8nbB&;ti!3oE=c~!dTqwwXhrF)JjN(~F6i}?Iq6&vGx63B~ zB2rPeS+T6a3j*6?p~F<^k!FXPa8<#}9`3sWmJqljU$1D1ZMO+!GNv*j(kagXWfieK zGvP%}ka3%#N1{p1Q6)m@F&W9TLkZzZL#KojDKH$8lW{n*-HI!t zK~&W#mn>4Uko3G}RTNiX`B#{ zuppiDql&%NMP{MvjdAiet(;)k=sz7|^mdT1cFg#SODbktq}a@qqh|otg}lxYE{SFB zl*Euqc85}mRs|}m5O8vRT^HT_ZaN5~#32Blm0M#m)|wP(X8gDwW*Tz&wF8nlEtl-S zV~_xs8x}PRGlu8z8Y6`nXhHZ*#L0+_bTlbPL;=K(PHgSn*lW;&i5pND^mj)iaC=x`FkiWVL>q2Lf{ce_#05L^`aKB-S!5#{WBvRfMoBqC%sa}q zq@4!Z!L&#YuJ#RypLm79qgj4XP#FNJz6Av=&Mw zLyczLm2lg&CMUG67~;VfF(WTaglmE$8#eK#Kx~K^nAmi9qQ2*b4GMz0%MzFN5O-d8 z;F~T86Rq12d70of$y8^QZcO_2a^P@X8Tc5nPmRGA>{a!3S>>cs{;0QwW0;=>Wj_VZ zo2p_XD!(DydH1uZSxcPSa|&D~B(#q={|4rSbxSS%F3R}sQ02e$P2-j$R6Ko?$k0*J z1heP)4OlEWx<7Pk9vK-~J2zETwBwc($=c95e`Cm|Ya+G~Yey$cMv%ion5ySoh0$L` z{t+*epkjV7SvmT7{yv5*TR|aHv~60E<&7$NO9rVBY$5&~-GTpW4vL+09HKkZbutg{od;PMtC zMVBjEu&T)X{$TWw`g%3Bgbzi1f(Ed5NJ@@|Lql3DV%@MxRZ7Bcf)rkJVw1ip!qB29y3 z2U-Ngmhkl2xrMVtQ8t?!xfR`3(4y&TU{}V7Ode#ehqqth&Ce|q>owia7LV7!C-d@z zY=tojn9@l%8AR%l(q@R6YPoVk_czmmc$eu^ctF=oF^nNJZVpUsup`t34-zIe9I}2%DC%+GNQg>wfD}@^ z_#6#H2PCZ;K!Q$^9?8>F)it9ilev@i=j?$_wA})|5J@DZLHsI08U4{X=eNL&*;eOU ztd#UkABx8GLe1Y2Nn*1Fl9grRvY-<)FKfzPQtg>e^)-GtXCr$=Bn;MYsN}mHNqs{u zFQmWX(X+P-JfMlKA!}#Ymlw%+yk_BCi-&L5?g6cSWD-{o{XM({J#W)e!RSY z9dO$qgYbq&&=ETb`&&cE6e|)b#coXA-i_mh*#yJdEu_GWEnmf*OBNAXQL24$6zSKe zfg`W_HE%Udx||;MM=ske-b~Mo7LaI4Gy7`(XkX&T#jwF$+N6p=!f$AZq~PH#Y)Vcc zViLEM(Z)t?(L$pYNbZ=IHb~-Gr(0#X)HMjo`bWYZpZkQYp-PDa1T;SvWwcJ?^LP(U zIk&8t;jF+!$|$h3EzO2M9w!OS??-`*v#eLb3$Kkx<8t%)*=2j+#?TiMp8FxK7WG%z zsJTTuSY$)F z+rbI(sD>FJiW3NPKvlSe>C0)yv3DjXG;#YiG}$3I5YGT%!2w`rG$ERUlv{x@1RHBJ zS!7StjfpQ_GC2TH@RE+_NmMhS?T2e{^Vt-|(y^|h!4g6dmf1*(rV;mM-v;BuR+Ll! zmpjb7FQR-`Ku7LUjI6EXm+9?M?UFS&j1i<2p^}Z3qWgt}b`CdCZ5U%b4MO`e(GZs+ z2>?ALdBtAgr=Z39L;PoGf`?IcNynrw-DV(?+MU^PTi z9q=h&%%=kc=^8;LkGSJ$y6I9$k&6Rq2P?s5e6k+0nkqvmSgK0_N)a83kycj8n1)(S zq!}VG$ah+wu=(*BMbHS}MWBMq60Z>|w^fq&)6P5wMkIfupt}tayd9GPu2gWa&IT)F zIZ${-2>U?lB6NBPY!mhrnaA1n62yUB3`-7$E;Fv94Yrp<+{AoI@Y2I z58sUB%?WDs3Wm)377$?6w3#%}Qq= zu{7GW$taYzDGsF|$`s!#Hm4~ymlx2>kIe~W7%J>Q7an1&SV1E~MPytB>&>WB5hf@| zH3Qx~?ooOWL!^-j=IPZOtOO_}!Hh!_=gT>zVbYvoCH^8)I;aF(DIq#y!IlA5QT&7n zB$j`xm1${eaPXrx%410aTcD06aK|N^VtulTGS|EOQ#@prv=I|9{5cwEM4*ieVO0RD z$g3sOD#9KA3Oooj85Bk;_hC}62k~brBs7>5|AaZRzAiBoVoBs_zJi;?!EzJZZ7b8w zT1o~&tfBN3Hbk08o!N6Ph=zE36V~TqDN4LQs`to<2ZDbvC*E@$bnpj?iNIcBJ=;@H z(8vkQvASUf(4h*2w&K)7tuc<2RZEdlNPKX2lKsra5_@2XlX1K4c(+sMge(?vTOv}5|uz+|jT=DHZr?I>w z#0Xqhy;6=NY?VK(RcqWNR}xAMkdto-bZ|v~mZUoo6eq+&RF@35mnfI-K|F*H(Zov& zk_=g8Otl^TrpA@`4eES_iV&smn3pdu&@)y{*wtwe76XK*4Na@0sRg79Gy?hhqc(BB z+Ola)fuCz>8IO30ii*I?Vimwu5!^L!8Z27 z2dZ*#Rj|Qwb$gV$Ps8+Qp=}pjK|5x*uP2O@eI)L_Dsrm0 zZYl&FcwZ(UV7-?sG8gZz?LW_W_kplE%5&3isV;PnMziGFoJ-`8nImnMlB&Lwa#6s& zM4?ORd)H(o-iPEi2)Bogd#1>OKQH`i3PX|6{qtx+iaD?|+!2pOsT_Me%~xb4@T1%PS850yBXetnVRy zn&q7%GbRJT_;@?-t+@d(lc!Qq4u-PSh)F9^@NrO6uoASs+DsP`D$0osIYLGiU7t)& zrB2jpescN(z@psph0uCsmFP*2HSxrx$gfn(`7P@Eu%lMTm6aDbRwxVeL47)ZfnkWR zq0Dp*c_G_WcMuH2;M6r-e*f$TI8vT~(*p0ZK*zxZ@XE7hIR z`AA!VRcavejbave;ifRgd}l-ag}q4LTVGA7T$p2#07$?}lo5rOWx83a#X-De(l&-K z?2>9M!MTe|C46*ssEEgd&}yMYH&~OiNii|dYbdoETNNMnWu@|oMf`D#!^gK17Mas& zLO4|s^J+;J21eQ_S>=wz%qt~65W4NkF{3y3L&l(%7p$9sVA0Eif! z>R;;>f4T%i1>-opbKS(??I<-x)l){ASoNex@&5E~cI-%MG30C7sP#%%s@C30r|s{V zI|)Bd8u<%#qtYk#f^!Zxodq>*aT>o6HmHMDX1h*))hbFRx?%a0?QN|e%O$o07QKrl z7O$CgvV7prHx!cLM}bjeAHw0#R-aNayLw2O>in$xZB%0wZnc(RYL!po zc69++nd^Xc6Z%thJOu)gvB|MtVyLC%^3?1l=JjWhc`R82o&e7*4LYlf8|87n zj7qEZIA4k=ttzx+ua9bS26D}Ymd=_kGbYy*SuC$K^m=|WiFY*8F=dwO5;k^+`fuU* z+=yxZwG>Z?zU%7Pgp;pTpPR}N{XHp52u=IT9}OC`=W?*%YRPzFq&e|W>Hk}dnX4Mq zgdtPU(ZP$Uyu*&>@@KHp5zrg{a4hJ`%@(4v2@^nppxMJC3w&pKout*{MD_H?)Y(?G z1;rI@^lBny%;Hn|V5@d@87o~Dd6sGLb$hEZv@d#6do^i?K_wJ}XJh@s>l}UeeVBc? z`naTEL$~8CYRv{N_sV@WGt-|mn96&{OiATyDm0l&xmvuxx#?tS`myjx zmx=U8Avm4xEPjI_LZGuvy&_twAAeJ9K(h7QmU8KW20I5{(y3@J3iKso{Deb);WOjY zbaUu>2)db~TRm2Azyp-z18foG%6!D6#DQBHxZJ-rY!N3B;8rI zlUL>aaHyRQDcBV`DQ(&xcb-NX=5lWh$K^JE zuVa~w{aD+&=kU_+dnHhsu6e81l@%TbFMLdwWE6Szv}^QwQJY#7gmU^>5osFE%T*!R zw=D@OX_U)`mx7I1puQu7V@FCPg!UiYmGZ8~OY6Q8J#)gtBWV{9=*!vlq6H|VuuK-k zgil{HQlQwepHc10UE*VGwk{6&$cS^p&kA|sm}qdYrJ9KXc7%++C=%RXolZz})xv+# z7>9GbNpC2KQZ*XUuXtgw#^E?sZn=lkUBE>%l-OCs!VjdvDDCsY)o0yGY%F3tm2Hbi zmG^;Y2&1*QPkfIHg{qV8eE|_6)brez_p{9StS)`@)MlSGe}Y3KYcMck4N0TvK?Z9}N~u!_JhC?k&oo+pD22}o z8IyNE4IfId4J+T-r3snE_w1YWdFsBNwZxA^A*(+(e=TB%S3UIeGf9$?QdEN=U{*-R zM{U_9eK5XCtmYxH57K6juxkDmq^f1NewTszO(i0ISq*EVdG1_cp%LzQnKY|Cj%I{E zDk;LB;Y#8}kSeFS0mMme2sUHGWi*A5oDjbWUEU#Y2jD4n3)GY;vXJT@uq)iW)^60_ zAFx5aCSXY}=UL4~>BPUda>*b~wL8Z5FtcHqr7s(HfivyA;wCw2^S^|3^-9@o&+F$D zY>{{Y-fYfh&FdF-tCUt9;+-5rES1j_Eu?~@L}L24g}v8<_jWQ)T$@DUQ7>uHKCpQ3 z>6)67G6~k@RVb3(8LI~beNl{R>L`u%q4G+mE*Ge=Gym>Y{v-UXiDyO8HYKMRMz)K( z7lK)bHFNut!4j(yjq#jN!>O*XJS09OiG%qwTcoz2DLZgf__EMFHA@-_&(*IB8-5vZ zudcPa$LU`ozgWdBk?5m7IhG@OcYv-cYcCe9<|#Il*CijmFETDSXDMYqNE%*li_us^ zDv8UKLG51vq9u40Vg>|%;lLog(zWU891@9cN*sm<;vc}c^i3-yx7x@K)m35!vaX<& zs(4D*cA-7tCn#?+J_VA+t0eFsn~sEXxy*M+q&y%icq&k~@yiBFm4kJ+V;Pa?fEE#- zZfu~ax_A-^q7yQ-mbFF+edM4_qU0Y#UUj9U#+(*GXl&UK1@aQ{$c`n*scgwD zCM|XzO4@&0QTq?c4u|f?t+ge%r%V(fWVp;reJ-eplYne*)p>lEgCsX~B zJr5M%b~Wf(#K4Tkk}Eot6chHI4P3u6MCqaT$j1?L>xzzM32eK63ar%nBOps!R$eez zlkQYh{_niJveb<;qx{L96^E@{wS8YiWP|U%S@?*uvPOCy&N7k>Ly;isA@^iwoG4MQ zM6UV!(tOa%Cs8*(Rz;uPK1XD_=#q8LB6;04qs6|PLlmeH0u?qQZCum8D^W{X!lp4PR?DLyAhjzu^n%U?O4`Le7tk&Yj&mbIW8G#N-$!gJ| z#!kiRL)*8(vAzX0$*x#r1lK|hJvU;E-{~37m7bLLI<%B+7QFw{vuR4XnTc-#P;%|J z3GYXAvM{P{RESR~-PS}VJGKyv{XG0p@kNbR@m8!E*}jR05ga2t9*@i`$26rS;y$e+ zCe=MWljd$}JgQrj-jI{y&}%W#mdAsd5mbfZj-aX1t7GzBm%mc1X}J|2P18e-9mA>Z zyuDlGB%B2{ouYyGP%aTGB{M}qa(mc9D2cb3hi-?p``2wYlUH*LLiPem`_I37E&FF2Mpq@w*xW;vf>1||*?1a9%)nHAKXk`vu#jezNuiVVm z?WU>6u@}XdzZ_QT!(jskC?X5a>Grp}oB5U_XX4id=~B6Bq2}Wuw^0se^6yagRw;(H zT_Lc_YU{5XIqI2Up%%Xq$+mg>S>&3{TQd296;SJMQ=f%4-K3pro4(B?|6I&7a%7P- zQLscR9Ogr=`W7+aIYtum3}>byBt#jeK?&et7BJ+~&Yuil#v?1t7J7}krMh3;-x&ml z$r>9NUi}(=_x!T_*T9gQ;X^Om$B;4qB*By;E8>u24?l=tijkLhhwath~3kDn4-+HS2izL5~7_yT;LU3rr{cz^NBv zeo)D8_ZKZc`45mID*+(H3MA0+5TT1N`BK>*{Di3h2s{nicAon!tw`!q%D8bQFA6Z2;nDXih&6{28m0?N4M`ygx z@M3L|EB@$#qrqB~K|ZrS(9uJG7)7VHWP`;gdw$-0o*e*HOvkj=9~RnmPdp6}#8D zMKcbU8hyDf91d$Y^)!@ZPV3)Ps1|__;PhGafQXDhlP%a0kyfb$Z(fcg$soFM9?_p9 ziU^0%Z1{08jV4rn!A>MZgiPURDz1yFg!?*jUP7Wye9WoK>S*7*oe57u#G#H$-rMZ( ztDLe7MvS>Bd+zGr#oa%@0n6oxhQ^BF5(FSv*5Q?<>l@YK+FMc*&&OD^nK*1x$%UDzN@v}`&48ILWK61_K+`RsZ_F5Mgi$Jy8je@xlU=rcw!CItVd zw)6gmKCT$S_ZZPA!XKPtFxChP-Vx^=Yf?$098k;MzaCutrPW&_L(WIc#A_gSD5RL` z=6j~Lcv;uMW=v2u$KzBf{d9NqAtPt6N+oF_K66e{iEqdQcLOpCGEf}SLqLjN2j5vi z9l1>5()~3pwpmk6%seDT^Tts48&i8jAnr~Q;P<^-FzJd0r5?n-UJu_s;}|V^GsLPN zTm7}Udz@2msl^_al&xD7XA8B!-kUOk2^ch(PB@33?;Bl9!cu8x^&Xm*`jvkYrYwd~w!Sh(x>|(gVHe+eAq6#zgVhsX9i}eNF(d@&nN*?T zFNYFl{R(1ly`cq}J4>>V9A>^vYHA8m@$(+y02c!1Yu3~^$wzgjm#sfx{#yM_<5eG9 z=45iFo`;c^MEz{$h^LG4bSmw{q(#?<5?DtTpUkMM2N6mq;#>i8Iy^Y%#^wA+q@1DnZ5yf>yYl)7>d19>Jxi-<0 z4uurGped4^K>TBYA_&Uua@y3%au9@A)n&Kqfrd22Ad;Q5=2q1k6rBp@{&rTnb)0va z!AHz87&PZ9Ekxjl$2=spiSr{I9sShv{qLw36)qA)A*0Vx{F4`4FP`*A03Xx^$Udnj zpyJq0N_j(zkxcu4k#X&bY6i_|*s7mR zxh+HNVmCXoptR9HXVw|7%%>R4le&t8FYkV|qXLbg5m7^VP$IX1%dt5?t-I-m9S%8~ z==g-kRt?Eh6NAi+p4SwXr9WvCE^%)~P4h|PtagGTyTprre#XL?f(Y6Daw(g-)k-Es zkI~BoZn(z~?^dcQ3NomwT!PLOZZO%J95>}f{K?QO$XQs78`2Pgm>Ikk$i(@dcCjqb zP73LxBsuBw$8Jhdk*&xS+2C3Ume&JxbJoH<|hoVPM|E?!lz4C}dj4z9q~CQV|r*S8bIeOfR#p;~Dhu!a1S6vVwH zs;*uXS)UXngaumIUVM@K9n;s^D9nWw4Lv*4k>xil0b9VcbC|mfWQ>ISB?#~oS1?iu zqXp|O?S07(EC}vQOe8060MoRNW<~VWrv3#w-jWDsn1%57RcjN}wafE%n=?Ws-!X*4 zG#X}CX=b#tg@U}F?`m`@!kDH_dx%~F28t;LFrF~5NW^90x$6b$_~_nB`!y--$$V@p zI_2Lv*Pxpjfir?1im@dvOYvT?`@|NjEk020mqsA&tp3vR#VQz@ESrzXs<8&KsFik5 zd(RD)e6cF2;6lXyF#HvcHo=^O#;H_g@@MQ{K4)$~My!yQxfh)w9Mq)SOiFN?Nmf!I zgx@L>pxH)C%g0hm7itIe^OlSm7oR-Skyf*1h;-Avp*=*jMg5`8^ZG>@Mi&FLiTkC$iVSC1mT9qLZvozDvE>8NYo7<;MM9? zEP??2$&u))&*l{5dw5Z1Ip`UTh3`U1`@{d=dH&Hks?n8x8!kXgvS3R+*A^r0!IH|= z)gIC&ZVzr;`6_P;K-{yq#YI*{UhV%f8hQ1c5A-e6i%k-Ch3Ed*y6gDQo8fB${ttyIM;q5k(}b+^H7)d}KGkksXMFUEpKqT5t^ z<>Tk-!IJ#Z5isr|R!9`(?ztg{*O1bRfk`MN{Kmq&)XY>Cp{-tZ__&h|*n=f%as?8| zEPjjMw^+I1P;c!vPVLS~dHYwArpd0?Oznxj1N5C%Q72`Aw9V9#QGrYN_O?Bb-9WB+*)JF&B4-g zyg^TE)C?WL?3lZ+az93cl=ON+LHG=N0mE%U7zcW+z%pMz6ypr`mQM^3?!qbSx@W|~A+$a3p5;A+wmGsHtN{=%)HxaHbi z-I>4V6PiuRt=*hZX=*AeMF%$8BZP)WY*D%i-Mp?Q>aRIuP)izDZ`Id0uztZ6o@gL^ zC8N+xyXz~GHtvLvyePDgzntqcVjZaLi zZ&O`}LUlTT#8?(f_4DVT#CW0ERSuJ2{F{_j&Xw-gieu!dSKNO#^azT zMhpGll1*L}fry?{OZv)4yFI8ysf4|$<$4n66p6uH!l@X-;Wmw0kDhzwKGo;hz-haV zYYHMo-YrmDUKQuC(2ACCG`-7KGc(ksF7W|BSzbpEQCTru-aU*1p&@dvuOUxD%n_Fh z2J8A2)R!{13^8JMx?JS5SXDEcM3CAYqhNH8?yMnNSvuKKxIu6b?((UG`D;uO0azHf zY`t8hsh12kPe=2utn`KumY^Z#_9j`C20%Rm^h92KKs1nO4e?*hwWqKRl&{5GY8jxm zcm%M9REg6IAjk}n6~wVAR^G6ORK37C&5^Hqo%=72#IQ#@w|UB}wp85y&$$uXm{Tqn zZPFyvX&L2Hq2iB5vUo*!NAVAGkf-W7Ym|S^QC4Q!K4Fk4)wQ49Bt)63T-#`sp++EY zLRD{)-!}S+m0WQK%z9Pd*x`oFc)!LKZMHMSzh$b6pD;y(WHrQJ8(rHb7zN`^yIgaS z`FfGTN?YN6&(6XEj?}fmQp1)*d3H5I+?O)lZk8N!aH-SwsK;lRy_Lu7a8wkL z>wF}mwe~?0uQLqyAY1;drv3_YQymms63qlsKjPGo6fG56iHT^LmJnzg0$)sFh5t>k zL*zvF97L0SkR|?`@QQ%|)sktLscP{8pE^2|1bDu3MtkKrR3TP#z{n~$wTOGEG=y+w zu4xM=$pBG~M(y}Y7-%SJgzD=D-kPG=&RNA%-Si;l6_+@KkvTl1%+2 z4p9(Kq~!I1>j_%YzH^A>u-z)4#tahd)eUf!E6>2Wyop4RE1A?4(ji2+wxdn<30+hn z4zuZkal}AeJ5eF39IhM$^E}@V=#G8+SZzjLL_747#5-e)^bnH@lrd?1S(ue-L86xl zR*7OvlW4!4M(HBgcSbx(V^n94q)3lTcVc=KqvJ3R(9SBtR-9&({m>>o>&IsEqt5?# zuLb(;%F*{`4Si-?08r6=DQqwB4 zwDwKi`yKhoUh8$3iI>*o^z*_)US4`Xm1c`3vpt7Zky?pO#b{n(ahZAmhKS6VtiSWG{L)A6BUk=U z{zouxEvg63$>~7K$(BOl*}Fd~VG|(UwLLOgQhS`2BfXiuoSA~DUHm2zpH!=k=`Q|b z%`aXH2YoQHO(@M_M@eiG_0EghOvF4EyOJ`G}Rw!88$c zQ41F}Im_S8lI;C0k@k{&_oC%-)30|*65y1}Gg|#bh?}A1Hi4|<#0B~VvXzu`C06P= zTsrr0NAvzkwtrWeOq{iOiebIVe)FD9@sT9XvbJ3(4!+_fta}`7Y@*9MeeDD*QF!M* zm0U}W9#0=w!BxTFFYM`eIiK1ZN}0C_@@Pe>Q-#6b^NHHLRXKYS^sDPo-FDcJsCJX; zgtbWA%1+uqzU+Rv+QJpORp^1;iB%Tsv5>iDU#R<)+Mc;hq?OoW zagQMyg_h3jm|9MSQjtf$7NwTSM`oG$foCcIKPsc6B7Yu{J+uDnW;+H>uTLDd@;`d} zbp|B=zSgl*o~RyjBjGi8a(0473u;!!RFxU)Lro``)Z=eOM_v&@`C{1oznQ&ly*Y*CUv@8p5&gaq?(sto42KMk?9JfLEz7>uNrG7Uo)T&JmRrtF(I&;BlTdNvcjnANBj56Gb1(AyF zjoxvz!{!hLf#+ISsr-fx*zL#)K>;nlav5|{5>!><^@v04|JhA5BH^&26~W=H8F(Hh zm?aU&4auXnQtlWLh2$<@63ij{(!n|^!YE8siCtL>Qq#diw?Bz9H1naMMp*H<)aR_n z$88K=7>O#WPmVYVbwDa!n@JM!4~>;tceT)-@u~@W*lZE_yd0vzF$=5oS<~aZ_obG1 zoHEa8vNi>^Xu1uq&4)1GLW1LD4Ea_|BOIq^z=Vidbnuq`E|E%1*ne>xx|GXe&fg`Y zi&u#qukiyv2AF5)O4qXDP<_qW_wf?DJ6GEfL8~Mu%feWV#EK*Gj$=d1ZXj6o^KCbk zmUlCy*@u^28uvuCH|v;^V|>NtBuh$?JL3BC8~)$)<_OGitxon4@jPxxIH&f@`Wl2ti9o4-72;=V=Z z$37$n+kE{})5Fgdx0S;z6+7?u#c&LIO?wn+666Y017Yg%Y@OVyS{wAR+@ zIw>PKH1tu;@fhh5uei31St5dBoy{(E#J0gbO;0}9hBa zqaDLDkft#-Jjug)o%tG};;4rcqMnSli0hYkpDtB{9db!%2bOB~(a5GWu2)S=Lu>Pv zlxEZQ4iH@4e3Mm(7^n$tsQGje$pA=F^KbGWJ1QB-&WWhz|Yt`Ur~}rA=cBD(}hH1fociyO%_w+uo5CHHv77O$?ER zSq6`+m$D~z>t)2H($4#qVLK0U$&(xvVifgMBR>gmCQ!O!NV1BaeqAr%@p!YPuh7No zg~y+iRnkP7LK$rLTUcQXiasV)Q4GbhhibcY1k<}HnYQ=5)i5-u;NU7AxhIP?P1od z7cJLhBwtwBEKxgOhs=-AT@I?1?MlPQl$B;4T`tB+|FlNGT%npz)S$GZR_gVor1>j~ zd46VY=B^!{22mSIf_fWlPI4ug2$eoe9=wa}4V!j4C75uUW?}ULkLP}tlS{@1;8lD* zF#@&;OWy<+F5S*}Xl0u;T(5qnef3TNKnOqSBF%Y7+Nn2$F)gGiPQQH-B4OyDbkJMQ zMN6O3+E~Y(8Up$1Lik2;M4B4x2V|a-#X4`Ki-3`S+IF zwpcBg%pvID`|HdjRVePz$0y9o{#+~*oy*N)-Jxe3Po68M!z#iEnn^qkQ(oP^v18I=q%C>>;X?0;sgRW%BK>cO6PsSte*S znlspWx#6fLk5-#Iwggg86a;|65&*mEC zc2=dFD2oX2TL^;of=PH%O&Avo@SaVR^yI4|Y<0QL^V}=C$iD8oJgqK*@31_v3DxgH z$dDl$P(DIij8D?Gagy;x>9aZHq^&$eKAjb_-cX$Q7EmGvon}M{i81IbBhdzZyR5m$ zBLX}!Rt&`Ov!lfYjToFJWNU>0Wk1Ls+1_BrW-ApJ9JYv4oi~dXUlMn|hmd+|Pb7zO!yjMhOC?f<`2T9Fk=#A`t_M!%h*7`iwm z%z{gn+1hE&a_Y+;B914@cwnulg_@r#&UI)w2GfTwHgxd&O3AL8vs z^M(*;F-of2m3ep^W53Hy~ zeJn`eC=)r!#T066gF#mAB>|}ik*^H_GTR@5sZt|IYiYw6N)m;e+g)lF zuvmx*nxPJ|kx%GyzIp3a$^;Hzyjmy@-}i$o+z-hg;7&X^!aTb-j`D2`F!KBmMs^TH zrxkDAIj%EEGKkF_OXTRlXmRxr2##OavX)6SUxCAu@gmrf$8;)us)*dQfOr^79TX>X z;3JUAb9va~2ENoRZCPMFvKZBBojKv;IK+UlG=)<) zY^B#Xo#4uw2!iAUFomTp#rRGIsUKi9-bg_NKTM$_&|tNCRHDcj2#C_OHVKlc*e8Kn z5Wz$U@Hv2LloX^e*Cj+9iYo&EL;@5EfQ=9bh)fMoHKEe)$U!ime*pz@pCBD?PoV4WVF?V)|MHUX z-cEjz7o2Yz;+C6GT{b|mtl=Q%iYIB3gQ;u=tn#^RMIghi?A9POl}P~{*0dY6A}zL{ z>I=~}Zz;CE(?c9EQ#;~yq^=c084z~CJm1pZd?PWLa|G!YGFXD7C`(cvfUt#xUv`Q- zZ&G#cAp+<@w_cbSWaa01+s0)852PoW3gX-XKI*GZ5oNo#Y^XXR3fp^qoT+e@-~i; z1UW`il%TO$1Z16AH-EfRrrUh1fK_^^P>o;W8&^%O+utCM3*M6x1mTAir)#liFwu!* z@J#3MrjA4n?xC*8IE~^fD%cstSb5nHW*ej2RGs+SPO5qluT*!b`>p6eln+HC+>c>8 zE=XeOgg%0xwPnz{YE`Jv&w84Gj9O>Y8L8hJ7t44!i7OJ(ZFassq%R9Xn{-5tiUtg5 zMlD4)=M~faW=%J_(_(4C{QRj75nLdN zLk=t#I`H&K_Vu7iN(?nH*Bd)?>S9Q*&D5OOpCeVtVGyi0W>tw{#1c_K5a&|P?}_|| z(vTwgCk?iN97L(gGo~Je!KB6wgAk9}FjOuD;M&Y6LGj=Uee1DzZfUp7^mz6Vf<1M- zImVo?afXKhXctshc(_n^L^2Y!^>qA1xpR@VNZ@>qF%+tUi0)II`HIG^#X+!;s}*!A zfFib5$44imz-pv zxxIqarCFECj$y3jE_BTxFHsDt!PH_Bi_@Qo8wPJ>!R8r^{tLx@(o<(J(E=S15QKhq zb&O_)c&=Uj+KR5C=Kx9(iDxkw%*qLJhWm}C$e`$ZuG*OD^}5A!kl^$$q>g5T%Dl&# zh2j{;mAo>;05ebD;!JUq>vevy^iwWPyzoe>Nhd7W#A^y{%51f3W7MNc5r%syUZ=be zc2QvQ6M0aHjX0%SohghLzNB@#OI=gp@+A%F9{&AUqQvVe?9+vw4r@L0W>b)+nHuob z*;)}u^rXRFRkt{phXt-6Ksw*QAz~W5-r`N)e!%O~NeeSYGjw12w3bj|9mMBh=w3w6 z*QUtN1J053LZaI1H|TNXj!vMhgjsZn8UNK>6@#;nhj{Sm?kTh+XU9%=QhmvUhi1tj zUh6!AEaOKUSj4TMoLhIm+oG`lod;uyF5D-A{1D}#A1&f$psByZVLp1Rvek1c(X)jFxUYOH?Eitf=%tl-j9b7^#0r2JHjC-)#~ddx_+Q z-BD`?CZ$Yj)oJ9RvWzlO<Ki!zu+oisceE zWl~923L=(eCL48AR|~z_R&S4#sCQyn#cYl?;`&fL=bf&Q$s8x=@lMgB(i=}3_awwq z6A1OTC*#zY);!D+HzevU$7iOFCNG_O%(=*KQC(DhOuZ&+%La{X3A#y{60r3JP!+eQ z7%ODadL?zjt)zs-8}j~UWvt;wrxzQDwMGSYt$s15sNO|Q-0fD044&zRYE<`-n+H5q z!o9N$7}g*qoUvOzH4dsR8-bGM&Zt8H6$Dr|z;bT^awR-h=RSUj{uuZcS$aW#Wvw|j zK3p_TGmcFX3NVY<*PDs~K&YA_#Is74xVzcA6q6|>%*6Ex# za>&1l!(Y7$u!x6cLM_hp?c$+|D=0WiTJGzKQQ`q7nE`U`q_^jm_S>UpD$>2|M0fOK zDxyP`9;na!!)L^7t`;Y$MQ+OlYm9;dt8oQ64IUQt+8Tv4kL)uO0cYHVsb&0}ObQWh z77=na0e28wAs*GRuJhE1p+20*<jYl zc%(UGcT}5rZ$#=~rKkncQ_=e^ld6vC%z>l-&qDHRS3^AL@6`;VayNnB1e znwm{5=!-ompUEv*y50RENsZS;FPuFW;D_pq(l;%IKqbfwmz0a%qy9F+1h}G0=Cy(P zQW5fGv6OKFLr94v@%(P*Em}&%2cgaDmP3~xTnde1fr-E}DR;2R>zhvsZ&BKKLPPFg zk$A0+iwjoamDHvOozF#^lBu{7dLxCmYgd%9MI_{kKa8#fB_l6HeG#V3xI!LDNfM)B zU5@)xXDMlweb+7pXl+Po9&-)520$SN1$bf`cC9*;^V)i>&N#TNyh+}EW$o!FPS1nY z!R1^KGNrpyeH|Hf*jDgXBL=J@#zuVr?5p)yQun#mZIL@%OVO9GOdZ;n_|~ouHbp^G z9t!zkS0<{dK#G`CK>M1*z6wQ- zDneK%D=!4Ux<#`mk5)zii}q2=UGS!zRW>DNBx%&(Wk zE`ocRUyt($Ba53-B-)ZXR;+rsT8p+;3m=%5_(*Gz5yYq{k) zKBf^n=AG`L^rHDid|>`5j~(Bcr!jo2kfM;C41pF;plbev&izo znET$_tBSK?D!hUSV}Pj?MtAgyJ16DGfX5I-Qo2~w78FpBgW|EFXJ;{=zohtYGxec{ zF_3W9evpO73}H%H>zS*P2~Kg--&MilTavsFne+W}{q7pxMmS|m!>ta{2wl7CUp6{t zSGG{LOiNe$4rb75=(R8fHIF^$55TXff0P21=Qy_V2w;YJG?Bq_CWLWz=!bs}W{D07Io~GK3dQOANHdHkK|LLVph*!*RHZj3 z>dhCS;_Pl3d&`t!je+t*q5G3vJ~Z^0f+dR2!xz)=J&S{FjALPJNzs26BEaD^i1T)= zJjlx}hBWLA_pU-{YkjUU9cR$)@TzJ7AQ9_|fgCGuIb$oE1mvnq$iLh2?g$r6i4>7% zD9h$_g5w0rn%%hA_=uwruAdeZX+uI*N}`m{xqM4}W2{Yt@@7@wtsQYOD}M$qjVNgF z{VWiK5+~p5^Y06PHDEPm=$%|v`R%{Oq=%8SnnL(V33*;?wRk7gu9sz~eHtzTy?x&f z7;s&PJoc%%;iW&(V8P2?kb{YA8?E}6GBM~E9EYr#%Gaoxj3?k!fb(Y zwgS+2wp8?S=L%hnnj$w5NPyN_#?zqBHc)Q5lVYxkZ3>mXPGgsUrie9x1VYwLgy3%F zXy>su7)N6G&in_%WU41byvM0a@fl^svogcQ=2by#Ai>;T6>aBmZAyO>-Cbp?#A5Yo z(KQJK4VNnK9sVS!TAyTX!ZH`;?F!WdbLd!5ub}6OjO#qI>P^+eVaxLYk3Q3(AvbXn zq${Hia2eJf+_b-?2#X6c7Ko6q2v=?MWwT=9E?Bl*VC3E&Z2*ItJHMgx7BzjPgGaJ% zpRgeV+?i)m%m~_^9KlIy`%;_gBATt)LR}9DDf2@U6qVtqmMpi;HT;_=WQ7bMgtJc( zS9p17-}R{yW&qvs5lc8LpG6!^(N+WUA#Z0l`^F$UzIB{_jzg}FZ=vRFPgrEJ2?~Q8 z5dBjT=Bm6sL}UX zZ{K^No|s9!>)C&1PYm{et0|L@Kkp@WidD}}EW4h&L5p4oZ(E(H~dS zqnr>!WadJI6WHvesZN*8yqFWLSuhzRb$|1E?|;=Hd|&fKD-G=7eNRA_eKp33K!%8o zNmNFsD{*$CY)ujbnw8{ZtFoVAuc3DN4l&;;$3Aw;$R+=>=t?u?_^TW*dJ9vIh>pSum$4@ZQ^Jv;l_ip_XGm*LBBu#S;oViQ@~PVp zWtL+6r6KE{1jLegvQa^48A^VRBtB1aW;=Z1R_?PV2%xUTk!stcq^n;!; z^xA2?Tar)I_~H;wnH8w3rM2i)kDWzAMEBEoHpnN!2^^eGwH26eM|tAakmSm2|5D=5 z62%0$yfm$1=4|fjGmQM}rsqgbh?T_fAzd-ySjognEJ!TT&o}guA*qi_P~oCWV~qN; zr{P{IYRaU46eRFKqBQ|Li<~`6dc4gpv2x>}r zkG6(g0YKG8#A;vg@hWg@cSL&t41N466M@U7Fe8=qlU*w z+~QWq#kP&pp7Y`E-pxhO#*qSUg{?E)vv*69od=nY%UHeYK#GRNdm-xCy4H1JGj8>b z9o~d&*{VoG7S5JGL{pDiO;MM#+~dD*?4!QQ1h67yMwB89)InKI4M0j6&%DxxBji;l zA!Aw;U_%N1K+_E=5MQ8EpN?)WKjdgnMr09;u)v$^#dP9WB$Xtgehlg9rU}~26X|Mk z)gs|i6s~N*CnO$;MVOzmk|9ewa2KQuzKOuJW*G5YcLjeSnH2F*5@jh5_lJu(WhbK1o)maQk-V3@!0Ksc&+VjsmS7x=GR_h(gwn;avjudD|Y+ z7;`Qt-#u|aj(5D&$Gqi@wp>EPrYS~l-7lf@Yr#!3J1yHqb+#JxY1SMc`j;LG^z721HA3upBvb#SIny2#2hkyT0tv(|DS>Ks zWNT4#6W+Cq^YBo^kYyVZMyHYQW2uy*l%;tCKJDp~KpyKQZ^}HWi0vUnhU_S<8we2A z@Am-`ZEEW_ASdu)n)mB}n{tDeYiwmqNv5<_I4!BR;HROMbFUOtV}bK9XIk5LkP5xx zIISFm&nFEb&k-;~%ghYqDG1iJaAn;>IAzncocfkEM^aGPI6)NULWLfKpG=O$Dz^51 z9N6f~(YTQ8j`qoCc#CL>sF412ehvG=zCv91`$nBs-__tCP z6s)!oj^Px0MEuP(2*`+_rx^NXFD;F%=ml_03VL-qd&+rtcg5j;1t9_;vsy)k*2`X9 zlLp=CD$wjZQPp*mXtmo@`ayVZeK6rFo#;~wbwws*5161jx`5ha>6rDnpHIaN6CaJ+NU-6TbR}!_Y>E@|SBYwqTts&+M9I3BD>KHr| zG-;m)ID|i?gx@4r791w(9HlWr)}H!ulP3U!)5S@ISRiJ)0!~S6lwI5`({83z8Fg8g zOiLB4W7a!~CrDx<(ppO5{9E_<1c0$y;l6@{Vd;piGJsWBYqH|}q`X29oGq;Slu*Ys zQX+zc`2NSC;PEh`YQewKkqZj3j)v9>k!D3oYFxYTG{GUhCu7_!2`Vv4!W zwmxPE6vF(O@n1w^gl;qo-zt)2_auS5>ZlxTqzvpR$wp71MmKXzK)1w5rc%_Pz6uk{ zQm@0BXowKosQN=NT{>T8t>i3^OvZp>?u_9DuE+4cbfXk!;z254(!l0y?ZXAlP}RSx zPkl1fh1cYVZS#!{t(I)mmMLL~v72w=nckN-YVv(>a~fUxRTot5q$HzC;j80DPRW9t zvSJF~r6ENT(ywfgH07$C(3D9MJf9bK0WDSD$;)~b#)AB^H9aNGzY}DLU{F4?a*U^u zu*2Cy@M2PvG?q$R%JX1SQn>O*?e8vZJBZ~YFN}SQW_4MzibP*w!Z-Bdoi{v6usJdC zf;*`M=&tHk2roY)#L4E~rIhFw!)`zV1ZUC-QCsm^lGU33pG}%gl79r_Xbh9yA28=A zgC_Yd6LfhKX70pp4Umt}Ltar>$W6Tp3kZ{m0k*v7OR`aVFVnG!K>Ch5Jc+EemRem+ zW#aHe%;%_iJN8AkB8xqGyZ)oGH<=ga)wyTXzdVyhSNoZ_KS|V4t@W$Z{y$f(>1FFk;r}5O|Xfxc6?8vG)=j0r@-pS9IMya2(h(W2Y9E_#9k&3exC2>pm28$S9 zOn=eo7pf(z`VU{_fcVtgazX7L-@zd+oe^?UG;g*kTJ!2c?-#x%O+C|~$-bN6rl0-? zrY^j1^epa!WUdkqz_TwqH`s!D$|F{&Z=4k#VER5BnH0?Agr?XOmZ&{nT8LOb36*^M zl`+8cQT@J;I1W;3Bfe=rUE+$r#flN&8~~v~C(J>lQ4Mu)r+&b~tAr55Oi>lS+)3&B7xV1%PX> zk~b0ff{pPulMj;vFS?DPeB_#{GYIW;TiJ~uizS5Pio5wlSr8e_&UrQISsB0VWt&M> z?9A%7*Hs2xQ%oLvKbzE1FA)f@@4O)%w{0ovmsVj9Y* zv?95Cxum{HuTOb$@Qf`Yc}cT|NtO*^xre4!K>#zAMte>pW_+=3=l%i|ZGt<}_0}{q zYZXkUWM``}Z(kWA10Y3blXVAh7PfjW{g1SC#_V3AYcvHAW4;`>xYM1qRO#-tgve;7 zIaSCwMH5Z>xQ>wskkZ;(sqf9dkfQZqqjzyOE2K# zjh)_?6r9FkF8l4*N|GE2Z7l*GGLr2y>Ydo51v)2RF!rT&Hi6B}ub;$PUo>G*Onogi z$VF|y*oqy3u;n}0mt(6mQoHNy{9+r=8EsY^G4kV&>S~KP)j@mSM-J&sGqO=lIN5 z>aWvAk+8aP>{CG0g{potsiZVVc+lK&E8B-Kp6NhFTkua*=*Sq6kf1U>GdoOF?^qsXnRqAbk7ffA6Y{1Su+R7WCewC4zCJ!L`MkoJ-ToL?Kau?CNp zPDgfC+bB+3nlN0X6hbBD3{D04J6LfQB_7m^I%t}Jil!M%4&q%^C`V~y*s99c;8UU0 zsvaMN6Db2yCS9R-s0cTV&wmF!7G$leazNo5u6ZCEf%9CG;p3edBe$PiA*OzB2jj4zsj55JQGCZm={bAR+~&=%ItB2vvqJFGh=NsFp3BMWxL7I} z`bI#{m1{?ewdbvhQ&&MS1iumP1T4=6I99=pz67Z`4WCjTC~4s<1ha8-0^&vta4P-@ILy5GuA=sC+P&Eg zVz>wL@}ceupa*HQ};RP<;xgl_YPN{1d}+7V!pPA*MjuKj^|@aY(RcjmS@P zkUE0g%!psRr7R%L$Bcj9F&-_J;kiC|p;^)g5c!60fN}Llm=y3P>~($vAP87Q&G4@# zHAg6C(RG?WPQO5>(_}(UT!s>sJHG)mFMg1QDwaNEv||G#LB-dM90UR#B}WMjEN=y9 zx`GmW2*8fj#DcG4$XqH80)(M;|M*!LGWAXweix+`Y!ku|tqvCsSq<9e9M#BbiuUsH zwrv-~r2U404Bar1(}p_M&Zkc?ZWu!ippD4Cy0XP6pQ~6s(oth($lG$7aY|2ghVbOj z#i1-oVuiuZ;yuAeGl(%^4Ed2WVR7@KSSF%g7q=dKznrwi%lYHIbnsG9wT(9sulIe9ArGMadtm zZP3ByMy3@S3On8fXhAc@GkxTpCTcT8_syJ7a=PyQ(S?F^qQ@;V$^9O>^LjJaa$p(i zGNZOh5vMz@OTcEY zJ7`tB>Jffma49#zN-ay{x>9!Rx|6g!XMU7^%N(}#~RWm>}-IsXxaM{l2lQ5!Qp z#EuGnA)9SX8~Sd{itkI5=@Gc^0W~@BTatjhF_HF`q9vR_f(WZeND&S0Jr3H8Bo8B~y;0jetGJP${gqjOH_#$wVCbYnY#F1) zUBMv05(9$zkTSJ8--a}iA?LnO5ao8D#$`%QEiDA5bK&-bo^@3 z*`jY6N`X}pHPfbe#AtfbCg_|ytV|pP+VsW1*NfAjh=o3hi zak(Dy%b4YqG(ed#E|`76TO{rj#p&4Slywt1`$rTjcly6)#Le5pDBKtc!fM?KHgWhq z$taV)q(t!F-Hce*-;s_YQD66^3!!|a7JZS#S2cV)#n1EhHH7=6deFZt>5U86U2IrV zDy%SCQpH$q>YfGRLc{nv(l5}GHC@-?{u)N~wH6H?wjTkGO}kbzHcyimm0Y zPl!q9jGsff1H8vzh+?TjTJ-EhwPXG+0wo(FvmW@Bgf#S{rVP{Af4(w?_&7`Kv&8(* ztlv+I0zFG-6!L4n28;I2I2Q$Bn;myuQF~spXXDzbZ;H6BF$D8=zWNnr^;Q0M5;P*g zbht|T{MB;QK=k5}QjK3RF5a)$@kBj2q7*fWmQlEx zJI#W>6yw8-K{}XdmIBT7grZMcmXVrQ?dPu4iT%)3qejNCV6GB$IPfdeN6;?G`CDZM z&?DWZz^+pnPEn1CG6D`6az}mnE{_(WP7=u$x^QhxC&!z z-AC+*Bp+oUiiic56)Jh_))EwS0Wp1YBC56#QJ?>K3l`MIvP%n`?-_aVZ${vT{Z5pW zk=96}m!Zwe>l^TyfqO9Ga_jM#)QfO$Y_31OL=agSEvSV+zbPD2`g*9=S+2C_WEwbA zOLNK*6Q&E96Scs`yPe@Sm>6_?>cb|IN~-RHN{YaR9+DH~A|_hi)vcgHR`$rOuIkxI z)%H0cpOkZiVG#&VwkgBz71Z>v6oCLMTA>ONgwk9s{?-(P^~V1~xilj*i5Sw=vkD3h zA;(&$qY-XF;3eOG5~NMLBM00d0wK&eyVsP_{f(G>NZ#!CW>|5&6U06>=W$5`s95#u zH;5s|t2laws-$k%;3Cur0{A)ZJqr}kF(gkI^~45IVo=`WL`CT&xnGov;q)O@JNb$g zW<=JxUGP=Ys)bcg)0ley!9$Ke3ciL%LF^QWmIFcA&-% zmnk~cGN!GLLX)(ywA+@mYT?Cc3dvWyB`SYfV?rU8C{K>mK`?TQ!8kF|JO-Fb{;*~} z8yh>Ts2Fz^csArn&Ia^k;*)3ky#$RH1JR|TQ3!~J0W9mQ=n>Q%FSiFD_rr9-O)T#c z*-Dx#O*9T=ai`{`>Td1Mq|8-vGGFgO7|chrIf2Nr|&P(^!nC_H3DNVW2A z7#mg3@NedvKJc0`uYl}@6#%jd>)-hY5 zQRyH^m+Y<8vL2R3U^EP(3|)wgT)ZSIOf~^7!IMIE6npCO#pa25GjvhdOy(iL%Ce<+ zKnV%QKvfyO$B2pq7!Ea{LEa0Gh`tPpF0OQurm<7Q%GV-xHF&qxG78um#OdpImQPo>O%?%}6oCSngxV;?h@wqeBO)qvI3x0Di{v#J zjzxqL5nWy(1p}m4|3V;C3KT&ao9O7W)I*S5*27Fr#RlId4X@dn3_50365$>^;toxl z!gM$x?GeF7ET85i7zI%FhlnzghilGdak8@Wr%0nIQk>YW>nhqt1#;dLwXkC>rtr)R z9KcMjc(Q;-q_I_ft7SZ(iHII!dSB_;1MXauAoGy?bx22`ZdpBJ%W}z)!75p#cyEew zQn5ovbw*N%TRhAR3+`74OL|KYhLsD6z(&1;n^*|9PcSQl#mY6r)i}P z1KK7rkeHAr5HTVroMN7Q>CzomtT#-!`>s2~&G1Z#CwCt%(^e(^l1fiem9H@CUMTkI zG68WTazyB|z+g;%N!|!-D_lh--H>3pr={T-g#!kJ*;>!7XlW%bnGH zd+XiKWBD24tW2{L#T^QWz4D=EzRa>Ctg9KtZFxm)-!TnW8+k}|NBp!pPIy$YgE}b3 zNTbUCt~`~>HQ>L`tz{>-hfo^lQUvxHtZd|L0}xe zdAL0(LLftSNi(`y`p4*B(;z!ZUl8&*YC-&a4D$ZQ*{oDeJT`!?D9B}5F#KxEjde+P z(S{(k9SYru;3SQmWthvjk09-re;ZE%i|bjRYf-Ib?bgUM7f`vA)AYX*w2VdHKvXVT z#F@}uu#a+{FR6ovv2Y!SQ@4U8O0JvYoSN>LE^>oY$|{Op`aS7Yoh!0pm~co7M6!)s zNWq3}jwOyd3nB{2*dj+q`mJRnXGg<+=i8GuNLw66+A|Z%X4%Ii618wmh&`UcU~_Jqy>93C%b}DqS^&Z@9Hmz+Xo$40Bfe`*3Roe-uW6FG-ou z?UU#5t*Ue3-tA1t_jKPD#~fG$sEDriCZ&1CMTlJu&P$UCYYIl*2)a&(+)9H4V_!iM zn=g@kaET#?6f8P4G4p&eB8J#f8Fn1K-2WJ~v(8)8GNH8c-UWxI3z8aMMJYB*3*k5? zp4jRG7#rpIN6aj+CsChyD%yKXZ7v3Z-dZOUkzhB*vmm@#H5!jkZjd-j7@l2`lSJxx-sbdTLcF?KS^`tKa+$?31%40!jOY!e zW~b_tJ9J^tte|bu-(Dp`wlHDBJp}y?hlqYweH9a!f%YV0r@N)2)0)~09X1r^I{B3_ zl+7C9uxyU`kUa-2l4OSVD1mm^k|0xry=4u9f9H9I)f+JhyrvgCFVmPF?-mpynfnw{ z5)cAr4~VKA@wWsSS0!Xwr~2dCw0wo4l4fSoPJN;v+=XR>bcur<)%d>yK^j3020qkm z4|t`|IW}d`Kx4zSk}Do_dVk+`lPnNYH0xW=vsi=A@8nsSB&jT<*P^PzqI`N2$8R&r zVegN@X(#Zi%{yjhf67e}ZdLt5HBD=@A0Jh#Y%u?qUmLX85#jkr+m`Ak%Tez1zNOFJNhyp*((QHyUs@*N8{L3gr^yyEwY87z6 zbtW#7*FYtW9sJ(K3S@9ft_C!^RS;7iDKpQPyf6_uGhy3!5Z0|Y z(xd!jTWn7CaRUeUS_)`EOt-8o@^uwh9_fr;7}bgODWBR_=xM*Bq&4z^z}tQyXfG8R zpD@@8blFV^ZU@wv-qLTgMRcD{qqsB5jNwpSbIma{Hazju$Tfzg-h2(|uPOUFq3vpR zB0zSvaZ9aqEZa5~3AGaB*wVJLHB%f`*oF$CF2*?Wi~c`A0SGf}_{G(?lV znvNd*3FsIE$~aQ~#lUCE>wwAH-efk6YbRdPY@spa&$-;QRSN%HP?(8+^xNNssT($} zfy!B0l}z2uXhUn^e=OJv<|yziiJl)J{mVVd0y0nvR}bZCj;Bl(b{E%$k(0KiQwsWw z{Aqehbon{toZ=amYDxQD8Zmkq@Xsp)Cs>M6Pu49nq?z1;oOWZPwyozY>j2$BwWJ-k zzPj%NBhv;ke>0~dyoUKz0;RWE4bpb#l6aSsmx@nLS=6+0NTj;IbL ztUz4}<1WyAkFWi-n1qdCK#<=%S>eK->&Rqo!Q|JlIF6k9Cr8;&WqpbaXAVf&V{k*J zfqxeTUC7j@|$%R2=QDZo=GDNyV0@7!-?1rCiv2f8B7BNd6`1;$M z6r#d_jfVuPH-aK^3GpRbdtK&U>Qa(72#5(CGf0QH8eWdH^u%AR20(zgE^&BWBlB~F zp;7BcWW||8CC4!Sx ztb;-FbrKyiq}1uFrSG+2Kee00p_r#Cn(Rt7-%3lR1-V?3r23@|LRFfv*dvOeeV(Ar zTk>1iQGUfAo#xR8d%K!`?hdq#OKa^r$0J#rK`wI+PYr^sV|!025E^BqRNLy~55?}n zlxQOXPZPX*X*5o`&%clLO7l3_IeQsjA(){lJ@2gCRu!=aXD5Xwc(@4Z!yiJZT$4(o{7*G}n6%7)M5Cjft3UlTn&%r{7UatBA z?CxbSJQM*5!2E4ty)yc<5Dc$t9(!*;tesfUd?~L|zI%Diw9L0HuIk;grAZ46m18A+ zv17#&2zIc7X6uYH!RyTk;fzJK>n;HZi0JO>xlc0X)R4jLs5=s0R@+6Z3x=oQ1@Q@h z4%e{)Gs}vqigHIU3ThdZf0>C-lLHsEjH`u%*v#GG%p|EuycwNt$TCB>W~%11dHTtt8J zuTOewXI{5G;b05F1YvID;49grSgK+guJJ=IC{7Np=hV>l73A75I}ZFO#DZ=zx1`g{ zE~?hK+%py^u=2GPqD+*h3Yz)uoKIr3LZ-Z1y7;ImX>4ouuavbEhEbxY@XBZ6NF}7q z4dUzII0Dm_5{9jPcFV5bCO&6=rGHOfr$qrdMO019mAUx}5X@bgL2o=@wk*lcfOSVz zLb53)fPez-5VIJm9E@86(0v+J0Wdo}V^USvFB}BMJH%U5Iotxbi1m<&axM6y7_A zJjA4LFUNX6G1I`PsVVnPU#y_Q_z8vO;4K!}Zk`p~EU(*_b3?Ot<}nS!?2;xzYcMN^ zdNDy`whUH(vy_or;F`}~$g8_=&DC58I7mOfiO0tCHF&b92^UbxH*dx&Y%{@uwf=n@T)*yVr3&$5uYl8 zk<&l1kziJs`O1W?AkzJ7h5C@K8mo^k!lh+@sSWne*YgQRlNf<;Hd2SshI6)BazwCu zmxpB!C5VZ`WA`irwW`YyMe$`Xj~8K{c#usp1%vOQ(&UYEFk}w5XNavTr-2d7WgK*p z{b=%jpf`C{X;A-rQF4!bj|we^*;W$GicYUf&}EXrCa9ti$e#n>KE`R&6P8?1f-%4P znTsVZI-d7E?auPkjvx%|Z9Gy%tiQ)YB5>yNZDLgZ#_q9Y#S*MR6H6oto+&87qStsv zHY;TQBXL*JyC;G%^R#6Z<*EqEG40!-NN1Ot;K3y)V{RhaFzTLfe>^z*Bq%B zD&GKkdxe7Hzh(F*)&~scL@FOt?E+hDVO^= zt>|k{eXrLuueWXz9lvCm$5NP(pimS5h!GvPqJm(rqJQ}(#Nt7L_ zC#@=umSVZ@&S@J}N_1p@rA3R~Pcqm3R0dv9r@Ar;Jx`VB@nmEZt!0iGjX}}V15{lx zR!o{7gI1RWUo}OBA1D)k=|`LzPweWtq#bKuk|}Jy(7#C1va4H5xaS+u@)yf<)S5 zsqi){P{7Vr+-wXY<(EL$H<1Yx?iBk`R%eQ)!b59>ilm%Si*Jwn=|p+Yq?NqWE-;N5Q&txYEKewqebn5>IthW8Z2+SqL!eVHKdtwxT$3S*d^C% zRx`j#mu#|ckJO%46ta#DdeF4aJ#(wy$%bsy+n1Ge?Mz~^y;7#cf+vxfl0L%jDYgbP5R*3DbWCods}nfptisW3 zTAQmJVUCv@eBa;TK$iQNlwz8~E7R6k2*UlTE6F`7srirIG~znu;g#0Ri+)$3Qifzn zV_bxw2ht9&AlQyJx~7-3yORb|RB1O}ZkZN@IW)X3?!ep#hfzsu9760*8#gCJkMjsw zH@ZzzK`z(HE#JM{RY?Bf8e%SiFj&h=uYE*KkDtLqy;~IpAgV{qi8e7DvV?6gj!zT{%xh;;&5JwZ8Zi}Y28EqpG#WZGgg4|u#m)^r`t?7=NSJ!WF zX3}K)?y^($Sr2tcE!Jn{GiPON2!w;Oh%oU~VFp3kxQc<;BME9}1nZ=HmF%_b`dBuz zMup-dHyEoUhfM5^g2IwePMcIpL#m9tFxAAhtdV*gDPeGxQ`S+Y@#|HUDw5Fk2R7}Q z3q2Jr#^x^SL>YfxFZle%M!kzbZ%+iZp}R>Mhi!i^&GgFKqdr3QQH1(?9J9}=TO#&oyF}d<+aq9+rO>%x zus2b)a(awhl}|XP-Q+iv5t;pobPE20MSpER%Ey@|)!j>Az~^y`=?QpwJ3CGTT#PYA zp2Fd9Ff@H)eG^tDE9j3Aq7t3^Pan?pQOk7_IndQGgna?`INENl+htb!VB~AMMv}QT z^c3CvD9Q@VG5pp;FMUc;mKr|lN*`Wz;;lFux}Ar|s#X8Q0yO|4Zpeae|2Vk^=6o(hRu505SIbu^JrUX2qvPr|BkLkr}Z`o5D3hI!dF!D^+axsL|Xp>g!)UDmNH)gTl zPjza`l~P2Twj7!<6=hqmKl{(pYTPS0g#Q~Q&1p!}QWr5is_CTAmb}9+4lv6Iw7W68 z`5J!*&FLf3_i{8;bxHr!ZK_7*h+UH`e9V&BND^T8?_~@k@Rt(vI?5%MQley1!YK=Q z@I~RNBBhFIZ_w%v^)W>h7ao6zdC)a&KWgCF`NevH_osl0Pp zJ=*kvT1{CWR}z9gveW#8qLU6{E|;Z|jydmHE-a9=CL*Cl)Wr3PDTr?sVk%_|WxF*D zPKd4$6>|lfYBwpg@GY3LZ!2$cTUq- zp~RnlVWyqaTGFK!Q+kx6-33k?a@DLZx-do=6&X;Z6t40OVxY*@78w*p_gxk!N18g_ z|BzChd1ZT&HwHzKk(>V0*8AoJ z#l$IV-m&neHUGkdv`Pss{FiGH1#R;XrW^jXukE6i-8{l)2=gl@vOt>tl=b7vTusKa z<8ZUdut_TBNnMr=to;nGmt=x^gj}-U@rf3WmxW!-#z|*@BI=fHDeOltOCsvhEu5Cl z+QDX-T17P^C7F`XJZ+>+I=5L|zBQ6q*nSHg&@jzwT4;|t`Lsq+?Ma7+TvG#LNcY8s zHcf|LB26aE*u9cx8)Je+cZ1FFwR$^HH~+f3B*aHvpiPS*dM&x*r1z8-Xh5Uhd-nGr zA`!y-@4BFj)?JM$8L!(opXS;E7g6gdb{f`Bos_u|vIh<>Z@+CmaR_`JHrEwSk`Bxi z=@y+fQ=a8G;gm3jW~iN#N`V!v%R@>s*giJElu5{0afu@*1vWw@ zR|XH8ru(m-Beub%8KU3&zD7JAkq5Vk#5}a4MLFnDd*z|ttdiE`k_qFdJiYCd1!NP>7nzJs7l6H%{lH8zc1@oIRSo+mpth+Xq{l zkYX%LXGJ2yUR2Du&CEFx|CIV#ka)U!c9PMDKE%Bj%*VFh7J~%FqM8O0 z0`5=+@5phfI*;?{q;) zYVFxdZl6?onNtZ9c&7BQN`d5+t?6KrFJ#e@YF^9I2KXJ;1e{Y=`dffx3^Bz_WcDbolH3+p{)^D*1Nec2KT|^*=xfYGZp#qkJ6J@PlinM&|68#z>`a<&x z5=hToD4pz;jPL)ermW~lI%0I5`GhLZ z!oSbSB{z^p+p(ZXnXAaDvfMU&%s6hEEaAkn8>!wIRFz1iJJuUs$E1=p(Q8idM6aT{ zKI<{lbjj68>wqw`KPt<^T=Lqvvk_3V&8LYHJK3+1CJhqSysq*fa2K#^4& z8kf!$8PuD%a7gA*dC`oLo4hw+;BV0T8WPl2ieLFESmZ}fFMVw5Dl#S^H$^!yBMX3u zp-u<6aGaF-12|KrTyaTc4Wlak;9&>)seejfN>`0fahI8#%K&MTLT@Y2QjpYsOp7hT zww|4;Er~=w_RoXj*WF~yJ#9F*_)@fWrcl2&zQ&@8gchotvau_|augjav`8yBC>!>n zGDf^rcdXS~KZIm#B{MuiCt?<_8A|G1oK#UnimS`(RBk-ACZEP`E@C|BS{3yXC8Bmp=XmM1!+*C+|26I!zGXUqnyQKWA${*oK`ut>js%- zx7O!AT)Eit^-01e)12x#8RQk0pJV^YFfHmSIae<&|B8X+RUk?fZUR#~yk!W#_8CDH zXqc`m2YG%r2#;0o!5~Jyz>hzUp`qoTjO#lZOKyr*-`iY~(|s1`j3HS`V&x(LMfH4M z?`gX*F6TAf?_5!XIFYscqJf~Xq;gDPjBLo+bmC`u8M>bgQtXnXak_SsH;OnL2DIz>+dwCFDn!V`` z^|H=#8&l!UbcOY-TMQjTbCXgM_w5KtzIJyrd5S?2*1NF2-&ty_$!1S)6HGalzzvJ{ zJTE-YWBQ__9j@lshtrEviQ2L{=RnnRa1kYs1;p~lm4^h`kOIvr!y5LzkcLR65)u@l zPk%@r#hk7>Dt}7hs-|J>jYfJE#ZYsJMBeQYHaQ{$u)Ofn>v_&bYidVAzMwgt@2hUA z8f2RjZKA!;=Y5faO<|A%T9@APxka&&z7Pmd>1y?|dM3jTZ11ERuRGAy zQluE8tS~Dtj(wWad!??Na6~H&-DNe3z06MhqF3~&6&)0E2#IS!kgmqnvvAR+X@PoR zl1XjX$g(QyX%cU__O7pEh)(3>>hPYy zNBepGi2O(X3;}`W8jZ>LjSlqTrCnwN8@??GTtY9w3L%^3)Gow1k}P#P6%%4^ov=8< zIZ}Av$>t`K&^0#)U#h1#yW|p@cG6ZMXAZaY9_V#xIm_ZqjiMcjlJI!>SFogyoUvB{ z;K>m|k!v2ubpGvVh4>Xz-b-W#ZwUK`en~%qrUYmSK-A8j3RVcyN>k{k!Kj9z0DE;U z5{qLExB{#Jd;%W~LI6&X0%3~+TtU_W6a$}oBwk&{6)5SkP{eBk6eVw~VN@|lr}7KP zIx=aeitB9=ip6mvI;H5;6cM<1;f5t(jW3Rf)f>5_VZ8|qcmiZ+Nj|FQzc%=jVil(S zuxSOFxtX&pJJI&7;&s|xtI+IBq$5E>6seCV2Wz?L2FbrB1$D^TG*N28Q(g71Cw|S) z_uBs=9T`wYpi)fbGWHHR$2~4=p{3lcFoRZ5>A&Vs9VK*qHHk8Rq&SjcK}k%8>w>j0 zet@GY7sWV(7q8BZuL;3rFAn3;dXH1y+XEsorH9;c{(J1$X=1Kww5?na^VUsfe=Ps8 zohnG!xRoZfR_>OtHoi@~Q+|GL>B#zTz~s19#Y~daJ!>ruk6%RuBYb2?rqhIpQ$}K| z0u6?iZpj&a3)z1!0W=cEc`?c2TC(QP;_`_NtxwXhSQ0ASQ%KBqYce1T0-Y;DRzirk zLWi{>^&0Z8B;x9-r%$VNjABb^1jK(OGQC zF`UG>zu1nYgd@v#NRJ3(Hh4$Ce5mHa7nLtUAtZZeMAMkD6pxP2mHt{91^lhLgOzDo zH>ACWCR8PQ5!L9sLXDB;y9xmgnya{*oFeUEa6SeZ$dB?n-G7Ep+pD&Tpmq);^^HJ# zd?ASGVq$)h8=YDvB<5k&Ffe`+%yNmDVG{F)h1vTCp}snj?-^{1p}p;J^%zI&ovG;b z+wbn-rtFql&#}wSoBNMEmHrOlQf9R#3CQz^M6jNVQ6#!YHSaTg+o$DDh?gCGy@`EX zJHo?@N~N}c?h1huCyIB(j6Ovw2b#EiR{edOv1PqT@g2_G{!2e~638u|HBdw2sYZ0m z3lgfEuZ$%&25YoxdZlBGzD!E%S8vs}?(R;w@Tdr)pY>&x{5oy?F`b`sw=@n{yEY_v zGCc|9RMHxL{~C;_C^UMcK(|Je!mcu!lWaD-OpL`1YXm+4~uk1vW%fBsXm!+^Tq5c zm#3()N?AM)L*OzTYXTl6gPu5&4eLOb=l$vUCA-+CsxnWZ)C|6D?#SY zK2S_F8f2=Rhw*AJiv9ZX#H*1am2+Cx^|ZWMh)M2Tw?Y)Bu&Z)X;8itv5UJ8j5zki; zq3LfBM{DRuRwl!8Fb!ykk%Aadq`n^4P}Uow#=s~@iV3{+XC2&)(w4=Pn6&>SRGjq& zj7Q7*JCXb)cQ)vQK2jUMAr46*iwv63oh%%V=(4~27#c9Sd%bVaAdN?Cf=Obc8RBs6Bx!1yap-Xd z$>R|$MY7u)ccIh*R>Y#xS2aA?9x9h|1+>bIe8ew2?q&7ess zIXD}5#XD^YLO0kOViehPtZ|ynSi&K4 z*kLI%NLtd4$`$@SA1yI;YO`*Pim{}K|E$bD32b}sFh<3QZ>Id>e3KywOv>=vu<)tA zDRmnEkAk-D<%uFTFE`}HTZKGqTrz}@YIgKWG6_eCpxeLdZrZ4-UNu)urW|IvpxaMR7;!&7E~-aMko07LJg0ciRp{&AL;s zs^yELReK|g!t=hH7~EEbg|Heu?N)~3Cm6Y6&bxRFt=A&px|LVHm8K?Fi%SIVT(o>y z3lE#(cKpmE|9RqQC~j@>WZf#q{G;qNDL$8J60d`qfGj~=K&kk8+ zr)HuzFLg@5)VrufD>dZLGuo>P4zfECL~#}@G8-WoS7mdH%ECbok~P|^!l_IzkGDCr zZlqeDeA=9bRx7c}1ClELAH}Z!OXkwPP)sgNr6*L(ikl9Gs7cQ{(F9yVqTy6DH-_O=GE70Yrp1V&QAO#8;0stQLt_(h-`M&4dat+Ca6@>B(RF69pI53cHd?5#XUXi+>4`&N-R137Q~L4d4`u;B=;zum{02zC_IdIN5sjKSWj_ z+i@&QW4Ii6p>jV#T}p6a40pIPIpr$3v_6ch2 zVn33E**$?e_<(T;;?-L^ne~ryc!X%$kOj)^bHHE##{xAa5QQ5d&bDlJa25mGyG5XZ z2sE0)#+;d!&av(7N7jq^0e$-}uq{hm1?>A!yfv5wQ7MewR@a;>BXFvXAd`fSb4tG| zN#4#6vc!zfHO-R*gkPy;w8T{x2*T-Lk=!a~gB4hdZVDps(ueDYFv&|MIuw!K@Z3GT zm~Cd^98BZ_o0W=)Ax-Lo6{ncAxiwAcA}(zL>|`5#qArr8p+G*F`w45JOcLzyjZ}#* zvn)?pz10keg_XG&MlTJ^{N|8w`3-@qT(Ba=Qb87&87T)aN|Xvfp?h_#*xINvF9Mgi z-eiq31gneEW998k>$e=83@;PSdYxL?u!?b3PEHsnI8E7s?9#b4sSMSEEKuW(B;z&Y z4KIWkIUh!u=Ge2E6!g5Bz*aJXr7}`7?VRy_3S<~ineRdNN{|E*lawrq>9R}rY+E4T zGI54cSTA&vMAK>}0>FvlkxNC5exP_*nRP?(%-h3_{R;tb>GDHNl#z}V#cDK!Hw zox#kz93&45Yb~;Ei$Sp~h^1RMEhjt$`^z?TDvb-n5%3YhG@}EEuB0xK@JJ4AwmJPc zNsl8KrA8*j@hDi;mCl@xnh`J!t3vIVSsZh-MoBBT3rMhBAXXm4x>vZNRi!<8h(r_A zCd;yOScx#5>VlY^h8z;+VFhePId~Dk2mJtb7CMzVUL~QTy zki7_FR$qE8o^8Ev9LTt7lcvS;D7^yh9Oeo=HO+9c-^|ci97hSpX#`5MRIx zTl#Cesi)2&0+zk3_P^;IM}46 zi%prtgeL@$ux5mv^Q6-wPPO_P2@yJ&62(s`jPu;4Ayp`f5htvLp*JtI&=te81KjS1 zrMZ#&CEm5TiKAV;V$pVmQ>x6=4ynuh%n?#9Fk?wK; z!#td&X)F#s_t|hhlx5l2Ks(c;cU-9!77U+;4kr7?Cf4&K9ZAAkWa0`HAzVYG^Y-iTi7S1YH6YnOHMh zLQt3CIj|HOYPB)7X0f;7s(a+ENZRsXSE`%LPpf3$+C_(gfG*1`NCUSGe>Y^M+CZF(cP(k3iS^pUsV{F5s zCSD`Lw=6BEzmMp%d??bTGyt&E1l{3DT&y7Pk)(-0;v?{146r52w#%o56KN*A(6d1T z5=P0?v3$q5KN76rL1IZHia%B}#ol$5x8r4UVNv@ltHSA(B!m&GKuH^7u9*idOz5LO zavH{B>VM6}avh~yK`yB!q!!9W6Nc49jMwrII0U1r$on4uft+F*upzAYQ7={Y@yxvw z#ZhMQF#9-Cq=7Da3xa4w{g)zQUt@{5r*Ou z2Taa}KXcSOT?)pbB-=Il$A*~8hFjK_$(cezpjL6gv64o#dcV{ac1i;!*2vsp3Y5%R zFcFwRHiF74QZ1Z6?UjNB(jUj=S^Z9`EC`qZELaJq&f7EiszUZ24Yl1swPo(heG8tl zI=+@spmh(SMeHI{Y9+6YVLv_)$l=Sj=-k)11YA)B?>bOsJDC$`!xUhuC5FrTuhQ)ZnfUyBwms~_L_#u&3t;1c+$6?_yWRXoXD1GLz>>x| z(R!tN_CznvTOGqMM|xY>j=RUFMUG?uM2T}=bBLv4&{DLt)R;soge67)+dO7enBgGS zO1v34s3F%1pHlnWF`Xj@#5djKg8Ppgb#jVy04c=UhwM%AUOq))OkzVKxWouZdAVP!D*bifw!KMnb ziHet>0EIk9HOJIJ9407z65g&Sq&|l<)=}xDpV6Z{Pvm|ZCJMmeT(S4MNHGmXE)xa7 z!WUemG#62(a+g5F_dqIKQQRz1Lz5$L0CPGnD*rOTtl z5hOjVqj|=>E{1{S>~$y(zi2mZw0&_CRG!v`i+9@O*#y{ckWIe6BV~7+JlN{WLyD1A zc2xb>P*mgwby}5A_9!Ft@~WuKaGwdVIpQ;ussf$XQ(_pAseG*>K>kA|tKU9k62S(+ zO7o^0Y?8EMM3diUqtf7H%hZ7B+Oq~ z$H2m6vC^&W`xREX9*SZJ6bVT$c!un3%+1A|A)XrczHU3^d0I6VMWev0tB)3iz)Jgt z!fC^63zL@y z-tB)bw|&BysIwq`pb|{+EV}z(T}|6qBCzTn1v=VO(yb(m6+69M$S_4{hrsPfnr^g^ zN*hpD4Zy}bq`J$}FbLp|Ly9s;WE3TOP+QwDMjlN&JV5HBg&A@#D7*&JsJGt= z@Co~egt4_p(`curi%G+OuhAL5g7hwN@@mA?{yNi}_=OUBTL=T9nOCOX2n9K|RS0Q~ z5dtIDtMi;TQ1%7#1iOa>@jb6*f>vMP3xi5Pou$$N6+8GZ9MM}7;=$ne3ns=X z8I!W4F$Li_G~TZpi9oH~?I`T|NrJE-gQ^zzB0en<6-|ObVhF|*BlaS>DcYUVq+-Gc z3Hs1VchJbGj=-Qag3$y(jiJ@bYay9y?}djNwC11Mbudl*YXiWQf;>CbSR*WQIB6y( zBUb_vCY2PbR5Hrps7xD4fqJ$Gi$7kW6Bda(!t`IINiSF?LhO(^2-%l0sUxOIN2r7I zymqHCWxXG$*j9O(TlX%``T`|#LMM)wNVQc1x z9D74pRQ;o!2tg*-^Dap842MLYBAlb|CP5l0`rzRc5ye`eY}YIxgO=N^-V+6gK+R~U z&9gl=Zq||{nKUKCtcZ~iKX|A*hs=7XXQ&Zs z9ny|55@JM>%CQRBO*@-q;1qSvaNd*c_%kP_orsDOPakdyO)aXls)F(A3sD+{F(vmX zl2JNVaa`jwt{wNdv5LA^e7*1~y}YD|AK4-988jo;iFyJCD-Zw(9s-_#2m}BMDBwcs zf$>*ApJv{g>5Mrwld@Bi_wv>_u1RhPAWKw=JU4|SGzmvbV|zz>KO%6E))OH{;!wpf zQ5GK~kut9A_|uyI=eIe{)emkP!0lX|)wa$0h?uq)&5Y)6q><2aJ@q`r-=GW$^Ev^8 zIlv5;*hj(lR>3$Mg~U_A>sQAJf0#lRkpUbz%QK_s70V_sd-QoM{He9Zl;7`S)Yyo2+ z%{pFbYGoEjYmAWuqEv5veRJ)A{BWjrdRoX!Jt^F#jl-*;7NlNB+m9~}^A#F+fj&$% zkvdvsnCB1#Vf67*bgQ~wm|o{qZMvs1DGU~q#FElQp>&Zab1S1`d>n;>$kdb67AlJ@1Ic_8s2g9f&>5g1b3J}T0HEMv)dMJ=yb$3=@TLTxDF8A7 z4Yr9t$#O`o50PwbVHU~IiyNd!Nsshq`4&qntdmOL`X(yUM43R5#zL5$7SvV|V@x5q>PoGUWA9r)XTzAUn366hdsaco> z2LMql2`gH5&MvumE@TwI#J|l9t4;0aAh-Wy0j6-JluCLHb*SC9?L5($v>=!cbcSC+ zKDixvmyl)A)77w2XlNZ?B@WaswXzk^zG*02ZaRHaxX8Wj&`1Sd%5eZP?sP=cpiEK1W#1W6G?;D4MFofiBeW;Ud zk5Xr7h7v@B9ioOtS`O6?S++%&7!^qTu*Om=QJ^8&ss-3_C5PBsI0?hxvm&x`#&dtT zPZFcK3MWfI!xcRsw;&Bna4m@kaDFR(>7+Lmq9Ltaje(4WTcJ~7B0;loq$Fo`GmPZ1 z^8H;CU)`UKgg1Q|&6E}_@IY@zN{$iS9MMT6n0|@-$)vuPez-4&XP@y75pW0r31ecm zmKOo&$$LLV=g49IqYKwNq$>7?SYMRo={m`tU=D!@Wi+B3a7UGS7W5pBW3W>SaaRltkpF44t67^(;*Gyp~GhX=Z$*qYw-s65snB(1J6(VtD=t}47nkMeRry#V4 z=^&byOamsGAb|;MWk49xm__Hpu;F_n7-39|c)XFZGUm!FwHLC~B)&&}R{yh8pAfVh8u+5gJ-({7luzf(hNimw!E46i8`hq{=RDFo77{QasE zpEL7@Ii;U|aX_3&S#ki=M1;|UxHcyN#biU5!3>uhs3vW48N%1?r61dtX3 zM4uW6vfY4%wr+K_MP04?)`yl&Skhi`%#CgJY)f61NhRz{Aw1;a1A1+VHD_?MJB3yH zfz8qLP4w%cKwLF4pcwK6*P2Wl`fM- z(s9ti&EIEG3n#lM`*EYjpylwvPql*h9PsOgF->e0@8c2HOWpBu6TTJ$;&xRXX)lE;A!#JHH+) zB%CVr+v)uIWay!bP~e7RBb9FGWSw5Xd;D@iiEP$b%r$DQ39koBuesi8`s4OJcGGK%8DH3dZ3JPKbl# z&6`{4l0;3w$owq3m}*+!u#XJzs3wR)3FfR5hl=c>gmVqj&D2>7#D#*UeZZ}1jZK=4 z&F+QG>@hn#!;>bRgr)9m6tYRove`G#0@FJd?n#_Qm1Ao|B9uV4yP3qJfJh{a5eXtg z;S@+Hjao!wFP-lAiK>w=1jdT>tVeZVW%AxyX#_>Jt*Nu{Og~E*J!j*VwnLDXoclaD z_EY4s4a<}z4>fbyPoAQ6q3emRTM?DGo3?{^A4vbZujI&wGxmR8H^1-F4he0tN3$1L zpP12U!U1Q}GKh;jF5wf%#5z``c z?wY~oL#sZ9goho~p|8WDMhpZ4HZd+9Y}xR=@`r_y5tY}Icl z#aNNBRbuSE?3>ZQ#hjbso$=L`%1L%qXtV3XSMugUqgHFj?K#-Hm5)-W1w)&~=H8^~ z+fB&uwTC|SH0*?WTN&@!n$IvIQS|uue!0;d zi>l&%$fKH3JohTQYvme5Ml0WZ65YwP#yvaZLIhcNp`iHbGZ2|o9~UnsK>{oefwOmA zxYpvAT6B5~*d!2Nn=ATxaPABQ2LpPNF?1l9G zl2yNV*Qw`a#EdWBQi@zf--Q|Y_dQ4Q*iMe8_~6D(AylEXbst$M>E zy;j)FDunB$QPxHs#As7Z;1$fYGimU4uv2B?E;#x@w0SX9zmE=d-cm)4z>rq5(HF6C zVn+mww33yayiLmPmA-!SjHqVA3D-imwOFL*+_H^q=~ZMJ>(`kCk7|7+f>DP)zL70d zYSy!qx`4?f33Lsx$yp_f6}Jk#p!i3vd)$rse^N!YIZBy{!c|u~*>jpNe;lVpjlJTg zgC8bu0>#FdF&MVw#}7>1v@{fS(3)~-X9{cU>;g2cL{wmzyv@gV2)M!RwGT5L+azB&JON`eI+in7wT zvaj}#sv}h_*lS&?LMIW#&rke`xH4++MeHIv8JtiP9Xc^&j0@j|&`Vxpe^;TsujZ{4 z?;cXN^*)AArl(-UKtf!EbG!?UA3jOoDo?m zj>0bkIl)f3Xh-C45!`Vfd>d+ABFFUVJ~+4W>+gBQ~> z5XfOrHc5_+{^GK(c5<0cor1SCJ{hd3G$Lt_oqi?T{~c2g63H3An!#AHShn`?u0_ok z_DqpA ziiaM1F7GBAc7ZQptVqyfHP~(y4(OqMbg}@DpFoggZjqMxs1`nd(!`XM#`H_8#ACM# zDC=LUwc!QMZnr8-zW5cqTSD;bTO^nHvhj8HR2^t!F{|;F(t{<^D`vk9Dgcmdtx)e@ z1WWh%M2MDwEWcSb_we~DGJ3%*=&eyvso36fsc9gZCKhr@yd3bqfj(DqkGbEaUCj?n zA)16EVh@5Jd8wO5g72x@lZtwE7&g*0@2o1IOg+|AyhR}J#td>s=3Qr6VSsf-^U*!a(ig>^@ zu~luND-8G}J2y9pOs|zUgihecea~FImsw1TZ4wXM#NML%;`BcyDI=s{$Wr~TddMLl zrT==12bq6}X|)ZFH@evkS!`cCXpAe=dyz=Uo#s`X!eU`dpJMPTDX^T}Za80s?0V%1 zhM;jo!LdE_e56v7Y^*x+QW*mamx@BK_ZleNyd&6!%glgfJIIlpPV_vKw6HUdschFP ztpR4hA~Y8ai05g7j%tlSsBx<|R|4NBV3`OR&`tf3t)c=~jOBPb5lX9oocX7=Q$@p$| zUrEvS-hRHq%_Qh!iv(n6)y0_xPl{sIG{!^jPZGMzp4AxRa2w?a#?;dH8vN+CgMqV5 z&g2Yfx4Ah8r*J{5YAVse>ea=GRs5=qhfF9Z(GI9(G14hkkZZm~-U-#T*Kw+8 zQopEJD8vQs^PL#U$AfX2wZ2F~siv)PV+_=6>=AKWGsR-Um7~U>Qpe81t!S5q{daiF z#;P=8r?&6gx}W~=BDAA%o-6*E#B5>Ur6m7cbE}1FjRuPGqbadrDwKbSvM(VLm~DEP z2%&2Kaqu=ViMMG4gj3XaMKPFscCona)k7+&5Y=})0Sk8&$BD(y+CaxOPFCdLfkwoo zkEps^BrMz&_eOo&sJt{3IU>tDgBWJNUIel`N3*Z&xqn*8(ipfW-SRxM1wPlZwCdt;FSM;np?Etby6Rxbi@I8;O8hC7{(I6 zKhj#t-p?A4&}C%QS*=K_r=(mtH6$p9MNJwZl0Yw9DyF$y=-rEnXYM!X)KnShny2Ge zT5$_K$iMe~z=iTCK*KN`bc`NxL}MYPzTRKXMnPV*=W(>HxY~~&EWcKltvN8?wnHY1 zswF~t@fee8y$TckMg4F4Zh>Ia7b@A=C+%t>o!3k0F80nh?JV>G@c2ruVW=7x$h8}@ z3!;_vC<37bM$UQ#|2l5+Vqq1Rq12?qs`ZjSEefckwMY z;m~5hZ$9nlv#FLSSSA?`cAu%E9Ger;-FI4stP2v|z7rECE4#myIScdGMSTVow*s4G zU6zY_O%dvibc8+fIqKBTM9XkD$+a2-gqOhM;g=Ml&Fzie=Vn_K9_2nCL_T-tE)XVDeFKwyZ`uEs5Gcf0>J{S z0;dA211SSR0?z_z<|Qee%Hn!Gs|kCPg&h3pi1>@+gwTeOX-`R%MhHMpbDfB)$B`Z` zjA1tHq!28|J046Z;j4$M8~jJ6qAt~&BqxqZRnDmm13xe}4Bn#Y5|N=`kVUPIGX{8u z6sc|}$!u6RM&@P6$WJw2Of88UaV-Fb%0TEik^coC&pD9lxJxo+B;`u)M5(RV`bbPA zykmOH=^)9p1+dGHTp1{c-t1{p!MSKHtE`$+I8VoE9Drf`NUY*XUDa5R z{jDhP2s!ImHzKRukhGdNl9m#Q&Fgvpt2(U@wmpdsOGrvU&$!(2oU#MeJrEG0paT!`Onw&|F)MBwu z<$PG8x0L9bi%DvHE(wacu*PY+#s+0s4HX9Z`Q-vu@i=mcq;ZCR7VNT!lSR4G@8Yzp z3_#IFo5d_Oa-}(2TgkWRsKZk%*j3UHsySr@ zYu>gZCb*0d`45BSygvd&he2PLC4P7 z&n0>T(Ve0fP=@B+m`qF7;MBTFb!^P>@r_Oj0a-A6>6&-HT zbdv^36uCxTsmig;PZ(|Ta6?cb!u~?xbYUF^)1sVGuS zSF#($J^9Hfry7IWctPrvtoZ4yu~2eSr}C2g#N*hR;AyXb8@X!3nGQ!oqi!5T}WFURb8kNUE2tBJFeoQpk#f(9tp zxdjpEpr%xgh^h2bMqg5{G-xNP`e`q8d{(l5cbK|J+77pMcRY%gYng6to12REik|L# zEfQ8|#QN8)zs#C03?gWLZCDrOe2)4`HD3!aM)WMpYp~jH2|$=8NV4tlgO!p846W@_ zA)im{!!I`FJ9Z^%m_P|DRQ@<3JU|)H;!JU?;E(xffrWPyK3TX})$&LaRY6ZTV^Jt4 zXT!RVLeE>VhAZs@7sGWUJWUBlb+wsSIUl%dE1wPNW86<>eUdk+p5~J$JwNHII2^oY z0*w+TDS(_tubLO{2@{FKlL>{z2;MO)zs=E=bubI}cE8r9SSh{q5yBF}MRSn3>dZsd z)9_^5s;nhwto<7d>TlY!;=OaZUbY?F;C~`HSh9*wcJe3I{Dva7zg)_nEH4z#I;|N{ z*lEsAtt#E<>Zh+<+&Lp;`T^|)I09$}Ju!}j3^M~%3;qmFiy&3bC=-VS2V4_NUHxH^Od|3_3yFgfW?t@59uyaMH6Re9S>QS06rC^TVOcC{_nClP z?xG+@_zRHQ!c~r3Wt}OI5(2SA*temV*R?0Tl#_Re(x+uty~Qz$Mc1o4G0-FFM7QVG zUg~pG7MOJuRAC`iP<5D%To-dy2a&Uq>&&@jr9p@lN{XA~LVbJ`SRN$Dqvs8k-{Op0Jkxt^@m7e}O3d<63H;Ut>xRfk^HjKD^lDZs`CL1jGF^g-}9`q4^ zLKu%?Ee3k=3e8kFayx`67{(}8Q2g1*ab)2+$-|UPpi<>WRPdfDR|PP$r{D>*NJ!wA zPI8|fQ{IOX>CzM!yKQ2iMtc`{Ft zl=TKrQv2lpC1&3UQL@hvHpVsBBF-`w?@`0c|BGQ=F%j< zz|c#I{j(TcJdHTkCN>9ok~|58JsN~^@ywl$U717+1XswdB044u0Ic;_6{TIK&RPsv z6_?Jd>;C|!MI+>L5$q?*0MnaU;nu;#08gRf;7nYV7%AV(vQJR-1 zJp}VcR3vE}DlO2ie&{l{W>it7xaCqA%)@$%Lb{`@jrF%Vr1mp67ZNEH?|pEDGVg9q z6=RHoA$ga7!wYKGdAe4HvMP$nE=vE9{O)?eLWxtfi6R`}Sh*1i#k!E1!Z*DhngQ~- zKwX)yPHzy-Uuj7ah>|1+mlCgeM)WL>*(K&7AZ_`W4KX4?kmQl9Yzr%xkztlATvcT5 zNyc*14uROjbI9NvTZ&qTM{^fz@`xLCL^wi1f*-E7*EUh z>Oh+nIT|8ePq^KI%9(8y4&tGlOI4AhL}0q#!!ZH;LmD1#^8~S5(wt_EPQo^e^8-f$ zD6w9XW)`8kOW7E$Ryb^@^`d_<@V}PR3T#w*jFVsgqsdoIx-Y7rr^Zz?_)~;2RpCmQ zdzda16F`PTDG@bJ98c0zeuubK0jYbYI*0&>6kJlM((P#1KH8394n9dfG?=Zp0Rhmd zNdTV%OaP=0zyMZ&5$&K1p@2ZRy=ZoeK42Y#yf#M0p_o8`lZp+iwEf8x&a!M3;a+VT zS&IAhfTkXUSWb$a>~dI2e`Y916p}SG+NIyx>w|JV4wi_+U_y{++swU-mFo6qplA+- zt^r6+N>VscvSgDOpLzSeNc96-(mE2+twH{$R+e!87F_0lTp2@63`Q93@nsUNm1B{p zI44DkF5b{8im8&#{v%Hk>|nGQC*Uds!8kjX&^ThgBe(9|0Wl5zfS4Vrlqse{-@1Mn z0YthhaYVKpKf~9(1;v{eBeJpiev_uHlEwuC_K_&mkoRu+x@w$!9EHs$bld{qh1^GB zaa6s^@`abSn@Yiz>q;$VW3+hVMznDkR3sECX~2TS&b;lX&LxnAHx09E6eHqVq2phX zXL&H_h;5gN%+ioRBwWl1SD_e7D6Lt{q8%+8hDRr>ttg{G4SyTq*G|4e7LlbuA*gXf zqhwRDgeN^coQL{Ni5Tf$DGMXS5!L>_~ zIGd>1z?U@42kNm;kg+gIX)x~hhXj%gdrMhu9o5Mri(4iMERrP z+G>aw3OsfH?W0lVv^|!Bwso-EF6v13GZ?qup5^4Hw+V9~JS8?O8#rRzBJK&&U2a<9 zlm;2H-&o;Aut`&N*VQ-GK}~L>52r@}tkF>0V~_^9_Ei?4PVzWLE1LO4)Si{yTu>Bs zElI)wq}Ssp!ew)cp<$gqc;q=vv@QB!2>er42Q@P}fcyOTUe)g@Wnz#2FMKnh+}&nj zSEt#n^DNu9PMRcao21AxvgUy)0-ydMXEmNnMFZKja;u9JCToP31i8=O$JZ5n;bgO! zuUENhaAhId^#JCEVqFBJ4@1 z*Jk}*!X?PG=%TN1dbQ><7%WOA>d}>${~5SS^*^?4j9LC{JIm@8v%guk5L&7jBEh_qKhyc znuPmhBzumtd2N~^f9$iQP;RBX+$T1ZA?iZlPR{>E|DdIjAAIc77!3=R55sj zC<_TA^U|4By<^X8MouV4LSmpuO*w`%rR7&(Bb-l!|u(yWoamF{u(y~Ull9W1uHnOBu!twkQ$kW4b6_54*_<&O`a$P=tcc{5VOU$pWP|V88mBKa=MM# zf~z)F*&A1rkN)i`+-pCPr+$JXOj-=Ky#o&In^A2uv1%b-P_4JV3YR!Z_t=D)u3!jX z*vNMnpCzh>ONsa*Ux?zxJuX3|D%cf%bCzcw!)5DiPyM$7H$6bhVbO*PfW&+OD%Kw}_N$N9eD5pG~o9o<*QhYO+0wY^3c+7iH@7v7XoD z;2?7n4iY@GC(Mwa{j68GZPByaxrig36t@3`a5>Z*@At8qEAw3~Nd)?NFSb9HZ8jrj z8Tr1sZg3dHepjS31JTN4BNMDBhJ7+p9<4Hr!HQycuvW^^D$^`doXk@&klPQZhCimN zXADN8FG`;0hTAiyZ*MyX#Q8fPY_VAhT2x`rJ26VbQ@A6KD#8H?T?yN`gsd(uGmq_> z4JIshG1oVPZh~bkN$Dt`^z*WF(Y1Dl7M>3j{;!WZ0YMa6XknHdcPmL;Aw3XAF+7f; zP>edMgm9v?HH8-1+39@5f}=uYkc8n%YYNU1lUXOYi&QO-)dSE)pM)}H{AnrA%*up9 zT>e&9iJ_=smlV4H4D?G8pP*q(vlNnniA~HMABaF*XLA+aT9(dqXL2!|sWO{LR0k)m zg?h!Yeem|;`V-R=+ET9XWxO49Rb;GUL+430v!zfha!_Nl=#(P9G2OuO`nvmW5f}0G zUCoxGYac9jCXfk>o<>5?MkM3&$jCvkQq8CoT0`4p#Z@3Om>X782#Iv53ic{;@fD^m z>)mrQ$wL@(qMLv8lG(*9mEQTRhA@|*ZW}zUscUIU+LBejk;b1*lC}GcRHGbC&#e-D zaVBC7qL#-LP#OX^RVf0UYUels*ih#R6T=frTL-N(MnsW+%XW2q6DrXzlLRKq~f zjhNKQQov=XNkQh*(g``uaSM$}mZnyuNds1+{DYE;)tVw!-a+3#WV3d`uWVnspW;sH z?89Zx@!M3$?qTxiXOsREq+E0lVL=(P)F4r4Q3_6!tvK=?cfa?3$S38=K3JbNN~)1C zMeD7Lac-^)GSzF||4-cb53(h!)n1~TwbH zB33_FXQ^+NxDYM06W)pGZ8HUkb2#6x>-Nuub(OX9s|`}1{WALuQ4-QwqEOI3FUYqN zQ4lt?69b6_v^xzPhVc_Jpkv!*Cgr?jm{Lip`U4~SAi|sYFe!8UkT(C+jclLv5;7(x zcEh1sxY+w;GqGemDHT;5o7w`1)a*MOhVVjXP9u=XW<_^}iyJ%T>&0ED^{d;k|CX(c zG4>f)l3NDF^*Kb2JoPJ2SpzVE>xP5H!@gwTtg+%vW|u7ixYUUJMIrmVJ+-m|iMH65(VCY$i`a|^1@U%IlSeM;5H;mv-~Kw~P<}nC_IuvWx)qD9ROFw)6(>elTMxA6)~)DamMMl9K~?q zg<*e694CYzpUP+@1-|$u#U|NV%&daKauNp&FI4G*P(Z>JnIY%s#Oh7(x}{l^M;!(~ zDU*H0k!iV<1KzhkTeKVIB9j>_K#jPB1C~{?nFHOEW2EZ2!k?lAqPj|ngrFithA5RY zyljFdqc~PMwz{LOiS&B=e?p)_<(@}eg+!bmb`^NB6w*;rIJ+S`*ush&6=CiYqYB$I z33>&#KzN*(>pZ)1Yz+pzRwqp#5|D(GsMUHQiz|muu7GLS${yXqiRL`6tIX-Hvf+(1 zlVdJQ2-?{gAm+f*rfwm_gxCb8Kibu2gf;C_W~QOeE78O(2C=Zf5ovL88 zB8kRDEKnz}MS@c$Y_%0HtC4)-BNzNiDPPfD2<%%FRq3)s){#nw;5RUjGdjE9&5XIh zV|FOYdXY75&C=_?l}V)S#G_GE$wzWFi4;bF$Ukehc#p4la3BjMSa$O*Hs*N<$d=JkRO%Z<}bS(Sh2B21csL4!hop*v!&}B~_xrP}gU^uopH37&U6!NkfKO^vmO3l6twVGb{g68P?H02rf!N z|I;}!rz4WwWT!`voW<7y-zlb)lb~IBXfWj8@B^Ms780YNm8cSvHuFo&xTzj{X)aDv zff#>Ihhm7rE=^W5<|@?eC{m?_?U5BKK=V6lfUwXFqNNgjcbMubOy>x69FY z^nMi!tZ(I6(jv?JL*e^iCPv>$T2{;!N>I}-5aiN{M_iXg3b?5w1z|Av6s16zF`REA zLF#ZR{iDU4&KAl;B_8&CuPsv;or{B%lfGKX5JVQ0TJZ0dZb2;F4!hZY<6OK>4iWp^>HRNg~E)a?x{ZSZw3RAmijc~!PCCAiJ zqkhSYG&U!Jf7i^*UhECoOJxfu%ldjfPtD-5arCLyTRBhCyWg_742OviYdv zoqS~)$pY9r9e&E>sk3B_>G-bm(oBx#oM|+YG?PA`TKas8+|>vf`R>nLvL<6rj{Pm) zrYYtDg=6@n{x>HVT>SxbIFJ)(5iPPK$&-{C?pN_Vw*AWLri!4g!|_Wo*s>0nVg4bc zK`yy8p;3g)CV?4RQ=<+Gs(kk4yI@iAP=&mRK>!(&kA4$pTplSOm_I=ZL zD=ka0%FutJ_)nPBmj}s!GzE_W-*y!UdePosIIWb?kj<6btOGXDfAoXImlPQDriQ4e zyoboN^$vpfl!fnke0rzaa6~%9U*?mIuKqdu_%WM>V(nK!IaWyzy%vdA-bSP4E`b<3 z6rziereT`w^_3s=!CEUZ4kAxOK(0jpCgfRC*B?;#Ajp06+4oX7UenW5P7CK{hf`8B zzR|IE`r7Fvx5Z~GjAY|0(Stek=T&({#XjjP;1IPc|c5e|~*?L1Y4V0FX z^02vNe=9C`Xl^&nkmqRrBWY`iNpZEue#>8kA1~(==C`0jy{)xlVm$R*Y3IM3 z1q5OYkzYyh2j?2CeSSuWV%aSn>>k9$Dw#XW!LU>es1Xbi4xkl@dZ8J=bIZK!7M_^a zzrC5!M2QJv&GX*7p~Y)#p~X2P+&oolJ$g?Ul(QU)64tynRrDfEVHW0cY+XissG?u! zPZ`hXtC$l11P8z?5hu~|qCE_x8lZQ;7zjfE7Em!g^Ei2DY(HPcR{&_H?I1Eod;@GF za0Lnq5Ss*hoeK}BcZr0>snwhkGWXlp5Qt;iRv%(gu-b{Bp3m6|2M*k24%ay$2V}L& zkZOb{9X#O_lUj?M;tnUEg5wZ?kaB;Jeb-2@nOt0=@;(1DH_H>mRZGcs#u6%-gH17ZkXjgQJ!f>KS_!Rm)9ZmRcA^&EX2$^AKm zK%mV|wJN<)a!88G$kdXY4>1g=(8VSjoOk-g=&q5#pBa{Tk{$G402dK8?Xj$rsJs&^ zFtM*I;u&Y2oAI$Jb{$652`Qybvr-W`aR^QRw$ih8KgU(8Oc|K-*<(ds)IS5GMYn~O zKr71%&`6iNB#dlj(5hS`fntMrh?CindZUN?|tcHF&h4nh77{i#aKlAJKBptIHEKUY&~@VOOcv z@wrE!*)0n!siGw+9Uy90wYnCtqpyq7k(*{YvpU5pPPZB9zZ&O-t;+vQ;#=$pVhuN< zOOafh=_N|b1&SPEkjULagu@UE_Ho9+>Z9^a9JLv?#@RTKvBG8gL2H=Sb*1s&RatB| zQcdCOnj4$*kyui;Ucvr|cQW zou9oXROg&dd6ORfwq$vG@PEADbITWE4%vGYcD>e&lhNkF3aX5;T{E6<1NWwA*5ij! zFqfIdtu4^}+~UnD2&`g5p`{Z}t?KPLgM{fWtC6%_lPE1Lg>fYT|H$*jUpb?qxX@!bb6O zN0e^x1IEk}vljW&wGzs0ekNe$5c6M+@{%5!{Qpgby}AOWUx^x|;dhWP z2zxf3oK(&2aMOGzh&G17LOK?s1D4m`%7Q_q-}i{$7=o5@HEu*UF0pyYENvq=B3}cc zU%ZLLrB)daKtqSao7N|936l7xvGhfr33 zY$OTa(V*hC?15VBgiW`7G2h=)l-Q6t{aBTd6mwso>hSyDDkxYSMkskLLW%aVxVmyF@vnSG}R=MZN%gr2ZW-s)b zx^K|vhNb!b<+`yir>C?!O?>!>QbK*|l-oi^dwW4GA#u1B;^%Sb9i9GiPW>a1HP}&qjp=5S46U0$i)+ZLSEcRC7pBd(D z2t^)RfjaCy3<4tXu>14K8Vg3TOu2rTvI;Orr#u^x|mX04SA3Tm?-0#hYM^fgl*GC?c3Y3zs#F%WvA+YONNal zJCp<>bStRSftV}+vx4>@X{sk<0!*J1R0ob_kPuT^$C$4^F8cUGmG@*xVR<&(V#8t( zgD?&2zB>ZY#xU_URFeXD_K{vfGVn14%tk`;@45*|0d3UIF%+BI)QE2UP&#XmdAEdN z4z{NkhRPrRL9U@MET|nysk#*_Wrq}~E0DN$YQf~RlT_=GW6HloNfS|3?h*`_AuJz= z?>a`>w?B-aqM%P7GjXnEjkxY1ymHwS^^&2ki#RZ&jeGFFO2AO={aYL=5YUZ5nS z`FRS*kEqm8(g}CP>Jc{E;1pAt$G%yjaUh z`%^H}y9HRi!^+dI5H5(VCw&!UOL-L#v=yClR0B;xPs%bqra!Jr?S+7^=N7cypWIWLJBb#f+@)W=PX?p)8_rX@zS_^9@# zaMq=))um~xASC}gv5?2d`iJ7&4^Kr%_2l%UkIBVti(*RvUpJ+U#F#&6v3p)0?59qo zl<2jN!>UL(wt(PloS3z{dZIER*Gp-#IgTPyQ%v~kE?3Z$EmRTsrC1wATV{Gsx?Qo8 z)l;?_;r(H=6NHPUo_CeTF>bTb(Mgui7$XAlIE&Ai6YwvDE-+QQLCjCTO_$*~ZjzTs z?INzzb!6Fke(Q4MTr$%I!1zDdVI(R{rGRxXUBy94g8PVsSEHID&T7?SJ@lnXj1=t8 z36fL7G)VHyx-&_(oWBw8Ec)2J+iLPG26{Z0UJCX$frd(y%R#>ALe>oAEy}T0P)axZ zkyJ@`o{fQ~wMNq}msLEN!?caM^7SyO3@hWvbs2Xrf#k*+n*ush-)SXG@Gf7rq9?5A zvhtr=L(5i8JA~4`sWSDMO&6J07JQg4OsP^@B6y3apSrr+RI7H9e?9z5qDsYM(_HlZ z)pLN$+U&#jD=!r7kw&~k);w9XG>e$DBU=QYL9ilN#PeKi(iLto1~7K*5e1fD>1-p0 zMQq6kJ+R5mz4#r|v{$-ORz#TP4w@k*CrXl_xC~-gng-?}gM!X;tVz!kzUY!Y%9Kei zOmIC^JCOt`u9+;SK%Dpfa^i1S)?!zhw6!QyWU0e@r0aRDkVTs&Ef*kTi_{HRMu(`2 zMfj>h?%Af|QH77(G72vK_{a5IFOFHHQ^=kj=_IMEj=_*P?@ZaG9TIESs|pISjF>4^ zjXcpmmq}HhK`vioO zdYfyY(ih%qxV61^!dk?`oif6$+jz;1U&8xV6 zUp0dElI@VeGoQ7JpX7QLyPI6DC-asy;WnrqQ0Q_R_}=2B^C2=uWm%Ul=sjR86-17#N^3? zbvFE|45d_xAz!FLQYuL75ul#gc9^p?v`X2_5fCbnf>cF3%QxBmewPXJF}gse|IHLk zQr2sm;!&WgkU*;qL%AX%Pquv)vMr6$eDMKmByfZ~eZCsRFX zsQqiTu+wsmuPtixp;GPIuIxc9#DMR*?cY3UhMbC71dq*OT7(&jA&XcKwG=sEGhb?* zs00C9sj)m3=jyTE6LpPP-4R7smOvuqMmx4L9zU8ntyS-iZkMKvxTyN)E*1HtSs_su zr5}-6`*@i@7Ur9_t&%nP`k|$qX8PC?i_YJ79gWB22UzvTBctPK=JkBE5`==Uaj)hvzofb`!b^qqPf^ ztD3DN7>F{ENiN9l`c|}ZZRxJM{-r;-hilTrC*~@#^Y-qw?3~Em5t&yk%8OhlBQAE= zSV9+yw2e?eDrXn?_^bXU(sxgv0J6qiFsv`}Q}%WPDLa=3Ei9I8mdO+@CAkJwFJPt% z8#=F*^o<=?q7jvY!D3f4}k1yE2K7*|m3=^K|T7s!Vy!cnWQpxSfZyDn%u| zTlm90V%L#cc~V(235Wa7)fSbEjM+kNVez1U5R4K1>A&N*>V*vP;chiEWUN>=))-CC|Hk`J5aaz{K)Oi)q9 zt1DUp5LC(GIhcPgnrrk!T)RnAqtwWGFDl&UTnGhne;>2I;_J4DiS?*Zsi@(_M@ru9 z2ZV-Z?oW65cJxk%%-KSu19S zcP`hi0jcKA<=cDc5S0bkfRlLFSGm#Xc8p9XQ)WlwNqHnzlo60U25O)wuw1!mI8xNd zzfq{$kh9uO*6{BmG6 zm(dA-SOHIe5N|UA=2*%oFb7@3hr4vEMdW&KPku~^CoDdy}F=Cl3 z2yK}F>H;8{l~Bf<6$p<|0EQ-C5ls^?s)af`Do+{rf|ng#TEpU^^IG!L0Ynxf5r^RN z8f6Z8oQKlw+~1c=HAg8PML=T69GNu+0nYUh{4yacXQzhYAFSOQz&-?`{y- zNaGXA)v>2XY75PB}1rUMao6X9Mn@V zo2;eQUlJstoJ^l7mk#|GO;_GIz=^%q!mMs3{)onhyDk^&PN1z6DX286u%WJGBv&i$ zx>Q|BWmCFAM5*JKJ?xlNxBCpnw)bw(rXv@85%bw8Srl0dv?fYCiMcsM+XD_{OhxFI zk&B5!C2(CJV{H(Vt<^~i8uu0|eVYAQO}?Ke)y3)(Wi-g$pL28TV3hZlDLB^5R6v83 zv~K=QJ9n<`mIz*ANt#ybT0#1AaK_0Kgx6_CxJLPr6A-oXw)EG9xL&P|qAunl30RGQ6u!CGz zby7h&xU{b!CoeP!-xW$&Yc?THkDT;6P$M|I4GCJiGz9LXW9lH_EHIk_f$5l~iwo@MWX~B1kxf%VXWT2;{jU;ng$? zjihiuBw`>6Moy$o2q6)PhMt1BM^Y?~W&k4IOkUHAqw4ddiB7|#JY0B5`+)}aBNe>7qMkjv)jNiiF!q7GMM2=!7C*<#akvDG!egR%=puDXDv!=) z-)Xr+z^e*FE#8B?IWEeElfzQks@m$%U6kA-vKOEbi5~?)Z!g1YO%JEaf=+|J7Bv!9BAP|zbnazUcCv>G@Oc={T5XRXZ{Y;j@M4tCHl!K)s znDsjhtB$pj&z~riKk`#Qk1z-(aU8F>lN$~%TQJGnB{FsNYaWHa5(JVTAKXsnx|sgB z-+O6|?&}nq3I;^Blb#g)LPzY7(-$V@;mr?2trYI7++JVd6Ise;9ITYciHZEqNm8+{ zLu`2E0;KrsEoWRMT;w)}l;}LuXi0K@*vN1~BPc6=RkXZ&tf>19;&eM1+SJ-I9&8t! zj>XKUzuSMM+VGm7Hhv^7GR;EPt%;R+4|-wEm#LjVI_{EFh$&MO2u=T`mJC`#gQ6&< zh-GR?E8I7v{o8p3)4|;ch;6)7wp1f5J8y)+LBHxgRbS=T_1a$gmeW{h)})najarWv zeN~v<%E*KSQP63y4`P=C3?%9m#pmD=$P$<>60%e5rmi3 z{7H3=TRd=>-B_Pe5ol1RB^QJOHZDxm_j_T$DMe!623zu4L6vzyS%0Bn`lCNOg}zc? z5}lKc3+)S)X4|q7;0X5V<8YU_?!QMEj62SAwv@2-93^I zE2umiKDAKMf2lmT38%-5To9Bl@QlQ|psC%#uu|C_ei^jVNea5n^XH?R*pb;eTKMB2 zR8KPtUXc@x_+Y+kWm0*YK6?DypMr?Hu3NA_NfBi7I zC8i?XK;qX4UG=h*Xm#;r`$Z-)Q+Z33?ajy%;ND0e#m=k2McqZrk~E&y^66HJ)R?_9 z_3urI35NtlB2`y|ob#(2e%D^qnM#~tL5bV6_2neN$)uH18vFt}ab=>6TL}w&73aF= zds!S6G-dP@&7vOW+7?$SEW*%fVsc$3F0Z7#HRP8U9k$8ZblvS`$47^i$Hj3a<4K*Z z4Cb%+W^UD5chPaH_ZBn@<5v)13Y2I-Y4D`1uWJ|ta-PvBzo@0-bY0Js6LpZ2NbM9o zOk77aI{Ge!P5T9G=a%GD*-5GwU!?Q^?EthbKmY*M5`X{$+cih30I?Ed2pmP=Y3DS9 z+y$b*00)YU06zgOm_qT3eo%cA&F=go0m?-wCg*2o&f|+DOTsJ&7W{J zT=dmTB!o4({X{CCU+bINL=rj~;_ua7TsHSnGmy&L>=1$%%OOm+HHHRw}6`q~wkuBRV`Q}ZQ;81GR z*pat&wtqG~wI~chyqZYhYbK@Rdwo4#$+ksa1ybNt&6MNJ+Gn!qcbTm4B5HjGR5AdsoRhEZqX}0(nA6xZ#nd zxgqPeYe*I^m2{$=>}chIDCo59nQ;AOCJp0}NG|G&4iaOW(=31JyDh;Mo^b~m=n6g+;=N&KUPDkZ$${!fB>4KoXisG|vhmCLV zVJt;^B-TyEk1w)!L{7NkS5erdro`n2HSv!t+a1z5mLHUCF{6>rFUS;Ih&DZkYbsh?)o>7K5OSYZ-_c``7&gV@v%?!I)Ezb@Mbv4C>rp(8nuRwz zu`gdN><+lCDB;AVWm5isZ6!5wx&qn_mR8?~fIj9 zudmE14oi2c&wZHhiDnGQ4n^ZC<;?pm_cAAXy)|J8%-K@+Y-lY}oGNo{+E0?3)Uj1D z4SznLqy|40ZC)XM37B3zdZ4J~)53-UN8lL@0d1t#Uf_a~$YsNO#@by9TLr$C9UY~k|Mx;%%7 zOdUbu5R@mSa*I1mkn)I@=R zb|@HJ#&Qhw2xR}D z;O%T^!TR9sz~uzK5`~6+9f;Y5A>N}Ft8tLjelG>NekX*vsKHY$U?omYYIeZZ%0{9z zptLWnp2RPD6Uq>88fPc@4@j8VE!`$s3r672>F$cz2$H~ttD_k8F~N9)oCI)!l{pzo z;%qa>oVTEzIF&@2V(wliDfhTua1#?9RAEbVO`mTu$1DV)xld`)v1-SF!8ox*g73kw z5u|8MI9N_TEuEkUShgI*NNyP|Y!nZCkPK2S5t<s464ze$*Qs{C$cKmO+Aqqpa(VhvF+QWTb)7D; z07*+>8wGa0ATPD7&c96(soB9j7t#E^PZF1JauqB0)pW9P`N0=S|O?0 zeE-US*5B*b`bYnh|NZ76=&~ZVqM^DQOx*)w{$L3R_U@4M5+(HldvSIlSp+)>E zzO~c$r|TL&=ewKy>S;@I=DRo()p5pFNfupWcBD61o4+~h;a_4R*f-1R7&SsaZ`)hT z2gf!|8QD;#eeSAbUsY_7bw2FFag=N7pvSCIS~t%0bJ;}#_JBmYv$luI*l6@bGp~$V zkz^bH;x=EjE}+fJY!&MtZ==XIdR^s-B32w4b*O|+6^+H$a-}X+E#-E71D)_WC>|RU zoZuLr3ONFnJ&RgBl7`_XjcUC(zBvwm2+bL_9?2CVlC6yiS*aDP5^0_7z&~)rNyWoz zjl8R3am7JYn=EpI5XePS%Z>EjC959m!Sy5Tm23MPgos+&rs6W`=}z*0Oa$oWlII#8 zfotWP!zCP3@~A(~6sA3ufqH*(Y|x5Co0ZDL7*{Xty=Q!KymXBL)wWMuzVvV6`z7~Y zr8x?$mU;5yK3j>3a_mYP_k}pA*!v1=1A2>bhzC7fRv-dlX>Vb?9nEn$Ntkw4`5s74$jM_eq|z){12WFo&+N+?GG34yJNcoQiY6W~_%b{W=VHT)$LkqSl?L}~h?#g2ZcM@G5miZ`pLgAc)whj_HK=^Ww z3b1UFk)kc7_PKG5mEk)Kqq7770CbI_E#7kzWg&0~)|D$r3&XsfEe7p?szQ~U>Hxk_ z(*xO-O`QBDvXQTxY4Rx_7Nn^kR*MphsF7So38MKS(Vkvf0xyI}9cW>+ezJalRAB?A zLKsMa^^j;oV~*v4Fe($k$sNV9tFYp2^Fyx8({4pDLV^SMi7kazHEDjNFokIp!bKy9 zDjIK{?wJ*wKz0g*>}PaPpbuBgF`_~+fQg(@6l!9(R0)HQWkj!AA4GtjBPW3o=1|`q z{vCuaj6J3KIvV!hG)*Kpn-IhLS3UUdM~~@IB90Trs-$QnWl1yld|;9~(x{sGLz=F& zm^JNYLbU`^57IzR3Vi(q#@RcQ6hze-*lQ;t<&(mn@g1T)GfAtloz!lKG9Q9W{s;<{ ziClUN_pwN3i1VQ`Bk;v327yJ0(a)~wQjCK{w?e9mX-O)U4Cl^LLEh8a;W-WZOjyx+ zS&8$hVy#4)%w;r|NdH=t0)D~t)x+2&sy5*A!;OkrC|c^8MUlx}j3U{v?PC<_Qms%F z!nGQnNXEwuT3~`-7mj1%5A!p$NQCf!9i<(RNwC7O9HG9dEm-l2wfGjtGkdMI3wg;i z_9!8UjP7H_HnA@S&b_FyYzo7kV!aR(0;Og)h|;~d-*83PnU71`Ckk1g2p5J5Fc0ln zQrTWO-3^D}`Cre9GAsC-j7|zNgn2&`M^J=yyRMDkLVp<{3BC@Rx&`+7g)8E>|1w;5 zvm*O7Ku<3Pu|TyaoDgLbFl(Az!xug6R$-^nij0Z=WCCQO5l5?q08&Wdk=$)?!Xt!u zfN=tU5V)1Zn5a)P7=!RD&a_LIIZuC%0^~C$Pqd2QRip(@P|{pC04$)8qDu+Rlys@A zSOwb*GzCjcqAyO8S;}vu=$c1^n66PB135-fW*lll!9a=?q=_spR3gaHD)r)X0c6T17<)Uk}b)yvJ z?K8$?HZyL-BQ3jKM;xpX?~GE7sPrjG&9wW)P*x4$zK~3Ba+d@;g2iG(ha9FBm|UYs zwX-}p>=4TC0%OY->tG?JwI;Y)rF%gvK340(gi+xNkh#FDZ{ZW0I{_$TJ(64}+&&My z&$Mgy-ZVv#W+@8g)zh?1vP`1(qxdXD>2)UYlld#A*Szl|kIJUCJML5;g;<~$f`spS z57EnrWP)~x@F-6h^G)s`rd(Os8&T)rl-g%1M|=ztJcCh;))Yh3Zq1pYV!d$i@=hQY z#RCGFxuxHUuBKEp&_wZL-q0oMBmB*3()N>Q8vc>!sf2_1q~oF|vnzk|hP#i~o9@%iSYQSr2EY}cseppXoeIPX;t5czGY}Om(lk^`<4dzYtZ$J- zEk}S>hy{lFIF)K15k;{MPmiHv7}gL%8FXKVwthW>C097*y`p!9tRRoJtwnE`qWLHV zC2+z8w}CzVAxGqOS)csZTB#ylZwx`vv0b;p7@lQ1veAN?9(3TxN19GDwBq_Q4R)$9 zNtR|6zBLTfiOQu~6?v9q<#3TqHJvO;V`13brCX$4fyAz$(JB!wMK9{y!A#2Ig(%Ulg=E#1=uScvg*t7~F-wuiW|^#lZ8W4W=qlo6b(-Qv&8;2J zE!B<;Y*(V-RIgj7dP`KRCIyJ2A&9q$A!nT)$BZf;K?MU=>?Uy8M?4H_7a@O&slg!F zb1@+=lU{5z7JF|ITcTj+qhQoggw=p;R}JVqvu7ef`!0*I-QMTnj!*&;ZGsf zqWk>kG#;g=ldb9WoDKkqd>Mqxk_b2c%6o^=hfzRJ;qx83+Iob5CnbrA^O20)hqzNs zq^6-%2zugNmnj>h?4!-lC6S}aQYs1|CjKgmv#AeML~I#Ej>y1lvqF$GR!e`YX+m2# zH`&iSo(lOnsM1+ZL|p4BJ~W&ZCDc&=!WOsLtTvbb6&E71g6lF<^* zhItZK`oF}B=#5jCmP``C+3U;8EY%df^dTJ+ZhIh?kT$ACzh8jKH1LBQoFdBf zAXd(!1*>_tLS%a34nmYoNWjeydRi*lyc&iJ=BO#iw#&coSG`ziiRzldI&b|%AA1^v zJ91rqmfMz(JbI#b>E;WS7viU6^;oP|>{QwfL0_|5Gdj1UrlEr9ub^m7ptohu{PXPw zU6HV5DLSty(J_qOSj}+(HvB2ITnl1s=A*a#eZMy2{AgbIWg13^Puf~`@3|>+7*6*U zTCXsn{S`w5@K_0U10^HugWYX9O=n2)S{XApN>~P39fNhTuO^=Gz|8J7pBPh;-OL#6NAtXE__b)V%wiK-#7=vESr)8@eX0oXo zGbynAknCzm=0epi4I6#+l5APtXPr z!b_FiMy>EA%R6J%$pbfy&ef$!=p$B0C9(KQYzidF&4FgliHa|%%%w7=XlRx4gsnuw zY>3Y8a8gJszgbt;Dnvre!m6`WYm^l$QW_69)UT|*L+2o8$h5vpd~s~KC#5Y)gn0~> z@_Y(n@H>zqLFweeS?Q;hEJv#S4Cks`k$M+(C9*8IeOeht=V|eG1IUkJV`1<|$Ds%~ ztuwZ&{EsuLT!mH%5idxD%&L1iN$PIo#8)JrXxbq+l42sL6|x&Lw8~`u8~=}=Ux7}e z@k(VMIVwo_UMjwcqTDH%NIYXJWnjGQsTumry|_6C;3SKxNaA3<0nScud^jE63qdMv2%>!QTV! z_Ko!PXUj@VJ^*xtIA2-1;ds4;Oss`d#Ok|gkdZEA#!xP?#%nMYL{Vv46mmz4^^2p# zEBqmEE-izb<2(=Ue)5v-y4s}AHZ)Cf6EfE978z4$bd}hMdQuW_&G6G93x!Q|DHFh( zJf38OX?Ni@WiAyETZv`qacAq5G|SbuD0=L2LyMxya;CY!ciGOQ=P^K;^M(T%poKtL zv}=aa;3C(iRC0ulMjJC&1Km!zwsGC!ky6DAo7hQWB88n5xOIDU69lrpFn1_LKWPR^ zk=J{2D}5NEto;<%)dCH;kZ(DID^gDA-Y?>a>;kn%dLv77Tu)EwTO*26=TyiO$jGI_ zol^!UqEsa+1`bOrox|8Z2Ewxdf=hb7ux?DAtN->5v4V<^<8fr3%S?4^pJL!lxM8+&ax^~9#K$*x!eIbgtG!VvV(FWKN}E_W z7{2+k`yTKsvNl_S{gINzchM4LvnCyAmVQ$(&E1q9qCtqNOtdMp9eQrGxPi7&xnU@D z)El@SD5c`*b}SYZCQ#0i;L*H=lBS1rlU;ZF+Eu8QZ)qCo7zjvHyH?^YE8MK7l#orh zyenX2|M7NIEStJ-CZ?y1Op;Q^L)j{fMkDn19a%k@C$;? zx5+w^|8lwaIi@DHt^64Ys;a&8VHU9-_NjYAK~ZA|k1G}|lSINJ@;MNYZ2HVtNy{N@a1=GFUm3NN4Lw+>wj~tF z#2XR`ZQIw){ennmCy2^hpMvFNukb99nr0#;yI$w&Znf2&_73T~_7H=dmQ9RmNfq+W zndJGJ*FRXTGETPUm$6>Lo-END3aEnO$h2y<9g~GN;F*wU-oop9<2Kh}J|y+_gN# zKLle^GLX0}`N2?JL>!Zh2_i?4c-m5`{LEJ9_1tnB!fc0dn@o=G6AiAG?lvY%SQ$+N zlrUJqT`>e9^c_NKSeB}GPpBV_^v%Tjq(k61N)w5QcM8;41Pb&kFqi{K^`FHB0(#E1 z7byoJppm$m-o6&?c7u?N>O4|8dCWVJ1$wBnrw|E5Q&<&P$h?QLndQhEU^iXjrR3r%{)v+zL`XLHs;z=D8zIn>? zEs4BThnkFdmrL?1iKIoZfXGS_i^O&W)Q304C4vLh5VwqVb^Cmj`z^S#KnYt&lxp@! zJ75+8aPSi66vuN(l*j^FOFXj}gnggAIA$M0F*@Kk0tI8{3P9u&)RUD2$T^2B5lvH3 z%;k`YCqP6TPY%R9cE(is%Fb3Fi<*y7Hzg zfQ%y-4Ff>9FdT$*gddl92Um1SX7N&@avL?5c2`O1z!8t5fi=~pzN-h3mhUV(YU2rc z+QVu-vnUlcp%6DJ&u7G4aCop$1jq6b)9)pYCCRxPif1Aa#yHggzX&|%6Lt+^fZh?j zJDH34$7S|#l>lInuDS~&u23$PYn*JJcH}6^eMzyQgv%KJ_*ob>=}rb}23rOd1{4M+ z1~>*~2506X1G&zI?+RIYjp-ttK2?n094Ls=)P$us#mVW74U zLg?Y;xQwu3$99YMo&PaC7{r87O8_uhS_vP!Bq@V)J@S$2U2jMcd%#P5&0huddO5ap zbC|Oc=4zdiOOVspgMS{wU9%qM`1k9lQ}^l$=#aXWMB4`SYw!y0j<|25zp|#b8_Kl| z{i@SPM(%`zdB?E#A9Fj)V*VCIb~~%2`tVV9^0O*d#GB5F%&Z!tEjvkAn6*5OjcW|+ z(p6r%DwjB?iUZHa%}bF4Sc1o71eGMs%N6$0#3dU$cVAcEh?z9QVby?% zL}4LfQIM+vm*C2NBrFO^r?iz676o8H8OFJ}M!bqb`E&VkirhjYtN_UJ}KJeg;IoE*WRN!^Ou#V*B@KON&m)g3&Wa zrkwDqFN#*UwAkKqBEWJE2!`|kmhi@rM?(4H^Lbl$(gX$5VGh$LvjcPNx!sL0Z3iQZbmVqs=M{@Nh9T2~B6Ez6i8& zZJdDa;SWE}U5U!Q60)lp(1?WcW#;ttg!yM%JJ;tC=j=12UU`n2_Qp28OLNX?$R@rR z!e0p@d04BD(`!8JQ;m++PSBnrO)&|264{$vmenoa>4e6JRlyPFTOoxL&%87I@I%e? zo_tqHEFI^mD7(53WsR+FZ^LY8@z>COO0!9$Hcx`#;mmB@)TMD-7L3k98F3Ycp_omX z(KfzTIr{9QHNh}2$TpRwaUF5B`o3{N%t+FG-Ma^*qT$qQpg@c-8 z{e3;IZ&)WrX1OJtpyDW7un`$`p;$p$Et(T;ur8QRj(z1qOCvVKdRygh1!AnkzW1}a8nO=eyq6^Id$ z=r{{oH}LRoGFTU$RtBg~eSdvwZRAG$=(j_)hY`yGi&%$$A z2C(pI`Rn!^P`Hd~P|~Am1V&*pnn?0cPRLxHkhh+m>#Nm;RAHE5RAT681L{LhkYv~t zg-B0)z5dU8x-0ipT{j5-vJx@VcW= z*(s-i5*&t@({`#8tJ3R|Eb#4o#jZk8qJ)0mDmXxF>C~SgIRhs1mj`wt4JL~#6t6Nr8B2}X0 z2crTgl|4$-$i>E!H&}NdKu~Ly!dqNXK(B`@L!K^| zMfo_Z>ylmJrOt$m|EP8_A-W|TP8xovXURhgXVi8fW%C=YY5v%N(>q#ag|#U=(yiXf zMsguN_=lta&3{_fd87aDQ zis1sd=s%BI;Ar3`krDI$QM11+9nQNK*O+-`hj8?RJZMMIXk`1P7`l-N@ggpz`9 zpHA^0sM_B~7N3Y4(Vwv7CuNJX#zF}jle*RWQV?AEFV~4L?gkET8Z){t6U8jD7&L8K z&xt}7TL$l-L#pLEQSiRw;x-E#Vmu}51R0Qvvw!ePxv}d*0eMh{7ZQabGZO(An6yc5 zm4yIi3?jJtm0+M!m7w0$hN>A>W*$p$8biCTyV}GqKNNAdkt|>l1Mu zaZcCFHg{%MT5SDq(cj-FTxKg1oc^dyDHWoKz}J=&|at(fmNZ*-d+{D&H;lVy0me5L48=xUYMA zP*?D-h*h(5%;uLg9q}^_n`-&$Pg4T0m`-M>lv(*&5}@3g*5(h{937l!MuCuG84LDe zk1N=vGb5a8g95PueW^52sNhD6LCl%G5Tbft$$L@~VBImw+1AjVogKG2p_x*5Fi>W# z*>JwR;2oYZZ*rEwc>yc}9?WA;AiPLUR`)===pV)2RXEhV^-qR5~jaKb>r(=etw#AjWi`U3i z{FOUZV)Ox?B;wX|7nZEqx2vvPNg)SX+Tkeyk=u zE0EADpj;8uu({xncFCH4^Iuc>iHpY>er@5YlO9Et=DGPKkrO3P61#L}hws|Gncvme z_^2ZuVrcOQy#ZQc1^Z)~)u5#5k$N`zNB40qlSZwiFLNyxB~Nt_;)8qWW|Tb}06D!{dgPl!SCbVi!o;?$VO zAeXH%>j5y=rfn0&W->vf_Jmn2phQ|G(yov!rz5A?E4vaEh&ap5ZUmbHNsZH$`q$jb zlDQd~8ceiHbgUwsX8vz1sW%~PQziC-jsj!SNdvF4aOFUED66WhzE+8pG`l?;&999O zZk2^Eg!7ZGjJc&iVJO2US;*8EQNB%cG|jh?!F`1NV%s#0Va-E&SL(z%@lc7!q5ZUbR;Vtlv3#+*&Cq&VRO;wfStH|COi&z&UF$eN#Aq?gVlFb3_Dd2GODUfS!x+ zNk9ZUY-8e}NcVz^lv~3Tza>U4C`8cXy30_O-*Dy@S^hyXZOKU(Zw84hyo$@tpaoYf zlo{vqyo6#7sMiq{K9|W?1f5-UQRYdZ!6d>JQw%ErI>q`p-_3)53%FrBgz>3bV%^7J z2^TR<^pypP)v=Fdyt>noy7u7_Q4Wa!SJ#D=~k2eVo zjVi?W)VxUs#KGIh8iG&Fr8&7S1ls0j2$igCK`|AwGr()1a$IX^x+KK{G!%*AK>t8Y zD)z#cv7PL&S;RJ^VmBlPE3l58rJ1)Dn^(t!=x@;f>d5OXb?b44shd=G2y~M5F6C2H zaeOuYLhKAcs3n(dCK2=z8B*z(A_zB+(wf}Cr7s+!w?>qVaaIY`lt zJJ@825h@g;m97;IbnPC&bdynACa6hku#rnw&)mlqqg+LgHrjy5mRR)_8>=cz!4!^w zr!&YeS`I zX`PKVR{@7k+ItQ!fGFA_bwfl882<%(WD$|QQ4!InQGxKdf-epZ=(4RP>PG*BE-2lD zGR(6bSH3fguMuF3387GP$Ttwfqi~qslC&6cJ4bd?2mPT6Pvz}4;|43d2BB!u6pPAvOHJt=PO6!US4fDpuQdl1RB(wS@_TDdF4C2gYIJ*| z-#^Noj<>~iE!%}?hLB91OKa(=@J*|5Wx z3{7uzuA2@Gf_q~f3UgOAEDVF@a*@D%v5WSPBC9pPthCe^ zL5esUL%x%pNQaC`ikLwzB^Y<*x^kpfcv=1dtRozOX<*AjXZYn$G61sbWkB{R!E+3F zp@-}(?6w3;Mkcxb5MivXt&k2esKSUXW{{=1PJJ4LGDV3h3+w#WxxgsWSDF)4h_{>t zWi3S$6x3IyeAVngqJKL}Yt{BtvkavoKv@pSYa#5L<-qSq(R`Y|<8;hlNg+BEqhK%ckVg@9 z?0^`SY1z!LV{m<}?_{c!kK?Ywl5!|X4Um-<l^}I1@ZNvqkLAB?2qdSXRPv}}G2D0v%`q8~ai6)l3cL3d2~2`s0uoc^UWNoT z(I;O1ZO6ps*G&OJXS^Ka1fn8Hpt?QH3gLa+;Z1aU?KmMz!(&C0?fjOws6aAPVLOQA zNhJc14za^?WcOc`aRo>*o3b|qU34WzC5EoI!XdU6#m3@oZPg~?;wLotBIn`b3vR{u z6;*p%QT=e*0uty%M`ksoj->Y3U_;`smrlj$(;F(WSF&~lK_W3~{fktaOAZI0XSyQK z!L5{nfh;{vo8-w_AbTj}rAgS8zFidtJ}i+Y$|)Th*l;#kV%@O3`%APPtx&mCyL6(o z7aX9)-5w`YNR_gr1qkK%=0xr|(1Nb4yXE&4*_%>o1(H>V3}q+{4Y(l5N-5TYp(H8f zV?OxLK#l-X6RF)*;ZY?hfXbekv2v0%No&xTDh7=70D)<4029{SumEN>0K)(fQ3ChH zA^?O)P)ujpFrmjG>_8ZA=@620Oz>m~)6Bu$%yz6P#8oRwhdL{h2WKx=X!1QtZVM%M z=mO!5LjyHH+@bHpSAzl25@ZRkAx;8l$*c^M zg|MJQj7kYqWXW=M`#YWUbv+2wu3jQ)JCzog!o%Dwk_x`}MS|AIgsTX5AFYz3DJi^Q zNpj9GKQx)@Bj5yw3%~$mq4dFT`0;Iz$)JH+c{@64VkZka3F?vt>{QhybZ3`v@)mNb z1eq&b=frK`jU>0ig;xuQAPkVtgGQ#H(OeZgSi04fFUdT3@hnW?LP41?+9`Bc?U6=U zs})*adxWPKTA@ozxrkczI61I47&EXjG%qA8Xef9lJD7{I+bUVhX9pT}-;7uIh$|Wj z1!lumEbH5AYCSMF87MfDB9ePVe22ZX6d)P0U=&p{p+Dx4bCS_bp=7BivFJH8fsj&& z{i4*fUb9HQYv_w`Rd+xMp(X|2_6ZV*hwiKine$lBOFZVKR`t*2^f$jSudrx~nb`-_ z+Jqz@IK2{yT+wwB_!r7~?l+i-i9a)ptntNn91KBOzsmEPnN>o)SzeLCfSEAx!g0?O zi~Ubc>+uoU_d>Q?6qrg+1A{ZsAXr^hdV}ErA{eQ2V}RhuYFUoEzYLJBm$Xy9 ze}>wgy0ZH(IhFF@;gn=Gq%*l81_CQupGCT_X#Pv4bRvJR(rgkvsBQ0r%MhPsd5XE= zjz;+DG!=5%WNlt!bysN&?r!6%S;hZ9S28LqSuf;|DMqY?iI(hMOFW$Jmwv&-FSw1o z1~y+Q260%0O_rAKt^;1C$p+^w z49T*+m7tjUuguNIA;EQdKf_XmFtwaDQYkYsMYJNR5M4__Y}r|TX-h4(T(ttY{KU*U z9GU_&wFi=7Vm!f`<^+@~C4bt*6(}obDw6kdkKEeQr&EfL&Q#_v>2L<5RaL zd%4@z*fM;M(`wd6F6ek!EnaRoy_aGyk)*CN4v&kQl{(sBS=b;N5E!jtEAmJAsYDm&gw`fybHNoIth(x) z)`H7bDkOw_T@!p3JP-)U-h@PRz+v?cb*X5^osTDt_2L_%^4WN(A~+5lr2d~miX=J` z3QoECVcP{w7_K5r*Ex~&len6n#H3&MIqIZXEw4O1{F5NzOL}s;I$>Oo*xs05l&cR) zvCk6{nUdzlN+KFs@IShNF5*s$w&(<`+E?XB1?KsG{P&%tfifV|TyL>JMU!9doO$u*U-%-UH<&@QunhMfSXlr<&tBA)D zNg9t_vGIu61i_?@B^i_nH1ADh-XT=WXC0}a9 z-QN0M)%dV|e3Q!di;Wa=Iar8qN7L=RM=bY|rvo4Iu4h)JU8zZ8ZmiyRkxWIhezO_G zz_%l1_;D=Pr759Euojp~7$YiCA(8(7N+{N>o9U;Zbnu32nu5`i;+-MN@{mVk;dUP#=<$~U4=MZ*X)kuhjk(bqF|;# zjLJr$Wr8H#X0=#RRq(kaaAt_@srunt2XDNf5^D=9KX0AotI$DGyYY=9G{VwU6vRlg z9@J0;^cgn@=ed+^T85H_scU3{we~F`Q_eWtlZB3`3uh(6C9*V%{1&SbOG-Z$O>uTP2hupel!GH85tKR}7Z|Am)|FNQ zY!5f(R>tL_{RxcC*T;lkNXhIBrWxBKH=%!i{$kT;Q>nSLi>8anapG@5mUH6qzHSc8fE znRb4@nRgH%b4x9Mnuy~8Wdaqhr4D8Y6gF8z-8Gi6!9iH0{*uf6E*@I%sYFU;f;fzp z%$WI|3MYky8?CNuZv6(8)S?fPrep}X1SNm~I6%k0ktmdKHDDDwuX)AoVa|{8$3_qR znsG>(4x#YUazmE$MypNSy9+XDqFgC^Mj{gtM@njBP9%tVCEI=EWtNq`aUMs3IimTCyU$(*lzj0 zLolnj;!=X}Q+7=3q*(f3q-@5)`0h$2i6l(rRtMH-NaU;q14JdrmkQ7*qA$vkjWIUU zXH(K*V~3;yQ{l0-0SW`?0VH>52`ci-WlF^>q+)@qPNoYtYTZ@YYO-&D! zPMWiRhfTUV?02=;ves!z(o#mu>HlFXxPiqlLu1PU4FspW+d-vC&jCw!hNjf6ua@!( ztp}Mg3#llieDt=g)}U0l*}1;bZtMRPaxPa=N;xgmb!$d<^Hrh?mlE~D0Vx8Mra7x( zJwYT-dpVZvhIP6)Qlu-cVTRq^K&MVpTg(A3E18w4HGR8EqjSboNAQUIkIK2dnD&;g zNliWGCZj2!E}4=sVzq5CAt@b5mWxNaJG*OH4F0%vYkbQYD!SO25?XUo8!|0O8dB5k zF3p(_+kE*I`%WSjY48?#==$mXc7N1dr5&|mA|OEgOEOu8lJGW@zVgO^=8DU4esXGm ztVx8+;(})*;RxbPpw{Gz0e9$=fY)GCM7QxPm*S%o5UiR|-&c+07Xdc<+FPB##w0e$ zY{0T08pw%?myqm;NcobFZclwsh;bIP(GV%1N{u$sB3h~(eE3{e$nhI1&s4;5_>E9j z+{uUaNN#r^*jq#+X|py!xm_-Jn9+~_h>V~#x>Vq5V>Byi-cPLrb+ zY%dK#56RVZad>I#UhJctIyGdYJ{ce`ap@q_4FpiIEeoT} zQaeF7MIgv5u_EHo0|+kw011E$pe2A%D1}f7h47AG!s)OJG$w$PrD}8OnN3WdA2^{1 zogDfaR76z=EmGJC`{gL&y4J1XP^OYJ!+LpZ6u)i^r;O~Hu69Qn7Ax0x2Ii3q;Alxq z%~X8jcBH5xY|_`N(q`ntjIUY{nh(Y-B*cRy>DGv2Fp%g1AH8cuZK;lfQjw+QQh>ks zI*JDZ@aH60bNAcSRN3mA<9#z=l2bOnB+Ba6ExLHnQd(Fs>UQ%xtk809p#*bbOlhLN zU;r8b570#p`d640K(q!J11tonEC99){!jo7Fcg3upa1~68(Q&hIxdlu6ob}dl1czb z$`W{p9QLw+D0Cp=2?}ed8373iuZdg=@xFQ&@?v9*3aQUPpa{DII8MZ9u&UB47-J_Y z5%FX$Mju-fSEru(g`IGt2h6dNDlj3^FtG=830@?O3v+PoCQ4eXDna!o=gAX;G=d;h zoVJCb^`bbeBEw%{gK5HneByT+Sp6~#$y1LPh#5usqFoAd72W;*M9ozgH^pdU1h7WA zP1)hZT!RLn;rGq)mgF3`9+g*YD}hQ}s`D`y9uetaPN6Ch;W%C>DJ;ioLP_bqEmEUG zf!#{%+GzC@!3I8uhXP^dp5DHtpTAVSs!KMeD4E(XrTC>YrSXs%LbXE9y=<9Z**vK` z`y^kWdn;Q3#dN}K6=F3G*!6_A#TbvS>A>zRNW+`zA1fHHy{BTqs5Z zYT=wxYIEOz7{92j3oGo+Ow3+isUC$ar0En$3W8ElU)1kj;HX-sV5oc^R5abaaOLR5 zR!gdpZncG2f)O!g;t;4fenCVR1RqBb49Sbe2p`s#2S)v!?Tif?EvpzUX2h=aj9^m zK)c2gdt^lpVx~yKp8JSsT}+Q245I5)AA@dr|sd9`wHdM(A z>#K5&TmKN|QOPJDOflB@!c*48c?P~uTgrt!e2G>1ac+_ z3KC5~A8As+q9c_e;RbS)Ol~x+XoV%`b;{rF$%!R5m&-bJPpFbp7i!Zf zXTDf8;`>xNASizP?unyj;JTa6?5g$XsgztSc%r9_k~YyZ@A2jVx_)49OIDF`qRbEq zx*cYeVH5#NB9dVpvv^ll7%uysaXL{Ka$(ksh)@TsS(;0Y1Yn3pmUhi?;*|4OI#GX0 z73V;$z;pw2gvA7>U9-&Jo~3JaD-t(XD2;Qu0h)&{C2U|=uV!!@K`%?uzHI`2;XzB0={{}m z%)jsv4{qSO!w1D!w1EU-lCOl_#Z&DMnJF?eOSgi`4Zv*#j9Qf=T~ajxBue{Pv3Zr5 zOV?C17Cti2!R)3X)gdzn{)ZiM7aJj;(dWeNXtM~>utN&sFo9eX;lda6PNe8QO|I*s z!4O&>1lmI|F;JYHZlk>9c#`EDfq`L@I(Cu%Qk{X9Rmmn`HoBRxmsKsGRvXV$jyF!P z9Z3x-1I(n2EMDKzHt#EJF(jUiHPQk>Bb-4X%7R&3>PZ3q_I!rol$c3pBq*#}dCPom zYuE}Pw+)CZkCI7@7O1z15NI%!(tjx!%fj_wMtWd(5k;3ZHz5%Do*mxmnF~JenC4nq z%`a?#2y89JIbAjAQ*M$(pqdC}$VC+_>52v5FPQE0dMb^=gQH?4;4EnEq);l;_fkkr znL20xVNj1klpBnERe&YpsrCBtsIC=|u9_awBa~)cg=EXLnomY#Voy@tkU&I49kMcu zy8YA&Wh#1eGK`?ILVoF}Q#C2z4Z2qotrED+=pt*%0XFW$m9*18E;Hqu)k3X5w$*=G zxT#4-j@_GSz*Nd@@AP%Do?$`LEAZRLlkl>J?MMB0^_ zbE>t*@HD!h^VOKsM+{X1e2SOj)DHdhb=AzNTYfm?ijf?*+rwubWu$qX6aA&oPQh>_ z!@{%ovc#QWgBR|Fp(WnyvWIwWnc%M**BjEw*Blou9A$Npt8lcoDfd8_T{xRbLw5R^ zb#fH$Vr$`V%#XM_@I2VO%*VV`6Ux_P=Sf|&3s{37TRm?=mAP0$NG zX8@8k&oflZ81_6dQ~u&d5X_j#XuO;Rcrv;XI@0m}G(BPyB_%oq5d$dzd4MChY1P!L zqI9Rm8N5T+ksQcM0)v*+TrvumSr`N%EV|ecqXKHG$@>tpwGmliGraCBgg3}Qm>h&e zP@ltBM~n(X1yC}IzV3pwa>Vgel*K&~(LTL@bw1f1Oy-r!m4aLca(8O_>(^!C=?1zp za%xSy#*(&yoEqshEX688Vx%c^uP2w?=dg~CRwPLyA8Ej>>ic=^9SRXozHZ^ViB)Ff zo>uf0q0Pzhi}AdY%G@QQ<{;Q{Y+!QqXRiFyE4R3I7o51AtBf5$>2 z^;sr~Vwf9@FFNup>)PZ6A2ExWCF%kioQ-Yj+|T;!A)+q=GY~~l`1HXup`vzD>?)T< zqt-|)CUIFQSyRdau50rwN+uVLxoWPsN41chjr}f&OR0cOag&~Dqa^vXO2EBr00v|Z zw^)Z5SvG zi8|_9_f;#sZ%Xf_0Y#YHi6B7{0y)p1Mt-=gC3>f#sjpc3xv3Ak^P|Y}&fjx(h=m}R zljXi^P6XvsFse6O6KZRoe!IoR)bo>x>6<7^B=yY2lPk*Z zTaQD+yQ{9MJh8ISU%2KE3vz!3U)CbQeZ%3Cbl0cGoHcHFDcZozWm=7Ka{B4gCHr?f#;1 zdwV=(;H|u2q-z~?ehZ2%qM}A2xomk$2`0d8?+pn%YZ*6fLJ5zUCTisxtaxA3 z5LM}gxlln+Is*L%mYD+8MBz|(#M4MCzEpL<`C+kp)Gne#Txz{19Si*vf@av_iS=d` z1;!D?!w!U|3Ss!9UGEBuXuMNO7pD8IKvT4LO6pH7n`$~YZ`C23Y(0?o+E$1UK_Tr`ryLX3$Aa_5gqVoTzQIZ+-Uhn#}=i{MeCk&j0C9OS~|e_z69O& zLjI*wuvS@QVNRwiv86LZ2ffP;*PR3p4-7C;!R@E?T)1KaT{$r87j10GvrN)h6zSzvG;^{Jw8C1h= zG|dnb=jyjnNfG8cNpnzkcyu>u%z==Z9OpS9CgT%=EF;~dzVo(iBq+u@<;XtLjLs1h zo-M$%5aOY91!RXTtuPmnmWgL;0R!XmUF8=L=c%kmMs#fiV9q^Tlf;MtQ(HQ0_s8C=CwB6V}%kj`mK!_4&jWQDr#a507|3L&! zx2KrOos1fkH4vVH!fb4KjheDaDjr8jEZ4)IrQss@t`mEw+<2&7Ggt+%z|+pL4^SZ# z08xpAM4b;)FghK7k%q}v6>HM@eFQMoU_(-vw9d$ejF5&_xXt1~oE)Zw1M zHQt2rnQvlfXqR{0C|gTn0IWcaFq_{II8PqD6uf zHIy-?qm{x-71aM4lmljH<)5F^U@B&Sdb`|JWR*d0(ITjZh$zR6yC)Vy*;g6D4Vin zY?PaaEjRGN5F`)MxSf;1R!0+$uZP6ywNceJRAxGADG=fixILmBhC~2f9rQYeZx<6qM&hdD={bBq+BsLO+Umg2He| zv~1WDq$p4tGcvkqhpv+P{v_7#SmB`^jmgHmgC}@W8sdX%SiPWu!OSI6!;sbf)eaKA z#_puMJkU0gZG?UaP4JSf8uEAs!_{vl{;lpn?^D1ay@IT{q~~i^YZolm*m3$7@=3Cu zHZy4mrQ=7_TXQ1K4px$l=MY9 zVkbyS5>&2pv_&+_#N@$fMwnD%`TH^(XUptBwn9_B{~{|j?va=DIOh9avB+a_G40f_ zw*CpGiL#K)EVC(*r!%D}{zZ&;NkTZJ3^RSi;`SigCHfxWQ{fkBs%H?z_LHR`yw;C& zO&To|QHjwp#3Pvv%Hpn~6}Y2g`F|V?+>)2CSs8h{-Tgl#=xOb@B%)y4SM=yN@x&U$t~TL^d=KK67uon z@`dSP8t~WSUY>s2c5W7x=L_OcCFq9>V`D++%wxn~;o>8Xk0om%RMiqy%FEV6BY__< zuPfnaX~k5DbETq>)DnNtpCsQSmhn9oG{ece#4!&zIZ~TY`eVnk4><;lsdL-;hQHD30Kx+=y?O;)Noca7gMF zIOVw;38QA>QIvj?g1Jd=s$6T*uO}{Nn*SD$q!UpE@Si4(#DJF;>J^M|+_ZhrMU*kp z9rM=MD>VxWTdOOtjOHV*T*EyYprYPgdKDWu2tVX*=_Xd+`5eV<(jk1T>B^BKVzgwR=kk!tXYHic|Srt;m&vW@9^<&kYis zzjaK_a9%Z2gdT;b`;!c=YTnpYoh4b{_L|;mAX@96Ui%n=IBU6m_i2};LVf`7GdoNo zbr?n|Z04FLrdo4pBB8 z)Scu~*@>QHD%4u2-T@-zR3^W83N?;R{Jk9y?|+BdV~X6C)rri_A-x@YGlY~B8HCey zR3UwnPn~8P4xvunqPb3Nvko*z-#(OzC$pz?tU*4#4ze>DKsqaPueX&_{Sm&K$SOZ& zy3Ul=%Kf%B7FqhG>vTb_C*~p|nPQtqmp z-EPBcWz7G7;6?nSn)3$6vMiR=lQ6JZi7TqG9qnQ6_p4`IQ@e zlx@-?Nc;}xTe&+&sK_T3NP1TSkW6*R@V{M(&M7jfY*=jmrMkJdNs_l_bqG{ASkdJ< zPvBF-aMChpm@Nje8j#*hQ?;|ywY>Ws$OKh`#|GpZ~4qLnIm;1sL^ z2UOoNwc*mp=$?pHMD|HedwowQVk+5cY*RA0xs5PKYT- znAL8dWrE-Eutl^l(y8Q1d+Z2tV)|G>?%AM({bVaX+7Td;zin2p-hZdt-QOXq8 z*@srjL#GNycNC;O$$~+lJ~sMo#XYRO9i6$wf`fZt6Iz7vpyV2L70Be$E=xwOv#KPH z=tq?Wj6sqsRhlg9DtDflX5)jGQYEh6Z7zbWvdl@2%pPOGp1xRarxckjhu`-(WyWGx zr&T}V{RwEWGqq3Oq=^clb3!sydChbMp%&I#WR%N@bmmqL>MwI%((on}uI<4hltwaV zU{~uUhAxSk=Q-6ks+3vOZt8DYxdb&kDY%ykDT{1j|8(9updq)cnE z7a?r#%~4~O@q}>i&}}S7Wrx_pv9S}Lrbxbe>tS)M3L?zD<0;Ud<(WlS0^Sm4vbaKs z1C(Q$M=2pPThu2D^Z79_A(~3knJ=fbXgBf|#u@xW=@vw3NX`rKEax8Ln5E+lVb`~M zH)T;NHxXa$l8Aa)?IRE&ZM{k)6L^LYzsNA3f7?^9E3dC--oH^VZtA46+ZgjDId(U_ zf6jwNIWSC~Pxiv-*W4Ngsnr*9j7-`HV#SoGMcGTt+CBY!|f_!n~wF;I~PUZuaLgof}wVx-S zirb&4I@XhIRDXgU4EdnJ$o9pO_jlM4kXG^w6!l!Jc3o^b4%Xk8(kZ*qtmy5=}lbzEE5XUu?Uyky6DFK_XQwMXF(Vk!2ma5a)W*d=lds zXJWK$y~L4n^4JQT$tAiNsz9+JnyN&dJu039NT+%%+2|+>^`hot>At;W3HJui>yi+O z6$A~bbX4~xjChXbXq-9gki`p<)a4L~l3aZXd>D}$+!q2Ncr zlTOrje?EuB5hV_4cI`n#kx3s{(YIu}Ub`e2V{liUT>^~4G+4bHHwHlUAg_|9l6Fmv z;?%{ok%n0`e!mpx4a5)A<#4r_ynU<=K@JieWC(;@`ketvYFU`3b;o#pK%Apz#aLD zmY76b(XHaoOyKB(yg1!{?Dtft+(x)|f+-N(1)(a!B1m?vR;P(fjYZUh4^OE}U58vf z$Xv+ym<_WqA-j!_wWUIiYX_n#{dD0kK#SzjlVl}oN2af+K&wFkM&*Hkip^Qr4IOX> zE!SINNUgHIG=&^&XF@n<5UlUxF=i=05j^I4BQo@|NoRs3nU8jz#{hETVPM3AG?v!h zPOD+!6;vWVy9Lr^Ds3>4K#QV9(7MOQiih-;y|9{g@!=6aV@HE@>qR4A!`j*NF!vIU3AKsq*wW z98MmsY@(ia9ex^EIyqQzk8<`?=IwYEJ-n-^4!%;L@)f`3{Lfu*NJyRh<-|xp?kxh? zOYI++yvWB@wIHZ$X-@>S-MB`K8VFa6&0GbRq*-74F zw$$6+uNW)=#1*!>J#%5v6i3ynFpYeF`usDKq$edf%!nyuYNk8g8S@R>iPAYSw?<9F z80M~uD#Wr9Sz*reeQm<*UzUT93(r~erBX)wM$I)!kW+BG z{rn0=&UXfFvGBU3;RceV47v??+0Aa6?(sH^Qhmc=N}&KA3|*H6E2TuHn61p*q@fWO z`zEOt7(y0oPL}Z`5w^5(H59?Ry}Sq0NEjKzfj?~+^0HIiU8AwYUwPxdU$itFllw|_ zP_BfUmoK_vj<>bVOG%N^%qz(6BvgT7(A5Ij=m#BL;?$!}Yegz4jOga4%aOT)lA=>4 zLsB`cIAn@k31+$-YF^L4vzKi~WD_Cs5I6Ag7lkG+$S1t68DZF=r^~XeI;~i${E8-q z4rnw&D>EtMIBbIFAra_cNHl4$V*XgF^>NY|NYNV} z$Hd;%SxA#!VNvhaJVViVA^joAt1$nH`3Ab3M^ImKdb!h$hH%s5Ju-PEIK#NeIu<*n zjP9*uT{$R)qSxz$S}^`D$w)@Y~M;+j+-{EDljCLGQwG_enTzbi+^8J-Lz&A2=es> zCC5?*q@{GJKP|Gr?`g6%Ms{0ioTCQ0Rh5XD#U3FmipR4Ygm8L`lWu6{?%1&u=wU*; z8UfOQ3>w~^b{Q%WBbM6;_XKFtyAyv+z}>A+>8!)8e9K&}ivuJKn;G2j?c}f21p{GR ztU3fquEV4W+GA72qd!ITpryvn?`}>PQ%&aSL2y!` z$yXD#e08j)K8N*HwZj`0!Q^lWN>U}OYdEXs6Q6M{Rn^2V9+-GMx`rO7Vwb&Fm(mzS zN3%TAmVx*vO?mZJ#V69gacesZOQPrzHtj8ok;urM!xT~=XbhjVA4I`2w4kAQ8Ikc6 zDM5}BB^DfZkaN{^Zcq}6hx=XiI(fj?5HrrL$RseEHM;gxROPnM?-L`bbcZC;VDO4Rnixoq0Kil&Z}B7$#nJqL)A@p!2l1<20_`bv>B$kVl4X{O&o!cu3Xmk_H((W_;DwX4!C z;ggNk-(o!g#hN8Uobwa~<>ggG#_HfM`2D`EWH=X4hjSN}-l#>C=F3`?F*2A|N^K`Qd;3-{r$mO{(2 z7$7=-2}IC01wqJKo=BxZpj4YtkxakNa*PB3WR#-#pXT)$zlCtloCvHU_v4iA#?eW+*=KTRqRn6tm4Ab7% z*vdGX6aF>$!__&8E)qu3)8Td9vN9QG7_C1N*PiX$mfNRHC7p3i>O9Kp70 z7mq1$u@t2v%8EBju_l|VapK#|ms+k9m8QakcKgLP@B zo6gsF-68rYg|n?vu0Guu>4n42XcN3Ec=WREh88}A-y;fJaFE%n#Oo6`h3OmR1(5l; zsCA;^tYoK3VmNiRQidfFaNWd3HPvCG%-p3KyR5JqJ*gi`Fg9D%a)-^w#SzIN6GuC} zc|?~h?l6fX;Pk5lUC*YdCH;1<-C%MAYyO(0WCz^@a_9jyt~7}g)-Ww1_9 zVZlg>C-JC6154=L7CWXXP8-QbUydNHSvZ9sAGVF4Mujq?5cOiG2{x8mg)PF(F;j*A z=^)|_W9UU45bGm^P>OQmfzl(2RKgscG6M!?G?eQi+XF==pvl`4)PS846!E?f(kM06 z2h?E92}a?_YeXBtrXp$%{TZr!`9n+)hiFc>1gj{!%joZm@VD3r$-fkg5V&Be%T+kM z3BrJ5M`s#Np{?~Y(`pQdQ_F2CG!}lWAr0KI4tl~1PNs4+B5>~Qkoey)onA00Ms1C z5NUS%xd+Yb^o{=3jMM8TwcH0PKg9LG86-AK_1yX(M4W=f^|?!!d$L)G=Q0qw`fHv6 z!3^(SnDE3r63YjNY%WKqs8fPyu_xXK$q4_hh(q2A0cU>7G;>mFvK3NKH4=mQEaa2^ zZM6D%YmaU-0Nwb>D|8B!y9l5y+;QkW&+P?c?>U;@U;KWiRM`0?W8D0;$@NK8fVAg*Tn0 zKX+!n)yZFU6EVa#DHMloB6{9Xd&493&l~ciacd9+3ds^EgphC}p@#G%9`C`|Dvl$o zHastkOR#H{n59)PQYqa&kxca&$vg~KP6KyCcB4V524I6D;rUTXlj1L`*VwwgfCjVRS+!J zqKL<^WvW*!q-h~!c#=csIB2p^pj&Z3hS$d^(`hUi)X z^nijHEGd?KFjw?ikg^`nUzEsFs|)=_0m5SfBN>REOVu&DNCPDEMlaMc>bH^d;Zl?G zu2a?m0*lUYoob4^VS|#s4Y=%Qnt5Aj9t;4g89<#EjZTqJC(HC7Otaj%U_J8u$=3>P zCl{jaR#bT{fWbWuGL|?034957)5>9_SuK{uIv_BDH=4vV_80LFV3}VxfUy)FqDHm0 z{&_Hci5!ND9F2P>)t4`OZnl}Jzw8%*jDU#E9iLa+H90%F9S5HYT%Qo5*fUMQbGpTK z^BAK-$U8*6-P{osvph%Uhy*LJS2cuD-ELBJ3*kf|%Qv)YrM8`HL{_UrjXUpEbcA3i zUX-s<6&{G`C(u}SDS{+Ofn{{+RzeIX;S4Z7nEMZa=@8(onF2gSBu;ZNLS(hm3FiWg zfE;cyEKbZfskRV#=G%v4lp2m==rO8E(b&l93L;u4L$FSoXvc;ulFk#5G)@JNPT=p6 zbx15!e`h)QXqaP-bePs&>;~~V2rB}VH=Kr`#MRftJ!yDse7G8~;g_~YgetO4T+_Fb zxnmJLO7mU(^cpzKcPAl+J^_VFnlYu?iAtrwpBAdZ4*im2l;XPh)n|t3FpS-G&`o7C zNl5eH=fScg!6p<)mSIsAdJJSpCKO+fsv{v14Ib-K)Y!fmMtFIg++fKJ0cMIlSbd(A z_hm^6Cob0c`mbE#JLZnpx8IbjBZetKw1F=ntf~yFi;O3G9bsxUXb@d**Tm7e3{oX(A|!j8?u>z zL--i8L}72(oIY<5G{{*T7c^)ye9g>4p(qQNRX9Sq1b^8rQf;(e4-sHu zsa2$blThGS;GY-9M9Tyu9lrro&JzdV6t>YWR+8M02w@)<>H}p3lB3ol@`#l>_AM*V zkv51>BsyRnbLJvK$XHrh-5CT`4L+2RnRw^9{1;)`7z4~?*#=69MyVqPJ0-{#b?BhTEs z3PzHc^hQ~PL1dN%A-1>>Dt0m@LBK)3i~yAs3wpHhyBbn&m#~q9bW|@dj8h=I<HW zWh*#WG6aGEocLC41;Ni1Ep1GrL7C2f0UoM;i28^naj=pJ#k5 z)dg^{Vm1sWKay!-2?E_XjCvw)d+-;d3RTyqB4G62^%F#yT^4Sz3(BbGJW3%FY;J80 z#yf0IAeRwTwOYUR{w}>EM2x0NVvm#&FNVRmu3VJx2xcC-o$QEZIMO2VPq<1mwCkHI z!cdsRF8`Keb|%j8nC%GMbm7a$+qfPz=(l}kc;o-CUh0O#8BN#Gq%FoJi8FX9Drqghp`gzFTOR-3!6w^N!2FA7}8kV zmcg>qBAVtF$$Ls&=aNix1aifEsjhrmlGs<1S!OaTb#;!IhU5~^S_#5+c(YMRcbnJ1 z(=eo(V(86i&#X`7`xM3sAIAgyeJ}&8d?*A6>W)S&7U(S=QJmB*+Fb180E42BEch-d z(?**tkRfO8d4Ee=(a>hr66yY;$y9*(;0fjb_*ob@!%hW-1h@ml0+<0%03ZJ<{!iv4 zjjH&<7J~9!JbNSoeXoef&OsrPXj(v`pZ=rd;F9i;EV}hula@HC~PdGZ%75lKwn52Rew^$E{2hdb=L|uKF=0kKAR+3d{x&#tY_Cs+v zPk05~W()=GJ<5Nzngma++iC7q!%fPl0 zL#U4=3f93`2*2#cy{fZaeo5h5JvA-q+h>)-a|aIg-I}zdbV)r$xfi{8Oe6xoOK;5y_+lTEQtE;_kxWzOQO4 z5xW^6j*^W|AfPq6`O80Bf;Vx{%B30mcig+J3Bj9(b0bw17`z$F2^&FdVp0gi0L|l( z3fdLIVBl7vf$8Ci9fY)pMb4pxJu)iDibhq^|H2xRh6qe>mw}O4hz26cy6|Qte$Cx) z3)cqZmXaDS{YU0qLERzPS;WThOiUJ#9jqrIKUNA>N@%@u%s2#@= z8phbj2~xG-F(5Osv8ckQ5g&cxvN4cih)ZWUr_)5fuqa-2f4n8}M>LmS<_^C?D>|8o zhVF088t`pFKH^CvXfhU<2t3m25#O3$V)9-gs8rT>B)E~=NIT7QymL%7&lpJxsbegd z7L10^ff6nVv+To`9X*5B972Z1K3?9#R-^u zkct|?t+c`=K{hVvQe|V`xsM@AV@XQV-b@U(*sQgukdp0;;Rv_DRXk+xELc4i*N1MR zYG;Zh0qek6T_!#FU1Ge$MwG&wRwcBU%Y@ZT=w~wEpq#)Lp#)&`Dk6r9PY_TD>5s3h zJ~6YK!YO}2sDdGud4Ebcl;{M2^^U^Ot!b!m@JKWPTPk{G5>DoWKL;n=6cz;fPRm=9hQHiCh`We?E2(`jPxN!~NSgFNOq0SaGbESue?f4>`cf2W5_o@0wqTTXuyA)& zRkP)o()ujDP`o!gB|8AMu>i1myR}jbRaO(ai6NXcjeDI$a=RihCG98s<|1+?22_KV zvdAQ9iXjAobt5t071Ynhki!PeJ}=)xud<-RL$5Cy+=L6Xh?&Sc>xG1q0W8|E&8aCx z+>P~&UL>(YG^iB!6*jTigd!k!wFV=ghUf~M>xG|U+}K3G_bE*joTR=e)r;{0yd|4YCpsIv$Rm|Z zjz7cW`fgxSiFzYujKC%I$|V-%|CUAeajdLE42@Y5#h2O9k3_mzoh8vxGDfBfB*vq00A!m3h)3qz-%mGLncCk(}2Q1pk8O92A~z9&_DnH zO+a8k05(7%-%ul66g1U!ZXo2k;1q+77;wi|My&zIs$$l7fH?xnE#U}A*)wo--;`;q zHz6HK#c-Ty6DH-3JjCcoyvLS}Z@pAQ{t{hVz8*lo2_fE=F)y)=RYFn7R*|#FGmw-l&BNW%28VE#+$Y{cf_un5a`!8M2OBr?8 z-&bZggmTq>$8h6IQifL5S|yKe@i@xCq*d(j4`w;{=WrF%I9Zuf|*3FVvCg#d; z;8WLqIL|b*3R421QqdgZ=NZR482l501zV3Cl8e+8)Hc7Q&Us)cR(%cq5{f;1Jhx97 z+X;cJI1-Gl}EIX5a(tVoyNnoY82 z2ls+`exGS;yG6qd=Y(?#fq{H2C8?f}R&^fR$2Ll#E|*=@al%F*rhneXwXD|R$3@E9 zLp>s$4vXqn`5^ugL1h42iloP1^x_DLC8AiWJ4A^K$Ip36;T7FS1mD_&It>k7c*D8LDTL7V)X}(fXB?{ zb2HEwa0z8i=xQpYGRXcA+u;z!Y?ID?yb%qAECmG6m4Hr~`4xEI;Lbs@wxkTD5S9xw zmJ-WIdIhk$Q6!Vm3*OroB?QbN7=TJ63<*L6UR!tIU*m;Yg>JWtFCkoOLKIOs;n1dfxJ}xszR;*D1@2}d4^wfjqrkIkxtA%N${Y(Yw-sI@s^RNQDlecK zk)RCQ3qq&IA$j4bGBZ$K#3Q4$>*bd=7ZNR_zB1($it}<2%_ho(2c)u#K?j5&mBFa+ z^ll9cL&K~;%$v}G9Q&DE?L_IYjfNQeOg)nGr}a2Kn~@fXLs9@lm1%QPJ0fe0h}{>E z3C9yNfoF_&`L_*zdtu|vK&)S4=10X~!!lDFTA=iSoGU}RV7&|>S{E4-(0Oeo80h9f zW6`B%ccDzWbeSFMn|Y57o-G$VO%=F>q+Fy-nFZ$pbQGYBped{^27p0((m_j^NC~QD zU$FX#?=d284BX(&E*=8(!63Jg#73f2Rm9ZzWkomASloRGETmUtn>iK9D+Qm6La0(X z204NmEig!WXRIkTPdjU3JSqiZM|7AonJCmVkm@3pR(Gg{I{VZ3?R|-^6(}|e35Z#G zHS5{F6wlotjSC2((@#Uv&fPo25p0u@<>e?BPp#1RskU7OKis>t><0E)mD7um90xOVDbb#4_fF_@v`HM;|@rG7Y03?qIsoNPK0}zTV zRubfPZGeB*n+YU4ed=)+s!xDm0ZU_i-1V|EQs)3T%Je1$p!PW+!mIejO2;B zMq@1y$j1L3lMb*wt_iCs>sQo8v6}_qTY}KcnAG&6sdRsv_;zQa zXhRBC7J|_WKynSrMIq>j_|hpFTo_#6O~{(5ROkH`;HvhF$`p%a)V-O-Pi4T_n&{B) z1-PN*EJ{!a=t4kG+7K^@N`pbs)J-Q0@9H2|2yLW3%cc=ZSuM#ug}Kl^el17M^<~VB zkcdda>=M7yF^D$1mt2V^|HRjO%c;n^-Bk!iP?Kvh8AK(oOnZ3vIl`7V8W(XcAr%WT zDlM}53Hc-vOd&l&&Uq(YKD*&aDVC83v_lLloysl8F_KI&Ct0PZ6_AiCwh6JX!_Cq3 zys#F@0ga|P&YPI0o`{xI6n(QUiGq@CN%6h#no=&zeq<9cm)CY0VQ)2m>ok{EA29o8 z!uakZ8$^0YyM8!quq1~hDJ%znr3yo#wsX-zvbnwKq$QZYbYBxy)>Lc?J0^_j77eUd zx)ZLZ5;KEAC3fPPm~`?-7bXG_f!rhSVvt7tw|y8<`;6H>ZWc7vU$iwtk}N* zh~+V~6pK)YO@zSBDxtBle5A@X|7Br(kB+yM*#VB`7#rrhy5N)HM64`coQO0GhTxL* zk*abwyUe)SLz*>yy_S~P41I<$Ce{}M$F#$if>NO99@P{|_x&scYD8fTALrPKWqX=o6DlMAY5PONE7n(y;}JMF)|6vLMb@F_uS!Mf7G~ zUk{_uU;0chl}G_pI2sW}!$Xrq;9jz;<7nS2IH|F8p&Mvseat4P7?sC&0$N=`q*L%D z*Cu=4B{)txiiLvuA`Js(&U~K-!!!Gak`u7TPBRd2pk8Eo5PIvk4tYnF;O4BJ{Df#S zgVq8E{~~o1;2|-5Fh(YqJFW<+e-z9P>8mDMMPQz^tT43nC~n?n!hgv~RtEt=D8#fd zBQFflPzTogWR|>=-$#e$h2y!Osg&}15!J-#`(BH$lA+>|S`;~v7b&ee8d{KtqcTvQ zElju^#iLqTKJ0NI_p2)k7=*M|XZ)_lzCvAsFX1(ail>R<25i^cADqjg6WT3e5PK{z z4Pm6sXv#~~Rqgmm11Ll)oYB2sRzLhh6GRN=08lq2UgmSzeLNh`#xT;^JMoaVLEF%GbbEEX0}7<>jqmgeU>*@@e4nBuKO4ic`nH`G;bFR%&cjcOxs{(|j1l1eKbtPI3~yhxhDD0J{(cLDHjY#gnK zpww&aj9*{WhAThz!@m*l#`F>_*IZaI+@ir;aFZP9#+rAZ9=3;I7f78kx4YcygiU@B4 zok}Kv<00k2WpYIgOJGMb1b%JP@f;G&ip!+w#*!g_VwJk%K4(Ek&M}D4yRCk`}HH!pq zhlFFmEDyJlROt*ehk$~`??1xQUXP_U7#&>RPi+FJ;QMcu%tvH`+0c>97A|TwIL#qx zw3vOM|3rRWZBthfQ3MougPPHdD4nCtG($ZFW>{)bn7OpEVWdtSmqmu9;ugs<1ef1C zw~Msr^Y)6Wm@@u7s9h~+6uI;;Sy)nfBk*7>@|6ToWTgRLu>ftDEcz zoHC>(>iUrVYt8CY;1dvhdW|%Cgl?3-)*fz1HOe9VD5`59>W+fOggVt^P&)+TDFbN( zX^xdvfm68@X3%nz*yQ*yowTspRZp&DER%%Q#kHkhCbF>(x7Hn&nein}NIeykAOTWK z+M#0dfJ-JKjM%ZjYY|36tF7wio2oDAF<H3>ZbCgV-At zM3$hEGK>hQg3f0s?1B6%u&)HZNef}oSq>i4Pd-VHG-uycMFn^Dm9c#`xMJvO6XJc z}5uV+=|IW6sbvlkmd^m?Q6DTz64CyWh z({!-~QhhPdpTltK7asVV1u-#@$|Vi%%)qvUObWA0qibC;TW|>Au-}BLmvNLQqb{LZ zTVq9cJU^k81hz?}0b3anJf2G6KbeE-F%Y(SBA(G3)T+3M#E^eZ1QlR<0~#BEOHQz2 z;zvUj0Zb_rNG_YWfym0}I~`UmYD#;mgd9d_Vj40S=ioExV~HePBc3%Z2t*3-hRnoM zveA4sdoL_*bnk4eEvJ1Tek6Y>fFl7kf-(aBgV}QuBUR^O?K%NCrY3S3-sA>+=MgTq zePXj(n|lkfo+DkqWa&mGL@8SHCR=%_6;VjUdO@rU;Fc8E!YHEpIf!LP`A4d^ORObn zID6_|a5pr!3(_yKch4K%_o??EYLv);*Q4Po%16M=G_jl$bH+wZYD$yUNoeYB2&Q&P z!z?HJ3&R|zONB3tQ8xxzq{~b;5;K7r7bGaE3P7I31XtE0x=Qs0%g++WN4m$VsWS@} zetLpW0E7fz?lk*=iF)?*DXHnZh*IX1Qq+UX0$?e%gC*|nwSPjp0t$6#Vg0i z>wq}+`BV1r=rkf`jrEF3JrnBat{~P>eM2kIyEG|^t%+41z9do^{=eP#(kjoejd2>! z5n>%2SkE=OVH@8hFvNIwL1GB$p|#x~9?EB+)#~;M!ktd|(##w=Q+{FrtoQs5>NxYjGH;J}FpCbLw@f7Au zJe&TbVsZV0VuR3D4#73pPFy9m zsWVmyjEx@aiDZ0c@>*jOjrV$=DqJ>hyDOzvhZhsl^O&0MoAQ9dlS?C#j-^s#P{2uI zF%{s3QBe!x+Z+t)1v0y7)NOY$#Vvjvm5s#1=hHJ#xLg_~yj}TO9kZcvE$#*9bSm0n0y|dAkNi6SNTwJBUilCK$kB(8(Q-G z*LRq!_eIn-@g|*In@%Zjq{C8pp4Z0M^tfX4ned-z>Uf>kp8oy++8#Qe0S|riWb)kCuKCk~o#I)z!VgxZ;3oo4IYkNYor)4tIn zL0oxP9E$=$M264U+V+k7=g`z*z-!d#Y9aa6J3V>3+gAvF^Iae3E3G+A44Pn7D4U7x zhh8C;3V;|~khO*$YZo~anZBcSQoxnv0_9W@=3(I-Ja+2;ejq3F5gqa{IuV zt$BD+m*-mhU--@W2K&>_@2bLehLRECi#Vs)m?WfMj|4s{j!WMK724x<;@K%A zwQ(HjV5{8tGrPJ9N)Bm$#f6&SfP-*jC7#%XRHbSfu6%8y!>+L(?g0HKk;y(9cS@NjQf0xgM0Q0%^h|l_ zPF$?2>>tKY>Q-Vi6}`u8*t^-Qz#n|r3W^F?!a&ds&vNgpz~U&Y9@a<(b^UAfUH4*= z^ygaL%Tt)_-To@sIVRqNWoDO&;ZtYbNl}}KIBCec^+cHDia|*m_b*;+$jMVwf zG23_WqH@;1@VxZOQen)7yiTz@0 zc1v1zBeeoC`FR}rs&`YG6Kd*px*Mudt7RQFkM+zK@KG z9V~Tpm4(W@C&{s2>aU@aWaG)|@2XAQ#EpV|PY3tERTH7f=he!GC6%?Cj;k}d61uBP z%oeF~r0rX**?yRnbsn!{0k_kTMba6od_`jEg5PKOqHCQvdYRT5xO+QEj%H6L7~g%u zTC3jFv>0j4QV#(XB|8B@#g9l|Utdcg z&WO#Ju(;5nMDx&jQ6pn``q~k~!0P(HaY)oF6RHkBJal}yVe-O3%%8-F_*OkWN5mL@ z{me>iKeiN^M~OnaTTNe39ql=J%n%_Ric^}f{1evLR}nSY+}qez9}OEwxx?Cn3RHx> z)@m{I+CYCoR%8NTI|%^vH3p#>si_L|VER3yjO2IDdKcK*ZcnE{#$zi9KuB%TbS^Sm zG!G7dkx;TeV;PJ76G`_@&0!%aM8zqrZV0^mncZ`XW(P+CQ39j-a0-VbB=Sq@sI1&= zcnqr2zGzB1v1&DWK%PhQX*fh{B?uAB3lz3b5!C_LgC9N@^@DaUXrl~npk!f0dCVXj zxDl@+fruU7$>5TC+DT5|M}fs`w1;5)uPkzaF)}6;9&s45PNXO9aTtlb^bbBiv=fOs zg`OaM(FK^aOKHr?OZ6ep@#qJF8)cE5D8BlV=vp91Rqiqebs775+)vMt$h2Vs_18x4 zU&G>WX`K$P_)#X=q|H{B(}sd(g+VHR`R5M( zCvqQgKbmyTgAQpnsp!>`AgI2&IZSO_Wfu1$`Fmc&Z7qF5E1Sr-eSC=2z>qNo6xp>t z=w_Z}mTzF{ED#=qB|%?lRlPB_Q)#g1UAPp@ujEkASdwou-n1<;IbyDYAsu~l_U1FG zG4($%zF~>Am!|z#4NJ?rvDJ5@3`Iaq_q?W03Sh3PT`{SSZTV084{0i_BB0z9C$$8H z5qO}iJVrKg@_FJIPT_p&HG_N}df4PVUqd*zvaZQlCEl0}5|BhLLV!FIA3d=Z-O16+ z#$zjALfp1B-615#80weG$6=`)?X;!>u14v^f= zn5lFcD~sF$Ar(YJWF)e0YW$@ZN`5R)pG_SSXqw++EaRvp%&4W2e5j>OI%qHv<>IC3 z-x8IZt1zob%OvW4+Iz}NieKF%$YBx2Q+6v{3RsV9(**Dvx3x*c#BQQG9&F|a?G#x@ z!lwZOfk6K9;2m9y6g8MXH4Q{_lm|2NCxw9z?o^ZYV5oYk;KGdBz_cNUQ3wT+L}!^( zOtsN!+?hl#eUo)z<1%5M78041~m`LScVP^5M}W&^^6x>a+^DMBQzZb!wI^ zYj!JP_i!>CQv}uM^bp2R!^S{JP1HD0EN3H~|P_#m;Z3UZOs*eV}31Td`TD~M&&o1aoY&&Di^*xitUxaGV+ z)+n5eZ;9rOIm);}B=!j{8bwydy0Wz|9JP7OpZ2+_< zxVHkn10a$?{;(l#^#{xsrvh`u_{Xx0l>4$l=9sHXV`jlPH@qEQm#H^ZAor%(0i(g| ziy>sS^$(Hi(#3u4y~XuBJ&veBR9T*esQ_B^rf{XyYCQ!5Gs6)P81C^M-|(kRlw-T> zSvmv=>`IT#EC?s_Y0l8lxGz0=9eHXiD>*Ft{}67QX3qqunLsrcoK-j{3oIDJ3%b?eGkgzWFOaTjJTKT-7P$!_E>AZC0Tt z6Wf#TmrFT_tE}~lQ*bf~g*%HuT7v$eI1}uYxmMb2h?+s;=Gb$Z6rP5Kxm1RCOh{Nf zV*L~7FK?BUmSoG-HyL`4nR%xgDO!L_LyzksP`daenGqYrpk7c3RsL@ZrBW%?GK^&s z_?WcwlL4&DDM8W(peu=5?=@jKq5#K1m*(5v#;6RT*vgX|A7td>utEzS=HUf z5~X2!hMdtwA6s!8?0p2|-p}PAjz~4z8SjQ=%2_~NWFM>*2m9Njl?biuZ6;bC$ojYi znrZ^E%S}#jbs=3@W8ce$FsyX0vfCMXO>d6pL%?`4<905VR9%QIl5pmqNFh0`m5!gE zy6F8_GKPl&MLuIk!nrwkFB|<$ST#VmWgu(F#1R@wEYnm1Z zSkDPb1G#GX#IuykED%nu3NXGR$UUcuD!eH(IPai zj)E@Zl|#*niEAbKyT9e-Wuf<997|bLot#&~2F6?0@VG=gHb*ETRc2Eotr%%(QyncF1n4Ql zMiC((S~D3Z8J-8J_r(7))YlLEro^umFd%#zIH$IALY#FEMFht=vN@Rvr+|!GIT;6k zaf`138#A=Ua(ie%2%zNgnUR^^T zaJQ-?$rL;8`!h$WxEE=5ZbQoW|A|q5-^Eg~IPAF`&+&Y`N?md%bm&bv#148*BH4{( zvUw}N-Ol57)m<^@8JD%SWXj-L6e@DL{ky8 z;Lf{srH@GsT;leSbr(WW*2r)>idkFlZ)!4R{J=&M{%<2J1*e4Qt3-TxUwo25#7SRs z>u=~TtdNc}ixtrTfGG}1hr)A8Cwpt_AxiTW_(gUuWh(;vdkJ0Bb1?m{Ji$#s$E@Tp zy)}B(3)~OCa|3X{<(hhwW3oemrV-f$=Lptdq;+NNDM|Gg=IPPHF+3{ zjf3#(oT?W^aTncvYwqMcud623nugFtEFg+UfeBjw zLTj;pq1`7F377IwHa7t}l0e-!hC^jjc5PB6>`0kg*)-@$Z5f*#j9uDE#BE6gyITx( ziuR3bw>gl);8V$DhV6lAz^f9lXI7Y91S*f>qv@C>qXpy7T|gp=>gGJpsg^^!tkG?- zih_-|q7n;Y8}k$V^vWy`4b7b#$|@kj_e5_oh@-mrr_G&3Iv(-xrr_}+`Mb%;q<}ah z{&F&>8gWTr#OxQ)Kl`!x!V-$RbM2lbAS&BAv|W|4g4tW(`g`2}_*ob^#7^n{>gns; z>_hDV?S$>2?ce4jwyA=^o`E8Zj4@=9y;g|yOh!7YmPf1KFCc?pIG(N!sSz}`_(>Db zq>*?&2}0l*525TO51}-=WfcgqP|TNLQ%W?I*E0y@6?~C^wfbpr8%4FDR8JiRv6S3d z6hk@4Pzj=7Lk$DaYYbx{U|bjsLd)C36RH@9v_L`3!m75>kUSDAZ%u6x(aORwnv>_! zk=U+H8lDp4gLArksJEY#!jzn$Rp@#!=`Zn+^SPJxcKI6Fj#nlEA43}x`;jbBPLkM{ zMN&$x)UWEB@iy&Gn1&qbw~D#5CDQz~hANM5udOsjqFk{WX_B0adBVF-KP5j+Y*PMB zFOa>8mFJPmV8MQqC?<%bTD#A3g`Ve9zt<$|)C5Z%vCEoo>r&1tf3 zo^0|gR+9W;jW+A+XQJFQcB%(FuIc2EDk>l+~=Ou6?+zO0{Ni+WVdmy zN;-VI4>&xj>y+nWB=V$1Lh&Sygaf%zayh>?C%Z4v*XRNbua>t)r^+{4br&TQm%Sk@ z@~L%R%qKUcVg777QRY;Gg~712NR-*goaf_RQmECvfkg44b8x)lq97LV@zwLRNjxQG zJrXuune|YTnD}f=Jt%JpuT=DlC9QNp*(sW6x;cM0nlU4Xd``n<3pvSyk1nq_DqbJ* zbfnTD84|h7g(~5Zr5NRVWH|EEg^eDoyu|6J^Wv$hZn@?cyV92Y2;DrTTTVr5e!51; zMr>{_g@$rrt<<)4U})*mE@$VE<{tMu_k$kybvJQuQoLcpH=bT4Ae%$lrdIS}Q1l73me|CY0;vl2P4#+IYmD>>Hx= zq2p4ohbnC?rn7c8+ZWd2YR+4`ZfP>Nnj_aRBi;Wn-4niKxtc%i#7LdPCCe9igQ`TI zcLch%PwRIsN!4${EvREFV2}-3YsSC2w6BMB`=`bWodze;AqKZdoasHXtq+=mtV#1t z8E?91*a^vQefB{Y6XAZ2xl(@;u-^OZ>+C!H3I(f2_~#4sZAm6gef&1E$OvkK7MMM4#s%Ygif83XE& zh8SE!BkMq#xWE#hq-5{%`AvLvJYR(6@dQC{lt!fUDcoQP#bThEcn}EzjIMMzi)GWn zfY|Uil+~eO+{SGkRg7$+)9Z|wRceSUdR~J#OkKYmu0lS6#KFuQn(P9qc&xA;jw>c$ zTQe&HYKFA1D59m=->^N=w&}{1TB|}mQ>X7bxbS$AtZFDK)Wnvq6Jjb8V!*ghXXHE( z_PNlhlC4g{1=~X-^Y)~hoo7_<#-=h{7IDUo(?tT+RJGk}_ly5+l0fgG z-}n;83hfzDAKaE#wi${EI?PgHKaDLbvw4*9VSXm=W7cu2Up4+S_Y9N0QtB{oDCYPm zzjri@NGgKqI75&h9jOJB%uk?(pAbla`vge|jx^%TZwW$O zc(Q_iJ(;UNz=Tj0YRSE3C1ahSw@^(-#bB4Rm@nsV%0&{xFa|nFH3EmYi75#>`X(*v zI`;8n+_8mVH6G-ZPD9xssVk&CyXe=^T`rq9FTc*}Mboo`Y0K7w&5l>`k(}@fj)??B z;W*frXnHMD5G}MnPU+9HFfL(To#%@9skXQ++_*)$K!Izqk?GT_IS$|ulAeUY!Ls;R zLnby$Ug(b0s-Lwtp>A`SanAK#y0?hCu4`l5Hm1ZU5;fGKmyv7|AE;6A!bZJ`3baB2 z4Qfjvyw}^vc{HS5YPYWSIGQkLrX?@L72Pzs8JTl@)bPT;B%NjG)R9zTPsb{pbr*J? zC0*7NkNFCNmHJi^g&9@lAVFSZ_90%zlO1eIBRvOXj-~KWMv|VE*)8liH6DCLs?Oee zH4DJu=bqPvC7|hcokz1m=|GcvNq&^YU&<3a)9!-9+uKhxORwW5sD!8F`0}%z7@8`T zl7^x}?OdN%=P%vrhP`irLRnYpS$HIz5zK1~GYU?^9`?T-pU;N0BW6{RN6Vpq1kqkJ ze)txSRW1BQMGQVw9^yGsXk!dSc!q0D6~z+uWfR))?;%tEt@V$qe62UvD%)t8^4^IN zoSY_QRT^Z+t^^(4BR)Jb0_Twt8_@X zs^V@<2|}sOCnBNC7O5?UY`Nbq_y0M5J;sdSCV+teg&v0Lyc7UYfL?=~9e@Gt0ASji zdR73L38;gF7y{!=3ZeG`Fjw8Xn4*AAj9@(ZbY!0rwv>OT^vD(TeM~3`<0cKu1#t~q zQ0ocI>ReNb!Uo2vD+0SZ8V~MiIDZ)tLtF$@)dv7CWN3A;!7vh0O(2gLc5BR~treIP z@in!C3s$NXCq2Fw3Sz1-xUpPxk6d@raCoSa^nrd2lE;)24_JB$a2Hko;8cS#$1OiG z19S#Zjj8F6b*PyaVO~htZ>4!>3Lf0v4`E{W5kvM{#2|+!>k>$UnPBN3Y^A}mZ|Jr- zX_^8JfWtosh>o+L7HtgWEZF#&THRpw3#@ceJde;x9;DeKQX6XN2P-49<--s?$)XVg z^g$6Ad~l^735r^85i8ZSiTa4bWW+r1;EX>V&EU?iukf$dHWE|vz1kjKii4GrnK&Z2!pqNyV!5+0rQJG^^5 z%j!^5GqL%ey?<{YtZrF0)tB)X^Q_MD%nudCZRP*M-S=^$N`EHFO5fJ1Ipa}mxxQUo z7A=<}mvfUd_j>|F+RRr;q8#wCfz*3ps^zKR z+y6H%#yCHS(`tVYan+e*^>?^s}mH;mbC;@MOmOKHCv|}`6{Lc5o^=`r6Sgxrp~0^ zS)1<6@h=yV7e_W`Rjn6W!JSiPfw)miz6sh3Kh+qroOiQ)v0bTxfI=#LZ(C0n;@8Qy z(nwJX&P<6Jmbemtq+4ph{8wGUY2un1T~`ZWf|rxOhbqx2*Sun-thjZ)l4^z78^}s} zc%36QbL*r1FU_}D26x=dPRFgXG)_8=$b>wJC?su*&{w<>ty78#O*!~BrBx_xtfYGy z1Y4ILR?V*LGBN!~$xmkVRfotuYZgDNBL{PlGh8yCAkpW9I$biLF!HhwX3=BBB5=vm zj7^xV0$weD`WmQ4VZr9qSQu(G`YO*|mz?%s(b`KSz>AkujiV9KwaL3zD3OgBG&GN* z379|hWw7Xxk~H)AskPueRE#z32_%NzUn>cX|eI{ z17Q0@Zq!~k$>%HS&QZVWAM2k$YTcp%C^b>XKgrErR^*0_@R6BH5+XdSzP+cpd;}ktv6x zfoWq1G~~gc?ds%Lkc5GkJf&{(iASB3 z!*3H*h!X%zjdENvNk39po>MKQ zkU^&?4zI60eNbFF<0>aD$}*j-o>Ov8P+o&#`JyFuf-}<-KA)%Ybe{16(@NqqGYW8Q z#(bB=;&rIkYRbyOjHuqdp78_x;c?KC3YU|TO2a&8kw!qG+W2{t!_+7WTu1G_{wa*5 z#-fSmrnxMdvlnd`Zk5N*&u08fhO4h?=2EbY=W34ttmD1bM!=wXtc4Y2;U&5>4m%P{ zQ0+3Z&=w~^mBTs!NgC0G={)c@N&iR57r20!2?Jw*h6X`!Ck7L<%^5zwVg!Qmxkg6|}&BYD4#447>;&9{~hC@KM zY&LXQP>a^|2zLbYcwIO*1{GbJNknG^H$)}kwe=A22=6jLBePoq(5@-3lYqvJiVeeE zq!kOEA}SeWD8%l3cNIubgx2J$<5j4Mw46q;KCHD46v zC}2&Hv-4>dqE+W!DE8}&R?g@|+6f-?Cn~q#l`dg(ica~`2(@-44lqs8iq}}}W}ol+ zT?fnUMmp5!FpDGg&U@ClvqR|al9XtsNy@eGc9E}+$q5*0h*xWcL)D=Qb@tyh=+#2M zpvAd@P^-y8K4!L1sz;nV80}ql8Jq3AUveZ1#0SuxCbZg+Q_CuxIyhTmFAj?AmnuzF zSheHEFzoH8ms7=43KT4$1w3MsB9X$vs(2WSY8&*;iCfB}MEQ>2b_m}PIv)dxnq>%y zvQUPM#k4WML(Gb72w7tl8j{l|vbRVjBYsxF@tHJa2%}fYy0yvBKT@TiRD{xZgpCu6 z(QBoWKUa#CEIZOh|2~Tc$<=*d5HKXN1wp{E=x7sB-_%TBpQ9J>fff8#hMtB@;xeGK zL0YbbTQM6Qt9Z+w@OvknwGR)f@1n}mwyc*zooDQ>;lm3ALXZCn6`N($rPeSMa28Z!)}- zg}~}$d%8cP%<4verJs^`m+I>4B~g3Wd96sZ1v-wz@+qr-2PCzW(OY~WCzgi<*~VIi zB+vgQ*&-z(G$T93E0q|FHvBi*E{$wulEuPh`I66m%6|TZ#b-1EEw);;oNOwxC*V$1 z)HL2dvmDANMJ;w#AGc>(aQI)h38z+e9T?5{$avPHW$3UYxU zRyx9SF(!B3r%<*A`}X`-mCqF~IiEjnAx099bczNza)-mf!jL@5lXVNB{!dCR?HGRW zoT>44C*+g7+FqvF4%aA8G+VY>;6;<=F(_HfkO)gQ=Jo6O0HQ);s@Jho^~DLM{fkhd zRDUfqa?5_b)C7oa(&I}lu1Ym2_!Eqq^h!1wxLnYozQ-Rk4A=Z{KJ51q^-(lphxRfv z^Kt~Bo98JIUI{AA{nSvT*U%-QUC!rb8D?=9lio1KZ8%rL#EPJA@2*3C4o*b5!G>)asMLw~{s! z@(5H|ruJwa6@tKLW{864P@aM&hl2J!fW#=3M`oXJqWzqE8?}!M5dgAd*9nC(Yxc14 zN4_=D1hP6RE)P&b>fRSAd}wl6Xz8ir9Hgl(o($CP_lrze zS1NN^jjvsRn7@EMSFwI-F)H=qFLT8)7uwtlI>iXzBi;V)MbWI*zAGI)U99x;@oygW zLH3&iQs0#fCfXxT{GTaQsW5l@dx>0PCafyzYD;-Rh$B|jgJtnlQ;^AAh;&W>pDOJb zENei$jKe42UE8&X3v{Wyt1ZYk&XB@uVGx-pW;5FEP`pGsWLI__WLZ}QjARr=HKw8Q z393yXuC0^VrtBGrMD#dGURm6NnMxbU!f!WGR+`BkTJMno{h|bxsXlrT6gm#Q6Rlu! zQpegIXAzm+CMKatb&DkFXRt=28@d#)=hLa%RLki-s{w)MBoF|f&-%yCOT~3Y6lyq+L+CxEY zm2JtAk+6q^OMHF|VEh%pofPivp%|~3r z>Qeb`LE|q80{}olMkj_C_ZWt##5rDsn-w9kRiqHvHV+q%SbXF?Iak(pPZI9bfAFZp z@{RhTM-r;d>XnTCEe@eBW0J(0F=B+@cK*B`#rtF3@iBNrthI_+Q$O!1l~P<+N1(Jw zG|VSn?4}lH)V13( zjYSw$Mxmfb9wxcCeUxO=X)uz-QnbAVB<^W}e93tcaMix;R_FhMN#U`Gt-4ub+skE!Zt|Kk$!Fd6xg zl{p9YpsGHG@T3uh0x>CxB_C$Lt5C2R8b1p3FTYg{L(vC{V%brhtt7^OXSk&L%C!2+-&LZga z<9&QzlxBFW8RG%E)(rEIw2a~-cuK4b8X5y0!vr)abW>JuxBT*Lu zNh$kUC6K{lA7%lXK(bw$GZUryu;@Q5rm$8!*&+r zJH2-1Q=3jxMD8sH*oiey@kDPE1bWGX?e|``9R(yjH3qb1H*0uO`~L-P68a z&l9NFBLuLG907h1K_Wi{khNtLix;=|hk1M?wc~8m^qn6e{xVknr7l}%wf52M5?_VM zSXQIlMG65NB*Xx?2m>*M$u>{UJ80H~{PqtAgM7fXZs3bk5e9bF5TujQgb5b-vk7kF(p#-BwKHS{|T1il# z)z+)BD6}gCi7rx`r9AQkT?%Xp#|>$6mwa;>wE9?fxgN%9C$ayvnqJwt42i_u=UZm(0aK4>gA1Xdea zWg#mseC3#%udPNjdS9v26kmz92-!4K;TBb#p@v|NaWC3H%HZc{MwfD3DR(|Cx^BvS zdhgY9Pc7p$qkiO!*BO`ENA=89QATKrQeBd_pR!b%6%ke#skYd;Do&B^QI;_6Y(g#3h%>EyP9wmN!qGUyDZVrLv=pazyiKy4r1#Oy1 zhCPk5q(hbEu!l^&pUD1sQjp`iF$&8Af%f=i);ta(Jps8wFA>{PMR$8{qTYVpk zBjiz&!$kZzh4GMMpG;z;nOXT>d)jLEu`HYR#-^;j&o?u(R~H3&aAAmZ08$X<(%^$F zP^fo{Q3QAvBzZKO)%>WdO2v_voW{7OO{*#FyKalG@aep6CX_?;RScw?y>zr{s~2iy z8Y#k_Po|j)Olr%S+2U_#tNQbj(()l^gp8B20=491_H9<#+RPts zu}qQnNVut1Mr`a_W&U}+!aTtuLVW8`i}2APPIs=2)c=Fo=!a-RMY9?gb)C`3Ej`4+ zC@2Zx%r%t+*VcrJ#Cf`WZik7QF~(^Ig;eNX*L>`3tKPKbYIKoZ^QL$GQ5Ck0CS`lb z;1)svY8{4v&JdMYBvvhqD)d;fOLrOH>+dQ=Dm$7AZ-q6z)TKl>{JI-DE?%jEIgY6( zUtB~J=N(#|xWitk)m-ut&c6P+L(YwA$`3&R5m$ZCM!xyNl%!0Ghr*5MY$nDotO5M8QMD#_{V&*(D)w`c{~dv}TBj%0;2@D&62S`$g?$9Gj;dNK3|*NOhwT1ll8&hXrv6I~2mO zXE_6Tpj!z+P~0sMs$|O!1zLH<79`6|ts~cLx2hNa5n909F$=fNV=9Rv z8IZ&iLSyhqIij5og)u&tJ$HOd$uTSB|He#JS&dFvn(eC?>DP-D4D(ef$>LnnNzvzX zn3EC6BQ4m)WYbmkvo7yh<33_WQb~G#QFS}tAHt1rL$V2@ZQ{=+*&LMGQ0XG!$l^DG zKtK**q;e39sJqBt`cmEUy9tpRU5<8Z|EpUu;RAl4s!eG$de z-kvDC>>_(f!ggXzCvw6BRw7pc0e1OxE^pstYlEot!S4$bBFX(!}K%q9FZaCul|Db)%*6o1~G03qnt7 zhVA0|f#+DKPWlBbmf2vMN~(Mx(-lzqWIH;ILN zBlD&5B2x#MrAaKtIDb}wngQ#piBL-uH%FGqHorsid$=)7ACCQ;Pf5b73m3D8T# z!kTCM%S_LB##XNN}VO=hH0QaVP*As17z41ZDx zyrk_*YCN03tTnMNK9nXR`Cv;Az&2zabJoit)<|_YJ5nKqZz0_5SFVuVo6@MjIMG!( z{E_F$I=?W^{LeXwC1==JN`k4H6-VCxbJa^Fc;0@^UHPKo znJnZ8l;65+Ax()L#5WeLBv$x;procUiFWiPw})x1l?}wul!fZQ;)-BK#f4;ZLz8E| zw6!|GF62y1h&%UYnZHaDcx0(Y`*skrfatO#h2=A@4v0NoQIXF(b&IJbBE}V;ZYczd z$`rdnPbBt2cZW&vIc|L2yDI5aW>{lEwLYZ8SYGpTjxy)$LJ)1wn=@2FV}I}jbd9e@ zH8*X@OoX1B1H?^JNlkoPJ~k<-(Y-Wc)AFtxj&mzq*HE371=dNm#Yo~M({fB+p0}gO zcX4~zxvEDG_e(+;;T}fk1iaYg3WD|=6Yv5}VDG%u8R%lkn6&4jD6b|qR7Z`%wMVR9 zLuXF61 z>rI%)LZJMDz^>oH`amcN^e(_Ty}oVbmuJ# zwr>>%tF;5$mbO32j>-wJ;tlY>YZ=vHBR4K@jkzZ&xQ-y(1GS#7S6AY>sAS@tHs8lH zh#v0DVw=iF5@Oyv)WR9)LiJ4F=T3vJu87ymE^7+DNpCzU{Tioa)qUkMriD*U#XPKt z`xe0LQ`5e!=T%}wHS4u#R?J^k@g{*tXM{{fMRczHk-L&ndYBSpB{K^xS?=1$e$igf(_qj!Qz%-U z{g=Mwtp!Kb-!In@7y8`D+%*@J@JpBGxgOf1WH0Fh{E3sq_a7?8IV56IH{COZF7=Lr z5w!k1*-J3;a3t%pD25WILHce7!M=Y2v_>l?QBb3~KBWP**%@em!5B_5QLz~MDe%W& zv`65A8UuuFh6zcCUPMQuv(S-&XbrH7H-Wl52XM$`BnTFBRlM0kzIsI=g0kL3)9xV5nLHrWvg{l zo>VmX4Ww3`;oj>Xqz)_yOM}EteCgy{aI+%V_jf0CGbuVoVM?ryaZjfv)ESyh9FWKo zqyt69-=RCSguj?@y@iBY+H^eR-+kV~oL@D`hShCC)ZaQj75C>BBkd~e$UN+C)1GbT z@IyvN%45sSkq=IC@Qy!Lyqad|wmHH-oWwyltmmVpKtZI9#M7dL;jS^s^2$x$cKoT_ z+oajhKL$`zpCb@kpmvrNT3ZuxEjP5UKDbkx&O}*e)pC<+3}GXr&ncH%=ZM|cuSb@U z8Y~^DfFy__ty+~Yq)pWnb7s4hxbEdSSQzEG%uEF!#3dds(x3IU)0h1{IG>sF&d`fn zLW{d9E;l@*9=0d>UFGMOc+~pkA9as`{@pIEmSc$QP!X&oFx{lmKgc;UYrLgx$w(3yEQESVkn!(0Gbnva=Cp5+A`^kaLX2F zXe`~{>y9fZAH;Ng$1>8ai`*XIbB!0y&i+uMEad??0@wG8PbGhsh$89SDTlVvAdCIP zbB^2*n$;;*Og^DRGaoe7Z)L9vN^&jX>h0N)^&WAk=i!UcNb&E7Y&Gh>!%wR*@natuX5gxa}>L z7iVzeALeK+PM%3ZN&SHb*81DvFb05D33i1BF%;X*MMhf^mN&|Y&^t5Z>IN>?szp$IE(>hEY;m(_LmRM3y~s;;@}R2Pk< zY>^I!tgGt7Nn6e7 zQ!Zj({eW9K(JNI#7de5Xe9wXe-xNo&T!lKDyU7ZqZTq3fv@fW`5hG6yo}Qf?(#XTi zBDt|b9P2DdKjRg`F3WjB0{C_gp(p~7D~7?uR|P?hazXovR;qpOV54qohu3^1)uZAx`WVLd7lO<%)`3(q%%kkAL{^2%k)*TkERZ?o7C8{j>ut2F+B-`7N|lYa zGt6B+8HUM}V5gWbVd_Mhj=`2T11L4ayv7*DQMh?NUMN+igvnO;R`+Pf2>5c+VAj6& z9?9Z}hHK5%pxIwX!oXt(@t|}AV5oEsVW8G2hT;NQu^v+zm&FLt*{Ls5#wq)m^Z1Yu z`Ki9;_v=P*gV#Lgc@Uv|9D?xZZ7!j*#Mk#b9?rt)44BUNYmPS4KdvLtlvkemifK=A zSM-)?1d-w(xw#i7zg7M;#JI5qP%J}KVH9ds*MmLYu6pqiJ0=X@*6_BRSvOa7<%S~G zr#zL`@fU+b2{$hdS&!(b=}K)z@CmX=eTriV{zwtXY}U}BUA6kpm_QTTTb zhpnx_cU|P!jyKFQjG80t-WH=X{xVI|ta1RQ)BpHc7&^^P1iS_Y24@EN2qXxE2vrEd z<{;6zfT8NV>KF{wqu#w%jQSNjCJCcw<3gRnelD$b6l9|)du@b{U!a5H=abi?K`#kX z_?Ljz6+I$p0#QH>^UTr6N`0dz3ZJ57AvzMNGFw48p(d?n*1n8i$sUrZo`S*tw08a& zDcPspO&O*yk$kq(Dq}mJl7ZFW$t|DB6tE`5_>wC7+tKW=5VKzK^LOXOk~+iyE=Gzl zqwFOy_=M!<2{+05>%)GEM2auJazZ%PMjoU~yqT-FrCK49mfEiksHLScprBp-=Qdyw zYy>o89GWIn4{wQA^4)xei&W%vkkF^5S_hlh`BAJ$4IGleHL2jj^nMAxLkw!Am<7U_ z(10&0zY(g31cf@U9VaOwgYQUJC@+FY%9MJmy4L3CyOi26mJjI5LP=fk_~7$?KOGTG zG#8Pc<E!Ca;a8kZR115TIL&j#TA>Z<3oFs<)D=#NG_Zcq5P$om|NG} zPWInoW8JifuN3y871nzRWhAVP#E~;CH$TW$wDmqyWxa`kOL{&uXoOKpja3U#ugmL2 zHSIMtmkSJ}i{wP8@a zc|<7<#KBH~V6ilt(uy53 zpx@KO?*0H9OFaXk2>L5;S_B~~kw|qm;L`DFy8CQ5 z%&ErYBRk}i*Md2mTH2uH6{c)0yy|-nP)}yBD1KW+#QHd$Dh`6WW{z>xt-cY9xZGG$ z3we6hOD4Ygv8mUN!hHM(;t(VX3r)odkPZE zC*k17ZKX8~EGQlSfgJk{2KZnp)+-lE=qm#-$#Bi1!h?)ZF4^o`P+*3zCJ5y`Ekq&C z+pB`g=wHx7w3iZwIyiFNVkRm)FL^d|uKj&-6J5xb4bcxeQX-hoL$)XOX@0|Y@`+N85=+*>kO*l6 zpgHuWit#G-Aes^qRThyM%7#(X-aL#f?x&&7?_K=JnZ_;KZe! zy;K@0+m{JCPxUy6GUnmGo!k1Dxl*TaNhS78lC)4ewDYLeFMFEwO-$7x8BI`! zbR-xr$>NPEW#Rnjl&6(PKIvIYy2aBiM%=qXS?{`CCKI@;tH#MZiiel%q9ZB@9deG8 zT`kzfMk1Myf8bQI(PimrEQuyFyt-2Ii7Ai$T zB897iTRLt6!RR!ajbZhjHHMe3`^KRl!X5G?I}tL5@{lStiZ0}PBe0Q;GU2^#F;Dx$ zT|0RXBp8HHo>uiWF!1I~TdS}XJQ&(r6l^Cb1c4Y+EI7@;a~NUgp7Q-@6z!_ppX0LC zP>9F0=u=tz$9{Pe?iKHP(uOr50E&4|vYRU(W!*%Q-qjLQ5EvvuEjWsXn*UF@7O@9K zgvC7bg8bI<87_s}w6NuL%X8CX*JVg-4w>s|Y4b5YR^9FZ2{&js#OCJ6C%u!_otpx%)#7q1q%5goAO#3_aM?AR2{4 zQQiK~F5{|hL>3D)i~*C=up%!D&FRsEg7D%iq70f#$rtnwNRGKwQEn}l5EC!eW5rV! z`G=`=(IynPTJwx?Vxt^#Ie}A7i9*XG!Ww~f_0v7o_T&7Dl;vFRQajBXMN&Q6V+WIMNCe0!ela z6TpJ7w0~wHhD{qf+862hCyHwEuXiW!;;qQNu#29 zwYU?`;7SZQ1wv(sq1|Bnm(!eD#l6C366Q~(;#o$+18TDXstSZ+xIkcTV#Xgn9YP?} zeAow7)N&FOwoy6Nf%Ehi*RiXu;=8MQp_4gv(Q8nJ4J1lY;E@!^zxmn&@#q@QFfIyc zhL?ly_C_kd@lZ%LCxt#6l(L&q0eI+W{NfVLM8lX8P#5MW>9kgDTTD!AYj@?Gz8BG= zS3~|rruRj&E@yMf&i4C6F7yx9AuYMYi3x~1nlZ7GaFc`(bR^( zDFxm^Ar?8A^jY8Gt4#L)hBC7W!;)#hdf-kLs+~*(B@#mjg^MXzlo||MORVtIP(l<} z5Q$odPKgyTx1PX-XPm@(0Kip_MptXzoZ(|>m+ph3;ei5$VMF48p8=Z#q?sv)lPyA% zxRSLJmqcjU86qF!BJoUv0L-G0)Lo87?@^#u5&rVEWcBEC{ZB$%u1{gLDAF0mH+oP6 z+amCI0z!5YU^tWy42Q|7jn6?YYZ)n|Rafp1;iRxD*IgiUVmzPQ&dEg_0~5D5qe)Jx z-TdnYbU2<65o43A(}wDS+b@U-zFy9%=3c8l#R&iJGIH7@Nu3O?j#{vPgyTf~UPW6O z+vv%Lp0p%I^{qp2u(Q#@#r&Jkkue1Zi#i!bgg$5Fd8H+VO;*A`KZ~pA%ZLk2y3kid z#>BJLcle}sVFlF`8Eg)L%@IKy#!NEC;|;EcCRcL83=u%IFY@Wm8uc>@S@IQ7{Z!tN zggCk^5B<(br1RoN^vZ^|xjrz~!Ywf-e9z|@v;Bm!!Zs-vF$;qodiEeNF>%Kkpk5-?t*JTW+^ht{}^5?PnMu0 z)J#pxBpgm<>$;Q7G1Nx-ur-nI$Kgm~P!c6on+{ z(IPPk|7)^wAMKYSECLJ?OEh&-4h|XBzS9Xqwjw%-#r0e&HMe_0Aw-LQ>`W#$JZ9so z?Z{J~A?Ol`BD=|lAxU-D@;7H2$Wkyqn9(ffK@DWDLeIxxr&gm10hUcR5h5VtaS!OB zsBIxbp2w4Cvl+yU4`rtI882HzqkqXse>A48AfN_^)*m5NKq4eGG`cVfHYYur-`3if z(~6tgl!W;WHDdV{7q+o^H23kyNLxasH5{zXi3d=eOCh@*4Qwqat98O8r27za#zgL& z6S37fG?XVI5<^g{SsC1Gu)-=pLiKanw3^JqdcpSELIW(xKlpuYcXDo6s-#oY%|D9_ z+p%Buy=4oEl}bvo+8Z6y&I>J1!Cfa#0Sz*4m$w8o=BeXct3yxY}fFbQ2{ARSkT z3CH)qv|veSyW`#|^FbpEtT72-#l2%qZQdE=W)2!l?gc`h4Au(<;*D(#iOIctC=&(0 zM2>Wt7iLy67c%xV5prWm*EpJVOJow#@f72T!spPKH**o;jsUuRT4(etI_WMiKDAV~ zw^@7C)kQLeogIIn<0T@${;WOzu!z$=RLC$G1`!?bcc*0LD-i^^K13TLA74Htn^4E$ zeSrYaJXpEX7`>MJXXKMX%%Zx_UHi+xA^B18iaETBqG?ds7MR#c@sMO1fl#7MHCiH<0Pg6dh@3L$A^Q9|rI&vHv^p8L_Inzt`53e7h=8c!lsM-iH>VHnW< zvt@ZDnJB7%<-HMfHKaLpF0icMGzjgVTeb-fCa{>q<&A^Tf9fhP3uy;_E=x@IkRUcV zzLQ=0#}lEXIYTG8cgxWs48>%{;fIJ`bYnAqtn3hlm;^_b^j8{d%wbRizeFW6*B)}$E9N%+VRi#7a)d{99{Y*9MGgh5e7Fe$h1+k8H}vwFb4)2YBOT)rfOGj zReP5Jxyp$w#uCLBM#Nc1qgZ{bp;B{sbgkiba8=Zj9f+#@;Fz-)nE!`vA=!}vONI;0 zsBB~GTP`fL4ifTVB%*<`34ri;c3Z;>_^`VM8qd>( zW$deZyQ+)j9DT;6eG(MrJFW2sURWy6gnn<|uj#XX$Pt^Iai60xJt8RDoS-c;f^E8h z88DXKGt^5ZDV+T#@zfm>ZIzc-_IUfc3Piy#{~=2;O2w*jxKF)Z-bgslPSHKn~=`lAEUX^qpW}6)8$(N-b!#mU1HwwjJ1$3K=v?*$@l?1mIrRmna%k zD*VEICD@%VS*XII>OzdPJt7p)tu+t?iHP-TP za>z@oQ%E|bwJ}A8S=XcWpV2l3l$UUgu2S1YZj0U0ecC0o8O0P-!!bHRv3m)xrR5k$ z%w#3WSSE3yL2XMl-stkTDwyU>oThP!;_8IgL;kbR&y73#V~vYE+?#7-&C^?{;Vv|j zjT#2s4MGVEw7oZXHVA%z#A+rh7U4SGAcfMUQl&>0ObfYTbF?p+Pq$)%ZE7(OEhawh z1r-uKgChl)S`#L$w!u&&Gm%hbTp4|ni?ZtOWGRR*7kX8xmeq}SqfpI9`8AQjBYQ>E zvO!v3DiX_dJ}uMn{o?JtNi$5cU?5x31t6kp1{?S>jcr2kD-0)d#A~3G{e2tzDe__Q z+Wt{9$-EX_8Ip1ZFaO~*(Fq7w3Sx0Wc?jWUhc?+qr&QBYoK&`}>}1Lche33PsG2dv zim<6RE@rDMg5d%IN)zitzWQoR5el^&!kLHVamjWemLthYEY!O4hS5Z`I2H=fl^aT~ zT9ipA8UT^dN7i9Z2d@b`3X2NK3A7192{Z^h<|EIx_LN#NMTptthLCKw=ma%C51Jl?Q;9xkOkxV{Lwd3D*`Y_Sgp!MrwJ_I2N>WgDdqOumF9J{_xU1Cl2(EeqUYCT`J!a0wm?X%l8 zh7_K%470Z+q{_l66lM(Pqk+>`WIA;Yj9NjikW9YcJ5?lNjb28l6`en^|FE;q3~OcJ zkmX8!%wjeI6VZr-#ot;wYqD=?+%Ixyyc-oM7P%s^=!{<`Y>U&LAkZZmmygQDq+C-$ ztebYtfvxzAq1C2ZLs#9qeB?0{xUw{Sj`AjgbW*vG?r^2N=BZ44XSD<_CT58(22t~t{9!-{d zUJ=&;89GBHOu3Tk)3==zujwOm=+<7Vhb~>dt+@|%@y5zTePE_JMHcGskAiF2=Az%q#sOoS zB1v9}trC7MskyP$0kuu+Nj8dvb)1~LW~{{7gV?`3c1GJa&!D7(q+y&yLg_9`CRHy8 zTqvOERqG+@3bt7&;0{yLh!V|yDas0 z`E)xB^;u5&$&ABEebyo)_)^I>#`iIb&ywCJ*A=x$8wHU$4Pu&{>qHjKMt@0O=S*^E zUMJmF+iawNEr?mw13E%pa~c|sF42>`Mmh}rLJ3kn=X_?@Mon(Xu`NmL!T2NwcPOn~z6dCYleDDwFX-jubm=RMYBeH)=oXn{S{ zk`in#`}bvwEhY0+EBRYq>@bCW47_V?*i~%KeFhqS0umiAkaBd#vamD5a^!e zkXpW3M)kcz>2NO=L^d=H6hd)SLsY_M-Kb`x+I%-{u6AzegW^JategdExq3k0p$7`A zw{lMUSgGy!H;w1^1oA5i>YiC^(Ii1uW0UPO?bz)42{f@K;*~+}VKZE-C8I$u_nM7O zFsFUBlPsun2;O_8SD5hBHxkk)x1RP7$wgWu} z*ZO2Jd-r!@5z(nQ_$mlHMKCb<2*qjRM5VQ{$V-w55MT-f*1nG<-eD55kP?X)$OX#e zu^VTV!0hgeWn5p;I2z}O#W;w@(k57+OGC4aR?K6OxT-5g?vU)vvEBOlXyPNEx!xC^ zC3Ty$abJ|fNC=_i$qV#=$Bm5S>|cNpa=nU2ZjXR1DKG;(0=Tw!@Wm5?T#W%>>3lBK~b2nYkv2 z<6n(Lb{uV_34Fv*nN-EF$vIe3YE4ksvSJGhl*H5_rIs+pNe@UUxF7pNdcer;(gzi< zCEFqy7_43?IV{zJ7w}^R#WDbRv_m6@lZzxV!k|xUTiBH9m_Y`XWylf9ucg!;gHdn{ zMaosq=}3|B5Uu1kz^0IpfkE5~Eul<{sVNWG3VeVKT(<@{j_nTU!TYL#?{2UM25q)Emy;L>2Qjy*J$Pf3mq1Z$~gkuxEH zy13GktqHh*j+35(k>o2n?JGXPSQqNRX%Yxw;KaY+VlW6nWZdOh2#?Hmf=Z)Zg)?!= zw#PKTNF?SPPCpYB8Cm?Q#I&P|h@D}0PQuVwtC!)& z%BLyBb~JRvQzD7h_7xn&D?y!T#@1a#q$*nQN+`)3Zvq_^=Q~5))_9#p&l=wgknjpZ z3=RVYib4xGBbU!8y4VYEWRONyr5@9)@8Q)ogfV?C2%o8sKub+# zZ#W{G*Wx&k5BFJ2re(pHc7tV{IGB5v$G9GnW211&UO=ZfTH@_S>|WyVa(^d(0!%s# zzaWLlB?!qzl7Op`N_jYOM|(p-6FA1S7@-svAgJ4#m?IRM(U}fnMDeHIA{l8P6gPUL#a_C|g!u~tm`|}qRmb5B)I1kN$R)GC zvF)UrQj%6t`4s;kAd_oR~;G)bSiH=5n_xYw+;g z+&#H=ifr8!nHV~qmg zyQh_3N@*XsDo}YdF(;>6U@cR9KGFykXDJq4!WBce0eRh?5RV+JES$Nre>9p2TKR;cfMOSelV< zn!L4f8-(~`k>+$7!t8WMyC%#Bg7~G($RYFKoWHvUb(CoKke`n7M+RikQk-~b) zf+;P-AIMGyrsVn^8(}?{p(mv+EUDriWSEy3SSmU)C0Q&weyZ9P*Pdnvvng*U0@9%f zvk^D_vjNrulI?PF1$ns9TNxSA+9sB z;%4X`iB}T86(JN4%esI2A;4pVB{4zWUk=hG65KO3hx7JnbD9K6@{v-eiWbS9i9~mX z`_vx`?W(S7nTgoy3D_A96%*M}eaQlP;LV(P<;974Do)rX%XF*9aLgbo6-%zw;NrOv zQr62W$%bu3X_1RPWNIcnJ!?TrOB!t=x%QJCI+L8Xdsa(!3$X?1s&8{Xk96 zYI@4|^`k|27mHp=9rXs&NP*l{V>hp5n0u0!WfEXpv8CXE0%~r zoAZ@N_P|f=JB?(1%Sg|1f(VgU#NrB$Mk0e`mkc$PST~m`E_&3EPcRYNQCQs!gA9Vu zm{V~i9vFp=d^rfQnzUekVjx+Iz&&q5vH zJ*V+KP`Nn%0w{Sv8kp{bB-pw}vc`)#uILNTc7=LL*sRPH$0+r4@6}&WO$v zjjkJ7+8T}+Vwni8x%u;%YJxY^@?$%sx@KY&R|3Jdf~#|zX!(+0ek5^L(vE8OOf}C! zaac7e_zDQy3K%2ZWF;)v&RQu!NR3uoF;;W0!zd8RWO^f1mR;r)&sa%F1B(Hp8%tM(@SbXWMsigb%m>D>yEN{`CjvmCxzUw{ zB6k+LsU-z#IDe<1wlq_1^o!_f2005yd8X$RY_UycWTcPFMp;FzeZw{QGgb{_9#UY^ zT+if*XiW-Rf}DEr``|ibYm#px8X+xBFuNK^u2%G^`+YGOTGHIL9!huysfw-0B(-8o zAaXFUmoZ4-=|3S*p4wz{xJ)9OT?r~qgg@>2Dm63q_P9r>J-AkPQ`k{hc58}1CdVUw z6Z4c8)?0Km3eRvEMaC9FX#x3)3A~{%kwsa?(ArtQLl>lmuBS7BVWC;uJBn8tC@nGr~RRV z9Evhs7(-ZcGW$u1V_Po_E!#PfqP*zrNaaS2KIdXs~d(>MQh( z=Gw&I`peH?llfMXWQc~TkjL8%w)9l$P z@9U~Jn5#5rQ`Xzf6tY_8IEhl5Y@?l?;8C1$t*HmZ%;`GuKakVUj4t}Yl$Q>bdF()Y z`n~ju0z@aoK+zA^;K1PRRIXWrQoI;`;r*0Q8BNeE)r0vq@n|u==VvZAxK%Tya-Z1r zZ41+szh zQ9e$$5WGbo9!6Uurp8)dw-E=|EAyqAvM;uOG7k2uX>msaft7dGHU2w0vI#`{y{k-{ zH=<1_Q7Z7zvUs&ix7qh#4hBXGN^*#R%krax^t6VMLB$4bq&lBOb~L zLb8#E2skz+#-klgkIB@O)S3km@wlzDmkNnm--RxxgT>#B*4#>1ldLLCbxg2^?SFb( zsAcx1@`i5@1>=qS#=4&KzYsA!Cguwg2xvt`e||6vrHR*e1@Hd^TR@bS|M*#`JB3aS zFAXIOnG5#|!wXjmd!%$pOUY4o_X+DF>ZF8#I+=^ z^5%J~v8lMap;0P1K&iczGs=JQ19-L-!Bbf=u>ZZK+{xcZ_W=*m2*QkL2UO(xBYP zhxkBABsTTCo9ROFda}`>YAgae8YuQIlFYl4(e=+!cz?CLM^BuW2{D>FVD%-1*q^KR zf9&+(fv;IvoOMAKP3oa8+5s_H@fFyMP73KSoMkMx_YDsM;=@Z$J;e^m4JjHek zwG*yyauEcNqy{P}BoqC@*q_TrRrWg+XtN*IU-u#F(U^cOW2Pf&s33HRLcauHYKZ|` z`P8^b2l%j$s;TCD7YltVE>tC_e@DL4w7mGF+(jT9Y{oPD1f+D5@^R4FA8~)CqL@$g z2qsj*jJYutO|E}Bkz6>fn2Aw7h?1LF=oRiaZ*Xuxy1Bb)Dnscd^oELce}N-(?JMzK zdL)$4>8NzvSQ0%rUu422WIdm4{!yZX`Jott{l7VtF663lQtOint8^2@y>=3Wh?%Kd zz`e!K$Kn_^-O(qU#QI3lsv-Z$NQ$mQ{zPh!y9oe;SW(Z!c*6#a{t;-GPQH0XnM76*1hWLl9fzF5cg9-5~OjWphpTiZ4- z`we{Rym@hU2#g~H^mI#!s`{3ScmM$_I|55|dwcItI#AFHe$pm8{L$?7j|sQMWJegT7>J91c<$oni+ci;+R3dw=Nl-SJ0*) zxuC&Su8^*nLce`jiqN}0`qKKXwY`gxM3{xQj+p4;4A!VEdNwB4--)f-`(7VLOo2m0R!!d+IuuKfQS&1v+)%}Yh`@r)vyfy{ zTaW0&ikFfK_FizV7dopJulyO5`;3*|Y;=d2b$J2;=2nHro--oaFb;0B&n$YEdDCKr zYXuo89-)nsqJ)cqOo3~k1bgKKNW_bK@~QIB=_i~40{7Do@^WEa4+1ZIQKZj5FLK;? zy1BTCRU%^I4#YDpt0vTl%c)L7eXdS6ED<%aUVdujspuqb$?wUWZX|8-Q1NCYjN(2h zic%Nq9vA9Wnv7CBq_4LoJLBD-(zCjM>x^A67rlP)iv?==29sq?L?w-xG8l)Y-CvBD z=TpgYEDMqR_jS^d!>kqpF$)*p%LmLDn>)Zr^svJMLgi@|lqi4LSF~7lZxWQ3&~WTU z#jLNFw*KBK(=im7#JZHs?aoW>hSPO+)G{$0r6VJ1DcVPsIpVwxkRi`wjDw2~DJP&4Z; zMdCDH5s!#V*$at6kn&C13q>NJSaVEeEKBchrM$G<_TP12V^bNm$MnsXW!}vHuQ{p; zMRGe5?A2`fm}n3LID%1Zy|J&_keX8oKh?-_whM2@2D$Lb+B;NkR(3+1aQ{aqGWR%sROq7e(Gp()L(pYKl^u@rl;1Vcu`*p9qEc&3&7Dx(+OzYM#x2SurhmC}vc-=UzEvYERzllt za8Z?s7|FIE>4nec!U>)Bn6|r6hM)d>bL$<%uSCRBRcAUQ`z!ax?n;?O(qIyE0sVcHFKGoXN1s!r%)u05Q7hF`hUY5^KSc}M> zK|yOT*2aOpVbh9COR?7?SH_-dj%{U9(%!XQ6X!**CLa?u5r+;U4uvx$ODVp9=| zq#4zlsHvn@FfBZ$ToKljC)L%&&Hrtr{G}M^n#j3gQ=YIyr66{2DHAdZ3QX`|7;$8( zs)oeMrnG7+$gtwY9rS=kL$ST`$g)LlXL~AKLux2O?j{vFH*{zBYkGdY&~Hm4;Wi!0 z)uc~^=A7iL@Nq5gQ9>~=pM{9-d6>fyqKSFAZ!olg`{Bv8r-v5O6o+!sH@uy)Geymy zj9mMjC03p$c@e)RW>}?&a#&NC>bD^@hdbhw4Z=}94D?FtoKC?0g_i9N=W{9Enplp2 zxQ3*ta4~ zIuM8FU56`HTM_rH7V|!{5`K&*+uxCL#}*=XuMmuS33Fw1#5Qyp6^+Y8&Ipo=haUMP z=~h*umlxw%HLQ1;Np#_p(2-kYp`|61LtNWCzS1J2cpyGAkS`^@o`m04YmB${;)M5o zD3*I@kokcboQ8w+MTxZ^RD~v|&WMF#LMrPq%#(X#DQDM_-%ZDH>hb)nmXr~QY-zf` z&nvnWlK{2Fi2~XeOAOvzpc=w3o#k@L&cz}w@)B7ljF5tQQ670m-nD)l`bw21o&qXb zqT72pU(^S2X_7#U-tDS%BS5+GOs3#--5i`OnHmDGka^BOU{^XiQO$kAGsD?2~ zik8ZgnFjERlS!}mg}B0%4kg6(dPJK;~0B zV`epVa4!%OxOHJ8{W=2c>!6C5x}ylz(#{h_)&!C{7u}kE7`>ShT6=BD;4oCVIFsDo2bml*?vO#h&?>d107m*1k(wB!fF$ zl8NLjsOjwuvRMfeL3xuAOQJ)^w7Q$pwUlNXtjDm6;sG{3C~zA~u8Hs@9c3;8e2k9C z;e~&}`?+JP{Pg?Nk+wP?wR@2)Z8w&vw!PNcT;muXy@qzih zPT+&yMkeU{QMwVGv8njo4;U)Fd@0oW44bLNG-Bxp`bp|aNb99UdP=7i^q`Z##Nf!3 z%**|^sP4blrpVM@DkbNsY4nTbU+Z^&PyBh5nW3l;q!%*y$ha+f-wiNSDeDp_4jWzwH!zPr@8{1|>7 zzR4fCW+gKNnNdMg49CHpEX%s!Qj6>QRMD&fm&fggUx66H!j$;jMuEVx2^k?Ftm2eN z*K#2%A9Y+spGm}yra zNzyG`CIyfw0R%XPlsAmsf)F{D&kFFr8Kfxd3%Kn#Mu& zu1}u5GPz;CwNP7!kLScai3ZT{5@~bd32Rz%3fYSHkLl0{6v6M40Q7yxAkgSS3g4`dqL@xZN6L`c1;I&aZ5h zq6Civm})*&(RtgVyt42qCI<$l`4;3uWV`;T^#e5kfb44jOLxP zv$Lb2mVm~!E0W%kSv9MV?2AkYC_C!?S-TgTO}7!#lXi`#-ndzjERtO57p-ma5bD{A)B+yL;QDj~xE>oQ!(-2muc(~e|x4{To5C#E=HioeJ5{2QE<9Lio5lhEI z6T^DOpGKZ8ZGMx(Z_d#vWl+AU_df%XC74cT6wP9Q=mfCHIi3%rm_aW)I+;^@j?Dzo zv`ujmiQ}UH&O$sm9SG#3@U}=r-%(#pq^FCmXgwyzYut}$h!vZJ?={5hw6lSG&B2hE z$$|l}Ukl-IF@+I`7Xwh@;O51$QFcXR;^1s!CXmE3saa(7Sb2J?^6n$)boy{3Ze8X> zkh<&gwdTh+MR~qAPqDJ|6(fW~_P+_(O5fp%LF(1zFWS4{-EHYLyx=oCt`s!XVkAb`e<_eEam)c6oJ} ztzDN(h_QCbXTDK4xOeFrq;mjZgVGvmuf>@+tQOsoPWm;1vC^dR*$il%~q;E;8 zl$#aaU(oG48TdZiffny|s#-MJe{B*~@+(DI+D?eKX!S2o`F{A`m6BMZERP34*d_&# z`Y9I(io}-H)hsMlp7qk9l%^#KW4M|s8OldTMvR2IgKFD8`{w>`|7pM59K*9%*-^IKCO3tpd~`RtkRRKjCBmtL zPOG0qGkW584sLg2REs3dzAPn&(rOQ8dZnu6sx8R-i&);|syKqT*gFxjh8I=>aTc*? z9@1!7$&ni0O}Bd?m2(HuQ-GzR%%Dw4o+O%ym2|a|#3!a7RyMQfGPqh4Sht)h_#z0T zNU}w#U;9U7UJ^;{|JN>ag^S<#lSN`H?t-vMOc2U>)WSh7&S@h#ivBXY!*a&ob(r_2 zgQnL}IF&TZDWJL4olwQ5OB>|HPG+JRkVQmC{N?JP2Q~r;NX)BGDoM56ZmPtg(~KaN zggVs;oUzj=blzp{aIUVsKu9MBAx&*UvQ(S4xLMNca1no+3jrhi+Dc|mULHzzG-ZXT`1Ze4VjxU_}wPqEN)jj+S1*-1v zsZR=?OgS4uDd?U3pztb?*{Q2Vq;niyw58-~iJA6G?Bybrw~_f6x9Pj~E)q<2@rmfQ zp)tdlRZGm>O~V@2kY@3%IwNe177f=qPqL^{sgZ72w2M7tycFUWo~3r{rog(XS+_|G zN$E9W2a{yynR#k@KNqTAkw#mi`lE%)-LvbMNEM<4iDLB-@rwBkwB^=+d5XfZ#cqBb4 z<$6$yBq}AsqqkEw%*u`i99HXKmO&h17Xpv3~nzgqj`eTSt^#L z)UjJq=1q*f8GDUgx}7W(Zqs8PpJ@zj!xn}zF>#P_1aW6VQ&(4@kp^&@ytl4G7KjqP z9Q26Ig~6C`E691`8^u1hkMZdu1RPB1B!qiPq8~x9C6O{YlKDjw0+pm;Hq4xYnl1BI z&dpRvV{{Q%E5qEWW7}JBeg z#v0twil(*lTI|g9VnE37yH`X48^t*5Qcmqf!IB6lh?oRqea!MD_rqW(?DX{B>>nhe z*pp=EtgBq4YSC=ini_O{mATu@)|$$8j&^w+OQm4juc$qEn zW!;NIo{^CU20{^4PsEm~Hy7N&RylnyT&9}IS$ZbXFoaSiVsVgceiU3?eueF)y=t{c zM0w&2jodP(@VJYJkcMIu2$ytJOn>egP)fg{AJ)bwU?2k`{ONBDU!@KHRoigQ!m*T|uoGnB|8BnZBp#PW& z=$n>uYK+~Wt%JY$cg)*;r_czzUmJ2hLDsl1%X+RVNfs@U{epwxHkw+DpUJ{5M--0W#5pjZ2$=UF6=#jNG>}@^#jY*M zR8x5ChRZtHY*bpuCgLG3Au2Lgv>&7glR9W|PfjN+=tXzwDnL~yZ42qGPK8FHk8)nXy|LTU*6CQbJ$F$qmWqH~?86BIoPyXO zVBbgCIbN72ERfkS;()~C69NS?V?0zjg&ovXV5yC7WWwwsErR6f|)TPZ*JP3#W<^+ zzJL1sm?ux4!Baf5Noc`H?vQZvu$IcaJ5p8-X(+~?!OS6eDmrSbRUA@oc^l|H^ZXJ-Sn|RZ!<47Wh&J&7`c(Y4* zxVc%5sh0}z8Qs$hSX;Dlge(m(MenkURXSQ%6=d2JzQ(ol$Ox813uqpq{1biVC`YbUH)$-+xFeEab# zIAm2K?PB;ssj2Q#stR=Bnn*?H{U(b0Xes|~-tz`GlHoFyc4A>#IkZp=sG`4T?LF(p zwcPn)(z1HkFikq$6cw9WdJOBl6-|M2b$4%cju`hX3rr~7JNpFT6Dn{SD%Ck8qjQ?~ z{#K1wIM(%bkjZB(F3l!u9b6=E}sNPS#ZYcX-46p>4a4e7{D6hud%yEMi*%fG*&&_l#$*SM$z_^ zgvuc#*t>`~r>j{p#|(g@`fz&=rUFcdm@g?W))UiGZFOx90W3kvO_9rq*7<3qpM6fF z2<>!lorI>tS(v9Fk=*Y?vE!P8!O6XqgXhPKjP}d1X_H8#GOnQ;{wkYG+m|ir^vGtT zoZ1nWgcaT9&4(9JEVUT=^@C3WJ$Gkyc$iDd?G}m+np*7Dw;jk7k<+Otf|Yi^u&qM0 z72b->QiBdGmVkgKtoKkNHFZqDmb^65;)J9td-1ijq8fvt!SY)|Gk3-Pe+zK>w9>pT zPbD+7Xbq_ZaSAC`F4~A99Bqg_f>3jrbE?PT85*cAFHz}d7Tnbe7U6_co20Yi<307u zlF)mUbblf(PHmd0=H^izj%*v#5X~7DLJX_ptyP$-L^WR!?lJgY9&wfQTD(68lI-!5 zS@!Z0c=t~scuy!4DtraI)rvpTy&iaP;^d~j6p4FNWU|~|F;g|f(n1kK$cCY6F!*|E z5vj5#_r?2*U}A~%-7cTzLk$h6g2bdn8Q33IJAOrf`%*dn@5L<&#Cy%Za9StxOSAoI zL6NY?8*w42nd6_+IGyY7DjW-gsb}&kjYgjbAwsLTATAgf(YOungiop3c9Hdh=%7@l z^y{`WRd(y*p^kgNnck+sh~U)e_xIvZ5Loju_vY~AKvBLDNs>-bt!n9N>(Vfnt@t%tr-v3V*mNcrX~7+f>ACp)$@x% z1UwCui#gQ0IkoGT-Ip#CJNqs5CUVL&AXnsCmg$4b=9fZhgaZaEkrveynWPV2Gw?tx z);#X%;%!*~lsh_BW%KBQwnn;7^>2w!aqeyJD46kWJf8^+X8JKfMxVqpPj(K<s~RJzKk#Q6qV*S#IP6EIOQsjcHR*<($A@0uE)ciPWO7z_jgHn5 zndS`Pa@~Q2>ryZ?9U(YFEnhne7X3nGONGv1qnaVLR;JUEsUgj!I-4bm*t^Z&^1}ze zUu8ALo}q)ym1&YSRyhp`5+2dI=y)5Y3(Jt6&quJD{2eRzP9zxtqq|uBp4X2qiRRx* zmTHJx=Fb&|GOvTOHtQV=J^L z-*k^}x(OZ`QF&63c&|guzw*Z<5UL-IEMXP0gUe8>KcU+gFNh3){m3j$%NJ&&iHNIe#s0$~nkq>qUQ8P> zwzs62k#{Hc2`NO@QjLLElTJ~IIYx`y6Jj%-uyO(Ou%Cd1=OfF@%A#Sm2kMs??;Q<^j%j~kfj&4`ivRFu| zZgi;}E~cmFleEr$*!=a;M9E*ay@pi+x@gFNQ;5H4rM$-8!eg3JrJN-eR(rFiFuKiL zy;k(_m!=ImChjFrWaSoC9rNRKvu9oZ+7Mxz-liD^Q9We8B3@KQ;gSB3Hw?yeXYhuL z;6JQMe9E#b6xBR;5s43^QU2|jx$j5#b}&16;!x35mca&K+D=EkePdx&P{98(&x>X! zWJ2_-%N<=sBV_pq6pzUa;%Fl*6kjSFrXF@Pen9%bgK1H(d{9q@h8ZT2f0igUaB4{^ z**&tmVLBtuUt7-NjEZEC>k-cL`F6dVrduzoh$A44W4P`}n=~zMq8owjy{Gi>X^jyT zY=HDfuTaiN#;PRsmwO|d4r27z`zs2~QI8iUmZ0S!Wi=<-(RIzj*oslII9}Ro$^}7a+B|H}D)>zRx_l*}An-M9Z68T6{u5^&IaI{Yaga2%!WROJZ1t!opqo^-reDA~Sm^%}MTG5L{Si;tp(;T&_?b^J=YpXhFQI`oq z2u@fI1CV)TK9xr$5;X*BaFN%N?iDH@=ymP=K=d0=_gU7BlO~t7e(_2cI`nUyB#JJn z6zQ!fR_My~lGzKE@>E~5h}>2UR3kaeDU#m8FfWT^I?Ds=P_c&j6=CjKl;}*&ngAgJ zXx@T-CfPzZWfv%H%o>j;Ss&-_All~2IORP|JOU07n~U#}7-XCFPr4AcWHP8@tA!9> z0`O5c6@){GgyX_Q+DMJmXVbHYXwqMri|{W(Yf;+b7^V{e&pNH(9(1O1OD!6yEvH zPP<_YbJtEm)1=abT(zcFLNSD_69cek0{C|Y0H$^|S1LJ|i>2fC*-GBeQ7#iG2T|qv zQ*5QnIC&+Z8Y5fpJh-Q5w}Fy;rN$YqXlqrOf zz!Pf!_*ob{-%k0e`BC{<`T+Ue`6&6O`kUq?9HtoAvQT==JI`d9y;+R!U9{=KsYsOO zD?RRKulV=u zfqM0>6vng+@xte zF+;pfE2*hkLJ~l%O{~@B+JD{Z$&On3d=RNlWST)YjVQU0y>o^cPEg{iMLPVkCglQG z{MQnud>MwXKGbWHjO%xYdyK>5hLnp_LN^ae6Un&xC=yoPPM$kr6~n!URaUKQNmNH$ zU!WrL9!Om~+W8ARvMtHkA*S8)aiUqg~06XgI*yYS)?mmQyI6*mP*DD(jTCN)Vhw#P;eF39Yv@-yWoCtU`(lr;id>w|k%|1kqNuhh3ebGl+1( zwQ-pV4Kp7H?GzbHx!-u7F=;UkbJ5uHpFudkHVzI(&yL~pQk=0UrWU1KHtOx{x+}%4 zkUQVvwSQdV=z1iJh&|WJIQN>YH?Tr*`xiyRa!ok}V8iUVi=FH)H{4r`S!ygaB#mOR z028;SVK9$;F%j6o|EV$(Z`q>;6%HEYNAYiWlZ>S*=<#xJlyjn3iTae5tIOqZqy@0> zjMa?+ufI63nR@Ib7fOQVXj$^fbl*y&BRs>l$oN4o(AVs^1eC6JnlH;wjAeFhgOJ(B zirb{}Dg^>Zo4$tHh2MhaIcvAahPA0$U0?gw|Far8#<_%5RY^uDD-t6r?Sv|X!W=OG zC_e~?&ct4p){B&F5h1E>lp#(5 zc}Bd$GGV=eL++5zw9}xKwJD~^wo9&Oh5*ED>TN7;+zE{)6fwOC9x;O`qG1+YrWm? zJPtF%G#ebIrLu2nC~<9E^_8^(O9^RQBf9{hsp*QixwJ@c61I!(3VK~?$*SkWovR2P zOeH#?jJ+MFh`bbXuegd^_kq%cITer_i|{-R$*aqoF$~Gi=^OL1JB&)NzB1QUI|QyJ zsy95`5Ej4guEqf)47xlyvp!y4tFz`$D3oq-QwXp5VaB#x4r(@%0(&hl&gO)ioha9s zNh?&hwY`Ltq)3U}PWARN&Us9}UyhdE=^Uoge6+6At~i+gv`&YhS?yOKs0c|Q?5^9p=ee| zgvyjygBW~C>H9wb_z{Ews{%(I6>6UA?4r+PsCH2KyM4Rch&h(gCjt&TrYICaDn=Sn z562+Fijm(g4AeU$mcV&>Y-`pa$^FESXKUMIVz*;R8iqNw0wj0ZX7$M@3e<9ekMB#E z0XVu`q)m$Trk9#pT|sA|C(gaUK_;JA*qNRMW??W$#fRLUC|3zWV$DFr6XTY{Fm7Wqe19jr0Y>QKGf2j#iuT5XkqcqJ0TNSg8x zLx7k-Iz0)G7&~irCmBPipB2G1v1P~5KCKIkL5MAh=OQWR)~4P@t>;KHJtb3t4?VzA zMIZzTE}>nxz=dNr){p$<;8z5N@c@7?jiKD~N+DsI^lFlg)BRmAMMBBW)x)rQ7t~1W zd|@2IMH#@V_8cXz*^&916~sbd5R{80 z+V$?2YU1b0l2T5zvhT@*y!IFAa|8Ha#7gO2-%M*DM4nZxEm3jbG}Z z(9eKWBa7&0C1pYyNV7B1F8u!W9FgM}mlvhi2*-Jx_$R8gi_Y_s^*o^*$3vkMWj_pt z0ulR9hlozny;gEMax?`b21eY{D%*$YI6(>FZ63^q0;MCZ*D-ax-XF@RHt zM5l$hT||0bLE_d-nM)CXs#9QD1pLr|wnsxVzsIo(b!@yZ^re90qbKN0bEdf4yy zJMu@FD$raGvZdTN3$3W|8&c2Qb^eBWAL;eM3P#VdX*8@63|@0WXhShXUZ(kLQF%uR z2Dfk5w~i-nf;L`iSV<88UE$MJe*YOGDTQypr8qd@7+T{*)4)xW1Z0O=5Cq|2FRO2t z)8%3BRXdyHm6f{x9;ne>=1b;*dhKTa^(R$0pN%XbB*xfq7#dU+3H=i$y>e=n zC=n8mQ`e^V-fC@jT}Xt?`19Lul@!TpS!kby_U_?Mc;N%Q9%)gvI(^w7+z$Y*_M`{*l)UsY6Mu?#eJf z99RoOd-~p)Cx*X_q*X6@67y;Gvfe%!Qo&fU83*F{?#>{Uj0yTmL=ImpkIO#xnJ@akJdqP!ml0G=+2hf?De|6Qzg-&@y_3y{HZwEGNaw)@syMNaal z#6=p5ucET(ye8S@82Z=q{M*edI_Oqb{E@BQ44za z%QazKlU~1b(X)$X6w1p+S$k2U&Qm&|xC(`G`9#ZXy3%)XQCl;Z?rDt1i+qEX{eVxg z_vooUG!dHI83+PE+7Zr7OSVg0QkyBrvW|7zDcpKy6d%0a6Hv#yN%cWVXfunlM4bG;Eqcf$-|h+CNd@+rJB8~qRH#~s*1%~ zty5?_?B}nRUu_=7Azf^wHwM!w0n2M0;kbpPXNwLRLr*ng-Qmrsc+M^3m8uC&%u=w1 zb~KWP6+r=YAcbVzw))7v-X&{J8joHl9u@MB$l*a1&g}FYOJzp#&lG|AW3JsjHJJ}7 z{0QPj_9Id!4KYr&I(tw*9pvWEqG2(t){QqRGoS|PV*h)!PE*##lLqB~6&0Spc*mt4 zNhfj$sNgEMoi%f+SKqf-j5`K;5@xM~((8WWk?9f*dkvr4v6lfxOL#mdM8rY))%ACZ zueByfRf$5~a`IpAccoTr^asxp1fbM4zM4f)gk3wTA#3VhEVV(=Z+7iMFugm4YhaYW*hMJ_g1CPQ0T^Wv z*cyqgt$JTCSl(yK_MPC7V*4)e3>wrARjH<1vE(`g@9%n_I{cgaeXCa|vk;Q_DWFzYxWtN;!fdyAN%tD>#iElv$W~VmPcZm`ehK!#P*K(w~#zQ=$5HCmAL8L2fHFC+lxkFJd9s1 zFyhvwD}?oOk*^)~*?SV#M9y#CzIA_4JV|7s7~Ve--UPx6cikroBf6Pizjf1WSfh0i zU;UJ-waRs8e6f@wHoBJ+j>Kmv7|5clV?8QVx5Q~Oi(AuOLiw@$deJ(u?0Y7om~arz z#AkxTV_iiTfz`*tg^S5kSk_l%$E$nSsa;;!>audtvB0`ubul#rlK8-T%{;y3mpj9UA#J-ISrzNkWvx}%&FDN+_`)6gzLv4=3%Wcl=+ZN7@u4c0jOgXPUE10RXVOJ&{3IH z>bk{zuH%&isll;(w0uoF)~w8x#ET;+yiW+ELP_klaW64d>CsPWBvSJ&R7>eE*I00g z2hF@>znNv6Iv0Xj_54PCS4>@fs`|TCaeS#f*6w;lg^2lQ$)CDwd1>^q0?dfua#}45 z!jR-hdXlX%l6$pXYWWUc&DkBgH+!Q|=v@fa(pd;saSE*B(m5?tc;TyD@u^^u`d4Tz z*j!g!puLz}PX8Cc~F(>Hk^33u$Na$o2nEY>9awgL+I=^X;1!GL3-)og+>mIBH!i|Jo(m}IfAf8So|_$KOV22oF@`JuUTXCVJo_@cd|iew>4H5 z@9bY)E+r)h*-2EiF&GC1R3^B=ANa$7WiV|jsb@#PyC>H7CC7p4@Om;10RX&|5Eh6A zO7^ybjq z-6OL+&xJ1{fnj8jM`VdKx=L*j5#o+e(g6{CW^~9fZ}g09V6)uNvak2cTdyfDEgH!3 z+u|(U==#Ku(NB@%E~&r~?U2}1XuRn$>E=80EAe?xhKOegjJr=mNMI?WZj8agvp3;Y zP-_(Pj4z{lS=H_-Z_U+yXrn6|Ku<3HC;@0-R?jN%(tsG?OK7H4gtQhi*cXD33BvclL zWx)FS%wcx+;HOAg;x6Ay?pY0*l3QzAQCPLRcc88_@R_odD%7Vs13z-~qE@gt*0l2? zeJ*5?>z4hzo5u(7hLTNUESA$`QNZ-#F_P@(t#G>z+7%2EwXrT&K`EM>hST}5*6M^| zTzBVCO=d093CdST*42|y<5W5BP;OIwI7pE;d#sf`8dBiA2qLgD2Vlw!po|m7fw0nW zP38X<@isNMMfaJ8a%-n4IFK zJQS`B4-3Lj?qw8D;G7#na7H(oml_fp{5#g~MY&dlh04xlGn$2BVvDNk_&t!L>_j%v zd`|NDkyy0le@l7&?s7 zEfn$n$ML>Wcrj`{1agSb)J)$)T;HYAcHJ~fBCQ#(x`m~R<1Kt!He9cv#pQUu2k6H2F(!q0mfC1Ot(VTx;`lP0LW zT-VLs<%$ag@^P_WxcSxkES%D0@Ekj&8Jry7%cL0WQSQV zkbCE=%V(ybcY2E_Yh7@67&?c3rAewtM>z}Wu8P$d+()#`ic1~~07#Zt z0_=hm!ddiQ@1@AFY)VLsKpl{p3sJ%c^Z{{?8yZaN zi`61*%fboW^)UXwgj{+RBQD#Zq1g zKjhYbNM=+sJ(9DWCj&ZuE-%sZR&FBQg#W{3WoqH1<|E%p2 zR?UZB$lb}BurXQ8=E2rA+Y-ohFGwkMVtgkx%1wgPJ4?a%}9>EE_3C~4?`-E7^TvP9|jsA(aRzPdsjJXCuBHZqp zWJX^m0iImVGf$-?^?5^&`(eiHq^thLDbkZh*XTgwi;6B7sS!jtp7ajAjK?F!r$ocmWIBg zY})daMYulH)LW@x6P2doRmszV={G=AdTxALlp%;bhR@@Ygf`1h%Sgu|vN z#RwM2!Se-6Bj{9&OA* z*@s43cN-{2Mr?}W&LDUxDC>tC7zm=ml%R4lr3VILg3ewlNn%l!$qk=yp#uR!uR8Fb z>~TIY!QY~Z5$%|cgkM~c0tk0%8T!n}Wa{07)@WixRJV)De(Q=8QRWeh?u{X~-Dx(( zQ64_lh)IqTs*~H9W((`%rFHnR26udN;I7bz(yfh3;*L%=Q?pG^bAS^~buZ<11!E~g zJnF=1)jz0~S+Dux!m8PL>|{WpO6MZqyB(Y45x6OqgbE1e2^5&pX@A0q`5ni|kNJBX z!6Sq^Did2OP$gg;MJoEyXx;21_rhiV4f}Uq^U%oKjv3uAC^(atun(eWa?O$jP-xNeG_(w)v~U4eHUHCplPM z5lu^nWIrFSz3%aFEGITO9jiy5cW-HCKEiywl3AJWE&%^di#bm(DN`)w7$T|~x8WXR z8ll5jN)>S$=!ZSQOFl+|DtE#%F7f0y)7LmG~+jUP!syOZj!ySX14jCIg$p7kNvJ8+MG z=zGk-om$8+TR1IOfGofyFjCYn0BYz$ZwEv_h*4 zG#|ZrNz0L|w0{kKdLC6dp>K{QY4|u9cyhr;AJ74FY0Zw^|~#YbKPF-b)&`4MIP4TOBZy7Ws>mYDN&A zC6(sY5l|U)VtsK|rfWS_L5aaV3F2Kd($omKGqo?cIU^4>X-htcm7*;Hi{UZN-NXIK zW+94^RMqDy^-Hz21yQ(EgL*~CGAGc$LMSdDJkStLlMtz?F~|7~sbYS$&$ZXdnU&|M z>6EK`HE&qbA~6xJq!#TR4J?ECDSg?OA0+GDW*w^A$;jZMv=N-O>eX(fsk*fc|wl->tUJF2k& z$}p8*!7vww5p*v$gFD4QNg~TKQ4TIkRk4i-({ftrIkD;rBB;m=qE`Z>gG(`-aSG&7 zO$CS(1JA}`V~48QA<(WhAfE_RR+~voWtmStLXpMrc`Jl4Ar9oRh%Mize7V2b-i#l(36+s68S+HBosPE@}``UZfFb^G4ROh}R!KR-h$QqL5)h8ij zte}*_f$*G@VHWiuVcvw~jhVwRS#Lty`^#GLVy$|unpxqWYZ4vFFqhHA|Mz2}+4HuACdJYr z7D)o|VhKQ)n2q~bkfn$wW8Tmoy>SfNb7)E~FK3ubrvXj=ZO==1^(F|wj?5HX4RXJ3 zlE{|hBEX3{NnJTR@iH%Sc~M8tR_e`PDwpzSCOCk}7 zljI?japnBv7c)Df+&z_?<;eI=OajccqRe!t0`o+EXU61=H>PoNZl0?c$_ri82&- zv1i^R4xRFQ;OqR^m&!n-WDLNH7sH_l>@$;=-tRL6$JZm%s}~oKJmLclFVqm*Xa{s8w|S}Ax8b-5=(Ik!4E}PmoNaZ49sD~91@AQ zK(5BFbr$TuqU9D{sf}3OCT7a{Aet<ww64&`J=Y$Ru z#G-Q&$hm(%N4AmOX(C8Ob#D`a5XhJy;1sm>aHZ-5_dLxLZ6E4Uy8b+0WS>64OfrN) z1R*RxgpjV3B;g>22`8>xi@e?$vsOV0x|mKW3yU*ro}Ui$T%P3P{e1}KhNAN%%E7nm zIc?3j)5U6YglY2>>s^$Lo{x=2k!k2CH#LVtklIIfvu5QHMmqSvm0qSqT2)x0V`ls^ ziKIL6l`K>$Ad5=9BZ*Y(=j5_sLT=_F=X7QJY6tk0Nu^sTly`kEGZ{>X4ntu67{FNw z2Qo7LY7=Qw;-O2V&Ypked|@>s{J4RXItXrzMV>&mIEx^p8Q!AjxMu-C-W|O{kTp(I zf-o88j6K49`!@;We5SF?7m1< z>dA`x60FTHN%C#uA5goTtd97LtMKn#S9wrtAlA|40j$FIpuep{!V@eQLu~(CjPt}x zneTLaRvX6)*^wH8-fk02Z;mFUDlYbcN=eCkzfkLQysdPVa_H1`G76d1{K;lBQrWDn zJ?!!V0J^u*BT?&Ax@8LKD_Q0lFV;!J6lE#1u;vRnF8W#tfkfVMH4sWpjMXzWqIZ&F zPh^4l*dMwHD@h@_QMbHSnC++)Ov z()5kZ5^_b^hZtvmejb!XGii8yVS98$!5~Gtq?spPH$4Mwr{~#wea3*Z zRTUbgBvxxmg0xF$2tQRS%}K3CmRZ=LpPPF1$+F4bbieLv{?O03X`$eiXhe653%cBzdq)V$ zO(Z{t&U!Z4D$|Pbj-~Q}+|WrW%LmG%DkCX)fMF-PA4*Mu8NKc0mwt~zziKA;?N31Y z;Yq;!r?<)Ka+#@g*idOzpf)Ut3@yVlqY&CAUy~Pj+zS>_7Z2=$eKSU-9L!MDJGf$BJ(Uv=20yQ;I^@++AZ z7(Lid&&xN>b)!LMOu8s4APAKnt#9%Y}X!NhFG=u zrgq@Lnt*8j1POsLfLatYC`u<9iDxR4fg+0-fLAYCGmnOv!m)($kRXVKyafX~!-r6n zA^tn591_f}42aLmWEP7ukI|hqXuO>~sW^)WlbN`pHzo~D#n&?$M2M7McwKHKD-_u7 zOD4AAQI1YVkdowOxdqtd^+CoofxeJ78>Uy>Adm zQ0__eIC>T%>!xeslpy^i7<$&QgUcFZzeH|##X`IIP$@M38x}B&j9KY z>k9QqF8*KFUBLe&XK4#VW-0V3qkn!VjmswrZ4}9ml37tGrtDeFwiyPj@<_RfLq+mq4nU&vjh%jm+-H=Hs!|#|S4w{%`^UzIwg7v4+Nw^lZ1 zZ+dj6!y)8WE13_y+R3hz%r{DALLnJ{H5VG&fI5E_fs;9SH>FVbLX^$d)TdfN;)iihN8`Q5=k6vY3@oA#6~Z zVpSNmB2I#`R`D?-M4mLD88wMaIw?(C8=LSJn4YB%pvd4M9ybK*M$Bf;l^Uw0(6_m< z&W!8sRM9Ix@WG(%s5%dt`BJn58%U@uph8d@^UZg!VQst<^E%+7dEX|zSzF2Bu zc$|dAJNMKj8-h)_hVf`NqOF$UqnSkjO(8t5!;lcjf*pZ9XZ}$JO51vD6Abz~iaM0% zG4cyIrXZr?7e!~WDNX^2?XK47K{qv{MMGTqXyv0a7%?QnaFr0uN-{t$F||Ty$(NkgAtr6zIhdGv zBy`MTm9QoVqg2fo1tEmwZ*oDTn>g=J60A*#ILOBvQAwmhFHx4!<}kL#M-zX$iSMM5 zmUx!j3F=1r2yCu3$|w6kPn-}`L=wxt6*iU9dz=#*yQw8zq@%g#e?YQKJ-yQ!Q1`vD zFW8raUv2sbt>XEWOmC7GP)l~kUPcuJp3mqH@-fu=m`5u)wRzf4BsYxDhSY?52(q}T z`)5c;$u8Hw+RBh^PGDyXA9o{7XC?8Hj4lu_i%4-a%7`^Ds#feymOWWghV9P*;KEpr zi1=n#2Z+OR(3~#>?*pRnj4fU}6NIAR{dMTru{dnZNF1dKipJp^;mD+b?@wf*SfK7F zJd4JGT&#CHoy8LgsBLEwON60Wv{-u}p3P@b5wLk?2!@eu&|M%2rgMqV#!M7QMrD(G zp_IB$Aib6z8^{dEBqXvD(n8iZUH2^GEd49GCx5JUtgkj?AglXyVxMY6&2zT?^Dg-c znc!EdkOS2WNe`Ej2vnPr$XEh3Sfndi1PMk^F4cQ&^n7_AWNohaNMBj^T$7FtF!Y)A zM-O`a>@{>5&2LW%Q0^4`Jkp;HfmY?Rp1p}VoMZd*yxew6*R6T@>fsTV)QxFMtGaCA z)uIV-J|RSZ000a)%YYA&rZYf6LwYNh!L$hA3g|TiWm4hg)kC(ixNoU6CmU z&yOOsjcF7Lg!<-*j;J61lj@Kb->ySkt&K9IxRV+6p&mRqiH8Bi?U8%tFq>40dR_G1 zLOSiFrRnk&`kVB;T{-;vVGk4)5zL% ze#%FIq|*qQ1*VXtD{Qm4+Z$oz9Uu3NzH?~0tFjSkF6NPeXMQaSyOcK4xVC)o1RYUL z_$r36qh!lnvAX?5P(iO7%JU&61nOAuV+rNonK+nQI8RWTF*8DI$A^lJwJ~PTePYST zG96e1e*(wZsbMDBVuVpt^DU|@gjZ31m5%2@qB<81fKW-pZHzKTKjeYdF9ufTL?*#P zpoArS{694{2{+1IR#X)=Fqg5a1Fh(CNVkipN-|>{JfaK&+>mrnbrX{azWSbYELRi$ z+O=R43}*ED2;otF!#EU}lB=j;NH=lTyjNl0%yD8CRK!&#k4678;JI)&zdFct$^zx3 zCx1QFI_SO6uG-P&bHobdEI|=CGfDdOMcJ2gjV?3~g? z!}URuUrTh$!3(gY#Z|W<*1SYyY$F+xHS#L0G+wAGZdg?k zD#3e1l(8hrS7i1jH}WiZ^}hH-TD#OD5UCdFW_HTCGUwURb)U&5RT;NJXl->;cZM^r zf++}BRb}8yeT@E5V`3xW8~uU}bL&{*#&tW4GY_OT2>nD;Dv07+8c;$T3Q8(DXDj&` zcR3yc>Y9l>%4hTENd8MtQ7Xi5ZBt|>g`W@a0(gWJSt^np|4p{@B7F-k``>B##`b%Z zvWB2~#E+XB{!euz-2#N>mIMq?_FZAd?0p2!BVr_MOgPhcN;H&VIHU9$iiU_DE@|;q zas@#lF#z!cgQP~>0hZyAKrD0y@*yzdY$K7x7vYUAAfj4R#iel_fbjk)3}rK;z<_-p ziz0KN$R-R%L1>shi9)$_LK2LkafDn(3`_@C!#QvX)6g0#9?@rZ!my< zF9n7GojvKH;Q)|~pqaSTP~GuS0HE}l0WnN;C68NJAIp)UQ^#jNq<+Y3#1o>Ov|O(y zWO(OW&+ARTYZ&?=*_l=s-mFDM6m}TW(#oW^8Tt$JN$KBxE3t`xF3V%KDX9}z399|f z{rRb-;R$(&<~#?odU#QuCX&hTBHUr`X)IMq5MA|)DQ#nU3@MRC5w-tZ<*Hz%QN*zS zVbiM3wqF(9@+r+q|$u@53uw5a->r>-`#VJgkb(o_)=2nZx9NsLk} z$GTceuB^80cgsb~D3A8f!kgl~5eX$R8dD>(*g%TWL;k{&*^tW7y8&Zt<;zE>NVXlm zkIZ8erB)?;*iNtEiG*VFq``w0CT`W%KTdMdHzto?=BzTmV$a~6N1~+CQt2Zq%XW5h zWrr&$gau_o#R-B#DXDD&R86B31hI)v^la+7m{n2?Y8V+)CbZ5?uR{^-x*R@MiDn0q z6%1Y=bD=RNa>)m8Mz}H9dC1}?GWd-TnWJiyYh^6COUgA&23EXT(7V4Wa0;b`U$=M; zrXq?n`i03iYF&Darc#Q{s(;HitVmAn;?X>U~7So!n;Qr8crS{_~ z*l{W@r5w7EFLcUs-=YWdGO0_N!orfubW%y^!`6qW&W-xgs^~(0Z5pFCIln5sM;ne| z8cCYDSqhyV(?l}BhSw*(Hu!brHk1f%-Wk)P&gq(UY@1&Y(hM;gXENO@@2*X*XJvVU zE${wU{+e-a>+Sq$r_OP*uGk{`s+XVnRNBHJ?hW&j9@ft$GmkK1FaoQe6DW^BCA-KCFo@zhlaBV3OJzVT)tXJzS#e8cA=5bMVV+4P z8C^Bu_wb^fRxezPtOgds9ZJG}2~_{w6vjo9=G(o!J(i#3Dj?I8ePpF9jDv%wg0tFB zNJ;NsVCQtpe?@g-DLk~i85$%c{u4_X3|=eEu1vyGi&VnZM09FUEU3zggrh2j#Gp_S z$fUEWjIKO83nT%ENjMlr@=%TGOCE2BCdC$y~bm{eGnS!sfcO;HaBsd7~VlfEcr=qr(Cn>XT?OXLr^G$ zp*O-~-_*j-qi(iWn?FYtXAr_jIlbIJ>Sy&U9I-~`9Q~iF`LwzzuJHcPc^F$&F~VC&VGy7})JUa|%llS-oBe56{xi3jvK_rWgNDCFjVkLUcMEc*8OJrQii$mqq^?oGqv?DuJjP>=m9u|B{QO26njX=f~?SocN zAgyC_?5>n|lo~iu%XCHViaBQk{9v*ivbuh{xCb8d_wVtB@-2eh>L<3R6tOt-`7p|8 zv&oHPY%tJL(t+PzDbz>N82od_(71@)8W�SB?l}!Q{^d_^l79PHWz4Q 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∈s(L$Ox%!!Y{mR$^v^L{F$j=Z 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%0DR-Nk*JSC;RDNT@OA~ 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 z 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≈RSM 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/libesp32/Berry/default/be_i2s_audio_lib.c b/lib/libesp32/Berry/default/be_i2s_audio_lib.c index d41fc683f..888cb2d42 100644 --- a/lib/libesp32/Berry/default/be_i2s_audio_lib.c +++ b/lib/libesp32/Berry/default/be_i2s_audio_lib.c @@ -10,6 +10,7 @@ extern int i2s_output_i2s_init(bvm *vm); extern int i2s_output_i2s_deinit(bvm *vm); +extern int i2s_output_i2s_stop(bvm *vm); extern int i2s_generator_wav_init(bvm *vm); extern int i2s_generator_wav_deinit(bvm *vm); @@ -82,13 +83,12 @@ class be_class_audio_file_source (scope: global, name: AudioFileSource) { class be_class_audio_output_i2s (scope: global, name: AudioOutputI2S, super: be_class_audio_output) { init, func(i2s_output_i2s_init) deinit, func(i2s_output_i2s_deinit) - close, func(i2s_output_i2s_deinit) + stop, func(i2s_output_i2s_stop) } class be_class_audio_generator_wav (scope: global, name: AudioGeneratorWAV, super: be_class_audio_generator) { init, func(i2s_generator_wav_init) deinit, func(i2s_generator_wav_deinit) - close, func(i2s_generator_wav_deinit) begin, func(i2s_generator_wav_begin) loop, func(i2s_generator_wav_loop) stop, func(i2s_generator_wav_stop) @@ -98,7 +98,6 @@ class be_class_audio_generator_wav (scope: global, name: AudioGeneratorWAV, supe class be_class_audio_generator_mp3 (scope: global, name: AudioGeneratorMP3, super: be_class_audio_generator) { init, func(i2s_generator_mp3_init) deinit, func(i2s_generator_mp3_deinit) - close, func(i2s_generator_mp3_deinit) begin, func(i2s_generator_mp3_begin) loop, func(i2s_generator_mp3_loop) stop, func(i2s_generator_mp3_stop) @@ -108,7 +107,6 @@ class be_class_audio_generator_mp3 (scope: global, name: AudioGeneratorMP3, supe class be_class_audio_file_source_fs (scope: global, name: AudioFileSourceFS, super: be_class_audio_file_source) { init, func(i2s_file_source_fs_init) deinit, func(i2s_file_source_fs_deinit) - close, func(i2s_file_source_fs_deinit) } @const_object_info_end */ diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index 513a00d95..e4b933205 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -314,7 +314,6 @@ extern const bcstring be_const_str_number; extern const bcstring be_const_str_read_bytes; extern const bcstring be_const_str_dot_p; extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_close; extern const bcstring be_const_str_lv_group_focus_cb; extern const bcstring be_const_str_SDS0X1_TX; extern const bcstring be_const_str_SDM72_TX; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index b36a4fcc3..aeed1bb30 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -313,8 +313,7 @@ be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_num be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_read_bytes); be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, NULL); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_close); -be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_lv_group_focus_cb); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_group_focus_cb); be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, NULL); be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); @@ -972,6 +971,6 @@ static const bstring* const m_string_table[] = { static const struct bconststrtab m_const_string_table = { .size = 315, - .count = 631, + .count = 630, .table = m_string_table }; diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h index 07937ef47..6605ba27e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_file_source_fs.h @@ -1,14 +1,13 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_audio_file_source_fs_map) { - { be_const_key(init, 2), be_const_func(i2s_file_source_fs_init) }, { be_const_key(deinit, -1), be_const_func(i2s_file_source_fs_deinit) }, - { be_const_key(close, -1), be_const_func(i2s_file_source_fs_deinit) }, + { be_const_key(init, -1), be_const_func(i2s_file_source_fs_init) }, }; static be_define_const_map( be_class_audio_file_source_fs_map, - 3 + 2 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h index 785fb53b1..dbe5f0d4f 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_mp3.h @@ -1,18 +1,17 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_audio_generator_mp3_map) { - { be_const_key(close, -1), be_const_func(i2s_generator_mp3_deinit) }, - { be_const_key(stop, -1), be_const_func(i2s_generator_mp3_stop) }, - { be_const_key(loop, 0), be_const_func(i2s_generator_mp3_loop) }, - { be_const_key(isrunning, 1), be_const_func(i2s_generator_mp3_isrunning) }, { be_const_key(begin, -1), be_const_func(i2s_generator_mp3_begin) }, - { be_const_key(deinit, 6), be_const_func(i2s_generator_mp3_deinit) }, - { be_const_key(init, -1), be_const_func(i2s_generator_mp3_init) }, + { be_const_key(loop, -1), be_const_func(i2s_generator_mp3_loop) }, + { be_const_key(isrunning, -1), be_const_func(i2s_generator_mp3_isrunning) }, + { be_const_key(init, 1), be_const_func(i2s_generator_mp3_init) }, + { be_const_key(deinit, -1), be_const_func(i2s_generator_mp3_deinit) }, + { be_const_key(stop, -1), be_const_func(i2s_generator_mp3_stop) }, }; static be_define_const_map( be_class_audio_generator_mp3_map, - 7 + 6 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h index 3436ed6e3..f08522407 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_generator_wav.h @@ -1,18 +1,17 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_audio_generator_wav_map) { - { be_const_key(close, -1), be_const_func(i2s_generator_wav_deinit) }, - { be_const_key(stop, -1), be_const_func(i2s_generator_wav_stop) }, - { be_const_key(loop, 0), be_const_func(i2s_generator_wav_loop) }, - { be_const_key(isrunning, 1), be_const_func(i2s_generator_wav_isrunning) }, { be_const_key(begin, -1), be_const_func(i2s_generator_wav_begin) }, - { be_const_key(deinit, 6), be_const_func(i2s_generator_wav_deinit) }, - { be_const_key(init, -1), be_const_func(i2s_generator_wav_init) }, + { be_const_key(loop, -1), be_const_func(i2s_generator_wav_loop) }, + { be_const_key(isrunning, -1), be_const_func(i2s_generator_wav_isrunning) }, + { be_const_key(init, 1), be_const_func(i2s_generator_wav_init) }, + { be_const_key(deinit, -1), be_const_func(i2s_generator_wav_deinit) }, + { be_const_key(stop, -1), be_const_func(i2s_generator_wav_stop) }, }; static be_define_const_map( be_class_audio_generator_wav_map, - 7 + 6 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h index 295ea5cd5..4e6b84e0d 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_audio_output_i2s.h @@ -1,9 +1,9 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_audio_output_i2s_map) { - { be_const_key(init, 2), be_const_func(i2s_output_i2s_init) }, + { be_const_key(init, -1), be_const_func(i2s_output_i2s_init) }, { be_const_key(deinit, -1), be_const_func(i2s_output_i2s_deinit) }, - { be_const_key(close, -1), be_const_func(i2s_output_i2s_deinit) }, + { be_const_key(stop, -1), be_const_func(i2s_output_i2s_stop) }, }; static be_define_const_map( diff --git a/tasmota/xdrv_52_3_berry_audio.ino b/tasmota/xdrv_52_3_berry_audio.ino index 9612de208..06957bced 100644 --- a/tasmota/xdrv_52_3_berry_audio.ino +++ b/tasmota/xdrv_52_3_berry_audio.ino @@ -61,7 +61,9 @@ extern "C" { } // AudioOutputI2S(int port=0, int output_mode=EXTERNAL_I2S, int dma_buf_count = 8, int use_apll=APLL_DISABLE); AudioOutputI2S * audio = new AudioOutputI2S(port, mode, dma_buf_count); - audio->SetPinout(bclkPin, wclkPin, doutPin); // return value has no useful information for us + if (0 == mode) { + audio->SetPinout(bclkPin, wclkPin, doutPin); // return value has no useful information for us + } be_pushcomptr(vm, (void*) audio); be_setmember(vm, 1, ".p"); be_return_nil(vm); @@ -84,6 +86,16 @@ extern "C" { be_return_nil(vm); } + int i2s_output_i2s_stop(bvm *vm) { + int argc = be_top(vm); + be_getmember(vm, 1, ".p"); + AudioOutputI2S * audio = (AudioOutputI2S *) be_tocomptr(vm, -1); + if (audio) { + audio->stop(); + } + be_return_nil(vm); + } + // // AudioGeneratorWAV() // From d789846ff5cc879b3ebc83e3e6da048bd0ed473f Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 30 Jul 2021 17:40:09 +0200 Subject: [PATCH 064/148] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0db12e009..1abfae0ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ All notable changes to this project will be documented in this file. ### Added - Support for second DNS server +### Changed +- ESP8266Audio library from v1.5.0 to v1.9.2 + ## [9.5.0.3] 20210729 ### Added - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver From f9fbdc12ed7d47555116f23619a25eb23b65f988 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 30 Jul 2021 17:46:06 +0200 Subject: [PATCH 065/148] Fix include for framework < 3.0.0 --- lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp | 2 +- lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp index cec3abe75..cd915f58b 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2S.cpp @@ -22,7 +22,7 @@ #ifdef ESP32 #include "driver/i2s.h" #elif defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) - #include + #include #endif #include "AudioOutputI2S.h" diff --git a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp index c38b4b5f0..774602fd9 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioOutputI2SNoDAC.cpp @@ -22,7 +22,7 @@ #ifdef ESP32 #include "driver/i2s.h" #elif defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) - #include + #include #endif #include "AudioOutputI2SNoDAC.h" From bfd37200f941818cd14208e2871b3d7120395ef7 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 31 Jul 2021 14:06:14 +0200 Subject: [PATCH 066/148] Do not disable lib audio when no override file exists on second run of platformio. @s-hadinger --- platformio_override_sample.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index c139513d9..a7406d0d9 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -150,7 +150,7 @@ lib_extra_dirs = ; *** Bear SSL and base64. Disable if you dont have SSL or TLS activated lib/lib_ssl ; *** Audio needs a lot of time to compile. Mostly not used functions. Recommended to disable -; lib/lib_audio + lib/lib_audio ; *** RF 433 stuff (not RF Bridge). Recommended to disable lib/lib_rf ; *** Mostly not used functions. Recommended to disable From 030ff05d90516f4451ece2b3a6dac89a63c50548 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 31 Jul 2021 15:47:37 +0200 Subject: [PATCH 067/148] Update platformio_tasmota_cenv_sample.ini --- platformio_tasmota_cenv_sample.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 85e117bc7..29be983d6 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -32,7 +32,7 @@ build_flags = ${esp32_defaults.build_flags} extends = env:tasmota32_base board = esp32s2 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/375/framework-arduinoespressif32-master-32a9e33b1.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/380/framework-arduinoespressif32-master-cd287c4d6.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} -DFIRMWARE_LITE @@ -48,7 +48,7 @@ lib_ignore = extends = env:tasmota32_base board = esp32c3 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/375/framework-arduinoespressif32-master-32a9e33b1.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/380/framework-arduinoespressif32-master-cd287c4d6.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable @@ -71,7 +71,7 @@ lib_ignore = [env:tasmota32idf4] extends = env:tasmota32_base platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/375/framework-arduinoespressif32-master-32a9e33b1.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/380/framework-arduinoespressif32-master-cd287c4d6.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable From f6bc8b6cd49b87aa59979d8714d1dc1aa8b04bff Mon Sep 17 00:00:00 2001 From: James Lakin Date: Sun, 1 Aug 2021 12:26:42 +0100 Subject: [PATCH 068/148] Add IP filter to TCPStart command This is an optional second parameter to enable some very basic security. --- tasmota/xdrv_41_tcp_bridge.ino | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_41_tcp_bridge.ino b/tasmota/xdrv_41_tcp_bridge.ino index d250101d8..c6517e15c 100644 --- a/tasmota/xdrv_41_tcp_bridge.ino +++ b/tasmota/xdrv_41_tcp_bridge.ino @@ -35,6 +35,7 @@ WiFiServer *server_tcp = nullptr; WiFiClient client_tcp[TCP_BRIDGE_CONNECTIONS]; uint8_t client_next = 0; uint8_t *tcp_buf = nullptr; // data transfer buffer +IPAddress ip_filter = 0; #include TasmotaSerial *TCPSerial = nullptr; @@ -60,12 +61,25 @@ void TCPLoop(void) // check for a new client connection if ((server_tcp) && (server_tcp->hasClient())) { + WiFiClient new_client = server_tcp->available(); + + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Got connection from %s"), new_client.remoteIP().toString().c_str()); + // Check for IP filtering if it's enabled. + if (ip_filter) { + if (ip_filter != new_client.remoteIP()) { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Rejected due to filtering")); + new_client.stop(); + } else { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Allowed through filter")); + } + } + // find an empty slot uint32_t i; for (i=0; iavailable(); + client = new_client; break; } } @@ -73,7 +87,7 @@ void TCPLoop(void) i = client_next++ % nitems(client_tcp); WiFiClient &client = client_tcp[i]; client.stop(); - client = server_tcp->available(); + client = new_client; } } @@ -139,12 +153,21 @@ void TCPInit(void) { \*********************************************************************************************/ // -// Command `ZbConfig` +// Command `TCPStart` +// Params: port, // void CmndTCPStart(void) { if (!TCPSerial) { return; } + int32_t tcp_port = XdrvMailbox.payload; + if (ArgC() == 2) { + char sub_string[XdrvMailbox.data_len]; + ip_filter.fromString(ArgV(sub_string, 2)); + } else { + // Disable whitelist if previously set + ip_filter = (uint32_t)0; + } if (server_tcp) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Stopping TCP server")); @@ -159,6 +182,9 @@ void CmndTCPStart(void) { } if (tcp_port > 0) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Starting TCP server on port %d"), tcp_port); + if (ip_filter) { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Filtering %s"), ip_filter.toString().c_str()); + } server_tcp = new WiFiServer(tcp_port); server_tcp->begin(); // start TCP server server_tcp->setNoDelay(true); From 02877c0757794edb3451a2bd91d9080b68119087 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 1 Aug 2021 16:14:20 +0200 Subject: [PATCH 069/148] Support for wifi range extender in IDF 4.4 needed for PR #12784 --- platformio_tasmota_cenv_sample.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 29be983d6..bb529e6e1 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -32,7 +32,7 @@ build_flags = ${esp32_defaults.build_flags} extends = env:tasmota32_base board = esp32s2 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/380/framework-arduinoespressif32-master-cd287c4d6.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/385/framework-arduinoespressif32-master-cd287c4d6.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} -DFIRMWARE_LITE @@ -48,7 +48,7 @@ lib_ignore = extends = env:tasmota32_base board = esp32c3 platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/380/framework-arduinoespressif32-master-cd287c4d6.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/385/framework-arduinoespressif32-master-cd287c4d6.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable @@ -71,7 +71,7 @@ lib_ignore = [env:tasmota32idf4] extends = env:tasmota32_base platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/380/framework-arduinoespressif32-master-cd287c4d6.tar.gz +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/385/framework-arduinoespressif32-master-cd287c4d6.tar.gz platformio/tool-mklittlefs @ ~1.203.200522 build_unflags = ${esp32_defaults.build_unflags} -Wswitch-unreachable From c3a1ba8de28e6d16e2b68d5341a018f712cd45dd Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 1 Aug 2021 17:48:19 +0200 Subject: [PATCH 070/148] Initial wifi range extender (#12784) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xdrv_58_range_extender.ino | 352 +++++++++++++++++++++++++++++ 3 files changed, 354 insertions(+) create mode 100644 tasmota/xdrv_58_range_extender.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index 1abfae0ea..5e839b4ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [9.5.0.4] ### Added - Support for second DNS server +- Optional IP filter to command ``TCPStart`` (#12806) ### Changed - ESP8266Audio library from v1.5.0 to v1.9.2 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1417e723d..69bfc7056 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -113,6 +113,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for Technoline WS2300-15 Anemometer [#12573](https://github.com/arendst/Tasmota/issues/12573) - Support for Telaire T6700 Series CO2 sensor by Alexander Savchenko [#12618](https://github.com/arendst/Tasmota/issues/12618) - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) +- Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806) ### Changed - ESP32 core library from v1.0.6 to v1.0.7.3 diff --git a/tasmota/xdrv_58_range_extender.ino b/tasmota/xdrv_58_range_extender.ino new file mode 100644 index 000000000..627d4a31d --- /dev/null +++ b/tasmota/xdrv_58_range_extender.ino @@ -0,0 +1,352 @@ +/* + xdrv_58_range_extender.ino - WiFi Range Extender for Tasmota + + Copyright (C) 2021 sillyfrog and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 USE_WIFI_RANGE_EXTENDER +/********************************************************************************************* +To use this, add the following to your user_config_override.h +#define USE_WIFI_RANGE_EXTENDER + +Additionally PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH must be set in your build options. +For example, in your platfromio_tasmota_cenv.ini, you will need an entry such as: +[env:tasmota-rangeextender] +build_flags = ${common.build_flags} + -D FIRMWARE_RANGE_EXTENDER + -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH + +If you want to support NAPT (removing the need for routes on a core router): +#define USE_WIFI_RANGE_EXTENDER_NAPT + +An example full static configuration: +#define USE_WIFI_RANGE_EXTENDER +#define USE_WIFI_RANGE_EXTENDER_NAPT +#define WIFI_RGX_SSID "rangeextender" +#define WIFI_RGX_PASSWORD "securepassword" +#define WIFI_RGX_IP_ADDRESS "10.99.1.1" +#define WIFI_RGX_SUBNETMASK "255.255.255.0" + +\*********************************************************************************************/ + +#define XDRV_58 58 + +// Memory usage at 512: Heap from 30136 to 17632: 12504 +// Memory usage at 128: Heap from 30136 to 26848: 3288 +#define NAPT 128 // IP_NAPT_MAX: 512 +#define NAPT_PORT 10 // IP_PORTMAP_MAX: 32 + +#warning **** USE_WIFI_RANGE_EXTENDER is enabled **** + +#ifdef ESP8266 +#ifdef LWIP_FEATURES +// All good +#else +#error LWIP_FEATURES required, add "-D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH" to build_flags +#endif // LWIP_FEATURES +#endif // ESP8266 + +#ifdef ESP32 +#ifdef CONFIG_LWIP_IP_FORWARD +// All good +#else +#error CONFIG_LWIP_IP_FORWARD not set, arduino-esp32 v2 or later required with CONFIG_LWIP_IP_FORWARD support +#endif // CONFIG_LWIP_IP_FORWARD +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT +#ifdef CONFIG_LWIP_IPV4_NAPT +// All good +#else +#error CONFIG_LWIP_IPV4_NAPT not set, arduino-esp32 v2 or later required with CONFIG_LWIP_IPV4_NAPT support +#endif // IP_NAPT +#endif // CONFIG_LWIP_IPV4_NAPT +#endif // ESP32 + +const char kDrvRgxCommands[] PROGMEM = "Rgx|" // Prefix + "State" + "|" + D_CMND_SSID + "|" + D_CMND_PASSWORD +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT + "|" + "NAPT" +#endif // USE_WIFI_RANGE_EXTENDER_NAPT + "|" + "Address" + "|" + "Subnet"; + +void (*const DrvRgxCommand[])(void) PROGMEM = { + &CmndRgxState, + &CmndRgxSSID, + &CmndRgxPassword, +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT + &CmndRgxNAPT, +#endif // USE_WIFI_RANGE_EXTENDER_NAPT + &CmndRgxAddresses, + &CmndRgxAddresses, +}; + +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT +#ifdef ESP8266 +#include +#endif // ESP8266 +#endif // USE_WIFI_RANGE_EXTENDER_NAPT + +#include +#include +#ifdef ESP8266 +#include +#endif // ESP8266 +#ifdef ESP32 +#include "lwip/lwip_napt.h" +#include +#endif // ESP32 + +#define RGX_NOT_CONFIGURED 0 +#define RGX_FORCE_CONFIGURE 1 +#define RGX_CONFIGURED 2 +#define RGX_CONFIG_INCOMPLETE 3 +#define RGX_SETUP_NAPT 4 + +typedef struct { + uint8_t status = RGX_NOT_CONFIGURED; +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT + bool napt_enabled = false; +#ifdef ESP8266 + bool napt_inited = false; +#endif // ESP8266 +#endif // USE_WIFI_RANGE_EXTENDER_NAPT +} TRgxSettings; + +TRgxSettings RgxSettings; + +// Check the current configuration is complete, updating RgxSettings.status +void RgxCheckConfig(void) +{ + if ( + strlen(SettingsText(SET_RGX_SSID)) > 0 && + strlen(SettingsText(SET_RGX_PASSWORD)) >= 8 && + Settings->ipv4_rgx_address && + Settings->ipv4_rgx_subnetmask) + { + if (RgxSettings.status != RGX_FORCE_CONFIGURE) + { + RgxSettings.status = RGX_NOT_CONFIGURED; + } + } + else + { + RgxSettings.status = RGX_CONFIG_INCOMPLETE; + } +} + +void CmndRgxState(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + if (Settings->sbflag1.range_extender != XdrvMailbox.payload) { + Settings->sbflag1.range_extender = XdrvMailbox.payload; + if (0 == XdrvMailbox.payload) { // Turn off + TasmotaGlobal.restart_flag = 2; + } + } + } + ResponseCmndStateText(Settings->sbflag1.range_extender); +} + +void CmndRgxAddresses(void) { + char network_address[22]; + ext_snprintf_P(network_address, sizeof(network_address), PSTR(" (%_I)"), (uint32_t)NetworkAddress()); + uint32_t ipv4_address; + if (ParseIPv4(&ipv4_address, XdrvMailbox.data)) { + if (XdrvMailbox.command[3] == 'S') { // Subnet + Settings->ipv4_rgx_subnetmask = ipv4_address; + } else { + Settings->ipv4_rgx_address = ipv4_address; + } + RgxSettings.status = RGX_FORCE_CONFIGURE; + } + ResponseRgxConfig(); +} + +void CmndRgxSSID(void) { + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_RGX_SSID, (SC_CLEAR == Shortcut()) ? "" : XdrvMailbox.data); + } + RgxSettings.status = RGX_FORCE_CONFIGURE; + ResponseRgxConfig(); +} + +void CmndRgxPassword(void) { + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_RGX_PASSWORD, (SC_CLEAR == Shortcut()) ? "" : XdrvMailbox.data); + } + RgxSettings.status = RGX_FORCE_CONFIGURE; + ResponseRgxConfig(); +} + +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT +void CmndRgxNAPT(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + if (Settings->sbflag1.range_extender_napt != XdrvMailbox.payload) { + Settings->sbflag1.range_extender_napt = XdrvMailbox.payload; + RgxSettings.status = RGX_FORCE_CONFIGURE; + } + } + ResponseCmndStateText(Settings->sbflag1.range_extender_napt); +}; +#endif // USE_WIFI_RANGE_EXTENDER_NAPT + +void ResponseRgxConfig(void) +{ + RgxCheckConfig(); + Response_P(PSTR("{\"Rgx\":{\"Valid\":\"%s\",\"" D_CMND_SSID "\":\"%s\",\"" D_CMND_PASSWORD "\":\"%s\",\"" D_CMND_IPADDRESS "\":\"%_I\",\"" D_JSON_SUBNETMASK "\":\"%_I\"}"), + (RgxSettings.status == RGX_CONFIG_INCOMPLETE) ? "false" : "true", + EscapeJSONString(SettingsText(SET_RGX_SSID)).c_str(), + EscapeJSONString(SettingsText(SET_RGX_PASSWORD)).c_str(), + Settings->ipv4_rgx_address, + Settings->ipv4_rgx_subnetmask); +} + +void rngxSetup() +{ + // Check we have a complete config first + RgxCheckConfig(); + if (RgxSettings.status == RGX_CONFIG_INCOMPLETE) + { + AddLog(LOG_LEVEL_DEBUG, PSTR("RGX: Range Extender config incomplete")); + return; + } +#ifdef ESP8266 + dhcps_set_dns(0, WiFi.dnsIP(0)); + dhcps_set_dns(1, WiFi.dnsIP(1)); +#endif // ESP8266 +#ifdef ESP32 + esp_err_t err; + tcpip_adapter_dns_info_t ip_dns; + + err = tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP); + err = tcpip_adapter_get_dns_info(TCPIP_ADAPTER_IF_STA, ESP_NETIF_DNS_MAIN, &ip_dns); + err = tcpip_adapter_set_dns_info(TCPIP_ADAPTER_IF_AP, ESP_NETIF_DNS_MAIN, &ip_dns); + dhcps_offer_t opt_val = OFFER_DNS; // supply a dns server via dhcps + tcpip_adapter_dhcps_option(ESP_NETIF_OP_SET, ESP_NETIF_DOMAIN_NAME_SERVER, &opt_val, 1); + err = tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP); +#endif // ESP32 + // WiFi.softAPConfig(EXTENDER_LOCAL_IP, EXTENDER_GATEWAY_IP, EXTENDER_SUBNET); + WiFi.softAPConfig(Settings->ipv4_rgx_address, Settings->ipv4_rgx_address, Settings->ipv4_rgx_subnetmask); + WiFi.softAP(SettingsText(SET_RGX_SSID), SettingsText(SET_RGX_PASSWORD)); + AddLog(LOG_LEVEL_INFO, PSTR("RGX: WiFi Extender AP Enabled")); + RgxSettings.status = RGX_SETUP_NAPT; +} + +void rngxSetupNAPT(void) { + // A short delay is required for enabling NAPT to work on the ESP32 +#ifdef USE_WIFI_RANGE_EXTENDER_NAPT + if (Settings->sbflag1.range_extender_napt && !RgxSettings.napt_enabled) { +#ifdef ESP8266 + if (!RgxSettings.napt_inited) { + err_t ret = ip_napt_init(NAPT, NAPT_PORT); + if (ret == ERR_OK) { + AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT initialization complete")); + RgxSettings.napt_inited = true; + } else { + AddLog(LOG_LEVEL_ERROR, PSTR("RGX: NAPT initialization failed! (%d)"), ret); + } + } + if (RgxSettings.napt_inited) { + err_t ret = ip_napt_enable_no(SOFTAP_IF, 1); + if (ret == ERR_OK) { + AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT Enabled")); + RgxSettings.napt_enabled = true; + } + } +#endif // ESP8266 +#ifdef ESP32 + ip_napt_enable(WiFi.softAPIP(), 1); + AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT Enabled")); + RgxSettings.napt_enabled = true; +#endif // ESP32 + } + else if (!Settings->sbflag1.range_extender_napt && RgxSettings.napt_enabled) { +#ifdef ESP8266 + err_t ret = ip_napt_enable_no(SOFTAP_IF, 0); + if (ret == ERR_OK) { + AddLog(LOG_LEVEL_INFO, "RGX: NAPT Disabled"); + RgxSettings.napt_enabled = false; + } +#endif // ESP8266 +#ifdef ESP32 + ip_napt_enable(WiFi.softAPIP(), 0); + AddLog(LOG_LEVEL_INFO, "RGX: NAPT Disabled, reboot maybe required"); +#endif // ESP32 + } +#endif // USE_WIFI_RANGE_EXTENDER_NAPT + RgxSettings.status = RGX_CONFIGURED; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv58(uint8_t function) { + bool result = false; + + if (FUNC_COMMAND == function) { + result = DecodeCommand(kDrvRgxCommands, DrvRgxCommand); + } + else if (Settings->sbflag1.range_extender && !TasmotaGlobal.restart_flag) { + switch (function) + { + case FUNC_PRE_INIT: + break; + case FUNC_EVERY_SECOND: + // AddLog(LOG_LEVEL_INFO, PSTR("RGX: XXX DEBUG INFO: Wifi.status: %d, WiFi.getMode(): %d, RgxSettings.status: %d"), Wifi.status, WiFi.getMode(), RgxSettings.status); + if (RgxSettings.status == RGX_NOT_CONFIGURED && Wifi.status == WL_CONNECTED) + { + // Setup only if WiFi in STA only mode + if (WiFi.getMode() == WIFI_STA) + { + // Connecting for the first time, setup WiFi + rngxSetup(); + } + else + { + RgxSettings.status = RGX_CONFIGURED; + } + } + else if (RgxSettings.status == RGX_FORCE_CONFIGURE && Wifi.status == WL_CONNECTED) + { + rngxSetup(); + } + else if (RgxSettings.status == RGX_SETUP_NAPT) + { + rngxSetupNAPT(); + } + else if (RgxSettings.status == RGX_CONFIGURED) + { + if (Wifi.status != WL_CONNECTED) + { + // No longer connected, need to setup again + AddLog(LOG_LEVEL_INFO, PSTR("RGX: No longer connected, prepare to reconnect WiFi AP...")); + RgxSettings.status = RGX_NOT_CONFIGURED; + } + } + break; + } + } + return result; +} + +#endif // USE_WIFI_RANGE_EXTENDER \ No newline at end of file From 5dc009b9c5e10b682ac5684e9dd79d809af6ef2a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 1 Aug 2021 17:51:54 +0200 Subject: [PATCH 071/148] Oops forgot most changes. --- tasmota/settings.h | 8 +++++--- tasmota/settings.ino | 10 ++++++++++ tasmota/tasmota.h | 1 + tasmota/tasmota_globals.h | 17 +++++++++++++++++ tasmota/tasmota_version.h | 2 +- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 150e5558d..507efdf43 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -245,8 +245,8 @@ typedef union { uint32_t telegram_send_enable : 1; // bit 0 (v9.4.0.3) - CMND_TMSTATE 0/1 - Enable Telegram send uint32_t telegram_recv_enable : 1; // bit 1 (v9.4.0.3) - CMND_TMSTATE 2/3 - Enable Telegram receive uint32_t telegram_echo_enable : 1; // bit 2 (v9.4.0.3) - CMND_TMSTATE 4/5 - Enable Telegram echo - uint32_t spare03 : 1; // bit 3 - uint32_t spare04 : 1; // bit 4 + uint32_t range_extender : 1; // bit 3 (v9.5.0.5) - CMND_RGXSTATE - Enable range extender + uint32_t range_extender_napt : 1; // bit 4 (v9.5.0.5) - CMND_RGXNAPT - Enable range extender NAPT uint32_t spare05 : 1; // bit 5 uint32_t spare06 : 1; // bit 6 uint32_t spare07 : 1; // bit 7 @@ -599,8 +599,10 @@ typedef struct { uint16_t pulse_timer[MAX_PULSETIMERS]; // 532 uint16_t button_debounce; // 542 uint32_t ipv4_address[5]; // 544 + uint32_t ipv4_rgx_address; // 558 + uint32_t ipv4_rgx_subnetmask; // 55C - uint8_t free_558[100]; // 558 + uint8_t free_560[92]; // 560 SysMBitfield1 flag2; // 5BC unsigned long pulse_counter[MAX_COUNTERS]; // 5C0 diff --git a/tasmota/settings.ino b/tasmota/settings.ino index f751ede1d..a0a861f97 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -860,6 +860,8 @@ void SettingsDefaultSet2(void) { ParseIPv4(&Settings->ipv4_address[2], PSTR(WIFI_SUBNETMASK)); ParseIPv4(&Settings->ipv4_address[3], PSTR(WIFI_DNS)); ParseIPv4(&Settings->ipv4_address[4], PSTR(WIFI_DNS2)); + ParseIPv4(&Settings->ipv4_rgx_address, PSTR(WIFI_RGX_IP_ADDRESS)); + ParseIPv4(&Settings->ipv4_rgx_subnetmask, PSTR(WIFI_RGX_SUBNETMASK)); Settings->sta_config = WIFI_CONFIG_TOOL; // Settings->sta_active = 0; SettingsUpdateText(SET_STASSID1, PSTR(STA_SSID1)); @@ -867,6 +869,8 @@ void SettingsDefaultSet2(void) { SettingsUpdateText(SET_STAPWD1, PSTR(STA_PASS1)); SettingsUpdateText(SET_STAPWD2, PSTR(STA_PASS2)); SettingsUpdateText(SET_HOSTNAME, WIFI_HOSTNAME); + SettingsUpdateText(SET_RGX_SSID, PSTR(WIFI_RGX_SSID)); + SettingsUpdateText(SET_RGX_PASSWORD, PSTR(WIFI_RGX_PASSWORD)); // Syslog SettingsUpdateText(SET_SYSLOG_HOST, PSTR(SYS_LOG_HOST)); @@ -1381,6 +1385,12 @@ void SettingsDelta(void) { Settings->energy_kWhtotal = Settings->ipv4_address[4]; ParseIPv4(&Settings->ipv4_address[4], PSTR(WIFI_DNS2)); } + if (Settings->version < 0x09050005) { + ParseIPv4(&Settings->ipv4_rgx_address, PSTR(WIFI_RGX_IP_ADDRESS)); + ParseIPv4(&Settings->ipv4_rgx_subnetmask, PSTR(WIFI_RGX_SUBNETMASK)); + SettingsUpdateText(SET_RGX_SSID, PSTR(WIFI_RGX_SSID)); + SettingsUpdateText(SET_RGX_PASSWORD, PSTR(WIFI_RGX_PASSWORD)); + } Settings->version = VERSION; SettingsSave(1); diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 0fc1b662c..86f2143b6 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -368,6 +368,7 @@ enum SettingsTextIndex { SET_OTAURL, SET_SWITCH_TXT25, SET_SWITCH_TXT26, SET_SWITCH_TXT27, SET_SWITCH_TXT28, // MAX_SWITCHES_TXT #endif // ESP32 SET_SHD_PARAM, + SET_RGX_SSID, SET_RGX_PASSWORD, SET_MAX }; enum SpiInterfaces { SPI_NONE, SPI_MOSI, SPI_MISO, SPI_MOSI_MISO }; diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h index be3d67f96..11246252e 100644 --- a/tasmota/tasmota_globals.h +++ b/tasmota/tasmota_globals.h @@ -156,6 +156,10 @@ String EthernetMacAddress(void); #endif // ESP32 +/*********************************************************************************************\ + * Fallback parameters +\*********************************************************************************************/ + #ifdef USE_PID #define USE_TIMEPROP #endif @@ -340,6 +344,19 @@ String EthernetMacAddress(void); #define STARTING_OFFSET 30 // NOVA SDS parameter used in settings #endif +#ifndef WIFI_RGX_SSID +#define WIFI_RGX_SSID "" +#endif +#ifndef WIFI_RGX_PASSWORD +#define WIFI_RGX_PASSWORD "" +#endif +#ifndef WIFI_RGX_IP_ADDRESS +#define WIFI_RGX_IP_ADDRESS "192.168.99.1" +#endif +#ifndef WIFI_RGX_SUBNETMASK +#define WIFI_RGX_SUBNETMASK "255.255.255.0" +#endif + /*********************************************************************************************\ * UserConfig related parameters \*********************************************************************************************/ diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index d732eaef6..bb18eec6f 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x09050004; +const uint32_t VERSION = 0x09050005; #endif // _TASMOTA_VERSION_H_ From ba5b386678e7d9914875875df1e3519b23c81dd7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 1 Aug 2021 17:57:13 +0200 Subject: [PATCH 072/148] Bump version to 9.5.0.5 --- CHANGELOG.md | 8 ++++++-- RELEASENOTES.md | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e839b4ed..a7714d376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [9.5.0.4] +## [9.5.0.5] +### Added +- Inital support for Wi-Fi extender (#12784) + +## [9.5.0.4] 20210801 ### Added - Support for second DNS server - Optional IP filter to command ``TCPStart`` (#12806) @@ -36,7 +40,7 @@ All notable changes to this project will be documented in this file. ### Added - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW (#11939) - MQTT minimum password length restriction in GUI (#12553) -- Command ``SetOption127 1`` to force Wifi in no-sleep mode even if ``Sleep 0`` is not enabled +- Command ``SetOption127 1`` to force Wi-Fi in no-sleep mode even if ``Sleep 0`` is not enabled - Support for Technoline WS2300-15 Anemometer (#12573) - Support for Telaire T6700 Series CO2 sensor by Alexander Savchenko (#12618) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 69bfc7056..1feb32567 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -98,10 +98,10 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v9.5.0.4 +## Changelog v9.5.0.5 ### Added - Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota/) -- Command ``SetOption127 1`` to force Wifi in no-sleep mode even if ``Sleep 0`` is not enabled +- Command ``SetOption127 1`` to force Wi-Fi in no-sleep mode even if ``Sleep 0`` is not enabled - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Support for second DNS server - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939) @@ -114,6 +114,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for Telaire T6700 Series CO2 sensor by Alexander Savchenko [#12618](https://github.com/arendst/Tasmota/issues/12618) - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) - Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806) +- Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) ### Changed - ESP32 core library from v1.0.6 to v1.0.7.3 From d181850b4f094e3d3e8ef5cffa4b874d144c5e43 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 1 Aug 2021 18:07:51 +0200 Subject: [PATCH 073/148] Env [rangeextender] in cenv --- platformio_tasmota_cenv_sample.ini | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index bb529e6e1..1e7dbc000 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -16,6 +16,17 @@ build_flags = ${esp82xx_defaults.build_flags} -D PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48_SECHEAP_SHARED -Wno-switch-unreachable +[env:tasmota-rangeextender] +build_unflags = ${esp_defaults.build_unflags} +build_flags = ${esp_default.build_flags} + -D FIRMWARE_RANGE_EXTENDER + -D USE_WIFI_RANGE_EXTENDER + -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH + -D USE_WIFI_RANGE_EXTENDER_NAPT + ;-D WIFI_RGX_SSID "rangeextender" + ;-D WIFI_RGX_PASSWORD "securepassword" + ;-D WIFI_RGX_IP_ADDRESS "10.99.1.1" + ;-D WIFI_RGX_SUBNETMASK "255.255.255.0" ; *** Tasmota development core version ESP32 IDF3.3.5 / Currently none, same as default [env:tasmota32idf3] From 113749345152dbbaf8c87c7f7f5bf7a73206c067 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 1 Aug 2021 19:03:19 +0200 Subject: [PATCH 074/148] Update platformio_tasmota_cenv_sample.ini --- platformio_tasmota_cenv_sample.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 1e7dbc000..a4e1ce2cb 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -18,7 +18,7 @@ build_flags = ${esp82xx_defaults.build_flags} [env:tasmota-rangeextender] build_unflags = ${esp_defaults.build_unflags} -build_flags = ${esp_default.build_flags} +build_flags = ${esp82xx_defaults.build_flags} -D FIRMWARE_RANGE_EXTENDER -D USE_WIFI_RANGE_EXTENDER -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH From cf77cf2928edf8e800dc1db31249389ef54ef426 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 1 Aug 2021 19:09:18 +0200 Subject: [PATCH 075/148] Update platformio_tasmota_cenv_sample.ini --- platformio_tasmota_cenv_sample.ini | 4 ---- 1 file changed, 4 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index a4e1ce2cb..6a49605f7 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -23,10 +23,6 @@ build_flags = ${esp82xx_defaults.build_flags} -D USE_WIFI_RANGE_EXTENDER -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH -D USE_WIFI_RANGE_EXTENDER_NAPT - ;-D WIFI_RGX_SSID "rangeextender" - ;-D WIFI_RGX_PASSWORD "securepassword" - ;-D WIFI_RGX_IP_ADDRESS "10.99.1.1" - ;-D WIFI_RGX_SUBNETMASK "255.255.255.0" ; *** Tasmota development core version ESP32 IDF3.3.5 / Currently none, same as default [env:tasmota32idf3] From c326e9303a15a24a53e0918c64804457a2bf01de Mon Sep 17 00:00:00 2001 From: Sillyfrog Date: Mon, 2 Aug 2021 10:25:32 +1000 Subject: [PATCH 076/148] Config Override RgxState & RgxNAPT, update inline docs --- platformio_tasmota_cenv_sample.ini | 9 +- tasmota/settings.ino | 4 + tasmota/tasmota_globals.h | 6 + tasmota/xdrv_58_range_extender.ino | 190 ++++++++++++++++++----------- 4 files changed, 136 insertions(+), 73 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 6a49605f7..7e79e50e2 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -20,8 +20,8 @@ build_flags = ${esp82xx_defaults.build_flags} build_unflags = ${esp_defaults.build_unflags} build_flags = ${esp82xx_defaults.build_flags} -D FIRMWARE_RANGE_EXTENDER - -D USE_WIFI_RANGE_EXTENDER -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH + -D USE_WIFI_RANGE_EXTENDER -D USE_WIFI_RANGE_EXTENDER_NAPT ; *** Tasmota development core version ESP32 IDF3.3.5 / Currently none, same as default @@ -87,6 +87,13 @@ build_flags = ${esp32_defaults.build_flags} -Wno-switch-unreachable ;-DESP32_STAGE=true +[env:tasmota32-rangeextender] +extends = env:tasmota32idf4 +build_flags = ${env:tasmota32idf4.build_flags} + -D FIRMWARE_TASMOTA32 + -D USE_WIFI_RANGE_EXTENDER + -D USE_WIFI_RANGE_EXTENDER_NAPT + ; *** Debug version used for PlatformIO Home Project Inspection [env:tasmota-debug] build_type = debug diff --git a/tasmota/settings.ino b/tasmota/settings.ino index a0a861f97..d5f5e2b4d 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -871,6 +871,8 @@ void SettingsDefaultSet2(void) { SettingsUpdateText(SET_HOSTNAME, WIFI_HOSTNAME); SettingsUpdateText(SET_RGX_SSID, PSTR(WIFI_RGX_SSID)); SettingsUpdateText(SET_RGX_PASSWORD, PSTR(WIFI_RGX_PASSWORD)); + Settings->sbflag1.range_extender = WIFI_RGX_STATE; + Settings->sbflag1.range_extender_napt = WIFI_RGX_NAPT; // Syslog SettingsUpdateText(SET_SYSLOG_HOST, PSTR(SYS_LOG_HOST)); @@ -1386,6 +1388,8 @@ void SettingsDelta(void) { ParseIPv4(&Settings->ipv4_address[4], PSTR(WIFI_DNS2)); } if (Settings->version < 0x09050005) { + Settings->sbflag1.range_extender = WIFI_RGX_STATE; + Settings->sbflag1.range_extender_napt = WIFI_RGX_NAPT; ParseIPv4(&Settings->ipv4_rgx_address, PSTR(WIFI_RGX_IP_ADDRESS)); ParseIPv4(&Settings->ipv4_rgx_subnetmask, PSTR(WIFI_RGX_SUBNETMASK)); SettingsUpdateText(SET_RGX_SSID, PSTR(WIFI_RGX_SSID)); diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h index 11246252e..52cd5b39f 100644 --- a/tasmota/tasmota_globals.h +++ b/tasmota/tasmota_globals.h @@ -344,6 +344,12 @@ String EthernetMacAddress(void); #define STARTING_OFFSET 30 // NOVA SDS parameter used in settings #endif +#ifndef WIFI_RGX_STATE +#define WIFI_RGX_STATE 0 +#endif +#ifndef WIFI_RGX_NAPT +#define WIFI_RGX_NAPT 0 +#endif #ifndef WIFI_RGX_SSID #define WIFI_RGX_SSID "" #endif diff --git a/tasmota/xdrv_58_range_extender.ino b/tasmota/xdrv_58_range_extender.ino index 627d4a31d..bf7397a3c 100644 --- a/tasmota/xdrv_58_range_extender.ino +++ b/tasmota/xdrv_58_range_extender.ino @@ -22,32 +22,42 @@ To use this, add the following to your user_config_override.h #define USE_WIFI_RANGE_EXTENDER -Additionally PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH must be set in your build options. +Additionally, for the ESP8266, PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH must be +set in your build options. For example, in your platfromio_tasmota_cenv.ini, you will need an entry such as: [env:tasmota-rangeextender] build_flags = ${common.build_flags} - -D FIRMWARE_RANGE_EXTENDER -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH +For the ESP32, the arduino-esp32 library must be at least version 2, with +CONFIG_LWIP_IP_FORWARD option set, and optionally CONFIG_LWIP_IPV4_NAPT. + If you want to support NAPT (removing the need for routes on a core router): #define USE_WIFI_RANGE_EXTENDER_NAPT + An example full static configuration: #define USE_WIFI_RANGE_EXTENDER #define USE_WIFI_RANGE_EXTENDER_NAPT +#define WIFI_RGX_STATE 1 +#define WIFI_RGX_NAPT 1 #define WIFI_RGX_SSID "rangeextender" #define WIFI_RGX_PASSWORD "securepassword" #define WIFI_RGX_IP_ADDRESS "10.99.1.1" #define WIFI_RGX_SUBNETMASK "255.255.255.0" + +A full command to enable the Range Extender, including with NAPT could be: +Backlog RgxSSID rangeextender ; RgxPassword securepassword ; RgxAddress 192.168.123.1 ; RgxSubnet 255.255.255.0; RgxState 1 ; RgxNAPT 1 + \*********************************************************************************************/ #define XDRV_58 58 // Memory usage at 512: Heap from 30136 to 17632: 12504 // Memory usage at 128: Heap from 30136 to 26848: 3288 -#define NAPT 128 // IP_NAPT_MAX: 512 -#define NAPT_PORT 10 // IP_PORTMAP_MAX: 32 +#define NAPT 128 // IP_NAPT_MAX: 512 +#define NAPT_PORT 10 // IP_PORTMAP_MAX: 32 #warning **** USE_WIFI_RANGE_EXTENDER is enabled **** @@ -56,34 +66,32 @@ An example full static configuration: // All good #else #error LWIP_FEATURES required, add "-D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH" to build_flags -#endif // LWIP_FEATURES -#endif // ESP8266 +#endif // LWIP_FEATURES +#endif // ESP8266 #ifdef ESP32 #ifdef CONFIG_LWIP_IP_FORWARD // All good #else #error CONFIG_LWIP_IP_FORWARD not set, arduino-esp32 v2 or later required with CONFIG_LWIP_IP_FORWARD support -#endif // CONFIG_LWIP_IP_FORWARD +#endif // CONFIG_LWIP_IP_FORWARD #ifdef USE_WIFI_RANGE_EXTENDER_NAPT #ifdef CONFIG_LWIP_IPV4_NAPT // All good #else #error CONFIG_LWIP_IPV4_NAPT not set, arduino-esp32 v2 or later required with CONFIG_LWIP_IPV4_NAPT support -#endif // IP_NAPT -#endif // CONFIG_LWIP_IPV4_NAPT -#endif // ESP32 +#endif // IP_NAPT +#endif // CONFIG_LWIP_IPV4_NAPT +#endif // ESP32 const char kDrvRgxCommands[] PROGMEM = "Rgx|" // Prefix "State" - "|" - D_CMND_SSID - "|" - D_CMND_PASSWORD + "|" D_CMND_SSID + "|" D_CMND_PASSWORD #ifdef USE_WIFI_RANGE_EXTENDER_NAPT "|" "NAPT" -#endif // USE_WIFI_RANGE_EXTENDER_NAPT +#endif // USE_WIFI_RANGE_EXTENDER_NAPT "|" "Address" "|" @@ -95,7 +103,7 @@ void (*const DrvRgxCommand[])(void) PROGMEM = { &CmndRgxPassword, #ifdef USE_WIFI_RANGE_EXTENDER_NAPT &CmndRgxNAPT, -#endif // USE_WIFI_RANGE_EXTENDER_NAPT +#endif // USE_WIFI_RANGE_EXTENDER_NAPT &CmndRgxAddresses, &CmndRgxAddresses, }; @@ -103,18 +111,18 @@ void (*const DrvRgxCommand[])(void) PROGMEM = { #ifdef USE_WIFI_RANGE_EXTENDER_NAPT #ifdef ESP8266 #include -#endif // ESP8266 -#endif // USE_WIFI_RANGE_EXTENDER_NAPT +#endif // ESP8266 +#endif // USE_WIFI_RANGE_EXTENDER_NAPT #include #include #ifdef ESP8266 #include -#endif // ESP8266 +#endif // ESP8266 #ifdef ESP32 #include "lwip/lwip_napt.h" #include -#endif // ESP32 +#endif // ESP32 #define RGX_NOT_CONFIGURED 0 #define RGX_FORCE_CONFIGURE 1 @@ -122,14 +130,12 @@ void (*const DrvRgxCommand[])(void) PROGMEM = { #define RGX_CONFIG_INCOMPLETE 3 #define RGX_SETUP_NAPT 4 -typedef struct { +typedef struct +{ uint8_t status = RGX_NOT_CONFIGURED; #ifdef USE_WIFI_RANGE_EXTENDER_NAPT bool napt_enabled = false; -#ifdef ESP8266 - bool napt_inited = false; -#endif // ESP8266 -#endif // USE_WIFI_RANGE_EXTENDER_NAPT +#endif // USE_WIFI_RANGE_EXTENDER_NAPT } TRgxSettings; TRgxSettings RgxSettings; @@ -154,11 +160,15 @@ void RgxCheckConfig(void) } } -void CmndRgxState(void) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { - if (Settings->sbflag1.range_extender != XdrvMailbox.payload) { +void CmndRgxState(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) + { + if (Settings->sbflag1.range_extender != XdrvMailbox.payload) + { Settings->sbflag1.range_extender = XdrvMailbox.payload; - if (0 == XdrvMailbox.payload) { // Turn off + if (0 == XdrvMailbox.payload) + { // Turn off TasmotaGlobal.restart_flag = 2; } } @@ -166,14 +176,19 @@ void CmndRgxState(void) { ResponseCmndStateText(Settings->sbflag1.range_extender); } -void CmndRgxAddresses(void) { +void CmndRgxAddresses(void) +{ char network_address[22]; ext_snprintf_P(network_address, sizeof(network_address), PSTR(" (%_I)"), (uint32_t)NetworkAddress()); uint32_t ipv4_address; - if (ParseIPv4(&ipv4_address, XdrvMailbox.data)) { - if (XdrvMailbox.command[3] == 'S') { // Subnet + if (ParseIPv4(&ipv4_address, XdrvMailbox.data)) + { + if (XdrvMailbox.command[3] == 'S') // Subnet + { Settings->ipv4_rgx_subnetmask = ipv4_address; - } else { + } + else + { Settings->ipv4_rgx_address = ipv4_address; } RgxSettings.status = RGX_FORCE_CONFIGURE; @@ -181,33 +196,49 @@ void CmndRgxAddresses(void) { ResponseRgxConfig(); } -void CmndRgxSSID(void) { - if (XdrvMailbox.data_len > 0) { +void CmndRgxSSID(void) +{ + if (XdrvMailbox.data_len > 0) + { SettingsUpdateText(SET_RGX_SSID, (SC_CLEAR == Shortcut()) ? "" : XdrvMailbox.data); + RgxSettings.status = RGX_FORCE_CONFIGURE; } - RgxSettings.status = RGX_FORCE_CONFIGURE; ResponseRgxConfig(); } -void CmndRgxPassword(void) { - if (XdrvMailbox.data_len > 0) { +void CmndRgxPassword(void) +{ + if (XdrvMailbox.data_len > 0) + { SettingsUpdateText(SET_RGX_PASSWORD, (SC_CLEAR == Shortcut()) ? "" : XdrvMailbox.data); + RgxSettings.status = RGX_FORCE_CONFIGURE; } - RgxSettings.status = RGX_FORCE_CONFIGURE; ResponseRgxConfig(); } #ifdef USE_WIFI_RANGE_EXTENDER_NAPT -void CmndRgxNAPT(void) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { - if (Settings->sbflag1.range_extender_napt != XdrvMailbox.payload) { +void CmndRgxNAPT(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) + { + if (Settings->sbflag1.range_extender_napt != XdrvMailbox.payload) + { Settings->sbflag1.range_extender_napt = XdrvMailbox.payload; - RgxSettings.status = RGX_FORCE_CONFIGURE; + if (0 == XdrvMailbox.payload) + { // Turn off + // ESP32 does not disable reliably, reboot to ensure a complete disable of NAPT + // rebooting also completely frees up the used RAM + TasmotaGlobal.restart_flag = 2; + } + else + { + RgxSettings.status = RGX_FORCE_CONFIGURE; + } } } ResponseCmndStateText(Settings->sbflag1.range_extender_napt); }; -#endif // USE_WIFI_RANGE_EXTENDER_NAPT +#endif // USE_WIFI_RANGE_EXTENDER_NAPT void ResponseRgxConfig(void) { @@ -232,7 +263,7 @@ void rngxSetup() #ifdef ESP8266 dhcps_set_dns(0, WiFi.dnsIP(0)); dhcps_set_dns(1, WiFi.dnsIP(1)); -#endif // ESP8266 +#endif // ESP8266 #ifdef ESP32 esp_err_t err; tcpip_adapter_dns_info_t ip_dns; @@ -243,56 +274,67 @@ void rngxSetup() dhcps_offer_t opt_val = OFFER_DNS; // supply a dns server via dhcps tcpip_adapter_dhcps_option(ESP_NETIF_OP_SET, ESP_NETIF_DOMAIN_NAME_SERVER, &opt_val, 1); err = tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP); -#endif // ESP32 +#endif // ESP32 // WiFi.softAPConfig(EXTENDER_LOCAL_IP, EXTENDER_GATEWAY_IP, EXTENDER_SUBNET); WiFi.softAPConfig(Settings->ipv4_rgx_address, Settings->ipv4_rgx_address, Settings->ipv4_rgx_subnetmask); WiFi.softAP(SettingsText(SET_RGX_SSID), SettingsText(SET_RGX_PASSWORD)); - AddLog(LOG_LEVEL_INFO, PSTR("RGX: WiFi Extender AP Enabled")); + AddLog(LOG_LEVEL_INFO, PSTR("RGX: WiFi Extender AP Enabled with SSID: %s"), WiFi.softAPSSID().c_str()); RgxSettings.status = RGX_SETUP_NAPT; } -void rngxSetupNAPT(void) { - // A short delay is required for enabling NAPT to work on the ESP32 +void rngxSetupNAPT(void) +{ + // A short delay is required for enabling NAPT to work on the ESP32, hence a dedicated + // function called a second later #ifdef USE_WIFI_RANGE_EXTENDER_NAPT - if (Settings->sbflag1.range_extender_napt && !RgxSettings.napt_enabled) { + if (Settings->sbflag1.range_extender_napt && !RgxSettings.napt_enabled) + { #ifdef ESP8266 - if (!RgxSettings.napt_inited) { - err_t ret = ip_napt_init(NAPT, NAPT_PORT); - if (ret == ERR_OK) { - AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT initialization complete")); - RgxSettings.napt_inited = true; - } else { - AddLog(LOG_LEVEL_ERROR, PSTR("RGX: NAPT initialization failed! (%d)"), ret); - } - } - if (RgxSettings.napt_inited) { + // ip_napt_init can only be called once, however device will reboot when disabled + // so no need to limit calls to init separately. + err_t ret = ip_napt_init(NAPT, NAPT_PORT); + if (ret == ERR_OK) + { + AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT initialization complete")); err_t ret = ip_napt_enable_no(SOFTAP_IF, 1); - if (ret == ERR_OK) { + if (ret == ERR_OK) + { AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT Enabled")); RgxSettings.napt_enabled = true; } } -#endif // ESP8266 + else + { + AddLog(LOG_LEVEL_ERROR, PSTR("RGX: NAPT initialization failed! (%d)"), ret); + } + +#endif // ESP8266 #ifdef ESP32 ip_napt_enable(WiFi.softAPIP(), 1); AddLog(LOG_LEVEL_INFO, PSTR("RGX: NAPT Enabled")); RgxSettings.napt_enabled = true; -#endif // ESP32 +#endif // ESP32 } - else if (!Settings->sbflag1.range_extender_napt && RgxSettings.napt_enabled) { + // This code path is no longer used as device will reboot to disable NAPT, maybe + // restored when working correctly on ESP32 + /* + else if (!Settings->sbflag1.range_extender_napt && RgxSettings.napt_enabled) + { #ifdef ESP8266 err_t ret = ip_napt_enable_no(SOFTAP_IF, 0); - if (ret == ERR_OK) { + if (ret == ERR_OK) + { AddLog(LOG_LEVEL_INFO, "RGX: NAPT Disabled"); RgxSettings.napt_enabled = false; } -#endif // ESP8266 +#endif // ESP8266 #ifdef ESP32 ip_napt_enable(WiFi.softAPIP(), 0); AddLog(LOG_LEVEL_INFO, "RGX: NAPT Disabled, reboot maybe required"); -#endif // ESP32 +#endif // ESP32 } -#endif // USE_WIFI_RANGE_EXTENDER_NAPT + */ +#endif // USE_WIFI_RANGE_EXTENDER_NAPT RgxSettings.status = RGX_CONFIGURED; } @@ -300,13 +342,16 @@ void rngxSetupNAPT(void) { * Interface \*********************************************************************************************/ -bool Xdrv58(uint8_t function) { +bool Xdrv58(uint8_t function) +{ bool result = false; - if (FUNC_COMMAND == function) { + if (FUNC_COMMAND == function) + { result = DecodeCommand(kDrvRgxCommands, DrvRgxCommand); } - else if (Settings->sbflag1.range_extender && !TasmotaGlobal.restart_flag) { + else if (Settings->sbflag1.range_extender && !TasmotaGlobal.restart_flag) + { switch (function) { case FUNC_PRE_INIT: @@ -332,6 +377,7 @@ bool Xdrv58(uint8_t function) { } else if (RgxSettings.status == RGX_SETUP_NAPT) { + // Call NAPT a second later as ESP32 requires short delay rngxSetupNAPT(); } else if (RgxSettings.status == RGX_CONFIGURED) @@ -349,4 +395,4 @@ bool Xdrv58(uint8_t function) { return result; } -#endif // USE_WIFI_RANGE_EXTENDER \ No newline at end of file +#endif // USE_WIFI_RANGE_EXTENDER \ No newline at end of file From ee7364eb0b429776f309b63d7ae5389cb5ec1e62 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 9 Jun 2021 15:17:01 +0200 Subject: [PATCH 077/148] Fix cmnd desc --- tasmota/xsns_83_neopool.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_83_neopool.ino b/tasmota/xsns_83_neopool.ino index 395c9c1db..68fc3af02 100644 --- a/tasmota/xsns_83_neopool.ino +++ b/tasmota/xsns_83_neopool.ino @@ -697,7 +697,7 @@ const char HTTP_SNS_NEOPOOL_STATUS_ACTIVE[] PROGMEM = "filter:invert(1)"; * any other value of

" D_AP2_SSID " (" STA_SSID2 ")

" "


" "

" D_HOSTNAME " (%s)

" - "

" D_CORS_DOMAIN "

"; +#ifdef USE_CORS + "

" D_CORS_DOMAIN "

" +#endif + ; const char HTTP_FORM_LOG1[] PROGMEM = "
 " D_LOGGING_PARAMETERS " " @@ -650,12 +653,14 @@ bool HttpCheckPriviledgedAccess(bool autorequestauth = true) return true; } +#ifdef USE_CORS void HttpHeaderCors(void) { if (strlen(SettingsText(SET_CORS))) { Webserver->sendHeader(F("Access-Control-Allow-Origin"), SettingsText(SET_CORS)); } } +#endif void WSHeaderSend(void) { @@ -665,7 +670,9 @@ void WSHeaderSend(void) Webserver->sendHeader(F("Cache-Control"), F("no-cache, no-store, must-revalidate")); Webserver->sendHeader(F("Pragma"), F("no-cache")); Webserver->sendHeader(F("Expires"), F("-1")); +#ifdef USE_CORS HttpHeaderCors(); +#endif } /********************************************************************************************** @@ -1993,7 +2000,11 @@ void HandleWifiConfiguration(void) { // As WIFI_HOSTNAME may contain %s-%04d it cannot be part of HTTP_FORM_WIFI where it will exception WSContentSend_P(PSTR(">

")); } else { +#ifdef USE_CORS WSContentSend_P(HTTP_FORM_WIFI_PART2, SettingsText(SET_STASSID2), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsText(SET_HOSTNAME), SettingsText(SET_CORS)); +#else + WSContentSend_P(HTTP_FORM_WIFI_PART2, SettingsText(SET_STASSID2), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsText(SET_HOSTNAME)); +#endif } WSContentSend_P(HTTP_FORM_END); @@ -2026,7 +2037,9 @@ void HandleWifiConfiguration(void) { void WifiSaveSettings(void) { String cmnd = F(D_CMND_BACKLOG "0 "); cmnd += AddWebCommand(PSTR(D_CMND_HOSTNAME), PSTR("h"), PSTR("1")); +#ifdef USE_CORS cmnd += AddWebCommand(PSTR(D_CMND_CORS), PSTR("c"), PSTR("1")); +#endif cmnd += AddWebCommand(PSTR(D_CMND_SSID "1"), PSTR("s1"), PSTR("1")); cmnd += AddWebCommand(PSTR(D_CMND_SSID "2"), PSTR("s2"), PSTR("1")); cmnd += AddWebCommand(PSTR(D_CMND_PASSWORD "3"), PSTR("p1"), PSTR("\"")); @@ -2816,7 +2829,9 @@ void HandleUploadLoop(void) { void HandlePreflightRequest(void) { +#ifdef USE_CORS HttpHeaderCors(); +#endif Webserver->sendHeader(F("Access-Control-Allow-Methods"), F("GET, POST")); Webserver->sendHeader(F("Access-Control-Allow-Headers"), F("authorization")); WSSend(200, CT_HTML, ""); @@ -3105,7 +3120,11 @@ const char kWebCommands[] PROGMEM = "|" // No prefix D_CMND_SENDMAIL "|" #endif D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBREFRESH "|" D_CMND_WEBSEND "|" D_CMND_WEBCOLOR "|" - D_CMND_WEBSENSOR "|" D_CMND_WEBBUTTON "|" D_CMND_CORS; + D_CMND_WEBSENSOR "|" D_CMND_WEBBUTTON +#ifdef USE_CORS + "|" D_CMND_CORS +#endif + ; void (* const WebCommand[])(void) PROGMEM = { #ifdef USE_EMULATION @@ -3115,7 +3134,11 @@ void (* const WebCommand[])(void) PROGMEM = { &CmndSendmail, #endif &CmndWebServer, &CmndWebPassword, &CmndWeblog, &CmndWebRefresh, &CmndWebSend, &CmndWebColor, - &CmndWebSensor, &CmndWebButton, &CmndCors }; + &CmndWebSensor, &CmndWebButton +#ifdef USE_CORS + , &CmndCors +#endif + }; /*********************************************************************************************\ * Commands @@ -3260,6 +3283,7 @@ void CmndWebButton(void) } } +#ifdef USE_CORS void CmndCors(void) { if (XdrvMailbox.data_len > 0) { @@ -3267,6 +3291,7 @@ void CmndCors(void) } ResponseCmndChar(SettingsText(SET_CORS)); } +#endif /*********************************************************************************************\ * Interface From 5ff35f99f207ca879be75adcf49042e47a0b238b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 6 Aug 2021 20:34:14 +0200 Subject: [PATCH 099/148] gzip map file --- pio-tools/gzip-firmware.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index 14e030f20..e99973af4 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -6,11 +6,32 @@ import gzip platform = env.PioPlatform() board = env.BoardConfig() mcu = board.get("build.mcu", "esp32") + +OUTPUT_DIR = "build_output{}".format(os.path.sep) + +def map_gzip(source, target, env): + variant = str(target[0]).split(os.path.sep)[2] + + # create string with location and file names based on variant + bin_file = "{}map{}{}.map".format(OUTPUT_DIR, os.path.sep, variant) + gzip_file = "{}map{}{}.map.gz".format(OUTPUT_DIR, os.path.sep, variant) + + # check if new target map files exist and remove if necessary + if os.path.isfile(gzip_file): os.remove(gzip_file) + + # write gzip map file + with open(bin_file,"rb") as fp: + with gzip.open(gzip_file, "wb", compresslevel = 9) as f: + shutil.copyfileobj(fp, f) + + # remove map file + if os.path.isfile(bin_file): os.remove(bin_file) + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) + # gzip only for ESP8266 if env["PIOPLATFORM"] != "espressif32": - OUTPUT_DIR = "build_output{}".format(os.path.sep) - def bin_gzip(source, target, env): variant = str(target[0]).split(os.path.sep)[2] @@ -33,5 +54,5 @@ if env["PIOPLATFORM"] != "espressif32": print("\u001b[31;1m!!! Tasmota firmware size is too big with {} bytes. Max size is 995326 bytes !!! \u001b[0m".format(ORG_FIRMWARE_SIZE)) else: print("Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format((GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE)) - + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) From 2610f0b173940300db4c69956f3265ab8f88354a Mon Sep 17 00:00:00 2001 From: Sillyfrog Date: Sun, 8 Aug 2021 15:51:30 +1000 Subject: [PATCH 100/148] Fix race condition on rapid reconnect --- tasmota/xdrv_58_range_extender.ino | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_58_range_extender.ino b/tasmota/xdrv_58_range_extender.ino index a254ac211..7fb999063 100644 --- a/tasmota/xdrv_58_range_extender.ino +++ b/tasmota/xdrv_58_range_extender.ino @@ -133,6 +133,7 @@ void (*const DrvRgxCommand[])(void) PROGMEM = { typedef struct { uint8_t status = RGX_NOT_CONFIGURED; + uint16_t lastlinkcount = 0; #ifdef USE_WIFI_RANGE_EXTENDER_NAPT bool napt_enabled = false; #endif // USE_WIFI_RANGE_EXTENDER_NAPT @@ -280,6 +281,7 @@ void rngxSetup() WiFi.softAP(SettingsText(SET_RGX_SSID), SettingsText(SET_RGX_PASSWORD)); AddLog(LOG_LEVEL_INFO, PSTR("RGX: WiFi Extender AP Enabled with SSID: %s"), WiFi.softAPSSID().c_str()); RgxSettings.status = RGX_SETUP_NAPT; + RgxSettings.lastlinkcount = Wifi.link_count; } void rngxSetupNAPT(void) @@ -357,7 +359,7 @@ bool Xdrv58(uint8_t function) case FUNC_PRE_INIT: break; case FUNC_EVERY_SECOND: - // AddLog(LOG_LEVEL_INFO, PSTR("RGX: XXX DEBUG INFO: Wifi.status: %d, WiFi.getMode(): %d, RgxSettings.status: %d"), Wifi.status, WiFi.getMode(), RgxSettings.status); + // AddLog(LOG_LEVEL_INFO, PSTR("RGX: XXX DEBUG: Wifi.status: %d, WiFi.getMode(): %d, RgxSettings.status: %d, link_count: %d"), Wifi.status, WiFi.getMode(), RgxSettings.status, Wifi.link_count); if (RgxSettings.status == RGX_NOT_CONFIGURED && Wifi.status == WL_CONNECTED) { // Setup only if WiFi in STA only mode @@ -388,6 +390,12 @@ bool Xdrv58(uint8_t function) AddLog(LOG_LEVEL_INFO, PSTR("RGX: No longer connected, prepare to reconnect WiFi AP...")); RgxSettings.status = RGX_NOT_CONFIGURED; } + else if (RgxSettings.lastlinkcount != Wifi.link_count && WiFi.getMode() != WIFI_AP_STA) + { + // Assume WiFi has reconnected and been reconfigured, prepare to reconnect + AddLog(LOG_LEVEL_INFO, PSTR("RGX: Link count now: %d, WiFi.getMode(): %d, unconfigure..."), Wifi.link_count, WiFi.getMode()); + RgxSettings.status = RGX_NOT_CONFIGURED; + } } break; } From 0ce68b1b6ba1966d33017976e792e1bd23049825 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 13:35:17 +0200 Subject: [PATCH 101/148] Fixes #12837 With the new toolchain used with IDF 4.4 the MAP file is in a different folder and the name has changed (from firmware.map to Tasmota.map). Now name-firmware.py is searching for both- --- pio-tools/name-firmware.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 1c79056de..e82857d1e 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -6,7 +6,7 @@ OUTPUT_DIR = "build_output{}".format(os.path.sep) def bin_map_copy(source, target, env): variant = str(target[0]).split(os.path.sep)[2] - + # check if output directories exist and create if necessary if not os.path.isdir(OUTPUT_DIR): os.mkdir(OUTPUT_DIR) @@ -27,8 +27,13 @@ def bin_map_copy(source, target, env): # copy firmware.bin to firmware/.bin shutil.copy(str(target[0]), bin_file) - # copy firmware.map to map/.map + # move firmware.map to map/.map if os.path.isfile("firmware.map"): shutil.move("firmware.map", map_file) + map_new_loc = str(target[0]).split(os.path.sep)[0] + os.path.sep + str(target[0]).split(os.path.sep)[1] + os.path.sep + str(target[0]).split(os.path.sep)[2] + os.path.sep + "Tasmota.map" + # move Tasmota.map to map/.map + if os.path.isfile(map_new_loc): + shutil.move(map_new_loc, map_file) + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_map_copy]) From d2ac36df184f70a67693c26632bce20604bc60e7 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 14:43:18 +0200 Subject: [PATCH 102/148] Dev bins in repo Tasmota-firmware --- ...uild.yml => Tasmota_build_development.yml} | 47 ++++--------------- 1 file changed, 10 insertions(+), 37 deletions(-) rename .github/workflows/{Tasmota_build.yml => Tasmota_build_development.yml} (92%) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build_development.yml similarity index 92% rename from .github/workflows/Tasmota_build.yml rename to .github/workflows/Tasmota_build_development.yml index fd2c6fe05..73523b124 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1,4 +1,4 @@ -name: Build_firmware +name: Build_firmware_development on: workflow_dispatch: # Manually start a workflow @@ -25,7 +25,6 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: 'development' - force: true tasmota: @@ -1393,13 +1392,6 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v2 - with: - ref: firmware - - name: Display files from branch firmware - run: ls -R - - name: Remove old firmware files - run: rm -rf ./firmware/* - uses: actions/download-artifact@v2 with: name: firmware @@ -1411,8 +1403,6 @@ jobs: run: | mkdir -p ./firmware/tasmota/languages mkdir -p ./firmware/tasmota32/languages - mkdir -p ./firmware/tasmota32/ESP32_needed_files/ - mkdir -p ./firmware/tasmota32/Odroid_go_and_core2_needed_files/ mkdir -p ./firmware/map [ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/ [ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/ @@ -1435,31 +1425,14 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ - [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/ - [ ! -f ./tools/Esptool/Odroid_go_and_core2/*.* ] || mv ./tools/Esptool/Odroid_go_and_core2/*.* ./firmware/tasmota32/Odroid_go_and_core2_needed_files/ - [ ! -f ./FIRMWARE.md ] || mv -f ./FIRMWARE.md ./README.md - - uses: actions/checkout@v2 - with: - ref: release-firmware - path: tmp-folder - - name: Display files from branch release-firmware - run: | - ls -R ./tmp-folder - mkdir -p ./release-firmware/ - cp -rf ./tmp-folder/firmware/* ./release-firmware/ - rm -rf ./tmp-folder - - name: Display files to commit + - name: Display files to transfer run: ls -R ./* - - name: Commit files # transfer the new binaries back into the repository - run: | - git config user.name github-actions - git config user.email github-actions@github.com - git rm -r --cached . - git add -f ./* - git commit -m "Tasmota ESP Binaries http://tasmota.com" - - name: Push changes # push the firmware files to branch firmware - uses: ad-m/github-push-action@master + - name: Push Firmware files to https://github.com/arendst/Tasmota-firmware + uses: dmnemec/copy_file_to_another_repo_action@main + env: + API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: 'firmware' - force: true + source_file: 'firmware' + destination_repo: 'arendst/Tasmota-firmware' + user_email: 'github-actions@github.com' + user_name: 'github-actions' From 8036b5470e6ae000d2508915abe23e0a699a9757 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 14:46:37 +0200 Subject: [PATCH 103/148] Release bins in repo Tasmota-firmware --- .github/workflows/Tasmota_build_master.yml | 30 ++++++++-------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 9ac239ef7..28da2de88 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -24,7 +24,6 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: 'master' - force: true tasmota: @@ -1412,8 +1411,6 @@ jobs: run: | mkdir -p ./firmware/tasmota/languages mkdir -p ./firmware/tasmota32/languages - mkdir -p ./firmware/tasmota32/ESP32_needed_files/ - mkdir -p ./firmware/tasmota32/Odroid_go_and_core2_needed_files/ mkdir -p ./firmware/map [ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/ [ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/ @@ -1436,20 +1433,15 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ - [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/ - [ ! -f ./tools/Esptool/Odroid_go_and_core2/*.* ] || mv ./tools/Esptool/Odroid_go_and_core2/*.* ./firmware/tasmota32/Odroid_go_and_core2_needed_files/ - [ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md - - name: Commit files # transfer the new binaries back into the repository - run: | - git config user.name github-actions - git config user.email github-actions@github.com - git rm -r --cached . - git add ./README.md - git add -f ./firmware/*.* - git commit -m "Tasmota ESP Binaries http://tasmota.com" - - name: Push changes # push the firmware files to branch firmware - uses: ad-m/github-push-action@master + - name: Display files + run: ls -R ./* + - name: Push Firmware files to https://github.com/arendst/Tasmota-firmware + uses: dmnemec/copy_file_to_another_repo_action@main + env: + API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: 'release-firmware' - force: true + source_file: 'firmware' + destination_repo: 'arendst/Tasmota-firmware' + destination_folder: 'release-firmware' + user_email: 'github-actions@github.com' + user_name: 'github-actions' From e67ff0c922bd69a2657a70819cb76723d6db6d39 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 15:02:51 +0200 Subject: [PATCH 104/148] folder release-firmware --- .github/workflows/Tasmota_build_master.yml | 51 +++++++++++----------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 28da2de88..9153051dc 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1409,30 +1409,30 @@ jobs: - name: Move firmware files in sub-folders run: | - mkdir -p ./firmware/tasmota/languages - mkdir -p ./firmware/tasmota32/languages - mkdir -p ./firmware/map - [ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/ - [ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-sensors.* ] || mv ./mv_firmware/firmware/tasmota-sensors.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-minimal.* ] || mv ./mv_firmware/firmware/tasmota-minimal.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-lite.* ] || mv ./mv_firmware/firmware/tasmota-lite.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-ir*.* ] || mv ./mv_firmware/firmware/tasmota-ir*.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-display.* ] || mv ./mv_firmware/firmware/tasmota-display.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-knx.* ] || mv ./mv_firmware/firmware/tasmota-knx.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/firmware/tasmota-zbbridge.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-zigbee.* ] || mv ./mv_firmware/firmware/tasmota-zigbee.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota32.* ] || mv ./mv_firmware/firmware/tasmota32.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32solo1*.* ] || mv ./mv_firmware/firmware/tasmota32solo1*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-ir*.* ] || mv ./mv_firmware/firmware/tasmota32-ir*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/ - [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ + mkdir -p ./release-firmware/tasmota/languages + mkdir -p ./release-firmware/tasmota32/languages + mkdir -p ./release-firmware/map + [ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./release-firmware/map/ + [ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-sensors.* ] || mv ./mv_firmware/firmware/tasmota-sensors.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-minimal.* ] || mv ./mv_firmware/firmware/tasmota-minimal.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-lite.* ] || mv ./mv_firmware/firmware/tasmota-lite.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-ir*.* ] || mv ./mv_firmware/firmware/tasmota-ir*.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-display.* ] || mv ./mv_firmware/firmware/tasmota-display.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-knx.* ] || mv ./mv_firmware/firmware/tasmota-knx.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/firmware/tasmota-zbbridge.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota-zigbee.* ] || mv ./mv_firmware/firmware/tasmota-zigbee.* ./release-firmware/tasmota/ + [ ! -f ./mv_firmware/firmware/tasmota32.* ] || mv ./mv_firmware/firmware/tasmota32.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32solo1*.* ] || mv ./mv_firmware/firmware/tasmota32solo1*.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-ir*.* ] || mv ./mv_firmware/firmware/tasmota32-ir*.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./release-firmware/tasmota32/languages/ + [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./release-firmware/tasmota/languages/ - name: Display files run: ls -R ./* - name: Push Firmware files to https://github.com/arendst/Tasmota-firmware @@ -1440,8 +1440,7 @@ jobs: env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - source_file: 'firmware' + source_file: 'release-firmware' destination_repo: 'arendst/Tasmota-firmware' - destination_folder: 'release-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' From 621a0eff116308dd57f3c9e86a7612a2c1f74a6e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 8 Aug 2021 15:22:44 +0200 Subject: [PATCH 105/148] Relax NTP poll if no ntpserver can be resolved by DNS (#12838) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/support_wifi.ino | 20 ++++++++++++++++---- tasmota/xdrv_02_9_mqtt.ino | 2 ++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eed2dcfc..e39a12d6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. ### Changed - Make Sonoff L1 MusicSync persistent (#12008) +- Relax NTP poll if no ntpserver can be resolved by DNS ### Fixed - Neopool communication error (#12813) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 23f8384d4..96ddcf5a7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -129,6 +129,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Extended supported sensor driver range to 128 - Disable PSRAM on unsupported hardware - ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support +- Relax NTP poll if no ntpserver can be resolved by DNS - Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008) - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index 4119b0f0e..0e16338d8 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -715,6 +715,7 @@ void wifiKeepAlive(void) { void WifiPollNtp() { static uint8_t ntp_sync_minute = 0; + static uint32_t ntp_run_time = 0; if (TasmotaGlobal.global_state.network_down || Rtc.user_time_entry) { return; } @@ -723,13 +724,20 @@ void WifiPollNtp() { ntp_sync_minute = 1; // If sync prepare for a new cycle } // First try ASAP to sync. If fails try once every 60 seconds based on chip id - uint8_t offset = (TasmotaGlobal.uptime < 30) ? RtcTime.second : (((ESP_getChipId() & 0xF) * 3) + 3) ; + uint8_t offset = (TasmotaGlobal.uptime < 30) ? RtcTime.second + ntp_run_time : (((ESP_getChipId() & 0xF) * 3) + 3) ; + if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || // Never synced (ntp_sync_minute == uptime_minute))) || // Re-sync every hour TasmotaGlobal.ntp_force_sync ) ) { // Forced sync TasmotaGlobal.ntp_force_sync = false; + + ntp_run_time = millis(); uint32_t ntp_time = WifiGetNtp(); + ntp_run_time = (millis() - ntp_run_time) / 1000; +// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Runtime %d"), ntp_run_time); + if (ntp_run_time < 5) { ntp_run_time = 0; } // DNS timeout is around 10s + if (ntp_time > START_VALID_TIME) { Rtc.utc_time = ntp_time; ntp_sync_minute = 60; // Sync so block further requests @@ -758,10 +766,14 @@ uint32_t WifiGetNtp(void) { ntp_server = fallback_ntp_server; } if (strlen(ntp_server)) { - resolved_ip = (WiFi.hostByName(ntp_server, time_server_ip) == 1); - if (255 == time_server_ip[0]) { resolved_ip = false; } + resolved_ip = (WiFi.hostByName(ntp_server, time_server_ip) == 1); // DNS timeout set to (ESP8266) 10s / (ESP32) 14s + if ((255 == time_server_ip[0]) || // No valid name resolved (255.255.255.255) + ((255 == time_server_ip[1]) && (255 == time_server_ip[2]) && (255 == time_server_ip[3]))) { // No valid name resolved (x.255.255.255) + resolved_ip = false; + } yield(); if (resolved_ip) { break; } +// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Unable to resolve '%s'"), ntp_server); } ntp_server_id++; } @@ -770,7 +782,7 @@ uint32_t WifiGetNtp(void) { return 0; } -// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Name %s, IP %_I"), ntp_server, (uint32_t)time_server_ip); +// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Host %s IP %_I"), ntp_server, (uint32_t)time_server_ip); WiFiUDP udp; diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino index bbc37b29e..bb8cdf8b8 100644 --- a/tasmota/xdrv_02_9_mqtt.ino +++ b/tasmota/xdrv_02_9_mqtt.ino @@ -858,6 +858,8 @@ void MqttDisconnected(int state) { } MqttClient.disconnect(); + // Check if this solves intermittent MQTT re-connection failures when broker is restarted + EspClient.stop(); AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), SettingsText(SET_MQTT_HOST), Settings->mqtt_port, state, Mqtt.retry_counter); TasmotaGlobal.rules_flag.mqtt_disconnected = 1; From 2e9dfdc64b219630903f5fc6c849b03323c4b891 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 8 Aug 2021 16:08:08 +0200 Subject: [PATCH 106/148] Add some debug info to NTP --- tasmota/support_wifi.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index 0e16338d8..ff5f48d51 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -732,6 +732,7 @@ void WifiPollNtp() { TasmotaGlobal.ntp_force_sync = false; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("NTP: Synch time...")); ntp_run_time = millis(); uint32_t ntp_time = WifiGetNtp(); ntp_run_time = (millis() - ntp_run_time) / 1000; @@ -742,6 +743,7 @@ void WifiPollNtp() { Rtc.utc_time = ntp_time; ntp_sync_minute = 60; // Sync so block further requests RtcSync(); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("NTP: Synched")); } else { ntp_sync_minute++; // Try again in next minute } @@ -778,7 +780,7 @@ uint32_t WifiGetNtp(void) { ntp_server_id++; } if (!resolved_ip) { -// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: No server found")); + AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Unable to resolve IP address")); return 0; } From f2f137e31985c56d79bea0a45bd393c359e74640 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 8 Aug 2021 16:20:49 +0200 Subject: [PATCH 107/148] Move firmwares to own repository --- README.md | 2 +- RELEASENOTES.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3f8e113d7..e76dde344 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ See [RELEASENOTES.md](https://github.com/arendst/Tasmota/blob/master/RELEASENOTE Firmware binaries can be downloaded from http://ota.tasmota.com/tasmota/release/ or http://ota.tasmota.com/tasmota32/release/ for ESP32 binaries. -Easy initial installation of Tasmota can be performed using the [Tasmota WebInstaller](https://arendst.github.io/Tasmota/). +Easy initial installation of Tasmota can be performed using the [Tasmota WebInstaller](https://arendst.github.io/Tasmota-firmware/). ## Development diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 96ddcf5a7..bd22229aa 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -40,7 +40,7 @@ For initial configuration this release supports Webserver based **WifiManager** ## Initial installation -Easy initial installation of Tasmota can be performed using the [Tasmota WebInstaller](https://arendst.github.io/Tasmota/). +Easy initial installation of Tasmota can be performed using the [Tasmota WebInstaller](https://arendst.github.io/Tasmota-firmware/). ## Provided Binary Downloads @@ -100,7 +100,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v9.5.0.5 ### Added -- Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota/) +- Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota-firmware/) - Command ``SetOption127 1`` to force Wi-Fi in no-sleep mode even if ``Sleep 0`` is not enabled - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` [#12813](https://github.com/arendst/Tasmota/issues/12813) From d5ee5a1b6a9f78bd8d48ae4896759e5e98f5d3bb Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 8 Aug 2021 16:28:11 +0200 Subject: [PATCH 108/148] Update firmware links --- FIRMWARE.md | 4 ++-- RELEASENOTES.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FIRMWARE.md b/FIRMWARE.md index cc03ba3a8..31f47445c 100644 --- a/FIRMWARE.md +++ b/FIRMWARE.md @@ -27,7 +27,7 @@ See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/tasmota/C Unless your Tasmota powered device exhibits a problem or you need to make use of a feature that is not available in the Tasmota version currently installed on your device, leave your device alone - it works so don't make unnecessary changes! If the release version (i.e., the master branch) exhibits unexpected behaviour for your device and configuration, you should upgrade to the latest development version instead to see if your problem is resolved as some bugs in previous releases or development builds may already have been resolved. -If new commits have been merged and they compile successfuly, new binary files for every variant will be placed here https://github.com/arendst/Tasmota/tree/firmware/firmware (this URL address can NOT be used for OTA updates) It is important to note that these binaries are based on the current development codebase. These commits are tested as much as is possible and are typically quite stable. However, it is infeasible to test on the hundreds of different types of devices with all the available configuration options permitted. +If new commits have been merged and they compile successfuly, new binary files for every variant will be placed here https://github.com/arendst/Tasmota-firmware/tree/firmware/firmware (this URL address can NOT be used for OTA updates) It is important to note that these binaries are based on the current development codebase. These commits are tested as much as is possible and are typically quite stable. However, it is infeasible to test on the hundreds of different types of devices with all the available configuration options permitted. Note that there is a chance, as with any upgrade, that the device may not function as expected. You must always account for the possibility that you may need to flash the device via the serial programming interface if the OTA upgrade fails. Even with the master release, you should always attempt to test the device or a similar prototype before upgrading a device which is in production or is hard to reach. And, as always, make a backup of the device configuration before beginning any firmware update. @@ -40,5 +40,5 @@ If your device connects to mains electricity (AC power) there is danger of elect We don't take any responsibility nor liability for using this software nor for the installation or any tips, advice, videos, etc. given by any member of this site or any related site. ## Quick Install -Download one of the binaries https://github.com/arendst/Tasmota/tree/firmware/firmware and flash it to your hardware [using our installation guide](https://tasmota.github.io/docs/Getting-Started). +Download one of the binaries https://github.com/arendst/Tasmota-firmware/tree/firmware/firmware and flash it to your hardware [using our installation guide](https://tasmota.github.io/docs/Getting-Started). diff --git a/RELEASENOTES.md b/RELEASENOTES.md index bd22229aa..0f1802869 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -60,7 +60,7 @@ The following binary downloads have been compiled with ESP8266/Arduino library c Above binaries are also available as gzipped version allowing faster uploads. Latest released binaries can be downloaded from -- https://github.com/arendst/Tasmota/tree/release-firmware +- https://github.com/arendst/Tasmota-firmware/tree/release-firmware - http://ota.tasmota.com/tasmota/release Historical binaries can be downloaded from @@ -84,7 +84,7 @@ The following binary downloads have been compiled with ESP32/Arduino library cor - **tasmota32-core2.bin** = The Core2 version is specifically tailored to M5Stack Core2 hardware for 8M+ flash. Latest released binaries can be downloaded from -- https://github.com/arendst/Tasmota/tree/release-firmware +- https://github.com/arendst/Tasmota-firmware/tree/release-firmware - http://ota.tasmota.com/tasmota32/release Historical binaries can be downloaded from From f7a52d7c649af90dc4abf94abc2d78d03f78ee9b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 16:35:48 +0200 Subject: [PATCH 109/148] Corrected link to release firmware --- RELEASENOTES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0f1802869..97340bfb3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -60,7 +60,7 @@ The following binary downloads have been compiled with ESP8266/Arduino library c Above binaries are also available as gzipped version allowing faster uploads. Latest released binaries can be downloaded from -- https://github.com/arendst/Tasmota-firmware/tree/release-firmware +- https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware - http://ota.tasmota.com/tasmota/release Historical binaries can be downloaded from @@ -84,7 +84,7 @@ The following binary downloads have been compiled with ESP32/Arduino library cor - **tasmota32-core2.bin** = The Core2 version is specifically tailored to M5Stack Core2 hardware for 8M+ flash. Latest released binaries can be downloaded from -- https://github.com/arendst/Tasmota-firmware/tree/release-firmware +- https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware - http://ota.tasmota.com/tasmota32/release Historical binaries can be downloaded from From 957c2e23ff98a4f4b99155f24a03b24c5324de01 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 16:40:19 +0200 Subject: [PATCH 110/148] link correct to firmware --- FIRMWARE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FIRMWARE.md b/FIRMWARE.md index 31f47445c..7262450aa 100644 --- a/FIRMWARE.md +++ b/FIRMWARE.md @@ -27,7 +27,7 @@ See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/tasmota/C Unless your Tasmota powered device exhibits a problem or you need to make use of a feature that is not available in the Tasmota version currently installed on your device, leave your device alone - it works so don't make unnecessary changes! If the release version (i.e., the master branch) exhibits unexpected behaviour for your device and configuration, you should upgrade to the latest development version instead to see if your problem is resolved as some bugs in previous releases or development builds may already have been resolved. -If new commits have been merged and they compile successfuly, new binary files for every variant will be placed here https://github.com/arendst/Tasmota-firmware/tree/firmware/firmware (this URL address can NOT be used for OTA updates) It is important to note that these binaries are based on the current development codebase. These commits are tested as much as is possible and are typically quite stable. However, it is infeasible to test on the hundreds of different types of devices with all the available configuration options permitted. +If new commits have been merged and they compile successfuly, new binary files for every variant will be placed here https://github.com/arendst/Tasmota-firmware/tree/main/firmware (this URL address can NOT be used for OTA updates) It is important to note that these binaries are based on the current development codebase. These commits are tested as much as is possible and are typically quite stable. However, it is infeasible to test on the hundreds of different types of devices with all the available configuration options permitted. Note that there is a chance, as with any upgrade, that the device may not function as expected. You must always account for the possibility that you may need to flash the device via the serial programming interface if the OTA upgrade fails. Even with the master release, you should always attempt to test the device or a similar prototype before upgrading a device which is in production or is hard to reach. And, as always, make a backup of the device configuration before beginning any firmware update. @@ -40,5 +40,5 @@ If your device connects to mains electricity (AC power) there is danger of elect We don't take any responsibility nor liability for using this software nor for the installation or any tips, advice, videos, etc. given by any member of this site or any related site. ## Quick Install -Download one of the binaries https://github.com/arendst/Tasmota-firmware/tree/firmware/firmware and flash it to your hardware [using our installation guide](https://tasmota.github.io/docs/Getting-Started). +Download one of the binaries https://github.com/arendst/Tasmota-firmware/tree/main/firmware and flash it to your hardware [using our installation guide](https://tasmota.github.io/docs/Getting-Started). From c0b528439b09643474ddcfffc54d24ae16f1f5c5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 8 Aug 2021 16:51:43 +0200 Subject: [PATCH 111/148] Trigger rebuild --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e76dde344..f60d44bed 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ If you're looking for support on **Tasmota** there are some options available: ### Documentation -* [Documentation Site](https://tasmota.github.io/docs): For information on how to flash Tasmota, configure, use and expand it +* [Documentation Site](https://tasmota.github.io/docs): For information on how to flash Tasmota, configure, use and expand it * [FAQ and Troubleshooting](https://tasmota.github.io/docs/FAQ/): For information on common problems and solutions. * [Commands Information](https://tasmota.github.io/docs/Commands): For information on all the commands supported by Tasmota. From 4f3af0de55b872c630ab343ac858247f38a514db Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 8 Aug 2021 17:13:04 +0200 Subject: [PATCH 112/148] Update changelog --- CHANGELOG.md | 1 + README.md | 2 +- RELEASENOTES.md | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e39a12d6d..7cff28b6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Changed - Make Sonoff L1 MusicSync persistent (#12008) - Relax NTP poll if no ntpserver can be resolved by DNS +- Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware ### Fixed - Neopool communication error (#12813) diff --git a/README.md b/README.md index f60d44bed..e76dde344 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ If you're looking for support on **Tasmota** there are some options available: ### Documentation -* [Documentation Site](https://tasmota.github.io/docs): For information on how to flash Tasmota, configure, use and expand it +* [Documentation Site](https://tasmota.github.io/docs): For information on how to flash Tasmota, configure, use and expand it * [FAQ and Troubleshooting](https://tasmota.github.io/docs/FAQ/): For information on common problems and solutions. * [Commands Information](https://tasmota.github.io/docs/Commands): For information on all the commands supported by Tasmota. diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 97340bfb3..c9868e41d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -130,6 +130,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Disable PSRAM on unsupported hardware - ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support - Relax NTP poll if no ntpserver can be resolved by DNS +- Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware - Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008) - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) From 990ae38666365193d323effe02c423f8c26ef5a3 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Sun, 8 Aug 2021 16:57:54 +0200 Subject: [PATCH 113/148] prometheus: Add prefix on all metrics All Prometheus metrics should have an application prefix (https://prometheus.io/docs/practices/naming/#metric-names). Historically a few produced by Tasmota didn't. With this change the function writing metrics always outputs the prefix. Signed-off-by: Michael Hanselmann --- tasmota/xsns_75_prometheus.ino | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index 6d55e9057..921a529a8 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -78,16 +78,15 @@ String FormatMetricName(const char *metric) { } const uint8_t - kPromMetricNoPrefix = _BV(1), - kPromMetricGauge = _BV(2), - kPromMetricCounter = _BV(3), + kPromMetricGauge = _BV(0), + kPromMetricCounter = _BV(1), kPromMetricTypeMask = kPromMetricGauge | kPromMetricCounter; // Format and send a Prometheus metric to the client. Use flags to configure // the type. Labels must be supplied in tuples of two character array pointers // and terminated by nullptr. void WritePromMetric(const char *name, uint8_t flags, const char *value, va_list labels) { - PGM_P const prefix = (flags & kPromMetricNoPrefix) ? PSTR("") : PSTR("tasmota_"); + PGM_P const prefix = PSTR("tasmota_"); PGM_P tmp; String lval; @@ -258,29 +257,27 @@ void HandleMetrics(void) { #endif #ifdef USE_ENERGY_SENSOR - // TODO: Don't disable prefix on energy metrics WritePromMetricDec(PSTR("energy_voltage_volts"), - kPromMetricGauge | kPromMetricNoPrefix, + kPromMetricGauge, Energy.voltage[0], Settings->flag2.voltage_resolution, nullptr); WritePromMetricDec(PSTR("energy_current_amperes"), - kPromMetricGauge | kPromMetricNoPrefix, + kPromMetricGauge, Energy.current[0], Settings->flag2.current_resolution, nullptr); WritePromMetricDec(PSTR("energy_power_active_watts"), - kPromMetricGauge | kPromMetricNoPrefix, + kPromMetricGauge, Energy.active_power[0], Settings->flag2.wattage_resolution, nullptr); WritePromMetricDec(PSTR("energy_power_kilowatts_daily"), - kPromMetricCounter | kPromMetricNoPrefix, + kPromMetricCounter, Energy.daily, Settings->flag2.energy_resolution, nullptr); WritePromMetricDec(PSTR("energy_power_kilowatts_total"), - kPromMetricCounter | kPromMetricNoPrefix, + kPromMetricCounter, Energy.total, Settings->flag2.energy_resolution, nullptr); #endif for (uint32_t device = 0; device < TasmotaGlobal.devices_present; device++) { power_t mask = 1 << device; - // TODO: Don't disable prefix snprintf_P(namebuf, sizeof(namebuf), PSTR("relay%d_state"), device + 1); - WritePromMetricInt32(namebuf, kPromMetricGauge | kPromMetricNoPrefix, + WritePromMetricInt32(namebuf, kPromMetricGauge, (TasmotaGlobal.power & mask), nullptr); } From 7afc19473d4f27ea7e1666edbdc7cda581626615 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Sun, 8 Aug 2021 17:06:29 +0200 Subject: [PATCH 114/148] Describe recent changes to Prometheus metrics in changelog Signed-off-by: Michael Hanselmann --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cff28b6d..8426f33ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ All notable changes to this project will be documented in this file. - Make Sonoff L1 MusicSync persistent (#12008) - Relax NTP poll if no ntpserver can be resolved by DNS - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware +- Prometheus: All metrics are prefixed with ``tasmota_``; memory metrics have + been cleaned up to work consistently between ESP8266 and ESP32; the device + name is reported as an info metric ### Fixed - Neopool communication error (#12813) From d2892e3aad1560a41c18587efadce78accfaa442 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 17:53:53 +0200 Subject: [PATCH 115/148] repo jason2866 --- .github/workflows/Tasmota_build_development.yml | 2 +- .github/workflows/Tasmota_build_master.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index 73523b124..9f808ae38 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1433,6 +1433,6 @@ jobs: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: source_file: 'firmware' - destination_repo: 'arendst/Tasmota-firmware' + destination_repo: 'Jason2866/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 9153051dc..66ba17809 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1441,6 +1441,6 @@ jobs: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: source_file: 'release-firmware' - destination_repo: 'arendst/Tasmota-firmware' + destination_repo: 'Jason2866/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' From 26b9dfa2f9c1db42790d78a233725b63327769f9 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 18:43:18 +0200 Subject: [PATCH 116/148] oops --- .github/workflows/Tasmota_build_development.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index 9f808ae38..73523b124 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1433,6 +1433,6 @@ jobs: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: source_file: 'firmware' - destination_repo: 'Jason2866/Tasmota-firmware' + destination_repo: 'arendst/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' From faa801b4b1c37fec020fab8c6a9b0cb2577b223b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 18:43:59 +0200 Subject: [PATCH 117/148] oops --- .github/workflows/Tasmota_build_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 66ba17809..9153051dc 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1441,6 +1441,6 @@ jobs: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: source_file: 'release-firmware' - destination_repo: 'Jason2866/Tasmota-firmware' + destination_repo: 'arendst/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' From 7b98582d40e906458b6e3cdab18d983d42918791 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 8 Aug 2021 19:04:54 +0200 Subject: [PATCH 118/148] rm auto update for forked Tasmota --- .../workflows/Tasmota_build_development.yml | 86 ------------------- .github/workflows/Tasmota_build_master.yml | 86 ------------------- 2 files changed, 172 deletions(-) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index 73523b124..dc3b1fe44 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -8,27 +8,8 @@ on: - '.github/**' # Ignore changes towards the .github directory jobs: - tasmota_pull: - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v2 - - name: Use latest Tasmota development - run: | - git config --local user.name "Platformio BUILD" - git config user.email github-actions@github.com - git switch -c work - git remote add -f Tasmota "https://github.com/arendst/Tasmota.git" --track development - git merge Tasmota/development --allow-unrelated-histories - - name: Push Tasmota # Push updates of latest Tasmota development to repo - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: 'development' - tasmota: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -48,7 +29,6 @@ jobs: tasmota-minimal: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -68,7 +48,6 @@ jobs: tasmota-lite: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -88,7 +67,6 @@ jobs: tasmota-knx: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -108,7 +86,6 @@ jobs: tasmota-sensors: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -128,7 +105,6 @@ jobs: tasmota-display: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -148,7 +124,6 @@ jobs: tasmota-ir: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -168,7 +143,6 @@ jobs: tasmota-zbbridge: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -188,7 +162,6 @@ jobs: tasmota-zigbee: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -208,7 +181,6 @@ jobs: tasmota-AF: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -228,7 +200,6 @@ jobs: tasmota-BG: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -248,7 +219,6 @@ jobs: tasmota-BR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -268,7 +238,6 @@ jobs: tasmota-CN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -288,7 +257,6 @@ jobs: tasmota-CZ: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -308,7 +276,6 @@ jobs: tasmota-DE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -328,7 +295,6 @@ jobs: tasmota-ES: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -348,7 +314,6 @@ jobs: tasmota-FR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -368,7 +333,6 @@ jobs: tasmota-FY: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -388,7 +352,6 @@ jobs: tasmota-GR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -408,7 +371,6 @@ jobs: tasmota-HE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -428,7 +390,6 @@ jobs: tasmota-HU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -448,7 +409,6 @@ jobs: tasmota-IT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -468,7 +428,6 @@ jobs: tasmota-KO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -488,7 +447,6 @@ jobs: tasmota-NL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -508,7 +466,6 @@ jobs: tasmota-PL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -528,7 +485,6 @@ jobs: tasmota-PT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -548,7 +504,6 @@ jobs: tasmota-RO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -568,7 +523,6 @@ jobs: tasmota-RU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -588,7 +542,6 @@ jobs: tasmota-SE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -608,7 +561,6 @@ jobs: tasmota-SK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -628,7 +580,6 @@ jobs: tasmota-TR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -648,7 +599,6 @@ jobs: tasmota-TW: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -668,7 +618,6 @@ jobs: tasmota-UK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -688,7 +637,6 @@ jobs: tasmota-VN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -708,7 +656,6 @@ jobs: tasmota32: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -728,7 +675,6 @@ jobs: tasmota32solo1: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -748,7 +694,6 @@ jobs: tasmota32-webcam: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -768,7 +713,6 @@ jobs: tasmota32-odroidgo: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -788,7 +732,6 @@ jobs: tasmota32-core2: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -808,7 +751,6 @@ jobs: tasmota32-bluetooth: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -828,7 +770,6 @@ jobs: tasmota32-display: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -848,7 +789,6 @@ jobs: tasmota32-lvgl: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -868,7 +808,6 @@ jobs: tasmota32-ir: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -888,7 +827,6 @@ jobs: tasmota32-AF: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -908,7 +846,6 @@ jobs: tasmota32-BG: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -928,7 +865,6 @@ jobs: tasmota32-BR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -948,7 +884,6 @@ jobs: tasmota32-CN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -968,7 +903,6 @@ jobs: tasmota32-CZ: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -988,7 +922,6 @@ jobs: tasmota32-DE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1008,7 +941,6 @@ jobs: tasmota32-ES: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1028,7 +960,6 @@ jobs: tasmota32-FR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1048,7 +979,6 @@ jobs: tasmota32-FY: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1068,7 +998,6 @@ jobs: tasmota32-GR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1088,7 +1017,6 @@ jobs: tasmota32-HE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1108,7 +1036,6 @@ jobs: tasmota32-HU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1128,7 +1055,6 @@ jobs: tasmota32-IT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1148,7 +1074,6 @@ jobs: tasmota32-KO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1168,7 +1093,6 @@ jobs: tasmota32-NL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1188,7 +1112,6 @@ jobs: tasmota32-PL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1208,7 +1131,6 @@ jobs: tasmota32-PT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1228,7 +1150,6 @@ jobs: tasmota32-RO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1248,7 +1169,6 @@ jobs: tasmota32-RU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1268,7 +1188,6 @@ jobs: tasmota32-SE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1288,7 +1207,6 @@ jobs: tasmota32-SK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1308,7 +1226,6 @@ jobs: tasmota32-TR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1328,7 +1245,6 @@ jobs: tasmota32-TW: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1348,7 +1264,6 @@ jobs: tasmota32-UK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1368,7 +1283,6 @@ jobs: tasmota32-VN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 9153051dc..5bc79c06d 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -7,27 +7,8 @@ on: - '.github/**' # Ignore changes towards the .github directory jobs: - tasmota_pull: - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v2 - - name: Use Tasmota master - run: | - git config --local user.name "Platformio BUILD" - git config user.email github-actions@github.com - git switch -c work - git remote add -f Tasmota "https://github.com/arendst/Tasmota.git" --track master - git merge Tasmota/master --allow-unrelated-histories - - name: Push Tasmota # Push updates of latest Tasmota master to repo - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: 'master' - tasmota: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -47,7 +28,6 @@ jobs: tasmota-minimal: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -67,7 +47,6 @@ jobs: tasmota-lite: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -87,7 +66,6 @@ jobs: tasmota-knx: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -107,7 +85,6 @@ jobs: tasmota-sensors: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -127,7 +104,6 @@ jobs: tasmota-display: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -147,7 +123,6 @@ jobs: tasmota-ir: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -167,7 +142,6 @@ jobs: tasmota-zbbridge: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -187,7 +161,6 @@ jobs: tasmota-zigbee: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -207,7 +180,6 @@ jobs: tasmota-AF: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -227,7 +199,6 @@ jobs: tasmota-BG: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -247,7 +218,6 @@ jobs: tasmota-BR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -267,7 +237,6 @@ jobs: tasmota-CN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -287,7 +256,6 @@ jobs: tasmota-CZ: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -307,7 +275,6 @@ jobs: tasmota-DE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -327,7 +294,6 @@ jobs: tasmota-ES: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -347,7 +313,6 @@ jobs: tasmota-FR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -367,7 +332,6 @@ jobs: tasmota-FY: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -387,7 +351,6 @@ jobs: tasmota-GR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -407,7 +370,6 @@ jobs: tasmota-HE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -427,7 +389,6 @@ jobs: tasmota-HU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -447,7 +408,6 @@ jobs: tasmota-IT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -467,7 +427,6 @@ jobs: tasmota-KO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -487,7 +446,6 @@ jobs: tasmota-NL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -507,7 +465,6 @@ jobs: tasmota-PL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -527,7 +484,6 @@ jobs: tasmota-PT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -547,7 +503,6 @@ jobs: tasmota-RO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -567,7 +522,6 @@ jobs: tasmota-RU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -587,7 +541,6 @@ jobs: tasmota-SE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -607,7 +560,6 @@ jobs: tasmota-SK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -627,7 +579,6 @@ jobs: tasmota-TR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -647,7 +598,6 @@ jobs: tasmota-TW: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -667,7 +617,6 @@ jobs: tasmota-UK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -687,7 +636,6 @@ jobs: tasmota-VN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -707,7 +655,6 @@ jobs: tasmota32: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -727,7 +674,6 @@ jobs: tasmota32solo1: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -747,7 +693,6 @@ jobs: tasmota32-webcam: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -767,7 +712,6 @@ jobs: tasmota32-odroidgo: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -787,7 +731,6 @@ jobs: tasmota32-core2: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -807,7 +750,6 @@ jobs: tasmota32-bluetooth: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -827,7 +769,6 @@ jobs: tasmota32-display: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -847,7 +788,6 @@ jobs: tasmota32-lvgl: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -867,7 +807,6 @@ jobs: tasmota32-ir: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -887,7 +826,6 @@ jobs: tasmota32-AF: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -907,7 +845,6 @@ jobs: tasmota32-BG: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -927,7 +864,6 @@ jobs: tasmota32-BR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -947,7 +883,6 @@ jobs: tasmota32-CN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -967,7 +902,6 @@ jobs: tasmota32-CZ: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -987,7 +921,6 @@ jobs: tasmota32-DE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1007,7 +940,6 @@ jobs: tasmota32-ES: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1027,7 +959,6 @@ jobs: tasmota32-FR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1047,7 +978,6 @@ jobs: tasmota32-FY: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1067,7 +997,6 @@ jobs: tasmota32-GR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1087,7 +1016,6 @@ jobs: tasmota32-HE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1107,7 +1035,6 @@ jobs: tasmota32-HU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1127,7 +1054,6 @@ jobs: tasmota32-IT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1147,7 +1073,6 @@ jobs: tasmota32-KO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1167,7 +1092,6 @@ jobs: tasmota32-NL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1187,7 +1111,6 @@ jobs: tasmota32-PL: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1207,7 +1130,6 @@ jobs: tasmota32-PT: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1227,7 +1149,6 @@ jobs: tasmota32-RO: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1247,7 +1168,6 @@ jobs: tasmota32-RU: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1267,7 +1187,6 @@ jobs: tasmota32-SE: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1287,7 +1206,6 @@ jobs: tasmota32-SK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1307,7 +1225,6 @@ jobs: tasmota32-TR: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1327,7 +1244,6 @@ jobs: tasmota32-TW: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1347,7 +1263,6 @@ jobs: tasmota32-UK: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: @@ -1367,7 +1282,6 @@ jobs: tasmota32-VN: - needs: tasmota_pull runs-on: ubuntu-latest continue-on-error: true steps: From 0c30aeeebc2188c389bee1b2501370428c45925b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 9 Aug 2021 10:58:37 +0200 Subject: [PATCH 119/148] Fix compile erro by lack of map file (#12837) --- pio-tools/gzip-firmware.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index e99973af4..fac23cf2d 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -14,18 +14,20 @@ def map_gzip(source, target, env): # create string with location and file names based on variant bin_file = "{}map{}{}.map".format(OUTPUT_DIR, os.path.sep, variant) - gzip_file = "{}map{}{}.map.gz".format(OUTPUT_DIR, os.path.sep, variant) - # check if new target map files exist and remove if necessary - if os.path.isfile(gzip_file): os.remove(gzip_file) + if os.path.isfile(bin_file): + gzip_file = "{}map{}{}.map.gz".format(OUTPUT_DIR, os.path.sep, variant) - # write gzip map file - with open(bin_file,"rb") as fp: - with gzip.open(gzip_file, "wb", compresslevel = 9) as f: - shutil.copyfileobj(fp, f) + # check if new target map files exist and remove if necessary + if os.path.isfile(gzip_file): os.remove(gzip_file) - # remove map file - if os.path.isfile(bin_file): os.remove(bin_file) + # write gzip map file + with open(bin_file,"rb") as fp: + with gzip.open(gzip_file, "wb", compresslevel = 9) as f: + shutil.copyfileobj(fp, f) + + # remove map file + if os.path.isfile(bin_file): os.remove(bin_file) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) From 633fd4fbd5b79bbf122a689e88f8736eb5304b49 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 9 Aug 2021 11:55:12 +0200 Subject: [PATCH 120/148] Update changelog --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cff28b6d..57c15c13a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - Make Sonoff L1 MusicSync persistent (#12008) - Relax NTP poll if no ntpserver can be resolved by DNS - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware +- Default disable CORS for enhanced security and provide user compile option ``#define USE_CORS`` (#12827) ### Fixed - Neopool communication error (#12813) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c9868e41d..5ad7a6e5b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -137,6 +137,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Allow buttons to work in AP normal mode [#12518](https://github.com/arendst/Tasmota/issues/12518) - Enable Ping and rule features for any device compiled with more than 1M flash size [#12539](https://github.com/arendst/Tasmota/issues/12539) - Replace spaces by hyphens in final hostname [#12710](https://github.com/arendst/Tasmota/issues/12710) +- Default disable CORS for enhanced security and provide user compile option ``#define USE_CORS`` [#12827](https://github.com/arendst/Tasmota/issues/12827) ### Fixed - ESP32 core v2.0.0 setting hostname From e6cb80def3336ad246de3ff1235d69409ccec7d8 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 9 Aug 2021 12:08:20 +0200 Subject: [PATCH 121/148] Update changelog --- CHANGELOG.md | 7 ++++--- RELEASENOTES.md | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89c3afe39..30541c867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,14 @@ All notable changes to this project will be documented in this file. - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin ### Changed +- NeoPixelBus library from v2.6.3 to v2.6.7 - Make Sonoff L1 MusicSync persistent (#12008) - Relax NTP poll if no ntpserver can be resolved by DNS - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware -- Prometheus: All metrics are prefixed with ``tasmota_`` - memory metrics have been cleaned up to work consistently between ESP8266 and ESP32 - the device name is reported as an info metric - Default disable CORS for enhanced security and provide user compile option ``#define USE_CORS`` (#12827) +- Prometheus: All metrics are prefixed with ``tasmota_`` (#12842) + Memory metrics have been cleaned up to work consistently between ESP8266 and ESP32 + The device name is reported as an info metric ### Fixed - Neopool communication error (#12813) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5ad7a6e5b..ba856058b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -119,8 +119,10 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) ### Changed +- Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware - ESP32 core library from v1.0.6 to v1.0.7.3 - IRremoteESP8266 library from v2.7.18 to v2.7.19 +- NeoPixelBus library from v2.6.3 to v2.6.7 - Message ``Upload buffer miscompare`` into ``Not enough space`` - ESP32 Ethernet Phy Type information to IDF v3+ - Speed up initial GUI console refresh @@ -130,7 +132,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Disable PSRAM on unsupported hardware - ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support - Relax NTP poll if no ntpserver can be resolved by DNS -- Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware - Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008) - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) @@ -138,6 +139,9 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Enable Ping and rule features for any device compiled with more than 1M flash size [#12539](https://github.com/arendst/Tasmota/issues/12539) - Replace spaces by hyphens in final hostname [#12710](https://github.com/arendst/Tasmota/issues/12710) - Default disable CORS for enhanced security and provide user compile option ``#define USE_CORS`` [#12827](https://github.com/arendst/Tasmota/issues/12827) +- Prometheus: All metrics are prefixed with ``tasmota_`` [#12842](https://github.com/arendst/Tasmota/issues/12842) + Memory metrics have been cleaned up to work consistently between ESP8266 and ESP32 + The device name is reported as an info metric ### Fixed - ESP32 core v2.0.0 setting hostname From e97f1eb8a44544f1d338da0ad30fa429e867b54c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 9 Aug 2021 13:04:12 +0200 Subject: [PATCH 122/148] No build by changes of *.md files --- .github/workflows/Tasmota_build_development.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index dc3b1fe44..f36fec5a8 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -6,6 +6,7 @@ on: branches: development paths-ignore: - '.github/**' # Ignore changes towards the .github directory + - '**.md' # Do no build if *.md files changes jobs: From 18442c7e57ddd53a5485f67ee9e1f4bbce4368fc Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 9 Aug 2021 16:27:22 +0200 Subject: [PATCH 123/148] next try for IDF 4.4 map file building #12837 @arendst @sillyfrog give it a try. I am a Python noob... The `map_name` generating is problematic. Better would be to use last entry of the string `src_dir`. --- pio-tools/name-firmware.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index e82857d1e..53376db8b 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -1,4 +1,5 @@ Import('env') +Import('projenv') import os import shutil @@ -31,7 +32,21 @@ def bin_map_copy(source, target, env): if os.path.isfile("firmware.map"): shutil.move("firmware.map", map_file) - map_new_loc = str(target[0]).split(os.path.sep)[0] + os.path.sep + str(target[0]).split(os.path.sep)[1] + os.path.sep + str(target[0]).split(os.path.sep)[2] + os.path.sep + "Tasmota.map" + #map_new_loc = str(target[0]).split(os.path.sep)[0] + os.path.sep + str(target[0]).split(os.path.sep)[1] + os.path.sep + str(target[0]).split(os.path.sep)[2] + os.path.sep + "Tasmota.map" + # PIO env variables see: https://github.com/platformio/platformio-core/blob/develop/platformio/builder/main.py#L108:L128 + proj_build_dir = env["PROJECT_BUILD_DIR"] + #build_dir = env["BUILD_DIR"] + pio_env = env["PIOENV"] + src_dir = env["PROJECT_SRC_DIR"] + map_name = str(src_dir).split(os.path.sep)[2] + map_new_loc = proj_build_dir + os.path.sep + pio_env + os.path.sep + map_name + ".map" + #print("proj_build_dir: {}".format(proj_build_dir)) + #print("pioenv: {}".format(pio_env)) + #print("src_dir: {}".format(src_dir)) + #print("build_dir: {}".format(build_dir)) + #print("map_name: {}".format(map_name)) + #print("map_new_loc: {}".format(map_new_loc)) + # move Tasmota.map to map/.map if os.path.isfile(map_new_loc): shutil.move(map_new_loc, map_file) From 4209f7d1cbb5e67b8a61a45829a18a44118b3706 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 9 Aug 2021 18:34:09 +0200 Subject: [PATCH 124/148] Final? fix for map file with IDF4.4 --- pio-tools/name-firmware.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 53376db8b..ce6ee0339 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -37,14 +37,14 @@ def bin_map_copy(source, target, env): proj_build_dir = env["PROJECT_BUILD_DIR"] #build_dir = env["BUILD_DIR"] pio_env = env["PIOENV"] - src_dir = env["PROJECT_SRC_DIR"] - map_name = str(src_dir).split(os.path.sep)[2] + proj_dir = env["PROJECT_DIR"] + map_name = str(proj_dir).split(os.path.sep)[-1] map_new_loc = proj_build_dir + os.path.sep + pio_env + os.path.sep + map_name + ".map" #print("proj_build_dir: {}".format(proj_build_dir)) #print("pioenv: {}".format(pio_env)) - #print("src_dir: {}".format(src_dir)) #print("build_dir: {}".format(build_dir)) #print("map_name: {}".format(map_name)) + #print("proj_dir: {}".format(proj_dir)) #print("map_new_loc: {}".format(map_new_loc)) # move Tasmota.map to map/.map From c3df8f27046df3bc6b1f983c1be6d6bd70a93d65 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Wed, 11 Aug 2021 07:32:53 -0500 Subject: [PATCH 125/148] Set LEDs to max PWM value --- tasmota/xdrv_04_light.ino | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index d453efbaf..ff344df17 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -2000,7 +2000,14 @@ void LightApplyPower(uint8_t new_color[LST_MAX], power_t power) { void LightSetOutputs(const uint16_t *cur_col_10) { // now apply the actual PWM values, adjusted and remapped 10-bits range if (TasmotaGlobal.light_type < LT_PWM6) { // only for direct PWM lights, not for Tuya, Armtronix... +#ifdef USE_PWM_DIMMER + uint16_t max_col = 0; +#endif // USE_PWM_DIMMER for (uint32_t i = 0; i < (Light.subtype - Light.pwm_offset); i++) { + uint16_t cur_col = cur_col_10[i + Light.pwm_offset]; +#ifdef USE_PWM_DIMMER + if (cur_col > max_col) max_col = cur_col; +#endif // USE_PWM_DIMMER if (PinUsed(GPIO_PWM1, i)) { //AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "Cur_Col%d 10 bits %d"), i, cur_col_10[i]); uint16_t cur_col = cur_col_10[i + Light.pwm_offset]; @@ -2010,12 +2017,12 @@ void LightSetOutputs(const uint16_t *cur_col_10) { if (!Settings->flag4.zerocross_dimmer) { analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); } -#ifdef USE_PWM_DIMMER - // Animate brightness LEDs to follow PWM dimmer brightness - if (PWM_DIMMER == TasmotaGlobal.module_type) PWMDimmerSetBrightnessLeds(change10to8(cur_col)); -#endif // USE_PWM_DIMMER } } +#ifdef USE_PWM_DIMMER + // Animate brightness LEDs to follow PWM dimmer brightness + if (PWM_DIMMER == TasmotaGlobal.module_type) PWMDimmerSetBrightnessLeds(change10to8(max_col)); +#endif // USE_PWM_DIMMER } // char msg[24]; // AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Channels %s"), ToHex_P((const unsigned char *)cur_col_10, 10, msg, sizeof(msg))); From 4503bac78a6a8f067209b30d8dd92f215ff2f69c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 11 Aug 2021 18:43:11 +0200 Subject: [PATCH 126/148] Prep influxdb support --- tasmota/settings.h | 13 +++---------- tasmota/settings.ino | 2 +- tasmota/tasmota.h | 1 + 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 96be4f64d..7de698b91 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -247,7 +247,7 @@ typedef union { uint32_t telegram_echo_enable : 1; // bit 2 (v9.4.0.3) - CMND_TMSTATE 4/5 - Enable Telegram echo uint32_t range_extender : 1; // bit 3 (v9.5.0.5) - CMND_RGXSTATE - Enable range extender uint32_t range_extender_napt : 1; // bit 4 (v9.5.0.5) - CMND_RGXNAPT - Enable range extender NAPT - uint32_t sonoff_l1_music_sync : 1; // bit 5 (v9.5.0.5) - CMND_MUSICSYNC - Enable sync to music + uint32_t sonoff_l1_music_sync : 1; // bit 5 (v9.5.0.5) - CMND_L1MUSICSYNC - Enable sync to music uint32_t spare06 : 1; // bit 6 uint32_t spare07 : 1; // bit 7 uint32_t spare08 : 1; // bit 8 @@ -583,11 +583,9 @@ typedef struct { uint8_t switchmode[MAX_SWITCHES_SET]; // 4A9 uint8_t free_4c5[5]; // 4C5 - uint8_t ex_interlock[4]; // 4CA MAX_INTERLOCKS = MAX_RELAYS / 2 (Legacy) - uint8_t free_4ce[2]; // 4CE - + uint16_t influxdb_port; // 4CE power_t interlock[MAX_INTERLOCKS_SET]; // 4D0 MAX_INTERLOCKS = MAX_RELAYS / 2 uint8_t free_508[36]; // 508 @@ -643,7 +641,6 @@ typedef struct { uint16_t baudrate; // 778 uint16_t sbaudrate; // 77A EnergyUsage energy_usage; // 77C - uint32_t sensors[2][4]; // 794 Disable individual (0) sensor drivers / (1) GUI sensor output uint32_t energy_kWhtotal_time; // 7B4 unsigned long weight_item; // 7B8 Weight of one item in gram * 10 @@ -654,9 +651,7 @@ typedef struct { unsigned long energy_frequency_calibration; // 7C8 Also used by HX711 to save last weight uint16_t web_refresh; // 7CC char script_pram[5][10]; // 7CE - char rules[MAX_RULE_SETS][MAX_RULE_SIZE]; // 800 Uses 512 bytes in v5.12.0m, 3 x 512 bytes in v5.14.0b - TuyaFnidDpidMap tuya_fnid_map[MAX_TUYA_FUNCTIONS]; // E00 32 bytes uint16_t ina226_r_shunt[4]; // E20 uint16_t ina226_i_fs[4]; // E28 @@ -692,9 +687,7 @@ typedef struct { uint8_t webserver; // ECD uint8_t weblog_level; // ECE uint8_t mqtt_fingerprint[2][20]; // ECF - - uint8_t ex_adc_param_type; // EF7 Free since 9.0.0.1 - + uint8_t influxdb_version; // EF7 SOBitfield4 flag4; // EF8 uint16_t mqtt_port; // EFC uint8_t serial_config; // EFE diff --git a/tasmota/settings.ino b/tasmota/settings.ino index d5f5e2b4d..30f1c0cda 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -1334,7 +1334,7 @@ void SettingsDelta(void) { if (Settings->version < 0x09000002) { char parameters[32]; snprintf_P(parameters, sizeof(parameters), PSTR("%d,%d,%d,%d,%d"), - Settings->ex_adc_param_type, Settings->sensors[0][0], Settings->sensors[0][1], (int)Settings->sensors[0][2], Settings->mbflag2.data); + Settings->influxdb_version, Settings->sensors[0][0], Settings->sensors[0][1], (int)Settings->sensors[0][2], Settings->mbflag2.data); SettingsUpdateText(SET_ADC_PARAM1, parameters); } #endif // ESP8266 diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 86f2143b6..433efd0da 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -369,6 +369,7 @@ enum SettingsTextIndex { SET_OTAURL, #endif // ESP32 SET_SHD_PARAM, SET_RGX_SSID, SET_RGX_PASSWORD, + SET_INFLUXDB_HOST, SET_INFLUXDB_PORT, SET_INFLUXDB_ORG, SET_INFLUXDB_TOKEN, SET_INFLUXDB_BUCKET, SET_MAX }; enum SpiInterfaces { SPI_NONE, SPI_MOSI, SPI_MISO, SPI_MOSI_MISO }; From ffdb2a4c1c46038642103ddf19d4c0d4dc6f55a6 Mon Sep 17 00:00:00 2001 From: pauloamexio <87972768+pauloamexio@users.noreply.github.com> Date: Thu, 12 Aug 2021 11:49:06 +0100 Subject: [PATCH 127/148] Read from ACCMODE register Read from ACCMODE Register to check if the reactive power and active power are positive and negative (for both channels) --- tasmota/xnrg_07_ade7953.ino | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tasmota/xnrg_07_ade7953.ino b/tasmota/xnrg_07_ade7953.ino index e52b248af..0951de8c4 100644 --- a/tasmota/xnrg_07_ade7953.ino +++ b/tasmota/xnrg_07_ade7953.ino @@ -50,6 +50,18 @@ const uint16_t Ade7953Registers[] { 0x10E // 16-bit unsigned period register }; +const uint16_t ACCMODERegister = 0x301; //ACCMODE Register (Address 0x201 for 21 bits and Address 0x301 for 32 bits) +//active power +const uint32_t APSIGN[] { + 0x800, //Bit 10 (21 bits) in ACCMODE Register for channel A (0 - positive, 1 - negative) + 0x400 //Bit 11 (21 bits) in ACCMODE Register for channel B (0 - positive, 1 - negative) +}; +//reactive power +const uint32_t VARSIGN[] { + 0x200, //Bit 12 (21 bits) in ACCMODE Register for channel A (0 - positive, 1 - negative) + 0x100 //Bit 13 (21 bits) in ACCMODE Register for channel B (0 - positive, 1 - negative) +}; + struct Ade7953 { uint32_t voltage_rms = 0; uint32_t period = 0; @@ -136,6 +148,7 @@ void Ade7953GetData(void) reg[0][0], reg[0][1], reg[0][2], reg[0][3], reg[1][0], reg[1][1], reg[1][2], reg[1][3]); + uint32_t valueACCMODE = Ade7953Read(ACCMODERegister); uint32_t apparent_power[2] = { 0, 0 }; uint32_t reactive_power[2] = { 0, 0 }; @@ -166,7 +179,13 @@ void Ade7953GetData(void) for (uint32_t channel = 0; channel < 2; channel++) { Energy.data_valid[channel] = 0; Energy.active_power[channel] = (float)Ade7953.active_power[channel] / (Settings->energy_power_calibration / 10); + if ((valueACCMODE & APSIGN[channel]) == APSIGN[channel]) { + Energy.active_power[channel] = Energy.active_power[channel] * -1; + } Energy.reactive_power[channel] = (float)reactive_power[channel] / (Settings->energy_power_calibration / 10); + if ((valueACCMODE & VARSIGN[channel]) == VARSIGN[channel]) { + Energy.reactive_power[channel] = Energy.reactive_power[channel] * -1; + } Energy.apparent_power[channel] = (float)apparent_power[channel] / (Settings->energy_power_calibration / 10); if (0 == Energy.active_power[channel]) { Energy.current[channel] = 0; From 668e260481c73f2a56ff9dbcc12e5b00ea3da1b2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 12 Aug 2021 20:38:31 +0200 Subject: [PATCH 128/148] Fix negative power values for ADE7953 based devices like Shelly EM (#12874) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xnrg_07_ade7953.ino | 41 ++++++++++++++++++++----------------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30541c867..beece4184 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Neopool communication error (#12813) +- Negative power values for ADE7953 based devices like Shelly EM (#12874) ## [9.5.0.4] 20210801 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ba856058b..ecb41e6de 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -162,3 +162,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Discovery fails when using ``%hostname%`` in a topic [#12710](https://github.com/arendst/Tasmota/issues/12710) - ESP32 buzzer in PWM mode exception (#12717)[#12717](https://github.com/arendst/Tasmota/issues/12717) - Neopool communication error [#12813](https://github.com/arendst/Tasmota/issues/12813) +- Negative power values for ADE7953 based devices like Shelly EM [#12874](https://github.com/arendst/Tasmota/issues/12874) diff --git a/tasmota/xnrg_07_ade7953.ino b/tasmota/xnrg_07_ade7953.ino index 0951de8c4..4f94b25ce 100644 --- a/tasmota/xnrg_07_ade7953.ino +++ b/tasmota/xnrg_07_ade7953.ino @@ -37,27 +37,28 @@ #define ADE7953_ADDR 0x38 +// 24-bit data registers const uint16_t Ade7953Registers[] { - 0x31B, // RMS current channel B (Relay 1) - 0x313, // Active power channel B - 0x311, // Apparent power channel B - 0x315, // Reactive power channel B - 0x31A, // RMS current channel A (Relay 2) - 0x312, // Active power channel A - 0x310, // Apparent power channel A - 0x314, // Reactive power channel A - 0x31C, // RMS voltage (Both relays) - 0x10E // 16-bit unsigned period register + 0x31B, // IRMSB - RMS current channel B (Relay 1) + 0x313, // BWATT - Active power channel B + 0x311, // BVA - Apparent power channel B + 0x315, // BVAR - Reactive power channel B + 0x31A, // IRMSA - RMS current channel A (Relay 2) + 0x312, // AWATT - Active power channel A + 0x310, // AVA - Apparent power channel A + 0x314, // AVAR - Reactive power channel A + 0x31C, // VRMS - RMS voltage (Both relays) + 0x10E, // Period - 16-bit unsigned period register + 0x301 // ACCMODE - Accumulation mode }; -const uint16_t ACCMODERegister = 0x301; //ACCMODE Register (Address 0x201 for 21 bits and Address 0x301 for 32 bits) -//active power -const uint32_t APSIGN[] { +// Active power +const uint16_t APSIGN[] { 0x800, //Bit 10 (21 bits) in ACCMODE Register for channel A (0 - positive, 1 - negative) 0x400 //Bit 11 (21 bits) in ACCMODE Register for channel B (0 - positive, 1 - negative) }; -//reactive power -const uint32_t VARSIGN[] { +// Reactive power +const uint16_t VARSIGN[] { 0x200, //Bit 12 (21 bits) in ACCMODE Register for channel A (0 - positive, 1 - negative) 0x100 //Bit 13 (21 bits) in ACCMODE Register for channel B (0 - positive, 1 - negative) }; @@ -132,13 +133,16 @@ void Ade7953Init(void) void Ade7953GetData(void) { + uint32_t acc_mode; int32_t reg[2][4]; for (uint32_t i = 0; i < sizeof(Ade7953Registers)/sizeof(uint16_t); i++) { int32_t value = Ade7953Read(Ade7953Registers[i]); if (8 == i) { Ade7953.voltage_rms = value; // RMS voltage (Both relays) } else if (9 == i) { - Ade7953.period = value; // period + Ade7953.period = value; // Period + } else if (10 == i) { + acc_mode = value; // Accumulation mode } else { reg[i >> 2][i &3] = value; } @@ -148,7 +152,6 @@ void Ade7953GetData(void) reg[0][0], reg[0][1], reg[0][2], reg[0][3], reg[1][0], reg[1][1], reg[1][2], reg[1][3]); - uint32_t valueACCMODE = Ade7953Read(ACCMODERegister); uint32_t apparent_power[2] = { 0, 0 }; uint32_t reactive_power[2] = { 0, 0 }; @@ -179,11 +182,11 @@ void Ade7953GetData(void) for (uint32_t channel = 0; channel < 2; channel++) { Energy.data_valid[channel] = 0; Energy.active_power[channel] = (float)Ade7953.active_power[channel] / (Settings->energy_power_calibration / 10); - if ((valueACCMODE & APSIGN[channel]) == APSIGN[channel]) { + if ((acc_mode & APSIGN[channel]) != 0) { Energy.active_power[channel] = Energy.active_power[channel] * -1; } Energy.reactive_power[channel] = (float)reactive_power[channel] / (Settings->energy_power_calibration / 10); - if ((valueACCMODE & VARSIGN[channel]) == VARSIGN[channel]) { + if ((acc_mode & VARSIGN[channel]) != 0) { Energy.reactive_power[channel] = Energy.reactive_power[channel] * -1; } Energy.apparent_power[channel] = (float)apparent_power[channel] / (Settings->energy_power_calibration / 10); From 4954475512bf6f0ec7e77e8e233245e3e73d9778 Mon Sep 17 00:00:00 2001 From: Laszlo Magyar <> Date: Thu, 12 Aug 2021 21:34:22 +0200 Subject: [PATCH 129/148] Typos causing compilation errors Maybe these are a result of a previous "search and replace" refactoring, causing compilation errors when drivers used with 100..128 key values: invalid conversion from 'bool (*)(uint8_t) {aka bool (*)(unsigned char)}' to 'uint8_t {aka unsigned char}' --- tasmota/xdrv_interface.ino | 58 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/tasmota/xdrv_interface.ino b/tasmota/xdrv_interface.ino index f3825e0c7..680e0b62f 100644 --- a/tasmota/xdrv_interface.ino +++ b/tasmota/xdrv_interface.ino @@ -945,119 +945,119 @@ const uint8_t kXdrvList[] = { #endif #ifdef XDRV_100 - Xdrv100, + XDRV_100, #endif #ifdef XDRV_101 - Xdrv101, + XDRV_101, #endif #ifdef XDRV_102 - Xdrv102, + XDRV_102, #endif #ifdef XDRV_103 - Xdrv103, + XDRV_103, #endif #ifdef XDRV_104 - Xdrv104, + XDRV_104, #endif #ifdef XDRV_105 - Xdrv105, + XDRV_105, #endif #ifdef XDRV_106 - Xdrv106, + XDRV_106, #endif #ifdef XDRV_107 - Xdrv107, + XDRV_107, #endif #ifdef XDRV_108 - Xdrv108, + XDRV_108, #endif #ifdef XDRV_109 - Xdrv109, + XDRV_109, #endif #ifdef XDRV_110 - Xdrv110, + XDRV_110, #endif #ifdef XDRV_111 - Xdrv111, + XDRV_111, #endif #ifdef XDRV_112 - Xdrv112, + XDRV_112, #endif #ifdef XDRV_113 - Xdrv113, + XDRV_113, #endif #ifdef XDRV_114 - Xdrv114, + XDRV_114, #endif #ifdef XDRV_115 - Xdrv115, + XDRV_115, #endif #ifdef XDRV_116 - Xdrv116, + XDRV_116, #endif #ifdef XDRV_117 - Xdrv117, + XDRV_117, #endif #ifdef XDRV_118 - Xdrv118, + XDRV_118, #endif #ifdef XDRV_119 - Xdrv119, + XDRV_119, #endif #ifdef XDRV_120 - Xdrv120, + XDRV_120, #endif #ifdef XDRV_121 - Xdrv121, + XDRV_121, #endif #ifdef XDRV_122 - Xdrv122, + XDRV_122, #endif #ifdef XDRV_123 - Xdrv123, + XDRV_123, #endif #ifdef XDRV_124 - Xdrv124, + XDRV_124, #endif #ifdef XDRV_125 - Xdrv125, + XDRV_125, #endif #ifdef XDRV_126 - Xdrv126, + XDRV_126, #endif #ifdef XDRV_127 - Xdrv127, + XDRV_127, #endif #ifdef XDRV_128 - Xdrv128 + XDRV_128 #endif }; From 8e0eab7f63466254bd047139f5dafe747267b4a0 Mon Sep 17 00:00:00 2001 From: Laszlo Magyar <> Date: Thu, 12 Aug 2021 21:35:33 +0200 Subject: [PATCH 130/148] Typo in comment --- tasmota/tasmota.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 433efd0da..5a475cc9d 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -136,7 +136,7 @@ const uint32_t PWM_RANGE = 1023; // 255..1023 needs to be devisible b //const uint16_t PWM_FREQ = 910; // 100..1000 Hz led refresh (iTead value) const uint16_t PWM_FREQ = 977; // 100..4000 Hz led refresh #ifdef ESP32 -const uint16_t PWM_MAX = 50000; // [PWM_MAX] Maximum frequency for ESP32 - Default: 4000 +const uint16_t PWM_MAX = 50000; // [PWM_MAX] Maximum frequency for ESP32 - Default: 50000 #else const uint16_t PWM_MAX = 4000; // [PWM_MAX] Maximum frequency - Default: 4000 #endif From c4075655aa0dbbf51fae701f66b0266e53e33fa2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 12 Aug 2021 22:33:02 +0200 Subject: [PATCH 131/148] Initial support for influxdb using ``#define USE_INFLUXDB`` and several ``Ifx`` commands --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/my_user_config.h | 9 + tasmota/settings.h | 2 +- tasmota/xsns_90_influxdb.ino | 449 +++++++++++++++++++++++++++++++++++ 5 files changed, 461 insertions(+), 1 deletion(-) create mode 100644 tasmota/xsns_90_influxdb.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index beece4184..b2776016c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Inital support for Wi-Fi extender (#12784) - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` (#12813) - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin +- Initial support for influxdb using ``#define USE_INFLUXDB`` and several ``Ifx`` commands ### Changed - NeoPixelBus library from v2.6.3 to v2.6.7 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ecb41e6de..7d4304165 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -106,6 +106,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` [#12813](https://github.com/arendst/Tasmota/issues/12813) - Support for second DNS server - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin +- Initial support for influxdb using ``#define USE_INFLUXDB`` and several ``Ifx`` commands - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939) - Berry ESP32 partition manager [#12465](https://github.com/arendst/Tasmota/issues/12465) - Berry ESP32 support for I2S audio mp3 playback diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index d9f4056a2..93a72de70 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -390,6 +390,15 @@ // -- OTA ----------------------------------------- //#define USE_ARDUINO_OTA // Add optional support for Arduino OTA (+13k code) +// -- Influxdb ------------------------------------ +//#define USE_INFLUXDB // Enable influxdb support (+5k code) +// #define INFLUXDB_VERSION 1 // Version of Influxdb 1 or 2 +// #define INFLUXDB_HOST "influxdb" // [IfxHost] Influxdb hostname or IP address +// #define INFLUXDB_PORT 8086 // [IfxPort] Influxdb port number +// #define INFLUXDB_ORG "" // [IfxUser, IfxOrg] Influxdb v1 username or v2 organisation +// #define INFLUXDB_TOKEN "" // [IfxPassword, IfxToken] Influxdb v1 password or v2 token +// #define INFLUXDB_BUCKET "db" // [IfxDatabase, IfxBucket] Influxdb v1 database or v2 bucket + // -- MQTT ---------------------------------------- #define MQTT_LWT_OFFLINE "Offline" // MQTT LWT offline topic message #define MQTT_LWT_ONLINE "Online" // MQTT LWT online topic message diff --git a/tasmota/settings.h b/tasmota/settings.h index 7de698b91..a931c9132 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -248,7 +248,7 @@ typedef union { uint32_t range_extender : 1; // bit 3 (v9.5.0.5) - CMND_RGXSTATE - Enable range extender uint32_t range_extender_napt : 1; // bit 4 (v9.5.0.5) - CMND_RGXNAPT - Enable range extender NAPT uint32_t sonoff_l1_music_sync : 1; // bit 5 (v9.5.0.5) - CMND_L1MUSICSYNC - Enable sync to music - uint32_t spare06 : 1; // bit 6 + uint32_t influxdb_default : 1; // bit 6 (v9.5.0.5) - Set initial defaults if 0 uint32_t spare07 : 1; // bit 7 uint32_t spare08 : 1; // bit 8 uint32_t spare09 : 1; // bit 9 diff --git a/tasmota/xsns_90_influxdb.ino b/tasmota/xsns_90_influxdb.ino new file mode 100644 index 000000000..cddceb9f9 --- /dev/null +++ b/tasmota/xsns_90_influxdb.ino @@ -0,0 +1,449 @@ +/* + xsns_90_influxdb.ino - Influxdb support for Tasmota + + Copyright (C) 2021 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General 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 USE_INFLUXDB +/*********************************************************************************************\ + * Influxdb support + * + * To save over 80k not supporting https this driver uses a subset of library + * https://github.com/tobiasschuerg/InfluxDB-Client-for-Arduino + * + * The text format for metrics, labels and values is documented at + * https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_reference/ + * + * Supported commands: + * Ifx - Show current state + * IfxHost - Set Influxdb host name or IP address + * IfxPort - Set Influxdb port + * IfxDatabase - Set Influxdb v1 and database name + * IfxUser - Set Influxdb v1 and userid + * IfxPassword - Set Influxdb v1 and password + * IfxBucket - Set Influxdb v2 and bucket name + * IfxOrg - Set Influxdb v2 and organization + * IfxToken - Set Influxdb v2 and token + * + * Set influxdb update interval with command teleperiod +\*********************************************************************************************/ + +#define XSNS_90 90 + +#define INFLUXDB_INITIAL 12 // Initial number of seconds after restart keeping in mind sensor initialization + +#ifndef INFLUXDB_VERSION +#define INFLUXDB_VERSION 1 // Version of Influxdb 1 or 2 +#endif +#ifndef INFLUXDB_HOST +#define INFLUXDB_HOST "influxdb" // [IfxHost] Influxdb hostname or IP address +#endif +#ifndef INFLUXDB_PORT +#define INFLUXDB_PORT 8086 // [IfxPort] Influxdb port number +#endif +#ifndef INFLUXDB_ORG +#define INFLUXDB_ORG "" // [IfxUser, IfxOrg] Influxdb v1 username or v2 organisation +#endif +#ifndef INFLUXDB_TOKEN +#define INFLUXDB_TOKEN "" // [IfxPassword, IfxToken] Influxdb v1 password or v2 token +#endif +#ifndef INFLUXDB_BUCKET +#define INFLUXDB_BUCKET "db" // [IfxDatabase, IfxBucket] Influxdb v1 database or v2 bucket +#endif + +static const char UninitializedMessage[] PROGMEM = "Unconfigured instance"; +// This cannot be put to PROGMEM due to the way how it is used +static const char RetryAfter[] = "Retry-After"; +static const char TransferEncoding[] = "Transfer-Encoding"; + +WiFiClient *IFDBwifiClient = nullptr; +HTTPClient *IFDBhttpClient = nullptr; + +struct { + String _serverUrl; // Connection info + String _writeUrl; // Cached full write url + String _lastErrorResponse; // Server reponse or library error message for last failed request + uint32_t interval = INFLUXDB_INITIAL; + uint32_t _lastRequestTime = 0; // Last time in ms we made are a request to server + int _lastStatusCode = 0; // HTTP status code of last request to server + int _lastRetryAfter = 0; // Store retry timeout suggested by server after last request + bool _connectionReuse; // true if HTTP connection should be kept open. Usable for frequent writes. Default false + bool init = false; +} IFDB; + +String InfluxDbAuth(void) { + String auth = ""; + if (strlen(SettingsText(SET_INFLUXDB_ORG)) > 0 && strlen(SettingsText(SET_INFLUXDB_TOKEN)) > 0) { + auth = "&u="; + auth += UrlEncode(SettingsText(SET_INFLUXDB_ORG)); + auth += "&p="; + auth += UrlEncode(SettingsText(SET_INFLUXDB_TOKEN)); + } + return auth; +} + +bool InfluxDbInit(void) { + IFDB._serverUrl = "http://"; + IFDB._serverUrl += SettingsText(SET_INFLUXDB_HOST); + IFDB._serverUrl += ":"; + IFDB._serverUrl += Settings->influxdb_port; + if (IFDB._serverUrl.length() == 0 || + (2 == Settings->influxdb_version && (strlen(SettingsText(SET_INFLUXDB_ORG)) == 0 || + strlen(SettingsText(SET_INFLUXDB_BUCKET)) == 0 || + strlen(SettingsText(SET_INFLUXDB_TOKEN)) == 0))) { + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Invalid parameters")); + return false; + } + IFDB._writeUrl = IFDB._serverUrl; + if (2 == Settings->influxdb_version) { + IFDB._writeUrl += "/api/v2/write?org="; + IFDB._writeUrl += UrlEncode(SettingsText(SET_INFLUXDB_ORG)); + IFDB._writeUrl += "&bucket="; + IFDB._writeUrl += UrlEncode(SettingsText(SET_INFLUXDB_BUCKET)); + } else { + IFDB._writeUrl += "/write?db="; + IFDB._writeUrl += UrlEncode(SettingsText(SET_INFLUXDB_BUCKET)); + IFDB._writeUrl += InfluxDbAuth(); + } +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Url %s"), IFDB._writeUrl.c_str()); + + IFDBwifiClient = new WiFiClient; + if (!IFDBhttpClient) { + IFDBhttpClient = new HTTPClient; + } + IFDBhttpClient->setReuse(IFDB._connectionReuse); + char server[32]; + snprintf_P(server, sizeof(server), PSTR("Tasmota/%s (%s)"), TasmotaGlobal.version, GetDeviceHardware().c_str()); + IFDBhttpClient->setUserAgent(server); + return true; +} + +void InfluxDbBeforeRequest() { + if (strlen(SettingsText(SET_INFLUXDB_TOKEN)) > 0) { + String auth_token = SettingsText(SET_INFLUXDB_TOKEN); + IFDBhttpClient->addHeader(F("Authorization"), "Token " + auth_token); + } + const char *headerKeys[] = { RetryAfter, TransferEncoding }; + IFDBhttpClient->collectHeaders(headerKeys, 2); +} + +void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { + if (modifyLastConnStatus) { + IFDB._lastRequestTime = millis(); +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: HTTP status code %d"), IFDB._lastStatusCode); + IFDB._lastRetryAfter = 0; + if (IFDB._lastStatusCode >= 429) { //retryable server errors + if (IFDBhttpClient->hasHeader(RetryAfter)) { + IFDB._lastRetryAfter = IFDBhttpClient->header(RetryAfter).toInt(); + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Reply after %d"), IFDB._lastRetryAfter); + } + } + } + IFDB._lastErrorResponse = ""; + if (IFDB._lastStatusCode != expectedStatusCode) { + if (IFDB._lastStatusCode > 0) { + IFDB._lastErrorResponse = IFDBhttpClient->getString(); + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Response\n%s"), IFDB._lastErrorResponse.c_str()); + } else { + IFDB._lastErrorResponse = IFDBhttpClient->errorToString(IFDB._lastStatusCode); + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); + } + } +} + +bool InfluxDbValidateConnection(void) { + if (!IFDBwifiClient && !InfluxDbInit()) { + IFDB._lastStatusCode = 0; + IFDB._lastErrorResponse = FPSTR(UninitializedMessage); + return false; + } + // on version 1.x /ping will by default return status code 204, without verbose + String url = IFDB._serverUrl + (2 == Settings->influxdb_version ? "/health" : "/ping?verbose=true"); + if (1 == Settings->influxdb_version) { + url += InfluxDbAuth(); + } + // on version 1.8.9 /health works fine +// String url = IFDB._serverUrl + "/health"; + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Validating connection to %s"), url.c_str()); + + if (!IFDBhttpClient->begin(*IFDBwifiClient, url)) { + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Begin failed")); + return false; + } + IFDBhttpClient->addHeader(F("Accept"), F("application/json")); + + IFDB._lastStatusCode = IFDBhttpClient->GET(); + IFDB._lastErrorResponse = ""; + InfluxDbAfterRequest(200, false); + IFDBhttpClient->end(); + + return IFDB._lastStatusCode == 200; +} + +int InfluxDbPostData(const char *data) { + if (!IFDBwifiClient && !InfluxDbInit()) { + IFDB._lastStatusCode = 0; + IFDB._lastErrorResponse = FPSTR(UninitializedMessage); + return 0; + } + if (data) { + if (!IFDBhttpClient->begin(*IFDBwifiClient, IFDB._writeUrl)) { + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Begin failed")); + return false; + } + + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("IFX: Sending\n%s"), data); + IFDBhttpClient->addHeader(F("Content-Type"), F("text/plain")); + InfluxDbBeforeRequest(); + IFDB._lastStatusCode = IFDBhttpClient->POST((uint8_t*)data, strlen(data)); + InfluxDbAfterRequest(204, true); + IFDBhttpClient->end(); + } + return IFDB._lastStatusCode; +} + +/*********************************************************************************************/ + +void InfluxDbMetrics(void) { + ResponseClear(); + if (!MqttShowSensor()) { return; }; // Pull sensor data + +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Metrics %s"), TasmotaGlobal.mqtt_data.c_str()); + + String jsonStr = TasmotaGlobal.mqtt_data; + JsonParser parser((char *)jsonStr.c_str()); + JsonParserObject root = parser.getRootObject(); + if (root) { + char linebuf[128]; // 'temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=26.44\n' + char sensor[64]; // 'ds18b20' + char type[64]; // 'temperature' + char sensor_id[32]; // ',id=01144A0CB2AA' + String data = ""; // Multiple linebufs + + for (auto key1 : root) { + JsonParserToken value1 = key1.getValue(); + if (value1.isObject()) { + JsonParserObject Object2 = value1.getObject(); + for (auto key2 : Object2) { + JsonParserToken value2 = key2.getValue(); + if (value2.isObject()) { + JsonParserObject Object3 = value2.getObject(); + for (auto key3 : Object3) { + const char *value = key3.getValue().getStr(); + if (value != nullptr && isdigit(value[0])) { + // Level 3 + LowerCase(sensor, key2.getStr()); + LowerCase(type, key3.getStr()); + // temperature,device=tasmota1,sensor=DS18B20 value=24.44 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, value); + data += linebuf; + } + } + } else { + // Level 2 + bool isarray = value2.isArray(); + const char *value = (isarray) ? (value2.getArray())[0].getStr() : value2.getStr(); + if (value != nullptr && isdigit(value[0])) { + LowerCase(sensor, key1.getStr()); + LowerCase(type, key2.getStr()); + + if (strcmp(type, "totalstarttime") != 0) { // Not needed/wanted + if (strcmp(type, "id") == 0) { // Index for DS18B20 + snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); + } else { + if (isarray) { + JsonParserArray arr = value2.getArray(); + uint32_t i = 0; + for (auto val : arr) { + i++; + // power1,device=shelly25,sensor=energy value=0.00 + // power2,device=shelly25,sensor=energy value=4.12 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), + type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); + data += linebuf; + } + } else { + // temperature,device=Wemos10,sensor=ds18b20,id=01144A0CB2AA value=22.63 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); + data += linebuf; + } + sensor_id[0] = '\0'; + } + } + } + } + } +/* + } else { + // Level 1 + const char *value = value1.getStr(); + LowerCase(sensor, key1.getStr()); + + // time,device=Wemos10 value=2021-08-11T09:46:29 + // tempunit,device=Wemos10 value=C + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s value=%s\n"), + sensor, TasmotaGlobal.mqtt_topic, value); + data += linebuf; +*/ + } + } + if (data.length() > 0 ) { +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Sensor data:\n%s"), data.c_str()); + InfluxDbPostData(data.c_str()); + } + } +} + +void InfluxDbLoop(void) { + if (!IFDB.init) { + IFDB.init = InfluxDbValidateConnection(); + } + InfluxDbMetrics(); +} + +/*********************************************************************************************\ + * Commands +\*********************************************************************************************/ + +#define D_PRFX_INFLUXDB "Ifx" +#define D_CMND_INFLUXDBHOST "Host" +#define D_CMND_INFLUXDBPORT "Port" +#define D_CMND_INFLUXDBUSER "User" +#define D_CMND_INFLUXDBORG "Org" +#define D_CMND_INFLUXDBPASSWORD "Password" +#define D_CMND_INFLUXDBTOKEN "Token" +#define D_CMND_INFLUXDBDATABASE "Database" +#define D_CMND_INFLUXDBBUCKET "Bucket" + +const char kInfluxDbCommands[] PROGMEM = D_PRFX_INFLUXDB "|" // Prefix + "|" + D_CMND_INFLUXDBHOST "|" D_CMND_INFLUXDBPORT "|" + D_CMND_INFLUXDBUSER "|" D_CMND_INFLUXDBORG "|" + D_CMND_INFLUXDBPASSWORD "|" D_CMND_INFLUXDBTOKEN "|" + D_CMND_INFLUXDBDATABASE "|" D_CMND_INFLUXDBBUCKET; + +void (* const InfluxCommand[])(void) PROGMEM = { + &CmndInfluxDbState, + &CmndInfluxDbHost, &CmndInfluxDbPort, + &CmndInfluxDbUser, &CmndInfluxDbUser, + &CmndInfluxDbPassword, &CmndInfluxDbPassword, + &CmndInfluxDbDatabase, &CmndInfluxDbDatabase }; + +void InfluxDbReinit(void) { + IFDB.init = false; + IFDB.interval = 2; +} + +void CmndInfluxDbState(void) { + Response_P(PSTR("{\"" D_PRFX_INFLUXDB "\":{\"" D_CMND_INFLUXDBHOST "\":\"%s\",\"" D_CMND_INFLUXDBPORT "\":%d,\"Version\":%d"), + SettingsText(SET_INFLUXDB_HOST), Settings->influxdb_port, Settings->influxdb_version); + if (1 == Settings->influxdb_version) { + ResponseAppend_P(PSTR(",\"" D_CMND_INFLUXDBDATABASE "\":\"%s\",\"" D_CMND_INFLUXDBUSER "\":\"%s\"}}"), + SettingsText(SET_INFLUXDB_BUCKET), SettingsText(SET_INFLUXDB_ORG)); + } else { + ResponseAppend_P(PSTR(",\"" D_CMND_INFLUXDBBUCKET "\":\"%s\",\"" D_CMND_INFLUXDBORG "\":\"%s\"}}"), + SettingsText(SET_INFLUXDB_BUCKET), SettingsText(SET_INFLUXDB_ORG)); + } +} + +void CmndInfluxDbHost(void) { + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_INFLUXDB_HOST, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? PSTR(INFLUXDB_HOST) : XdrvMailbox.data); + InfluxDbReinit(); + } + ResponseCmndChar(SettingsText(SET_INFLUXDB_HOST)); +} + +void CmndInfluxDbPort(void) { + if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 65536)) { + Settings->influxdb_port = (1 == XdrvMailbox.payload) ? INFLUXDB_PORT : XdrvMailbox.payload; + InfluxDbReinit(); + } + ResponseCmndNumber(Settings->influxdb_port); +} + +void CmndInfluxDbUser(void) { + if (XdrvMailbox.data_len > 0) { + Settings->influxdb_version = (XdrvMailbox.command[3] == 'U') ? 1 : 2; // User or Org + SettingsUpdateText(SET_INFLUXDB_ORG, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? PSTR(INFLUXDB_ORG) : XdrvMailbox.data); + InfluxDbReinit(); + } + ResponseCmndChar(SettingsText(SET_INFLUXDB_ORG)); +} + +void CmndInfluxDbPassword(void) { + bool show_asterisk = (2 == XdrvMailbox.index); + if (XdrvMailbox.data_len > 0) { + Settings->influxdb_version = (XdrvMailbox.command[3] == 'P') ? 1 : 2; // Password or Token + SettingsUpdateText(SET_INFLUXDB_TOKEN, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? PSTR(INFLUXDB_TOKEN) : XdrvMailbox.data); + if (!show_asterisk) { + ResponseCmndChar(SettingsText(SET_INFLUXDB_TOKEN)); + } + InfluxDbReinit(); + } else { + show_asterisk = true; + } + if (show_asterisk) { + Response_P(S_JSON_COMMAND_ASTERISK, XdrvMailbox.command); + } +} + +void CmndInfluxDbDatabase(void) { + if (XdrvMailbox.data_len > 0) { + Settings->influxdb_version = (XdrvMailbox.command[3] == 'D') ? 1 : 2; // Database or Bucket + SettingsUpdateText(SET_INFLUXDB_BUCKET, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? PSTR(INFLUXDB_BUCKET) : XdrvMailbox.data); + InfluxDbReinit(); + } + ResponseCmndChar(SettingsText(SET_INFLUXDB_BUCKET)); +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns90(uint8_t function) { + bool result = false; + + if (!Settings->sbflag1.influxdb_default) { + Settings->influxdb_version = INFLUXDB_VERSION; + Settings->influxdb_port = INFLUXDB_PORT; + SettingsUpdateText(SET_INFLUXDB_HOST, PSTR(INFLUXDB_HOST)); + SettingsUpdateText(SET_INFLUXDB_ORG, PSTR(INFLUXDB_ORG)); + SettingsUpdateText(SET_INFLUXDB_TOKEN, PSTR(INFLUXDB_TOKEN)); + SettingsUpdateText(SET_INFLUXDB_BUCKET, PSTR(INFLUXDB_BUCKET)); + Settings->sbflag1.influxdb_default = 1; + } + + switch (function) { + case FUNC_EVERY_SECOND: + if (IFDB.interval) { + IFDB.interval--; + if (0 == IFDB.interval || IFDB.interval > Settings->tele_period) { + IFDB.interval = Settings->tele_period; + InfluxDbLoop(); + } + } + break; + case FUNC_COMMAND: + result = DecodeCommand(kInfluxDbCommands, InfluxCommand); + break; + } + return result; +} + +#endif // USE_INFLUXDB From cdb35ecaded9d5fdf684c96a75e0228bf84b64c5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 12 Aug 2021 22:43:53 +0200 Subject: [PATCH 132/148] Update feature list --- tasmota/support_features.ino | 4 +++- tools/decode-status.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index eee70f96d..a73b9d9d9 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -759,7 +759,9 @@ void ResponseAppendFeatures(void) #ifdef USE_WIFI_RANGE_EXTENDER feature8 |= 0x00000400; // xdrv_58_range_extender.ino #endif -// feature8 |= 0x00000800; +#ifdef USE_INFLUXDB + feature8 |= 0x00000800; // xsns_90_influxdb.ino +#endif // feature8 |= 0x00001000; // feature8 |= 0x00002000; diff --git a/tools/decode-status.py b/tools/decode-status.py index 32a340059..b2f54a711 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -255,7 +255,7 @@ a_features = [[ ],[ "USE_MPU_ACCEL","USE_TFMINIPLUS","USE_CSE7761","USE_BERRY", "USE_BM8563","USE_ENERGY_DUMMY","USE_AM2320","USE_T67XX", - "USE_MCP2515","USE_TASMESH","USE_WIFI_RANGE_EXTENDER","", + "USE_MCP2515","USE_TASMESH","USE_WIFI_RANGE_EXTENDER","USE_INFLUXDB", "","","","", "","","","", "","","","", @@ -288,7 +288,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20210802 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v20210812 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 20d88f3d683b141092178c2df1fe7cd9adca6386 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 13 Aug 2021 13:55:57 +0200 Subject: [PATCH 133/148] Fix mangled first sensor name --- tasmota/xsns_90_influxdb.ino | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tasmota/xsns_90_influxdb.ino b/tasmota/xsns_90_influxdb.ino index cddceb9f9..34992b337 100644 --- a/tasmota/xsns_90_influxdb.ino +++ b/tasmota/xsns_90_influxdb.ino @@ -156,10 +156,10 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { if (IFDB._lastStatusCode != expectedStatusCode) { if (IFDB._lastStatusCode > 0) { IFDB._lastErrorResponse = IFDBhttpClient->getString(); - AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Response\n%s"), IFDB._lastErrorResponse.c_str()); + AddLog(LOG_LEVEL_INFO, PSTR("IFX: Response %s"), IFDB._lastErrorResponse.c_str()); // {"error":"database not found: \"db\""} } else { IFDB._lastErrorResponse = IFDBhttpClient->errorToString(IFDB._lastStatusCode); - AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); + AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); } } } @@ -177,7 +177,7 @@ bool InfluxDbValidateConnection(void) { } // on version 1.8.9 /health works fine // String url = IFDB._serverUrl + "/health"; - AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Validating connection to %s"), url.c_str()); + AddLog(LOG_LEVEL_INFO, PSTR("IFX: Validating connection to %s"), url.c_str()); if (!IFDBhttpClient->begin(*IFDBwifiClient, url)) { AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Begin failed")); @@ -231,6 +231,8 @@ void InfluxDbMetrics(void) { char sensor[64]; // 'ds18b20' char type[64]; // 'temperature' char sensor_id[32]; // ',id=01144A0CB2AA' + sensor_id[0] = '\0'; + String data = ""; // Multiple linebufs for (auto key1 : root) { @@ -261,6 +263,8 @@ void InfluxDbMetrics(void) { LowerCase(sensor, key1.getStr()); LowerCase(type, key2.getStr()); +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); + if (strcmp(type, "totalstarttime") != 0) { // Not needed/wanted if (strcmp(type, "id") == 0) { // Index for DS18B20 snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); From bde66e18c5cd962e37799781868fce9fa65aab0b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 13 Aug 2021 16:35:24 +0200 Subject: [PATCH 134/148] Fix influxdb parameter init --- tasmota/support.ino | 2 +- tasmota/xsns_90_influxdb.ino | 160 +++++++++++++++++++++-------------- 2 files changed, 99 insertions(+), 63 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index a7fb0975c..5cce1d4d8 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -964,7 +964,7 @@ const uint8_t sNumbers[] PROGMEM = { 0,0,0,0,0,0,0, 4,4, 255 }; -int GetStateNumber(char *state_text) +int GetStateNumber(const char *state_text) { char command[CMDSZ]; int state_number = GetCommandCode(command, sizeof(command), state_text, kOptions); diff --git a/tasmota/xsns_90_influxdb.ino b/tasmota/xsns_90_influxdb.ino index 34992b337..5602f90cf 100644 --- a/tasmota/xsns_90_influxdb.ino +++ b/tasmota/xsns_90_influxdb.ino @@ -95,18 +95,18 @@ String InfluxDbAuth(void) { return auth; } -bool InfluxDbInit(void) { - IFDB._serverUrl = "http://"; - IFDB._serverUrl += SettingsText(SET_INFLUXDB_HOST); - IFDB._serverUrl += ":"; - IFDB._serverUrl += Settings->influxdb_port; - if (IFDB._serverUrl.length() == 0 || +bool InfluxDbParameterInit(void) { + if (strlen(SettingsText(SET_INFLUXDB_BUCKET)) == 0 || (2 == Settings->influxdb_version && (strlen(SettingsText(SET_INFLUXDB_ORG)) == 0 || - strlen(SettingsText(SET_INFLUXDB_BUCKET)) == 0 || strlen(SettingsText(SET_INFLUXDB_TOKEN)) == 0))) { AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Invalid parameters")); return false; } + IFDB._serverUrl = "http://"; + IFDB._serverUrl += SettingsText(SET_INFLUXDB_HOST); + IFDB._serverUrl += ":"; + IFDB._serverUrl += Settings->influxdb_port; + IFDB._writeUrl = IFDB._serverUrl; if (2 == Settings->influxdb_version) { IFDB._writeUrl += "/api/v2/write?org="; @@ -118,8 +118,12 @@ bool InfluxDbInit(void) { IFDB._writeUrl += UrlEncode(SettingsText(SET_INFLUXDB_BUCKET)); IFDB._writeUrl += InfluxDbAuth(); } -// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Url %s"), IFDB._writeUrl.c_str()); + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Url %s"), IFDB._writeUrl.c_str()); + return true; +} + +bool InfluxDbInit(void) { IFDBwifiClient = new WiFiClient; if (!IFDBhttpClient) { IFDBhttpClient = new HTTPClient; @@ -156,7 +160,7 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { if (IFDB._lastStatusCode != expectedStatusCode) { if (IFDB._lastStatusCode > 0) { IFDB._lastErrorResponse = IFDBhttpClient->getString(); - AddLog(LOG_LEVEL_INFO, PSTR("IFX: Response %s"), IFDB._lastErrorResponse.c_str()); // {"error":"database not found: \"db\""} + AddLog(LOG_LEVEL_INFO, PSTR("IFX: %s"), IFDB._lastErrorResponse.c_str()); // {"error":"database not found: \"db\""} } else { IFDB._lastErrorResponse = IFDBhttpClient->errorToString(IFDB._lastStatusCode); AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); @@ -217,16 +221,26 @@ int InfluxDbPostData(const char *data) { /*********************************************************************************************/ -void InfluxDbMetrics(void) { - ResponseClear(); - if (!MqttShowSensor()) { return; }; // Pull sensor data +char* InfluxDbMakeNumber(char* dest, const char* source) { + // Convert special text as found in kOptions to a number + // Like "OFF" -> 0, "ON" -> 1, "TOGGLE" -> 2 + int number = GetStateNumber(source); + if (number >= 0) { + itoa(number, dest, 10); + return dest; + } + return (char*)source; +} -// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Metrics %s"), TasmotaGlobal.mqtt_data.c_str()); +void InfluxDbProcessJson(void) { + +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), TasmotaGlobal.mqtt_data.c_str()); String jsonStr = TasmotaGlobal.mqtt_data; JsonParser parser((char *)jsonStr.c_str()); JsonParserObject root = parser.getRootObject(); if (root) { + char number[32]; char linebuf[128]; // 'temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=26.44\n' char sensor[64]; // 'ds18b20' char type[64]; // 'temperature' @@ -245,65 +259,81 @@ void InfluxDbMetrics(void) { JsonParserObject Object3 = value2.getObject(); for (auto key3 : Object3) { const char *value = key3.getValue().getStr(); - if (value != nullptr && isdigit(value[0])) { - // Level 3 - LowerCase(sensor, key2.getStr()); - LowerCase(type, key3.getStr()); - // temperature,device=tasmota1,sensor=DS18B20 value=24.44 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s value=%s\n"), - type, TasmotaGlobal.mqtt_topic, sensor, value); - data += linebuf; + if (value != nullptr) { + value = InfluxDbMakeNumber(number, value); + if (isdigit(value[0])) { + // Level 3 + LowerCase(sensor, key2.getStr()); + LowerCase(type, key3.getStr()); + // temperature,device=tasmota1,sensor=DS18B20 value=24.44 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, value); + data += linebuf; + } } } } else { // Level 2 + // { ... "ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":24.88},"HTU21":{"Temperature":25.32,"Humidity":49.2,"DewPoint":13.88},"Global":{"Temperature":24.88,"Humidity":49.2,"DewPoint":13.47}, ... } bool isarray = value2.isArray(); const char *value = (isarray) ? (value2.getArray())[0].getStr() : value2.getStr(); - if (value != nullptr && isdigit(value[0])) { - LowerCase(sensor, key1.getStr()); - LowerCase(type, key2.getStr()); + if (value != nullptr) { + value = InfluxDbMakeNumber(number, value); + if (isdigit(value[0])) { + LowerCase(sensor, key1.getStr()); + LowerCase(type, key2.getStr()); -// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); + // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); - if (strcmp(type, "totalstarttime") != 0) { // Not needed/wanted - if (strcmp(type, "id") == 0) { // Index for DS18B20 - snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); - } else { - if (isarray) { - JsonParserArray arr = value2.getArray(); - uint32_t i = 0; - for (auto val : arr) { - i++; - // power1,device=shelly25,sensor=energy value=0.00 - // power2,device=shelly25,sensor=energy value=4.12 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), - type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); + if (strcmp(type, "totalstarttime") != 0) { // Not needed/wanted + if (strcmp(type, "id") == 0) { // Index for DS18B20 + snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); + } else { + if (isarray) { + JsonParserArray arr = value2.getArray(); + uint32_t i = 0; + for (auto val : arr) { + i++; + // power1,device=shelly25,sensor=energy value=0.00 + // power2,device=shelly25,sensor=energy value=4.12 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), + type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); + data += linebuf; + } + } else { + // temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=22.63 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); data += linebuf; } - } else { - // temperature,device=Wemos10,sensor=ds18b20,id=01144A0CB2AA value=22.63 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), - type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); - data += linebuf; + sensor_id[0] = '\0'; } - sensor_id[0] = '\0'; } } } } } -/* } else { // Level 1 + // {"Time":"2021-08-13T14:15:56","Switch1":"ON","Switch2":"OFF", ... "TempUnit":"C"} const char *value = value1.getStr(); - LowerCase(sensor, key1.getStr()); + if (value != nullptr) { + value = InfluxDbMakeNumber(number, value); + if (isdigit(value[0])) { + LowerCase(type, key1.getStr()); - // time,device=Wemos10 value=2021-08-11T09:46:29 - // tempunit,device=Wemos10 value=C - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s value=%s\n"), - sensor, TasmotaGlobal.mqtt_topic, value); - data += linebuf; -*/ + if (!((strcasecmp_P(type, PSTR(D_JSON_TIME)) == 0) || // No time,device=demo value=2021-08-11T09:46:29 + (strcasecmp_P(type, PSTR(D_JSON_TEMPERATURE_UNIT)) == 0) || // No tempunit,device=demo value=C + (strcasecmp_P(type, PSTR(D_JSON_PRESSURE_UNIT)) == 0) || + (strcasecmp_P(type, PSTR(D_JSON_SPEED_UNIT)) == 0) + )) { + // switch1,device=demo value=1 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, value); + data += linebuf; + } + } + } } } if (data.length() > 0 ) { @@ -314,10 +344,22 @@ void InfluxDbMetrics(void) { } void InfluxDbLoop(void) { - if (!IFDB.init) { - IFDB.init = InfluxDbValidateConnection(); + if (IFDB.interval) { + IFDB.interval--; + if (0 == IFDB.interval || IFDB.interval > Settings->tele_period) { + IFDB.interval = Settings->tele_period; + if (!IFDB.init) { + if (InfluxDbParameterInit()) { + IFDB.init = InfluxDbValidateConnection(); + } + } + + ResponseClear(); + if (MqttShowSensor()) { // Pull sensor data + InfluxDbProcessJson(); + }; + } } - InfluxDbMetrics(); } /*********************************************************************************************\ @@ -435,13 +477,7 @@ bool Xsns90(uint8_t function) { switch (function) { case FUNC_EVERY_SECOND: - if (IFDB.interval) { - IFDB.interval--; - if (0 == IFDB.interval || IFDB.interval > Settings->tele_period) { - IFDB.interval = Settings->tele_period; - InfluxDbLoop(); - } - } + InfluxDbLoop(); break; case FUNC_COMMAND: result = DecodeCommand(kInfluxDbCommands, InfluxCommand); From 05d0507104c9c83191e88ac87171589a559f0ba7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 13 Aug 2021 17:46:06 +0200 Subject: [PATCH 135/148] Add influxdb power state info --- tasmota/xdrv_02_9_mqtt.ino | 5 +++++ tasmota/xsns_90_influxdb.ino | 29 +++++++++++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino index bb8cdf8b8..7268d6941 100644 --- a/tasmota/xdrv_02_9_mqtt.ino +++ b/tasmota/xdrv_02_9_mqtt.ino @@ -817,6 +817,11 @@ void MqttPublishPowerState(uint32_t device) { Response_P(GetStateText(bitRead(TasmotaGlobal.power, device -1))); MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN } + +#ifdef USE_INFLUXDB + InfluxDbPublishPowerState(device); +#endif + #ifdef USE_SONOFF_IFAN } #endif // USE_SONOFF_IFAN diff --git a/tasmota/xsns_90_influxdb.ino b/tasmota/xsns_90_influxdb.ino index 5602f90cf..86827b3a6 100644 --- a/tasmota/xsns_90_influxdb.ino +++ b/tasmota/xsns_90_influxdb.ino @@ -43,7 +43,7 @@ #define XSNS_90 90 -#define INFLUXDB_INITIAL 12 // Initial number of seconds after restart keeping in mind sensor initialization +#define INFLUXDB_INITIAL 7 // Initial number of seconds after wifi connect keeping in mind sensor initialization #ifndef INFLUXDB_VERSION #define INFLUXDB_VERSION 1 // Version of Influxdb 1 or 2 @@ -76,8 +76,8 @@ struct { String _serverUrl; // Connection info String _writeUrl; // Cached full write url String _lastErrorResponse; // Server reponse or library error message for last failed request - uint32_t interval = INFLUXDB_INITIAL; uint32_t _lastRequestTime = 0; // Last time in ms we made are a request to server + int interval = 0; int _lastStatusCode = 0; // HTTP status code of last request to server int _lastRetryAfter = 0; // Store retry timeout suggested by server after last request bool _connectionReuse; // true if HTTP connection should be kept open. Usable for frequent writes. Default false @@ -233,6 +233,7 @@ char* InfluxDbMakeNumber(char* dest, const char* source) { } void InfluxDbProcessJson(void) { + if (!IFDB.init) { return; } // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), TasmotaGlobal.mqtt_data.c_str()); @@ -328,7 +329,7 @@ void InfluxDbProcessJson(void) { (strcasecmp_P(type, PSTR(D_JSON_SPEED_UNIT)) == 0) )) { // switch1,device=demo value=1 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s value=%s\n"), + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=device value=%s\n"), type, TasmotaGlobal.mqtt_topic, value); data += linebuf; } @@ -343,21 +344,29 @@ void InfluxDbProcessJson(void) { } } +void InfluxDbPublishPowerState(uint32_t device) { + Response_P(PSTR("{\"power%d\":\"%d\"}"), device, bitRead(TasmotaGlobal.power, device -1)); + InfluxDbProcessJson(); +} + void InfluxDbLoop(void) { - if (IFDB.interval) { + if (!TasmotaGlobal.global_state.network_down) { IFDB.interval--; - if (0 == IFDB.interval || IFDB.interval > Settings->tele_period) { + if (IFDB.interval <= 0 || IFDB.interval > Settings->tele_period) { IFDB.interval = Settings->tele_period; if (!IFDB.init) { if (InfluxDbParameterInit()) { IFDB.init = InfluxDbValidateConnection(); + if (IFDB.init) { + IFDB.interval = INFLUXDB_INITIAL; + } } + } else { + ResponseClear(); + if (MqttShowSensor()) { // Pull sensor data + InfluxDbProcessJson(); + }; } - - ResponseClear(); - if (MqttShowSensor()) { // Pull sensor data - InfluxDbProcessJson(); - }; } } } From d0d0d11b155eada747b0da100e091847379d55e4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:43:31 +0200 Subject: [PATCH 136/148] Move influxdb support from sensor to driver --- tasmota/my_user_config.h | 1 + tasmota/settings.h | 4 +- tasmota/support_features.ino | 2 +- ...s_90_influxdb.ino => xdrv_59_influxdb.ino} | 58 +++++++++++-------- 4 files changed, 39 insertions(+), 26 deletions(-) rename tasmota/{xsns_90_influxdb.ino => xdrv_59_influxdb.ino} (91%) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 93a72de70..3e3004ab0 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -392,6 +392,7 @@ // -- Influxdb ------------------------------------ //#define USE_INFLUXDB // Enable influxdb support (+5k code) +// #define INFLUXDB_STATE 0 // [Ifx] Influxdb initially Off (0) or On (1) // #define INFLUXDB_VERSION 1 // Version of Influxdb 1 or 2 // #define INFLUXDB_HOST "influxdb" // [IfxHost] Influxdb hostname or IP address // #define INFLUXDB_PORT 8086 // [IfxPort] Influxdb port number diff --git a/tasmota/settings.h b/tasmota/settings.h index a931c9132..213826be8 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -248,8 +248,8 @@ typedef union { uint32_t range_extender : 1; // bit 3 (v9.5.0.5) - CMND_RGXSTATE - Enable range extender uint32_t range_extender_napt : 1; // bit 4 (v9.5.0.5) - CMND_RGXNAPT - Enable range extender NAPT uint32_t sonoff_l1_music_sync : 1; // bit 5 (v9.5.0.5) - CMND_L1MUSICSYNC - Enable sync to music - uint32_t influxdb_default : 1; // bit 6 (v9.5.0.5) - Set initial defaults if 0 - uint32_t spare07 : 1; // bit 7 + uint32_t influxdb_default : 1; // bit 6 (v9.5.0.5) - Set influxdb initial defaults if 0 + uint32_t influxdb_state : 1; // bit 7 (v9.5.0.5) - CMND_IFX - Enable influxdb support uint32_t spare08 : 1; // bit 8 uint32_t spare09 : 1; // bit 9 uint32_t spare10 : 1; // bit 10 diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index a73b9d9d9..ec5bc7bdd 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -760,7 +760,7 @@ void ResponseAppendFeatures(void) feature8 |= 0x00000400; // xdrv_58_range_extender.ino #endif #ifdef USE_INFLUXDB - feature8 |= 0x00000800; // xsns_90_influxdb.ino + feature8 |= 0x00000800; // xdrv_59_influxdb.ino #endif // feature8 |= 0x00001000; diff --git a/tasmota/xsns_90_influxdb.ino b/tasmota/xdrv_59_influxdb.ino similarity index 91% rename from tasmota/xsns_90_influxdb.ino rename to tasmota/xdrv_59_influxdb.ino index 86827b3a6..97506647c 100644 --- a/tasmota/xsns_90_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -1,5 +1,5 @@ /* - xsns_90_influxdb.ino - Influxdb support for Tasmota + xdrv_59_influxdb.ino - Influxdb support for Tasmota Copyright (C) 2021 Theo Arends @@ -28,7 +28,7 @@ * https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_reference/ * * Supported commands: - * Ifx - Show current state + * Ifx - Set Influxdb state off (0) or on (1) and show current state * IfxHost - Set Influxdb host name or IP address * IfxPort - Set Influxdb port * IfxDatabase - Set Influxdb v1 and database name @@ -41,10 +41,13 @@ * Set influxdb update interval with command teleperiod \*********************************************************************************************/ -#define XSNS_90 90 +#define XDRV_59 59 #define INFLUXDB_INITIAL 7 // Initial number of seconds after wifi connect keeping in mind sensor initialization +#ifndef INFLUXDB_STATE +#define INFLUXDB_STATE 0 // [Ifx] Influxdb initially Off (0) or On (1) +#endif #ifndef INFLUXDB_VERSION #define INFLUXDB_VERSION 1 // Version of Influxdb 1 or 2 #endif @@ -405,8 +408,14 @@ void InfluxDbReinit(void) { } void CmndInfluxDbState(void) { - Response_P(PSTR("{\"" D_PRFX_INFLUXDB "\":{\"" D_CMND_INFLUXDBHOST "\":\"%s\",\"" D_CMND_INFLUXDBPORT "\":%d,\"Version\":%d"), - SettingsText(SET_INFLUXDB_HOST), Settings->influxdb_port, Settings->influxdb_version); + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + if (Settings->sbflag1.influxdb_state != XdrvMailbox.payload) { + Settings->sbflag1.influxdb_state = XdrvMailbox.payload; + InfluxDbReinit(); + } + } + Response_P(PSTR("{\"" D_PRFX_INFLUXDB "\":{\"State\":\"%s\",\"" D_CMND_INFLUXDBHOST "\":\"%s\",\"" D_CMND_INFLUXDBPORT "\":%d,\"Version\":%d"), + GetStateText(Settings->sbflag1.influxdb_state), SettingsText(SET_INFLUXDB_HOST), Settings->influxdb_port, Settings->influxdb_version); if (1 == Settings->influxdb_version) { ResponseAppend_P(PSTR(",\"" D_CMND_INFLUXDBDATABASE "\":\"%s\",\"" D_CMND_INFLUXDBUSER "\":\"%s\"}}"), SettingsText(SET_INFLUXDB_BUCKET), SettingsText(SET_INFLUXDB_ORG)); @@ -471,26 +480,29 @@ void CmndInfluxDbDatabase(void) { * Interface \*********************************************************************************************/ -bool Xsns90(uint8_t function) { +bool Xdrv59(uint8_t function) { bool result = false; - if (!Settings->sbflag1.influxdb_default) { - Settings->influxdb_version = INFLUXDB_VERSION; - Settings->influxdb_port = INFLUXDB_PORT; - SettingsUpdateText(SET_INFLUXDB_HOST, PSTR(INFLUXDB_HOST)); - SettingsUpdateText(SET_INFLUXDB_ORG, PSTR(INFLUXDB_ORG)); - SettingsUpdateText(SET_INFLUXDB_TOKEN, PSTR(INFLUXDB_TOKEN)); - SettingsUpdateText(SET_INFLUXDB_BUCKET, PSTR(INFLUXDB_BUCKET)); - Settings->sbflag1.influxdb_default = 1; - } - - switch (function) { - case FUNC_EVERY_SECOND: - InfluxDbLoop(); - break; - case FUNC_COMMAND: - result = DecodeCommand(kInfluxDbCommands, InfluxCommand); - break; + if (FUNC_PRE_INIT == function) { + // Initial persistent settings executed only once + if (!Settings->sbflag1.influxdb_default) { + Settings->sbflag1.influxdb_state = INFLUXDB_STATE; + Settings->influxdb_version = INFLUXDB_VERSION; + Settings->influxdb_port = INFLUXDB_PORT; + SettingsUpdateText(SET_INFLUXDB_HOST, PSTR(INFLUXDB_HOST)); + SettingsUpdateText(SET_INFLUXDB_ORG, PSTR(INFLUXDB_ORG)); + SettingsUpdateText(SET_INFLUXDB_TOKEN, PSTR(INFLUXDB_TOKEN)); + SettingsUpdateText(SET_INFLUXDB_BUCKET, PSTR(INFLUXDB_BUCKET)); + Settings->sbflag1.influxdb_default = 1; + } + } else if (FUNC_COMMAND == function) { + result = DecodeCommand(kInfluxDbCommands, InfluxCommand); + } else if (Settings->sbflag1.influxdb_state) { + switch (function) { + case FUNC_EVERY_SECOND: + InfluxDbLoop(); + break; + } } return result; } From 0f39fab3ae50bc35e0340f673732fefa7dd22c71 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 Aug 2021 16:28:20 +0200 Subject: [PATCH 137/148] Influxdb add support for negative numbers --- tasmota/support.ino | 6 ++++++ tasmota/xdrv_59_influxdb.ino | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 5cce1d4d8..ebafbe6aa 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -523,6 +523,12 @@ bool StrCaseStr_P(const char* source, const char* search) { return (strstr(case_source, case_search) != nullptr); } +bool IsNumeric(const char* value) { + char *digit = (char*)value; + while (isdigit(*digit) || *digit == '.' || *digit == '-') { digit++; } + return (*digit == '\0'); +} + char* Trim(char* p) { if (*p != '\0') { diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 97506647c..15378041a 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -87,6 +87,10 @@ struct { bool init = false; } IFDB; +/*********************************************************************************************\ + * Influxdb library function +\*********************************************************************************************/ + String InfluxDbAuth(void) { String auth = ""; if (strlen(SettingsText(SET_INFLUXDB_ORG)) > 0 && strlen(SettingsText(SET_INFLUXDB_TOKEN)) > 0) { @@ -222,7 +226,9 @@ int InfluxDbPostData(const char *data) { return IFDB._lastStatusCode; } -/*********************************************************************************************/ +/*********************************************************************************************\ + * Data preparation +\*********************************************************************************************/ char* InfluxDbMakeNumber(char* dest, const char* source) { // Convert special text as found in kOptions to a number @@ -265,7 +271,7 @@ void InfluxDbProcessJson(void) { const char *value = key3.getValue().getStr(); if (value != nullptr) { value = InfluxDbMakeNumber(number, value); - if (isdigit(value[0])) { + if (IsNumeric(value)) { // Level 3 LowerCase(sensor, key2.getStr()); LowerCase(type, key3.getStr()); @@ -283,7 +289,7 @@ void InfluxDbProcessJson(void) { const char *value = (isarray) ? (value2.getArray())[0].getStr() : value2.getStr(); if (value != nullptr) { value = InfluxDbMakeNumber(number, value); - if (isdigit(value[0])) { + if (IsNumeric(value)) { LowerCase(sensor, key1.getStr()); LowerCase(type, key2.getStr()); @@ -323,7 +329,7 @@ void InfluxDbProcessJson(void) { const char *value = value1.getStr(); if (value != nullptr) { value = InfluxDbMakeNumber(number, value); - if (isdigit(value[0])) { + if (IsNumeric(value)) { LowerCase(type, key1.getStr()); if (!((strcasecmp_P(type, PSTR(D_JSON_TIME)) == 0) || // No time,device=demo value=2021-08-11T09:46:29 From 64c527e3c35c86c6c2c7c12d6b34c2efc730d247 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 Aug 2021 17:03:05 +0200 Subject: [PATCH 138/148] InfluxDb allow all numeric data --- tasmota/xdrv_59_influxdb.ino | 118 ++++++++++++++++------------------- 1 file changed, 54 insertions(+), 64 deletions(-) diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 15378041a..201b76c3b 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -230,15 +230,22 @@ int InfluxDbPostData(const char *data) { * Data preparation \*********************************************************************************************/ -char* InfluxDbMakeNumber(char* dest, const char* source) { - // Convert special text as found in kOptions to a number - // Like "OFF" -> 0, "ON" -> 1, "TOGGLE" -> 2 - int number = GetStateNumber(source); - if (number >= 0) { - itoa(number, dest, 10); - return dest; +char* InfluxDbNumber(char* alternative, const char* source) { + // Test for valid numeric data ('-.0123456789') or ON, OFF etc. as defined in kOptions + if (source != nullptr) { + char* out = (char*)source; + // Convert special text as found in kOptions to a number + // Like "OFF" -> 0, "ON" -> 1, "TOGGLE" -> 2 + int number = GetStateNumber(source); + if (number >= 0) { + itoa(number, alternative, 10); + out = alternative; + } + if (IsNumeric(out)) { + return out; + } } - return (char*)source; + return nullptr; } void InfluxDbProcessJson(void) { @@ -250,7 +257,7 @@ void InfluxDbProcessJson(void) { JsonParser parser((char *)jsonStr.c_str()); JsonParserObject root = parser.getRootObject(); if (root) { - char number[32]; + char number[12]; // '1' to '255' char linebuf[128]; // 'temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=26.44\n' char sensor[64]; // 'ds18b20' char type[64]; // 'temperature' @@ -268,57 +275,49 @@ void InfluxDbProcessJson(void) { if (value2.isObject()) { JsonParserObject Object3 = value2.getObject(); for (auto key3 : Object3) { - const char *value = key3.getValue().getStr(); + const char* value = InfluxDbNumber(number, key3.getValue().getStr()); if (value != nullptr) { - value = InfluxDbMakeNumber(number, value); - if (IsNumeric(value)) { - // Level 3 - LowerCase(sensor, key2.getStr()); - LowerCase(type, key3.getStr()); - // temperature,device=tasmota1,sensor=DS18B20 value=24.44 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s value=%s\n"), - type, TasmotaGlobal.mqtt_topic, sensor, value); - data += linebuf; - } + // Level 3 + LowerCase(sensor, key2.getStr()); + LowerCase(type, key3.getStr()); + // temperature,device=tasmota1,sensor=DS18B20 value=24.44 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, value); + data += linebuf; } } } else { // Level 2 // { ... "ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":24.88},"HTU21":{"Temperature":25.32,"Humidity":49.2,"DewPoint":13.88},"Global":{"Temperature":24.88,"Humidity":49.2,"DewPoint":13.47}, ... } bool isarray = value2.isArray(); - const char *value = (isarray) ? (value2.getArray())[0].getStr() : value2.getStr(); + const char* value = InfluxDbNumber(number, (isarray) ? (value2.getArray())[0].getStr() : value2.getStr()); if (value != nullptr) { - value = InfluxDbMakeNumber(number, value); - if (IsNumeric(value)) { - LowerCase(sensor, key1.getStr()); - LowerCase(type, key2.getStr()); + LowerCase(sensor, key1.getStr()); + LowerCase(type, key2.getStr()); - // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); - if (strcmp(type, "totalstarttime") != 0) { // Not needed/wanted - if (strcmp(type, "id") == 0) { // Index for DS18B20 - snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); - } else { - if (isarray) { - JsonParserArray arr = value2.getArray(); - uint32_t i = 0; - for (auto val : arr) { - i++; - // power1,device=shelly25,sensor=energy value=0.00 - // power2,device=shelly25,sensor=energy value=4.12 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), - type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); - data += linebuf; - } - } else { - // temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=22.63 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), - type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); - data += linebuf; - } - sensor_id[0] = '\0'; + if (strcmp(type, "id") == 0) { // Index for DS18B20 + snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); + } else { + if (isarray) { + JsonParserArray arr = value2.getArray(); + uint32_t i = 0; + for (auto val : arr) { + i++; + // power1,device=shelly25,sensor=energy value=0.00 + // power2,device=shelly25,sensor=energy value=4.12 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), + type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); + data += linebuf; } + } else { + // temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=22.63 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); + data += linebuf; } + sensor_id[0] = '\0'; } } } @@ -326,23 +325,14 @@ void InfluxDbProcessJson(void) { } else { // Level 1 // {"Time":"2021-08-13T14:15:56","Switch1":"ON","Switch2":"OFF", ... "TempUnit":"C"} - const char *value = value1.getStr(); + const char* value = InfluxDbNumber(number, value1.getStr()); if (value != nullptr) { - value = InfluxDbMakeNumber(number, value); - if (IsNumeric(value)) { - LowerCase(type, key1.getStr()); - - if (!((strcasecmp_P(type, PSTR(D_JSON_TIME)) == 0) || // No time,device=demo value=2021-08-11T09:46:29 - (strcasecmp_P(type, PSTR(D_JSON_TEMPERATURE_UNIT)) == 0) || // No tempunit,device=demo value=C - (strcasecmp_P(type, PSTR(D_JSON_PRESSURE_UNIT)) == 0) || - (strcasecmp_P(type, PSTR(D_JSON_SPEED_UNIT)) == 0) - )) { - // switch1,device=demo value=1 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=device value=%s\n"), - type, TasmotaGlobal.mqtt_topic, value); - data += linebuf; - } - } + LowerCase(type, key1.getStr()); + // switch1,device=demo,sensor=device value=0 + // power1,device=demo,sensor=device value=1 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=device value=%s\n"), + type, TasmotaGlobal.mqtt_topic, value); + data += linebuf; } } } From 59a13644b9cccab36d10e88af4cecf98fd2a1f5c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 Aug 2021 17:35:31 +0200 Subject: [PATCH 139/148] Show power status in state message always with power index number like ``POWER1`` Add state information to influxdb --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/support_tasmota.ino | 2 +- tasmota/xdrv_59_influxdb.ino | 13 +++++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2776016c..d1b44f07d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. - Prometheus: All metrics are prefixed with ``tasmota_`` (#12842) Memory metrics have been cleaned up to work consistently between ESP8266 and ESP32 The device name is reported as an info metric +- Show power status in state message always with power index number like ``POWER1`` ### Fixed - Neopool communication error (#12813) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7d4304165..c3cc5e998 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -133,6 +133,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Disable PSRAM on unsupported hardware - ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support - Relax NTP poll if no ntpserver can be resolved by DNS +- Show power status in state message always with power index number like ``POWER1`` - Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008) - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 22bb3a136..d45a9bf3d 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -753,7 +753,7 @@ void MqttShowState(void) if (i == LightDevice()) { ResponseLightState(1); } // call it only once } else { #endif - ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), Settings->flag.device_index_enable), // SetOption26 - Switch between POWER or POWER1 + ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), 1), // SetOption26 - Switch between POWER or POWER1 GetStateText(bitRead(TasmotaGlobal.power, i-1))); #ifdef USE_SONOFF_IFAN if (IsModuleIfan()) { diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 201b76c3b..6890995d7 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -39,6 +39,11 @@ * IfxToken - Set Influxdb v2 and token * * Set influxdb update interval with command teleperiod + * + * The following triggers result in automatic influxdb numeric feeds without appended time: + * - this driver initiated state message + * - this driver initiated teleperiod data + * - power commands \*********************************************************************************************/ #define XDRV_59 59 @@ -361,10 +366,18 @@ void InfluxDbLoop(void) { } } } else { + + // {"Time":"2021-08-14T17:19:33","Uptime":"0T00:24:09","UptimeSec":1449,"Heap":29,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER1":"ON","Wifi":{"AP":1,"SSId":"indebuurt_IoT","BSSId":"98:38:C9:CA:17:C1","Channel":11,"Mode":"11n","RSSI":100,"Signal":-44,"LinkCount":1,"Downtime":"0T00:00:03"}} + ResponseClear(); + MqttShowState(); // Pull state data + InfluxDbProcessJson(); + + // {"Time":"2021-08-14T17:19:33","Switch1":"ON","Switch2":"OFF","ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":27.50},"HTU21":{"Temperature":28.23,"Humidity":39.7,"DewPoint":13.20},"Global":{"Temperature":27.50,"Humidity":39.7,"DewPoint":12.55},"TempUnit":"C"} ResponseClear(); if (MqttShowSensor()) { // Pull sensor data InfluxDbProcessJson(); }; + } } } From 3c964504b68d7fb6d367e1cb1d60ff771d651d7b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 Aug 2021 17:40:03 +0200 Subject: [PATCH 140/148] Revert "Show power status in state message always with power index number like ``POWER1``" This reverts commit 59a13644b9cccab36d10e88af4cecf98fd2a1f5c. --- CHANGELOG.md | 1 - RELEASENOTES.md | 1 - tasmota/support_tasmota.ino | 2 +- tasmota/xdrv_59_influxdb.ino | 13 ------------- 4 files changed, 1 insertion(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1b44f07d..b2776016c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,6 @@ All notable changes to this project will be documented in this file. - Prometheus: All metrics are prefixed with ``tasmota_`` (#12842) Memory metrics have been cleaned up to work consistently between ESP8266 and ESP32 The device name is reported as an info metric -- Show power status in state message always with power index number like ``POWER1`` ### Fixed - Neopool communication error (#12813) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c3cc5e998..7d4304165 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -133,7 +133,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Disable PSRAM on unsupported hardware - ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support - Relax NTP poll if no ntpserver can be resolved by DNS -- Show power status in state message always with power index number like ``POWER1`` - Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008) - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index d45a9bf3d..22bb3a136 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -753,7 +753,7 @@ void MqttShowState(void) if (i == LightDevice()) { ResponseLightState(1); } // call it only once } else { #endif - ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), 1), // SetOption26 - Switch between POWER or POWER1 + ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), Settings->flag.device_index_enable), // SetOption26 - Switch between POWER or POWER1 GetStateText(bitRead(TasmotaGlobal.power, i-1))); #ifdef USE_SONOFF_IFAN if (IsModuleIfan()) { diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 6890995d7..201b76c3b 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -39,11 +39,6 @@ * IfxToken - Set Influxdb v2 and token * * Set influxdb update interval with command teleperiod - * - * The following triggers result in automatic influxdb numeric feeds without appended time: - * - this driver initiated state message - * - this driver initiated teleperiod data - * - power commands \*********************************************************************************************/ #define XDRV_59 59 @@ -366,18 +361,10 @@ void InfluxDbLoop(void) { } } } else { - - // {"Time":"2021-08-14T17:19:33","Uptime":"0T00:24:09","UptimeSec":1449,"Heap":29,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER1":"ON","Wifi":{"AP":1,"SSId":"indebuurt_IoT","BSSId":"98:38:C9:CA:17:C1","Channel":11,"Mode":"11n","RSSI":100,"Signal":-44,"LinkCount":1,"Downtime":"0T00:00:03"}} - ResponseClear(); - MqttShowState(); // Pull state data - InfluxDbProcessJson(); - - // {"Time":"2021-08-14T17:19:33","Switch1":"ON","Switch2":"OFF","ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":27.50},"HTU21":{"Temperature":28.23,"Humidity":39.7,"DewPoint":13.20},"Global":{"Temperature":27.50,"Humidity":39.7,"DewPoint":12.55},"TempUnit":"C"} ResponseClear(); if (MqttShowSensor()) { // Pull sensor data InfluxDbProcessJson(); }; - } } } From 52b8e507e921ec441598b3e0492ce419bdc08f25 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 Aug 2021 17:44:37 +0200 Subject: [PATCH 141/148] Add state information to influxdb --- tasmota/xdrv_59_influxdb.ino | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 201b76c3b..07d0c66c8 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -39,6 +39,11 @@ * IfxToken - Set Influxdb v2 and token * * Set influxdb update interval with command teleperiod + * + * The following triggers result in automatic influxdb numeric feeds without appended time: + * - this driver initiated state message + * - this driver initiated teleperiod data + * - power commands \*********************************************************************************************/ #define XDRV_59 59 @@ -361,10 +366,21 @@ void InfluxDbLoop(void) { } } } else { + + // {"Time":"2021-08-14T17:19:33","Uptime":"0T00:24:09","UptimeSec":1449,"Heap":29,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER1":"ON","Wifi":{"AP":1,"SSId":"indebuurt_IoT","BSSId":"98:38:C9:CA:17:C1","Channel":11,"Mode":"11n","RSSI":100,"Signal":-44,"LinkCount":1,"Downtime":"0T00:00:03"}} + uint32_t backup = Settings->flag.device_index_enable; + Settings->flag.device_index_enable = 1; // Force indexes to power + ResponseClear(); + MqttShowState(); // Pull state data + Settings->flag.device_index_enable = backup; + InfluxDbProcessJson(); + + // {"Time":"2021-08-14T17:19:33","Switch1":"ON","Switch2":"OFF","ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":27.50},"HTU21":{"Temperature":28.23,"Humidity":39.7,"DewPoint":13.20},"Global":{"Temperature":27.50,"Humidity":39.7,"DewPoint":12.55},"TempUnit":"C"} ResponseClear(); if (MqttShowSensor()) { // Pull sensor data InfluxDbProcessJson(); }; + } } } From 996aaf26ccee00782c6076ac3195b1db4c57e6ed Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 Aug 2021 12:59:21 +0200 Subject: [PATCH 142/148] Add command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands (#12828) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/settings.h | 2 +- tasmota/xdrv_01_webserver.ino | 20 +++++++++++++++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2776016c..037d14613 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` (#12813) - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin - Initial support for influxdb using ``#define USE_INFLUXDB`` and several ``Ifx`` commands +- Command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands (#12828) ### Changed - NeoPixelBus library from v2.6.3 to v2.6.7 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7d4304165..9831112fc 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -118,6 +118,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) - Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806) - Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) +- Command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands [#12828](https://github.com/arendst/Tasmota/issues/12828) ### Changed - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware diff --git a/tasmota/settings.h b/tasmota/settings.h index 213826be8..9fb21e886 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -157,7 +157,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t zigbee_hide_bridge_topic : 1; // bit 11 (v9.3.1.1) - SetOption125 - (Zigbee) Hide bridge topic from zigbee topic (use with SetOption89) (1) uint32_t ds18x20_mean : 1; // bit 12 (v9.3.1.2) - SetOption126 - (DS18x20) Enable arithmetic mean over teleperiod for JSON temperature (1) uint32_t wifi_no_sleep : 1; // bit 13 (v9.5.0.2) - SetOption127 - (Wifi) Keep wifi in no-sleep mode, prevents some occasional unresponsiveness - uint32_t spare14 : 1; // bit 14 + uint32_t disable_referer_chk : 1; // bit 14 (v9.5.0.5) - SetOption128 - (Web) Allow access without referer check uint32_t spare15 : 1; // bit 15 uint32_t spare16 : 1; // bit 16 uint32_t spare17 : 1; // bit 17 diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 2b250251f..b514df0f6 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -400,6 +400,9 @@ const uint16_t DNS_PORT = 53; enum HttpOptions {HTTP_OFF, HTTP_USER, HTTP_ADMIN, HTTP_MANAGER, HTTP_MANAGER_RESET_ONLY}; enum WifiTestOptions {WIFI_NOT_TESTING, WIFI_TESTING, WIFI_TEST_FINISHED, WIFI_TEST_FINISHED_BAD}; +const char * headerKeys[] = {"Referer"}; +const size_t numberOfHeaders = 1; + DNSServer *DnsServer; ESP8266WebServer *Webserver; @@ -542,6 +545,9 @@ void StartWebserver(int type, IPAddress ipweb) if (!Web.state) { if (!Webserver) { Webserver = new ESP8266WebServer((HTTP_MANAGER == type || HTTP_MANAGER_RESET_ONLY == type) ? 80 : WEB_PORT); + + Webserver->collectHeaders(headerKeys, numberOfHeaders); + // call `Webserver->on()` on each entry for (uint32_t i=0; irequestAuthentication(); return false; } - return true; + + if(!Settings->flag5.disable_referer_chk) { + String referer = Webserver->header("Referer"); // http://demo/? or http://192.168.2.153/? + referer.toUpperCase(); + String hostname = NetworkHostname(); + hostname.toUpperCase(); + if ((referer.indexOf(hostname) > 0) || (referer.indexOf(NetworkAddress().toString()) > 0)) { + return true; + } + return false; + } else { + return true; + } } #ifdef USE_CORS From 7380f85d8d8ff942cb406860c1b4171af0ad7565 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 Aug 2021 13:04:57 +0200 Subject: [PATCH 143/148] Revert "Add command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands (#12828)" This reverts commit 996aaf26ccee00782c6076ac3195b1db4c57e6ed. --- CHANGELOG.md | 1 - RELEASENOTES.md | 1 - tasmota/settings.h | 2 +- tasmota/xdrv_01_webserver.ino | 20 +------------------- 4 files changed, 2 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 037d14613..b2776016c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,6 @@ All notable changes to this project will be documented in this file. - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` (#12813) - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin - Initial support for influxdb using ``#define USE_INFLUXDB`` and several ``Ifx`` commands -- Command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands (#12828) ### Changed - NeoPixelBus library from v2.6.3 to v2.6.7 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9831112fc..7d4304165 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -118,7 +118,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) - Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806) - Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) -- Command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands [#12828](https://github.com/arendst/Tasmota/issues/12828) ### Changed - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware diff --git a/tasmota/settings.h b/tasmota/settings.h index 9fb21e886..213826be8 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -157,7 +157,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t zigbee_hide_bridge_topic : 1; // bit 11 (v9.3.1.1) - SetOption125 - (Zigbee) Hide bridge topic from zigbee topic (use with SetOption89) (1) uint32_t ds18x20_mean : 1; // bit 12 (v9.3.1.2) - SetOption126 - (DS18x20) Enable arithmetic mean over teleperiod for JSON temperature (1) uint32_t wifi_no_sleep : 1; // bit 13 (v9.5.0.2) - SetOption127 - (Wifi) Keep wifi in no-sleep mode, prevents some occasional unresponsiveness - uint32_t disable_referer_chk : 1; // bit 14 (v9.5.0.5) - SetOption128 - (Web) Allow access without referer check + uint32_t spare14 : 1; // bit 14 uint32_t spare15 : 1; // bit 15 uint32_t spare16 : 1; // bit 16 uint32_t spare17 : 1; // bit 17 diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index b514df0f6..2b250251f 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -400,9 +400,6 @@ const uint16_t DNS_PORT = 53; enum HttpOptions {HTTP_OFF, HTTP_USER, HTTP_ADMIN, HTTP_MANAGER, HTTP_MANAGER_RESET_ONLY}; enum WifiTestOptions {WIFI_NOT_TESTING, WIFI_TESTING, WIFI_TEST_FINISHED, WIFI_TEST_FINISHED_BAD}; -const char * headerKeys[] = {"Referer"}; -const size_t numberOfHeaders = 1; - DNSServer *DnsServer; ESP8266WebServer *Webserver; @@ -545,9 +542,6 @@ void StartWebserver(int type, IPAddress ipweb) if (!Web.state) { if (!Webserver) { Webserver = new ESP8266WebServer((HTTP_MANAGER == type || HTTP_MANAGER_RESET_ONLY == type) ? 80 : WEB_PORT); - - Webserver->collectHeaders(headerKeys, numberOfHeaders); - // call `Webserver->on()` on each entry for (uint32_t i=0; irequestAuthentication(); return false; } - - if(!Settings->flag5.disable_referer_chk) { - String referer = Webserver->header("Referer"); // http://demo/? or http://192.168.2.153/? - referer.toUpperCase(); - String hostname = NetworkHostname(); - hostname.toUpperCase(); - if ((referer.indexOf(hostname) > 0) || (referer.indexOf(NetworkAddress().toString()) > 0)) { - return true; - } - return false; - } else { - return true; - } + return true; } #ifdef USE_CORS From 15312f88290df43888dbf6ac25023c6f238e1b6b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 Aug 2021 13:15:33 +0200 Subject: [PATCH 144/148] Add disabling web referer check default blocking HTTP web commands Add command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands (#12828) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/settings.h | 2 +- tasmota/xdrv_01_webserver.ino | 20 +++++++++++++++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2776016c..037d14613 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` (#12813) - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin - Initial support for influxdb using ``#define USE_INFLUXDB`` and several ``Ifx`` commands +- Command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands (#12828) ### Changed - NeoPixelBus library from v2.6.3 to v2.6.7 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7d4304165..9831112fc 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -118,6 +118,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) - Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806) - Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) +- Command ``SetOption128 1`` disabling web referer check default blocking HTTP web commands [#12828](https://github.com/arendst/Tasmota/issues/12828) ### Changed - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware diff --git a/tasmota/settings.h b/tasmota/settings.h index 213826be8..9fb21e886 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -157,7 +157,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t zigbee_hide_bridge_topic : 1; // bit 11 (v9.3.1.1) - SetOption125 - (Zigbee) Hide bridge topic from zigbee topic (use with SetOption89) (1) uint32_t ds18x20_mean : 1; // bit 12 (v9.3.1.2) - SetOption126 - (DS18x20) Enable arithmetic mean over teleperiod for JSON temperature (1) uint32_t wifi_no_sleep : 1; // bit 13 (v9.5.0.2) - SetOption127 - (Wifi) Keep wifi in no-sleep mode, prevents some occasional unresponsiveness - uint32_t spare14 : 1; // bit 14 + uint32_t disable_referer_chk : 1; // bit 14 (v9.5.0.5) - SetOption128 - (Web) Allow access without referer check uint32_t spare15 : 1; // bit 15 uint32_t spare16 : 1; // bit 16 uint32_t spare17 : 1; // bit 17 diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 2b250251f..8c9fc9945 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -400,6 +400,9 @@ const uint16_t DNS_PORT = 53; enum HttpOptions {HTTP_OFF, HTTP_USER, HTTP_ADMIN, HTTP_MANAGER, HTTP_MANAGER_RESET_ONLY}; enum WifiTestOptions {WIFI_NOT_TESTING, WIFI_TESTING, WIFI_TEST_FINISHED, WIFI_TEST_FINISHED_BAD}; +const char * headerKeys[] = {"Referer"}; +const size_t numberOfHeaders = 1; + DNSServer *DnsServer; ESP8266WebServer *Webserver; @@ -542,6 +545,9 @@ void StartWebserver(int type, IPAddress ipweb) if (!Web.state) { if (!Webserver) { Webserver = new ESP8266WebServer((HTTP_MANAGER == type || HTTP_MANAGER_RESET_ONLY == type) ? 80 : WEB_PORT); + + Webserver->collectHeaders(headerKeys, numberOfHeaders); + // call `Webserver->on()` on each entry for (uint32_t i=0; irequestAuthentication(); return false; } - return true; + + if (!Settings->flag5.disable_referer_chk && !WifiIsInManagerMode()) { + String referer = Webserver->header("Referer"); // http://demo/? or http://192.168.2.153/? + referer.toUpperCase(); + String hostname = NetworkHostname(); + hostname.toUpperCase(); + if ((referer.indexOf(hostname) > 0) || (referer.indexOf(NetworkAddress().toString()) > 0)) { + return true; + } + return false; + } else { + return true; + } } #ifdef USE_CORS From 4ed63354288cb7a689fd793a2b26a523253ef97e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 Aug 2021 15:51:29 +0200 Subject: [PATCH 145/148] Add referer related debug info --- tasmota/xdrv_01_webserver.ino | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 8c9fc9945..d413d5b75 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -400,9 +400,6 @@ const uint16_t DNS_PORT = 53; enum HttpOptions {HTTP_OFF, HTTP_USER, HTTP_ADMIN, HTTP_MANAGER, HTTP_MANAGER_RESET_ONLY}; enum WifiTestOptions {WIFI_NOT_TESTING, WIFI_TESTING, WIFI_TEST_FINISHED, WIFI_TEST_FINISHED_BAD}; -const char * headerKeys[] = {"Referer"}; -const size_t numberOfHeaders = 1; - DNSServer *DnsServer; ESP8266WebServer *Webserver; @@ -546,7 +543,9 @@ void StartWebserver(int type, IPAddress ipweb) if (!Webserver) { Webserver = new ESP8266WebServer((HTTP_MANAGER == type || HTTP_MANAGER_RESET_ONLY == type) ? 80 : WEB_PORT); - Webserver->collectHeaders(headerKeys, numberOfHeaders); + const char* headerkeys[] = { "Referer" }; + size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*); + Webserver->collectHeaders(headerkeys, headerkeyssize); // call `Webserver->on()` on each entry for (uint32_t i=0; iflag5.disable_referer_chk && !WifiIsInManagerMode()) { - String referer = Webserver->header("Referer"); // http://demo/? or http://192.168.2.153/? - referer.toUpperCase(); - String hostname = NetworkHostname(); - hostname.toUpperCase(); - if ((referer.indexOf(hostname) > 0) || (referer.indexOf(NetworkAddress().toString()) > 0)) { - return true; + String referer = Webserver->header(F("Referer")); // http://demo/? or http://192.168.2.153/? + if (referer.length()) { + referer.toUpperCase(); + String hostname = NetworkHostname(); + hostname.toUpperCase(); + if ((referer.indexOf(hostname) == 7) || (referer.indexOf(NetworkAddress().toString()) == 7)) { + return true; + } } + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Referer denied")); return false; } else { return true; From e5e8ef47366f6a49da88533f8c35433e78a259fd Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 Aug 2021 17:08:31 +0200 Subject: [PATCH 146/148] Refactor access TasnotaGlobal.mqtt_data --- tasmota/support.ino | 28 +++++-------- tasmota/support_command.ino | 2 +- tasmota/xdrv_01_webserver.ino | 6 +-- tasmota/xdrv_02_9_mqtt.ino | 40 ++++++------------ tasmota/xdrv_10_rules.ino | 6 +-- tasmota/xdrv_10_scripter.ino | 56 ++++++------------------- tasmota/xdrv_12_home_assistant.ino | 6 +-- tasmota/xdrv_13_display.ino | 21 ++-------- tasmota/xdrv_16_tuyamcu.ino | 6 +-- tasmota/xdrv_23_zigbee_5_converters.ino | 6 +-- tasmota/xdrv_23_zigbee_8_parsers.ino | 6 +-- tasmota/xdrv_23_zigbee_9_serial.ino | 12 +----- tasmota/xdrv_52_3_berry_tasmota.ino | 6 +-- tasmota/xdrv_59_influxdb.ino | 2 +- tasmota/xsns_62_esp32_mi_ble.ino | 24 ++--------- 15 files changed, 55 insertions(+), 172 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index ebafbe6aa..2e17c7915 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1191,6 +1191,14 @@ char* ResponseGetTime(uint32_t format, char* time_str) return time_str; } +char* ResponseData(void) { +#ifdef MQTT_DATA_STRING + return (char*)TasmotaGlobal.mqtt_data.c_str(); +#else + return TasmotaGlobal.mqtt_data; +#endif +} + uint32_t ResponseSize(void) { #ifdef MQTT_DATA_STRING return MAX_LOGSZ; // Arbitratry max length satisfying full log entry @@ -1333,29 +1341,15 @@ int ResponseJsonEndEnd(void) } bool ResponseContains_P(const char* needle) { +/* #ifdef MQTT_DATA_STRING return (strstr_P(TasmotaGlobal.mqtt_data.c_str(), needle) != nullptr); #else return (strstr_P(TasmotaGlobal.mqtt_data, needle) != nullptr); #endif -} - -/* -uint32_t ResponseContains_P(const char* needle) { - const char *tmp; -#ifdef MQTT_DATA_STRING - tmp = TasmotaGlobal.mqtt_data.c_str(); -#else - tmp = TasmotaGlobal.mqtt_data; -#endif - uint32_t count = 0; - while (tmp = strstr_P(tmp, needle)) { - count++; - tmp++; - } - return count; -} */ + return (strstr_P(ResponseData(), needle) != nullptr); +} /*********************************************************************************************\ * GPIO Module and Template management diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 253e5551c..c728c0fb4 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -432,7 +432,7 @@ void CmndStatusResponse(uint32_t index) { all_status = (const char*) nullptr; } else { if (0 == index) { all_status = ""; } - all_status += TasmotaGlobal.mqtt_data; + all_status += ResponseData(); } } else if (index < 99) { diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index d413d5b75..04a403b3f 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2135,11 +2135,7 @@ void HandleOtherConfiguration(void) { WSContentSendStyle(); TemplateJson(); -#ifdef MQTT_DATA_STRING - WSContentSend_P(HTTP_FORM_OTHER, TasmotaGlobal.mqtt_data.c_str(), (USER_MODULE == Settings->module) ? PSTR(" checked disabled") : "", -#else - WSContentSend_P(HTTP_FORM_OTHER, TasmotaGlobal.mqtt_data, (USER_MODULE == Settings->module) ? PSTR(" checked disabled") : "", -#endif + WSContentSend_P(HTTP_FORM_OTHER, ResponseData(), (USER_MODULE == Settings->module) ? PSTR(" checked disabled") : "", (Settings->flag.mqtt_enabled) ? PSTR(" checked") : "", // SetOption3 - Enable MQTT SettingsText(SET_FRIENDLYNAME1), SettingsText(SET_DEVICENAME)); diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino index 7268d6941..78f7c88c1 100644 --- a/tasmota/xdrv_02_9_mqtt.ino +++ b/tasmota/xdrv_02_9_mqtt.ino @@ -670,16 +670,12 @@ void MqttPublishPayload(const char* topic, const char* payload) { } void MqttPublish(const char* topic, bool retained) { - // Publish default TasmotaGlobal.mqtt_data string with optional retained -#ifdef MQTT_DATA_STRING - MqttPublishPayload(topic, TasmotaGlobal.mqtt_data.c_str(), 0, retained); -#else - MqttPublishPayload(topic, TasmotaGlobal.mqtt_data, 0, retained); -#endif + // Publish default ResponseData string with optional retained + MqttPublishPayload(topic, ResponseData(), 0, retained); } void MqttPublish(const char* topic) { - // Publish default TasmotaGlobal.mqtt_data string no retained + // Publish default ResponseData string no retained MqttPublish(topic, false); } @@ -750,40 +746,36 @@ void MqttPublishPayloadPrefixTopicRulesProcess_P(uint32_t prefix, const char* su } void MqttPublishPayloadPrefixTopicRulesProcess_P(uint32_t prefix, const char* subtopic, const char* payload) { - // Publish //> default TasmotaGlobal.mqtt_data string no retained + // Publish //> default ResponseData string no retained // then process rules MqttPublishPayloadPrefixTopicRulesProcess_P(prefix, subtopic, payload, false); } void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic, bool retained) { - // Publish //> default TasmotaGlobal.mqtt_data string with optional retained -#ifdef MQTT_DATA_STRING - MqttPublishPayloadPrefixTopic_P(prefix, subtopic, TasmotaGlobal.mqtt_data.c_str(), 0, retained); -#else - MqttPublishPayloadPrefixTopic_P(prefix, subtopic, TasmotaGlobal.mqtt_data, 0, retained); -#endif + // Publish //> default ResponseData string with optional retained + MqttPublishPayloadPrefixTopic_P(prefix, subtopic, ResponseData(), 0, retained); } void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic) { - // Publish //> default TasmotaGlobal.mqtt_data string no retained + // Publish //> default ResponseData string no retained MqttPublishPrefixTopic_P(prefix, subtopic, false); } void MqttPublishPrefixTopicRulesProcess_P(uint32_t prefix, const char* subtopic, bool retained) { - // Publish //> default TasmotaGlobal.mqtt_data string with optional retained + // Publish //> default ResponseData string with optional retained // then process rules MqttPublishPrefixTopic_P(prefix, subtopic, retained); XdrvRulesProcess(0); } void MqttPublishPrefixTopicRulesProcess_P(uint32_t prefix, const char* subtopic) { - // Publish //> default TasmotaGlobal.mqtt_data string no retained + // Publish //> default ResponseData string no retained // then process rules MqttPublishPrefixTopicRulesProcess_P(prefix, subtopic, false); } void MqttPublishTeleSensor(void) { - // Publish tele//SENSOR default TasmotaGlobal.mqtt_data string with optional retained + // Publish tele//SENSOR default ResponseData string with optional retained // then process rules MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); // CMND_SENSORRETAIN } @@ -1079,17 +1071,9 @@ void MqttReconnect(void) { } String azureMqtt_userString = String(SettingsText(SET_MQTT_HOST)) + "/" + String(SettingsText(SET_MQTT_CLIENT)); + "/?api-version=2018-06-30"; -#ifdef MQTT_DATA_STRING - if (MqttClient.connect(TasmotaGlobal.mqtt_client, azureMqtt_userString.c_str(), azureMqtt_password.c_str(), stopic, 1, lwt_retain, TasmotaGlobal.mqtt_data.c_str(), MQTT_CLEAN_SESSION)) { + if (MqttClient.connect(TasmotaGlobal.mqtt_client, azureMqtt_userString.c_str(), azureMqtt_password.c_str(), stopic, 1, lwt_retain, ResponseData(), MQTT_CLEAN_SESSION)) { #else - if (MqttClient.connect(TasmotaGlobal.mqtt_client, azureMqtt_userString.c_str(), azureMqtt_password.c_str(), stopic, 1, lwt_retain, TasmotaGlobal.mqtt_data, MQTT_CLEAN_SESSION)) { -#endif -#else -#ifdef MQTT_DATA_STRING - if (MqttClient.connect(TasmotaGlobal.mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, lwt_retain, TasmotaGlobal.mqtt_data.c_str(), MQTT_CLEAN_SESSION)) { -#else - if (MqttClient.connect(TasmotaGlobal.mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, lwt_retain, TasmotaGlobal.mqtt_data, MQTT_CLEAN_SESSION)) { -#endif + if (MqttClient.connect(TasmotaGlobal.mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, lwt_retain, ResponseData(), MQTT_CLEAN_SESSION)) { #endif // USE_MQTT_AZURE_IOT #ifdef USE_MQTT_TLS if (Mqtt.mqtt_tls) { diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index ffcc9fcf6..d2f323760 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -987,11 +987,7 @@ void RulesEvery100ms(void) { if (ResponseLength()) { ResponseJsonStart(); // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089} ResponseJsonEnd(); -#ifdef MQTT_DATA_STRING - RulesProcessEvent(TasmotaGlobal.mqtt_data.c_str()); -#else - RulesProcessEvent(TasmotaGlobal.mqtt_data); -#endif + RulesProcessEvent(ResponseData()); } } } diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index efe187ed4..f1083c823 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -2403,11 +2403,7 @@ chknext: char rstring[SCRIPT_MAXSSIZE]; rstring[0] = 0; int8_t index = fvar; -#ifdef MQTT_DATA_STRING - char *wd = (char*)TasmotaGlobal.mqtt_data.c_str(); -#else - char *wd = TasmotaGlobal.mqtt_data; -#endif + char *wd = ResponseData(); strlcpy(rstring, wd, glob_script_mem.max_ssize); if (index) { if (strlen(wd) && index) { @@ -2432,11 +2428,7 @@ chknext: // preserve mqtt_data char *mqd = (char*)malloc(ResponseSize()+2); if (mqd) { -#ifdef MQTT_DATA_STRING - strlcpy(mqd, TasmotaGlobal.mqtt_data.c_str(), ResponseSize()); -#else - strlcpy(mqd, TasmotaGlobal.mqtt_data, ResponseSize()); -#endif + strlcpy(mqd, ResponseData(), ResponseSize()); wd = mqd; char *lwd = wd; while (index) { @@ -5007,11 +4999,7 @@ void ScripterEvery100ms(void) { if (ResponseLength()) { ResponseJsonStart(); ResponseJsonEnd(); -#ifdef MQTT_DATA_STRING - Run_Scripter(">T", 2, TasmotaGlobal.mqtt_data.c_str()); -#else - Run_Scripter(">T", 2, TasmotaGlobal.mqtt_data); -#endif + Run_Scripter(">T", 2, ResponseData()); } } if (bitRead(Settings->rule_enabled, 0)) { @@ -7735,13 +7723,12 @@ int32_t http_req(char *host, char *request) { #ifdef USE_WEBSEND_RESPONSE #ifdef MQTT_DATA_STRING TasmotaGlobal.mqtt_data = http.getString(); - //AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), TasmotaGlobal.mqtt_data.c_str()); - Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data.c_str()); #else strlcpy(TasmotaGlobal.mqtt_data, http.getString().c_str(), ResponseSize()); - //AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), TasmotaGlobal.mqtt_data); - Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data); #endif + //AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), ResponseData()); + Run_Scripter(">E", 2, ResponseData()); + glob_script_mem.glob_error = 0; #endif @@ -8442,41 +8429,24 @@ bool Xdrv10(uint8_t function) break; case FUNC_RULES_PROCESS: if (bitRead(Settings->rule_enabled, 0)) { -#ifdef MQTT_DATA_STRING #ifdef USE_SCRIPT_STATUS - if (!strncmp_P(TasmotaGlobal.mqtt_data.c_str(), PSTR("{\"Status"), 8)) { - Run_Scripter(">U", 2, TasmotaGlobal.mqtt_data.c_str()); + if (!strncmp_P(ResponseData(), PSTR("{\"Status"), 8)) { + Run_Scripter(">U", 2, ResponseData()); } else { - Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data.c_str()); + Run_Scripter(">E", 2, ResponseData()); } #else - Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data.c_str()); + Run_Scripter(">E", 2, ResponseData()); #endif -#else // MQTT_DATA_STRING -#ifdef USE_SCRIPT_STATUS - if (!strncmp_P(TasmotaGlobal.mqtt_data, PSTR("{\"Status"), 8)) { - Run_Scripter(">U", 2, TasmotaGlobal.mqtt_data); - } else { - Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data); - } -#else - Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data); -#endif -#endif // MQTT_DATA_STRING + result = glob_script_mem.event_handeled; } break; case FUNC_TELEPERIOD_RULES_PROCESS: if (bitRead(Settings->rule_enabled, 0)) { -#ifdef MQTT_DATA_STRING - if (TasmotaGlobal.mqtt_data.length()) { - Run_Scripter(">T", 2, TasmotaGlobal.mqtt_data.c_str()); + if (ResponseLength()) { + Run_Scripter(">T", 2, ResponseData()); } -#else - if (TasmotaGlobal.mqtt_data[0]) { - Run_Scripter(">T", 2, TasmotaGlobal.mqtt_data); - } -#endif } break; #ifdef USE_WEBSERVER diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino index de806ca0b..ed5aeb89a 100644 --- a/tasmota/xdrv_12_home_assistant.ino +++ b/tasmota/xdrv_12_home_assistant.ino @@ -896,11 +896,7 @@ void HAssAnnounceSensors(void) TasmotaGlobal.tele_period = tele_period_save; size_t sensordata_len = ResponseLength(); char sensordata[sensordata_len+2]; // dynamically adjust the size -#ifdef MQTT_DATA_STRING - strcpy(sensordata, TasmotaGlobal.mqtt_data.c_str()); // we can use strcpy since the buffer has the right size -#else - strcpy(sensordata, TasmotaGlobal.mqtt_data); // we can use strcpy since the buffer has the right size -#endif + strcpy(sensordata, ResponseData()); // we can use strcpy since the buffer has the right size // ******************* JSON TEST ******************* // char sensordata[512]; diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 7334d1ece..24f9cf567 100755 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -1301,11 +1301,7 @@ void DisplayDTVarsTeleperiod(void) { if (jlen < DTV_JSON_SIZE) { char *json = (char*)malloc(jlen + 2); if (json) { -#ifdef MQTT_DATA_STRING - strlcpy(json, (char*)TasmotaGlobal.mqtt_data.c_str(), jlen + 1); -#else - strlcpy(json, TasmotaGlobal.mqtt_data, jlen + 1); -#endif + strlcpy(json, ResponseData(), jlen + 1); get_dt_vars(json); free(json); } @@ -1324,11 +1320,7 @@ void get_dt_mqtt(void) { ResponseJsonStart(); ResponseJsonEnd(); } -#ifdef MQTT_DATA_STRING - get_dt_vars((char*)TasmotaGlobal.mqtt_data.c_str()); -#else - get_dt_vars(TasmotaGlobal.mqtt_data); -#endif + get_dt_vars(ResponseData()); } void get_dt_vars(char *json) { @@ -1743,13 +1735,8 @@ void DisplayLocalSensor(void) { if ((Settings->display_mode &0x02) && (0 == TasmotaGlobal.tele_period)) { char no_topic[1] = { 0 }; -#ifdef MQTT_DATA_STRING -// DisplayAnalyzeJson(TasmotaGlobal.mqtt_topic, TasmotaGlobal.mqtt_data.c_str()); // Add local topic - DisplayAnalyzeJson(no_topic, TasmotaGlobal.mqtt_data.c_str()); // Discard any topic -#else -// DisplayAnalyzeJson(TasmotaGlobal.mqtt_topic, TasmotaGlobal.mqtt_data); // Add local topic - DisplayAnalyzeJson(no_topic, TasmotaGlobal.mqtt_data); // Discard any topic -#endif +// DisplayAnalyzeJson(TasmotaGlobal.mqtt_topic, ResponseData()); // Add local topic + DisplayAnalyzeJson(no_topic, ResponseData()); // Discard any topic } } diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 1f1a5043f..53dcc770e 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -1227,11 +1227,7 @@ void TuyaSerialInput(void) if (Settings->flag3.tuya_serial_mqtt_publish) { // SetOption66 - Enable TuyaMcuReceived messages over Mqtt MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_TUYA_MCU_RECEIVED)); } else { -#ifdef MQTT_DATA_STRING - AddLog(LOG_LEVEL_DEBUG, TasmotaGlobal.mqtt_data.c_str()); -#else - AddLog(LOG_LEVEL_DEBUG, TasmotaGlobal.mqtt_data); -#endif + AddLog(LOG_LEVEL_DEBUG, ResponseData()); } XdrvRulesProcess(0); diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index cde68b16d..567e7dc0b 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -751,11 +751,7 @@ public: if (Settings->flag3.tuya_serial_mqtt_publish) { MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR)); } else { -#ifdef MQTT_DATA_STRING - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), TasmotaGlobal.mqtt_data.c_str()); -#else - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), TasmotaGlobal.mqtt_data); -#endif + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), ResponseData()); } } diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index c0a313aef..72b994a57 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -1577,11 +1577,7 @@ void Z_AutoConfigReportingForCluster(uint16_t shortaddr, uint16_t groupaddr, uin ResponseAppend_P(PSTR("}}")); if (buf.len() > 0) { -#ifdef MQTT_DATA_STRING - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "auto-bind `%s`"), TasmotaGlobal.mqtt_data.c_str()); -#else - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "auto-bind `%s`"), TasmotaGlobal.mqtt_data); -#endif + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "auto-bind `%s`"), ResponseData()); ZCLMessage zcl(buf.len()); // message is 4 bytes zcl.shortaddr = shortaddr; zcl.cluster = cluster; diff --git a/tasmota/xdrv_23_zigbee_9_serial.ino b/tasmota/xdrv_23_zigbee_9_serial.ino index fe606ccae..649f377a4 100644 --- a/tasmota/xdrv_23_zigbee_9_serial.ino +++ b/tasmota/xdrv_23_zigbee_9_serial.ino @@ -152,11 +152,7 @@ void ZigbeeInputLoop(void) { if (Settings->flag3.tuya_serial_mqtt_publish) { MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR)); } else { -#ifdef MQTT_DATA_STRING - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), TasmotaGlobal.mqtt_data.c_str()); -#else - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), TasmotaGlobal.mqtt_data); -#endif + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), ResponseData()); } // now process the message ZigbeeProcessInput(znp_buffer); @@ -601,11 +597,7 @@ void ZigbeeProcessInputEZSP(SBuffer &buf) { log_level = LOG_LEVEL_DEBUG; break; } -#ifdef MQTT_DATA_STRING - AddLog(log_level, PSTR(D_LOG_ZIGBEE "%s"), TasmotaGlobal.mqtt_data.c_str()); // TODO move to LOG_LEVEL_DEBUG when stable -#else - AddLog(log_level, PSTR(D_LOG_ZIGBEE "%s"), TasmotaGlobal.mqtt_data); // TODO move to LOG_LEVEL_DEBUG when stable -#endif + AddLog(log_level, PSTR(D_LOG_ZIGBEE "%s"), ResponseData()); // TODO move to LOG_LEVEL_DEBUG when stable } // Pass message to state machine diff --git a/tasmota/xdrv_52_3_berry_tasmota.ino b/tasmota/xdrv_52_3_berry_tasmota.ino index 252338ca7..72577ba2b 100644 --- a/tasmota/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/xdrv_52_3_berry_tasmota.ino @@ -123,11 +123,7 @@ extern "C" { const char * command = be_tostring(vm, 2); be_pop(vm, 2); // clear the stack before calling, because of re-entrant call to Berry in a Rule ExecuteCommand(command, SRC_BERRY); -#ifdef MQTT_DATA_STRING - be_pushstring(vm, TasmotaGlobal.mqtt_data.c_str()); -#else - be_pushstring(vm, TasmotaGlobal.mqtt_data); -#endif + be_pushstring(vm, ResponseData()); be_return(vm); // Return } be_raise(vm, kTypeError, nullptr); diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 07d0c66c8..adbfcc7aa 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -256,7 +256,7 @@ char* InfluxDbNumber(char* alternative, const char* source) { void InfluxDbProcessJson(void) { if (!IFDB.init) { return; } -// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), TasmotaGlobal.mqtt_data.c_str()); +// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), ResponseData()); String jsonStr = TasmotaGlobal.mqtt_data; JsonParser parser((char *)jsonStr.c_str()); diff --git a/tasmota/xsns_62_esp32_mi_ble.ino b/tasmota/xsns_62_esp32_mi_ble.ino index 039e0fb8c..f8011351f 100644 --- a/tasmota/xsns_62_esp32_mi_ble.ino +++ b/tasmota/xsns_62_esp32_mi_ble.ino @@ -2689,11 +2689,7 @@ void MI32ShowSomeSensors(){ } ResponseAppend_P(PSTR("}")); MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); -#ifdef MQTT_DATA_STRING - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, TasmotaGlobal.mqtt_data.c_str()); -#else - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, TasmotaGlobal.mqtt_data); -#endif + //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); #ifdef USE_HOME_ASSISTANT if(hass_mode==2){ @@ -2746,11 +2742,7 @@ void MI32ShowOneMISensor(){ id); MqttPublish(SensorTopic); -#ifdef MQTT_DATA_STRING - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, TasmotaGlobal.mqtt_data.c_str()); -#else - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, TasmotaGlobal.mqtt_data); -#endif + //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); } MI32.mqttCurrentSingleSlot++; } @@ -3006,11 +2998,7 @@ void MI32DiscoveryOneMISensor(){ //vTaskDelay(100/ portTICK_PERIOD_MS); } } // end if hass discovery -#ifdef MQTT_DATA_STRING - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, TasmotaGlobal.mqtt_data.c_str()); -#else - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, TasmotaGlobal.mqtt_data); -#endif + //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); #endif //USE_HOME_ASSISTANT } @@ -3088,11 +3076,7 @@ void MI32ShowTriggeredSensors(){ } else { MqttPublishPrefixTopic_P(STAT, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); } -#ifdef MQTT_DATA_STRING - AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: triggered %d %s"),D_CMND_MI32, sensor, TasmotaGlobal.mqtt_data.c_str()); -#else - AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: triggered %d %s"),D_CMND_MI32, sensor, TasmotaGlobal.mqtt_data); -#endif + AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: triggered %d %s"),D_CMND_MI32, sensor, ResponseData()); XdrvRulesProcess(0); } else { // else don't and clear From b112c05d9ab417a6e8254d7516f59fcf30b03e20 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 Aug 2021 17:26:32 +0200 Subject: [PATCH 147/148] Refactor access TasmotaGlobal.mqtt_data --- tasmota/xdrv_39_thermostat.ino | 2 +- tasmota/xdrv_59_influxdb.ino | 2 +- tasmota/xdrv_79_esp32_ble.ino | 2 +- tasmota/xdrv_interface.ino | 8 ++------ tasmota/xdsp_11_sevenseg.ino | 2 +- tasmota/xsns_75_prometheus.ino | 2 +- 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tasmota/xdrv_39_thermostat.ino b/tasmota/xdrv_39_thermostat.ino index 2078fd829..e45ef93f9 100644 --- a/tasmota/xdrv_39_thermostat.ino +++ b/tasmota/xdrv_39_thermostat.ino @@ -1328,7 +1328,7 @@ void ThermostatDebug(uint8_t ctr_output) #endif // DEBUG_THERMOSTAT void ThermostatGetLocalSensor(uint8_t ctr_output) { - String buf = TasmotaGlobal.mqtt_data; // copy the string into a new buffer that will be modified + String buf = ResponseData(); // copy the string into a new buffer that will be modified JsonParser parser((char*)buf.c_str()); JsonParserObject root = parser.getRootObject(); if (root) { diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index adbfcc7aa..9bc7f5510 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -258,7 +258,7 @@ void InfluxDbProcessJson(void) { // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), ResponseData()); - String jsonStr = TasmotaGlobal.mqtt_data; + String jsonStr = ResponseData(); JsonParser parser((char *)jsonStr.c_str()); JsonParserObject root = parser.getRootObject(); if (root) { diff --git a/tasmota/xdrv_79_esp32_ble.ino b/tasmota/xdrv_79_esp32_ble.ino index b96338f75..9f4ed2e9c 100644 --- a/tasmota/xdrv_79_esp32_ble.ino +++ b/tasmota/xdrv_79_esp32_ble.ino @@ -3123,7 +3123,7 @@ static void BLEPostMQTTSeenDevices(int type) { int remains = 0; #ifdef MQTT_DATA_STRING ResponseTime_P(PSTR("")); - String response_time = TasmotaGlobal.mqtt_data; + String response_time = ResponseData(); int maxlen = 1024; char dest[maxlen]; diff --git a/tasmota/xdrv_interface.ino b/tasmota/xdrv_interface.ino index 680e0b62f..e3c637231 100644 --- a/tasmota/xdrv_interface.ino +++ b/tasmota/xdrv_interface.ino @@ -1093,13 +1093,9 @@ bool XdrvRulesProcess(bool teleperiod, const char* event) { } bool XdrvRulesProcess(bool teleperiod) { -#ifdef MQTT_DATA_STRING - bool result = XdrvRulesProcess(teleperiod, TasmotaGlobal.mqtt_data.c_str()); - ResponseClear(); + bool result = XdrvRulesProcess(teleperiod, ResponseData()); + ResponseClear(); // Free heap space return result; -#else - return XdrvRulesProcess(teleperiod, TasmotaGlobal.mqtt_data); -#endif } #ifdef USE_DEBUG_DRIVER diff --git a/tasmota/xdsp_11_sevenseg.ino b/tasmota/xdsp_11_sevenseg.ino index d3de996e1..7f200e44a 100644 --- a/tasmota/xdsp_11_sevenseg.ino +++ b/tasmota/xdsp_11_sevenseg.ino @@ -76,7 +76,7 @@ void SevensegLog(void) int16_t valueDecimal = 0; double valueFloat = 0; uint8 fDigits = 0; - String jsonStr = TasmotaGlobal.mqtt_data; // Move from stack to heap to fix watchdogs (20180626) + String jsonStr = ResponseData(); // Move from stack to heap to fix watchdogs (20180626) JsonParser parser((char*)jsonStr.c_str()); JsonParserObject object_root = parser.getRootObject(); if (object_root) { diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index 921a529a8..1d38f7b03 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -283,7 +283,7 @@ void HandleMetrics(void) { ResponseClear(); MqttShowSensor(); //Pull sensor data - String jsonStr = TasmotaGlobal.mqtt_data; + String jsonStr = ResponseData(); JsonParser parser((char *)jsonStr.c_str()); JsonParserObject root = parser.getRootObject(); if (root) { // did JSON parsing succeed? From cb955762a688857164e0e507dc4e3188a6c8b380 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 16 Aug 2021 10:32:25 +0200 Subject: [PATCH 148/148] Version bump to v9.5.0.6 Version bump to monitor possible HTTP issues releated to ``SetOption128`` --- CHANGELOG.md | 6 +++++- RELEASENOTES.md | 2 +- tasmota/tasmota_version.h | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 037d14613..f4a01c052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [9.5.0.5] +## [9.5.0.6] +### Added +- Version bump to monitor possible HTTP issues releated to ``SetOption128`` + +## [9.5.0.5] 20210815 ### Added - Inital support for Wi-Fi extender (#12784) - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` (#12813) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9831112fc..828af7ac0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -98,7 +98,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v9.5.0.5 +## Changelog v9.5.0.6 ### Added - Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota-firmware/) - Command ``SetOption127 1`` to force Wi-Fi in no-sleep mode even if ``Sleep 0`` is not enabled diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index bb18eec6f..51dc681e6 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x09050005; +const uint32_t VERSION = 0x09050006; #endif // _TASMOTA_VERSION_H_