Merge branch 'mdev' into ES8388S

This commit is contained in:
Will Tatam
2022-11-22 20:34:21 +00:00
25 changed files with 2737 additions and 2546 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "wled",
"version": "0.14.0.4.2",
"version": "0.14.0.5.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "wled",
"version": "0.14.0.4.2",
"version": "0.14.0.5.0",
"license": "ISC",
"dependencies": {
"clean-css": "^4.2.3",

View File

@@ -1,6 +1,6 @@
{
"name": "wled",
"version": "0.14.0.4.2",
"version": "0.14.0.5.0",
"description": "Tools for WLED project",
"main": "tools/cdata.js",
"directories": {

View File

@@ -41,7 +41,7 @@
; MoonModules entries
; ===================
; default_envs = esp32_4MB_min, esp32_4MB_max, esp32_16MB_max, esp8266_4MB_min, esp32_4MB_PSRAM_max, esp32S3_8MB_max, wemos_shield_esp32_4MB_max, wemos_shield_esp32_16MB_max, esp32_pico_4MB_max
; default_envs = esp32_4MB_min, esp32_4MB_max, esp32_16MB_max, esp8266_4MB_min, esp32_4MB_PSRAM_max, esp32S3_8MB_max, wemos_shield_esp32_4MB_max, wemos_shield_esp32_4MB_ICS4343x_max, wemos_shield_esp32_4MB_SPM1423_max, wemos_shield_esp32_4MB_LineIn_max, wemos_shield_esp32_16MB_max, esp32_pico_4MB_max
; default_envs = esp32_4MB_min
default_envs = esp32_4MB_max ; recommended default
; default_envs = esp32_16MB_max
@@ -52,6 +52,9 @@ default_envs = esp32_4MB_max ; recommended default
; default_envs = esp32_4MB_PSRAM_max
; default_envs = esp32S3_8MB_max
; default_envs = wemos_shield_esp32_4MB_max
; default_envs = wemos_shield_esp32_4MB_ICS4343x_max
; default_envs = wemos_shield_esp32_4MB_SPM1423_max
; default_envs = wemos_shield_esp32_4MB_LineIn_max
; default_envs = wemos_shield_esp32_16MB_max
; default_envs = esp32_pico_4MB_max
@@ -431,23 +434,33 @@ board = esp32-c3-devkitm-1
;platform_packages =
platform = ${esp32.platformV4}
platform_packages = ${esp32.platformV4_packages}
-D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3
-D WLED_WATCHDOG_TIMEOUT=0
build_flags = ${common.build_flags} ${esp32c3.build_flags} -D WLED_RELEASE_NAME=ESP32-C3
-D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0
-D WLED_USE_MY_CONFIG
; -D USERMOD_AUDIOREACTIVE
-D USERMOD_CUSTOMEFFECTS
upload_speed = 460800
build_unflags = ${common.build_unflags}
lib_deps = ${esp32c3.lib_deps}
; https://github.com/blazoncek/arduinoFFT.git
[env:esp32s3dev_8MB]
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM
board = esp32-s3-devkitc-1
platform = espressif32@5.1.1
platform_packages = platformio/framework-arduinoespressif32@3.20004.220825
;platform = espressif32@5.1.1
;platform_packages = platformio/framework-arduinoespressif32@3.20004.220825
platform = ${esp32.platformV4}
platform_packages = ${esp32.platformV4_packages}
upload_speed = 921600
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MSC_ON_BOOT=0
-D WLED_RELEASE_NAME=ESP32-S3
-D WLED_USE_MY_CONFIG
-D USERMOD_AUDIOREACTIVE
-D USERMOD_CUSTOMEFFECTS
lib_deps = ${esp32s3.lib_deps}
https://github.com/blazoncek/arduinoFFT.git
board_build.partitions = tools/WLED_ESP32_8MB.csv
board_build.f_flash = 80000000L
board_build.flash_mode = qio
@@ -516,13 +529,16 @@ build_flags = ${common.build_flags_esp8266} -D LEDPIN=12 -D IRPIN=-1 -D RLYPIN=2
lib_deps = ${esp8266.lib_deps}
[env:lolin_s2_mini]
platform = espressif32@5.1.1
;platform = espressif32@5.1.1
platform = ${esp32.platformV4}
platform_packages = ${esp32.platformV4_packages}
board = lolin_s2_mini
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_unflags = ${common.build_unflags}
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
-D ARDUINO_USB_CDC_ON_BOOT
;-D ARDUINO_USB_CDC_ON_BOOT=0
-D WLED_USE_PSRAM
-D WLED_WATCHDOG_TIMEOUT=0
-D CONFIG_ASYNC_TCP_USE_WDT=0
@@ -535,8 +551,13 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME
-D HW_PIN_CLOCKSPI=7
-D HW_PIN_DATASPI=11
-D HW_PIN_MISOSPI=9
; -D STATUSLED=15
; -D STATUSLED=15
-D WLED_USE_MY_CONFIG
-D USERMOD_AUDIOREACTIVE
-D USERMOD_CUSTOMEFFECTS
lib_deps = ${esp32s2.lib_deps}
https://github.com/blazoncek/arduinoFFT.git
# ------------------------------------------------------------------------------
# MoonModules configs
@@ -556,6 +577,13 @@ build_flags_min =
-D USERMOD_CUSTOMEFFECTS ; WLEDMM usermod
; -D WLED_DEBUG ; lots of generic debug messages
; -D SR_DEBUG ; some extra debug messages from audioreactive
; -D MIC_LOGGER ; for sound input monitoring & debugging (use arduino serial plotter)
; -D WLED_DISABLE_LOXONE
; -D WLED_DISABLE_ALEXA
; -D WLED_DISABLE_HUESYNC
; -D WLED_DISABLE_MQTT
; -D WLED_DISABLE_INFRARED
; -D WLED_ENABLE_DMX
lib_deps_min =
https://github.com/kosme/arduinoFFT#develop @ 1.9.2 ; used for USERMOD_AUDIOREACTIVE
@@ -586,7 +614,7 @@ lib_deps_max =
; base entries (without WLED_RELEASE_NAME)
; esp32_4MB_min_base: basis for min entries and for max_base
[env:esp32_4MB_min_base]
[esp32_4MB_min_base]
board = esp32dev
platform = ${esp32.platform}
upload_speed = 460800 ; or 921600
@@ -599,15 +627,15 @@ board_build.f_flash = 80000000L ; use full 80MHz speed for flash (default = 40Mh
board_build.flash_mode = dio ; (dio = dual i/o; more compatible than qio = quad i/o)
;esp32_4MB_max_base: basis for max entries, uses esp32_4MB_min_base, build_flags_max and lib_deps_max
[env:esp32_4MB_max_base]
extends = env:esp32_4MB_min_base
build_flags = ${env:esp32_4MB_min_base.build_flags} ${common_mm.build_flags_max}
lib_deps = ${env:esp32_4MB_min_base.lib_deps} ${common_mm.lib_deps_max}
board_build.partitions = ${env:esp32_4MB_min_base.board_build.partitions}
[esp32_4MB_max_base]
extends = esp32_4MB_min_base
build_flags = ${esp32_4MB_min_base.build_flags} ${common_mm.build_flags_max}
lib_deps = ${esp32_4MB_min_base.lib_deps} ${common_mm.lib_deps_max}
board_build.partitions = ${esp32_4MB_min_base.board_build.partitions}
; board_build.partitions = tools/WLED_ESP32-wrover_4MB.csv
;esp32_4MB_V4_max_base: basis for V4 entries, uses build_flags_min, build_flags_max, lib_deps_min and lib_deps_max
[env:esp32_4MB_V4_min_base]
[esp32_4MB_V4_min_base]
board = esp32dev
upload_speed = 460800 ; or 921600
platform = ${esp32.platformV4}
@@ -619,12 +647,13 @@ lib_deps = ${esp32.lib_depsV4} ${common_mm.lib_deps_min}
board_build.partitions = ${esp32.default_partitions}
board_build.f_flash = 80000000L ; use full 80MHz speed for flash (default = 40Mhz)
board_build.flash_mode = dio ; (dio = dual i/o; more compatible than qio = quad i/o)
;lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation
[env:esp32_4MB_V4_max_base]
extends = env:esp32_4MB_V4_min_base
build_flags = ${env:esp32_4MB_V4_min_base.build_flags} ${common_mm.build_flags_max}
lib_deps = ${env:esp32_4MB_V4_min_base.lib_deps} ${common_mm.lib_deps_max}
board_build.partitions = ${env:esp32_4MB_V4_min_base.board_build.partitions}
[esp32_4MB_V4_max_base]
extends = esp32_4MB_V4_min_base
build_flags = ${esp32_4MB_V4_min_base.build_flags} ${common_mm.build_flags_max}
lib_deps = ${esp32_4MB_V4_min_base.lib_deps} ${common_mm.lib_deps_max}
board_build.partitions = ${esp32_4MB_V4_min_base.board_build.partitions}
;board_build.flash_mode = qio ; (dio = dual i/o; more compatible than qio = quad i/o)
; end of base entries
@@ -633,8 +662,8 @@ board_build.partitions = ${env:esp32_4MB_V4_min_base.board_build.partitions}
; esp32_4MB_min: bin entry, uses esp32_4MB_min_base
[env:esp32_4MB_min]
extends = env:esp32_4MB_min_base
build_flags = ${env:esp32_4MB_min_base.build_flags}
extends = esp32_4MB_min_base
build_flags = ${esp32_4MB_min_base.build_flags}
-D WLED_RELEASE_NAME=esp32_4MB_min ; This will be included in the firmware.bin filename
; RAM: [== ] 24.1% (used 78900 bytes from 327680 bytes)
; Flash: [======== ] 83.7% (used 1315729 bytes from 1572864 bytes)
@@ -650,8 +679,8 @@ build_flags = ${env:esp32_4MB_min_base.build_flags}
; esp32_4MB_max: bin entry, uses esp32_4MB_max_base
[env:esp32_4MB_max]
extends = env:esp32_4MB_max_base
build_flags = ${env:esp32_4MB_max_base.build_flags}
extends = esp32_4MB_max_base
build_flags = ${esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32_4MB_max ; This will be included in the firmware.bin filename
; RAM: [== ] 24.4% (used 79804 bytes from 327680 bytes)
; Flash: [========= ] 88.7% (used 1394813 bytes from 1572864 bytes)
@@ -661,16 +690,22 @@ build_flags = ${env:esp32_4MB_max_base.build_flags}
; esp32_16MB_max: bin entry, uses esp32_4MB_max_base and adds 16MB settings
[env:esp32_16MB_max]
extends = env:esp32_4MB_max_base
extends = esp32_4MB_max_base
board = esp32_twilord ; "TwilightLord" ESP32 with 16MB Flash
board_build.partitions = tools/WLED_ESP32_16MB.csv ; for esp32_twilord with 16MB flash
build_flags = ${env:esp32_4MB_max_base.build_flags}
build_flags = ${esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32_16MB_max ; This will be included in the firmware.bin filename
; RAM: [== ] 24.4% (used 79804 bytes from 327680 bytes)
; Flash: [======= ] 66.5% (used 1394813 bytes from 2097152 bytes)
; -D WLED_DEBUG
; -D SR_DEBUG
; -D MIC_LOGGER
; -D WLED_DISABLE_LOXONE
; -D WLED_DISABLE_ALEXA
; -D WLED_DISABLE_HUESYNC
; -D WLED_DISABLE_MQTT
; -D WLED_DISABLE_INFRARED
;lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation
; esp8266_4MB_min: bin entry for 8266, with 2D (WIP)
[env:esp8266_4MB_min]
@@ -684,6 +719,7 @@ build_flags = ${common.build_flags_esp8266}
-D WLED_DISABLE_HUESYNC
; -D WLED_DISABLE_2D
; -D USERMOD_AUDIOREACTIVE
; -D USERMOD_CUSTOMEFFECTS ; to be done
-UWLED_USE_MY_CONFIG
; monitor_filters = esp8266_exception_decoder
; RAM: [====== ] 58.7% (used 48056 bytes from 81920 bytes)
@@ -697,8 +733,8 @@ build_flags = ${common.build_flags_esp8266}
; esp32_4MB_V4_min: bin entry compiled with ESP-IDF 4.4.1, uses esp32_4MB_V4_min_base
[env:esp32_4MB_V4_min]
extends = env:esp32_4MB_V4_min_base
build_flags = ${env:esp32_4MB_V4_min_base.build_flags}
extends = esp32_4MB_V4_min_base
build_flags = ${esp32_4MB_V4_min_base.build_flags}
-D WLED_RELEASE_NAME=esp32_4MB_V4_min ; This will be included in the firmware.bin filename
-D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET
-D ARDUINO_USB_CDC_ON_BOOT=0 ; needed for arduino-esp32 >=2.0.4; avoids errors on startup
@@ -712,11 +748,12 @@ build_flags = ${env:esp32_4MB_V4_min_base.build_flags}
; -D MIC_LOGGER
; RAM: [== ] 24.2% (used 79372 bytes from 327680 bytes)
; Flash: [========= ] 88.8% (used 1396073 bytes from 1572864 bytes)
;lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation
; esp32_4MB_V4_max: bin entry compiled with ESP-IDF 4.4.1, uses esp32_4MB_V4_max_base
[env:esp32_4MB_V4_max]
extends = env:esp32_4MB_V4_max_base
build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
extends = esp32_4MB_V4_max_base
build_flags = ${esp32_4MB_V4_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32_4MB_V4_max ; This will be included in the firmware.bin filename
-D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET
-D ARDUINO_USB_CDC_ON_BOOT=0 ; needed for arduino-esp32 >=2.0.4; avoids errors on startup
@@ -729,26 +766,27 @@ build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
; Flash: [==========] 95.8% (used 1506893 bytes from 1572864 bytes)
;-D WLED_DISABLE_MQTT ; RAM 216 bytes; FLASH 16496 bytes
;-D WLED_DISABLE_INFRARED ;RAM 136 bytes; FLASH 24492 bytes
;lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation
; esp32_16MB_max: bin entry compiled with ESP-IDF 4.4.1, uses esp32_4MB_V4_max_base and adds 16MB settings
[env:esp32_16MB_V4_max]
extends = env:esp32_4MB_V4_max_base
extends = esp32_4MB_V4_max_base
board = esp32_twilord ; "TwilightLord" ESP32 with 16MB Flash
board_build.partitions = tools/WLED_ESP32_16MB.csv ; for esp32_twilord with 16MB flash
build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
build_flags = ${esp32_4MB_V4_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32_16MB_V4_max ; This will be included in the firmware.bin filename
-D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET
-D ARDUINO_USB_CDC_ON_BOOT=0 ; needed for arduino-esp32 >=2.0.4; avoids errors on startup
; RAM: [== ] 24.8% (used 81316 bytes from 327680 bytes)
; Flash: [======= ] 72.9% (used 1528253 bytes from 2097152 bytes)
;; experiemtal environment for boards with PSRAM (needs ESP-IDF 4.4.1).
;; experimental environment for boards with PSRAM (needs ESP-IDF 4.4.1).
; esp32_4MB_PSRAM_max: bin entry, uses esp32_4MB_V4_max_base and adds specific settings
[env:esp32_4MB_PSRAM_max]
extends = env:esp32_4MB_V4_max_base
extends = esp32_4MB_V4_max_base
board = lolin_d32_pro
;board = esp32cam
build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
build_flags = ${esp32_4MB_V4_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32_4MB_PSRAM_max
-D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET
-D ARDUINO_USB_CDC_ON_BOOT=0 ; needed for arduino-esp32 >=2.0.4; avoids errors on startup
@@ -770,9 +808,9 @@ build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
; esp32S3_8MB_max: bin entry, uses esp32_4MB_V4_max_base and adds specific settings. Override of lib_deps using lib_deps_min and lib_deps_max
[env:esp32S3_8MB_max]
extends = env:esp32_4MB_V4_max_base
extends = esp32_4MB_V4_max_base
board = esp32-s3-devkitc-1
build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
build_flags = ${esp32_4MB_V4_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32S3_8MB_max
-D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MSC_ON_BOOT=0 -D ARDUINO_USB_DFU_ON_BOOT=0
-D WLED_WATCHDOG_TIMEOUT=0
@@ -788,7 +826,7 @@ build_flags = ${env:esp32_4MB_V4_max_base.build_flags}
-D HW_PIN_SDA=40
-D HW_PIN_SCL=41
-D AUDIOPIN=-1
-D DMTYPE=1
-D SR_DMTYPE=1
-D I2S_SDPIN=16
-D I2S_CKPIN=17
-D I2S_WSPIN=47
@@ -808,17 +846,14 @@ board_build.flash_mode = qio
# ------------------------------------------------------------------------------
;wemos_shield_esp32_4MB_max_base: base entry, uses esp32_4MB_max_base
[env:wemos_shield_esp32_4MB_max_base]
extends = env:esp32_4MB_max_base
build_flags = ${env:esp32_4MB_max_base.build_flags}
[wemos_shield_esp32_4MB_max_base]
extends = esp32_4MB_max_base
build_flags = ${esp32_4MB_max_base.build_flags}
-D LEDPIN=16
-D RLYPIN=19
-D BTNPIN=17
-D IRPIN=18
-D AUDIOPIN=-1
-D DMTYPE=1 -D I2S_SDPIN=32 -D I2S_WSPIN=15 -D I2S_CKPIN=14 ;; for regular I2S microphone
; -D DMTYPE=5 -D I2S_SDPIN=32 -D I2S_WSPIN=15 -D I2S_CKPIN=-1 ;; for I2S PDM microphone
; -D DMTYPE=4 -D MCLK_PIN=0 -D I2S_SDPIN=25 -D I2S_WSPIN=15 -D I2S_CKPIN=14 ;; for audio Line-In shield
-D TEMPERATURE_PIN=23
-D FLD_PIN_SCL=22 -D FLD_PIN_SDA=21
-D HW_PIN_SCL=22 -D HW_PIN_SDA=21
@@ -833,27 +868,53 @@ build_flags = ${env:esp32_4MB_max_base.build_flags}
;wemos_shield_esp32_4MB_max: bin entry, uses wemos_shield_esp32_4MB_max_base
[env:wemos_shield_esp32_4MB_max]
extends = env:wemos_shield_esp32_4MB_max_base
build_flags = ${env:wemos_shield_esp32_4MB_max_base.build_flags}
extends = wemos_shield_esp32_4MB_max_base
build_flags = ${wemos_shield_esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=wemos_shield_esp32_4MB_max ; This will be included in the firmware.bin filename
; -D SR_DMTYPE=1 -D I2S_SDPIN=32 -D I2S_WSPIN=15 -D I2S_CKPIN=14 ;; for regular I2S microphone softhack: can be removed because this is default in code
; RAM: [== ] 24.4% (used 79820 bytes from 327680 bytes)
; Flash: [========= ] 88.6% (used 1393421 bytes from 1572864 bytes)
[env:wemos_shield_esp32_4MB_ICS4343x_max]
extends = wemos_shield_esp32_4MB_max_base
build_flags = ${wemos_shield_esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=wemos_shield_esp32_4MB_ICS4343x_max ; This will be included in the firmware.bin filename
; -D SR_DMTYPE=1 -D I2S_SDPIN=32 -D I2S_WSPIN=15 -D I2S_CKPIN=14 ;; for regular I2S microphone softhack: can be removed because this is default in code
-D SR_SQUELCH=10 -D SR_GAIN=30 -D SR_FREQ_PROF=5 ; ICS-43434 specific
; RAM: [== ] 24.4% (used 79820 bytes from 327680 bytes)
; Flash: [========= ] 88.6% (used 1393421 bytes from 1572864 bytes)
[env:wemos_shield_esp32_4MB_SPM1423_max]
extends = wemos_shield_esp32_4MB_max_base
build_flags = ${wemos_shield_esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=wemos_shield_esp32_4MB_SPM1423_max ; This will be included in the firmware.bin filename
-D SR_DMTYPE=5 -D I2S_SDPIN=32 -D I2S_WSPIN=15 -D I2S_CKPIN=-1 ; for I2S PDM microphone
-D SR_SQUELCH=3 -D SR_GAIN=40 -D SR_FREQ_PROF=5 ; ICS-43434 SPM1423 specific
; RAM: [== ] 24.4% (used 79820 bytes from 327680 bytes)
; Flash: [========= ] 88.6% (used 1393421 bytes from 1572864 bytes)
[env:wemos_shield_esp32_4MB_LineIn_max]
extends = wemos_shield_esp32_4MB_max_base
build_flags = ${wemos_shield_esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=wemos_shield_esp32_4MB_LineIn_max ; This will be included in the firmware.bin filename
-D SR_DMTYPE=4 -D MCLK_PIN=0 -D I2S_SDPIN=25 -D I2S_WSPIN=15 -D I2S_CKPIN=14 ; for audio Line-In shield
-D SR_SQUELCH=2 -D SR_GAIN=40 -D SR_FREQ_PROF=1 ; CS5343 Line-In specific
;wemos_shield_esp32_16MB_max: bin entry, uses wemos_shield_esp32_4MB_max_base and adds 16MB settings
[env:wemos_shield_esp32_16MB_max]
extends = env:wemos_shield_esp32_4MB_max_base
extends = wemos_shield_esp32_4MB_max_base
board = esp32_twilord ; "TwilightLord" ESP32 with 16MB Flash
board_build.partitions = tools/WLED_ESP32_16MB.csv ; for esp32_twilord with 16MB flash
build_flags = ${env:wemos_shield_esp32_4MB_max_base.build_flags}
build_flags = ${wemos_shield_esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=wemos_shield_esp32_16MB_max ; This will be included in the firmware.bin filename
; RAM: [== ] 24.4% (used 79820 bytes from 327680 bytes)
; Flash: [======= ] 66.4% (used 1393421 bytes from 2097152 bytes)
; ESP32 WLED pico board with builtin ICS-43432 microphpone
[env:esp32_pico_4MB_max]
extends = env:esp32_4MB_max_base
extends = esp32_4MB_max_base
board = pico32
build_flags = ${env:esp32_4MB_max_base.build_flags}
build_flags = ${esp32_4MB_max_base.build_flags}
-D WLED_RELEASE_NAME=esp32_pico_4MB_max ; This will be included in the firmware.bin filename
-D WLED_DISABLE_BROWNOUT_DET
-D SERVERNAME='"WLED-pico32"'
@@ -865,7 +926,8 @@ build_flags = ${env:esp32_4MB_max_base.build_flags}
-D BTNPIN=-1
-D IRPIN=-1
-D HW_PIN_SCL=22 -D HW_PIN_SDA=21
-D DMTYPE=1 -D I2S_SDPIN=25 -D I2S_WSPIN=15 -D I2S_CKPIN=14
-D SR_DMTYPE=1 -D I2S_SDPIN=25 -D I2S_WSPIN=15 -D I2S_CKPIN=14
-D SR_SQUELCH=5 -D SR_GAIN=30 -D SR_FREQ_PROF=5 ; ICS-43434 specific
; -D MCLK_PIN=0
; -D WLED_USE_MY_CONFIG
; -D WLED_DISABLE_LOXONE

View File

@@ -56,9 +56,17 @@ constexpr SRate_t SAMPLE_RATE = 22050; // Base sample rate in Hz - 22Kh
// globals
static uint8_t inputLevel = 128; // UI slider value
static uint8_t soundSquelch = 10; // squelch value for volume reactive routines (config value)
static uint8_t sampleGain = 60; // sample gain (config value)
static uint8_t soundAgc = 0; // Automagic gain control: 0 - none, 1 - normal, 2 - vivid, 3 - lazy (config value)
#ifndef SR_SQUELCH
uint8_t soundSquelch = 10; // squelch value for volume reactive routines (config value)
#else
uint8_t soundSquelch = SR_SQUELCH; // squelch value for volume reactive routines (config value)
#endif
#ifndef SR_GAIN
uint8_t sampleGain = 60; // sample gain (config value)
#else
uint8_t sampleGain = SR_GAIN; // sample gain (config value)
#endif
static uint8_t soundAgc = 1; // Automagic gain control: 0 - none, 1 - normal, 2 - vivid, 3 - lazy (config value)
static uint8_t audioSyncEnabled = 0; // bit field: bit 0 - send, bit 1 - receive (config value)
static bool udpSyncConnected = false; // UDP connection status -> true if connected to multicast group
@@ -68,7 +76,11 @@ static uint16_t attackTime = 50; // int: attack time in millisecond
static uint16_t decayTime = 300; // int: decay time in milliseconds. New default 300ms. Old default was 1.40sec
// user settable options for FFTResult scaling
static uint8_t FFTScalingMode = 3; // 0 none; 1 optimized logarithmic; 2 optimized linear; 3 optimized sqare root
static uint8_t pinkIndex = 0; // 0: default; 1: line-in; 2: IMNP441
#ifndef SR_FREQ_PROF
static uint8_t pinkIndex = 0; // 0: default; 1: line-in; 2: IMNP441
#else
static uint8_t pinkIndex = SR_FREQ_PROF; // 0: default; 1: line-in; 2: IMNP441
#endif
//
// AGC presets
@@ -167,7 +179,8 @@ static uint64_t sampleTime = 0;
#define MAX_PINK 9 // 0 = standard, 1= line-in (pink moise only), 2..4 = IMNP441, 5..6 = ICS-43434, 6..7 = userdef, 9= flat (no pink noise adjustment)
static const float fftResultPink[MAX_PINK+1][NUM_GEQ_CHANNELS] = {
{ 1.70f, 1.71f, 1.73f, 1.78f, 1.68f, 1.56f, 1.55f, 1.63f, 1.79f, 1.62f, 1.80f, 2.06f, 2.47f, 3.35f, 6.83f, 9.55f }, // default from SR WLED
{ 1.30f, 1.32f, 1.40f, 1.46f, 1.52f, 1.57f, 1.68f, 1.80f, 1.89f, 2.00f, 2.11f, 2.21f, 2.30f, 2.39f, 3.09f, 4.34f }, // Line-In - pink noise adjustment only, without microphone distortion
// { 1.30f, 1.32f, 1.40f, 1.46f, 1.52f, 1.57f, 1.68f, 1.80f, 1.89f, 2.00f, 2.11f, 2.21f, 2.30f, 2.39f, 3.09f, 4.34f }, // Line-In Generic -> pink noise adjustment only
{ 1.24f, 1.20f, 1.30f, 1.40f, 1.48f, 1.57f, 1.68f, 1.80f, 1.89f, 2.00f, 2.14f, 2.26f, 2.60f, 3.00f, 3.70f, 5.20f }, // Line-In CS5343
{ 1.82f, 1.72f, 1.70f, 1.50f, 1.52f, 1.57f, 1.68f, 1.80f, 1.89f, 2.00f, 2.11f, 2.21f, 2.30f, 2.90f, 3.86f, 6.29f}, // IMNP441 datasheet response profile * pink noise
{ 2.80f, 2.20f, 1.30f, 1.15f, 1.55f, 2.45f, 4.20f, 2.80f, 3.20f, 3.60f, 4.20f, 4.90f, 5.70f, 6.05f,10.50f,14.85f}, // IMNP441 - big speaker, strong bass
@@ -285,10 +298,11 @@ void FFTcode(void * parameter)
// band pass filter - can reduce noise floor by a factor of 50
// downside: frequencies below 100Hz will be ignored
if (useBandPassFilter) {
// low frequency cutoff parameter
//constexpr float alpha = 0.04f; // 100hz
constexpr float alpha = 0.03f; // 80hz
//constexpr float alpha = 0.0225f; // 60hz
// low frequency cutoff parameter - see https://dsp.stackexchange.com/questions/40462/exponential-moving-average-cut-off-frequency
//constexpr float alpha = 0.04f; // 150Hz
//constexpr float alpha = 0.03f; // 110Hz
constexpr float alpha = 0.0225f; // 80hz
//constexpr float alpha = 0.01693f;// 60hz
// high frequency cutoff parameter
//constexpr float beta1 = 0.75; // 11Khz
//constexpr float beta1 = 0.82; // 15Khz
@@ -597,10 +611,10 @@ class AudioReactive : public Usermod {
#else
int8_t audioPin = AUDIOPIN;
#endif
#ifndef DMTYPE // I2S mic type
#ifndef SR_DMTYPE // I2S mic type
uint8_t dmType = 1; // 0=none/disabled/analog; 1=generic I2S
#else
uint8_t dmType = DMTYPE;
uint8_t dmType = SR_DMTYPE;
#endif
#ifndef I2S_SDPIN // aka DOUT
int8_t i2ssdPin = 32;
@@ -1194,6 +1208,7 @@ class AudioReactive : public Usermod {
break;
case 2:
DEBUGSR_PRINTLN(F("AR: ES7243 Microphone (right channel only)."));
//useBandPassFilter = true;
audioSource = new ES7243(SAMPLE_RATE, BLOCK_SIZE);
delay(100);
if (audioSource) audioSource->initialize(sdaPin, sclPin, i2swsPin, i2ssdPin, i2sckPin, mclkPin);
@@ -1206,6 +1221,7 @@ class AudioReactive : public Usermod {
break;
case 4:
DEBUGSR_PRINT(F("AR: Generic I2S Microphone with Master Clock - ")); DEBUGSR_PRINTLN(F(I2S_MIC_CHANNEL_TEXT));
//useBandPassFilter = true;
audioSource = new I2SSource(SAMPLE_RATE, BLOCK_SIZE, true, 1.0f/24.0f);
//audioSource = new I2SSource(SAMPLE_RATE, BLOCK_SIZE, false, 1.0f/16.0f); // I2S SLAVE mode - does not work, unfortunately
delay(100);
@@ -1232,6 +1248,7 @@ class AudioReactive : public Usermod {
case 0:
default:
DEBUGSR_PRINTLN(F("AR: Analog Microphone (left channel only)."));
//useBandPassFilter = true;
audioSource = new I2SAdcSource(SAMPLE_RATE, BLOCK_SIZE);
delay(100);
if (audioSource) audioSource->initialize(audioPin);
@@ -1246,7 +1263,11 @@ class AudioReactive : public Usermod {
if (enabled) disableSoundProcessing = false; // all good - enable audio processing
if((!audioSource) || (!audioSource->isInitialized())) { // audio source failed to initialize. Still stay "enabled", as there might be input arriving via UDP Sound Sync
#ifdef WLED_DEBUG
DEBUG_PRINTLN(F("AR: Failed to initialize sound input driver. Please check input PIN settings."));
#else
DEBUGSR_PRINTLN(F("AR: Failed to initialize sound input driver. Please check input PIN settings."));
#endif
disableSoundProcessing = true;
}
@@ -1728,19 +1749,19 @@ class AudioReactive : public Usermod {
pinArray.add(sdaPin);
pinArray.add(sclPin);
JsonObject cfg = top.createNestedObject("cfg");
JsonObject cfg = top.createNestedObject("config");
cfg[F("squelch")] = soundSquelch;
cfg[F("gain")] = sampleGain;
cfg[F("AGC")] = soundAgc;
JsonObject dynLim = top.createNestedObject("dynamics");
dynLim[F("Limiter")] = limiterOn;
dynLim[F("Rise")] = attackTime;
dynLim[F("Fall")] = decayTime;
dynLim[F("limiter")] = limiterOn;
dynLim[F("rise")] = attackTime;
dynLim[F("fall")] = decayTime;
JsonObject freqScale = top.createNestedObject("Frequency");
freqScale[F("Scale")] = FFTScalingMode;
freqScale[F("Profile")] = pinkIndex;
JsonObject freqScale = top.createNestedObject("frequency");
freqScale[F("scale")] = FFTScalingMode;
freqScale[F("profile")] = pinkIndex;
JsonObject sync = top.createNestedObject("sync");
sync[F("port")] = audioSyncPort;
@@ -1780,16 +1801,16 @@ class AudioReactive : public Usermod {
configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][4], sdaPin);
configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][5], sclPin);
configComplete &= getJsonValue(top["cfg"][F("squelch")], soundSquelch);
configComplete &= getJsonValue(top["cfg"][F("gain")], sampleGain);
configComplete &= getJsonValue(top["cfg"][F("AGC")], soundAgc);
configComplete &= getJsonValue(top["config"][F("squelch")], soundSquelch);
configComplete &= getJsonValue(top["config"][F("gain")], sampleGain);
configComplete &= getJsonValue(top["config"][F("AGC")], soundAgc);
configComplete &= getJsonValue(top["dynamics"][F("Limiter")], limiterOn);
configComplete &= getJsonValue(top["dynamics"][F("Rise")], attackTime);
configComplete &= getJsonValue(top["dynamics"][F("Fall")], decayTime);
configComplete &= getJsonValue(top["dynamics"][F("limiter")], limiterOn);
configComplete &= getJsonValue(top["dynamics"][F("rise")], attackTime);
configComplete &= getJsonValue(top["dynamics"][F("fall")], decayTime);
configComplete &= getJsonValue(top["Frequency"][F("Scale")], FFTScalingMode);
configComplete &= getJsonValue(top["Frequency"][F("Profile")], pinkIndex);
configComplete &= getJsonValue(top["frequency"][F("scale")], FFTScalingMode);
configComplete &= getJsonValue(top["frequency"][F("profile")], pinkIndex);
configComplete &= getJsonValue(top["sync"][F("port")], audioSyncPort);
configComplete &= getJsonValue(top["sync"][F("mode")], audioSyncEnabled);
@@ -1812,26 +1833,26 @@ class AudioReactive : public Usermod {
oappend(SET_F("addOption(dd,'Generic I2S PDM',5);"));
#endif
oappend(SET_F("addOption(dd,'ES8388',6);"));
oappend(SET_F("dd=addDropdown('AudioReactive','cfg:AGC');"));
oappend(SET_F("dd=addDropdown('AudioReactive','config:AGC');"));
oappend(SET_F("addOption(dd,'Off',0);"));
oappend(SET_F("addOption(dd,'Normal',1);"));
oappend(SET_F("addOption(dd,'Vivid',2);"));
oappend(SET_F("addOption(dd,'Lazy',3);"));
oappend(SET_F("dd=addDropdown('AudioReactive','dynamics:Limiter');"));
oappend(SET_F("dd=addDropdown('AudioReactive','dynamics:limiter');"));
oappend(SET_F("addOption(dd,'Off',0);"));
oappend(SET_F("addOption(dd,'On',1);"));
oappend(SET_F("addInfo('AudioReactive:dynamics:Limiter',0,' On ');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('AudioReactive:dynamics:Rise',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("addInfo('AudioReactive:dynamics:Fall',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("addInfo('AudioReactive:dynamics:limiter',0,' On ');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('AudioReactive:dynamics:rise',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("addInfo('AudioReactive:dynamics:fall',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("dd=addDropdown('AudioReactive','Frequency:Scale');"));
oappend(SET_F("dd=addDropdown('AudioReactive','frequency:scale');"));
oappend(SET_F("addOption(dd,'None',0);"));
oappend(SET_F("addOption(dd,'Linear (Amplitude)',2);"));
oappend(SET_F("addOption(dd,'Square Root (Energy)',3);"));
oappend(SET_F("addOption(dd,'Logarithmic (Loudness)',1);"));
oappend(SET_F("dd=addDropdown('AudioReactive','Frequency:Profile');"));
oappend(SET_F("dd=addDropdown('AudioReactive','frequency:profile');"));
oappend(SET_F("addOption(dd,'Generic Microphone',0);"));
oappend(SET_F("addOption(dd,'Generic Line-In',1);"));
oappend(SET_F("addOption(dd,'IMNP441',2);"));
@@ -1848,16 +1869,16 @@ class AudioReactive : public Usermod {
oappend(SET_F("addOption(dd,'Send',1);"));
oappend(SET_F("addOption(dd,'Receive',2);"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:type',1,'<i>requires reboot!</i>');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',0,'I2S SD');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',1,'I2S WS');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',2,'I2S SCK');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',0,'I2S Serial Data', '<i><span class=\"h\">sd/data/dout</span></i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',1,'I2S L/R Clock','<i><span class=\"h\">ws/clk/lrck</span></i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',2,'I2S Serial Clock','<i>sck/bclk</i>');"));
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3)
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK <br/><i>only use -1, 0, 1 or 3 for MCLK</i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK','<i>only use -1, 0, 1 or 3</i>');"));
#else
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK','');"));
#endif
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'I2C SDA');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',5,'I2C SCL');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'I2C SDA',' ');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',5,'I2C SCL',' ');"));
}

View File

@@ -24,11 +24,15 @@
// see https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/chip-series-comparison.html#related-documents
// and https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/i2s.html#overview-of-all-modes
#if defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2)
#if defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2) || defined(ESP8266) || defined(ESP8265)
// there are two things in these MCUs that could lead to problems with audio processing:
// * no floating point hardware (FPU) support - FFT uses float calculations. If done in software, a strong slow-down can be expected (between 8x and 20x)
// * single core, so FFT task might slow down other things like LED updates
#if !defined(SOC_I2S_NUM) || (SOC_I2S_NUM < 1)
#error This audio reactive usermod does not support ESP32-C2, ESP32-C3 or ESP32-S2.
#else
#warning This audio reactive usermod does not support ESP32-C2, ESP32-C3 or ESP32-S2.
#endif
#endif
/* ToDo: remove. ES7243 is controlled via compiler defines
@@ -227,11 +231,23 @@ class I2SSource : public AudioSource {
}
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)
if ((_i2sMaster == false) && (_config.mode & I2S_MODE_SLAVE)) { // I2S slave mode (experimental).
// Seems we need to drive clocks in slave mode
_config.use_apll = true;
_config.fixed_mclk = 512 * int(_config.sample_rate);
}
if (mclkPin != I2S_PIN_NO_CHANGE) {
_config.use_apll = true; // experimental - use aPLL clock source to improve sampling quality, and to avoid glitches.
// //_config.fixed_mclk = 512 * _sampleRate;
// //_config.fixed_mclk = 256 * _sampleRate;
}
#if !defined(SOC_I2S_SUPPORTS_APLL)
#warning this MCU does not have an APLL high accuracy clock for audio
// S3: not supported; S2: supported; C3: not supported
_config.use_apll = false; // APLL not supported on this MCU
#endif
#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3)
if (ESP.getChipRevision() == 0) _config.use_apll = false; // APLL is broken on ESP32 revision 0
#endif
@@ -263,6 +279,8 @@ class I2SSource : public AudioSource {
.data_in_num = i2ssdPin
};
//DEBUGSR_PRINTF("[AR] I2S: SD=%d, WS=%d, SCK=%d, MCLK=%d\n", i2ssdPin, i2swsPin, i2sckPin, mclkPin);
esp_err_t err = i2s_driver_install(I2S_NUM_0, &_config, 0, nullptr);
if (err != ESP_OK) {
DEBUGSR_PRINTF("AR: Failed to install i2s driver: %d\n", err);
@@ -274,7 +292,8 @@ class I2SSource : public AudioSource {
if(_config.mode & I2S_MODE_MASTER) {
if (_config.mode & I2S_MODE_PDM)
DEBUGSR_PRINTLN(F("AR: I2S#0 driver installed in PDM MASTER mode."));
else DEBUGSR_PRINTLN(F("AR: I2S#0 driver installed in MASTER mode."));
else
DEBUGSR_PRINTLN(F("AR: I2S#0 driver installed in MASTER mode."));
} else
DEBUGSR_PRINTLN(F("AR: I2S#0 driver installed in SLAVE mode."));
@@ -412,9 +431,22 @@ public:
};
void initialize(int8_t sdaPin, int8_t sclPin, int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t mclkPin) {
// check that pins are valid
if ((sdaPin < 0) || (sclPin < 0)) {
DEBUGSR_PRINTF("\nAR: invalid ES7243 I2C pins: SDA=%d, SCL=%d\n", sdaPin, sclPin);
return;
}
if ((i2sckPin < 0) || (mclkPin < 0)) {
DEBUGSR_PRINTF("\nAR: invalid I2S pin: SCK=%d, MCLK=%d\n", i2sckPin, mclkPin);
return;
}
// Reserve SDA and SCL pins of the I2C interface
if (!pinManager.allocatePin(sdaPin, true, PinOwner::HW_I2C) ||
!pinManager.allocatePin(sclPin, true, PinOwner::HW_I2C)) {
PinManagerPinType es7243Pins[2] = { { sdaPin, true }, { sclPin, true } };
if (!pinManager.allocateMultiplePins(es7243Pins, 2, PinOwner::HW_I2C)) {
pinManager.deallocateMultiplePins(es7243Pins, 2, PinOwner::HW_I2C);
DEBUGSR_PRINTF("\nAR: Failed to allocate ES7243 I2C pins: SDA=%d, SCL=%d\n", sdaPin, sclPin);
return;
}
@@ -428,8 +460,8 @@ public:
void deinitialize() {
// Release SDA and SCL pins of the I2C interface
pinManager.deallocatePin(pin_ES7243_SDA, PinOwner::HW_I2C);
pinManager.deallocatePin(pin_ES7243_SCL, PinOwner::HW_I2C);
PinManagerPinType es7243Pins[2] = { { pin_ES7243_SDA, true }, { pin_ES7243_SCL, true } };
pinManager.deallocateMultiplePins(es7243Pins, 2, PinOwner::HW_I2C);
I2SSource::deinitialize();
}
@@ -495,6 +527,12 @@ public:
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)
#if !defined(SOC_I2S_SUPPORTS_ADC) && !defined(SOC_I2S_SUPPORTS_ADC_DAC)
#warning this MCU does not support analog sound input
#endif
#endif
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3)
// ADC over I2S is only availeable in "classic" ESP32

View File

@@ -20,7 +20,7 @@ All parameters are runtime configurable though some may require hard boot after
If you want to define default GPIOs during compile time use the following (default values in parentheses):
- `DMTYPE=x` : defines digital microphone type: 0=analog, 1=generic I2S, 2=ES7243 I2S, 3=SPH0645 I2S, 4=generic I2S with master clock, 5=PDM I2S
- `SR_DMTYPE=x` : defines digital microphone type: 0=analog, 1=generic I2S, 2=ES7243 I2S, 3=SPH0645 I2S, 4=generic I2S with master clock, 5=PDM I2S
- `AUDIOPIN=x` : GPIO for analog microphone/AUX-in (36)
- `I2S_SDPIN=x` : GPIO for SD pin on digital mcrophone (32)
- `I2S_WSPIN=x` : GPIO for WS pin on digital mcrophone (15)

View File

@@ -1036,11 +1036,11 @@ class FourLineDisplayUsermod : public Usermod {
oappend(SET_F("addOption(dd,'SSD1305 128x64',5);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI',6);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',7);"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'I2C/SPI CLK (-1 use global)');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'I2C/SPI DTA (-1 use global)');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'SPI CS');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'SPI DC');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'SPI RST');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'I2C/SPI CLK','<i>-1 use global</i>');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'I2C/SPI DTA','<i>-1 use global</i>');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'SPI CS',' ');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'SPI DC',' ');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'SPI RST',' ');"));
}
/*

View File

@@ -54,8 +54,8 @@
class RotaryEncoderUIUsermod : public Usermod {
private:
int fadeAmount = 10; // Amount to change every step (brightness)
unsigned long currentTime;
unsigned long loopTime;
unsigned long currentTime = 0;
unsigned long loopTime = 0;
int8_t pinA = ENCODER_DT_PIN; // DT from encoder
int8_t pinB = ENCODER_CLK_PIN; // CLK from encoder
int8_t pinC = ENCODER_SW_PIN; // SW from encoder
@@ -107,6 +107,7 @@ public:
// tracking the owner tags....
pinA = pinB = pinC = -1;
enabled = false;
DEBUG_PRINTLN(F("Failed to alocate GPIO pins for Usermod Rotary Encoder.")); //WLEDMM add debug info
return;
}

View File

@@ -116,7 +116,7 @@ static int re_qstringCmp(const void *ap, const void *bp) {
class RotaryEncoderUIUsermod : public Usermod {
private:
int8_t fadeAmount = 5; // Amount to change every step (brightness)
unsigned long loopTime;
unsigned long loopTime = 0;
unsigned long buttonPressedTime = 0;
unsigned long buttonWaitTime = 0;
@@ -275,6 +275,7 @@ public:
// tracking the owner tags....
pinA = pinB = pinC = -1;
enabled = false;
DEBUG_PRINTLN(F("Failed to alocate GPIO pins for Usermod Rotary Encoder (ALT).")); //WLEDMM add debug info
return;
}
@@ -327,9 +328,11 @@ public:
*/
void loop()
{
if (!enabled || strip.isUpdating()) return;
if (!enabled) return;
unsigned long currentTime = millis(); // get the current elapsed time
if (strip.isUpdating() && (currentTime - loopTime < 4)) return; // WLEDMM: be nice, but not too nice
// Initialize effectCurrentIndex and effectPaletteIndex to
// current state. We do it here as (at least) effectCurrent
// is not yet initialized when setup is called.
@@ -342,7 +345,7 @@ public:
currentEffectAndPaletteInitialized = false;
}
if (currentTime >= (loopTime + 2)) // 2ms since last check of encoder = 500Hz
if (currentTime - loopTime >= 2) // 2ms since last check of encoder = 500Hz
{
loopTime = currentTime; // Updates loopTime
@@ -642,8 +645,8 @@ public:
}
lampUdated();
#ifdef USERMOD_FOUR_LINE_DISPLAY
char lineBuffer[64];
sprintf(lineBuffer, "%d", val);
char lineBuffer[64] = { '\0' };
snprintf(lineBuffer, 63, "%d", val); // WLEDMM: avoid string buffer overflow
display->overlay(lineBuffer, 500, 10); // use star
#endif
}
@@ -702,8 +705,8 @@ public:
}
lampUdated();
#ifdef USERMOD_FOUR_LINE_DISPLAY
char lineBuffer[64];
sprintf(lineBuffer, "%d", currentHue1);
char lineBuffer[64] = { '\0' };
snprintf(lineBuffer, 63, "%d", currentHue1); // WLEDMM: avoid string buffer overflow
display->overlay(lineBuffer, 500, 7); // use brush
#endif
}
@@ -731,8 +734,8 @@ public:
}
lampUdated();
#ifdef USERMOD_FOUR_LINE_DISPLAY
char lineBuffer[64];
sprintf(lineBuffer, "%d", currentSat1);
char lineBuffer[64] = { '\0' };
snprintf(lineBuffer, 63, "%d", currentSat1); // WLEDMM: avoid string buffer overflow
display->overlay(lineBuffer, 500, 8); // use contrast
#endif
}
@@ -748,7 +751,7 @@ public:
#endif
if (presetHigh && presetLow && presetHigh > presetLow) {
StaticJsonDocument<64> root;
char str[64];
char str[64] = { '\0' };
sprintf_P(str, PSTR("%d~%d~%s"), presetLow, presetHigh, increase?"":"-");
root[F("ps")] = str;
deserializeState(root.as<JsonObject>(), CALL_MODE_BUTTON_PRESET);
@@ -763,7 +766,7 @@ public:
*/
lampUdated();
#ifdef USERMOD_FOUR_LINE_DISPLAY
sprintf(str, "%d", currentPreset);
snprintf(str, 63, "%d", currentPreset); // WLEDMM: avoid string buffer overflow
display->overlay(str, 500, 11); // use heart
#endif
}
@@ -791,8 +794,8 @@ public:
// }
lampUdated();
#ifdef USERMOD_FOUR_LINE_DISPLAY
char lineBuffer[64];
sprintf(lineBuffer, "%d", currentCCT);
char lineBuffer[64] = { '\0' };
snprintf(lineBuffer, 63, "%d", currentCCT); // WLEDMM: avoid string buffer overflow
display->overlay(lineBuffer, 500, 10); // use star
#endif
}

View File

@@ -633,7 +633,7 @@ typedef struct Segment {
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color) {}
void wu_pixel(uint32_t x, uint32_t y, CRGB c) {}
#endif
CRGBPalette16 getAudioPalette(); //WLEDMM netmindz ar palette
uint8_t * getAudioPalette(int pal); //WLEDMM netmindz ar palette
} segment;
//static int segSize = sizeof(Segment);
@@ -840,7 +840,7 @@ class WS2812FX { // 96 bytes
#endif
void
setUpMatrix(),
setUpMatrix(bool reset = true), //WLEDMM: add reset option to switch on/off reset of customMappingTable
setPixelColorXY(int x, int y, uint32_t c);
// outsmart the compiler :) by correctly overloading

View File

@@ -34,12 +34,14 @@
// note: matrix may be comprised of multiple panels each with different orientation
// but ledmap takes care of that. ledmap is constructed upon initialization
// so matrix should disable regular ledmap processing
void WS2812FX::setUpMatrix() {
void WS2812FX::setUpMatrix(bool reset) {
#ifndef WLED_DISABLE_2D
// erase old ledmap, just in case.
if (customMappingTable != nullptr) delete[] customMappingTable;
customMappingTable = nullptr;
customMappingSize = 0;
if (reset) { //WLEDMM: add reset option to switch on/off reset of customMappingTable
if (customMappingTable != nullptr) delete[] customMappingTable;
customMappingTable = nullptr;
customMappingSize = 0;
}
if (isMatrix) {
matrixWidth = hPanels * panelW;
@@ -53,8 +55,14 @@ void WS2812FX::setUpMatrix() {
return;
}
customMappingSize = matrixWidth * matrixHeight;
customMappingTable = new uint16_t[customMappingSize];
if (reset) { //WLEDMM: add reset option to switch on/off reset of customMappingTable
customMappingSize = matrixWidth * matrixHeight;
customMappingTable = new uint16_t[customMappingSize];
//WLEDMM: init customMappingTable with a 1:1 mapping (for customMappingTable[customMappingTable[x]])
for (uint16_t i=0; i<customMappingSize; i++) {
customMappingTable[i] = i;
}
}
if (customMappingTable != nullptr) {
uint16_t startL; // index in custom mapping array (logical strip)
@@ -80,7 +88,7 @@ void WS2812FX::setUpMatrix() {
x = (panel[h*j + i].vertical ? panel[h*j + i].bottomStart : panel[h*j + i].rightStart) ? W - k - 1 : k;
x = (panel[h*j + i].serpentine && l%2) ? (W - x - 1) : x;
offset = (panel[h*j + i].vertical ? y : x) + (panel[h*j + i].vertical ? x : y) * matrixWidth;
customMappingTable[startL + offset] = startP + q;
customMappingTable[customMappingTable[startL + offset]] = startP + q; //WLEDMM: allow for 2 transitions if reset = false (ledmap and logical to physical)
}
}
}

View File

@@ -279,7 +279,8 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
case 12: //Rainbow stripe colors
targetPalette = RainbowStripeColors_p; break;
case 71: //WLEDMM netmindz ar palette +1
targetPalette = getAudioPalette(); break;
case 72: //WLEDMM netmindz ar palette +1
targetPalette.loadDynamicGradientPalette(getAudioPalette(pal)); break;
default: //progmem palettes
if (pal>245) {
targetPalette = strip.customPalettes[255-pal]; // we checked bounds above
@@ -1140,35 +1141,38 @@ uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_
}
//WLEDMM netmindz ar palette
CRGBPalette16 Segment::getAudioPalette() {
uint8_t * Segment::getAudioPalette(int pal) {
// https://forum.makerforums.info/t/hi-is-it-possible-to-define-a-gradient-palette-at-runtime-the-define-gradient-palette-uses-the/63339
um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
um_data = simulateSound(SEGMENT.soundSim);
}
uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
uint8_t xyz[12]; // Needs to be 4 times however many colors are being used.
// 3 colors = 12, 4 colors = 16, etc.
CRGB rgb = getCRGBForBand(0, fftResult);
static uint8_t xyz[12]; // Needs to be 4 times however many colors are being used.
// 3 colors = 12, 4 colors = 16, etc.
CRGB rgb = getCRGBForBand(0, fftResult, pal);
xyz[0] = 0; // anchor of first color - must be zero
xyz[1] = rgb.r;
xyz[2] = rgb.g;
xyz[3] = rgb.b;
rgb = getCRGBForBand(4, fftResult);
rgb = getCRGBForBand(4, fftResult, pal);
xyz[4] = 128;
xyz[5] = rgb.r;
xyz[6] = rgb.g;
xyz[7] = rgb.b;
rgb = getCRGBForBand(8, fftResult);
rgb = getCRGBForBand(8, fftResult, pal);
xyz[8] = 255; // anchor of last color - must be 255
xyz[9] = rgb.r;
xyz[10] = rgb.g;
xyz[11] = rgb.b;
return CRGBPalette16(xyz);
return xyz;
}
@@ -1818,7 +1822,7 @@ void WS2812FX::loadCustomPalettes()
//load custom mapping table from JSON file (called from finalizeInit() or deserializeState())
void WS2812FX::deserializeMap(uint8_t n) {
if (isMatrix) return; // 2D support creates its own ledmap
// WLEDMM: also supports isMatrix
char fileName[32];
strcpy_P(fileName, PSTR("/ledmap"));
@@ -1829,9 +1833,14 @@ void WS2812FX::deserializeMap(uint8_t n) {
if (!isFile) {
// erase custom mapping if selecting nonexistent ledmap.json (n==0)
if (!n && customMappingTable != nullptr) {
customMappingSize = 0;
delete[] customMappingTable;
customMappingTable = nullptr;
//WLEDMM: if isMatrix then not erase but back to matrix default
if (isMatrix)
setUpMatrix(true);
else {
customMappingSize = 0;
delete[] customMappingTable;
customMappingTable = nullptr;
}
}
return;
}
@@ -1855,12 +1864,19 @@ void WS2812FX::deserializeMap(uint8_t n) {
JsonArray map = doc[F("map")];
if (!map.isNull() && map.size()) { // not an empty map
customMappingSize = map.size();
//WLEDMM: if isMatrix then customMap size is whole matrix
if (isMatrix)
customMappingSize = matrixWidth * matrixHeight;
else
customMappingSize = map.size();
customMappingTable = new uint16_t[customMappingSize];
for (uint16_t i=0; i<customMappingSize; i++) {
for (uint16_t i=0; i<map.size(); i++) {
customMappingTable[i] = (uint16_t) map[i];
}
setUpMatrix(false); //WLEDMM: apply logical to physical mapping after the ledmap
}
else
setUpMatrix(true); //WLEDMM: if no map then back to matrix default
releaseJSONBufferLock();
}
@@ -1883,5 +1899,5 @@ const char JSON_palette_names[] PROGMEM = R"=====([
"Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura",
"Aurora","Atlantica","C9 2","C9 New","Temperature","Aurora 2","Retro Clown","Candy","Toxy Reaf","Fairy Reaf",
"Semi Blue","Pink Candy","Red Reaf","Aqua Flash","Yelblu Hot","Lite Light","Red Flash","Blink Red","Red Shift","Red Tide",
"Candy2","Audio Responsive"
"Candy2","Audio Responsive Ratio","Audio Responsive Hue"
])=====";

View File

@@ -5,7 +5,7 @@
* Readability defines and their associated numerical values + compile-time constants
*/
#define GRADIENT_PALETTE_COUNT 59 //WLEDMM netmindz ar palette +1
#define GRADIENT_PALETTE_COUNT 60 //WLEDMM netmindz ar palette +2
//Defaults
#define DEFAULT_CLIENT_SSID "Your_Network"

View File

@@ -587,7 +587,7 @@ button {
margin: 0 auto;
}
#imgw {
#info #imgw {
/*display: inline-block;*/
margin: 8px auto;
}
@@ -654,7 +654,7 @@ img {
border-radius: 10px;
background: var(--c-3);
color: var(--c-f);
padding: 4px 4px 2px;
padding: 2px 4px;
font-size: 14px;
right: 3px;
transition: visibility 0.25s ease, opacity 0.25s ease;
@@ -780,7 +780,7 @@ input[type=range]::-moz-range-thumb {
margin: 0;
}
.btn-icon {
margin: -4px 4px 0 0;
margin: -4px 4px -1px 0;
vertical-align: middle;
display: inline-block;
}
@@ -911,7 +911,7 @@ input[type=text] {
background: var(--c-3);
color: var(--c-f);
border: 0px solid var(--c-2);
border-radius: 5px;
border-radius: 10px;
padding: 8px;
/*margin: 6px 6px 6px 0;*/
font-size: 19px;
@@ -971,7 +971,7 @@ textarea {
}
.ptxt {
margin: 0 4px 4px !important;
margin: -1px 4px 8px !important;
display: none;
}
@@ -1191,7 +1191,7 @@ TD .checkmark, TD .radiomark {
/* segment & preset wrapper */
.seg, .pres {
background-color: var(--c-2);
color: var(--c-f);
/*color: var(--c-f);*/ /* seems to affect only the Add segment button, which should be same color as reset segments */
border: 0px solid var(--c-f);
text-align: left;
transition: background-color 0.5s;
@@ -1282,6 +1282,10 @@ TD .checkmark, TD .radiomark {
background-color: var(--c-3);
}
/*.selected .radiomark {
border: 1px solid var(--c-3);
}*/
/* selected list item */
.lstI.selected {
top: 0;
@@ -1332,7 +1336,7 @@ TD .checkmark, TD .radiomark {
/* list item palette preview */
.lstIprev {
width: 100%;
height: 7px;
height: 6px;
position: absolute;
bottom: 0;
left: 0;
@@ -1402,6 +1406,10 @@ TD .checkmark, TD .radiomark {
display: inline-block !important;
}
.m6 {
margin: 6px 0;
}
.c {
text-align: center;
}
@@ -1415,6 +1423,7 @@ TD .checkmark, TD .radiomark {
color: red;
}
/* horizontal divider (playlist entries) */
.hrz {
width: auto;
height: 2px;

View File

@@ -414,7 +414,7 @@ function presetError(empty)
else
cn += `Here is a backup of the last known good state:`;
cn += `<textarea id="bck"></textarea><br>
<button class="btn btn-p" onclick="cpBck()">Copy to clipboard</button>`;
<button class="btn" onclick="cpBck()">Copy to clipboard</button>`;
}
cn += `</div>`;
gId('pcont').innerHTML = cn;
@@ -1699,7 +1699,7 @@ function makeSeg()
<tr>
<td><input class="noslide segn" id="seg${lu}s" type="number" min="0" max="${isM?mw-1:ledCount-1}" value="${ns}" oninput="updateLen(${lu})" onkeydown="segEnter(${lu})"></td>
<td><input class="noslide segn" id="seg${lu}e" type="number" min="0" max="${ct}" value="${ct}" oninput="updateLen(${lu})" onkeydown="segEnter(${lu})"></td>
<td><button class="btn btn-xs" onclick="setSeg(${lu});resetUtil();"><i class="icons bth-icon" id="segc${lu}">&#xe390;</i></button></td>
<td><button class="btn btn-xs" onclick="setSeg(${lu});"><i class="icons bth-icon" id="segc${lu}">&#xe390;</i></button></td>
</tr>
${isM ? '<tr><td>Start Y</td><td>'+(cfg.comp.seglen?'Height':'Stop Y')+'</td></tr>'+
'<tr>'+
@@ -1719,7 +1719,7 @@ function resetUtil()
// gId('segutil').innerHTML = '<button class="btn btn-s" onclick="makeSeg()"><i class="icons btn-icon">&#xe18a;</i>segment</button>';
gId('segutil').innerHTML = '<div class="seg btn btn-s" style="border-radius:24px;padding:0;">'
+ '<label class="check schkl"><input type="checkbox" id="selall" onchange="selSegAll(this)"><span class="checkmark"></span></label>'
+ '<div class="segname" onclick="makeSeg()"><i class="icons btn-icon">&#xe18a;</i>segment</div></div>';
+ '<div class="segname" onclick="makeSeg()"><i class="icons btn-icon">&#xe18a;</i>Add segment</div></div>';
}
var plJson = {"0":{
@@ -1854,7 +1854,7 @@ ${makePlSel(plJson[i].end?plJson[i].end:0, true)}
<input type="checkbox" id="p${i}sbchk">
<span class="checkmark"></span>
</label>`;
if (Array.isArray(lastinfo.maps) && lastinfo.maps.length>1) {
if (Array.isArray(lastinfo.maps) && lastinfo.maps.length>0) {
content += `<div class="lbl-l">Ledmap:&nbsp;<div class="sel-p"><select class="sel-p" id="p${i}lmp"><option value="">Unchanged</option>`;
for (const k of (lastinfo.maps||[])) content += `<option value="${k}"${(i>0 && pJson[i].ledmap==k)?" selected":""}>${k==0?'Default':'ledmap'+k+'.json'}</option>`;
content += "</select></div></div>";
@@ -1873,9 +1873,9 @@ ${makePlSel(plJson[i].end?plJson[i].end:0, true)}
<span class="checkmark"></span>
</label>
</div>
<div class="po2" id="p${i}o2">API command<br><textarea class="apitxt" id="p${i}api"></textarea></div>
<div class="po2" id="p${i}o2">API command<br><textarea class="apitxt noslide" id="p${i}api"></textarea></div>
<div class="po1" id="p${i}o1">${content}</div>
<div class="c">Save to ID <input class="noslide" id="p${i}id" type="number" oninput="checkUsed(${i})" max=250 min=1 value=${(i>0)?i:getLowestUnusedP()}></div>
<div class="c m6">Save to ID <input class="noslide" id="p${i}id" type="number" oninput="checkUsed(${i})" max=250 min=1 value=${(i>0)?i:getLowestUnusedP()}></div>
<div class="c">
<button class="btn btn-p" onclick="saveP(${i},${pl})"><i class="icons btn-icon">&#xe390;</i>Save</button>
${(i>0)?'<button class="btn btn-p" id="p'+i+'del" onclick="delP('+i+')"><i class="icons btn-icon">&#xe037;</i>Delete':'<button class="btn btn-p" onclick="resetPUtil()">Cancel'}</button>
@@ -1936,7 +1936,8 @@ function makePlUtil()
if (plJson[0].transition[0] < 0) plJson[0].transition[0] = tr;
let p = gId('putil');
p.classList.remove('staybot');
p.innerHTML = `<div class="pres"><div class="segin expanded" id="seg100">${makeP(0,true)}</div></div>`;
p.classList.add('pres');
p.innerHTML = `<div class="presin expanded" id="seg100">${makeP(0,true)}</div></div>`;
refreshPlE(0);
gId('p0txt').focus();
p.scrollIntoView({
@@ -1952,8 +1953,8 @@ function resetPUtil()
let p = gId('putil');
p.classList.add('staybot');
p.classList.remove('pres');
p.innerHTML = `<button class="btn btn-s" onclick="makePUtil()" style="float:left;"><i class="icons btn-icon">&#xe18a;</i>preset</button>`
+ `<button class="btn btn-s" onclick="makePlUtil()" style="float:right;"><i class="icons btn-icon">&#xe18a;</i>playlist</button>`;
p.innerHTML = `<button class="btn btn-s" onclick="makePUtil()" style="float:left;"><i class="icons btn-icon">&#xe18a;</i>Preset</button>`
+ `<button class="btn btn-s" onclick="makePlUtil()" style="float:right;"><i class="icons btn-icon">&#xe18a;</i>Playlist</button>`;
}
function tglCs(i)
@@ -2027,13 +2028,21 @@ function rptSeg(s)
function setSeg(s)
{
var name = gId(`seg${s}t`).value;
var start = parseInt(gId(`seg${s}s`).value);
var stop = parseInt(gId(`seg${s}e`).value);
let sX = gId(`seg${s}s`);
let eX = gId(`seg${s}e`);
var start = parseInt(sX.value);
var stop = parseInt(eX.value);
if (start<sX.min || start>sX.max) {sX.value=sX.min; return;} // prevent out of bounds
if (stop<eX.min || stop>eX.max) {eX.value=eX.max; return;} // prevent out of bounds
if ((cfg.comp.seglen && stop == 0) || (!cfg.comp.seglen && stop <= start)) {delSeg(s); return;}
var obj = {"seg": {"id": s, "n": name, "start": start, "stop": (cfg.comp.seglen?start:0)+stop}};
if (isM) {
var startY = parseInt(gId(`seg${s}sY`).value);
var stopY = parseInt(gId(`seg${s}eY`).value);
let sY = gId(`seg${s}sY`);
let eY = gId(`seg${s}eY`);
var startY = parseInt(sY.value);
var stopY = parseInt(eY.value);
if (startY<sY.min || startY>sY.max) {sY.value=sY.min; return;} // prevent out of bounds
if (stopY<eY.min || stop>eY.max) {eY.value=eY.max; return;} // prevent out of bounds
obj.seg.startY = startY;
obj.seg.stopY = (cfg.comp.seglen?startY:0)+stopY;
}
@@ -2046,6 +2055,7 @@ function setSeg(s)
obj.seg.of = ofs;
if (isM) obj.seg.tp = gId(`seg${s}tp`).checked;
}
resetUtil(); // close add segment dialog just in case
requestJson(obj);
}

View File

@@ -104,9 +104,15 @@
}
}
}
//WLEDMM util function
function initCap(s) {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
}
function addField(k,f,o,a=false) { //key, field, (sub)object, isArray
if (isO(o)) {
urows += '<hr class="sml">';
if (f!=='unknown' && !k.includes(":")) urows += `<p><u>${initCap(f)}</u></p>`; //WLEDMM show group title
for (const [s,v] of Object.entries(o)) {
// possibility to nest objects (only 1 level)
if (f!=='unknown' && !k.includes(":")) addField(k+":"+f,s,v);
@@ -135,8 +141,7 @@
t = "text"; c = `value="${o}" style="width:250px;"`;
break;
}
if (k.includes(":")) urows += k.substr(k.indexOf(":")+1);
urows += ` ${f}: `;
urows += ` ${initCap(f)} `; //WLEDMM only show field (key is shown in grouping)
// https://stackoverflow.com/questions/11657123/posting-both-checked-and-unchecked-checkboxes
if (t=="checkbox") urows += `<input type="hidden" name="${k}:${f}${a?"[]":""}" value="false">`;
else if (!a) urows += `<input type="hidden" name="${k}:${f}${a?"[]":""}" value="${t}">`;
@@ -179,11 +184,19 @@
}
}
// https://stackoverflow.com/questions/26440494/insert-text-after-this-input-element-with-javascript
function addInfo(name,el,txt) {
//WLEDMM Add pre and post texts
function addInfo(name,el,txt, txt2="") {
let obj = d.getElementsByName(name);
if (!obj.length) return;
if (typeof el === "string" && obj[0]) obj[0].placeholder = el;
else if (obj[el]) obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt);
else if (obj[el]) {
if (txt2!="") {
obj[el].insertAdjacentHTML('beforebegin', txt + '&nbsp;');
obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt2);
}
else
obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt);
}
}
// load settings and insert values into DOM
function ldS() {

View File

@@ -334,7 +334,7 @@ int16_t extractModeDefaults(uint8_t mode, const char *segVar);
uint16_t crc16(const unsigned char* data_p, size_t length);
um_data_t* simulateSound(uint8_t simulationId);
void enumerateLedmaps();
CRGB getCRGBForBand(int x, uint8_t *fftResult); //WLEDMM netmindz ar palette
CRGB getCRGBForBand(int x, uint8_t *fftResult, int pal); //WLEDMM netmindz ar palette
#ifdef WLED_ADD_EEPROM_SUPPORT
//wled_eeprom.cpp

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -423,11 +423,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
usermods.readFromJsonState(root);
//WLEDMM: if no ledmap loadLedmap=0 (which erases customMappingTable in deserializeMap if exists)
if (root[F("ledmap")].isNull())
loadLedmap = 0;
else
loadLedmap = root[F("ledmap")] | loadLedmap;
loadLedmap = root[F("ledmap")] | loadLedmap;
byte ps = root[F("psave")];
if (ps > 0 && ps < 251) savePreset(ps, nullptr, root);
@@ -550,11 +546,6 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme
root["bri"] = briLast;
root[F("transition")] = transitionDelay/100; //in 100ms
}
//WLEDMM only add ledmap if defined, otherwise remove (then ledmap is 0 is assumed in deserializeState)
if (loadLedmap>0)
root[F("ledmap")] = loadLedmap;
else
root.remove(F("ledmap"));
if (!forPreset) {
if (errorFlag) {root[F("error")] = errorFlag; errorFlag = ERR_NONE;} //prevent error message to persist on screen

View File

@@ -915,7 +915,9 @@ const byte* const gGradientPalettes[] PROGMEM = {
red_shift_gp, //68-55 Red Shift
red_tide_gp, //69-56 Red Tide
candy2_gp, //70-57 Candy2
audio_responsive_gp, //71-58 AudioResponsive WLEDMM netmindz ar palette
// Palette contents not actually used as built on the fly, just here to create menu option
audio_responsive_gp, //71-58 AudioResponsive WLEDMM netmindz ar palette - placeholder1
audio_responsive_gp, //72-59 AudioResponsive WLEDMM netmindz ar palette - placeholder2
};
#endif

View File

@@ -294,7 +294,6 @@ void savePreset(byte index, const char* pname, JsonObject sObj)
playlistSave = true;
}
}
loadLedmap = sObj["ledmap"]; //WLEDMM: assign ledmap
}
void deletePreset(byte index) {

View File

@@ -516,17 +516,24 @@ void enumerateLedmaps() {
}
//WLEDMM netmindz ar palette
CRGB getCRGBForBand(int x, uint8_t *fftResult) {
CRGB getCRGBForBand(int x, uint8_t *fftResult, int pal) {
CRGB value;
CHSV hsv;
if(x == 0) {
value = CRGB(fftResult[10]/2, fftResult[4]/2, fftResult[0]/2);
if(pal == 71) { // bit hacky to use palette id here, but don't want to litter the code with lots of different methods. TODO: add enum for palette creation type
if(x == 0) {
value = CRGB(fftResult[10]/2, fftResult[4]/2, fftResult[0]/2);
}
else if(x == 255) {
value = CRGB(fftResult[10]/2, fftResult[0]/2, fftResult[4]/2);
}
else {
value = CRGB(fftResult[0]/2, fftResult[4]/2, fftResult[10]/2);
}
}
else if(pal == 72) {
int b = map(x, 0, 255, 0, 8); // convert palette position to lower half of freq band
hsv = CHSV(fftResult[b], 255, map(fftResult[b], 0, 255, 30, 255)); // pick hue
hsv2rgb_rainbow(hsv, value); // convert to R,G,B
}
else if(x == 255) {
value = CRGB(fftResult[10]/2, fftResult[0]/2, fftResult[4]/2);
}
else {
value = CRGB(fftResult[0]/2, fftResult[4]/2, fftResult[10]/2);
}
return value;
}

View File

@@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2211181
#define VERSION 2211201
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG