Merge branch 'MoonModules:mdev' into mdev

This commit is contained in:
tonyxforce
2023-09-10 19:05:07 +00:00
committed by GitHub
16 changed files with 1552 additions and 1462 deletions

View File

@@ -48,7 +48,7 @@ body:
attributes: attributes:
label: What version/release of MM WLED? label: What version/release of MM WLED?
description: You can find this in by going to Config -> Security & Updates -> Scroll to Bottom. Copy and paste the entire line after "Server message" description: You can find this in by going to Config -> Security & Updates -> Scroll to Bottom. Copy and paste the entire line after "Server message"
placeholder: "e.g. WLEDMM_0.14.0.2.1_esp32_4MB_max (build 2212061)" placeholder: "e.g. build 2308250, WLEDMM_0.14.0-b27.31_esp32_4MB_M.bin"
validations: validations:
required: true required: true
- type: dropdown - type: dropdown
@@ -57,12 +57,12 @@ body:
label: Which microcontroller/board are you seeing the problem on? label: Which microcontroller/board are you seeing the problem on?
multiple: true multiple: true
options: options:
- ESP8266
- ESP32 - ESP32
- ESP32-S3 - ESP32-S3
- ESP32-S2 - ESP32-S2
- ESP32-C3 - ESP32-C3
- Other - Other
- ESP8266
validations: validations:
required: true required: true
- type: textarea - type: textarea

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0-b26.30", "version": "0.14.0-b27.31",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "wled", "name": "wled",
"version": "0.14.0-b26.30", "version": "0.14.0-b27.31",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
"clean-css": "^4.2.3", "clean-css": "^4.2.3",

View File

@@ -1,6 +1,6 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0-b26.30", "version": "0.14.0-b27.31",
"description": "Tools for WLED project", "description": "Tools for WLED project",
"main": "tools/cdata.js", "main": "tools/cdata.js",
"directories": { "directories": {

View File

@@ -39,12 +39,14 @@
; default_envs = esp32dev_qio80 ; default_envs = esp32dev_qio80
; default_envs = esp32_eth_ota1mapp ; default_envs = esp32_eth_ota1mapp
; default_envs = esp32s2_saola ; default_envs = esp32s2_saola
; default_envs = esp32c3dev
; default_envs = lolin_s2_mini
; MoonModules entries ; MoonModules entries
; =================== ; ===================
default_envs = default_envs =
; esp32_4MB_S ;; experimental, optimized for speed esp32_4MB_S ;; experimental, optimized for speed
esp32_4MB_M ;; esp32 recommended default esp32_4MB_M ;; esp32 recommended default
esp32_4MB_M_eth esp32_4MB_M_eth
esp32_4MB_M_debug esp32_4MB_M_debug
@@ -68,9 +70,9 @@ default_envs =
esp32_pico_4MB_M esp32_pico_4MB_M
esp32_4MB_PSRAM_S esp32_4MB_PSRAM_S
; esp32_4MB_PSRAM_REV3_S ;; experimental, optimized for WROVER-E with "revision3" chip ; esp32_4MB_PSRAM_REV3_S ;; experimental, optimized for WROVER-E with "revision3" chip
esp32S3_8MB_S ;; experimental, optimized for speed
esp32S3_8MB_M esp32S3_8MB_M
;; esp32S3_8MB_PSRAM_M ;; experiemental ;; esp32S3_8MB_PSRAM_M ;; experiemental
;; esp32S3_8MB_S ;; experimental, optimized for speed
;; esp32s2_tinyUF2_PSRAM_S ;; experimental - only for adafruit -S2 boards with tinyUF2 bootloader !!! ;; esp32s2_tinyUF2_PSRAM_S ;; experimental - only for adafruit -S2 boards with tinyUF2 bootloader !!!
esp32s2_PSRAM_M ;; experimental esp32s2_PSRAM_M ;; experimental
esp32c3dev_4MB_M ;; experimental esp32c3dev_4MB_M ;; experimental
@@ -563,8 +565,8 @@ board = esp32-c3-devkitm-1
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3 build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3
-D WLED_WATCHDOG_TIMEOUT=0 -D WLED_WATCHDOG_TIMEOUT=0
; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB
-DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip ;-DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip
upload_speed = 460800 upload_speed = 460800
build_unflags = ${common.build_unflags} build_unflags = ${common.build_unflags}
lib_deps = ${esp32c3.lib_deps} lib_deps = ${esp32c3.lib_deps}
@@ -676,10 +678,10 @@ platform = ${esp32s2.platform}
platform_packages = ${esp32s2.platform_packages} platform_packages = ${esp32s2.platform_packages}
board = lolin_s2_mini board = lolin_s2_mini
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_unflags = ${common.build_unflags} -DARDUINO_USB_CDC_ON_BOOT=1 build_unflags = ${common.build_unflags} #-DARDUINO_USB_CDC_ON_BOOT=1
build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=LolinS2 build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=LolinS2
-DBOARD_HAS_PSRAM -DBOARD_HAS_PSRAM
-DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_CDC_ON_BOOT=1 # try disabling and enabling unflag above in case of board-specific issues, will disable Serial
-DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0
-DARDUINO_USB_DFU_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0
-DLOLIN_WIFI_FIX ; seems to work much better with this -DLOLIN_WIFI_FIX ; seems to work much better with this
@@ -1706,12 +1708,13 @@ build_unflags = ${env:esp32S3_8MB_M.build_unflags} ;; use the same as "normal"
${Speed_Flags.build_unflags} ;; to override -Os ${Speed_Flags.build_unflags} ;; to override -Os
build_flags = ${common.build_flags} ${esp32s3.build_flags} -Wno-misleading-indentation -Wno-format-truncation build_flags = ${common.build_flags} ${esp32s3.build_flags} -Wno-misleading-indentation -Wno-format-truncation
${common_mm.build_flags_S} ${common_mm.build_flags_S}
-D WLED_RELEASE_NAME=esp32S3_8MB_PSRAM_S -D WLED_RELEASE_NAME=esp32S3_8MB_S
-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 ;; for Serial-to-USB chip -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 ;; for Serial-to-USB chip
;;-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=1 ;; for Hardware-CDC USB mode ;;-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=1 ;; for Hardware-CDC USB mode
;;-D WLED_DISABLE_ADALIGHT ;; disables serial protocols - recommended for Hardware-CDC USB (Serial RX will receive junk commands when RX pin is unconnected, unless its pulled down by resistor) ;;-D WLED_DISABLE_ADALIGHT ;; disables serial protocols - recommended for Hardware-CDC USB (Serial RX will receive junk commands when RX pin is unconnected, unless its pulled down by resistor)
${Speed_Flags.build_flags} ;; optimize for speed instead of size ${Speed_Flags.build_flags} ;; optimize for speed instead of size
-D WLEDMM_FASTPATH ; WLEDMM experimental option. Reduces audio lag (latency), and allows for faster LED framerates. May break compatibility with previous versions. -D WLEDMM_FASTPATH ; WLEDMM experimental option. Reduces audio lag (latency), and allows for faster LED framerates. May break compatibility with previous versions.
${common_mm.animartrix_build_flags}
-D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0 -D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0
-D WLED_DISABLE_LOXONE ; FLASH 1272 bytes -D WLED_DISABLE_LOXONE ; FLASH 1272 bytes
-D WLED_DISABLE_ALEXA ; RAM 116 bytes; FLASH 13524 bytes -D WLED_DISABLE_ALEXA ; RAM 116 bytes; FLASH 13524 bytes
@@ -1731,15 +1734,16 @@ build_flags = ${common.build_flags} ${esp32s3.build_flags} -Wno-misleading-inden
; -D WLED_DEBUG ; -D WLED_DEBUG
; -D SR_DEBUG ; -D SR_DEBUG
; -D MIC_LOGGER ; -D MIC_LOGGER
lib_deps = ${esp32s3.lib_deps} ${common_mm.lib_deps_S} lib_deps = ${esp32s3.lib_deps} ${common_mm.lib_deps_S}
${common_mm.animartrix_lib_deps}
lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation
board_build.partitions = tools/WLED_ESP32_8MB.csv board_build.partitions = tools/WLED_ESP32_8MB.csv
;; normal build ;; normal build
; RAM: [== ] 24.9% (used 81656 bytes from 327680 bytes) ; RAM: [== ] 24.9% (used 81656 bytes from 327680 bytes)
; Flash: [======= ] 66.1% (used 1386229 bytes from 2097152 bytes) ; Flash: [======= ] 66.1% (used 1386229 bytes from 2097152 bytes)
;; optimized-for-speed build ;; optimized-for-speed build
; RAM: [== ] 24.9% (used 81712 bytes from 327680 bytes) ; RAM: [=== ] 25.8% (used 84544 bytes from 327680 bytes)
; Flash: [======== ] 75.2% (used 1576113 bytes from 2097152 bytes) ; Flash: [======== ] 78.1% (used 1638737 bytes from 2097152 bytes)
;; MM for Adafruit QT Py ESP32-S2 -> 4MB flash, PSRAM, and tinyUF2 bootloader ;; MM for Adafruit QT Py ESP32-S2 -> 4MB flash, PSRAM, and tinyUF2 bootloader
@@ -1769,7 +1773,7 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags}
-D WLED_DISABLE_ADALIGHT ;; disables serial protocols when using CDC USB (Serial RX will receive junk commands, unless its pulled down by resistor) -D WLED_DISABLE_ADALIGHT ;; disables serial protocols when using CDC USB (Serial RX will receive junk commands, unless its pulled down by resistor)
-DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0
-D SERVERNAME='"WLED-S2"' -D SERVERNAME='"WLED-S2"'
-DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON ;; -D WLED_USE_PSRAM
-D WLED_DISABLE_LOXONE ;; FLASH 1272 bytes -D WLED_DISABLE_LOXONE ;; FLASH 1272 bytes
-D WLED_DISABLE_HUESYNC ;; RAM 122 bytes; FLASH 6308 bytes -D WLED_DISABLE_HUESYNC ;; RAM 122 bytes; FLASH 6308 bytes
-D WLED_DISABLE_ALEXA ;; RAM 116 bytes; FLASH 13524 bytes -D WLED_DISABLE_ALEXA ;; RAM 116 bytes; FLASH 13524 bytes
@@ -1815,11 +1819,12 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags}
-D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0 -D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0
${common_mm.build_flags_S} ${common_mm.build_flags_M} ${common_mm.build_flags_S} ${common_mm.build_flags_M}
-Wno-misleading-indentation -Wno-format-truncation -Wno-misleading-indentation -Wno-format-truncation
-D WLED_RELEASE_NAME=esp32S2_4MB_M -D WLED_RELEASE_NAME=esp32s2_4MB_M
-DLOLIN_WIFI_FIX -DWLEDMM_WIFI_POWERON_HACK ;; seems to work much better with this
-DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_CDC_ON_BOOT=0
-DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0
-D WLED_DISABLE_ADALIGHT ;; disables serial protocols, as the board only has CDC USB -D WLED_DISABLE_ADALIGHT ;; disables serial protocols, as the board only has CDC USB
-DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON ;; -D WLED_USE_PSRAM
; -D WLEDMM_WIFI_POWERON_HACK -DLOLIN_WIFI_FIX ;; use this _only_ if your device is not able to make a WiFI connection! ; -D WLEDMM_WIFI_POWERON_HACK -DLOLIN_WIFI_FIX ;; use this _only_ if your device is not able to make a WiFI connection!
-D WLED_DISABLE_INFRARED ;; save flash space -D WLED_DISABLE_INFRARED ;; save flash space
-D WLED_DISABLE_ALEXA ;; save flash space -D WLED_DISABLE_ALEXA ;; save flash space

View File

@@ -1,6 +1,33 @@
#pragma once #pragma once
#include "wled.h" #include "wled.h"
// softhack007: workaround for ICE (internal compiler error) when compiling with new framework and "-O2":
/*
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h: In function 'uint16_t mode_Waves()':
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:367:1: error: insn does not satisfy its constraints:
}
^
(insn 811 738 824 24 (set (reg/v:SF 19 f0 [orig:69 result ] [69])
(mem/u/c:SF (symbol_ref/u:SI ("*.LC1657") [flags 0x2]) [0 S4 A32])) ".pio/libdeps/my_esp32_16MB_V4_S/animartrix/ANIMartRIX.h":372 47 {movsf_internal}
(nil))
during RTL pass: postreload
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:367:1: internal compiler error: in extract_constrain_insn, at recog.c:2210
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.
*/
#if defined(ARDUINO_ARCH_ESP32) && defined(ESP_IDF_VERSION)
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)
// this pragma temporarily raises gcc optimization level to "-O3", to avoid internal error conditions
#pragma GCC push_options
#pragma GCC optimize ("O3")
#endif
#endif
#include <ANIMartRIX.h> #include <ANIMartRIX.h>
#warning WLEDMM usermod: CC BY-NC 3.0 licensed effects by Stefan Petrick, include this usermod only if you accept the terms! #warning WLEDMM usermod: CC BY-NC 3.0 licensed effects by Stefan Petrick, include this usermod only if you accept the terms!
@@ -448,4 +475,10 @@ class AnimartrixUsermod : public Usermod {
}; };
#if defined(ARDUINO_ARCH_ESP32) && defined(ESP_IDF_VERSION)
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)
// restore original gcc optimization level
#pragma GCC pop_options
#endif
#endif

View File

@@ -1354,7 +1354,7 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
static bool buttonLongPressed = false; static bool buttonLongPressed = false;
static unsigned long buttonPressedTime = 0; static unsigned long buttonPressedTime = 0;
static unsigned long buttonWaitTime = 0; static unsigned long buttonWaitTime = 0;
bool handled = true; bool handled = false;
//momentary button logic //momentary button logic
if (isButtonPressed(b)) { //pressed if (isButtonPressed(b)) { //pressed
@@ -1363,11 +1363,12 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
buttonPressedBefore = true; buttonPressedBefore = true;
if (now - buttonPressedTime > 600) { //long press if (now - buttonPressedTime > 600) { //long press
buttonLongPressed = true;
//TODO: handleButton() handles button 0 without preset in a different way for double click //TODO: handleButton() handles button 0 without preset in a different way for double click
//so we need to override with same behaviour //so we need to override with same behaviour
longPressAction(0); //DEBUG_PRINTLN(F("4LD action."));
//handled = false; //if (!buttonLongPressed) longPressAction(0);
buttonLongPressed = true;
return false;
} }
} else if (!isButtonPressed(b) && buttonPressedBefore) { //released } else if (!isButtonPressed(b) && buttonPressedBefore) { //released
@@ -1399,7 +1400,7 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
buttonWaitTime = 0; buttonWaitTime = 0;
//TODO: handleButton() handles button 0 without preset in a different way for double click //TODO: handleButton() handles button 0 without preset in a different way for double click
//so we need to override with same behaviour //so we need to override with same behaviour
shortPressAction(0); //shortPressAction(0);
//handled = false; //handled = false;
} }
return handled; return handled;

View File

@@ -21,6 +21,7 @@ void shortPressAction(uint8_t b)
case 1: ++effectCurrent %= strip.getModeCount(); stateChanged = true; colorUpdated(CALL_MODE_BUTTON); break; case 1: ++effectCurrent %= strip.getModeCount(); stateChanged = true; colorUpdated(CALL_MODE_BUTTON); break;
} }
} else { } else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET); applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET);
} }
@@ -42,6 +43,7 @@ void longPressAction(uint8_t b)
case 1: bri += 8; stateUpdated(CALL_MODE_BUTTON); buttonPressedTime[b] = millis(); break; // repeatable action case 1: bri += 8; stateUpdated(CALL_MODE_BUTTON); buttonPressedTime[b] = millis(); break; // repeatable action
} }
} else { } else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET); applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET);
} }
@@ -63,6 +65,7 @@ void doublePressAction(uint8_t b)
case 1: ++effectPalette %= strip.getPaletteCount(); colorUpdated(CALL_MODE_BUTTON); break; case 1: ++effectPalette %= strip.getPaletteCount(); colorUpdated(CALL_MODE_BUTTON); break;
} }
} else { } else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET); applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET);
} }
@@ -262,7 +265,7 @@ void handleButton()
shortPressAction(b); shortPressAction(b);
buttonPressedBefore[b] = true; buttonPressedBefore[b] = true;
buttonPressedTime[b] = now; // continually update (for debouncing to work in release handler) buttonPressedTime[b] = now; // continually update (for debouncing to work in release handler)
return; continue;
} }
if (!buttonPressedBefore[b]) buttonPressedTime[b] = now; if (!buttonPressedBefore[b]) buttonPressedTime[b] = now;
@@ -283,7 +286,7 @@ void handleButton()
// released after rising-edge short press action // released after rising-edge short press action
if (macroButton[b] && macroButton[b] == macroLongPress[b] && macroButton[b] == macroDoublePress[b]) { if (macroButton[b] && macroButton[b] == macroLongPress[b] && macroButton[b] == macroDoublePress[b]) {
if (dur > WLED_DEBOUNCE_THRESHOLD) buttonPressedBefore[b] = false; // debounce, blocks button for 50 ms once it has been released if (dur > WLED_DEBOUNCE_THRESHOLD) buttonPressedBefore[b] = false; // debounce, blocks button for 50 ms once it has been released
return; continue;
} }
if (dur < WLED_DEBOUNCE_THRESHOLD) {buttonPressedBefore[b] = false; continue;} // too short "press", debounce if (dur < WLED_DEBOUNCE_THRESHOLD) {buttonPressedBefore[b] = false; continue;} // too short "press", debounce

View File

@@ -422,7 +422,11 @@
#else #else
#if defined(BOARD_HAS_PSRAM) && (defined(WLED_USE_PSRAM) || defined(WLED_USE_PSRAM_JSON)) #if defined(BOARD_HAS_PSRAM) && (defined(WLED_USE_PSRAM) || defined(WLED_USE_PSRAM_JSON))
#if defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3) #if defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3)
#define JSON_BUFFER_SIZE 48000 // WLEDMM #if defined(ARDUINO_ARCH_ESP32C3)
#define JSON_BUFFER_SIZE 46000 // WLEDMM - max 46KB on -C3 with PSRAM (chip has 400kb RAM)
#else
#define JSON_BUFFER_SIZE 36000 // WLEDMM - max 36KB on -S2 with PSRAM (chip has 320kb RAM)
#endif
#else #else
#define JSON_BUFFER_SIZE 56000 // WLEDMM (was 60000) slightly reduced to avoid build error "region dram0_0_seg overflowed" #define JSON_BUFFER_SIZE 56000 // WLEDMM (was 60000) slightly reduced to avoid build error "region dram0_0_seg overflowed"
#endif #endif

View File

@@ -676,8 +676,7 @@ function populateInfo(i)
if (i.ver.includes("0.14.1")) vcn = "Sitting Ducks"; // easter egg if (i.ver.includes("0.14.1")) vcn = "Sitting Ducks"; // easter egg
if (i.ver.includes("0.14.0")) vcn = "Lupo"; // check for MM versioning scheme if (i.ver.includes("0.14.0")) vcn = "Lupo"; // check for MM versioning scheme
if (i.ver.includes("0.14.0-b15")) vcn = "Sitting Ducks"; // late easter egg if (i.ver.includes("0.14.0-b15")) vcn = "Sitting Ducks"; // late easter egg
if (i.ver.includes("0.14.0-b25")) vcn = "This is the way"; // recently watched The Mandalorian? I have spoken ;-) if (i.ver.includes("0.14.0-b2")) vcn = "This is the way"; // recently watched The Mandalorian? I have spoken ;-)
if (i.ver.includes("0.14.0-b26")) vcn = "This is the way";
if (i.ver.includes("0.14.0-b15.22")) vcn = "Lupo"; if (i.ver.includes("0.14.0-b15.22")) vcn = "Lupo";
cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p>(WLEDMM_${i.ver} ${i.rel}.bin)</p><p><em>build ${i.vid}</em></p><table> cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p>(WLEDMM_${i.ver} ${i.rel}.bin)</p><p><em>build ${i.vid}</em></p><table>
${urows} ${urows}

View File

@@ -99,10 +99,20 @@ void sendHuePoll();
void onHueData(void* arg, AsyncClient* client, void *data, size_t len); void onHueData(void* arg, AsyncClient* client, void *data, size_t len);
//improv.cpp //improv.cpp
enum ImprovRPCType {
Command_Wifi = 0x01,
Request_State = 0x02,
Request_Info = 0x03,
Request_Scan = 0x04
};
void handleImprovPacket(); void handleImprovPacket();
void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings = 0, const char **strings = nullptr);
void sendImprovStateResponse(uint8_t state, bool error = false); void sendImprovStateResponse(uint8_t state, bool error = false);
void sendImprovInfoResponse(); void sendImprovInfoResponse();
void sendImprovRPCResponse(uint8_t commandId); void startImprovWifiScan();
void handleImprovWifiScan();
void sendImprovIPRPCResult(ImprovRPCType type);
//ir.cpp //ir.cpp
void applyRepeatActions(); void applyRepeatActions();
@@ -165,9 +175,11 @@ void handleTransitions();
void handleNightlight(); void handleNightlight();
byte __attribute__((pure)) scaledBri(byte in); // WLEDMM: added attribute pure byte __attribute__((pure)) scaledBri(byte in); // WLEDMM: added attribute pure
#ifdef WLED_ENABLE_LOXONE
//lx_parser.cpp //lx_parser.cpp
bool parseLx(int lxValue, byte* rgbw); bool parseLx(int lxValue, byte* rgbw);
void parseLxJson(int lxValue, byte segId, bool secondary); void parseLxJson(int lxValue, byte segId, bool secondary);
#endif
//mqtt.cpp //mqtt.cpp
bool initMqtt(); bool initMqtt();
@@ -222,7 +234,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply=tru
//udp.cpp //udp.cpp
void notify(byte callMode, bool followUp=false); void notify(byte callMode, bool followUp=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false); uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8_t *buffer, uint8_t bri=255, bool isRGBW=false);
void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC); void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC);
void exitRealtime(); void exitRealtime();
void handleNotifications(); void handleNotifications();

View File

@@ -43,44 +43,44 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
// Autogenerated from wled00/data/update.htm, do not edit!! // Autogenerated from wled00/data/update.htm, do not edit!!
const uint16_t PAGE_update_length = 607; const uint16_t PAGE_update_length = 607;
const uint8_t PAGE_update[] PROGMEM = { const uint8_t PAGE_update[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x75, 0x53, 0xd1, 0x6e, 0xd4, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x75, 0x53, 0xd1, 0x6e, 0xd3, 0x30,
0x10, 0x7c, 0xcf, 0x57, 0x18, 0x3f, 0xdd, 0x49, 0x9c, 0x53, 0x0a, 0x42, 0xa2, 0x24, 0x29, 0x3a, 0x14, 0x7d, 0xcf, 0x57, 0x78, 0x7e, 0x6a, 0x25, 0xea, 0x6c, 0x03, 0x09, 0x31, 0x92, 0x0c, 0x95,
0x5a, 0x21, 0x24, 0xaa, 0x56, 0x6a, 0x0b, 0xe2, 0x09, 0x39, 0xf1, 0x26, 0x31, 0xe7, 0xd8, 0xa9, 0x4d, 0x08, 0x89, 0x69, 0x95, 0xb6, 0x81, 0x78, 0x42, 0x4e, 0x7c, 0xd3, 0x98, 0x3a, 0x76, 0x66,
0xbd, 0xb9, 0xd3, 0x09, 0xf5, 0xdf, 0x59, 0x3b, 0x77, 0x05, 0xa9, 0xf0, 0x12, 0xc5, 0xc9, 0xec, 0xdf, 0xb4, 0xaa, 0xd0, 0xfe, 0x9d, 0x6b, 0xa7, 0x1d, 0x48, 0x83, 0x97, 0x28, 0x4e, 0xce, 0x3d,
0x64, 0x76, 0x66, 0x52, 0xbc, 0xb8, 0xb8, 0xfe, 0x78, 0xf7, 0xfd, 0xe6, 0x92, 0xf5, 0x38, 0x98, 0x39, 0xf7, 0x9c, 0x93, 0xe2, 0xe4, 0xea, 0xf6, 0xe3, 0xfd, 0xf7, 0xd5, 0x35, 0xeb, 0xb0, 0x37,
0xaa, 0x38, 0x5c, 0x41, 0xaa, 0xaa, 0x18, 0x00, 0x25, 0x6b, 0x9c, 0x45, 0xb0, 0x58, 0xf2, 0x9d, 0x55, 0x71, 0xb8, 0x82, 0x54, 0x55, 0xd1, 0x03, 0x4a, 0xd6, 0x38, 0x8b, 0x60, 0xb1, 0xe4, 0x3b,
0x56, 0xd8, 0x97, 0x0a, 0xb6, 0xba, 0x81, 0x55, 0x3a, 0x70, 0x66, 0xe5, 0x00, 0x25, 0xdf, 0x6a, 0xad, 0xb0, 0x2b, 0x15, 0x6c, 0x75, 0x03, 0x8b, 0x74, 0xe0, 0xcc, 0xca, 0x1e, 0x4a, 0xbe, 0xd5,
0xd8, 0x8d, 0xce, 0x23, 0xaf, 0xb2, 0x02, 0x35, 0x1a, 0xa8, 0xbe, 0x7d, 0xb9, 0xbc, 0x60, 0xf7, 0xb0, 0x1b, 0x9c, 0x47, 0x5e, 0x65, 0x05, 0x6a, 0x34, 0x50, 0x7d, 0xfb, 0x72, 0x7d, 0xc5, 0x1e,
0xa3, 0x92, 0x08, 0x45, 0x3e, 0x3f, 0x2a, 0x42, 0xe3, 0xf5, 0x88, 0x55, 0xd6, 0x4e, 0xb6, 0x41, 0x06, 0x25, 0x11, 0x8a, 0x7c, 0x7a, 0x54, 0x84, 0xc6, 0xeb, 0x01, 0xab, 0xac, 0x1d, 0x6d, 0x83,
0xed, 0x2c, 0x5b, 0x2f, 0x96, 0xbf, 0x76, 0xda, 0x2a, 0xb7, 0x13, 0xbd, 0x0e, 0xe8, 0xfc, 0x5e, 0xda, 0x59, 0xb6, 0x9c, 0xcd, 0x7f, 0xed, 0xb4, 0x55, 0x6e, 0x27, 0x3a, 0x1d, 0xd0, 0xf9, 0xbd,
0xd4, 0xb2, 0xd9, 0x2c, 0x96, 0x8f, 0x4f, 0x90, 0x7b, 0x82, 0x28, 0xd7, 0x4c, 0x03, 0x29, 0x10, 0xa8, 0x65, 0xb3, 0x99, 0xcd, 0x9f, 0x9e, 0x21, 0x0f, 0x04, 0x51, 0xae, 0x19, 0x7b, 0x52, 0x20,
0x1d, 0xe0, 0xa5, 0x81, 0x78, 0xbb, 0xde, 0x7f, 0x56, 0x0b, 0x3e, 0xb5, 0x7c, 0x29, 0x02, 0xee, 0xd6, 0x80, 0xd7, 0x06, 0xe2, 0xed, 0x72, 0xff, 0x59, 0xcd, 0xf8, 0xd8, 0xf2, 0xb9, 0x08, 0xb8,
0x0d, 0x08, 0xa5, 0xc3, 0x68, 0xe4, 0xbe, 0xe4, 0xd6, 0x59, 0xe0, 0x2f, 0xff, 0x3b, 0x32, 0x84, 0x37, 0x20, 0x94, 0x0e, 0x83, 0x91, 0xfb, 0x92, 0x5b, 0x67, 0x81, 0xbf, 0xfa, 0xef, 0x48, 0x1f,
0xee, 0xf9, 0x4c, 0x6d, 0x5c, 0xb3, 0xe1, 0x8f, 0x59, 0x91, 0x1f, 0x24, 0x1e, 0xa4, 0xb2, 0xe0, 0xd6, 0x2f, 0x67, 0x6a, 0xe3, 0x9a, 0x0d, 0x7f, 0xca, 0x8a, 0xfc, 0x20, 0xf1, 0x20, 0x95, 0x05,
0x9b, 0x92, 0xe7, 0x01, 0x10, 0xb5, 0xed, 0x42, 0x1e, 0xc4, 0xcf, 0x70, 0x3e, 0x96, 0xef, 0x78, 0xdf, 0x94, 0x3c, 0x0f, 0x80, 0xa8, 0xed, 0x3a, 0xe4, 0x41, 0xfc, 0x0c, 0x97, 0x43, 0xf9, 0x8e,
0xf5, 0x17, 0x32, 0x52, 0x55, 0xd9, 0x07, 0x3d, 0x44, 0x03, 0xd8, 0xe4, 0xcd, 0x82, 0xcf, 0xf4, 0x57, 0x7f, 0x21, 0x23, 0x55, 0x95, 0x7d, 0xd0, 0x7d, 0x34, 0x80, 0x8d, 0xde, 0xcc, 0xf8, 0x44,
0x4d, 0x08, 0x7c, 0xf9, 0x9e, 0x90, 0x09, 0x51, 0xe4, 0xb3, 0xa5, 0xb5, 0x53, 0x7b, 0xe6, 0xac, 0xdf, 0x84, 0xc0, 0xe7, 0xef, 0x09, 0x99, 0x10, 0x45, 0x3e, 0x59, 0x5a, 0x3b, 0xb5, 0x67, 0xce,
0x71, 0x52, 0x95, 0xfc, 0x13, 0xe0, 0xd7, 0xc5, 0x92, 0xe8, 0xfa, 0xd3, 0x2a, 0xbb, 0x72, 0xce, 0x1a, 0x27, 0x55, 0xc9, 0x3f, 0x01, 0x7e, 0x9d, 0xcd, 0x89, 0xae, 0x3b, 0xaf, 0xb2, 0x1b, 0xe7,
0x5e, 0x39, 0xc5, 0x92, 0x75, 0xb7, 0xae, 0xc5, 0x9d, 0xf4, 0xf0, 0xe4, 0x21, 0x21, 0x8a, 0xd6, 0xec, 0x8d, 0x53, 0x2c, 0x59, 0x77, 0xe7, 0x5a, 0xdc, 0x49, 0x0f, 0xcf, 0x1e, 0x12, 0xa2, 0x68,
0xf9, 0x81, 0x51, 0x26, 0xbd, 0xa3, 0xd9, 0x9b, 0xeb, 0xdb, 0x3b, 0xce, 0x64, 0xb2, 0x89, 0x44, 0x9d, 0xef, 0x19, 0x65, 0xd2, 0x39, 0x9a, 0x5d, 0xdd, 0xde, 0xdd, 0x73, 0x26, 0x93, 0x4d, 0x24,
0x4e, 0x09, 0xc7, 0x99, 0xa6, 0x57, 0xe4, 0x0b, 0xcb, 0x80, 0x1c, 0xdc, 0x8f, 0x14, 0xce, 0x30, 0x72, 0x4c, 0x38, 0xce, 0x34, 0xbd, 0x22, 0x5f, 0x58, 0x06, 0xe4, 0xe0, 0x7e, 0xa0, 0x70, 0xfa,
0x19, 0xd4, 0xa3, 0xf4, 0x98, 0xc7, 0xf9, 0x15, 0xc1, 0x24, 0x27, 0x05, 0x61, 0xaa, 0x07, 0x4d, 0xd1, 0xa0, 0x1e, 0xa4, 0xc7, 0x3c, 0xce, 0x2f, 0x08, 0x26, 0x39, 0x29, 0x08, 0x63, 0xdd, 0x6b,
0xa9, 0xde, 0x27, 0x01, 0x61, 0x94, 0x96, 0x35, 0x46, 0x86, 0x50, 0xf2, 0xa0, 0x47, 0x5e, 0x9d, 0x4a, 0xf5, 0x21, 0x09, 0x08, 0x83, 0xb4, 0xac, 0x31, 0x32, 0x84, 0x92, 0x07, 0x3d, 0xf0, 0xea,
0x88, 0x57, 0x6f, 0xc4, 0xc9, 0xaa, 0x3e, 0x7d, 0x2b, 0x5e, 0x9f, 0x44, 0x67, 0x08, 0x40, 0xea, 0x54, 0x9c, 0xbd, 0x11, 0xa7, 0x8b, 0xfa, 0xfc, 0xad, 0x78, 0x7d, 0x16, 0x9d, 0x21, 0x00, 0xa9,
0x7d, 0x75, 0xe1, 0x76, 0x49, 0x3d, 0xc3, 0x1e, 0x98, 0xa1, 0x6f, 0x06, 0x64, 0x1e, 0x0c, 0xc8, 0xf7, 0xd5, 0x95, 0xdb, 0x25, 0xf5, 0x0c, 0x3b, 0x60, 0x86, 0xbe, 0x19, 0x90, 0x79, 0x30, 0x20,
0x00, 0x67, 0xac, 0x90, 0x2c, 0xeb, 0x3d, 0xb4, 0x25, 0xef, 0x11, 0xc7, 0x70, 0x96, 0xe7, 0x9d, 0x03, 0x5c, 0xb0, 0x42, 0xb2, 0xac, 0xf3, 0xd0, 0x96, 0xbc, 0x43, 0x1c, 0xc2, 0x45, 0x9e, 0xaf,
0xc6, 0x7e, 0xaa, 0x45, 0xe3, 0x86, 0xfc, 0xb0, 0xe0, 0x64, 0x20, 0xe4, 0x71, 0xc9, 0xfc, 0x30, 0x35, 0x76, 0x63, 0x2d, 0x1a, 0xd7, 0xe7, 0x87, 0x05, 0x47, 0x03, 0x21, 0x8f, 0x4b, 0xe6, 0x87,
0x16, 0x38, 0x43, 0xe9, 0x29, 0xa9, 0x92, 0xff, 0xa8, 0x8d, 0xb4, 0x1b, 0xd2, 0xa3, 0x87, 0x8e, 0xb1, 0xc0, 0x19, 0x4a, 0x4f, 0x49, 0x95, 0xfc, 0x47, 0x6d, 0xa4, 0xdd, 0x90, 0x1e, 0xdd, 0xaf,
0x65, 0xc9, 0xfe, 0x23, 0x11, 0x3d, 0x11, 0xa1, 0xd7, 0x60, 0x54, 0x10, 0xda, 0x1d, 0x78, 0x8f, 0x59, 0x96, 0xec, 0x3f, 0x12, 0xd1, 0x13, 0x11, 0x3a, 0x0d, 0x46, 0x05, 0xa1, 0xdd, 0x81, 0xf7,
0x14, 0xcf, 0xb8, 0x45, 0xd8, 0x76, 0xe7, 0xc9, 0xf9, 0xb2, 0x25, 0x91, 0xab, 0xf0, 0x30, 0x91, 0x48, 0xf1, 0x82, 0x5b, 0x84, 0xed, 0xfa, 0x32, 0x39, 0x5f, 0xb6, 0x24, 0x72, 0x11, 0x1e, 0x47,
0x9b, 0xb1, 0x9f, 0xb9, 0x4c, 0x6b, 0x14, 0xda, 0x8e, 0x13, 0xb2, 0xd9, 0xa2, 0x56, 0x1b, 0x38, 0x72, 0x33, 0xf6, 0x33, 0x97, 0x69, 0x8d, 0x42, 0xdb, 0x61, 0x44, 0x36, 0x59, 0xd4, 0x6a, 0x03,
0x76, 0xf9, 0x68, 0xa4, 0x87, 0x87, 0x49, 0x7b, 0x50, 0x33, 0xba, 0x9e, 0x10, 0xa9, 0x8e, 0x33, 0xc7, 0x2e, 0x1f, 0x8d, 0xf4, 0xf0, 0x38, 0x6a, 0x0f, 0x6a, 0x42, 0xd7, 0x23, 0x22, 0xd5, 0x71,
0x7c, 0xb6, 0x8e, 0xc8, 0xe6, 0x70, 0x5e, 0x14, 0xf9, 0xfc, 0xfa, 0x1f, 0xd0, 0xf9, 0x10, 0xfd, 0x82, 0x4f, 0xd6, 0x11, 0xd9, 0x14, 0xce, 0x49, 0x91, 0x4f, 0xaf, 0xff, 0x01, 0x9d, 0x0e, 0xd1,
0x6e, 0x8c, 0x6e, 0x36, 0x25, 0x5f, 0x47, 0xbb, 0xd7, 0xd4, 0xf2, 0x3f, 0x43, 0x29, 0x97, 0xaa, 0xef, 0xc6, 0xe8, 0x66, 0x53, 0xf2, 0x65, 0xb4, 0x7b, 0x49, 0x2d, 0xff, 0x33, 0x94, 0x72, 0xa9,
0x50, 0x7a, 0x9b, 0xa5, 0xf8, 0x62, 0x47, 0x89, 0xa6, 0x4a, 0xec, 0x54, 0x3c, 0x21, 0x04, 0x81, 0x0a, 0xa5, 0xb7, 0x59, 0x8a, 0x2f, 0x76, 0x94, 0x68, 0xaa, 0xc4, 0x4e, 0xc5, 0x13, 0x42, 0x10,
0x13, 0xf9, 0x4d, 0xda, 0x96, 0x29, 0xc7, 0xac, 0x43, 0xca, 0xcb, 0xd1, 0xc1, 0x79, 0xd2, 0xda, 0x38, 0x91, 0xaf, 0xd2, 0xb6, 0x4c, 0x39, 0x66, 0x1d, 0x52, 0x5e, 0x8e, 0x0e, 0xce, 0x93, 0xd6,
0x7a, 0x08, 0x7d, 0x8a, 0x64, 0x94, 0x1d, 0xb0, 0xb3, 0x65, 0x91, 0x13, 0x5f, 0x5c, 0x37, 0x16, 0xd6, 0x43, 0xe8, 0x52, 0x24, 0x83, 0x5c, 0x03, 0xbb, 0x98, 0x17, 0x39, 0xf1, 0xc5, 0x75, 0x63,
0x2e, 0xb6, 0x2f, 0xfe, 0xd6, 0xbf, 0x01, 0x81, 0x67, 0xfb, 0x6d, 0xec, 0x03, 0x00, 0x00 0xe1, 0x62, 0xfb, 0xe2, 0x6f, 0xfd, 0x1b, 0x89, 0xb3, 0x5d, 0xb6, 0xec, 0x03, 0x00, 0x00
}; };

View File

@@ -1574,164 +1574,164 @@ const uint8_t PAGE_settings_time[] PROGMEM = {
// Autogenerated from wled00/data/settings_sec.htm, do not edit!! // Autogenerated from wled00/data/settings_sec.htm, do not edit!!
const uint16_t PAGE_settings_sec_length = 2494; const uint16_t PAGE_settings_sec_length = 2495;
const uint8_t PAGE_settings_sec[] PROGMEM = { const uint8_t PAGE_settings_sec[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x58, 0xff, 0x72, 0xdb, 0xb8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x58, 0xff, 0x72, 0xdb, 0xb8,
0x11, 0xfe, 0x5f, 0x4f, 0x01, 0x21, 0x33, 0x39, 0xb1, 0xa1, 0x29, 0xc7, 0x49, 0x33, 0x89, 0x23, 0x11, 0xfe, 0x5f, 0x4f, 0x01, 0xe1, 0x66, 0x72, 0x62, 0x43, 0x53, 0xb6, 0x93, 0x5e, 0x73, 0x8e,
0x2a, 0xb5, 0x63, 0xe7, 0xe2, 0x8e, 0x1d, 0x7b, 0x22, 0xe5, 0xd2, 0xce, 0xf5, 0x26, 0x03, 0x91, 0xa8, 0x9c, 0x1d, 0x3b, 0x17, 0x77, 0xec, 0xd8, 0x13, 0x29, 0x97, 0x76, 0xae, 0x37, 0x19, 0x88,
0x90, 0x88, 0x88, 0x24, 0x78, 0x00, 0x68, 0x45, 0xcd, 0xdd, 0x7b, 0xf4, 0x69, 0xfa, 0x30, 0x7d, 0x84, 0x44, 0x44, 0x24, 0xc1, 0x03, 0x40, 0x2b, 0x6a, 0xee, 0xde, 0xa3, 0x4f, 0xd3, 0x87, 0xe9,
0x92, 0x7e, 0x0b, 0x92, 0x92, 0xec, 0x38, 0xb9, 0xc9, 0xb4, 0x7f, 0xd8, 0x12, 0x09, 0x60, 0x7f, 0x93, 0xf4, 0x5b, 0x90, 0x94, 0x64, 0xc7, 0xc9, 0x4d, 0xa6, 0xfd, 0xc3, 0x96, 0x48, 0x00, 0xfb,
0x7c, 0xbb, 0xfb, 0xed, 0x42, 0xa3, 0xfe, 0xc9, 0xe5, 0xcb, 0xe9, 0xdf, 0xaf, 0x4e, 0x59, 0xe6, 0xe3, 0xdb, 0xdd, 0x6f, 0x17, 0x1a, 0xf5, 0x4f, 0xaf, 0x9e, 0x4f, 0xff, 0x7e, 0x7d, 0xc6, 0x32,
0x8a, 0x7c, 0x3c, 0xa2, 0xff, 0x2c, 0x17, 0xe5, 0x22, 0xe6, 0xb2, 0xe4, 0x78, 0x96, 0x22, 0x1d, 0x57, 0xe4, 0xe3, 0x11, 0xfd, 0x67, 0xb9, 0x28, 0x17, 0x31, 0x97, 0x25, 0xc7, 0xb3, 0x14, 0xe9,
0x8f, 0x0a, 0xe9, 0x04, 0x2b, 0x45, 0x21, 0x63, 0x7e, 0xad, 0xe4, 0xaa, 0xd2, 0xc6, 0x71, 0x96, 0x78, 0x54, 0x48, 0x27, 0x58, 0x29, 0x0a, 0x19, 0xf3, 0x1b, 0x25, 0x57, 0x95, 0x36, 0x8e, 0xb3,
0xe8, 0xd2, 0xc9, 0xd2, 0xc5, 0x7c, 0xa5, 0x52, 0x97, 0xc5, 0x7f, 0xde, 0xdf, 0xe7, 0xe3, 0x5e, 0x44, 0x97, 0x4e, 0x96, 0x2e, 0xe6, 0x2b, 0x95, 0xba, 0x2c, 0xfe, 0xf3, 0xfe, 0x3e, 0x1f, 0xf7,
0xb3, 0xb5, 0x77, 0x6b, 0x2d, 0x95, 0xd7, 0x2a, 0x91, 0x7b, 0xfe, 0x21, 0x54, 0xa5, 0x72, 0x4a, 0x9a, 0xad, 0xbd, 0x3b, 0x6b, 0xa9, 0xbc, 0x51, 0x89, 0xdc, 0xf3, 0x0f, 0xa1, 0x2a, 0x95, 0x53,
0xe4, 0x7b, 0x36, 0x11, 0xb9, 0x8c, 0x1f, 0x86, 0x85, 0xf8, 0xa4, 0x8a, 0xba, 0xd8, 0x3c, 0xd7, 0x22, 0xdf, 0xb3, 0x89, 0xc8, 0x65, 0x7c, 0x10, 0x16, 0xe2, 0x83, 0x2a, 0xea, 0x62, 0xf3, 0x5c,
0x56, 0x1a, 0xff, 0x20, 0x66, 0x78, 0x2e, 0x35, 0x67, 0xbd, 0x5b, 0xaa, 0x5b, 0x83, 0x92, 0x4c, 0x5b, 0x69, 0xfc, 0x83, 0x98, 0xe1, 0xb9, 0xd4, 0x9c, 0xf5, 0xee, 0xa8, 0x6e, 0x0d, 0x4a, 0x32,
0x18, 0x2b, 0xa1, 0xa4, 0x76, 0xf3, 0xbd, 0xa7, 0x78, 0xeb, 0x94, 0xcb, 0xe5, 0xf8, 0x42, 0xd9, 0x61, 0xac, 0x84, 0x92, 0xda, 0xcd, 0xf7, 0x9e, 0xe0, 0xad, 0x53, 0x2e, 0x97, 0xe3, 0x4b, 0x65,
0x84, 0x4d, 0xa4, 0x73, 0xaa, 0x5c, 0xd8, 0xd1, 0xb0, 0x79, 0x39, 0xb2, 0x89, 0x51, 0x95, 0x1b, 0x13, 0x36, 0x91, 0xce, 0xa9, 0x72, 0x61, 0x47, 0xc3, 0xe6, 0xe5, 0xc8, 0x26, 0x46, 0x55, 0x6e,
0xf7, 0xae, 0x85, 0x61, 0xb9, 0x4e, 0x54, 0x15, 0x3a, 0x55, 0x48, 0x5d, 0xbb, 0x30, 0x8d, 0x53, 0xdc, 0xbb, 0x11, 0x86, 0xe5, 0x3a, 0x51, 0x55, 0xe8, 0x54, 0x21, 0x75, 0xed, 0xc2, 0x34, 0x4e,
0x9d, 0xd4, 0x05, 0xcc, 0x0d, 0xb1, 0x10, 0xf7, 0x1f, 0x3e, 0x9f, 0xd7, 0x65, 0xe2, 0x94, 0x2e, 0x75, 0x52, 0x17, 0x30, 0x37, 0xc4, 0x42, 0xdc, 0x3f, 0x78, 0x3a, 0xaf, 0xcb, 0xc4, 0x29, 0x5d,
0xd9, 0xeb, 0x41, 0xf0, 0x79, 0xa5, 0xca, 0x54, 0xaf, 0x22, 0x5d, 0xc9, 0x72, 0xc0, 0x33, 0xe7, 0xb2, 0x97, 0x83, 0xe0, 0xe3, 0x4a, 0x95, 0xa9, 0x5e, 0x45, 0xba, 0x92, 0xe5, 0x80, 0x67, 0xce,
0x2a, 0x7b, 0x38, 0x1c, 0x16, 0x45, 0xb4, 0x2c, 0x75, 0xb4, 0xca, 0x65, 0x1a, 0x2d, 0xe4, 0x70, 0x55, 0xf6, 0x68, 0x38, 0x2c, 0x8a, 0x68, 0x59, 0xea, 0x68, 0x95, 0xcb, 0x34, 0x5a, 0xc8, 0xe1,
0x2e, 0x85, 0xab, 0x8d, 0xb4, 0x43, 0xdb, 0xaa, 0x1d, 0xde, 0xb3, 0x32, 0xa9, 0x8d, 0x72, 0xeb, 0x5c, 0x0a, 0x57, 0x1b, 0x69, 0x87, 0xb6, 0x55, 0x3b, 0xfc, 0xc6, 0xca, 0xa4, 0x36, 0xca, 0xad,
0xbd, 0xee, 0x15, 0x0f, 0x7e, 0xdf, 0xc8, 0x3d, 0xbe, 0x2d, 0x77, 0x73, 0x90, 0x87, 0xfc, 0x83, 0xf7, 0xba, 0x57, 0x3c, 0xf8, 0x7d, 0x23, 0xf7, 0xe4, 0xae, 0xdc, 0xcd, 0x41, 0x1e, 0xf2, 0x77,
0x95, 0xf9, 0x7c, 0x77, 0xf7, 0xbb, 0x2f, 0x76, 0xd7, 0x55, 0x2a, 0x9c, 0xbc, 0x6b, 0xef, 0xe2, 0x56, 0xe6, 0xf3, 0xdd, 0xdd, 0x6f, 0x3e, 0xd9, 0x5d, 0x57, 0xa9, 0x70, 0xf2, 0xbe, 0xbd, 0x8b,
0x2c, 0x1d, 0xc8, 0xe0, 0xb3, 0x91, 0xb0, 0xa7, 0x64, 0x64, 0x9c, 0x3b, 0xcd, 0x25, 0x39, 0x77, 0xf3, 0x74, 0x20, 0x83, 0x8f, 0x46, 0xc2, 0x9e, 0x92, 0x91, 0x71, 0xee, 0x2c, 0x97, 0xe4, 0xdc,
0xbc, 0xf6, 0x4b, 0xdb, 0xad, 0xca, 0x5e, 0xce, 0x3e, 0xee, 0x6c, 0x96, 0xf7, 0xef, 0x73, 0x3d, 0xc9, 0xda, 0x2f, 0x6d, 0xb7, 0x2a, 0x7b, 0x35, 0x7b, 0xbf, 0xb3, 0x59, 0x3e, 0x78, 0xc0, 0xf5,
0xfb, 0x28, 0x13, 0xc7, 0xe3, 0xd8, 0xad, 0x2b, 0xa9, 0xe7, 0xf4, 0xae, 0x7f, 0x64, 0x8c, 0x58, 0xec, 0xbd, 0x4c, 0x1c, 0x8f, 0x63, 0xb7, 0xae, 0xa4, 0x9e, 0xd3, 0xbb, 0xfe, 0xb1, 0x31, 0x62,
0x47, 0xca, 0xfa, 0xcf, 0x1b, 0x12, 0x72, 0x2d, 0xd2, 0xbf, 0x4e, 0x06, 0x32, 0x74, 0x71, 0x7f, 0x1d, 0x29, 0xeb, 0x3f, 0x6f, 0x49, 0xc8, 0xb5, 0x48, 0xff, 0x3a, 0x19, 0xc8, 0xd0, 0xc5, 0xfd,
0x3f, 0xf8, 0x9c, 0x4b, 0xc7, 0x74, 0x9c, 0x46, 0x89, 0x01, 0x1c, 0xb2, 0x55, 0x3b, 0xe0, 0x0d, 0xfd, 0xe0, 0x63, 0x2e, 0x1d, 0xd3, 0x71, 0x1a, 0x25, 0x06, 0x70, 0xc8, 0x56, 0xed, 0x80, 0x37,
0xf2, 0x3c, 0x78, 0xae, 0x23, 0x78, 0x79, 0xe4, 0x9c, 0x51, 0xb3, 0xda, 0x49, 0x2c, 0x98, 0x84, 0xc8, 0xf3, 0xe0, 0xa9, 0x8e, 0xe0, 0xe5, 0xb1, 0x73, 0x46, 0xcd, 0x6a, 0x27, 0xb1, 0x60, 0x12,
0x87, 0x32, 0x08, 0x6f, 0xbf, 0x27, 0xdd, 0xf0, 0xcd, 0xc9, 0x4f, 0x6e, 0xf8, 0x51, 0x5c, 0x8b, 0x1e, 0xca, 0x20, 0xbc, 0xfb, 0x9e, 0x74, 0xc3, 0x37, 0x27, 0x3f, 0xb8, 0xe1, 0x7b, 0x71, 0x23,
0x4e, 0xc0, 0x17, 0x1b, 0x85, 0x5d, 0x97, 0x10, 0xe1, 0x82, 0x30, 0x8d, 0x66, 0x3a, 0x5d, 0x47, 0x3a, 0x01, 0x9f, 0x6c, 0x14, 0x76, 0x5d, 0x42, 0x84, 0x0b, 0xc2, 0x34, 0x9a, 0xe9, 0x74, 0x1d,
0xa2, 0x02, 0x3e, 0xe9, 0xcb, 0x4c, 0xe5, 0xe9, 0x40, 0xd3, 0x7e, 0x91, 0xa6, 0xa7, 0xd7, 0xb0, 0x89, 0x0a, 0xf8, 0xa4, 0xcf, 0x33, 0x95, 0xa7, 0x03, 0x4d, 0xfb, 0x45, 0x9a, 0x9e, 0xdd, 0xc0,
0xe2, 0x5c, 0x59, 0xe4, 0xa3, 0x34, 0x03, 0x4e, 0x36, 0xf3, 0x70, 0x10, 0xc4, 0xe3, 0xcf, 0x3f, 0x8a, 0x0b, 0x65, 0x91, 0x8f, 0xd2, 0x0c, 0x38, 0xd9, 0xcc, 0xc3, 0x41, 0x10, 0x8f, 0x3f, 0xfe,
0x4a, 0xf7, 0xd3, 0x20, 0x08, 0x21, 0xf3, 0x38, 0x59, 0xbe, 0x52, 0xb9, 0xa4, 0x34, 0x1b, 0x10, 0x28, 0xdd, 0x4f, 0x83, 0x20, 0x84, 0xcc, 0x93, 0x64, 0xf9, 0x42, 0xe5, 0x92, 0xd2, 0x6c, 0x40,
0x82, 0x7c, 0x96, 0x2c, 0x93, 0xf9, 0x82, 0x07, 0x5f, 0x5d, 0xad, 0x10, 0x6d, 0xe9, 0x10, 0xd4, 0x08, 0xf2, 0x59, 0xb2, 0x4c, 0xe6, 0x0b, 0x1e, 0x7c, 0x76, 0xb5, 0x42, 0xb4, 0xa5, 0x43, 0x50,
0xe0, 0xf7, 0xbb, 0xf5, 0x48, 0x63, 0xb4, 0x81, 0x7b, 0xd0, 0x83, 0x62, 0xb0, 0x3a, 0x97, 0x51, 0x83, 0xdf, 0xef, 0xd7, 0x23, 0x8d, 0xd1, 0x06, 0xee, 0x41, 0x0f, 0x8a, 0xc1, 0xea, 0x5c, 0x46,
0xae, 0x17, 0x03, 0x7e, 0x4a, 0xef, 0x59, 0x0b, 0x1e, 0x22, 0xce, 0xe6, 0x10, 0xed, 0x61, 0x40, 0xb9, 0x5e, 0x0c, 0xf8, 0x19, 0xbd, 0x67, 0x2d, 0x78, 0x88, 0x38, 0x9b, 0x43, 0xb4, 0x87, 0x01,
0xf6, 0x1b, 0xc0, 0x75, 0xde, 0xbe, 0x07, 0xfa, 0x38, 0x38, 0x57, 0x8b, 0xda, 0x08, 0x8f, 0x76, 0xd9, 0x6f, 0x00, 0xd7, 0x45, 0xfb, 0x1e, 0xe8, 0xe3, 0xe0, 0x5c, 0x2d, 0x6a, 0x23, 0x3c, 0xda,
0x03, 0x03, 0x9b, 0x0b, 0x45, 0x59, 0xf7, 0x8f, 0xf2, 0xac, 0x4c, 0x74, 0x51, 0x01, 0x74, 0xc9, 0x0d, 0x0c, 0x6c, 0x2e, 0x14, 0x65, 0xdd, 0x3f, 0xca, 0xf3, 0x32, 0xd1, 0x45, 0x05, 0xd0, 0x25,
0x2a, 0xb1, 0x90, 0x0c, 0x29, 0x21, 0xfa, 0xc8, 0x85, 0x9d, 0x00, 0xd9, 0x4c, 0xaf, 0xa6, 0x5a, 0xab, 0xc4, 0x42, 0x32, 0xa4, 0x84, 0xe8, 0x23, 0x17, 0x76, 0x02, 0x64, 0x33, 0xbd, 0x9a, 0x6a,
0x58, 0xd7, 0xc4, 0xe8, 0x61, 0xf0, 0x99, 0xd2, 0x5f, 0xc7, 0xde, 0x0b, 0x47, 0x0b, 0x3e, 0x2c, 0x61, 0x5d, 0x13, 0xa3, 0x83, 0xe0, 0x23, 0xa5, 0xbf, 0x8e, 0xbd, 0x17, 0x8e, 0x16, 0x7c, 0x58,
0xaa, 0x84, 0xc9, 0xaf, 0xa7, 0x17, 0xe7, 0xb1, 0x84, 0x2f, 0x49, 0x2e, 0xac, 0x25, 0x47, 0xc8, 0x54, 0x09, 0x93, 0x5f, 0x4e, 0x2f, 0x2f, 0x62, 0x09, 0x5f, 0x92, 0x5c, 0x58, 0x4b, 0x8e, 0x90,
0xab, 0x81, 0x7b, 0xd1, 0xba, 0x72, 0xc8, 0x49, 0x1a, 0xa2, 0x90, 0xe4, 0x52, 0x98, 0x69, 0x53, 0x57, 0x03, 0xf7, 0xac, 0x75, 0xe5, 0x88, 0x93, 0x34, 0x44, 0x21, 0xc9, 0xa5, 0x30, 0xd3, 0xa6,
0x3c, 0x83, 0xb6, 0x88, 0x7c, 0x6c, 0xdc, 0x1a, 0x4e, 0x8a, 0x52, 0x15, 0xde, 0xde, 0x98, 0x97, 0x78, 0x06, 0x6d, 0x11, 0xf9, 0xd8, 0xb8, 0x35, 0x9c, 0x14, 0xa5, 0x2a, 0xbc, 0xbd, 0x31, 0x2f,
0xba, 0x84, 0x67, 0xed, 0x8e, 0x18, 0x70, 0x75, 0x87, 0x06, 0x9d, 0x81, 0x48, 0xec, 0x5d, 0x7d, 0x75, 0x09, 0xcf, 0xda, 0x1d, 0x31, 0xe0, 0xea, 0x0e, 0x0d, 0x3a, 0x03, 0x91, 0xd8, 0xbb, 0xfa,
0x46, 0x16, 0xfa, 0x9a, 0x12, 0xc3, 0x2b, 0x02, 0xb0, 0x07, 0xcf, 0xf6, 0xf7, 0x77, 0xdc, 0xa9, 0x8c, 0x2c, 0xf4, 0x0d, 0x25, 0x86, 0x57, 0x04, 0x60, 0x0f, 0xbf, 0xdf, 0xdf, 0xdf, 0x71, 0xa7,
0x2b, 0x02, 0x8d, 0x62, 0x41, 0xfe, 0x74, 0xce, 0x94, 0x72, 0xc5, 0xfe, 0x76, 0x71, 0xfe, 0x1a, 0xae, 0x08, 0x34, 0x8a, 0x05, 0xf9, 0xd3, 0x39, 0x53, 0xca, 0x15, 0xfb, 0xdb, 0xe5, 0xc5, 0x4b,
0xa5, 0xf9, 0x56, 0xfe, 0x5a, 0x4b, 0xeb, 0x9e, 0x7f, 0x23, 0xf0, 0x3b, 0xaa, 0xb7, 0xe8, 0xb8, 0x94, 0xe6, 0x6b, 0xf9, 0x6b, 0x2d, 0xad, 0x7b, 0xfa, 0x85, 0xc0, 0xef, 0xa8, 0xde, 0xa2, 0xe3,
0x4c, 0x59, 0x68, 0xb7, 0x15, 0x22, 0x25, 0xa7, 0xc8, 0xbb, 0xd0, 0xbf, 0xb1, 0x0e, 0x65, 0x6d, 0x32, 0x65, 0xa1, 0xdd, 0x56, 0x88, 0x94, 0x9c, 0x22, 0xef, 0x42, 0xff, 0xc6, 0x3a, 0x94, 0xb5,
0xc7, 0xf1, 0x63, 0xb2, 0x22, 0xf8, 0x66, 0x9c, 0xb7, 0x72, 0xe5, 0xae, 0x60, 0x49, 0x32, 0x92, 0x1d, 0xc7, 0x8f, 0xc9, 0x8a, 0xe0, 0x8b, 0x71, 0xde, 0xca, 0x95, 0xbb, 0x82, 0x25, 0xc9, 0x48,
0x65, 0xd8, 0xef, 0x04, 0x34, 0x05, 0x7c, 0x75, 0x39, 0x99, 0x22, 0xc3, 0x87, 0x8d, 0x43, 0x88, 0x96, 0x61, 0xbf, 0x13, 0xd0, 0x14, 0xf0, 0xf5, 0xd5, 0x64, 0x8a, 0x0c, 0x1f, 0x36, 0x0e, 0x21,
0x01, 0x79, 0x52, 0x7a, 0x4f, 0x5e, 0x69, 0x53, 0x9c, 0x20, 0x92, 0xcf, 0xdb, 0xaa, 0x2c, 0xdb, 0x06, 0xe4, 0x49, 0xe9, 0x3d, 0x79, 0xa1, 0x4d, 0x71, 0x8a, 0x48, 0x3e, 0x6d, 0xab, 0xb2, 0x6c,
0xa4, 0x1e, 0x70, 0x8a, 0x2f, 0x12, 0x25, 0xa2, 0x84, 0xb1, 0x3f, 0xef, 0xff, 0x12, 0x36, 0xa8, 0x93, 0x7a, 0xc0, 0x29, 0xbe, 0x48, 0x94, 0x88, 0x12, 0xc6, 0xfe, 0xbc, 0xff, 0x4b, 0xd8, 0xa0,
0xd3, 0x5a, 0x19, 0xe0, 0xfd, 0xb5, 0xc8, 0x6b, 0xb0, 0x24, 0x0f, 0xfb, 0x0f, 0xb7, 0x90, 0x25, 0x4e, 0x6b, 0x65, 0x80, 0xf7, 0x37, 0x22, 0xaf, 0xc1, 0x92, 0x3c, 0xec, 0x1f, 0x6c, 0x21, 0x4b,
0x99, 0x4c, 0x96, 0x6f, 0xea, 0x62, 0x5b, 0xe7, 0xfd, 0x41, 0x5f, 0x92, 0x0b, 0xd1, 0x52, 0xae, 0x32, 0x99, 0x2c, 0x5f, 0xd5, 0xc5, 0xb6, 0xce, 0xfb, 0x83, 0xbe, 0x24, 0x17, 0xa2, 0xa5, 0x5c,
0x23, 0x84, 0x2a, 0xc9, 0x06, 0xc3, 0x9f, 0xf7, 0xf7, 0x9e, 0xfd, 0x32, 0x0c, 0x50, 0xec, 0x3f, 0x47, 0x08, 0x55, 0x92, 0x0d, 0x86, 0x3f, 0xef, 0xef, 0x7d, 0xff, 0xcb, 0x30, 0x40, 0xb1, 0xff,
0xf3, 0x63, 0xd8, 0x6b, 0x2b, 0x91, 0x50, 0x09, 0x4e, 0xc5, 0x0c, 0xff, 0x4f, 0xc1, 0xe5, 0x70, 0xcc, 0x4f, 0x60, 0xaf, 0xad, 0x44, 0x42, 0x25, 0x38, 0x15, 0x33, 0xfc, 0x3f, 0x03, 0x97, 0xc3,
0x91, 0x4f, 0x32, 0x35, 0x77, 0xf8, 0x7c, 0x09, 0x72, 0x37, 0x3a, 0xc7, 0xb7, 0xa3, 0x9c, 0x9e, 0x45, 0x3e, 0xc9, 0xd4, 0xdc, 0xe1, 0xf3, 0x39, 0xc8, 0xdd, 0xe8, 0x1c, 0xdf, 0x8e, 0x73, 0x7a,
0xaf, 0x04, 0x28, 0x9b, 0xde, 0x8b, 0xca, 0x9e, 0xeb, 0x64, 0x49, 0x47, 0xc0, 0xdf, 0xbe, 0x88, 0xbe, 0x16, 0xa0, 0x6c, 0x7a, 0x2f, 0x2a, 0x7b, 0xa1, 0x93, 0x25, 0x1d, 0x01, 0x7f, 0xfb, 0x22,
0x27, 0xad, 0xa4, 0x2b, 0x64, 0xe8, 0xbb, 0xaa, 0xfd, 0x72, 0xa2, 0x57, 0xa5, 0x97, 0x8b, 0x80, 0x9e, 0xb4, 0x92, 0xae, 0x91, 0xa1, 0x6f, 0xaa, 0xf6, 0xcb, 0xa9, 0x5e, 0x95, 0x5e, 0x2e, 0x02,
0xf0, 0xd7, 0xba, 0xa0, 0x0d, 0x60, 0x17, 0xbd, 0x3a, 0x97, 0x5e, 0x81, 0xff, 0xee, 0x77, 0xfb, 0xc2, 0x5f, 0xea, 0x82, 0x36, 0x80, 0x5d, 0xf4, 0xea, 0x42, 0x7a, 0x05, 0xfe, 0xbb, 0xdf, 0xed,
0x6f, 0x6f, 0xd5, 0x22, 0xdb, 0xbc, 0x6e, 0xcf, 0x9e, 0x21, 0x50, 0x86, 0x5e, 0x9e, 0x48, 0xaa, 0xbf, 0xbd, 0x56, 0x8b, 0x6c, 0xf3, 0xba, 0x3d, 0x7b, 0x8e, 0x40, 0x19, 0x7a, 0x79, 0x2a, 0xa9,
0x00, 0xfe, 0x0b, 0x92, 0x38, 0xc9, 0xeb, 0x54, 0xda, 0xc1, 0xc6, 0xbb, 0x20, 0xf8, 0xed, 0xb7, 0x02, 0xf8, 0x2f, 0x48, 0xe2, 0x24, 0xaf, 0x53, 0x69, 0x07, 0x1b, 0xef, 0x82, 0xe0, 0xb7, 0xdf,
0xf6, 0x09, 0xe5, 0x4a, 0x9f, 0x27, 0x72, 0x2e, 0xea, 0xdc, 0xa1, 0xe8, 0x51, 0x0b, 0x3b, 0x65, 0xda, 0x27, 0x94, 0x2b, 0x7d, 0x9e, 0xca, 0xb9, 0xa8, 0x73, 0x87, 0xa2, 0x47, 0x2d, 0xec, 0x94,
0x72, 0xb3, 0xc6, 0x01, 0x95, 0xbc, 0xc5, 0x34, 0xe0, 0xde, 0xb2, 0x49, 0x20, 0x4e, 0x9c, 0xff, 0xc9, 0xed, 0x1a, 0x07, 0x54, 0xf2, 0x0e, 0xd3, 0x80, 0x7b, 0xcb, 0x26, 0x81, 0x38, 0x71, 0xfe,
0x81, 0x3f, 0x90, 0x44, 0xad, 0x77, 0xed, 0x08, 0x1e, 0x0c, 0xf8, 0xfb, 0xf3, 0xd3, 0x13, 0x90, 0x3b, 0xfe, 0x50, 0x12, 0xb5, 0xde, 0xb7, 0x23, 0x78, 0x38, 0xe0, 0x6f, 0x2f, 0xce, 0x4e, 0x41,
0xa8, 0x4d, 0x5f, 0x70, 0xd4, 0x0d, 0x76, 0xdb, 0x34, 0xd8, 0xd1, 0x37, 0x41, 0xf2, 0x71, 0x0a, 0xa2, 0x36, 0x7d, 0xc6, 0x51, 0x37, 0xd8, 0x6d, 0xd3, 0x60, 0x47, 0xdf, 0x04, 0xc9, 0xc7, 0x29,
0xe3, 0x21, 0x36, 0xb5, 0xcc, 0x8e, 0xd6, 0xe3, 0xcb, 0x06, 0xa6, 0x6a, 0xa7, 0x13, 0x9d, 0xdf, 0x8c, 0x47, 0xd8, 0xd4, 0x32, 0x3b, 0x5a, 0x8f, 0x2f, 0x1b, 0x98, 0xaa, 0x9d, 0x4e, 0x74, 0xfe,
0xbf, 0x3f, 0xf0, 0xed, 0x68, 0x3f, 0x1c, 0xf8, 0x7e, 0x15, 0xd3, 0x8e, 0x7c, 0xe2, 0xb4, 0x01, 0xe0, 0xc1, 0xc0, 0xb7, 0xa3, 0xfd, 0x70, 0xe0, 0xfb, 0x55, 0x4c, 0x3b, 0xf2, 0x89, 0xd3, 0x06,
0x82, 0xa4, 0xfc, 0xcc, 0xc9, 0x82, 0xd2, 0x3a, 0x39, 0xab, 0xb8, 0x77, 0xb5, 0xd9, 0x86, 0xf3, 0x08, 0x92, 0xf2, 0x73, 0x27, 0x0b, 0x4a, 0xeb, 0xe4, 0xbc, 0xe2, 0xde, 0xd5, 0x66, 0x1b, 0xce,
0x45, 0x05, 0x1e, 0x21, 0x77, 0xd8, 0x85, 0x4e, 0x65, 0xc4, 0xae, 0x50, 0xb1, 0x56, 0x32, 0x49, 0x17, 0x15, 0x78, 0x84, 0xdc, 0x61, 0x97, 0x3a, 0x95, 0x11, 0xbb, 0x46, 0xc5, 0x5a, 0xc9, 0x24,
0x71, 0x64, 0x64, 0x1b, 0x3b, 0xbb, 0x02, 0x53, 0x84, 0x37, 0x24, 0xda, 0x9b, 0x12, 0x43, 0x2f, 0xc5, 0x91, 0x91, 0x6d, 0xec, 0xfc, 0x1a, 0x4c, 0x11, 0xde, 0x92, 0x68, 0x6f, 0x4b, 0x0c, 0xbd,
0x2d, 0x08, 0x68, 0x97, 0x67, 0x79, 0x12, 0xff, 0xc2, 0x37, 0x40, 0xf4, 0x3f, 0xfe, 0xc0, 0x2f, 0xb4, 0x20, 0xa0, 0x5d, 0x9e, 0xe5, 0x49, 0xfc, 0x33, 0xdf, 0x00, 0xd1, 0xff, 0xf8, 0x43, 0xbf,
0x1f, 0x72, 0xb8, 0xbb, 0x6d, 0x5e, 0x43, 0x1b, 0x7d, 0xb4, 0x2f, 0xaa, 0xf8, 0x09, 0xf7, 0xf8, 0x7c, 0xc4, 0xe1, 0xee, 0xb6, 0x79, 0x0d, 0x6d, 0xf4, 0xde, 0x3e, 0xab, 0xe2, 0xef, 0xb8, 0xc7,
0xf6, 0x46, 0xc3, 0xb6, 0xeb, 0x8e, 0x3c, 0x37, 0x8c, 0xff, 0xa2, 0x0a, 0xea, 0xdf, 0xac, 0x36, 0xb7, 0x37, 0x1a, 0xb6, 0x5d, 0x77, 0xe4, 0xb9, 0x61, 0xfc, 0x83, 0x2a, 0xa8, 0x7f, 0xb3, 0xda,
0x39, 0x8a, 0xdc, 0xd3, 0x45, 0x62, 0xc1, 0xa1, 0xcf, 0xb1, 0xd1, 0x6f, 0x18, 0x0d, 0x9b, 0x79, 0xe4, 0x28, 0x72, 0x4f, 0x17, 0x89, 0x05, 0x87, 0x3e, 0xc5, 0x46, 0xbf, 0x61, 0x34, 0x6c, 0xe6,
0x83, 0xc8, 0x1c, 0x1c, 0x49, 0x9a, 0x63, 0x0e, 0xb4, 0xd0, 0xdb, 0xe7, 0xa8, 0x8b, 0x1e, 0x53, 0x0d, 0x22, 0x73, 0x70, 0x24, 0x69, 0x8e, 0x39, 0xd0, 0x42, 0x6f, 0x9f, 0xa3, 0x2e, 0x7a, 0x4c,
0x78, 0xa6, 0x6f, 0x1f, 0x2c, 0x6f, 0xe7, 0x91, 0xc9, 0x9c, 0x33, 0x4c, 0x03, 0x99, 0xc6, 0x4a, 0xe1, 0x99, 0xbe, 0xbd, 0xb3, 0xbc, 0x9d, 0x47, 0x26, 0x73, 0xce, 0x30, 0x0d, 0x64, 0x1a, 0x2b,
0xa5, 0x2d, 0x0d, 0x07, 0xa9, 0xba, 0x66, 0x9e, 0x54, 0x62, 0x70, 0x1c, 0xe0, 0x58, 0xdd, 0x7c, 0x95, 0xb6, 0x34, 0x1c, 0xa4, 0xea, 0x86, 0x79, 0x52, 0x89, 0xc1, 0x71, 0x80, 0x63, 0x75, 0xfb,
0x97, 0xc9, 0xbc, 0x3a, 0xa6, 0x51, 0x05, 0x81, 0x73, 0x88, 0x06, 0xb5, 0x9b, 0x98, 0x37, 0x0f, 0x5d, 0x26, 0xf3, 0xea, 0x84, 0x46, 0x15, 0x04, 0xce, 0x21, 0x1a, 0xd4, 0x6e, 0x62, 0xde, 0x3c,
0x1c, 0x5a, 0x93, 0x5c, 0x25, 0xcb, 0x98, 0xbf, 0x26, 0xb5, 0x2f, 0x46, 0xc3, 0x66, 0x01, 0xa6, 0x70, 0x68, 0x4d, 0x72, 0x95, 0x2c, 0x63, 0xfe, 0x92, 0xd4, 0x3e, 0x1b, 0x0d, 0x9b, 0x05, 0x98,
0x41, 0xc4, 0xf8, 0xee, 0x33, 0xbd, 0xcd, 0xa1, 0x63, 0x3a, 0x44, 0x15, 0xb4, 0x3d, 0x77, 0xe3, 0x06, 0x11, 0xe3, 0xfb, 0xcf, 0xf4, 0x36, 0x87, 0x4e, 0xe8, 0x10, 0x55, 0xd0, 0xf6, 0xdc, 0xad,
0x84, 0xad, 0x67, 0x85, 0x82, 0x8d, 0x13, 0x71, 0x2d, 0xb7, 0x5b, 0x32, 0xd3, 0x89, 0xcf, 0x0e, 0x13, 0xb6, 0x9e, 0x15, 0x0a, 0x36, 0x4e, 0xc4, 0x8d, 0xdc, 0x6e, 0xc9, 0x4c, 0x27, 0x3e, 0x3b,
0xc6, 0xbd, 0x49, 0x3b, 0x39, 0xb0, 0xfb, 0xec, 0x9d, 0xef, 0xf3, 0x94, 0x9f, 0x75, 0x05, 0x6c, 0x1c, 0xf7, 0x26, 0xed, 0xe4, 0xc0, 0x1e, 0xb0, 0x37, 0xbe, 0xcf, 0x53, 0x7e, 0xd6, 0x15, 0xb0,
0x0e, 0xc6, 0xdd, 0x58, 0xc3, 0xae, 0xce, 0xde, 0x1c, 0xb2, 0x91, 0x2a, 0xab, 0xda, 0xb5, 0xa2, 0x39, 0x1c, 0x77, 0x63, 0x0d, 0xbb, 0x3e, 0x7f, 0x75, 0xc4, 0x46, 0xaa, 0xac, 0x6a, 0xd7, 0x8a,
0x2b, 0x38, 0xb7, 0xd2, 0x26, 0xe5, 0x1e, 0x24, 0xac, 0x6f, 0xe6, 0x26, 0xff, 0xdd, 0xaa, 0x7f, 0xae, 0xe0, 0xdc, 0x4a, 0x9b, 0x94, 0x7b, 0x90, 0xb0, 0xbe, 0x99, 0x9b, 0xfc, 0x77, 0xab, 0xfe,
0xe2, 0xeb, 0x63, 0x80, 0x25, 0x3e, 0x21, 0xcf, 0x17, 0x98, 0xca, 0xfc, 0x93, 0x2a, 0x77, 0x9e, 0x89, 0xaf, 0x8f, 0x01, 0x96, 0xf8, 0x80, 0x3c, 0x5f, 0x60, 0x2a, 0xf3, 0x4f, 0xaa, 0xdc, 0x79,
0x74, 0x89, 0xb2, 0xa1, 0x4c, 0x8e, 0xf9, 0x86, 0x38, 0x88, 0x09, 0x03, 0xc8, 0xaa, 0x84, 0x43, 0xd2, 0x25, 0xca, 0x86, 0x32, 0x39, 0xe6, 0x1b, 0xe2, 0x20, 0x26, 0x0c, 0x20, 0xab, 0x12, 0x0e,
0xfa, 0x60, 0xc5, 0x93, 0xc5, 0x9f, 0xa0, 0x86, 0x94, 0x17, 0x48, 0x30, 0x30, 0x3d, 0xc6, 0x27, 0xe9, 0x83, 0x15, 0x4f, 0x16, 0x7f, 0x82, 0x1a, 0x52, 0x5e, 0x20, 0xc1, 0xc0, 0xf4, 0x18, 0x9f,
0xa3, 0x12, 0xce, 0xfc, 0xb0, 0x05, 0x8d, 0xbb, 0x09, 0x27, 0xd8, 0x63, 0x96, 0xaa, 0x85, 0x72, 0x8c, 0x4a, 0x38, 0xf3, 0xc3, 0x16, 0x34, 0xee, 0x26, 0x9c, 0x60, 0x8f, 0x59, 0xaa, 0x16, 0xca,
0x0c, 0xdb, 0x66, 0x60, 0x12, 0x60, 0x62, 0x00, 0x3f, 0x85, 0xc4, 0x87, 0x1d, 0xca, 0x74, 0xae, 0x31, 0x6c, 0x9b, 0x81, 0x49, 0x80, 0x89, 0x01, 0xfc, 0x14, 0x12, 0x1f, 0x76, 0x28, 0xd3, 0xb9,
0xcd, 0xe1, 0xbd, 0xb9, 0xa0, 0x11, 0xf2, 0xfe, 0xbd, 0x67, 0x4f, 0x9f, 0x3e, 0x7d, 0xce, 0xde, 0x36, 0x47, 0xdf, 0xcc, 0x05, 0x8d, 0x90, 0x0f, 0xbe, 0xf9, 0xfe, 0xc9, 0x93, 0x27, 0x4f, 0xd9,
0x95, 0xb2, 0x4c, 0xcc, 0xba, 0x72, 0x32, 0x65, 0xce, 0x88, 0xd2, 0x16, 0xca, 0x5a, 0xaa, 0x10, 0x9b, 0x52, 0x96, 0x89, 0x59, 0x57, 0x4e, 0xa6, 0xcc, 0x19, 0x51, 0xda, 0x42, 0x59, 0x4b, 0x15,
0x76, 0x8c, 0x8e, 0x67, 0x50, 0xeb, 0xa5, 0x63, 0xab, 0x4c, 0x52, 0xfd, 0xe6, 0x98, 0x5a, 0xa8, 0xc2, 0x4e, 0xd0, 0xf1, 0x0c, 0x6a, 0xbd, 0x74, 0x6c, 0x95, 0x49, 0xaa, 0xdf, 0x1c, 0x53, 0x0b,
0x69, 0xc2, 0xd5, 0x90, 0xa5, 0x9a, 0xbd, 0xb9, 0x9c, 0x32, 0x90, 0x12, 0x5b, 0xeb, 0xda, 0xb0, 0x35, 0x4d, 0xb8, 0x1a, 0xb2, 0x54, 0xb3, 0x57, 0x57, 0x53, 0x06, 0x52, 0x62, 0x6b, 0x5d, 0x1b,
0x99, 0x28, 0x97, 0x58, 0xa4, 0x05, 0x6d, 0x42, 0x36, 0x39, 0xbb, 0x08, 0x99, 0x74, 0x49, 0xc4, 0x36, 0x13, 0xe5, 0x12, 0x8b, 0xb4, 0xa0, 0x4d, 0xc8, 0x26, 0xe7, 0x97, 0x21, 0x93, 0x2e, 0x89,
0x2a, 0x55, 0xf6, 0x7b, 0x5d, 0x60, 0xcd, 0x98, 0xb8, 0x8b, 0xad, 0x94, 0x81, 0x34, 0x6b, 0xd9, 0x58, 0xa5, 0xca, 0x7e, 0xaf, 0x0b, 0xac, 0x19, 0x13, 0x77, 0xb1, 0x95, 0x32, 0x90, 0x66, 0x2d,
0xe0, 0x72, 0x7a, 0x14, 0x30, 0xab, 0xe7, 0x6e, 0x25, 0x8c, 0x64, 0xcd, 0xc8, 0x75, 0x0b, 0x73, 0x1b, 0x5c, 0x4d, 0x8f, 0x03, 0x66, 0xf5, 0xdc, 0xad, 0x84, 0x91, 0xac, 0x19, 0xb9, 0xee, 0x60,
0x0f, 0xd2, 0x4c, 0x7f, 0xea, 0x92, 0xf1, 0xcd, 0xa5, 0xcf, 0x2b, 0x33, 0xbe, 0x42, 0x30, 0xaa, 0xee, 0x41, 0x9a, 0xe9, 0x0f, 0x5d, 0x32, 0xbe, 0xba, 0xf2, 0x79, 0x65, 0xc6, 0xd7, 0x08, 0x46,
0xcc, 0x00, 0x84, 0xaf, 0x46, 0xa9, 0x39, 0x71, 0x79, 0x75, 0x23, 0x22, 0x8f, 0x0e, 0x5a, 0x74, 0x95, 0x19, 0x80, 0xf0, 0xd9, 0x28, 0x35, 0x27, 0xae, 0xae, 0x6f, 0x45, 0xe4, 0xd1, 0x61, 0x8b,
0xa6, 0x1a, 0xe8, 0xd1, 0x00, 0xcc, 0x60, 0x46, 0xc8, 0x90, 0xf3, 0xac, 0x9b, 0x28, 0x19, 0xc6, 0xce, 0x54, 0x03, 0x3d, 0x1a, 0x80, 0x19, 0xcc, 0x08, 0x19, 0x72, 0x9e, 0x75, 0x13, 0x25, 0xc3,
0x2b, 0x8b, 0x46, 0x45, 0xce, 0xb1, 0x52, 0x12, 0x3a, 0x9a, 0x89, 0xdc, 0xea, 0x16, 0x6f, 0x97, 0x78, 0x65, 0xd1, 0xa8, 0xc8, 0x39, 0x56, 0x4a, 0x42, 0x47, 0x33, 0x91, 0x5b, 0xdd, 0xe2, 0xed,
0x49, 0x4c, 0x0e, 0xc6, 0x00, 0x12, 0xd6, 0xa9, 0xeb, 0x7b, 0xab, 0xa6, 0x99, 0xdc, 0xbc, 0xa1, 0x32, 0x89, 0xc9, 0xc1, 0x18, 0x40, 0xc2, 0x3a, 0x75, 0x7d, 0x6f, 0xd5, 0x34, 0x93, 0x9b, 0x37,
0xd9, 0xa0, 0xce, 0x53, 0x36, 0x93, 0x34, 0x47, 0x97, 0x0b, 0x88, 0xf1, 0x58, 0x42, 0x1d, 0x26, 0x34, 0x1b, 0xd4, 0x79, 0xca, 0x66, 0x92, 0xe6, 0xe8, 0x72, 0x01, 0x31, 0x1e, 0x4b, 0xa8, 0xc3,
0xc3, 0x56, 0x79, 0x1a, 0xd1, 0xb1, 0xd1, 0x6c, 0xdc, 0x3b, 0x51, 0xb6, 0xb3, 0xa6, 0xd9, 0x57, 0x64, 0xd8, 0x2a, 0x4f, 0x23, 0x3a, 0x36, 0x9a, 0x8d, 0x7b, 0xa7, 0xca, 0x76, 0xd6, 0x34, 0xfb,
0x6a, 0x87, 0x0c, 0x20, 0x90, 0x43, 0xa6, 0xa1, 0xd2, 0xac, 0x14, 0xf0, 0x16, 0x25, 0x43, 0x9a, 0x4a, 0xed, 0x90, 0x01, 0x04, 0x72, 0xc8, 0x34, 0x54, 0x9a, 0x95, 0x02, 0xde, 0xa2, 0x64, 0x48,
0x20, 0xff, 0x61, 0x47, 0x82, 0x07, 0x23, 0xe7, 0x28, 0xba, 0x8c, 0x35, 0x17, 0x80, 0x0d, 0x9a, 0x13, 0xe4, 0x3f, 0xec, 0x48, 0xf0, 0x60, 0xe4, 0x1c, 0x45, 0x97, 0xb1, 0xe6, 0x02, 0xb0, 0x41,
0x84, 0xfa, 0xcc, 0x3b, 0x3a, 0x52, 0xdb, 0x9c, 0xa6, 0x2a, 0x41, 0xb2, 0x35, 0xd3, 0x0c, 0x61, 0x93, 0x50, 0x9f, 0x79, 0x47, 0x47, 0x6a, 0x9b, 0xd3, 0x54, 0x25, 0x48, 0xb6, 0x66, 0x9a, 0x21,
0x0e, 0x06, 0x58, 0x37, 0xd6, 0x79, 0xdd, 0x6a, 0xee, 0xd5, 0xe7, 0x14, 0x26, 0x6c, 0x4b, 0x1b, 0xcc, 0xc1, 0x00, 0xeb, 0xc6, 0x3a, 0xaf, 0x5b, 0xcd, 0xbd, 0xfa, 0x9c, 0xc2, 0x84, 0x6d, 0x69,
0x93, 0xd2, 0xfe, 0x68, 0xa8, 0x1a, 0xd4, 0x4f, 0x64, 0xb9, 0x66, 0x22, 0x49, 0x28, 0x7c, 0xc0, 0x63, 0x52, 0xda, 0x1f, 0x0d, 0x55, 0x83, 0xfa, 0xa9, 0x2c, 0xd7, 0x4c, 0x24, 0x09, 0x85, 0x0f,
0xe4, 0xbd, 0x7a, 0xa5, 0x58, 0xc7, 0x4d, 0x74, 0x9a, 0x4e, 0xca, 0xf4, 0x0f, 0x62, 0x78, 0xf9, 0x98, 0xbc, 0x55, 0x2f, 0x14, 0xeb, 0xb8, 0x89, 0x4e, 0xd3, 0x49, 0x99, 0xfe, 0x41, 0x0c, 0xaf,
0xbe, 0x8d, 0x21, 0xfd, 0xbd, 0x12, 0x09, 0xe8, 0x91, 0x20, 0x87, 0x9c, 0x3f, 0x38, 0xf8, 0x76, 0xde, 0xb6, 0x31, 0xa4, 0xbf, 0x17, 0x22, 0x01, 0x3d, 0x12, 0xe4, 0x90, 0xf3, 0x07, 0x07, 0x5f,
0xd2, 0xc6, 0xee, 0x28, 0xcf, 0xb7, 0x6a, 0x45, 0x99, 0xb2, 0x76, 0x58, 0x44, 0x6e, 0x61, 0x05, 0x4f, 0xda, 0xd8, 0x1d, 0xe7, 0xf9, 0x56, 0xad, 0x28, 0x53, 0xd6, 0x0e, 0x8b, 0xc8, 0x2d, 0xac,
0x80, 0x4b, 0x4a, 0x8c, 0x0e, 0x5b, 0x33, 0xfe, 0x1f, 0x2a, 0xe1, 0x68, 0x07, 0x6f, 0x0f, 0x1f, 0x00, 0x70, 0x49, 0x89, 0xd1, 0x61, 0x6b, 0xc6, 0xff, 0x43, 0x25, 0x1c, 0xef, 0xe0, 0xed, 0xe1,
0x30, 0x86, 0x31, 0x48, 0x0b, 0x87, 0x20, 0x2f, 0x7d, 0x0c, 0x14, 0x65, 0x45, 0x22, 0x69, 0x74, 0x03, 0xc6, 0x30, 0x06, 0x69, 0xe1, 0x10, 0xe4, 0xa5, 0x8f, 0x81, 0xa2, 0xac, 0x48, 0x24, 0x8d,
0x04, 0x73, 0x36, 0x63, 0x62, 0x97, 0xf5, 0xc4, 0x3c, 0xd9, 0xa3, 0xf1, 0xa4, 0xcb, 0xf2, 0x86, 0x8e, 0x60, 0xce, 0x66, 0x4c, 0xec, 0xb2, 0x9e, 0x98, 0x27, 0x7b, 0x34, 0x9e, 0x74, 0x59, 0xde,
0x70, 0x40, 0x35, 0x8f, 0xc6, 0x7f, 0x40, 0x8f, 0xef, 0x88, 0xe9, 0x7a, 0x17, 0xa2, 0xac, 0x45, 0x10, 0x0e, 0xa8, 0xe6, 0xd1, 0xf8, 0x0f, 0xe8, 0xf1, 0x0d, 0x31, 0x5d, 0xef, 0x52, 0x94, 0xb5,
0xee, 0xc3, 0xd2, 0x1d, 0xdd, 0xf0, 0x9e, 0x19, 0x9f, 0x36, 0x19, 0x7c, 0x64, 0xd2, 0x5a, 0x95, 0xc8, 0x7d, 0x58, 0xba, 0xa3, 0x1b, 0xde, 0x33, 0xe3, 0xb3, 0x26, 0x83, 0x8f, 0x4d, 0x5a, 0xab,
0x1a, 0x9b, 0xbe, 0x8a, 0x60, 0xcb, 0x54, 0x47, 0x97, 0x7c, 0x63, 0x13, 0xb1, 0x68, 0x5d, 0x81, 0x52, 0x63, 0xd3, 0x67, 0x11, 0x6c, 0x99, 0xea, 0xf8, 0x8a, 0x6f, 0x6c, 0x22, 0x16, 0xad, 0x2b,
0x04, 0xdf, 0x62, 0xa2, 0xd3, 0xa6, 0x35, 0x4a, 0x74, 0x2c, 0x3e, 0x73, 0x18, 0xa1, 0xcb, 0x65, 0x90, 0xe0, 0x6b, 0x4c, 0x74, 0xda, 0xb4, 0x46, 0x89, 0x8e, 0xc5, 0x67, 0x0e, 0x23, 0x74, 0xb9,
0xc3, 0x76, 0xed, 0xb8, 0xce, 0x7a, 0x19, 0x12, 0x2e, 0xe6, 0xc3, 0x16, 0x70, 0x74, 0x23, 0xb2, 0x6c, 0xd8, 0xae, 0x1d, 0xd7, 0x59, 0x2f, 0x43, 0xc2, 0xc5, 0x7c, 0xd8, 0x02, 0x8e, 0x6e, 0x44,
0xb9, 0x6b, 0xcd, 0xa8, 0xbe, 0x76, 0x6a, 0xef, 0x84, 0xb7, 0xcf, 0xa3, 0xa1, 0xd8, 0x04, 0x62, 0x36, 0x77, 0xad, 0x19, 0xd5, 0xd7, 0x4e, 0xed, 0x9d, 0xf0, 0xf6, 0x79, 0x34, 0x14, 0x9b, 0x40,
0xdc, 0x6b, 0xf5, 0x6d, 0x16, 0x7d, 0x96, 0xee, 0x58, 0xed, 0x07, 0xf6, 0x36, 0xe6, 0x7e, 0x26, 0x8c, 0x7b, 0xad, 0xbe, 0xcd, 0xa2, 0xcf, 0xd2, 0x1d, 0xab, 0xfd, 0xc0, 0xde, 0xc6, 0xdc, 0xcf,
0xf3, 0x29, 0x57, 0xe1, 0x1e, 0xda, 0xe8, 0x1b, 0xb3, 0x0e, 0xba, 0xde, 0xdd, 0xd8, 0xfd, 0xb0, 0x64, 0x3e, 0xe5, 0x2a, 0xdc, 0x43, 0x1b, 0x7d, 0x63, 0xd6, 0x41, 0xd7, 0xbb, 0x1f, 0xbb, 0x6f,
0x33, 0xc7, 0xa6, 0xd1, 0x64, 0x1e, 0x91, 0x94, 0xf0, 0x96, 0xd5, 0xc1, 0x0f, 0xe3, 0x77, 0x7e, 0x77, 0xe6, 0xd8, 0x34, 0x9a, 0xcc, 0x23, 0x92, 0x12, 0xde, 0xb1, 0x3a, 0xf8, 0x76, 0xfc, 0xc6,
0xdb, 0x06, 0xd1, 0x26, 0x29, 0x37, 0x6c, 0xf5, 0x75, 0x28, 0x3a, 0x2f, 0x59, 0x8b, 0x06, 0xa0, 0x6f, 0xdb, 0x20, 0xda, 0x24, 0xe5, 0x86, 0xad, 0x3e, 0x0f, 0x45, 0xe7, 0x25, 0x6b, 0xd1, 0x00,
0x69, 0x91, 0xe8, 0x6d, 0xa1, 0x20, 0xbc, 0x3a, 0x18, 0x6e, 0xdc, 0x33, 0x6e, 0x80, 0xd1, 0x61, 0x34, 0x2d, 0x12, 0xbd, 0x2d, 0x14, 0x84, 0x57, 0x07, 0xc3, 0xad, 0x7b, 0xc6, 0x2d, 0x30, 0x3a,
0x71, 0x73, 0xc7, 0x16, 0x91, 0xde, 0xdd, 0x90, 0x1c, 0x7c, 0x1d, 0x93, 0xaf, 0x74, 0xce, 0x3b, 0x2c, 0x6e, 0xef, 0xd8, 0x22, 0xd2, 0xbb, 0x1f, 0x92, 0xc3, 0xcf, 0x63, 0xf2, 0x99, 0xce, 0x79,
0x31, 0x39, 0x08, 0x77, 0x8c, 0xff, 0x12, 0x90, 0x1d, 0x3c, 0xa8, 0x82, 0x7a, 0xdf, 0x2a, 0xa1, 0x2f, 0x26, 0x87, 0xe1, 0x8e, 0xf1, 0x9f, 0x02, 0xb2, 0x83, 0x07, 0x55, 0x50, 0xef, 0x4b, 0x25,
0xc6, 0x11, 0x6a, 0x11, 0x2d, 0x3a, 0xc3, 0x9b, 0x97, 0x2b, 0x5f, 0x9a, 0x97, 0x3f, 0x9d, 0xbe, 0xd4, 0x38, 0x42, 0x2d, 0xa2, 0x45, 0x67, 0x78, 0xfb, 0x72, 0xe5, 0x4b, 0xf3, 0xea, 0xa7, 0xb3,
0x7d, 0xff, 0xf6, 0x6c, 0x7a, 0xda, 0xf4, 0x0d, 0xd0, 0xad, 0xa1, 0x1e, 0x73, 0xe7, 0x89, 0xc8, 0xd7, 0x6f, 0x5f, 0x9f, 0x4f, 0xcf, 0x9a, 0xbe, 0x01, 0xba, 0x35, 0xd4, 0x63, 0xee, 0x3d, 0x11,
0x87, 0xa3, 0x47, 0x97, 0xb0, 0x86, 0x6a, 0x6f, 0xca, 0x2b, 0x04, 0x91, 0xc6, 0xaf, 0x35, 0xba, 0xf9, 0x70, 0xf4, 0xe8, 0x12, 0xd6, 0x50, 0xed, 0x6d, 0x79, 0x85, 0x20, 0xd2, 0xf8, 0xb5, 0x46,
0x09, 0x1a, 0xe0, 0x7c, 0x97, 0x46, 0x18, 0xb8, 0xdc, 0xc8, 0x3d, 0x4f, 0x8c, 0xed, 0x45, 0xcf, 0x37, 0x41, 0x03, 0x9c, 0xef, 0xd2, 0x08, 0x03, 0x97, 0x1b, 0xb9, 0xe7, 0x89, 0xb1, 0xbd, 0xe8,
0xab, 0x3b, 0x9d, 0x5c, 0x45, 0x6d, 0x5d, 0xbe, 0xba, 0x83, 0xee, 0xc3, 0x0d, 0x75, 0x5b, 0x4f, 0x79, 0x75, 0x67, 0x93, 0xeb, 0xa8, 0xad, 0xcb, 0x17, 0xf7, 0xd0, 0x7d, 0xb8, 0xa1, 0x6e, 0xeb,
0x8e, 0x44, 0xc0, 0x33, 0xaa, 0xfc, 0x14, 0xbd, 0x29, 0xea, 0xaa, 0xe6, 0x68, 0x86, 0x0b, 0x56, 0xc9, 0x91, 0x08, 0x78, 0x46, 0x95, 0x9f, 0xa2, 0x37, 0x45, 0x5d, 0xd5, 0x1c, 0xcf, 0x70, 0xc1,
0x57, 0x2a, 0x6d, 0x39, 0x74, 0x3f, 0x5a, 0xa0, 0x05, 0x67, 0xf5, 0x2c, 0xc2, 0xad, 0x71, 0x78, 0xea, 0x4a, 0xa5, 0x2d, 0x87, 0xee, 0x47, 0x0b, 0xb4, 0xe0, 0xac, 0x9e, 0x45, 0xb8, 0x35, 0x0e,
0xa1, 0x75, 0x89, 0xd9, 0xb0, 0x46, 0xa7, 0x1b, 0xd2, 0x40, 0x38, 0x44, 0xeb, 0x16, 0x66, 0x41, 0x2f, 0xb5, 0x2e, 0x31, 0x1b, 0xd6, 0xe8, 0x74, 0x43, 0x1a, 0x08, 0x87, 0x68, 0xdd, 0xc2, 0x2c,
0x3f, 0xa6, 0x7c, 0x98, 0xe5, 0xe8, 0x97, 0x7c, 0x4c, 0xaf, 0x2f, 0x2e, 0x28, 0x1b, 0x7a, 0xec, 0xe8, 0xc7, 0x94, 0x77, 0xb3, 0x1c, 0xfd, 0x92, 0x8f, 0xe9, 0xf5, 0xe5, 0x25, 0x65, 0x43, 0x8f,
0x5a, 0x1a, 0xe2, 0x1b, 0xb6, 0x1f, 0x3d, 0x7c, 0x1c, 0xed, 0xef, 0xcd, 0x0e, 0x9e, 0x44, 0x8f, 0xdd, 0x48, 0x43, 0x7c, 0xc3, 0xf6, 0xa3, 0x83, 0xc7, 0xd1, 0xfe, 0xde, 0xec, 0xf0, 0x2f, 0xd1,
0xf6, 0xd9, 0x7f, 0xfe, 0xf5, 0x6f, 0xc2, 0x60, 0x90, 0x04, 0xec, 0x60, 0xff, 0xe0, 0x11, 0xfb, 0xa3, 0x03, 0xf6, 0x9f, 0x7f, 0xfd, 0x9b, 0x30, 0x18, 0x24, 0x01, 0x3b, 0xdc, 0x3f, 0x7c, 0xc4,
0x3e, 0x8d, 0x74, 0x79, 0x85, 0x1f, 0xc3, 0x42, 0xa8, 0x32, 0x8a, 0xa2, 0x9d, 0xf5, 0x43, 0x5a, 0xbe, 0x4e, 0x23, 0x5d, 0x5e, 0xe1, 0xc7, 0xb0, 0x10, 0xaa, 0x8c, 0xa2, 0x68, 0x67, 0xfd, 0x88,
0x3f, 0x2c, 0xd0, 0x33, 0x90, 0x20, 0xb7, 0xcd, 0xfa, 0xd1, 0x8b, 0x64, 0x3b, 0xdb, 0x9b, 0x89, 0xd6, 0x8f, 0x0a, 0xf4, 0x0c, 0x24, 0xc8, 0x5d, 0xb3, 0x7e, 0xf4, 0x22, 0xd9, 0xce, 0xf6, 0x66,
0xf6, 0xa5, 0x2e, 0x30, 0x59, 0xb1, 0xa3, 0x1a, 0xa3, 0xa0, 0xd9, 0x56, 0x34, 0xfe, 0xe6, 0x44, 0xa2, 0x7d, 0xae, 0x0b, 0x4c, 0x56, 0xec, 0xb8, 0xc6, 0x28, 0x68, 0xb6, 0x15, 0x8d, 0xbf, 0x39,
0x84, 0x00, 0xf9, 0xff, 0x01, 0xc8, 0xe1, 0x46, 0xf0, 0x77, 0x09, 0x5b, 0xa9, 0xa5, 0x1a, 0xfa, 0x11, 0x21, 0x40, 0xfe, 0x7f, 0x00, 0x72, 0xb4, 0x11, 0xfc, 0x55, 0xc2, 0x56, 0x6a, 0xa9, 0x86,
0x6b, 0x13, 0xdd, 0x16, 0x60, 0xdf, 0x1e, 0xda, 0xc2, 0x5e, 0x62, 0x64, 0xaa, 0xa8, 0x4e, 0xbf, 0xfe, 0xda, 0x44, 0xb7, 0x05, 0xd8, 0xb7, 0x87, 0xb6, 0xb0, 0x97, 0x18, 0x99, 0x2a, 0xaa, 0xd3,
0x70, 0x72, 0x77, 0x2b, 0xc6, 0x16, 0x49, 0x17, 0x40, 0xb4, 0x00, 0x25, 0x9b, 0x7e, 0x62, 0x2b, 0x4f, 0x9c, 0xdc, 0xdd, 0x8a, 0xb1, 0x45, 0xd2, 0x05, 0x10, 0x2d, 0x40, 0xc9, 0xa6, 0x9f, 0xd8,
0x99, 0x28, 0xd0, 0xae, 0x43, 0x6b, 0x5c, 0x6e, 0x7c, 0xed, 0x1d, 0xb1, 0xac, 0x46, 0xe7, 0xf4, 0x4a, 0x26, 0x0a, 0xb4, 0xeb, 0xd0, 0x1a, 0x97, 0x1b, 0x5f, 0x7b, 0xc7, 0x2c, 0xab, 0xd1, 0x39,
0x6f, 0xfd, 0x70, 0x80, 0x1e, 0x88, 0x6b, 0x8f, 0x59, 0xe3, 0x1e, 0x8e, 0xa6, 0xad, 0x19, 0x4d, 0xfd, 0x5b, 0x3f, 0x1c, 0xa0, 0x07, 0xe2, 0xda, 0x63, 0xd6, 0xb8, 0x87, 0xa3, 0x69, 0x6b, 0x46,
0xbe, 0x48, 0x17, 0xf4, 0x87, 0xe6, 0x27, 0x1a, 0x8f, 0x5c, 0xbf, 0xc3, 0xa9, 0xe7, 0x71, 0x4c, 0x93, 0x2f, 0xd2, 0x05, 0xfd, 0xa1, 0xf9, 0x89, 0xc6, 0x23, 0xd7, 0xef, 0x70, 0xea, 0x79, 0x1c,
0xa8, 0xdc, 0x9b, 0x90, 0x3e, 0x7c, 0xb2, 0xe7, 0xe3, 0xfa, 0x32, 0x33, 0xb8, 0xee, 0x2a, 0xb4, 0x13, 0x2a, 0xf7, 0x26, 0xa4, 0x07, 0xdf, 0xed, 0xf9, 0xb8, 0x3e, 0xcf, 0x0c, 0xae, 0xbb, 0x0a,
0x92, 0x49, 0x92, 0xad, 0xe8, 0xc7, 0x82, 0xb6, 0x73, 0x9f, 0xa3, 0xa7, 0xe3, 0x1e, 0x86, 0x04, 0xad, 0x64, 0x92, 0x64, 0x2b, 0xfa, 0xb1, 0xa0, 0xed, 0xdc, 0x17, 0xe8, 0xe9, 0xb8, 0x87, 0x21,
0x84, 0x79, 0xcd, 0xe0, 0xf1, 0x7d, 0xb8, 0xcc, 0x72, 0x3d, 0x43, 0x02, 0xe0, 0x2e, 0x6d, 0x86, 0x01, 0x61, 0x5e, 0x33, 0x78, 0x7c, 0x1d, 0x2e, 0xb3, 0x5c, 0xcf, 0x90, 0x00, 0xb8, 0x4b, 0x9b,
0xe7, 0x67, 0x2f, 0x4f, 0xdf, 0x4c, 0x4e, 0xbf, 0xc4, 0xbd, 0x77, 0x71, 0x36, 0x65, 0x79, 0xa3, 0xe1, 0xc5, 0xf9, 0xf3, 0xb3, 0x57, 0x93, 0xb3, 0x4f, 0x71, 0xef, 0x5d, 0x9e, 0x4f, 0x59, 0xde,
0xca, 0xfb, 0x8a, 0x76, 0xdf, 0xd9, 0x3c, 0x91, 0x06, 0x0e, 0xc2, 0x23, 0x6b, 0x31, 0x34, 0xa0, 0xa8, 0xf2, 0xbe, 0xa2, 0xdd, 0x77, 0x36, 0x4f, 0xa4, 0x81, 0x83, 0xf0, 0xc8, 0x5a, 0x0c, 0x0d,
0xbd, 0xe0, 0xe6, 0x5a, 0x76, 0xbc, 0x68, 0x55, 0xc5, 0x89, 0xc1, 0xfc, 0xad, 0x9e, 0xf9, 0x8b, 0x68, 0x2f, 0xb8, 0xb9, 0x96, 0x1d, 0x2f, 0x5a, 0x55, 0x71, 0x62, 0x30, 0x7f, 0xab, 0x67, 0xfe,
0x3a, 0x35, 0x3e, 0xda, 0xd2, 0x74, 0x19, 0x62, 0x0d, 0xe2, 0xcc, 0xe6, 0x97, 0x90, 0x6f, 0x8e, 0xa2, 0x4e, 0x8d, 0x8f, 0xb6, 0x34, 0x5d, 0x86, 0x58, 0x83, 0x38, 0xb3, 0xf9, 0x25, 0xe4, 0x8b,
0xf8, 0x5f, 0x4e, 0xf8, 0xbd, 0xef, 0x1a, 0xf1, 0x87, 0xd4, 0x7b, 0xf1, 0x41, 0x37, 0x1b, 0xba, 0x23, 0xfe, 0xa7, 0x13, 0x7e, 0xef, 0xab, 0x46, 0xfc, 0x21, 0xf5, 0x5e, 0x7c, 0xd0, 0xcd, 0x86,
0xe6, 0xd0, 0x8f, 0xad, 0xff, 0x05, 0x18, 0x36, 0x57, 0xbc, 0x7c, 0x15, 0x00, 0x00 0xae, 0x39, 0xf4, 0x63, 0xeb, 0x7f, 0x01, 0xbc, 0x34, 0x27, 0xd6, 0x7c, 0x15, 0x00, 0x00
}; };

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,11 @@
#define DIMPROV_PRINTF(x...) #define DIMPROV_PRINTF(x...)
#endif #endif
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)
#undef WLED_DISABLE_IMPROV_WIFISCAN
#define WLED_DISABLE_IMPROV_WIFISCAN
#endif
#define IMPROV_VERSION 1 #define IMPROV_VERSION 1
void parseWiFiCommand(char *rpcData); void parseWiFiCommand(char *rpcData);
@@ -28,20 +33,14 @@ enum ImprovPacketByte {
RPC_CommandType = 9 RPC_CommandType = 9
}; };
enum ImprovRPCType { #ifndef WLED_DISABLE_IMPROV_WIFISCAN
Command_Wifi = 0x01, static bool improvWifiScanRunning = false;
Request_State = 0x02, #endif
Request_Info = 0x03
};
//File dbgf;
//blocking function to parse an Improv Serial packet //blocking function to parse an Improv Serial packet
void handleImprovPacket() { void handleImprovPacket() {
uint8_t header[6] = {'I','M','P','R','O','V'}; uint8_t header[6] = {'I','M','P','R','O','V'};
//dbgf = WLED_FS.open("/improv.log","a");
bool timeout = false; bool timeout = false;
uint8_t waitTime = 25; uint8_t waitTime = 25;
uint16_t packetByte = 0; uint16_t packetByte = 0;
@@ -62,12 +61,11 @@ void handleImprovPacket() {
byte next = Serial.read(); byte next = Serial.read();
DIMPROV_PRINT("Received improv byte: "); DIMPROV_PRINTF("%x\r\n",next); DIMPROV_PRINT("Received improv byte: "); DIMPROV_PRINTF("%x\r\n",next);
//f.write(next);
switch (packetByte) { switch (packetByte) {
case ImprovPacketByte::Version: { case ImprovPacketByte::Version: {
if (next != IMPROV_VERSION) { if (next != IMPROV_VERSION) {
DIMPROV_PRINTLN(F("Invalid version")); DIMPROV_PRINTLN(F("Invalid version"));
//dbgf.close();
return; return;
} }
break; break;
@@ -75,7 +73,6 @@ void handleImprovPacket() {
case ImprovPacketByte::PacketType: { case ImprovPacketByte::PacketType: {
if (next != ImprovPacketType::RPC_Command) { if (next != ImprovPacketType::RPC_Command) {
DIMPROV_PRINTF("Non RPC-command improv packet type %i\n",next); DIMPROV_PRINTF("Non RPC-command improv packet type %i\n",next);
//dbgf.close();
return; return;
} }
if (!improvActive) improvActive = 1; if (!improvActive) improvActive = 1;
@@ -89,7 +86,6 @@ void handleImprovPacket() {
if (checksum != next) { if (checksum != next) {
DIMPROV_PRINTF("Got RPC checksum %i, expected %i",next,checksum); DIMPROV_PRINTF("Got RPC checksum %i, expected %i",next,checksum);
sendImprovStateResponse(0x01, true); sendImprovStateResponse(0x01, true);
//dbgf.close();
return; return;
} }
@@ -100,22 +96,23 @@ void handleImprovPacket() {
if (WLED_WIFI_CONFIGURED) improvState = 0x03; //provisioning if (WLED_WIFI_CONFIGURED) improvState = 0x03; //provisioning
if (Network.isConnected()) improvState = 0x04; //provisioned if (Network.isConnected()) improvState = 0x04; //provisioned
sendImprovStateResponse(improvState, false); sendImprovStateResponse(improvState, false);
if (improvState == 0x04) sendImprovRPCResponse(ImprovRPCType::Request_State); if (improvState == 0x04) sendImprovIPRPCResult(ImprovRPCType::Request_State);
break; break;
} }
case ImprovRPCType::Request_Info: sendImprovInfoResponse(); break; case ImprovRPCType::Request_Info: sendImprovInfoResponse(); break;
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
case ImprovRPCType::Request_Scan: startImprovWifiScan(); break;
#endif
default: { default: {
DIMPROV_PRINTF("Unknown RPC command %i\n",next); DIMPROV_PRINTF("Unknown RPC command %i\n",next);
sendImprovStateResponse(0x02, true); sendImprovStateResponse(0x02, true);
} }
} }
//dbgf.close();
return; return;
} }
if (packetByte < 6) { //check header if (packetByte < 6) { //check header
if (next != header[packetByte]) { if (next != header[packetByte]) {
DIMPROV_PRINTLN(F("Invalid improv header")); DIMPROV_PRINTLN(F("Invalid improv header"));
//dbgf.close();
return; return;
} }
} else if (packetByte > 9) { //RPC data } else if (packetByte > 9) { //RPC data
@@ -128,7 +125,6 @@ void handleImprovPacket() {
checksum += next; checksum += next;
packetByte++; packetByte++;
} }
//dbgf.close();
} }
void sendImprovStateResponse(uint8_t state, bool error) { void sendImprovStateResponse(uint8_t state, bool error) {
@@ -147,79 +143,116 @@ void sendImprovStateResponse(uint8_t state, bool error) {
Serial.write('\n'); Serial.write('\n');
} }
void sendImprovRPCResponse(byte commandId) { // used by sendImprovIPRPCResult(), sendImprovInfoResponse(), and handleImprovWifiScan()
void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings, const char **strings) {
if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true); if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true);
uint8_t packetLen = 12; uint8_t packetLen = 12;
char out[64] = {'I','M','P','R','O','V'}; char out[256] = {'I','M','P','R','O','V'};
out[6] = IMPROV_VERSION; out[6] = IMPROV_VERSION;
out[7] = ImprovPacketType::RPC_Response; out[7] = ImprovPacketType::RPC_Response;
out[8] = 2; //Length (set below) //out[8] = 2; //Length (set below)
out[9] = commandId; out[9] = type;
out[10] = 0; //Data len (set below) //out[10] = 0; //Data len (set below)
out[11] = '\0'; //URL len (set below) uint16_t pos = 11;
if (Network.isConnected()) for (uint8_t s = 0; s < n_strings; s++) {
{ size_t len = strlen(strings[s]);
IPAddress localIP = Network.localIP(); if (pos + len > 254) continue; // simple buffer overflow guard
uint8_t len = sprintf(out+12, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]); out[pos++] = len;
if (len > 24) return; //sprintf fail? strcpy(out + pos, strings[s]);
out[11] = len; pos += len;
out[10] = 1 + len;
out[8] = 3 + len; //RPC command type + data len + url len + url
packetLen = 13 + len;
} }
packetLen = pos +1;
out[8] = pos -9; // Length of packet (excluding first 9 header bytes and final checksum byte)
out[10] = pos -11; // Data len
uint8_t checksum = 0; uint8_t checksum = 0;
for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i]; for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i];
out[packetLen -1] = checksum; out[packetLen -1] = checksum;
Serial.write((uint8_t*)out, packetLen); Serial.write((uint8_t*)out, packetLen);
Serial.write('\n'); Serial.write('\n');
DIMPROV_PRINT("RPC result checksum");
DIMPROV_PRINTLN(checksum);
}
void sendImprovIPRPCResult(ImprovRPCType type) {
if (Network.isConnected())
{
char urlStr[64];
IPAddress localIP = Network.localIP();
uint8_t len = sprintf(urlStr, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
if (len > 24) return; //sprintf fail?
const char *str[1] = {urlStr};
sendImprovRPCResult(type, 1, str);
} else {
sendImprovRPCResult(type, 0);
}
improvActive = 1; //no longer provisioning improvActive = 1; //no longer provisioning
} }
void sendImprovInfoResponse() { void sendImprovInfoResponse() {
if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true); const char* bString =
uint8_t packetLen = 12; #ifdef ESP8266
char out[128] = {'I','M','P','R','O','V'}; "esp8266"
out[6] = IMPROV_VERSION; #elif CONFIG_IDF_TARGET_ESP32C3
out[7] = ImprovPacketType::RPC_Response; "esp32-c3"
//out[8] = 2; //Length (set below) #elif CONFIG_IDF_TARGET_ESP32S2
out[9] = ImprovRPCType::Request_Info; "esp32-s2"
//out[10] = 0; //Data len (set below) #elif CONFIG_IDF_TARGET_ESP32S3
out[11] = 4; //Firmware len ("WLED") "esp32-s3"
out[12] = 'W'; out[13] = 'L'; out[14] = 'E'; out[15] = 'D'; #else // ESP32
uint8_t lengthSum = 17; "esp32"
uint8_t vlen = sprintf_P(out+lengthSum,PSTR("0.14.0-b26.30/%i"),VERSION); #endif
out[16] = vlen; lengthSum += vlen; ;
uint8_t hlen = 7;
#ifdef ESP8266
strcpy(out+lengthSum+1,"esp8266");
#else
hlen = 5;
strcpy(out+lengthSum+1,"esp32");
#endif
out[lengthSum] = hlen;
lengthSum += hlen + 1;
//Use serverDescription if it has been changed from the default "WLED", else mDNS name //Use serverDescription if it has been changed from the default "WLED", else mDNS name
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0); bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
strcpy(out+lengthSum+1,useMdnsName ? cmDNS : serverDescription); char vString[32];
uint8_t nlen = strlen(useMdnsName ? cmDNS : serverDescription); snprintf_P(vString, sizeof(vString)-1, PSTR("0.14.0-b27.31/%i"),VERSION);
out[lengthSum] = nlen; const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
lengthSum += nlen + 1;
packetLen = lengthSum +1; sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);
out[8] = lengthSum -9;
out[10] = lengthSum -11;
uint8_t checksum = 0;
for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i];
out[packetLen -1] = checksum;
Serial.write((uint8_t*)out, packetLen);
Serial.write('\n');
DIMPROV_PRINT("Info checksum");
DIMPROV_PRINTLN(checksum);
} }
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
void startImprovWifiScan() {
if (improvWifiScanRunning) return;
WiFi.scanNetworks(true);
improvWifiScanRunning = true;
}
void handleImprovWifiScan() {
if (!improvWifiScanRunning) return;
int16_t status = WiFi.scanComplete();
if (status == WIFI_SCAN_RUNNING) return;
// here scan completed or failed (-2)
improvWifiScanRunning = false;
for (int i = 0; i < status; i++) {
char rssiStr[8];
sprintf(rssiStr, "%d", WiFi.RSSI(i));
#ifdef ESP8266
bool isOpen = WiFi.encryptionType(i) == ENC_TYPE_NONE;
#else
bool isOpen = WiFi.encryptionType(i) == WIFI_AUTH_OPEN;
#endif
char ssidStr[33];
strcpy(ssidStr, WiFi.SSID(i).c_str());
const char *str[3] = {ssidStr, rssiStr, isOpen ? "NO":"YES"};
sendImprovRPCResult(ImprovRPCType::Request_Scan, 3, str);
}
sendImprovRPCResult(ImprovRPCType::Request_Scan, 0);
WiFi.scanDelete();
}
#else
void startImprovWifiScan() {}
void handleImprovWifiScan() {}
#endif
void parseWiFiCommand(char* rpcData) { void parseWiFiCommand(char* rpcData) {
uint8_t len = rpcData[0]; uint8_t len = rpcData[0];
if (!len || len > 126) return; if (!len || len > 126) return;

View File

@@ -258,7 +258,7 @@ void handlePresets()
fdo.remove("ps"); // remove load request for presets to prevent recursive crash (if not called by button and contains preset cycling string "1~5~") fdo.remove("ps"); // remove load request for presets to prevent recursive crash (if not called by button and contains preset cycling string "1~5~")
deserializeState(fdo, CALL_MODE_NO_NOTIFY, tmpPreset); // may change presetToApply by calling applyPreset() deserializeState(fdo, CALL_MODE_NO_NOTIFY, tmpPreset); // may change presetToApply by calling applyPreset()
} }
if (!errorFlag && tmpPreset < 255 && changePreset) presetCycCurr = currentPreset = tmpPreset; if (!errorFlag && tmpPreset < 255 && changePreset) currentPreset = tmpPreset;
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
//Aircoookie recommended not to delete buffer //Aircoookie recommended not to delete buffer

View File

@@ -109,6 +109,7 @@ void WLED::loop()
handleRemote(); handleRemote();
#endif #endif
handleSerial(); handleSerial();
handleImprovWifiScan();
#if defined(ARDUINO_ARCH_ESP32) && defined(WLEDMM_PROTECT_SERVICE) // WLEDMM experimental: handleNotifications() calls strip.show(); handleTransitions modifies segments #if defined(ARDUINO_ARCH_ESP32) && defined(WLEDMM_PROTECT_SERVICE) // WLEDMM experimental: handleNotifications() calls strip.show(); handleTransitions modifies segments
if (!suspendStripService) { if (!suspendStripService) {
@@ -827,7 +828,7 @@ void WLED::initAP(bool resetAP)
USER_PRINTLN(apSSID); // WLEDMM USER_PRINTLN(apSSID); // WLEDMM
WiFi.softAPConfig(IPAddress(4, 3, 2, 1), IPAddress(4, 3, 2, 1), IPAddress(255, 255, 255, 0)); WiFi.softAPConfig(IPAddress(4, 3, 2, 1), IPAddress(4, 3, 2, 1), IPAddress(255, 255, 255, 0));
WiFi.softAP(apSSID, apPass, apChannel, apHide); WiFi.softAP(apSSID, apPass, apChannel, apHide);
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2)) #if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3))
WiFi.setTxPower(WIFI_POWER_8_5dBm); WiFi.setTxPower(WIFI_POWER_8_5dBm);
#endif #endif
@@ -962,7 +963,6 @@ void WLED::initConnection()
ws.onEvent(wsEvent); ws.onEvent(wsEvent);
#endif #endif
WiFi.disconnect(true); // close old connections WiFi.disconnect(true); // close old connections
#ifdef ESP8266 #ifdef ESP8266
WiFi.setPhyMode(WIFI_PHY_MODE_11N); WiFi.setPhyMode(WIFI_PHY_MODE_11N);
@@ -1010,7 +1010,7 @@ void WLED::initConnection()
WiFi.begin(clientSSID, clientPass); WiFi.begin(clientSSID, clientPass);
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2)) #if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3))
WiFi.setTxPower(WIFI_POWER_8_5dBm); WiFi.setTxPower(WIFI_POWER_8_5dBm);
#endif #endif
WiFi.setSleep(!noWifiSleep); WiFi.setSleep(!noWifiSleep);
@@ -1228,7 +1228,7 @@ void WLED::handleConnection()
if (improvActive) { if (improvActive) {
if (improvError == 3) sendImprovStateResponse(0x00, true); if (improvError == 3) sendImprovStateResponse(0x00, true);
sendImprovStateResponse(0x04); sendImprovStateResponse(0x04);
if (improvActive > 1) sendImprovRPCResponse(0x01); if (improvActive > 1) sendImprovIPRPCResult(ImprovRPCType::Command_Wifi);
} }
initInterfaces(); initInterfaces();
userConnected(); userConnected();