Merge branch 'Aircoookie:main' into pr_fxsegs

This commit is contained in:
mx 2022-11-26 17:15:55 +01:00 committed by GitHub
commit 5c721ee435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 1568 additions and 1342 deletions

View File

@ -399,10 +399,10 @@ build_unflags = ${common.build_unflags}
lib_deps = ${esp32c3.lib_deps} lib_deps = ${esp32c3.lib_deps}
[env:esp32s3dev_8MB] [env:esp32s3dev_8MB]
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM ;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM (flash_mode: qio)
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
platform = espressif32@5.1.1 platform = espressif32@5.1.1
platform_packages = platformio/framework-arduinoespressif32@3.20004.220825 platform_packages =
upload_speed = 921600 upload_speed = 921600
build_unflags = ${common.build_unflags} 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 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
@ -412,6 +412,26 @@ board_build.f_flash = 80000000L
board_build.flash_mode = qio board_build.flash_mode = qio
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder
[env:esp32s3dev_8MB_PSRAM]
;; ESP32-TinyS3 development board, with 8MB FLASH and 8MB PSRAM (memory_type: qio_opi, qio_qspi, or opi_opi)
;board = um_tinys3 ; -> needs workaround from https://github.com/Aircoookie/WLED/pull/2905#issuecomment-1328049860
;board = esp32s3box ; -> error: 'esp32_adc2gpio' was not declared in this scope
board = esp32-s3-devkitc-1 ; -> compiles, but does not support PSRAM
platform = espressif32 @ ~5.2.0
platform_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_MSC_ON_BOOT=0
; -D ARDUINO_USB_CDC_ON_BOOT=0
; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM
-D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used
lib_deps = ${esp32s3.lib_deps}
board_build.partitions = tools/WLED_ESP32_8MB.csv
board_build.f_flash = 80000000L
board_build.flash_mode = qio
monitor_filters = esp32_exception_decoder
[env:esp8285_4CH_MagicHome] [env:esp8285_4CH_MagicHome]
board = esp8285 board = esp8285
platform = ${common.platform_wled_default} platform = ${common.platform_wled_default}
@ -515,9 +535,12 @@ build_flags = ${common.build_flags_esp32}
-D USERMOD_DALLASTEMPERATURE -D USERMOD_DALLASTEMPERATURE
-D USERMOD_FOUR_LINE_DISPLAY -D USERMOD_FOUR_LINE_DISPLAY
-D TEMPERATURE_PIN=23 -D TEMPERATURE_PIN=23
-D USE_ALT_DISPlAY ; new versions of USERMOD_FOUR_LINE_DISPLAY and USERMOD_ROTARY_ENCODER_UI
-D USERMOD_AUDIOREACTIVE
lib_deps = ${esp32.lib_deps} lib_deps = ${esp32.lib_deps}
OneWire@~2.3.5 OneWire@~2.3.5
olikraus/U8g2 @ ^2.28.8 olikraus/U8g2 @ ^2.28.8
https://github.com/blazoncek/arduinoFFT.git
board_build.partitions = ${esp32.default_partitions} board_build.partitions = ${esp32.default_partitions}
[env:m5atom] [env:m5atom]

View File

@ -16,14 +16,15 @@ private:
// NOTE: Do not implement any compile-time variables, anything the user needs to configure // NOTE: Do not implement any compile-time variables, anything the user needs to configure
// should be configurable from the Usermod menu using the methods below // should be configurable from the Usermod menu using the methods below
// key settings set via usermod menu // key settings set via usermod menu
unsigned long TemperatureDecimals = 0; // Number of decimal places in published temperaure values uint8_t TemperatureDecimals = 0; // Number of decimal places in published temperaure values
unsigned long HumidityDecimals = 0; // Number of decimal places in published humidity values uint8_t HumidityDecimals = 0; // Number of decimal places in published humidity values
unsigned long PressureDecimals = 0; // Number of decimal places in published pressure values uint8_t PressureDecimals = 0; // Number of decimal places in published pressure values
unsigned long TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds uint16_t TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
unsigned long PressureInterval = 300; // Interval to measure pressure in seconds uint16_t PressureInterval = 300; // Interval to measure pressure in seconds
bool PublishAlways = false; // Publish values even when they have not changed bool PublishAlways = false; // Publish values even when they have not changed
bool UseCelsius = true; // Use Celsius for Reporting bool UseCelsius = true; // Use Celsius for Reporting
bool HomeAssistantDiscovery = false; // Publish Home Assistant Device Information bool HomeAssistantDiscovery = false; // Publish Home Assistant Device Information
bool enabled = true;
// set the default pins based on the architecture, these get overridden by Usermod menu settings // set the default pins based on the architecture, these get overridden by Usermod menu settings
#ifdef ESP8266 #ifdef ESP8266
@ -70,15 +71,10 @@ private:
// MQTT topic strings for publishing Home Assistant discovery topics // MQTT topic strings for publishing Home Assistant discovery topics
bool mqttInitialized = false; bool mqttInitialized = false;
String mqttTemperatureTopic = "";
String mqttHumidityTopic = "";
String mqttPressureTopic = "";
String mqttHeatIndexTopic = "";
String mqttDewPointTopic = "";
// Store packet IDs of MQTT publications // strings to reduce flash memory usage (used more than twice)
uint16_t mqttTemperaturePub = 0; static const char _name[];
uint16_t mqttPressurePub = 0; static const char _enabled[];
// Read the BME280/BMP280 Sensor (which one runs depends on whether Celsius or Farenheit being set in Usermod Menu) // Read the BME280/BMP280 Sensor (which one runs depends on whether Celsius or Farenheit being set in Usermod Menu)
void UpdateBME280Data(int SensorType) void UpdateBME280Data(int SensorType)
@ -95,7 +91,7 @@ private:
sensorTemperature = _temperature; sensorTemperature = _temperature;
sensorHumidity = _humidity; sensorHumidity = _humidity;
sensorPressure = _pressure; sensorPressure = _pressure;
tempScale = "°C"; tempScale = F("°C");
if (sensorType == 1) if (sensorType == 1)
{ {
sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit); sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit);
@ -111,7 +107,7 @@ private:
sensorTemperature = _temperature; sensorTemperature = _temperature;
sensorHumidity = _humidity; sensorHumidity = _humidity;
sensorPressure = _pressure; sensorPressure = _pressure;
tempScale = "°F"; tempScale = F("°F");
if (sensorType == 1) if (sensorType == 1)
{ {
sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit); sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit);
@ -123,18 +119,23 @@ private:
// Procedure to define all MQTT discovery Topics // Procedure to define all MQTT discovery Topics
void _mqttInitialize() void _mqttInitialize()
{ {
mqttTemperatureTopic = String(mqttDeviceTopic) + F("/temperature"); char mqttTemperatureTopic[128];
mqttPressureTopic = String(mqttDeviceTopic) + F("/pressure"); char mqttHumidityTopic[128];
mqttHumidityTopic = String(mqttDeviceTopic) + F("/humidity"); char mqttPressureTopic[128];
mqttHeatIndexTopic = String(mqttDeviceTopic) + F("/heat_index"); char mqttHeatIndexTopic[128];
mqttDewPointTopic = String(mqttDeviceTopic) + F("/dew_point"); char mqttDewPointTopic[128];
snprintf_P(mqttTemperatureTopic, 127, PSTR("%s/temperature"), mqttDeviceTopic);
snprintf_P(mqttPressureTopic, 127, PSTR("%s/pressure"), mqttDeviceTopic);
snprintf_P(mqttHumidityTopic, 127, PSTR("%s/humidity"), mqttDeviceTopic);
snprintf_P(mqttHeatIndexTopic, 127, PSTR("%s/heat_index"), mqttDeviceTopic);
snprintf_P(mqttDewPointTopic, 127, PSTR("%s/dew_point"), mqttDeviceTopic);
if (HomeAssistantDiscovery) { if (HomeAssistantDiscovery) {
_createMqttSensor(F("Temperature"), mqttTemperatureTopic, F("temperature"), tempScale); _createMqttSensor(F("Temperature"), mqttTemperatureTopic, "temperature", tempScale);
_createMqttSensor(F("Pressure"), mqttPressureTopic, F("pressure"), F("hPa")); _createMqttSensor(F("Pressure"), mqttPressureTopic, "pressure", F("hPa"));
_createMqttSensor(F("Humidity"), mqttHumidityTopic, F("humidity"), F("%")); _createMqttSensor(F("Humidity"), mqttHumidityTopic, "humidity", F("%"));
_createMqttSensor(F("HeatIndex"), mqttHeatIndexTopic, F("temperature"), tempScale); _createMqttSensor(F("HeatIndex"), mqttHeatIndexTopic, "temperature", tempScale);
_createMqttSensor(F("DewPoint"), mqttDewPointTopic, F("temperature"), tempScale); _createMqttSensor(F("DewPoint"), mqttDewPointTopic, "temperature", tempScale);
} }
} }
@ -169,6 +170,15 @@ private:
mqtt->publish(t.c_str(), 0, true, temp.c_str()); mqtt->publish(t.c_str(), 0, true, temp.c_str());
} }
void publishMqtt(const char *topic, const char* state) {
//Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED){
char subuf[128];
snprintf_P(subuf, 127, PSTR("%s/%s"), mqttDeviceTopic, topic);
mqtt->publish(subuf, 0, false, state);
}
}
public: public:
void setup() void setup()
{ {
@ -183,7 +193,7 @@ public:
if (!bme.begin()) if (!bme.begin())
{ {
sensorType = 0; sensorType = 0;
DEBUG_PRINTLN(F("Could not find BME280I2C sensor!")); DEBUG_PRINTLN(F("Could not find BME280 I2C sensor!"));
} }
else else
{ {
@ -207,14 +217,16 @@ public:
void loop() void loop()
{ {
if (!enabled || strip.isUpdating()) return;
// BME280 sensor MQTT publishing // BME280 sensor MQTT publishing
// Check if sensor present and MQTT Connected, otherwise it will crash the MCU // Check if sensor present and Connected, otherwise it will crash the MCU
if (sensorType != 0 && WLED_MQTT_CONNECTED) if (sensorType != 0)
{ {
// Timer to fetch new temperature, humidity and pressure data at intervals // Timer to fetch new temperature, humidity and pressure data at intervals
timer = millis(); timer = millis();
if (timer - lastTemperatureMeasure >= TemperatureInterval * 1000 || mqttTemperaturePub == 0) if (timer - lastTemperatureMeasure >= TemperatureInterval * 1000)
{ {
lastTemperatureMeasure = timer; lastTemperatureMeasure = timer;
@ -223,18 +235,11 @@ public:
float temperature = roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); float temperature = roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
float humidity, heatIndex, dewPoint; float humidity, heatIndex, dewPoint;
if (WLED_MQTT_CONNECTED && !mqttInitialized)
{
_mqttInitialize();
mqttInitialized = true;
}
// If temperature has changed since last measure, create string populated with device topic // If temperature has changed since last measure, create string populated with device topic
// from the UI and values read from sensor, then publish to broker // from the UI and values read from sensor, then publish to broker
if (temperature != lastTemperature || PublishAlways) if (temperature != lastTemperature || PublishAlways)
{ {
String topic = String(mqttDeviceTopic) + "/temperature"; publishMqtt("temperature", String(temperature, TemperatureDecimals).c_str());
mqttTemperaturePub = mqtt->publish(topic.c_str(), 0, false, String(temperature, TemperatureDecimals).c_str());
} }
lastTemperature = temperature; // Update last sensor temperature for next loop lastTemperature = temperature; // Update last sensor temperature for next loop
@ -247,20 +252,17 @@ public:
if (humidity != lastHumidity || PublishAlways) if (humidity != lastHumidity || PublishAlways)
{ {
String topic = String(mqttDeviceTopic) + F("/humidity"); publishMqtt("humidity", String(humidity, HumidityDecimals).c_str());
mqtt->publish(topic.c_str(), 0, false, String(humidity, HumidityDecimals).c_str());
} }
if (heatIndex != lastHeatIndex || PublishAlways) if (heatIndex != lastHeatIndex || PublishAlways)
{ {
String topic = String(mqttDeviceTopic) + F("/heat_index"); publishMqtt("heat_index", String(heatIndex, TemperatureDecimals).c_str());
mqtt->publish(topic.c_str(), 0, false, String(heatIndex, TemperatureDecimals).c_str());
} }
if (dewPoint != lastDewPoint || PublishAlways) if (dewPoint != lastDewPoint || PublishAlways)
{ {
String topic = String(mqttDeviceTopic) + F("/dew_point"); publishMqtt("dew_point", String(dewPoint, TemperatureDecimals).c_str());
mqtt->publish(topic.c_str(), 0, false, String(dewPoint, TemperatureDecimals).c_str());
} }
lastHumidity = humidity; lastHumidity = humidity;
@ -269,7 +271,7 @@ public:
} }
} }
if (timer - lastPressureMeasure >= PressureInterval * 1000 || mqttPressurePub == 0) if (timer - lastPressureMeasure >= PressureInterval * 1000)
{ {
lastPressureMeasure = timer; lastPressureMeasure = timer;
@ -277,15 +279,23 @@ public:
if (pressure != lastPressure || PublishAlways) if (pressure != lastPressure || PublishAlways)
{ {
String topic = String(mqttDeviceTopic) + F("/pressure"); publishMqtt("pressure", String(pressure, PressureDecimals).c_str());
mqttPressurePub = mqtt->publish(topic.c_str(), 0, true, String(pressure, PressureDecimals).c_str());
} }
lastPressure = pressure; lastPressure = pressure;
} }
} }
} }
void onMqttConnect(bool sessionPresent)
{
if (WLED_MQTT_CONNECTED && !mqttInitialized)
{
_mqttInitialize();
mqttInitialized = true;
}
}
/* /*
* API calls te enable data exchange between WLED modules * API calls te enable data exchange between WLED modules
*/ */
@ -294,9 +304,9 @@ public:
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} else { } else {
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32; return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
} }
} }
inline float getTemperatureF() { inline float getTemperatureF() {
if (UseCelsius) { if (UseCelsius) {
return ((float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f; return ((float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
@ -304,12 +314,15 @@ public:
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} }
} }
inline float getHumidity() { inline float getHumidity() {
return (float)roundf(sensorHumidity * powf(10, HumidityDecimals)); return (float)roundf(sensorHumidity * powf(10, HumidityDecimals));
} }
inline float getPressure() { inline float getPressure() {
return (float)roundf(sensorPressure * powf(10, PressureDecimals)); return (float)roundf(sensorPressure * powf(10, PressureDecimals));
} }
inline float getDewPointC() { inline float getDewPointC() {
if (UseCelsius) { if (UseCelsius) {
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
@ -317,6 +330,7 @@ public:
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32; return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
} }
} }
inline float getDewPointF() { inline float getDewPointF() {
if (UseCelsius) { if (UseCelsius) {
return ((float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f; return ((float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
@ -324,13 +338,16 @@ public:
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} }
} }
inline float getHeatIndexC() { inline float getHeatIndexC() {
if (UseCelsius) { if (UseCelsius) {
return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} else { } else {
return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32; return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
} }
}inline float getHeatIndexF() { }
inline float getHeatIndexF() {
if (UseCelsius) { if (UseCelsius) {
return ((float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f; return ((float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
} else { } else {
@ -384,7 +401,8 @@ public:
// Save Usermod Config Settings // Save Usermod Config Settings
void addToConfig(JsonObject& root) void addToConfig(JsonObject& root)
{ {
JsonObject top = root.createNestedObject(F("BME280/BMP280")); JsonObject top = root.createNestedObject(FPSTR(_name));
top[FPSTR(_enabled)] = enabled;
top[F("TemperatureDecimals")] = TemperatureDecimals; top[F("TemperatureDecimals")] = TemperatureDecimals;
top[F("HumidityDecimals")] = HumidityDecimals; top[F("HumidityDecimals")] = HumidityDecimals;
top[F("PressureDecimals")] = PressureDecimals; top[F("PressureDecimals")] = PressureDecimals;
@ -405,17 +423,17 @@ public:
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor // default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed) // setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed)
int8_t newPin[2]; for (byte i=0; i<2; i++) newPin[i] = ioPin[i]; // prepare to note changed pins int8_t newPin[2]; for (byte i=0; i<2; i++) newPin[i] = ioPin[i]; // prepare to note changed pins
JsonObject top = root[F("BME280/BMP280")]; JsonObject top = root[FPSTR(_name)];
if (top.isNull()) { if (top.isNull()) {
DEBUG_PRINT(F("BME280/BMP280")); DEBUG_PRINT(F(_name));
DEBUG_PRINTLN(F(": No config found. (Using defaults.)")); DEBUG_PRINTLN(F(": No config found. (Using defaults.)"));
return false; return false;
} }
bool configComplete = !top.isNull(); bool configComplete = !top.isNull();
configComplete &= getJsonValue(top[FPSTR(_enabled)], enabled);
// A 3-argument getJsonValue() assigns the 3rd argument as a default value if the Json value is missing // A 3-argument getJsonValue() assigns the 3rd argument as a default value if the Json value is missing
configComplete &= getJsonValue(top[F("TemperatureDecimals")], TemperatureDecimals, 1); configComplete &= getJsonValue(top[F("TemperatureDecimals")], TemperatureDecimals, 1);
configComplete &= getJsonValue(top[F("HumidityDecimals")], HumidityDecimals, 0); configComplete &= getJsonValue(top[F("HumidityDecimals")], HumidityDecimals, 0);
@ -427,7 +445,7 @@ public:
configComplete &= getJsonValue(top[F("HomeAssistantDiscovery")], HomeAssistantDiscovery, false); configComplete &= getJsonValue(top[F("HomeAssistantDiscovery")], HomeAssistantDiscovery, false);
for (byte i=0; i<2; i++) configComplete &= getJsonValue(top[F("pin")][i], newPin[i], ioPin[i]); for (byte i=0; i<2; i++) configComplete &= getJsonValue(top[F("pin")][i], newPin[i], ioPin[i]);
DEBUG_PRINT(FPSTR(F("BME280/BMP280"))); DEBUG_PRINT(FPSTR(_name));
if (!initDone) { if (!initDone) {
// first run: reading from cfg.json // first run: reading from cfg.json
for (byte i=0; i<2; i++) ioPin[i] = newPin[i]; for (byte i=0; i<2; i++) ioPin[i] = newPin[i];
@ -454,4 +472,7 @@ public:
uint16_t getId() { uint16_t getId() {
return USERMOD_ID_BME280; return USERMOD_ID_BME280;
} }
}; };
const char UsermodBME280::_name[] PROGMEM = "BME280/BMP280";
const char UsermodBME280::_enabled[] PROGMEM = "enabled";

View File

@ -1554,18 +1554,18 @@ class AudioReactive : public Usermod {
pinArray.add(sdaPin); pinArray.add(sdaPin);
pinArray.add(sclPin); pinArray.add(sclPin);
JsonObject cfg = top.createNestedObject("cfg"); JsonObject cfg = top.createNestedObject("config");
cfg[F("squelch")] = soundSquelch; cfg[F("squelch")] = soundSquelch;
cfg[F("gain")] = sampleGain; cfg[F("gain")] = sampleGain;
cfg[F("AGC")] = soundAgc; cfg[F("AGC")] = soundAgc;
JsonObject dynLim = top.createNestedObject("dynamics"); JsonObject dynLim = top.createNestedObject("dynamics");
dynLim[F("Limiter")] = limiterOn; dynLim[F("limiter")] = limiterOn;
dynLim[F("Rise")] = attackTime; dynLim[F("rise")] = attackTime;
dynLim[F("Fall")] = decayTime; dynLim[F("fall")] = decayTime;
JsonObject freqScale = top.createNestedObject("Frequency"); JsonObject freqScale = top.createNestedObject("frequency");
freqScale[F("Scale")] = FFTScalingMode; freqScale[F("scale")] = FFTScalingMode;
JsonObject sync = top.createNestedObject("sync"); JsonObject sync = top.createNestedObject("sync");
sync[F("port")] = audioSyncPort; sync[F("port")] = audioSyncPort;
@ -1605,15 +1605,15 @@ class AudioReactive : public Usermod {
configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][4], sdaPin); configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][4], sdaPin);
configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][5], sclPin); configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][5], sclPin);
configComplete &= getJsonValue(top["cfg"][F("squelch")], soundSquelch); configComplete &= getJsonValue(top["config"][F("squelch")], soundSquelch);
configComplete &= getJsonValue(top["cfg"][F("gain")], sampleGain); configComplete &= getJsonValue(top["config"][F("gain")], sampleGain);
configComplete &= getJsonValue(top["cfg"][F("AGC")], soundAgc); configComplete &= getJsonValue(top["config"][F("AGC")], soundAgc);
configComplete &= getJsonValue(top["dynamics"][F("Limiter")], limiterOn); configComplete &= getJsonValue(top["dynamics"][F("limiter")], limiterOn);
configComplete &= getJsonValue(top["dynamics"][F("Rise")], attackTime); configComplete &= getJsonValue(top["dynamics"][F("rise")], attackTime);
configComplete &= getJsonValue(top["dynamics"][F("Fall")], decayTime); configComplete &= getJsonValue(top["dynamics"][F("fall")], decayTime);
configComplete &= getJsonValue(top["Frequency"][F("Scale")], FFTScalingMode); configComplete &= getJsonValue(top["frequency"][F("scale")], FFTScalingMode);
configComplete &= getJsonValue(top["sync"][F("port")], audioSyncPort); configComplete &= getJsonValue(top["sync"][F("port")], audioSyncPort);
configComplete &= getJsonValue(top["sync"][F("mode")], audioSyncEnabled); configComplete &= getJsonValue(top["sync"][F("mode")], audioSyncEnabled);
@ -1635,20 +1635,20 @@ class AudioReactive : public Usermod {
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3)
oappend(SET_F("addOption(dd,'Generic I2S PDM',5);")); oappend(SET_F("addOption(dd,'Generic I2S PDM',5);"));
#endif #endif
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,'Off',0);"));
oappend(SET_F("addOption(dd,'Normal',1);")); oappend(SET_F("addOption(dd,'Normal',1);"));
oappend(SET_F("addOption(dd,'Vivid',2);")); oappend(SET_F("addOption(dd,'Vivid',2);"));
oappend(SET_F("addOption(dd,'Lazy',3);")); 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,'Off',0);"));
oappend(SET_F("addOption(dd,'On',1);")); 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: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: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: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,'None',0);"));
oappend(SET_F("addOption(dd,'Linear (Amplitude)',2);")); oappend(SET_F("addOption(dd,'Linear (Amplitude)',2);"));
oappend(SET_F("addOption(dd,'Square Root (Energy)',3);")); oappend(SET_F("addOption(dd,'Square Root (Energy)',3);"));
@ -1659,16 +1659,16 @@ class AudioReactive : public Usermod {
oappend(SET_F("addOption(dd,'Send',1);")); oappend(SET_F("addOption(dd,'Send',1);"));
oappend(SET_F("addOption(dd,'Receive',2);")); 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: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[]',0,'I2S Serial Data', '<i><span class=\"h\">sd/data/dout</span></i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',1,'I2S WS');")); 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 SCK');")); 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) #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 <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 #else
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK');")); oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'', 'I2S Master CLK');"));
#endif #endif
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'I2C SDA');")); 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[]',5,'', 'I2C SCL');"));
} }

View File

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

View File

@ -191,7 +191,7 @@ private:
re_sortModes(modes_qstrings, modes_alpha_indexes, strip.getModeCount(), MODE_SORT_SKIP_COUNT); re_sortModes(modes_qstrings, modes_alpha_indexes, strip.getModeCount(), MODE_SORT_SKIP_COUNT);
palettes_qstrings = re_findModeStrings(JSON_palette_names, strip.getPaletteCount()); palettes_qstrings = re_findModeStrings(JSON_palette_names, strip.getPaletteCount());
palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount()); palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount()); // only use internal palettes
// How many palette names start with '*' and should not be sorted? // How many palette names start with '*' and should not be sorted?
// (Also skipping the first one, 'Default'). // (Also skipping the first one, 'Default').

View File

@ -596,7 +596,7 @@ uint16_t mode_twinkle(void) {
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!;!,!;!;mp12=0,1d"; //pixels static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!;!,!;!;m12=0,1d"; //pixels
/* /*
@ -673,7 +673,7 @@ uint16_t mode_sparkle(void) {
SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0)); SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0));
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!;!,!;!;mp12=0,1d"; static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!;!,!;!;m12=0,1d";
/* /*
@ -694,7 +694,7 @@ uint16_t mode_flash_sparkle(void) {
} }
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx;!;mp12=0,1d"; static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx;!;m12=0,1d";
/* /*
@ -717,7 +717,7 @@ uint16_t mode_hyper_sparkle(void) {
} }
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx;!;mp12=0,1d"; static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx;!;m12=0,1d";
/* /*
@ -799,7 +799,7 @@ uint16_t mode_android(void) {
return 3 + ((8 * (uint32_t)(255 - SEGMENT.speed)) / SEGLEN); return 3 + ((8 * (uint32_t)(255 - SEGMENT.speed)) / SEGLEN);
} }
static const char _data_FX_MODE_ANDROID[] PROGMEM = "Android@!,Width;!,!;!;mp12=1,1d"; //vertical static const char _data_FX_MODE_ANDROID[] PROGMEM = "Android@!,Width;!,!;!;m12=1,1d"; //vertical
/* /*
@ -1146,7 +1146,7 @@ uint16_t larson_scanner(bool dual) {
uint16_t mode_larson_scanner(void){ uint16_t mode_larson_scanner(void){
return larson_scanner(false); return larson_scanner(false);
} }
static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;!,!;!;mp12=0,1d"; static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;!,!;!;m12=0,1d";
/* /*
@ -1156,7 +1156,7 @@ static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;
uint16_t mode_dual_larson_scanner(void){ uint16_t mode_dual_larson_scanner(void){
return larson_scanner(true); return larson_scanner(true);
} }
static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Fade rate;!,!;!;mp12=0,1d"; static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Fade rate;!,!;!;m12=0,1d";
/* /*
@ -1508,7 +1508,7 @@ uint16_t mode_fairytwinkle() {
} }
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_FAIRYTWINKLE[] PROGMEM = "Fairy Twinkle@;;;mp12=0,1d"; //pixels static const char _data_FX_MODE_FAIRYTWINKLE[] PROGMEM = "Fairy Twinkle@;;;m12=0,1d"; //pixels
/* /*
@ -2016,7 +2016,7 @@ uint16_t mode_fire_2012()
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_FIRE_2012[] PROGMEM = "Fire 2012@Cooling,Spark rate;1,2,3;!;sx=120,ix=64,mp12=1,1d"; //bars static const char _data_FX_MODE_FIRE_2012[] PROGMEM = "Fire 2012@Cooling,Spark rate;1,2,3;!;sx=120,ix=64,m12=1,1d"; //bars
// ColorWavesWithPalettes by Mark Kriegsman: https://gist.github.com/kriegsman/8281905786e8b2632aeb // ColorWavesWithPalettes by Mark Kriegsman: https://gist.github.com/kriegsman/8281905786e8b2632aeb
@ -2248,7 +2248,7 @@ uint16_t mode_colortwinkle()
} }
return FRAMETIME_FIXED; return FRAMETIME_FIXED;
} }
static const char _data_FX_MODE_COLORTWINKLE[] PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;mp12=0,1d"; //pixels static const char _data_FX_MODE_COLORTWINKLE[] PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;m12=0,1d"; //pixels
//Calm effect, like a lake at night //Calm effect, like a lake at night
@ -2857,7 +2857,7 @@ uint16_t mode_bouncing_balls(void) {
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_BOUNCINGBALLS[] PROGMEM = "Bouncing Balls@Gravity,# of balls;!,!,!;!;mp12=1,1d"; //bar static const char _data_FX_MODE_BOUNCINGBALLS[] PROGMEM = "Bouncing Balls@Gravity,# of balls;!,!,!;!;m12=1,1d"; //bar
/* /*
@ -2927,7 +2927,7 @@ uint16_t mode_glitter()
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@,!;!,!,!;!;mp12=0,1d"; //pixels static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@,!;!,!,!;!;m12=0,1d"; //pixels
//each needs 19 bytes //each needs 19 bytes
@ -3000,7 +3000,7 @@ uint16_t mode_popcorn(void) {
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!;!,!,!;!;mp12=1,1d"; //bar static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!;!,!,!;!;m12=1,1d"; //bar
//values close to 100 produce 5Hz flicker, which looks very candle-y //values close to 100 produce 5Hz flicker, which looks very candle-y
@ -3227,7 +3227,7 @@ uint16_t mode_starburst(void) {
return FRAMETIME; return FRAMETIME;
} }
#undef STARBURST_MAX_FRAG #undef STARBURST_MAX_FRAG
static const char _data_FX_MODE_STARBURST[] PROGMEM = "Fireworks Starburst@Chance,Fragments;,!;!;pal=11,mp12=0,1d"; static const char _data_FX_MODE_STARBURST[] PROGMEM = "Fireworks Starburst@Chance,Fragments;,!;!;pal=11,m12=0,1d";
/* /*
@ -3449,7 +3449,7 @@ uint16_t mode_drip(void)
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;mp12=1,1d"; //bar static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;m12=1,1d"; //bar
/* /*
@ -3538,7 +3538,7 @@ uint16_t mode_tetrix(void) {
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_TETRIX[] PROGMEM = "Tetrix@!,Width;!,!;!;sx=0,ix=0,pal=11,mp12=1,1d"; static const char _data_FX_MODE_TETRIX[] PROGMEM = "Tetrix@!,Width;!,!;!;sx=0,ix=0,pal=11,m12=1,1d";
/* /*
@ -3650,7 +3650,7 @@ uint16_t mode_heartbeat(void) {
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_HEARTBEAT[] PROGMEM = "Heartbeat@!,!;!,!;!;mp12=1,1d"; static const char _data_FX_MODE_HEARTBEAT[] PROGMEM = "Heartbeat@!,!;!,!;!;m12=1,1d";
// "Pacifica" // "Pacifica"
@ -3782,7 +3782,7 @@ uint16_t mode_solid_glitter()
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!;0;mp12=0,1d"; static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!;0;m12=0,1d";
/* /*
@ -3891,7 +3891,7 @@ uint16_t mode_twinkleup(void) { // A very short twinkle routine
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!;!;mp12=0,1d"; static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!;!;m12=0,1d";
// Peaceful noise that's slow and with gradually changing palettes. Does not support WLED palettes or default colours or controls. // Peaceful noise that's slow and with gradually changing palettes. Does not support WLED palettes or default colours or controls.
@ -3990,7 +3990,7 @@ uint16_t mode_flow(void)
return FRAMETIME; return FRAMETIME;
} }
static const char _data_FX_MODE_FLOW[] PROGMEM = "Flow@!,!;!,!,!;!;mp12=1,1d"; //vertical static const char _data_FX_MODE_FLOW[] PROGMEM = "Flow@!,!;!,!,!;!;m12=1,1d"; //vertical
/* /*
@ -6048,7 +6048,7 @@ uint16_t mode_ripplepeak(void) { // * Ripple peak. By Andrew Tuli
return FRAMETIME; return FRAMETIME;
} // mode_ripplepeak() } // mode_ripplepeak()
static const char _data_FX_MODE_RIPPLEPEAK[] PROGMEM = "Ripple Peak@Fade rate,Max # of ripples,Select bin,Volume (min);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixel, Beatsin static const char _data_FX_MODE_RIPPLEPEAK[] PROGMEM = "Ripple Peak@Fade rate,Max # of ripples,Select bin,Volume (min);!,!;!;c2=0,m12=0,si=0,1d,vo"; // Pixel, Beatsin
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
@ -6096,7 +6096,7 @@ uint16_t mode_2DSwirl(void) {
return FRAMETIME; return FRAMETIME;
} // mode_2DSwirl() } // mode_2DSwirl()
static const char _data_FX_MODE_2DSWIRL[] PROGMEM = "Swirl@!,Sensitivity,Blur;,Bg Swirl;!;ix=64ssim=0,2d,vo"; // Beatsin static const char _data_FX_MODE_2DSWIRL[] PROGMEM = "Swirl@!,Sensitivity,Blur;,Bg Swirl;!;ix=64si=0,2d,vo"; // Beatsin
///////////////////////// /////////////////////////
@ -6142,7 +6142,7 @@ uint16_t mode_2DWaverly(void) {
return FRAMETIME; return FRAMETIME;
} // mode_2DWaverly() } // mode_2DWaverly()
static const char _data_FX_MODE_2DWAVERLY[] PROGMEM = "Waverly@Amplification,Sensitivity;;!;ix=64,ssim=0,2d,vo"; // Beatsin static const char _data_FX_MODE_2DWAVERLY[] PROGMEM = "Waverly@Amplification,Sensitivity;;!;ix=64,si=0,2d,vo"; // Beatsin
#endif // WLED_DISABLE_2D #endif // WLED_DISABLE_2D
@ -6202,7 +6202,7 @@ uint16_t mode_gravcenter(void) { // Gravcenter. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_gravcenter() } // mode_gravcenter()
static const char _data_FX_MODE_GRAVCENTER[] PROGMEM = "Gravcenter@Rate of fall,Sensitivity;,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin static const char _data_FX_MODE_GRAVCENTER[] PROGMEM = "Gravcenter@Rate of fall,Sensitivity;,!;!;ix=128,m12=2,si=0,1d,vo"; // Circle, Beatsin
/////////////////////// ///////////////////////
@ -6253,7 +6253,7 @@ uint16_t mode_gravcentric(void) { // Gravcentric. By Andrew
return FRAMETIME; return FRAMETIME;
} // mode_gravcentric() } // mode_gravcentric()
static const char _data_FX_MODE_GRAVCENTRIC[] PROGMEM = "Gravcentric@Rate of fall,Sensitivity;!;!;ix=128,mp12=3,ssim=0,1d,vo"; // Corner, Beatsin static const char _data_FX_MODE_GRAVCENTRIC[] PROGMEM = "Gravcentric@Rate of fall,Sensitivity;!;!;ix=128,m12=3,si=0,1d,vo"; // Corner, Beatsin
/////////////////////// ///////////////////////
@ -6299,7 +6299,7 @@ uint16_t mode_gravimeter(void) { // Gravmeter. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_gravimeter() } // mode_gravimeter()
static const char _data_FX_MODE_GRAVIMETER[] PROGMEM = "Gravimeter@Rate of fall,Sensitivity;!,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin static const char _data_FX_MODE_GRAVIMETER[] PROGMEM = "Gravimeter@Rate of fall,Sensitivity;!,!;!;ix=128,m12=2,si=0,1d,vo"; // Circle, Beatsin
////////////////////// //////////////////////
@ -6322,7 +6322,7 @@ uint16_t mode_juggles(void) { // Juggles. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_juggles() } // mode_juggles()
static const char _data_FX_MODE_JUGGLES[] PROGMEM = "Juggles@!,# of balls;,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin static const char _data_FX_MODE_JUGGLES[] PROGMEM = "Juggles@!,# of balls;,!;!;m12=0,si=0,1d,vo"; // Pixels, Beatsin
////////////////////// //////////////////////
@ -6354,7 +6354,7 @@ uint16_t mode_matripix(void) { // Matripix. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_matripix() } // mode_matripix()
static const char _data_FX_MODE_MATRIPIX[] PROGMEM = "Matripix@!,Brightness;!,!;!;ix=64,mp12=2,ssim=1,1d,vo"; //,rev=1,mi=1,rY=1,mY=1 Circle, WeWillRockYou, reverseX static const char _data_FX_MODE_MATRIPIX[] PROGMEM = "Matripix@!,Brightness;!,!;!;ix=64,m12=2,si=1,1d,vo"; //,rev=1,mi=1,rY=1,mY=1 Circle, WeWillRockYou, reverseX
////////////////////// //////////////////////
@ -6389,7 +6389,7 @@ uint16_t mode_midnoise(void) { // Midnoise. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_midnoise() } // mode_midnoise()
static const char _data_FX_MODE_MIDNOISE[] PROGMEM = "Midnoise@Fade rate,Maximum length;,!;!;ix=128,mp12=1,ssim=0,1d,vo"; // Bar, Beatsin static const char _data_FX_MODE_MIDNOISE[] PROGMEM = "Midnoise@Fade rate,Maximum length;,!;!;ix=128,m12=1,si=0,1d,vo"; // Bar, Beatsin
////////////////////// //////////////////////
@ -6422,7 +6422,7 @@ uint16_t mode_noisefire(void) { // Noisefire. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_noisefire() } // mode_noisefire()
static const char _data_FX_MODE_NOISEFIRE[] PROGMEM = "Noisefire@!,!;;;mp12=2,ssim=0,1d,vo"; // Circle, Beatsin static const char _data_FX_MODE_NOISEFIRE[] PROGMEM = "Noisefire@!,!;;;m12=2,si=0,1d,vo"; // Circle, Beatsin
/////////////////////// ///////////////////////
@ -6457,7 +6457,7 @@ uint16_t mode_noisemeter(void) { // Noisemeter. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_noisemeter() } // mode_noisemeter()
static const char _data_FX_MODE_NOISEMETER[] PROGMEM = "Noisemeter@Fade rate,Width;!,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin static const char _data_FX_MODE_NOISEMETER[] PROGMEM = "Noisemeter@Fade rate,Width;!,!;!;ix=128,m12=2,si=0,1d,vo"; // Circle, Beatsin
////////////////////// //////////////////////
@ -6491,7 +6491,7 @@ uint16_t mode_pixelwave(void) { // Pixelwave. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_pixelwave() } // mode_pixelwave()
static const char _data_FX_MODE_PIXELWAVE[] PROGMEM = "Pixelwave@!,Sensitivity;!,!;!;ix=64,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin static const char _data_FX_MODE_PIXELWAVE[] PROGMEM = "Pixelwave@!,Sensitivity;!,!;!;ix=64,m12=2,si=0,1d,vo"; // Circle, Beatsin
////////////////////// //////////////////////
@ -6532,7 +6532,7 @@ uint16_t mode_plasmoid(void) { // Plasmoid. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_plasmoid() } // mode_plasmoid()
static const char _data_FX_MODE_PLASMOID[] PROGMEM = "Plasmoid@Phase,# of pixels;!,!;!;sx=128,ix=128,mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin static const char _data_FX_MODE_PLASMOID[] PROGMEM = "Plasmoid@Phase,# of pixels;!,!;!;sx=128,ix=128,m12=0,si=0,1d,vo"; // Pixels, Beatsin
/////////////////////// ///////////////////////
@ -6576,7 +6576,7 @@ uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_puddlepeak() } // mode_puddlepeak()
static const char _data_FX_MODE_PUDDLEPEAK[] PROGMEM = "Puddlepeak@Fade rate,Puddle size,Select bin,Volume (min);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin static const char _data_FX_MODE_PUDDLEPEAK[] PROGMEM = "Puddlepeak@Fade rate,Puddle size,Select bin,Volume (min);!,!;!;c2=0,m12=0,si=0,1d,vo"; // Pixels, Beatsin
////////////////////// //////////////////////
@ -6607,7 +6607,7 @@ uint16_t mode_puddles(void) { // Puddles. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_puddles() } // mode_puddles()
static const char _data_FX_MODE_PUDDLES[] PROGMEM = "Puddles@Fade rate,Puddle size;!,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin static const char _data_FX_MODE_PUDDLES[] PROGMEM = "Puddles@Fade rate,Puddle size;!,!;!;m12=0,si=0,1d,vo"; // Pixels, Beatsin
////////////////////// //////////////////////
@ -6635,7 +6635,7 @@ uint16_t mode_pixels(void) { // Pixels. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_pixels() } // mode_pixels()
static const char _data_FX_MODE_PIXELS[] PROGMEM = "Pixels@Fade rate,# of pixels;,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin static const char _data_FX_MODE_PIXELS[] PROGMEM = "Pixels@Fade rate,# of pixels;,!;!;m12=0,si=0,1d,vo"; // Pixels, Beatsin
/////////////////////////////// ///////////////////////////////
@ -6676,7 +6676,7 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_blurz() } // mode_blurz()
static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz@Fade rate,Blur amount;!,Color mix;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz@Fade rate,Blur amount;!,Color mix;!;m12=0,si=0,1d,fr"; // Pixels, Beatsin
///////////////////////// /////////////////////////
@ -6711,7 +6711,7 @@ uint16_t mode_DJLight(void) { // Written by ??? Adapted by Wil
return FRAMETIME; return FRAMETIME;
} // mode_DJLight() } // mode_DJLight()
static const char _data_FX_MODE_DJLIGHT[] PROGMEM = "DJ Light@Speed;;;mp12=2,ssim=0,1d,fr"; // Circle, Beatsin static const char _data_FX_MODE_DJLIGHT[] PROGMEM = "DJ Light@Speed;;;m12=2,si=0,1d,fr"; // Circle, Beatsin
//////////////////// ////////////////////
@ -6747,7 +6747,7 @@ uint16_t mode_freqmap(void) { // Map FFT_MajorPeak to SEGLEN.
return FRAMETIME; return FRAMETIME;
} // mode_freqmap() } // mode_freqmap()
static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting color;,!;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting color;,!;!;m12=0,si=0,1d,fr"; // Pixels, Beatsin
/////////////////////// ///////////////////////
@ -6802,7 +6802,7 @@ uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Plesch
return FRAMETIME; return FRAMETIME;
} // mode_freqmatrix() } // mode_freqmatrix()
static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;mp12=3,ssim=0,1d,fr"; // Corner, Beatsin static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;m12=3,si=0,1d,fr"; // Corner, Beatsin
////////////////////// //////////////////////
@ -6837,7 +6837,7 @@ uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_freqpixels() } // mode_freqpixels()
static const char _data_FX_MODE_FREQPIXELS[] PROGMEM = "Freqpixels@Fade rate,Starting colour and # of pixels;;;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin static const char _data_FX_MODE_FREQPIXELS[] PROGMEM = "Freqpixels@Fade rate,Starting colour and # of pixels;;;m12=0,si=0,1d,fr"; // Pixels, Beatsin
////////////////////// //////////////////////
@ -6906,7 +6906,7 @@ uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschun
return FRAMETIME; return FRAMETIME;
} // mode_freqwave() } // mode_freqwave()
static const char _data_FX_MODE_FREQWAVE[] PROGMEM = "Freqwave@Time delay,Sound effect,Low bin,High bin,Pre-amp;;;mp12=2,ssim=0,1d,fr"; // Circle, Beatsin static const char _data_FX_MODE_FREQWAVE[] PROGMEM = "Freqwave@Time delay,Sound effect,Low bin,High bin,Pre-amp;;;m12=2,si=0,1d,fr"; // Circle, Beatsin
/////////////////////// ///////////////////////
@ -6958,7 +6958,7 @@ uint16_t mode_gravfreq(void) { // Gravfreq. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_gravfreq() } // mode_gravfreq()
static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sensivity;,!;!;ix=128,mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sensivity;,!;!;ix=128,m12=0,si=0,1d,fr"; // Pixels, Beatsin
////////////////////// //////////////////////
@ -6986,7 +6986,7 @@ uint16_t mode_noisemove(void) { // Noisemove. By: Andrew Tuli
return FRAMETIME; return FRAMETIME;
} // mode_noisemove() } // mode_noisemove()
static const char _data_FX_MODE_NOISEMOVE[] PROGMEM = "Noisemove@Speed of perlin movement,Fade rate;,!;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin static const char _data_FX_MODE_NOISEMOVE[] PROGMEM = "Noisemove@Speed of perlin movement,Fade rate;,!;!;m12=0,si=0,1d,fr"; // Pixels, Beatsin
////////////////////// //////////////////////
@ -7026,7 +7026,7 @@ uint16_t mode_rocktaves(void) { // Rocktaves. Same note from eac
return FRAMETIME; return FRAMETIME;
} // mode_rocktaves() } // mode_rocktaves()
static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;,!;!;mp12=1,ssim=0,1d,fr"; // Bar, Beatsin static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;,!;!;m12=1,si=0,1d,fr"; // Bar, Beatsin
/////////////////////// ///////////////////////
@ -7078,7 +7078,7 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin
return FRAMETIME; return FRAMETIME;
} // mode_waterfall() } // mode_waterfall()
static const char _data_FX_MODE_WATERFALL[] PROGMEM = "Waterfall@!,Adjust color,Select bin,Volume (min);!,!;!;c2=0,mp12=2,ssim=0,1d,fr"; // Circles, Beatsin static const char _data_FX_MODE_WATERFALL[] PROGMEM = "Waterfall@!,Adjust color,Select bin,Volume (min);!,!;!;c2=0,m12=2,si=0,1d,fr"; // Circles, Beatsin
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
@ -7138,7 +7138,7 @@ uint16_t mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma.
return FRAMETIME; return FRAMETIME;
} // mode_2DGEQ() } // mode_2DGEQ()
static const char _data_FX_MODE_2DGEQ[] PROGMEM = "GEQ@Fade speed,Ripple decay,# of bands,,,Color bars;!,,Peak Color;!;c1=255,c2=64,pal=11,ssim=0,2d,fr"; // Beatsin static const char _data_FX_MODE_2DGEQ[] PROGMEM = "GEQ@Fade speed,Ripple decay,# of bands,,,Color bars;!,,Peak Color;!;c1=255,c2=64,pal=11,si=0,2d,fr"; // Beatsin
///////////////////////// /////////////////////////
@ -7196,7 +7196,7 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
return FRAMETIME; return FRAMETIME;
} // mode_2DFunkyPlank } // mode_2DFunkyPlank
static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;ssim=0,2d,fr"; // Beatsin static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;si=0,2d,fr"; // Beatsin
///////////////////////// /////////////////////////
@ -7299,7 +7299,7 @@ uint16_t mode_2DAkemi(void) {
return FRAMETIME; return FRAMETIME;
} // mode_2DAkemi } // mode_2DAkemi
static const char _data_FX_MODE_2DAKEMI[] PROGMEM = "Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;ssim=0,2d,fr"; //beatsin static const char _data_FX_MODE_2DAKEMI[] PROGMEM = "Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;si=0,2d,fr"; //beatsin
#endif // WLED_DISABLE_2D #endif // WLED_DISABLE_2D

View File

@ -767,7 +767,7 @@ class WS2812FX { // 96 bytes
inline uint8_t getSegmentsNum(void) { return _segments.size(); } // returns currently present segments inline uint8_t getSegmentsNum(void) { return _segments.size(); } // returns currently present segments
inline uint8_t getCurrSegmentId(void) { return _segment_index; } inline uint8_t getCurrSegmentId(void) { return _segment_index; }
inline uint8_t getMainSegmentId(void) { return _mainSegment; } inline uint8_t getMainSegmentId(void) { return _mainSegment; }
inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; } inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; } // will only return built-in palette count
inline uint8_t getTargetFps() { return _targetFps; } inline uint8_t getTargetFps() { return _targetFps; }
inline uint8_t getModeCount() { return _modeCount; } inline uint8_t getModeCount() { return _modeCount; }

View File

@ -114,10 +114,11 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(int x, int y, uint32_t col)
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
if (!isMatrix) return; // not a matrix set-up if (!isMatrix) return; // not a matrix set-up
uint16_t index = y * matrixWidth + x; uint16_t index = y * matrixWidth + x;
if (index >= customMappingSize) return; // customMappingSize is always W * H of matrix in 2D setup
#else #else
uint16_t index = x; uint16_t index = x;
#endif
if (index >= _length) return; if (index >= _length) return;
#endif
if (index < customMappingSize) index = customMappingTable[index]; if (index < customMappingSize) index = customMappingTable[index];
busses.setPixelColor(index, col); busses.setPixelColor(index, col);
} }
@ -126,10 +127,11 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(int x, int y, uint32_t col)
uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) { uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) {
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
uint16_t index = (y * matrixWidth + x); uint16_t index = (y * matrixWidth + x);
if (index >= customMappingSize) return 0; // customMappingSize is always W * H of matrix in 2D setup
#else #else
uint16_t index = x; uint16_t index = x;
#endif
if (index >= _length) return 0; if (index >= _length) return 0;
#endif
if (index < customMappingSize) index = customMappingTable[index]; if (index < customMappingSize) index = customMappingTable[index];
return busses.getPixelColor(index); return busses.getPixelColor(index);
} }

View File

@ -412,18 +412,13 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
sOpt = extractModeDefaults(fx, "c1"); if (sOpt >= 0) custom1 = sOpt; sOpt = extractModeDefaults(fx, "c1"); if (sOpt >= 0) custom1 = sOpt;
sOpt = extractModeDefaults(fx, "c2"); if (sOpt >= 0) custom2 = sOpt; sOpt = extractModeDefaults(fx, "c2"); if (sOpt >= 0) custom2 = sOpt;
sOpt = extractModeDefaults(fx, "c3"); if (sOpt >= 0) custom3 = sOpt; sOpt = extractModeDefaults(fx, "c3"); if (sOpt >= 0) custom3 = sOpt;
sOpt = extractModeDefaults(fx, "mp12"); if (sOpt >= 0) map1D2D = constrain(sOpt, 0, 7); sOpt = extractModeDefaults(fx, "m12"); if (sOpt >= 0) map1D2D = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "ssim"); if (sOpt >= 0) soundSim = constrain(sOpt, 0, 7); sOpt = extractModeDefaults(fx, "si"); if (sOpt >= 0) soundSim = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) reverse = (bool)sOpt; sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) reverse = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) mirror = (bool)sOpt; // NOTE: setting this option is a risky business sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) mirror = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) reverse_y = (bool)sOpt; sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) reverse_y = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "pal"); sOpt = extractModeDefaults(fx, "pal"); if (sOpt >= 0) setPalette(sOpt);
if (sOpt >= 0 && (size_t)sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
if (sOpt != palette) {
palette = sOpt;
}
}
} }
stateChanged = true; // send UDP/WS broadcast stateChanged = true; // send UDP/WS broadcast
} }
@ -431,13 +426,13 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
} }
void Segment::setPalette(uint8_t pal) { void Segment::setPalette(uint8_t pal) {
if (pal < strip.getPaletteCount()) { if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0; // built in palettes
if (pal != palette) { if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0; // custom palettes
if (strip.paletteFade) startTransition(strip.getTransition()); if (pal != palette) {
palette = pal; if (strip.paletteFade) startTransition(strip.getTransition());
} palette = pal;
stateChanged = true; // send UDP/WS broadcast
} }
stateChanged = true; // send UDP/WS broadcast
} }
// 2D matrix // 2D matrix

View File

@ -718,19 +718,19 @@ function populateSegments(s)
miYck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mY" onchange="setMiY(${i})" ${inst.mY?"checked":""}><span class="checkmark"></span></label>`; miYck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mY" onchange="setMiY(${i})" ${inst.mY?"checked":""}><span class="checkmark"></span></label>`;
} }
let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br> let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br>
<div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})"> <div class="sel-p"><select class="sel-p" id="seg${i}m12" onchange="setM12(${i})">
<option value="0" ${inst.mp12==0?' selected':''}>Pixels</option> <option value="0" ${inst.m12==0?' selected':''}>Pixels</option>
<option value="1" ${inst.mp12==1?' selected':''}>Bar</option> <option value="1" ${inst.m12==1?' selected':''}>Bar</option>
<option value="2" ${inst.mp12==2?' selected':''}>Arc</option> <option value="2" ${inst.m12==2?' selected':''}>Arc</option>
<option value="3" ${inst.mp12==3?' selected':''}>Corner</option> <option value="3" ${inst.m12==3?' selected':''}>Corner</option>
</select></div> </select></div>
</div>`; </div>`;
let sndSim = `<div data-snd="ssim" class="lbl-s hide">Sound sim<br> let sndSim = `<div data-snd="si" class="lbl-s hide">Sound sim<br>
<div class="sel-p"><select class="sel-p" id="seg${i}ssim" onchange="setSSim(${i})"> <div class="sel-p"><select class="sel-p" id="seg${i}si" onchange="setSi(${i})">
<option value="0" ${inst.ssim==0?' selected':''}>BeatSin</option> <option value="0" ${inst.si==0?' selected':''}>BeatSin</option>
<option value="1" ${inst.ssim==1?' selected':''}>WeWillRockYou</option> <option value="1" ${inst.si==1?' selected':''}>WeWillRockYou</option>
<option value="2" ${inst.ssim==2?' selected':''}>U10_3</option> <option value="2" ${inst.si==2?' selected':''}>U10_3</option>
<option value="3" ${inst.ssim==3?' selected':''}>U14_3</option> <option value="3" ${inst.si==3?' selected':''}>U14_3</option>
</select></div> </select></div>
</div>`; </div>`;
cn += `<div class="seg lstI ${i==s.mainseg ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}"> cn += `<div class="seg lstI ${i==s.mainseg ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}">
@ -1195,7 +1195,7 @@ function updateSelectedFx()
var selectedName = selectedEffect.querySelector(".lstIname").innerText; var selectedName = selectedEffect.querySelector(".lstIname").innerText;
var segs = gId("segcont").querySelectorAll(`div[data-map="map2D"]`); var segs = gId("segcont").querySelectorAll(`div[data-map="map2D"]`);
for (const seg of segs) if (selectedName.indexOf("\u25A6")<0) seg.classList.remove("hide"); else seg.classList.add("hide"); for (const seg of segs) if (selectedName.indexOf("\u25A6")<0) seg.classList.remove("hide"); else seg.classList.add("hide");
var segs = gId("segcont").querySelectorAll(`div[data-snd="ssim"]`); var segs = gId("segcont").querySelectorAll(`div[data-snd="si"]`);
for (const seg of segs) if (selectedName.indexOf("\u266A")<0 && selectedName.indexOf("\266B")<0) seg.classList.add("hide"); else seg.classList.remove("hide"); // also "♫ "? for (const seg of segs) if (selectedName.indexOf("\u266A")<0 && selectedName.indexOf("\266B")<0) seg.classList.add("hide"); else seg.classList.remove("hide"); // also "♫ "?
} }
} }
@ -1535,8 +1535,8 @@ function requestJson(command=null)
if (json.info) { if (json.info) {
let i = json.info; let i = json.info;
// append custom palettes (when loading for the 1st time) // append custom palettes (when loading for the 1st time)
if (!command && isEmpty(lastinfo) && i.leds && i.leds.cpal) { if (!command && isEmpty(lastinfo) && i.cpalcount) {
for (let j = 0; j<i.leds.cpal; j++) { for (let j = 0; j<i.cpalcount; j++) {
let div = d.createElement("div"); let div = d.createElement("div");
gId('pallist').appendChild(div); gId('pallist').appendChild(div);
div.outerHTML = generateListItemHtml( div.outerHTML = generateListItemHtml(
@ -2073,17 +2073,17 @@ function setMiY(s)
requestJson(obj); requestJson(obj);
} }
function setMp12(s) function setM12(s)
{ {
var value = gId(`seg${s}mp12`).selectedIndex; var value = gId(`seg${s}m12`).selectedIndex;
var obj = {"seg": {"id": s, "mp12": value}}; var obj = {"seg": {"id": s, "m12": value}};
requestJson(obj); requestJson(obj);
} }
function setSSim(s) function setSi(s)
{ {
var value = gId(`seg${s}ssim`).selectedIndex; var value = gId(`seg${s}si`).selectedIndex;
var obj = {"seg": {"id": s, "ssim": value}}; var obj = {"seg": {"id": s, "si": value}};
requestJson(obj); requestJson(obj);
} }
@ -2238,7 +2238,7 @@ function saveP(i,pl)
obj.ib = gId(`p${i}ibtgl`).checked; obj.ib = gId(`p${i}ibtgl`).checked;
obj.sb = gId(`p${i}sbtgl`).checked; obj.sb = gId(`p${i}sbtgl`).checked;
obj.sc = gId(`p${i}sbchk`).checked; obj.sc = gId(`p${i}sbchk`).checked;
if (gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value); if (gId(`p${i}lmp`) && gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value);
} }
} }

View File

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

View File

@ -6,18 +6,111 @@
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<title>WiFi Settings</title> <title>WiFi Settings</title>
<script> <script>
var d=document; var d = document;
var loc = false, locip; var loc = false, locip;
var scanLoops = 0, preScanSSID = "";
function gId(e) { return d.getElementById(e); }
function cE(e) { return d.createElement(e); }
function H(){window.open("https://kno.wled.ge/features/settings/#wifi-settings");} function H(){window.open("https://kno.wled.ge/features/settings/#wifi-settings");}
function B(){window.open("/settings","_self");} function B(){window.open("/settings","_self");}
function N() {
const url = (loc?`http://${locip}`:"") + "/json/net";
const button = gId("scan");
button.disabled = true;
button.innerHTML = "Scanning...";
fetch(url).then((response) => {
return response.json();
}).then((json) => {
// Get the list of networks only, defaulting to an empty array.
return Object.assign(
{},
{"networks": []},
json,
).networks.sort(
// Sort by signal strength, descending.
(a, b) => b.rssi - a.rssi
).reduce(
// Filter out duplicate SSIDs. Since it is sorted by signal
// strength, the strongest signal will be kept in the
// order it orginally appeared in the array.
(unique, other) => {
if(!unique.some(obj => obj.ssid === other.ssid)) {
unique.push(other);
}
return unique;
},
[],
);
}).then((networks) => {
// If there are no networks, fetch it again in a second.
// but only do this a few times.
if (networks.length === 0 && scanLoops < 10) {
scanLoops++;
setTimeout(N, 1000);
return;
}
scanLoops = 0;
let cs = gId("CS");
if (cs) {
let select = cE("select");
select.setAttribute("id", "CS");
select.setAttribute("name", "CS");
select.setAttribute("onchange", "T()");
preScanSSID = cs.value;
for (let i = 0; i < select.children.length; i++) {
select.removeChild(select.children[i]);
}
for (let i = 0; i < networks.length; i++) {
const option = cE("option");
option.setAttribute("value", networks[i].ssid);
option.innerHTML = `${networks[i].ssid} (${networks[i].rssi} dBm)`;
if (networks[i].ssid === cs.value) {
option.setAttribute("selected", "selected");
}
select.appendChild(option);
}
const option = cE("option");
option.setAttribute("value", "!Cs");
option.innerHTML = `Other network...`;
select.appendChild(option);
cs.replaceWith(select);
}
button.disabled = false;
button.innerHTML = "Scan";
});
}
// replace WiFi select with custom SSID input field again
function T() {
let cs = gId("CS");
if (!cs || cs.value != "!Cs") return;
let input = cE("input");
input.type = "text";
input.id = "CS";
input.name ="CS";
input.setAttribute("maxlength",32);
input.value = preScanSSID;
cs.replaceWith(input);
}
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
function loadJS(FILE_URL, async = true) { function loadJS(FILE_URL, async = true) {
let scE = d.createElement("script"); let scE = cE("script");
scE.setAttribute("src", FILE_URL); scE.setAttribute("src", FILE_URL);
scE.setAttribute("type", "text/javascript"); scE.setAttribute("type", "text/javascript");
scE.setAttribute("async", async); scE.setAttribute("async", async);
d.body.appendChild(scE); d.body.appendChild(scE);
// success event // success event
scE.addEventListener("load", () => { scE.addEventListener("load", () => {
//console.log("File loaded"); //console.log("File loaded");
GetV(); GetV();
@ -31,13 +124,13 @@
function S() { function S() {
if (window.location.protocol == "file:") { if (window.location.protocol == "file:") {
loc = true; loc = true;
locip = localStorage.getItem('locIp'); locip = localStorage.getItem("locIp");
if (!locip) { if (!locip) {
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem("locIp", locip);
} }
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=1'; let url = (loc?`http://${locip}`:'') + '/settings/s.js?p=1';
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed
} }
</script> </script>
@ -51,7 +144,9 @@
</div> </div>
<h2>WiFi setup</h2> <h2>WiFi setup</h2>
<h3>Connect to existing network</h3> <h3>Connect to existing network</h3>
Network name (SSID, empty to not connect): <br><input type="text" name="CS" maxlength="32"><br> <button type="button" id="scan" onclick="N()">Scan</button><br>
Network name (SSID, empty to not connect):<br>
<input type="text" id="CS" name="CS" maxlength="32"><br>
Network password: <br> <input type="password" name="CP" maxlength="63"><br> Network password: <br> <input type="password" name="CP" maxlength="63"><br>
Static IP (leave at 0.0.0.0 for DHCP):<br> Static IP (leave at 0.0.0.0 for DHCP):<br>
<input name="I0" type="number" class="s" min="0" max="255" required> . <input name="I0" type="number" class="s" min="0" max="255" required> .
@ -68,7 +163,7 @@
<input name="S1" type="number" class="s" min="0" max="255" required> . <input name="S1" type="number" class="s" min="0" max="255" required> .
<input name="S2" type="number" class="s" min="0" max="255" required> . <input name="S2" type="number" class="s" min="0" max="255" required> .
<input name="S3" type="number" class="s" min="0" max="255" required><br> <input name="S3" type="number" class="s" min="0" max="255" required><br>
mDNS address (leave empty for no mDNS):<br/> mDNS address (leave empty for no mDNS):<br>
http:// <input type="text" name="CM" maxlength="32"> .local<br> http:// <input type="text" name="CM" maxlength="32"> .local<br>
Client IP: <span class="sip"> Not connected </span> <br> Client IP: <span class="sip"> Not connected </span> <br>
<h3>Configure Access Point</h3> <h3>Configure Access Point</h3>
@ -105,4 +200,4 @@
<button type="button" onclick="B()">Back</button><button type="submit">Save & Connect</button> <button type="button" onclick="B()">Back</button><button type="submit">Save & Connect</button>
</form> </form>
</body> </body>
</html> </html>

View File

@ -41,6 +41,9 @@ button.sml {
min-width: 40px; min-width: 40px;
margin: 0 0 0 10px; margin: 0 0 0 10px;
} }
#scan {
margin-top: -10px;
}
.toprow { .toprow {
top: 0; top: 0;
position: sticky; position: sticky;

View File

@ -6,68 +6,68 @@
*/ */
// Autogenerated from wled00/data/style.css, do not edit!! // Autogenerated from wled00/data/style.css, do not edit!!
const uint16_t PAGE_settingsCss_length = 836; const uint16_t PAGE_settingsCss_length = 847;
const uint8_t PAGE_settingsCss[] PROGMEM = { const uint8_t PAGE_settingsCss[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x55, 0xc1, 0x8e, 0x9b, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x55, 0xc1, 0x8e, 0x9b, 0x30,
0x14, 0xfc, 0x15, 0xaa, 0x68, 0xa5, 0xad, 0x14, 0x10, 0x10, 0xc8, 0xa6, 0x46, 0x95, 0xaa, 0xde, 0x10, 0xfd, 0x15, 0xaa, 0x68, 0xa5, 0xad, 0x14, 0x10, 0x10, 0xc8, 0xa6, 0x46, 0x95, 0xaa, 0xde,
0x7b, 0xab, 0xaa, 0x4a, 0xd5, 0x1e, 0x0c, 0x7e, 0x04, 0x2b, 0xc6, 0x46, 0xb6, 0xe9, 0x92, 0x22, 0x7b, 0xab, 0xaa, 0x4a, 0xd5, 0x1e, 0x0c, 0x1e, 0x82, 0x15, 0x63, 0x23, 0xdb, 0x74, 0x49, 0x11,
0xfe, 0xbd, 0xb6, 0x81, 0x85, 0x64, 0xd1, 0xf6, 0x52, 0x45, 0x89, 0x92, 0x3c, 0x63, 0xcf, 0xcc, 0xff, 0x5e, 0xdb, 0xc0, 0x42, 0xb2, 0x68, 0x7b, 0xa9, 0xa2, 0x44, 0xc4, 0x63, 0xc6, 0x6f, 0xde,
0x9b, 0x37, 0xae, 0x74, 0xcd, 0x7a, 0x2d, 0xda, 0xa2, 0xf2, 0x71, 0xa1, 0xa9, 0xe0, 0xa8, 0xc6, 0xbc, 0x79, 0xae, 0x74, 0xcd, 0x7a, 0x2d, 0xda, 0xa2, 0xf2, 0x71, 0xa1, 0xa9, 0xe0, 0xa8, 0xc6,
0x9c, 0x36, 0x2d, 0xc3, 0xf6, 0xc7, 0x90, 0x0b, 0x72, 0xed, 0x4b, 0xc1, 0xb5, 0x5f, 0xe2, 0x9a, 0x9c, 0x36, 0x2d, 0xc3, 0xf6, 0xcf, 0x90, 0x0b, 0x72, 0xed, 0x4b, 0xc1, 0xb5, 0x5f, 0xe2, 0x9a,
0xb2, 0x2b, 0xfa, 0x01, 0x92, 0x60, 0x8e, 0xf7, 0x0a, 0x73, 0xe5, 0x2b, 0x90, 0xb4, 0xcc, 0x5c, 0xb2, 0x2b, 0xfa, 0x01, 0x92, 0x60, 0x8e, 0xf7, 0x0a, 0x73, 0xe5, 0x2b, 0x90, 0xb4, 0xcc, 0x5c,
0x59, 0xd1, 0x3f, 0x80, 0x22, 0x09, 0x75, 0xa6, 0xa1, 0xd3, 0x3e, 0x66, 0xf4, 0xcc, 0x51, 0x01, 0x58, 0xd1, 0x3f, 0x80, 0x22, 0x09, 0x75, 0xa6, 0xa1, 0xd3, 0x3e, 0x66, 0xf4, 0xcc, 0x51, 0x01,
0x5c, 0x83, 0xcc, 0x72, 0x5c, 0x5c, 0xce, 0x52, 0xb4, 0x9c, 0xa0, 0x5d, 0x1c, 0xc7, 0x59, 0x21, 0x5c, 0x83, 0xcc, 0x72, 0x5c, 0x5c, 0xce, 0x52, 0xb4, 0x9c, 0xa0, 0x5d, 0x1c, 0xc7, 0x59, 0x21,
0x98, 0x90, 0x68, 0x57, 0x96, 0x65, 0xc6, 0x28, 0x07, 0xbf, 0x02, 0x7a, 0xae, 0x34, 0x8a, 0xc3, 0x98, 0x90, 0x68, 0x57, 0x96, 0x65, 0xc6, 0x28, 0x07, 0xbf, 0x02, 0x7a, 0xae, 0x34, 0x8a, 0xc3,
0xf0, 0x21, 0xab, 0xb1, 0x3c, 0x53, 0x8e, 0xc2, 0xa1, 0x92, 0x7d, 0x2e, 0x24, 0x01, 0xe9, 0x4f, 0xf0, 0x21, 0xab, 0xb1, 0x3c, 0x53, 0x8e, 0xc2, 0xa1, 0x92, 0x7d, 0x2e, 0x24, 0x01, 0xe9, 0x4f,
0xcb, 0x8f, 0xc7, 0xa3, 0xf9, 0x33, 0x50, 0x06, 0xef, 0x0b, 0x25, 0xba, 0x42, 0xf1, 0x31, 0x6c, 0xdb, 0x8f, 0xc7, 0xa3, 0x59, 0x0c, 0x94, 0xc1, 0xfb, 0x42, 0x89, 0xae, 0x50, 0x7c, 0x0c, 0x9b,
0xba, 0x01, 0xef, 0x31, 0xaa, 0xc4, 0x6f, 0x90, 0xfd, 0xb4, 0x2e, 0x3e, 0x95, 0x23, 0x06, 0x02, 0x6e, 0xc0, 0x7b, 0x8c, 0x2a, 0xf1, 0x1b, 0x64, 0x3f, 0xed, 0x8b, 0x4f, 0xe5, 0x88, 0x81, 0x40,
0x85, 0x90, 0x8e, 0x06, 0xe2, 0x82, 0xc3, 0x10, 0xe4, 0x9a, 0xef, 0xf3, 0x56, 0x6b, 0xc1, 0xfb, 0x21, 0xa4, 0x2b, 0x03, 0x71, 0xc1, 0x61, 0x08, 0x72, 0xcd, 0xf7, 0x79, 0xab, 0xb5, 0xe0, 0xfd,
0x35, 0xa4, 0xc3, 0xe1, 0xb0, 0x86, 0xf4, 0x0f, 0xb6, 0x23, 0x28, 0x14, 0x1c, 0x8a, 0xca, 0x53, 0x1a, 0xd2, 0xe1, 0x70, 0x58, 0x43, 0xfa, 0x47, 0xb5, 0x23, 0x28, 0x14, 0x1c, 0x8a, 0xca, 0x53,
0x82, 0x51, 0xe2, 0xb9, 0x0d, 0x26, 0xac, 0x12, 0x13, 0xda, 0x2a, 0x14, 0x27, 0x4d, 0x97, 0x11, 0x82, 0x51, 0xe2, 0xb9, 0x04, 0x13, 0x56, 0x89, 0x09, 0x6d, 0x15, 0x8a, 0x93, 0xa6, 0xcb, 0x08,
0xaa, 0x1a, 0x86, 0xaf, 0x88, 0x72, 0xc7, 0x32, 0x67, 0xa2, 0xb8, 0xac, 0xc4, 0x8a, 0x0d, 0xfa, 0x55, 0x0d, 0xc3, 0x57, 0x44, 0xb9, 0xab, 0x32, 0x67, 0xa2, 0xb8, 0xac, 0xc8, 0x8a, 0x0d, 0xfa,
0x99, 0x6e, 0x14, 0x37, 0x9d, 0x77, 0x1a, 0xdf, 0x59, 0x83, 0x09, 0xa1, 0xfc, 0x8c, 0xec, 0x6f, 0xb9, 0xdc, 0x28, 0x6e, 0x3a, 0xef, 0x34, 0x7e, 0xb3, 0x06, 0x13, 0x42, 0xf9, 0x19, 0xd9, 0xff,
0x5b, 0xc8, 0x6a, 0xca, 0xfd, 0x91, 0x72, 0x62, 0xeb, 0x45, 0x2b, 0x95, 0x01, 0xdb, 0x08, 0xea, 0x36, 0x90, 0xd5, 0x94, 0xfb, 0x63, 0xc9, 0x89, 0x8d, 0x17, 0xad, 0x54, 0x06, 0x6c, 0x23, 0xa8,
0xd4, 0xdd, 0xe4, 0x3a, 0xd2, 0x74, 0x62, 0xad, 0xb6, 0xbb, 0x47, 0x69, 0x11, 0xac, 0xba, 0x97, 0x63, 0x77, 0xb3, 0xd6, 0xb1, 0x4c, 0x47, 0xd6, 0x2a, 0xdd, 0x3d, 0x4a, 0x8b, 0x60, 0xd5, 0xbd,
0xde, 0x9e, 0xb5, 0xc2, 0x17, 0x7a, 0xf6, 0x15, 0x59, 0xbd, 0x03, 0x2d, 0x1a, 0x29, 0x5e, 0x8c, 0xf4, 0xf6, 0xac, 0x15, 0xbe, 0xd0, 0xb3, 0x9f, 0xc8, 0xf2, 0xbd, 0x53, 0x05, 0xe6, 0xfd, 0xb8,
0x67, 0x1a, 0x14, 0x66, 0x8d, 0x50, 0xd4, 0x9d, 0xaa, 0x34, 0x2d, 0x2e, 0xd7, 0x55, 0xab, 0xe7, 0xee, 0x6b, 0xd1, 0x20, 0xdf, 0x2d, 0x07, 0xe6, 0x51, 0x8a, 0x97, 0xde, 0xae, 0x84, 0x59, 0x23,
0xb6, 0xd9, 0x86, 0xff, 0xf1, 0x29, 0x27, 0xd0, 0xa1, 0x68, 0x08, 0x18, 0xbf, 0x4c, 0x7d, 0x35, 0x14, 0x75, 0x60, 0x94, 0xa6, 0xc5, 0xe5, 0xba, 0x52, 0xc0, 0xdc, 0x4d, 0xab, 0x83, 0x3f, 0x3e,
0x3d, 0x0e, 0x2a, 0x60, 0xcd, 0xd7, 0x7e, 0xe5, 0x18, 0x06, 0xa5, 0x5e, 0x36, 0xc5, 0xb9, 0x51, 0xe5, 0x04, 0x3a, 0x14, 0x0d, 0x01, 0xe3, 0x97, 0xa9, 0xdd, 0xa6, 0xf5, 0x41, 0x05, 0xac, 0xf9,
0xb8, 0xd5, 0x90, 0x8d, 0x88, 0x5c, 0xbf, 0x83, 0x8a, 0x12, 0xe8, 0x67, 0x6d, 0x1d, 0x59, 0xca, 0xda, 0xaf, 0x84, 0xc4, 0xa0, 0xd4, 0x4b, 0x52, 0x9c, 0x1b, 0xe2, 0x5b, 0x0d, 0xd9, 0x08, 0xd4,
0x9b, 0x56, 0xff, 0x87, 0x96, 0xa6, 0x37, 0x2d, 0x1d, 0xb7, 0x45, 0xe6, 0x24, 0x9c, 0x33, 0x20, 0xc9, 0x20, 0xa8, 0x28, 0x81, 0x7e, 0xa6, 0xdc, 0x71, 0x40, 0x79, 0xd3, 0xea, 0xff, 0xd0, 0xe9,
0xb3, 0xbd, 0x4e, 0xa7, 0xd3, 0x58, 0xf9, 0xa5, 0xaf, 0x0d, 0x7c, 0xe6, 0x6d, 0x9d, 0x83, 0x7c, 0xf4, 0xa6, 0xd3, 0x63, 0x5a, 0x64, 0x4e, 0xc2, 0x39, 0x03, 0x32, 0xab, 0xee, 0x74, 0x3a, 0x8d,
0xde, 0xaf, 0xfe, 0xb2, 0x74, 0x9e, 0xf7, 0x0a, 0x18, 0x14, 0xba, 0x5f, 0xe4, 0xad, 0xc1, 0x88, 0x91, 0x5f, 0xfa, 0xda, 0xc0, 0x67, 0xde, 0xd6, 0x39, 0xc8, 0xe7, 0xfd, 0x6a, 0xc9, 0x96, 0xf3,
0x5e, 0xcf, 0x8a, 0x9a, 0xbe, 0x6e, 0x6c, 0x33, 0x39, 0x3b, 0x81, 0x7a, 0xa3, 0x18, 0x74, 0xdd, 0xbc, 0x57, 0xc0, 0xa0, 0xd0, 0xfd, 0xc2, 0x7a, 0x0d, 0xa6, 0x17, 0xf5, 0x4c, 0xb4, 0x69, 0xf7,
0x6c, 0xfd, 0x28, 0x0c, 0x37, 0x9f, 0x0f, 0x5e, 0x57, 0x9c, 0xd2, 0xed, 0x05, 0x73, 0xfd, 0x98, 0x46, 0x9a, 0x49, 0xf0, 0x09, 0xd4, 0x1b, 0xc1, 0xa0, 0xeb, 0xe6, 0x89, 0x88, 0xc2, 0x70, 0xf3,
0x6c, 0xd7, 0xeb, 0xa9, 0x9e, 0x1e, 0xb7, 0xeb, 0xaa, 0x5f, 0x9c, 0xb8, 0x09, 0xe0, 0x75, 0xc1, 0xfd, 0xe0, 0x75, 0xc7, 0x29, 0xdd, 0xde, 0x30, 0xc7, 0x8f, 0xc9, 0x76, 0xbc, 0x9e, 0xe2, 0xe9,
0x1d, 0xc2, 0xa2, 0x82, 0xe2, 0x92, 0x8b, 0xee, 0xb9, 0xd7, 0xd2, 0x48, 0x5f, 0x0a, 0x59, 0x23, 0x71, 0x3b, 0xae, 0xfa, 0x45, 0xa0, 0x9b, 0x00, 0x5e, 0x37, 0xdc, 0x21, 0x2c, 0x2a, 0x28, 0x2e,
0x55, 0x60, 0x06, 0x8f, 0x51, 0x90, 0x7e, 0x9c, 0x64, 0xf1, 0xa5, 0x4b, 0x02, 0x67, 0x34, 0x4d, 0xb9, 0xe8, 0x9e, 0x7b, 0x2d, 0x0d, 0xf5, 0xa5, 0x90, 0x35, 0x32, 0x0a, 0x63, 0xf0, 0x18, 0x05,
0xbc, 0xcd, 0xc7, 0x6f, 0x56, 0x4a, 0x30, 0x93, 0xaf, 0xd7, 0xe7, 0x94, 0x94, 0xc1, 0xf3, 0x4a, 0xe9, 0xc7, 0x89, 0x16, 0x5f, 0x3a, 0x83, 0x70, 0x42, 0xd3, 0xc4, 0xdb, 0x7c, 0xfd, 0x66, 0xa7,
0xf6, 0xc8, 0x12, 0x99, 0x9a, 0xb1, 0x68, 0x9f, 0xfd, 0x77, 0xb7, 0x68, 0xd9, 0xaf, 0xc3, 0xcc, 0x04, 0x63, 0x08, 0x7a, 0x7d, 0x4e, 0x49, 0x19, 0x3c, 0xaf, 0x68, 0x8f, 0x6c, 0x21, 0x53, 0x33,
0x74, 0xe8, 0xc1, 0x50, 0x78, 0x9d, 0x3e, 0xdb, 0xef, 0x80, 0xa4, 0xb3, 0x38, 0x26, 0x28, 0x3f, 0x16, 0xee, 0xb3, 0xff, 0xae, 0x16, 0x2d, 0xfb, 0xb5, 0xc7, 0x99, 0x0e, 0x3d, 0x98, 0x12, 0x5e,
0xd0, 0xba, 0x11, 0x52, 0x63, 0xae, 0x87, 0xc0, 0xe8, 0xb0, 0x86, 0x1c, 0xa4, 0x36, 0x48, 0x6f, 0x87, 0xd2, 0xf6, 0x3b, 0x20, 0xe9, 0x4c, 0x8e, 0xf1, 0xcf, 0x0f, 0xb4, 0x6e, 0x84, 0xd4, 0x98,
0xe7, 0x7c, 0xd8, 0x7d, 0xff, 0xf6, 0xdd, 0xd3, 0xd6, 0x8b, 0x8b, 0x09, 0x1e, 0x86, 0x5d, 0xad, 0xeb, 0x21, 0x30, 0x3c, 0xac, 0x21, 0x07, 0xa9, 0xf5, 0xd7, 0xdb, 0xf1, 0x1f, 0x76, 0xdf, 0xbf,
0xce, 0xb7, 0xd3, 0xb0, 0xd3, 0x02, 0x2b, 0xdd, 0x8b, 0x06, 0x17, 0x54, 0x5f, 0xcd, 0x8c, 0xbe, 0x7d, 0xf7, 0xb4, 0xd5, 0xe2, 0x22, 0x82, 0x87, 0x61, 0x57, 0xab, 0xf3, 0xed, 0x34, 0xec, 0xb4,
0x9d, 0xc9, 0x24, 0x49, 0xee, 0xa2, 0x20, 0x75, 0xe1, 0x60, 0x32, 0xa3, 0x76, 0xce, 0x78, 0x23, 0xc0, 0x4a, 0xf7, 0xa2, 0xc1, 0x05, 0xd5, 0x57, 0x33, 0xa3, 0x6f, 0x67, 0x32, 0x49, 0x92, 0x3b,
0xc7, 0x88, 0xeb, 0x69, 0x95, 0x4e, 0x56, 0xd7, 0x6c, 0xc2, 0xe6, 0x9b, 0x2e, 0x70, 0xad, 0xdc, 0x87, 0x48, 0x9d, 0x67, 0x18, 0x2b, 0xa9, 0x9d, 0x32, 0xde, 0xd0, 0x31, 0xe2, 0x7a, 0x5a, 0x99,
0xf9, 0xcb, 0xf4, 0x96, 0xb4, 0x03, 0xb2, 0x71, 0x1d, 0xcc, 0x69, 0x90, 0x66, 0x8b, 0x13, 0xdc, 0x96, 0xe5, 0x35, 0x9b, 0xb0, 0xf9, 0xa6, 0x0b, 0x5c, 0x2b, 0x77, 0xfe, 0x32, 0xbd, 0x25, 0xed,
0x37, 0x73, 0xe7, 0xc0, 0xcf, 0x47, 0x3f, 0x0d, 0x1f, 0xac, 0x1f, 0xba, 0x29, 0x87, 0x3e, 0x99, 0x80, 0x6c, 0xdc, 0x12, 0xb3, 0x1b, 0xa4, 0xd9, 0xa2, 0x04, 0xf7, 0x64, 0xae, 0x22, 0xf8, 0xf9,
0x5b, 0xc1, 0xc6, 0x02, 0x4a, 0x2d, 0x5d, 0x47, 0x2e, 0x50, 0x95, 0x49, 0xa0, 0x99, 0x61, 0xb4, 0xe8, 0xa7, 0xe1, 0x83, 0xd5, 0x43, 0x37, 0xd9, 0xd3, 0x27, 0x73, 0x59, 0x58, 0x5b, 0x40, 0xa9,
0x95, 0x3a, 0xc7, 0x24, 0x33, 0xf7, 0x58, 0x3d, 0x46, 0x62, 0x89, 0x09, 0x50, 0xee, 0x05, 0xa9, 0x2d, 0xd7, 0x15, 0x17, 0xa8, 0xca, 0x38, 0xd0, 0x5c, 0x61, 0xb4, 0xe5, 0x3a, 0xc7, 0x24, 0x33,
0xda, 0x2f, 0x5f, 0xbd, 0xd8, 0x7e, 0x38, 0x03, 0xa9, 0x59, 0xb5, 0x00, 0xa4, 0x14, 0xf2, 0xdd, 0xd7, 0x5b, 0x3d, 0x3a, 0x65, 0x89, 0x09, 0x50, 0xee, 0x05, 0xa9, 0xda, 0x2f, 0x8f, 0x5e, 0x6c,
0x9d, 0xf3, 0x38, 0xda, 0xdc, 0x79, 0xf8, 0x62, 0x07, 0x1c, 0x7b, 0xaa, 0x90, 0x00, 0xdc, 0xc3, 0x7f, 0x9c, 0x80, 0xd4, 0xcc, 0x5a, 0x00, 0x52, 0x0a, 0xf9, 0x6e, 0xe6, 0x3c, 0x8e, 0x36, 0x33,
0x9c, 0x78, 0x8f, 0x0b, 0x89, 0xa7, 0xa3, 0xd1, 0xee, 0x63, 0xbf, 0xf2, 0x29, 0xd4, 0x98, 0xb2, 0x0f, 0x5f, 0xec, 0x80, 0x63, 0x4f, 0x15, 0x12, 0x80, 0x7b, 0x98, 0x13, 0xef, 0x71, 0x29, 0xe2,
0x9b, 0xdc, 0x70, 0xce, 0xdd, 0xbf, 0x9f, 0x2d, 0x0d, 0x56, 0xea, 0xc5, 0x74, 0xee, 0x2e, 0x70, 0xe9, 0x68, 0xb8, 0xfb, 0xd8, 0xaf, 0x74, 0x0a, 0x35, 0xa6, 0xec, 0xc6, 0x37, 0x9c, 0x72, 0xf7,
0xd8, 0xdb, 0x00, 0xba, 0x1f, 0x81, 0xf7, 0xf1, 0x25, 0xa7, 0xf0, 0x0e, 0xdf, 0x9b, 0x81, 0x0f, 0xef, 0x7b, 0x4b, 0x83, 0x95, 0x7a, 0x31, 0x9d, 0xbb, 0x33, 0x1c, 0xf6, 0xd6, 0x80, 0xee, 0x47,
0xff, 0x31, 0xf0, 0x87, 0xbb, 0x48, 0x1b, 0x07, 0x71, 0xba, 0xaa, 0xed, 0x85, 0x38, 0xec, 0xcc, 0xe0, 0x7d, 0x7c, 0xc9, 0x29, 0xbc, 0xc3, 0xf7, 0x66, 0xe0, 0xc3, 0x7f, 0x0c, 0xfc, 0xe1, 0xce,
0x05, 0xac, 0xbc, 0x69, 0x16, 0x27, 0x0f, 0x27, 0xb6, 0x30, 0xfc, 0x05, 0x5d, 0xc6, 0x4e, 0xd9, 0xd2, 0xc6, 0x41, 0x9c, 0x6e, 0x70, 0x7b, 0x4f, 0x0e, 0x3b, 0x73, 0x2f, 0x2b, 0x6f, 0x9a, 0xc5,
0x86, 0x08, 0x00, 0x00 0x49, 0xc3, 0x89, 0x0d, 0x0c, 0x7f, 0x01, 0xbc, 0xb1, 0xff, 0x31, 0x9d, 0x08, 0x00, 0x00
}; };
// Autogenerated from wled00/data/settings.htm, do not edit!! // Autogenerated from wled00/data/settings.htm, do not edit!!
const uint16_t PAGE_settings_length = 985; const uint16_t PAGE_settings_length = 985;
const uint8_t PAGE_settings[] PROGMEM = { const uint8_t PAGE_settings[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0xfe, 0xee, 0x5f, 0xc1, 0xb0, 0x58, 0x23, 0xa1, 0xb2, 0xec, 0x38, 0xc3, 0xb0, 0xc9, 0x96, 0x10, 0xfe, 0xee, 0x5f, 0xc1, 0xb0, 0x58, 0x23, 0xa1, 0xb2, 0xec, 0x38, 0xc3, 0xb0, 0xc9, 0x96,
0x8b, 0x35, 0x2f, 0x9d, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc, 0x8b, 0x35, 0x2f, 0x9d, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc,
0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x36, 0xd8, 0x8a, 0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x36, 0xd8, 0x8a,
@ -133,113 +133,147 @@ const uint8_t PAGE_settings[] PROGMEM = {
// Autogenerated from wled00/data/settings_wifi.htm, do not edit!! // Autogenerated from wled00/data/settings_wifi.htm, do not edit!!
const uint16_t PAGE_settings_wifi_length = 1563; const uint16_t PAGE_settings_wifi_length = 2098;
const uint8_t PAGE_settings_wifi[] PROGMEM = { const uint8_t PAGE_settings_wifi[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x57, 0xe1, 0x6e, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x58, 0x6b, 0x6f, 0xdb, 0xca,
0x10, 0xfe, 0xef, 0xa7, 0x60, 0x38, 0xa0, 0xb0, 0x50, 0x59, 0x8e, 0xed, 0xa5, 0x2b, 0x52, 0xc9, 0x11, 0xfd, 0xae, 0x5f, 0xb1, 0xde, 0x16, 0x06, 0x09, 0xd3, 0x94, 0x64, 0x35, 0x69, 0x60, 0x8b,
0x5d, 0x62, 0xbb, 0x4d, 0xb6, 0x34, 0xf5, 0xa0, 0xa0, 0xc1, 0x80, 0x01, 0x05, 0x2d, 0x9d, 0x6d, 0x4a, 0xfd, 0xd0, 0x8d, 0xdd, 0x3a, 0x8e, 0x0a, 0x19, 0xd7, 0x28, 0xd2, 0xe0, 0x5e, 0x9a, 0x1c,
0x2e, 0x14, 0xa9, 0x89, 0x94, 0x9d, 0x20, 0xcd, 0xbb, 0xef, 0x48, 0xc9, 0x8e, 0x9d, 0xc4, 0x6d, 0x49, 0x1b, 0x93, 0xbb, 0xbc, 0xdc, 0xa5, 0x64, 0xc3, 0xd6, 0x7f, 0xef, 0xcc, 0x2e, 0xf5, 0xb4,
0xd1, 0x65, 0x08, 0x1c, 0x98, 0xe4, 0xdd, 0x77, 0xc7, 0xbb, 0xef, 0x8e, 0xe7, 0x70, 0x6f, 0xf8, 0x9d, 0x16, 0x81, 0x8b, 0x20, 0x09, 0xb9, 0x3b, 0x3b, 0x33, 0x7b, 0xe6, 0xcc, 0x83, 0xea, 0xee,
0x71, 0x70, 0xf1, 0xe7, 0x78, 0x44, 0xe6, 0x26, 0x13, 0xfd, 0xd0, 0xfe, 0x27, 0x82, 0xc9, 0x59, 0x9c, 0x7d, 0x39, 0xbd, 0xfe, 0xd7, 0xa0, 0xcf, 0x26, 0x26, 0xcf, 0x7a, 0x5d, 0xfa, 0x97, 0x65,
0x44, 0x41, 0x52, 0x5c, 0x03, 0x4b, 0xfb, 0x61, 0x06, 0x86, 0x91, 0x64, 0xce, 0x0a, 0x0d, 0x26, 0xb1, 0x1c, 0x47, 0x1c, 0x24, 0xc7, 0x77, 0x88, 0xd3, 0x5e, 0x37, 0x07, 0x13, 0xb3, 0x64, 0x12,
0xa2, 0xa5, 0x99, 0xb6, 0x5e, 0xd3, 0x7a, 0xb7, 0x21, 0x59, 0x06, 0x11, 0x5d, 0x70, 0x58, 0xe6, 0x97, 0x1a, 0x4c, 0xc4, 0x2b, 0x33, 0xda, 0xff, 0xc0, 0xeb, 0xd5, 0x86, 0x8c, 0x73, 0x88, 0xf8,
0xaa, 0x30, 0x94, 0x24, 0x4a, 0x1a, 0x90, 0x28, 0xb6, 0xe4, 0xa9, 0x99, 0x47, 0x07, 0xfb, 0xfb, 0x54, 0xc0, 0xac, 0x50, 0xa5, 0xe1, 0x2c, 0x51, 0xd2, 0x80, 0x44, 0xb1, 0x99, 0x48, 0xcd, 0x24,
0x6b, 0xd1, 0x07, 0x47, 0x29, 0x2c, 0x78, 0x02, 0x2d, 0xb7, 0xf0, 0xb9, 0xe4, 0x86, 0x33, 0xd1, 0x7a, 0xd7, 0x6a, 0x2d, 0x45, 0xb7, 0xb6, 0x52, 0x98, 0x8a, 0x04, 0xf6, 0xed, 0x4b, 0x20, 0xa4,
0xd2, 0x09, 0x13, 0x10, 0x75, 0xfc, 0x8c, 0x5d, 0xf3, 0xac, 0xcc, 0xd6, 0xeb, 0x52, 0x43, 0xe1, 0x30, 0x22, 0xce, 0xf6, 0x75, 0x12, 0x67, 0x10, 0xb5, 0x83, 0x3c, 0xbe, 0x17, 0x79, 0x95, 0x2f,
0x16, 0x6c, 0x82, 0x6b, 0xa9, 0xe8, 0x23, 0xcb, 0xfd, 0xd0, 0x70, 0x23, 0xa0, 0x7f, 0xc9, 0xdf, 0xdf, 0x2b, 0x0d, 0xa5, 0x7d, 0x89, 0x6f, 0xf1, 0x5d, 0x2a, 0xfe, 0xcc, 0x72, 0xaf, 0x6b, 0x84,
0x71, 0x12, 0x83, 0x31, 0x5c, 0xce, 0x74, 0xd8, 0xae, 0x36, 0x43, 0x9d, 0x14, 0x3c, 0x37, 0xfd, 0xc9, 0xa0, 0x77, 0x23, 0x7e, 0x11, 0x6c, 0x08, 0xc6, 0x08, 0x39, 0xd6, 0xdd, 0xa6, 0x5b, 0xec,
0xc6, 0x82, 0x15, 0x44, 0xa8, 0x84, 0xe7, 0x7e, 0x1a, 0xa5, 0x2a, 0x29, 0x33, 0x74, 0xc8, 0xc7, 0xea, 0xa4, 0x14, 0x85, 0xe9, 0x35, 0xa6, 0x71, 0xc9, 0x32, 0x95, 0x88, 0x22, 0x48, 0xa3, 0x54,
0x8d, 0x68, 0xaf, 0xf3, 0x66, 0x5a, 0xca, 0xc4, 0x70, 0x25, 0xc9, 0x49, 0xd3, 0xbb, 0x5d, 0x72, 0x25, 0x55, 0x8e, 0x0e, 0x05, 0xb8, 0x10, 0xed, 0xb4, 0x03, 0x54, 0x2f, 0x2f, 0x95, 0x2a, 0x74,
0x99, 0xaa, 0x65, 0xa0, 0x72, 0x90, 0x4d, 0x3a, 0x37, 0x26, 0xd7, 0x87, 0xed, 0xf6, 0x95, 0x54, 0xd4, 0x0a, 0x8a, 0x12, 0x86, 0xf8, 0x3a, 0x1c, 0x5e, 0x9c, 0x45, 0x9c, 0x1f, 0x8d, 0x2a, 0x99,
0xc1, 0x52, 0x40, 0x1a, 0xcc, 0xa0, 0x3d, 0x05, 0x66, 0xca, 0x02, 0x74, 0x5b, 0xd7, 0xb6, 0xda, 0x18, 0xa1, 0x24, 0x1b, 0x5f, 0xa4, 0x1e, 0xf8, 0x8f, 0x25, 0x98, 0xaa, 0x94, 0x2c, 0x0d, 0xc7,
0x3f, 0x2d, 0xf9, 0x94, 0xb7, 0x56, 0x4b, 0xea, 0xdd, 0xad, 0x01, 0x8f, 0x1f, 0x02, 0xae, 0x95, 0x60, 0xfa, 0x19, 0x90, 0x96, 0x93, 0x07, 0xbb, 0x35, 0x5f, 0x8a, 0x26, 0xfd, 0x0d, 0xc9, 0xa4,
0xa8, 0x4f, 0x3f, 0x6b, 0x10, 0xd3, 0x4d, 0x69, 0xa1, 0x58, 0xfa, 0x5b, 0xdc, 0x34, 0x3e, 0x44, 0x84, 0xd8, 0x40, 0x2d, 0xbc, 0x21, 0x78, 0xee, 0xf9, 0x8f, 0x33, 0x21, 0x53, 0x35, 0x0b, 0x55,
0x7b, 0xfb, 0xde, 0xad, 0x00, 0x43, 0x54, 0x94, 0x06, 0x49, 0x81, 0x16, 0x61, 0x24, 0xc0, 0xfa, 0x01, 0xd2, 0xe3, 0x13, 0x63, 0x0a, 0x7d, 0xd8, 0x6c, 0xde, 0x49, 0x15, 0xce, 0x32, 0x20, 0x2b,
0xdc, 0xa4, 0xd5, 0x8d, 0xa8, 0xf7, 0x46, 0x05, 0x08, 0x76, 0x64, 0x4c, 0xc1, 0x27, 0xa5, 0x01, 0xcd, 0x11, 0x9e, 0xae, 0x4a, 0xd0, 0x4d, 0x5d, 0x5f, 0xad, 0xf9, 0xa7, 0x99, 0x18, 0x89, 0xfd,
0x3c, 0x28, 0x12, 0xea, 0x1b, 0xcf, 0x7f, 0xb8, 0x6f, 0x6e, 0x72, 0x40, 0x73, 0x06, 0xae, 0x4d, 0xc5, 0x2b, 0x5f, 0x53, 0x78, 0xb2, 0xad, 0x70, 0x79, 0x88, 0x07, 0xfc, 0x37, 0x0d, 0xd9, 0x68,
0xfb, 0x6f, 0xb6, 0x60, 0x2b, 0x80, 0x47, 0x82, 0x4c, 0xdf, 0x48, 0x84, 0x00, 0xcf, 0x4f, 0x83, 0x5d, 0xfa, 0x0a, 0xa5, 0x31, 0x34, 0xda, 0x30, 0x88, 0x3c, 0x84, 0xe2, 0xa3, 0xb5, 0x8f, 0xe6,
0x89, 0x4a, 0x6f, 0x02, 0x96, 0xa3, 0xd3, 0xe9, 0x60, 0xce, 0x45, 0xda, 0x54, 0x56, 0x9e, 0xa5, 0xf9, 0x9e, 0x45, 0xea, 0x90, 0x73, 0x7f, 0x8f, 0x37, 0xbf, 0x6b, 0x25, 0x9b, 0x12, 0x0c, 0x0f,
0xe9, 0x68, 0x81, 0x5e, 0x9c, 0x71, 0x8d, 0x19, 0x85, 0xa2, 0x49, 0xad, 0xcf, 0xd4, 0x6f, 0x7a, 0x4c, 0x44, 0x28, 0x70, 0x82, 0x8b, 0xfb, 0x47, 0x26, 0x4c, 0x85, 0xa6, 0xa8, 0xa4, 0xd1, 0x4e,
0x51, 0xff, 0xf6, 0x3d, 0x98, 0x4f, 0x4d, 0xef, 0xee, 0x69, 0x39, 0x28, 0x0a, 0x55, 0xa0, 0x7b, 0x2b, 0x30, 0xa1, 0x90, 0x12, 0xca, 0xf3, 0xeb, 0xcf, 0x97, 0x11, 0x27, 0x04, 0x25, 0x9a, 0x0d,
0x28, 0x87, 0x74, 0xd0, 0x4a, 0x40, 0x20, 0xd4, 0xac, 0x49, 0x47, 0x76, 0x9f, 0xd4, 0x97, 0xc7, 0xc3, 0x90, 0x07, 0x23, 0x30, 0xc9, 0x04, 0xef, 0x1d, 0x9a, 0x09, 0xba, 0x04, 0x51, 0x0f, 0x42,
0xc0, 0x90, 0x29, 0x17, 0xe0, 0xae, 0x81, 0xf9, 0x2f, 0xf0, 0xba, 0x67, 0xf5, 0xbe, 0x9a, 0x5a, 0x52, 0xe9, 0xf9, 0xab, 0x95, 0x2f, 0xb7, 0xdf, 0x21, 0x31, 0x61, 0xac, 0xb5, 0x18, 0x4b, 0xef,
0x8a, 0x4d, 0xf9, 0xac, 0x2c, 0x98, 0x8b, 0x56, 0x75, 0x0d, 0x32, 0x65, 0xdc, 0x26, 0xe6, 0x2f, 0x71, 0x1e, 0x3c, 0xa2, 0xbd, 0x99, 0x2a, 0xef, 0xf4, 0xe1, 0xd7, 0x6f, 0xf3, 0x00, 0xcf, 0x2e,
0x79, 0x2a, 0x13, 0x95, 0xe5, 0x18, 0x34, 0x20, 0x39, 0x9b, 0x01, 0x49, 0x99, 0x61, 0x7b, 0x18, 0xde, 0x43, 0x8d, 0x21, 0xf7, 0x3c, 0x08, 0x8c, 0x1f, 0xf5, 0x4c, 0x58, 0xe2, 0x89, 0x7d, 0xb0,
0xde, 0x8d, 0x00, 0xc7, 0x98, 0x0e, 0x6a, 0x0d, 0x1c, 0xd2, 0x28, 0xaa, 0xf3, 0x82, 0x1c, 0x70, 0xff, 0xf9, 0x61, 0x09, 0x69, 0x95, 0xc0, 0x62, 0xd3, 0x03, 0x94, 0xcd, 0xc1, 0x19, 0xc4, 0xfd,
0x78, 0x41, 0x5e, 0x28, 0xa3, 0x12, 0x25, 0x5e, 0xbc, 0x68, 0x3a, 0x5e, 0xec, 0xfb, 0x4d, 0x47, 0x34, 0x8a, 0x22, 0x63, 0x1f, 0xfc, 0xa7, 0x27, 0x08, 0x8b, 0x4a, 0x4f, 0x3c, 0xe3, 0xa3, 0xee,
0x98, 0xc8, 0x4a, 0x88, 0xd8, 0xa8, 0x02, 0x51, 0x91, 0x00, 0xe6, 0xd4, 0x40, 0x66, 0x2f, 0x9e, 0xe0, 0xeb, 0xb7, 0x35, 0x57, 0x1e, 0xc5, 0xc8, 0x6b, 0xa1, 0x28, 0x84, 0x19, 0xc8, 0xb1, 0x99,
0x9c, 0xe6, 0xd4, 0xf3, 0xbe, 0x7c, 0xa9, 0xc5, 0x50, 0x3f, 0xcb, 0xd1, 0xe1, 0x77, 0x88, 0x4f, 0xec, 0xee, 0x2e, 0xd9, 0xd1, 0x6d, 0xb7, 0xfc, 0x3a, 0xaa, 0xcb, 0xb5, 0xbd, 0xbd, 0x60, 0xaa,
0x3e, 0xa8, 0x14, 0x02, 0x32, 0x16, 0xc0, 0x34, 0x10, 0x0c, 0x04, 0x14, 0xe4, 0xf2, 0x6c, 0x34, 0x44, 0xca, 0x10, 0xe7, 0x6b, 0x91, 0x83, 0xaa, 0x8c, 0x77, 0x15, 0xb4, 0xa1, 0xe3, 0x1f, 0xad,
0x24, 0xa7, 0x63, 0x74, 0xc9, 0xdf, 0x42, 0xd4, 0xdb, 0x88, 0xbe, 0x43, 0xf3, 0x3c, 0x2b, 0xe5, 0x91, 0xea, 0x28, 0x03, 0xc3, 0xa4, 0x03, 0xef, 0x74, 0x88, 0xd0, 0xa1, 0x0d, 0xe9, 0x3f, 0xd2,
0xe8, 0x60, 0xe1, 0xdf, 0x3a, 0x26, 0x22, 0x11, 0xe9, 0x4b, 0x77, 0x7c, 0x48, 0xa9, 0xf7, 0xf2, 0xaa, 0x89, 0x90, 0x2d, 0x1c, 0x23, 0x83, 0xf7, 0xb7, 0x98, 0xa2, 0xa2, 0x63, 0x63, 0x4a, 0x71,
0x9e, 0x4c, 0x6d, 0x1d, 0xfc, 0xad, 0xdf, 0xe6, 0x51, 0x87, 0xfa, 0x7b, 0x1d, 0xef, 0xae, 0x11, 0x5b, 0x19, 0xf0, 0xb8, 0x48, 0x31, 0x70, 0x74, 0x24, 0xd8, 0xde, 0xa1, 0x24, 0x78, 0x6d, 0x4f,
0xb6, 0x6b, 0xda, 0x87, 0xda, 0xdc, 0x60, 0x15, 0xfc, 0xca, 0x33, 0x5b, 0x2a, 0xa4, 0x2c, 0x04, 0x49, 0xcc, 0x59, 0x39, 0xa6, 0xfd, 0x6b, 0xcf, 0x47, 0x81, 0x75, 0x52, 0xcb, 0x70, 0x1a, 0x67,
0xd2, 0xc4, 0x6e, 0x05, 0x89, 0x46, 0xa2, 0xbe, 0x41, 0x41, 0x27, 0x10, 0xb6, 0xab, 0x82, 0xb7, 0x15, 0x1c, 0x8d, 0x54, 0xe9, 0x91, 0x07, 0x80, 0xfe, 0x41, 0xd7, 0x84, 0xc9, 0x44, 0x64, 0x69,
0x59, 0xc7, 0x64, 0x58, 0xcb, 0x11, 0xc5, 0x68, 0x61, 0x71, 0x4d, 0x55, 0x91, 0x35, 0x08, 0xc7, 0x09, 0xb2, 0xbe, 0xf7, 0x11, 0xec, 0xed, 0xf9, 0x08, 0x30, 0xe4, 0x6a, 0x0a, 0xa7, 0xb4, 0xe7,
0xb5, 0xfd, 0xf6, 0x59, 0x53, 0x52, 0xd5, 0x5f, 0x3c, 0xa5, 0x04, 0xcb, 0x7b, 0xae, 0xf0, 0x24, 0xad, 0x64, 0xbe, 0xc2, 0x37, 0x7f, 0xa9, 0x40, 0xa1, 0x02, 0xd5, 0x5d, 0xe0, 0x75, 0xa4, 0xf0,
0x57, 0xda, 0xd6, 0x61, 0xca, 0x17, 0x24, 0x11, 0x4c, 0xeb, 0x88, 0x1a, 0x85, 0xe1, 0x58, 0x6e, 0x5c, 0x4d, 0x2b, 0x61, 0x2f, 0xa7, 0x0a, 0x62, 0x1b, 0xdd, 0x7a, 0xcb, 0x4d, 0xeb, 0x07, 0x0f,
0xef, 0xcd, 0x41, 0xe4, 0xc7, 0xb4, 0xdf, 0x08, 0x91, 0x6d, 0x06, 0xb3, 0x61, 0x79, 0x19, 0xd1, 0xe0, 0xab, 0xfa, 0xe6, 0xe2, 0x12, 0x88, 0x35, 0x12, 0xfd, 0xfe, 0xe7, 0xc7, 0xe5, 0xce, 0x9c,
0x6a, 0x41, 0xd1, 0x6a, 0x22, 0x78, 0x72, 0x15, 0xd1, 0x13, 0x6b, 0xf6, 0x6d, 0xd8, 0xae, 0x0e, 0x79, 0xf5, 0x1b, 0x45, 0x7a, 0xce, 0xd2, 0x93, 0xdc, 0xff, 0x7d, 0x75, 0x10, 0xc3, 0x55, 0xdf,
0xd0, 0x35, 0x84, 0xe8, 0x3f, 0xad, 0xd3, 0x58, 0x2b, 0x1d, 0x5b, 0xa5, 0x63, 0x96, 0x5c, 0xdd, 0x6a, 0x77, 0x77, 0xdb, 0x88, 0x83, 0x16, 0x08, 0xc7, 0xe5, 0x23, 0x21, 0x16, 0x17, 0x98, 0x20,
0xeb, 0x6d, 0x69, 0xe8, 0x72, 0x92, 0x71, 0xf4, 0x31, 0x66, 0x0b, 0x20, 0x2f, 0xc8, 0x40, 0x49, 0xa9, 0xbb, 0x98, 0xf0, 0xe7, 0xce, 0x61, 0xb5, 0xe9, 0xb0, 0x7a, 0xd9, 0x61, 0xbe, 0x73, 0x8a,
0x09, 0x89, 0xb9, 0x17, 0x9e, 0x17, 0xe8, 0x57, 0x65, 0x69, 0xde, 0xad, 0x5a, 0x09, 0x06, 0xb7, 0x59, 0x17, 0xa8, 0x75, 0xc6, 0x7f, 0x41, 0xfe, 0x94, 0xac, 0x66, 0xa9, 0xa5, 0xfd, 0xa6, 0x09,
0xcc, 0x31, 0x30, 0x5d, 0xdc, 0xea, 0xf5, 0x6b, 0x0d, 0x62, 0x14, 0x81, 0x6b, 0x64, 0xb5, 0xa5, 0xe5, 0x07, 0x12, 0xc1, 0x2c, 0xb2, 0x38, 0x81, 0x1b, 0x61, 0x88, 0x7a, 0xf3, 0xf5, 0x04, 0x6a,
0xa4, 0x04, 0xb3, 0x54, 0x05, 0x9a, 0xc4, 0xf3, 0xc6, 0x79, 0xb5, 0x70, 0xd1, 0x21, 0xcd, 0x38, 0x3f, 0x4f, 0x20, 0x3e, 0x5f, 0xcb, 0x55, 0x8c, 0xe3, 0xa3, 0x8b, 0xd6, 0x06, 0x8b, 0x76, 0xe0,
0x3e, 0x1d, 0xfa, 0x04, 0x90, 0x10, 0x37, 0x56, 0x45, 0x2a, 0x63, 0xd9, 0x6b, 0x11, 0xbc, 0xc3, 0xe9, 0xc9, 0xba, 0xb3, 0x83, 0x84, 0xb5, 0xee, 0xd5, 0x0c, 0x3d, 0x5a, 0x91, 0x4b, 0xc8, 0xa2,
0x70, 0x52, 0xf4, 0x43, 0x2e, 0xf3, 0xd2, 0xd4, 0xce, 0xd9, 0xca, 0x5c, 0x85, 0x75, 0x10, 0xe3, 0x72, 0xdc, 0x32, 0x0f, 0x05, 0x16, 0x4e, 0x03, 0xf7, 0x94, 0xcb, 0x21, 0xe2, 0x46, 0x7a, 0xf0,
0xb5, 0xb0, 0x09, 0x0a, 0x90, 0x33, 0xec, 0x95, 0xb4, 0xd7, 0xc5, 0x20, 0xa2, 0xc2, 0x0a, 0x3e, 0xc9, 0x15, 0x54, 0xf7, 0xbc, 0x79, 0x63, 0xac, 0xc6, 0x2e, 0xac, 0x3c, 0xe8, 0x1c, 0x10, 0x6c,
0xc7, 0x50, 0xe2, 0x97, 0xf4, 0x31, 0xca, 0xea, 0x64, 0x8d, 0x34, 0xde, 0x46, 0x7a, 0xd5, 0xab, 0xd6, 0x46, 0xb4, 0xc6, 0xa7, 0x00, 0xb6, 0xaf, 0xb5, 0xf4, 0x39, 0x53, 0x71, 0xfa, 0xf7, 0x21,
0x90, 0x62, 0x83, 0x7c, 0x4f, 0x90, 0x89, 0xa4, 0x89, 0xf4, 0xc4, 0x70, 0x30, 0x43, 0xf6, 0x03, 0xa5, 0x23, 0x16, 0x08, 0xe7, 0xbe, 0x74, 0x74, 0xb7, 0x35, 0x19, 0x5d, 0x92, 0xdb, 0xc1, 0x2a,
0xf7, 0x47, 0x30, 0xc5, 0x64, 0x78, 0x32, 0x18, 0x6f, 0x39, 0x59, 0xc1, 0x9d, 0xee, 0x23, 0x5c, 0x13, 0x4e, 0x19, 0xb9, 0xbd, 0x4e, 0x8e, 0x23, 0xee, 0xe4, 0x79, 0xf3, 0x7b, 0x3c, 0x8d, 0x17,
0x65, 0x49, 0x96, 0xd9, 0x04, 0x0a, 0xba, 0xca, 0x2b, 0x52, 0x22, 0xe3, 0x32, 0xa2, 0x28, 0x80, 0x0a, 0x9e, 0x09, 0xc6, 0xfa, 0x41, 0xa2, 0x0a, 0xcc, 0xeb, 0x34, 0xbc, 0x55, 0xe9, 0xc3, 0x46,
0xe6, 0x22, 0xda, 0x3d, 0x38, 0xa0, 0xa4, 0x80, 0x7f, 0x4a, 0x5e, 0x40, 0xda, 0x27, 0x01, 0xd9, 0x0c, 0x24, 0xc9, 0xc7, 0x69, 0xda, 0x9f, 0x62, 0x21, 0xbe, 0x14, 0x1a, 0x7b, 0x12, 0x94, 0x1e,
0xc6, 0xe9, 0x3c, 0x13, 0x4e, 0xf7, 0x99, 0x70, 0x7a, 0x3f, 0x86, 0xb3, 0x11, 0xca, 0x19, 0xb6, 0x27, 0x37, 0x79, 0xe0, 0x61, 0xc9, 0x78, 0xfc, 0x04, 0xe6, 0x57, 0xcf, 0x9f, 0xbf, 0x2c, 0x07,
0xe7, 0x25, 0xbb, 0xd9, 0x88, 0x59, 0xa3, 0x06, 0x7f, 0x8f, 0xba, 0xff, 0xc9, 0xc7, 0xfa, 0xb1, 0x65, 0xa9, 0x4a, 0x74, 0x0f, 0xe5, 0x88, 0x2d, 0x2a, 0x43, 0xca, 0xab, 0xb1, 0xc7, 0xfb, 0xb4,
0x7b, 0xdf, 0x79, 0x26, 0x9c, 0xee, 0x33, 0xe1, 0xf4, 0x7e, 0x08, 0xc7, 0x06, 0xa8, 0x51, 0x07, 0xce, 0xea, 0xfb, 0x62, 0xd1, 0x63, 0x23, 0x91, 0x81, 0xbd, 0x06, 0x76, 0x30, 0x2c, 0x56, 0xfc,
0x0d, 0x2b, 0x12, 0xeb, 0x07, 0xa5, 0xf4, 0xd5, 0x63, 0xb2, 0xc5, 0xdf, 0x11, 0xb7, 0xc6, 0x77, 0xb2, 0x5e, 0x57, 0x23, 0x6a, 0x92, 0x23, 0x31, 0xae, 0xca, 0xd8, 0x02, 0xe4, 0xae, 0xc1, 0x46,
0x24, 0x37, 0xee, 0x3c, 0x13, 0x4e, 0xf7, 0x99, 0x70, 0x7a, 0x3f, 0x86, 0x63, 0x03, 0x94, 0x0d, 0xb1, 0xa0, 0x5a, 0xff, 0x6f, 0x79, 0x21, 0x13, 0x95, 0x17, 0x88, 0x13, 0xb0, 0x22, 0x1e, 0x03,
0xcf, 0x63, 0x82, 0x0f, 0x2b, 0x8e, 0x1e, 0x7a, 0x55, 0xba, 0x55, 0x83, 0xb1, 0x55, 0x2b, 0x15, 0x4b, 0x63, 0x13, 0xef, 0x60, 0xc5, 0x5e, 0xc3, 0x74, 0x88, 0x3c, 0xe0, 0x64, 0xe0, 0x90, 0x47,
0xb1, 0x02, 0x55, 0xe1, 0xd6, 0x8f, 0x05, 0x59, 0x91, 0xf1, 0x89, 0x36, 0xf3, 0xc1, 0x25, 0x68, 0x51, 0x5d, 0xea, 0xb1, 0x58, 0x5b, 0x7d, 0x61, 0x51, 0x2a, 0xa3, 0x12, 0x95, 0xed, 0xee, 0x7a,
0xb3, 0xcb, 0x10, 0xf7, 0x14, 0x0a, 0xab, 0x3f, 0x10, 0x1c, 0xdf, 0x2c, 0x6c, 0x11, 0x87, 0x24, 0xb6, 0xb3, 0xb5, 0x02, 0xcf, 0x16, 0xf2, 0x88, 0x24, 0xb2, 0xa1, 0x51, 0x25, 0x6a, 0xa5, 0xce,
0xd4, 0x39, 0x93, 0x6b, 0x2f, 0x79, 0x8e, 0xfd, 0xfb, 0xfc, 0xbe, 0x99, 0x41, 0x8a, 0x2f, 0x08, 0x75, 0x61, 0x20, 0xa7, 0x8b, 0x27, 0x17, 0x05, 0xf7, 0xb1, 0x1c, 0xd6, 0x62, 0x78, 0x3e, 0x2f,
0x0a, 0x38, 0x07, 0xeb, 0x36, 0xe9, 0x9e, 0x68, 0x20, 0x47, 0x49, 0x62, 0x1d, 0x1d, 0x2b, 0x2e, 0xd0, 0xe1, 0x5f, 0x50, 0x3f, 0xfb, 0xac, 0x52, 0x08, 0xd9, 0x20, 0x83, 0x58, 0x03, 0x43, 0x20,
0x4d, 0xd5, 0x21, 0x8f, 0xc6, 0xc4, 0xb6, 0xc5, 0x27, 0x7d, 0x3f, 0x1a, 0x7f, 0xa3, 0x2f, 0x1e, 0x90, 0xde, 0x37, 0x97, 0xfd, 0x33, 0x76, 0x31, 0x40, 0x97, 0x82, 0x0d, 0x8d, 0x7a, 0x53, 0x63,
0xc5, 0x8f, 0x1c, 0x6e, 0x58, 0x85, 0x13, 0x9e, 0xa2, 0xad, 0xb1, 0x93, 0x3a, 0x24, 0x5b, 0xea, 0x60, 0xb5, 0xf9, 0x3e, 0x49, 0x59, 0x06, 0xfc, 0xa0, 0xb9, 0x2c, 0x9b, 0x9a, 0xc6, 0xa6, 0xf0,
0xc9, 0x1c, 0x92, 0xab, 0x89, 0xba, 0x5e, 0x43, 0x9c, 0x54, 0x0d, 0xd0, 0x3a, 0xb2, 0x6a, 0x96, 0xb1, 0x88, 0xda, 0x3c, 0xd8, 0x69, 0xfb, 0xf3, 0x46, 0xb7, 0x59, 0x37, 0xee, 0xae, 0x36, 0x0f,
0x8f, 0x9d, 0xb1, 0x73, 0x9a, 0xf7, 0xed, 0xee, 0x7a, 0xf4, 0xb8, 0xbb, 0x22, 0xa8, 0xc1, 0x87, 0xd8, 0xc7, 0xff, 0x26, 0x72, 0x6a, 0xf6, 0xac, 0x2a, 0x33, 0xa4, 0x09, 0x2d, 0x85, 0x89, 0xc6,
0x1e, 0xb3, 0xd8, 0x0c, 0x6e, 0x5f, 0xfb, 0xaf, 0x7a, 0x77, 0xde, 0x17, 0x7c, 0x96, 0x88, 0x9b, 0x2c, 0x3c, 0x42, 0x41, 0x2b, 0xd0, 0x6d, 0xba, 0x91, 0x85, 0xa2, 0x8e, 0xc1, 0x20, 0xcb, 0x98,
0x44, 0x23, 0x3a, 0x72, 0x26, 0xd0, 0x02, 0x26, 0x3a, 0x20, 0xaf, 0xdd, 0x5c, 0xcd, 0x30, 0x84, 0x46, 0x58, 0xfd, 0x7a, 0x5d, 0x2c, 0x54, 0x79, 0x83, 0x11, 0xdd, 0xe9, 0xe9, 0x37, 0xcd, 0x99,
0x85, 0x5e, 0xb9, 0xb5, 0x11, 0x31, 0xe2, 0x9e, 0x20, 0x14, 0xc1, 0x30, 0x8b, 0xc3, 0x6d, 0x12, 0x23, 0xfc, 0x70, 0xc4, 0x19, 0x0e, 0x28, 0x13, 0x85, 0x3b, 0x85, 0xd2, 0x34, 0x49, 0xa4, 0x62,
0x1d, 0x0d, 0x76, 0x90, 0xe8, 0x7a, 0xc5, 0xa2, 0xce, 0x8a, 0x45, 0x9d, 0xde, 0x03, 0x12, 0xe1, 0xca, 0x92, 0x0c, 0xfb, 0x10, 0xa6, 0x89, 0x42, 0x38, 0x66, 0x9b, 0x6b, 0x13, 0xc8, 0x8a, 0x13,
0xd5, 0xed, 0x05, 0xb5, 0x4d, 0x2c, 0x08, 0xfb, 0xa0, 0xd5, 0x98, 0xf8, 0x30, 0x87, 0x2a, 0x77, 0xde, 0x6b, 0x74, 0x91, 0x6d, 0x06, 0xa3, 0xe1, 0x12, 0xca, 0xbd, 0x70, 0xb4, 0x9a, 0x64, 0x22,
0x53, 0xd2, 0x82, 0x89, 0x12, 0x2c, 0x15, 0x6d, 0xaa, 0x57, 0x99, 0xb6, 0x07, 0x6c, 0x6a, 0xe7, 0xb9, 0x8b, 0xf8, 0x39, 0x99, 0xfd, 0xd8, 0x6d, 0xba, 0x0d, 0x74, 0x0d, 0x55, 0xf4, 0x5e, 0x3e,
0x98, 0x89, 0x52, 0x98, 0xd0, 0x4a, 0xf6, 0xa1, 0x4e, 0x87, 0xf6, 0x87, 0x5c, 0x6f, 0x90, 0xe3, 0xd3, 0x58, 0x1e, 0x3a, 0xa1, 0x43, 0x27, 0x71, 0x72, 0xb7, 0x3a, 0xb7, 0x71, 0x42, 0x57, 0xb7,
0x81, 0x58, 0xa3, 0x96, 0xc3, 0xec, 0x1d, 0x09, 0x6c, 0x99, 0x7a, 0x17, 0x10, 0xbe, 0x55, 0xe7, 0xb9, 0x40, 0x1f, 0x87, 0xf1, 0x14, 0xd8, 0x2e, 0x3b, 0x55, 0x58, 0x2d, 0x12, 0xb3, 0x12, 0x9e,
0xb0, 0x40, 0x6b, 0x4d, 0xfb, 0x74, 0x16, 0x80, 0xa3, 0x1d, 0x4e, 0xbf, 0x29, 0xa4, 0xde, 0x5a, 0x94, 0xe8, 0x97, 0xb3, 0x34, 0x39, 0x70, 0xc3, 0x10, 0x82, 0x5b, 0x15, 0x08, 0xcc, 0x01, 0x2e,
0xc3, 0x4e, 0x39, 0xee, 0x0a, 0xab, 0x8b, 0x3d, 0x4d, 0x57, 0xcb, 0x56, 0x0c, 0x33, 0x5f, 0xc0, 0x75, 0x7a, 0xf5, 0x09, 0x66, 0x14, 0x83, 0x7b, 0x64, 0x35, 0x51, 0xb2, 0x2e, 0x58, 0x28, 0xd3,
0x03, 0xaa, 0x8e, 0xae, 0x73, 0x28, 0xb8, 0x9d, 0xa9, 0x91, 0xf4, 0x8e, 0xa0, 0xe8, 0xba, 0xfd, 0x59, 0x9a, 0x6b, 0x6c, 0x7a, 0x48, 0xb8, 0xd9, 0x8e, 0xbf, 0xba, 0xdf, 0x15, 0xb9, 0x4a, 0x05,
0x95, 0x51, 0xc5, 0x5e, 0x0b, 0x80, 0xfc, 0x1b, 0x8c, 0xba, 0x8c, 0xab, 0xd4, 0x85, 0xbc, 0xdf, 0x60, 0xcd, 0x55, 0xb4, 0x7e, 0xe5, 0x94, 0x59, 0x74, 0x99, 0x67, 0x8b, 0x03, 0x03, 0x24, 0xd4,
0x18, 0xa0, 0x5d, 0x3b, 0xe1, 0x90, 0x25, 0x37, 0xf3, 0x75, 0xd4, 0x16, 0x1c, 0x73, 0xce, 0xb5, 0x03, 0x99, 0x94, 0xca, 0x10, 0xfb, 0xc9, 0x03, 0xff, 0x90, 0xc4, 0xbb, 0xb6, 0x2e, 0xb1, 0xb5,
0x2e, 0x41, 0x07, 0x2e, 0xc9, 0xc3, 0x6a, 0x18, 0x00, 0xe9, 0x2c, 0xf1, 0x69, 0x65, 0x8c, 0x6b, 0x9a, 0xc4, 0xea, 0x8a, 0xb4, 0x98, 0xf0, 0xe8, 0x71, 0x59, 0x80, 0x22, 0xde, 0x39, 0xe0, 0xd6,
0x62, 0x5f, 0x77, 0x3b, 0x54, 0x24, 0xaa, 0xc0, 0xeb, 0x1a, 0x71, 0xe3, 0x13, 0x2e, 0xed, 0xe8, 0xce, 0xc2, 0x4c, 0x81, 0x21, 0xc1, 0x87, 0xf4, 0xb9, 0xb6, 0xc5, 0xce, 0x4a, 0xd3, 0x60, 0x43,
0xaf, 0x41, 0x93, 0x5c, 0x2d, 0x31, 0x16, 0x76, 0x70, 0x2e, 0x33, 0x77, 0xfb, 0x20, 0x6c, 0x73, 0xd3, 0xfb, 0x8e, 0xd3, 0x34, 0x34, 0x98, 0x37, 0x09, 0x32, 0x9a, 0x61, 0x23, 0x23, 0x58, 0x63,
0x37, 0x5c, 0x55, 0xa3, 0x19, 0xce, 0x61, 0x29, 0xad, 0x6e, 0x65, 0xe6, 0x48, 0x41, 0x6c, 0xac, 0xc3, 0x5a, 0xa1, 0xfd, 0xc3, 0x90, 0x2a, 0xec, 0xec, 0xfc, 0x74, 0xb0, 0xe1, 0x6c, 0xad, 0xee,
0x17, 0xe8, 0xb1, 0xbb, 0xd6, 0x76, 0xa2, 0x47, 0x17, 0x27, 0x4f, 0x65, 0xfa, 0x5c, 0x49, 0x68, 0xa2, 0xc5, 0x6b, 0x4b, 0xb2, 0xca, 0x6f, 0xa1, 0xe4, 0x0b, 0x7e, 0x20, 0xb5, 0x72, 0x21, 0x23,
0xec, 0x4a, 0x06, 0x66, 0x6b, 0x14, 0x8f, 0x7b, 0xdd, 0xd6, 0xf8, 0xe3, 0x68, 0x97, 0xcc, 0xab, 0xde, 0xb2, 0xe6, 0x22, 0x7e, 0xf0, 0xee, 0x1d, 0x67, 0x25, 0xfc, 0x51, 0x09, 0x9c, 0x4d, 0x7a,
0x5a, 0x66, 0x08, 0xe5, 0xf5, 0x4e, 0xa0, 0x5f, 0x68, 0xff, 0xf7, 0xd3, 0x8b, 0xd6, 0xa7, 0x9d, 0x2c, 0x64, 0x5b, 0x7a, 0xda, 0x6f, 0xa4, 0xe7, 0xe0, 0x8d, 0xf4, 0x74, 0x7e, 0x4a, 0xcf, 0x1a,
0x28, 0xf8, 0xf3, 0xf2, 0x8f, 0x92, 0x4b, 0x9c, 0x94, 0x5b, 0x43, 0x3e, 0x6b, 0x7d, 0x4c, 0x0c, 0x94, 0x63, 0x9c, 0x74, 0x67, 0xf1, 0xc3, 0x61, 0x63, 0x0d, 0x34, 0xa7, 0xfb, 0xd3, 0x4f, 0x63,
0xdb, 0x09, 0xf6, 0xf3, 0xbd, 0xac, 0xb3, 0xbc, 0x4b, 0xee, 0x00, 0x79, 0x7c, 0xb1, 0xe4, 0x82, 0xd6, 0xd8, 0xd4, 0xf3, 0x46, 0x98, 0x7d, 0x7a, 0x23, 0xcc, 0x3e, 0xfd, 0x3c, 0x66, 0x8d, 0x1a,
0xcf, 0xe6, 0xe6, 0x0c, 0x2b, 0xf8, 0xeb, 0xd2, 0x48, 0xbc, 0xcb, 0xaf, 0x0a, 0x20, 0xc5, 0x1b, 0x34, 0xcc, 0x6c, 0xcc, 0x43, 0x94, 0xd2, 0x77, 0x87, 0xcf, 0x70, 0x1b, 0xfe, 0x0f, 0xb8, 0x35,
0x97, 0x17, 0x18, 0x0c, 0x8c, 0xe4, 0x7e, 0xe7, 0x5e, 0x6a, 0x93, 0x8c, 0xee, 0x53, 0x4f, 0x93, 0x7e, 0xe8, 0x68, 0xad, 0xa7, 0xfd, 0x46, 0x7a, 0x0e, 0xde, 0x48, 0x4f, 0xe7, 0xe7, 0xf4, 0x10,
0xc5, 0xff, 0x3e, 0xbb, 0xb6, 0xed, 0x60, 0x6e, 0xcb, 0xc1, 0x4e, 0xef, 0x76, 0x94, 0xb7, 0xbf, 0x40, 0xf9, 0xd9, 0xd5, 0x90, 0x61, 0x83, 0xc6, 0xaf, 0x22, 0xbd, 0x48, 0x5d, 0x57, 0x68, 0x28,
0xe8, 0xff, 0x05, 0xa1, 0x98, 0xa8, 0xba, 0xe1, 0x0f, 0x00, 0x00 0x6b, 0xa5, 0x62, 0x24, 0xe0, 0x12, 0xb7, 0x6e, 0x3a, 0xb5, 0xed, 0xc6, 0x46, 0xb9, 0xa9, 0x6b,
0xc3, 0xe7, 0x67, 0x55, 0x86, 0xd9, 0x96, 0x9a, 0xd1, 0xf9, 0xd3, 0x4c, 0x60, 0xef, 0xc3, 0x12,
0x71, 0xc8, 0xba, 0xba, 0x88, 0xe5, 0xd2, 0x4b, 0x51, 0x60, 0x1f, 0xb8, 0x5a, 0x15, 0x35, 0x48,
0xb1, 0x13, 0xa1, 0x80, 0x75, 0xb0, 0x2e, 0xb7, 0xb6, 0xd5, 0x03, 0x3b, 0x4e, 0x12, 0x72, 0x74,
0xa0, 0x84, 0x34, 0xb6, 0xd2, 0x36, 0x8e, 0x07, 0x8c, 0xca, 0xe3, 0x8b, 0xbe, 0x1f, 0x0f, 0x5e,
0xad, 0x8f, 0xce, 0xe1, 0xe3, 0xe7, 0x65, 0xd1, 0xa6, 0xdb, 0xb9, 0x48, 0xd1, 0xd6, 0xc0, 0x4a,
0x1d, 0xb2, 0x8d, 0xe3, 0xc9, 0x04, 0x92, 0xbb, 0x5b, 0x75, 0xbf, 0x54, 0x71, 0xee, 0x0a, 0x20,
0x39, 0xb2, 0x28, 0x96, 0xcf, 0x9d, 0xa1, 0x4f, 0x48, 0xff, 0x47, 0xd5, 0xb5, 0x56, 0x36, 0x70,
0x91, 0x5a, 0xab, 0xae, 0xa8, 0xd4, 0xe0, 0xc0, 0x80, 0x51, 0xf4, 0xc2, 0xc7, 0x0f, 0xc1, 0xfb,
0xce, 0xdc, 0x7f, 0xc2, 0x9e, 0xc1, 0xec, 0x37, 0x79, 0xc4, 0xfb, 0xd6, 0x04, 0x5a, 0xc0, 0x40,
0x87, 0xec, 0x83, 0xfd, 0x85, 0x21, 0x46, 0x08, 0x4b, 0xbd, 0x70, 0x6b, 0x0d, 0x31, 0x66, 0x5b,
0x19, 0x7d, 0xd0, 0x48, 0xc8, 0x0e, 0x37, 0x49, 0x74, 0x7c, 0xfa, 0x0a, 0x89, 0xee, 0x17, 0x2c,
0x6a, 0x2f, 0x58, 0xd4, 0xee, 0x6c, 0x91, 0x08, 0xaf, 0x4e, 0x17, 0xd4, 0x14, 0x58, 0xfb, 0x61,
0xb0, 0xd0, 0x89, 0x0d, 0xbe, 0xeb, 0x3e, 0x01, 0x98, 0x9b, 0x76, 0x91, 0x8a, 0x14, 0xea, 0x45,
0xa4, 0x69, 0x23, 0x1e, 0xd1, 0x3c, 0x74, 0xab, 0x14, 0x06, 0xd4, 0xc9, 0x6e, 0x9f, 0x69, 0xf3,
0xde, 0x99, 0xd0, 0x6b, 0xe4, 0xd8, 0x12, 0x6b, 0xd4, 0x72, 0x18, 0xbd, 0xe3, 0x0c, 0x4b, 0xa6,
0x7e, 0x4d, 0x11, 0xf6, 0xaa, 0x2b, 0x98, 0xa2, 0x35, 0x8f, 0x5a, 0x68, 0x09, 0x38, 0x22, 0xe6,
0x38, 0xd2, 0x42, 0xea, 0x2f, 0x4f, 0xd0, 0xb4, 0x64, 0xaf, 0xb0, 0xb8, 0xd8, 0xcb, 0x74, 0x25,
0xb6, 0x22, 0xcc, 0x62, 0x0a, 0x5b, 0x54, 0xed, 0xdf, 0x17, 0x50, 0x0a, 0xfa, 0x79, 0x02, 0x49,
0x6f, 0x09, 0x7a, 0xe6, 0x3e, 0x4c, 0x1c, 0xf6, 0x3a, 0x03, 0x28, 0xfe, 0x0b, 0xa3, 0x6e, 0x86,
0x2e, 0x74, 0x5d, 0xd1, 0x6b, 0x9c, 0xa2, 0x5d, 0x9a, 0x94, 0xd8, 0x0c, 0xbf, 0x08, 0x96, 0xa8,
0x4d, 0x05, 0xc6, 0x5c, 0x68, 0x5d, 0x81, 0x0e, 0x6d, 0x90, 0xcf, 0xdc, 0x50, 0x00, 0xd2, 0x5a,
0x12, 0x23, 0x67, 0x4c, 0x68, 0x46, 0xdd, 0x9d, 0x86, 0x93, 0x44, 0x95, 0x78, 0x5d, 0x93, 0x3d,
0x04, 0x4c, 0x48, 0xfa, 0x15, 0x45, 0x83, 0x66, 0x85, 0x9a, 0x21, 0x16, 0x34, 0x80, 0x57, 0xb9,
0xbd, 0x7d, 0xd8, 0x6d, 0x0a, 0x3b, 0xa4, 0xb9, 0x11, 0x0f, 0xe7, 0xb9, 0x94, 0xbb, 0x5b, 0xd1,
0x27, 0x19, 0x15, 0xd6, 0x6b, 0xf4, 0xd8, 0x4d, 0x38, 0x1b, 0x81, 0xee, 0x5f, 0x9f, 0xbf, 0x14,
0xe9, 0x2b, 0x25, 0xa1, 0xf1, 0x5a, 0x30, 0x30, 0x5a, 0xfd, 0xe1, 0xa0, 0x73, 0xb0, 0x3f, 0xf8,
0xd2, 0x7f, 0x4d, 0xe6, 0x7d, 0x2d, 0x73, 0x06, 0xd5, 0xfd, 0xab, 0x8a, 0xfe, 0xca, 0x7b, 0xff,
0xb8, 0xb8, 0xde, 0xff, 0xf5, 0x55, 0x2d, 0x1f, 0x78, 0xef, 0x9f, 0x95, 0x90, 0x38, 0x71, 0xef,
0x9f, 0x89, 0xf1, 0xfe, 0x97, 0xc4, 0xc4, 0xaf, 0x2a, 0xfb, 0xcb, 0x4a, 0xd6, 0x5a, 0x7e, 0x4d,
0xee, 0x1d, 0xf2, 0xf8, 0x7a, 0x26, 0x32, 0x31, 0x9e, 0x98, 0x4b, 0xcc, 0xe0, 0x1f, 0x4b, 0x23,
0xf1, 0x6e, 0x7e, 0x28, 0x80, 0x14, 0x6f, 0xdc, 0x5c, 0x23, 0x18, 0x88, 0x64, 0xab, 0xbd, 0x92,
0x5a, 0x27, 0xa3, 0xfd, 0x5b, 0x4f, 0xa5, 0xe5, 0xff, 0x7d, 0x06, 0x6e, 0xd2, 0x80, 0x4f, 0xe9,
0x40, 0x5f, 0x01, 0xf4, 0x49, 0x40, 0xbf, 0x6d, 0xfe, 0x07, 0x10, 0x1c, 0x76, 0x1f, 0xeb, 0x14,
0x00, 0x00
}; };
// Autogenerated from wled00/data/settings_leds.htm, do not edit!! // Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 7391; const uint16_t PAGE_settings_leds_length = 7391;
const uint8_t PAGE_settings_leds[] PROGMEM = { const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xdb, 0x56, 0xe3, 0x48, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3c, 0xdb, 0x56, 0xe3, 0x48,
0x92, 0xef, 0xfe, 0x8a, 0x24, 0xbb, 0x9b, 0x96, 0xc6, 0xc2, 0x96, 0x7c, 0xa1, 0x29, 0xdb, 0x32, 0x92, 0xef, 0xfe, 0x8a, 0x24, 0xbb, 0x9b, 0x96, 0xc6, 0xc2, 0x96, 0x7c, 0xa1, 0x29, 0xdb, 0x32,
0x8b, 0x81, 0xaa, 0x66, 0x06, 0x1a, 0x0e, 0xa6, 0xbb, 0x66, 0x4e, 0x75, 0x9d, 0x2a, 0x59, 0x4a, 0x8b, 0x81, 0xaa, 0x66, 0x06, 0x1a, 0x0e, 0xa6, 0xbb, 0x66, 0x4e, 0x75, 0x9d, 0x2a, 0x59, 0x4a,
0xdb, 0x2a, 0x64, 0xc9, 0x23, 0xc9, 0x80, 0x17, 0xbc, 0xdf, 0xb4, 0xdf, 0xb0, 0x5f, 0xb6, 0x11, 0xdb, 0x2a, 0x64, 0xc9, 0x23, 0xc9, 0x80, 0x17, 0xbc, 0xdf, 0xb4, 0xdf, 0xb0, 0x5f, 0xb6, 0x11,
@ -707,7 +741,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
// Autogenerated from wled00/data/settings_dmx.htm, do not edit!! // Autogenerated from wled00/data/settings_dmx.htm, do not edit!!
const uint16_t PAGE_settings_dmx_length = 1612; const uint16_t PAGE_settings_dmx_length = 1612;
const uint8_t PAGE_settings_dmx[] PROGMEM = { const uint8_t PAGE_settings_dmx[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36,
0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49, 0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49,
0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a, 0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a,
0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69, 0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69,
@ -814,7 +848,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = {
// Autogenerated from wled00/data/settings_ui.htm, do not edit!! // Autogenerated from wled00/data/settings_ui.htm, do not edit!!
const uint16_t PAGE_settings_ui_length = 3090; const uint16_t PAGE_settings_ui_length = 3090;
const uint8_t PAGE_settings_ui[] PROGMEM = { const uint8_t PAGE_settings_ui[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48,
0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40, 0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40,
0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4, 0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4,
0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60, 0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60,
@ -1014,7 +1048,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = {
// Autogenerated from wled00/data/settings_sync.htm, do not edit!! // Autogenerated from wled00/data/settings_sync.htm, do not edit!!
const uint16_t PAGE_settings_sync_length = 3345; const uint16_t PAGE_settings_sync_length = 3345;
const uint8_t PAGE_settings_sync[] PROGMEM = { const uint8_t PAGE_settings_sync[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x5a, 0xeb, 0x73, 0xe2, 0x38, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0xeb, 0x73, 0xe2, 0x38,
0x12, 0xff, 0xee, 0xbf, 0x42, 0xe3, 0xad, 0x9a, 0x83, 0x0d, 0x01, 0x13, 0x42, 0x26, 0x93, 0x60, 0x12, 0xff, 0xee, 0xbf, 0x42, 0xe3, 0xad, 0x9a, 0x83, 0x0d, 0x01, 0x13, 0x42, 0x26, 0x93, 0x60,
0xcf, 0x85, 0x90, 0x49, 0xb8, 0x9d, 0x24, 0x0c, 0x24, 0xfb, 0xa8, 0xba, 0xaa, 0x2d, 0x61, 0x0b, 0xcf, 0x85, 0x90, 0x49, 0xb8, 0x9d, 0x24, 0x0c, 0x24, 0xfb, 0xa8, 0xba, 0xaa, 0x2d, 0x61, 0x0b,
0x70, 0x62, 0x5b, 0x5e, 0x4b, 0xce, 0xa3, 0x66, 0xe7, 0x7f, 0xbf, 0x6e, 0xc9, 0x36, 0xe0, 0xf0, 0x70, 0x62, 0x5b, 0x5e, 0x4b, 0xce, 0xa3, 0x66, 0xe7, 0x7f, 0xbf, 0x6e, 0xc9, 0x36, 0xe0, 0xf0,
@ -1230,7 +1264,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = {
// Autogenerated from wled00/data/settings_time.htm, do not edit!! // Autogenerated from wled00/data/settings_time.htm, do not edit!!
const uint16_t PAGE_settings_time_length = 3313; const uint16_t PAGE_settings_time_length = 3313;
const uint8_t PAGE_settings_time[] PROGMEM = { const uint8_t PAGE_settings_time[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38,
0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x98, 0x78, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0xdd, 0x10, 0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x98, 0x78, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0xdd, 0x10,
0xd2, 0x42, 0x4b, 0x02, 0x67, 0x92, 0x0e, 0xbb, 0xd3, 0xf6, 0x4c, 0x15, 0x5b, 0x49, 0x0c, 0x8e, 0xd2, 0x42, 0x4b, 0x02, 0x67, 0x92, 0x0e, 0xbb, 0xd3, 0xf6, 0x4c, 0x15, 0x5b, 0x49, 0x0c, 0x8e,
0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x7b, 0x25, 0x39, 0xce, 0xd3, 0xd0, 0x76, 0x66, 0x3f, 0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x7b, 0x25, 0x39, 0xce, 0xd3, 0xd0, 0x76, 0x66, 0x3f,
@ -1444,7 +1478,7 @@ const uint8_t PAGE_settings_time[] PROGMEM = {
// Autogenerated from wled00/data/settings_sec.htm, do not edit!! // Autogenerated from wled00/data/settings_sec.htm, do not edit!!
const uint16_t PAGE_settings_sec_length = 2405; const uint16_t PAGE_settings_sec_length = 2405;
const uint8_t PAGE_settings_sec[] PROGMEM = { const uint8_t PAGE_settings_sec[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48,
0x12, 0xfe, 0xee, 0x5f, 0x31, 0x4c, 0xaa, 0x58, 0xeb, 0x22, 0x2c, 0x43, 0x72, 0x5b, 0x09, 0x20, 0x12, 0xfe, 0xee, 0x5f, 0x31, 0x4c, 0xaa, 0x58, 0xeb, 0x22, 0x2c, 0x43, 0x72, 0x5b, 0x09, 0x20,
0xe7, 0x20, 0x90, 0x0d, 0x57, 0x10, 0x28, 0x6c, 0x36, 0x77, 0x95, 0x4b, 0xa5, 0xc6, 0xd2, 0xd8, 0xe7, 0x20, 0x90, 0x0d, 0x57, 0x10, 0x28, 0x6c, 0x36, 0x77, 0x95, 0x4b, 0xa5, 0xc6, 0xd2, 0xd8,
0x9a, 0x58, 0xd6, 0x68, 0x67, 0x46, 0x38, 0xbe, 0xec, 0xfe, 0xf7, 0x7b, 0x7a, 0x24, 0xd9, 0x86, 0x9a, 0x58, 0xd6, 0x68, 0x67, 0x46, 0x38, 0xbe, 0xec, 0xfe, 0xf7, 0x7b, 0x7a, 0x24, 0xd9, 0x86,
@ -1599,180 +1633,186 @@ const uint8_t PAGE_settings_sec[] PROGMEM = {
// Autogenerated from wled00/data/settings_um.htm, do not edit!! // Autogenerated from wled00/data/settings_um.htm, do not edit!!
const uint16_t PAGE_settings_um_length = 2640; const uint16_t PAGE_settings_um_length = 2728;
const uint8_t PAGE_settings_um[] PROGMEM = { const uint8_t PAGE_settings_um[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x59, 0xfb, 0x6f, 0xdb, 0x38, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xcd, 0x59, 0xfb, 0x6f, 0xdb, 0x38,
0x12, 0xfe, 0x3d, 0x7f, 0x85, 0xc2, 0x06, 0x89, 0x04, 0x2b, 0xb2, 0xd3, 0xee, 0x02, 0x5d, 0xdb, 0x12, 0xfe, 0x3d, 0x7f, 0x85, 0xc2, 0x06, 0x89, 0x04, 0x2b, 0xb2, 0xd3, 0xee, 0x02, 0x5d, 0xdb,
0x74, 0xae, 0x4d, 0xbb, 0x5b, 0x5f, 0x1f, 0x09, 0xe0, 0x7d, 0xe0, 0x90, 0x0b, 0x1a, 0x59, 0xa2, 0x54, 0xae, 0x4d, 0xbb, 0x5b, 0x5f, 0x1f, 0x09, 0x90, 0x7d, 0xe0, 0x90, 0x0b, 0x1a, 0xd9, 0xa2,
0x6d, 0x36, 0x32, 0xa9, 0x13, 0xa9, 0x3c, 0xce, 0xf1, 0xff, 0x7e, 0xdf, 0x50, 0x92, 0x1f, 0x69, 0x6d, 0x36, 0x32, 0xa9, 0x93, 0xa8, 0x3c, 0xce, 0xf1, 0xff, 0x7e, 0xdf, 0x50, 0x0f, 0xcb, 0xa9,
0x52, 0xec, 0xf6, 0x70, 0xc0, 0xfd, 0x12, 0x4b, 0xe4, 0xcc, 0x68, 0x38, 0x8f, 0x6f, 0x66, 0x98, 0x53, 0xec, 0x16, 0x58, 0xe0, 0x7e, 0x89, 0x25, 0x6a, 0x66, 0x38, 0x9c, 0xc7, 0x37, 0x33, 0xcc,
0xfe, 0xee, 0x9b, 0xd3, 0x93, 0x5f, 0xff, 0x71, 0xf6, 0xd6, 0x9b, 0xd9, 0x79, 0x36, 0xe8, 0xd7, 0x70, 0xf7, 0xcd, 0xe9, 0xc9, 0xaf, 0xff, 0x3a, 0x7b, 0xeb, 0xcc, 0xcd, 0x22, 0x09, 0x87, 0xd5,
0x7f, 0x45, 0x9c, 0x7a, 0x59, 0xac, 0xa6, 0x9c, 0x09, 0xc5, 0x06, 0xfd, 0xb9, 0xb0, 0xb1, 0x97, 0x5f, 0x11, 0xc5, 0x4e, 0x12, 0xa9, 0x19, 0x67, 0x42, 0xb1, 0x70, 0xb8, 0x10, 0x26, 0x72, 0x26,
0xcc, 0xe2, 0xc2, 0x08, 0xcb, 0x59, 0x69, 0x27, 0x87, 0x2f, 0x9b, 0xd5, 0x1d, 0x15, 0xcf, 0x05, 0xf3, 0x28, 0xcb, 0x85, 0xe1, 0xac, 0x30, 0xd3, 0xc3, 0x97, 0xf5, 0xea, 0x8e, 0x8a, 0x16, 0x82,
0x67, 0xd7, 0x52, 0xdc, 0xe4, 0xba, 0xb0, 0xcc, 0x4b, 0xb4, 0xb2, 0x42, 0x81, 0xec, 0x46, 0xa6, 0xb3, 0x1b, 0x29, 0x6e, 0x53, 0x9d, 0x19, 0xe6, 0x4c, 0xb4, 0x32, 0x42, 0x81, 0xec, 0x56, 0xc6,
0x76, 0xc6, 0x7f, 0xec, 0x74, 0x56, 0xa4, 0x0f, 0xb6, 0x52, 0x71, 0x2d, 0x13, 0x71, 0xe8, 0x5e, 0x66, 0xce, 0x7f, 0xec, 0xf5, 0x1a, 0xd2, 0x47, 0x9f, 0x62, 0x71, 0x23, 0x27, 0xe2, 0xd0, 0xbe,
0x42, 0xa9, 0xa4, 0x95, 0x71, 0x76, 0x68, 0x92, 0x38, 0x13, 0xfc, 0x28, 0x9c, 0xc7, 0xb7, 0x72, 0xf8, 0x52, 0x49, 0x23, 0xa3, 0xe4, 0x30, 0x9f, 0x44, 0x89, 0xe0, 0x47, 0xfe, 0x22, 0xba, 0x93,
0x5e, 0xce, 0x57, 0xef, 0xa5, 0x11, 0x85, 0x7b, 0x89, 0xc7, 0x78, 0x57, 0x9a, 0x7d, 0xf5, 0xe5, 0x8b, 0x62, 0xd1, 0xbc, 0x17, 0xb9, 0xc8, 0xec, 0x4b, 0x34, 0xc6, 0xbb, 0xd2, 0xec, 0xab, 0x9d,
0x41, 0xdf, 0x4a, 0x9b, 0x89, 0xc1, 0x6f, 0xa0, 0x9c, 0xeb, 0xd4, 0x1b, 0x09, 0x6b, 0xa5, 0x9a, 0xc3, 0xa1, 0x91, 0x26, 0x11, 0xe1, 0x6f, 0xa0, 0x5c, 0xe8, 0xd8, 0x39, 0x17, 0xc6, 0x48, 0x35,
0x9a, 0x7e, 0xbb, 0x5a, 0xef, 0x9b, 0xa4, 0x90, 0xb9, 0x1d, 0xec, 0x5c, 0xc7, 0x85, 0xa7, 0x6f, 0xcb, 0x87, 0xdd, 0x72, 0x7d, 0x98, 0x4f, 0x32, 0x99, 0x9a, 0x70, 0xe7, 0x26, 0xca, 0x1c, 0x7d,
0x94, 0x28, 0xc2, 0x4c, 0x27, 0x32, 0x0f, 0xcb, 0x42, 0xdf, 0x98, 0x30, 0xe5, 0xa9, 0x4e, 0xca, 0xab, 0x44, 0xe6, 0x27, 0x7a, 0x22, 0x53, 0xbf, 0xc8, 0xf4, 0x6d, 0xee, 0xc7, 0x3c, 0xd6, 0x93,
0x39, 0xf4, 0x0b, 0xcb, 0xf9, 0xc9, 0x64, 0xca, 0x17, 0xcb, 0x30, 0x97, 0xca, 0xf0, 0xf3, 0x0b, 0x62, 0x01, 0xfd, 0xfc, 0x62, 0x71, 0x32, 0x9d, 0xf1, 0xe5, 0xca, 0x4f, 0xa5, 0xca, 0xf9, 0xc5,
0xfa, 0x3d, 0xa5, 0x5f, 0xd0, 0xf3, 0xdd, 0xa3, 0x50, 0x95, 0xf3, 0x8f, 0xbc, 0xd3, 0x9b, 0x94, 0x25, 0xfd, 0x9e, 0xd2, 0x2f, 0xe8, 0xf9, 0xee, 0x91, 0xaf, 0x8a, 0xc5, 0x47, 0xde, 0x1b, 0x4c,
0x2a, 0xb1, 0x52, 0x2b, 0x6f, 0x3a, 0x4c, 0x7d, 0x11, 0x2c, 0x0a, 0x61, 0xcb, 0x42, 0x79, 0x69, 0x0b, 0x35, 0x31, 0x52, 0x2b, 0x67, 0x36, 0x8a, 0x5d, 0xe1, 0x2d, 0x33, 0x61, 0x8a, 0x4c, 0x39,
0x34, 0x15, 0xf6, 0x6d, 0x26, 0x48, 0xd4, 0xeb, 0x3b, 0xb7, 0xb5, 0x5c, 0x91, 0x4a, 0x73, 0xba, 0x71, 0x30, 0x13, 0xe6, 0x6d, 0x22, 0x48, 0xd4, 0xeb, 0x7b, 0xfb, 0x69, 0xd5, 0x90, 0xca, 0xfc,
0x41, 0x2a, 0xf6, 0xf7, 0x99, 0x1e, 0x7f, 0x11, 0x89, 0x65, 0x9c, 0xdb, 0xbb, 0x5c, 0xe8, 0x09, 0xb4, 0x45, 0x2a, 0xf6, 0xf7, 0x99, 0x1e, 0x7f, 0x11, 0x13, 0xc3, 0x38, 0x37, 0xf7, 0xa9, 0xd0,
0xad, 0xed, 0xbe, 0x2a, 0x8a, 0xf8, 0x2e, 0x92, 0xc6, 0xfd, 0x6e, 0xf1, 0xbf, 0xf3, 0x83, 0xc5, 0x53, 0x5a, 0xdb, 0x7d, 0x95, 0x65, 0xd1, 0x7d, 0x20, 0x73, 0xfb, 0xbb, 0xc1, 0xff, 0xce, 0xf5,
0x8d, 0x54, 0xa9, 0xbe, 0x89, 0x74, 0x2e, 0x94, 0xcf, 0x66, 0xd6, 0xe6, 0xa6, 0xdb, 0x6e, 0x4f, 0x96, 0xb7, 0x52, 0xc5, 0xfa, 0x36, 0xd0, 0xa9, 0x50, 0x2e, 0x9b, 0x1b, 0x93, 0xe6, 0xfd, 0x6e,
0xa5, 0x9d, 0x95, 0xe3, 0x28, 0xd1, 0xf3, 0xf6, 0x2b, 0x59, 0x24, 0x5a, 0xeb, 0x2b, 0x29, 0xda, 0x77, 0x26, 0xcd, 0xbc, 0x18, 0x07, 0x13, 0xbd, 0xe8, 0xbe, 0x92, 0xd9, 0x44, 0x6b, 0x7d, 0x2d,
0x7f, 0x7c, 0x78, 0xfb, 0xa6, 0x7d, 0x23, 0xaf, 0x64, 0xbb, 0xb1, 0xc6, 0xb3, 0xb2, 0x32, 0xcf, 0x45, 0xf7, 0x8f, 0x0f, 0x6f, 0xdf, 0x74, 0x6f, 0xe5, 0xb5, 0xec, 0xd6, 0xd6, 0x78, 0x56, 0x94,
0xa1, 0xa9, 0x17, 0xd8, 0x86, 0xf4, 0xd7, 0x0f, 0xa5, 0xb7, 0x57, 0x54, 0x21, 0xfb, 0x6c, 0x44, 0xe6, 0x39, 0xcc, 0xab, 0x05, 0xd6, 0x92, 0xfe, 0xfa, 0xb1, 0xf4, 0x6e, 0x43, 0xe5, 0xb3, 0xcf,
0x36, 0xd9, 0xa4, 0xce, 0x74, 0x9c, 0xfe, 0x7d, 0xe4, 0x8b, 0xd0, 0xf2, 0xdd, 0x4e, 0xb0, 0xc8, 0xb9, 0x48, 0xa6, 0x6d, 0xea, 0x44, 0x47, 0xf1, 0x3f, 0xcf, 0x5d, 0xe1, 0x1b, 0xbe, 0xdb, 0xf3,
0x84, 0xf5, 0x14, 0x4f, 0xa3, 0xa4, 0x10, 0xb1, 0x15, 0xb5, 0x01, 0x7c, 0x56, 0x59, 0x9d, 0x05, 0x96, 0x89, 0x30, 0x8e, 0xe2, 0x71, 0x30, 0xc9, 0x44, 0x64, 0x44, 0x65, 0x00, 0x97, 0x95, 0x56,
0x3d, 0x15, 0x41, 0xd8, 0x2b, 0x6b, 0x0b, 0x39, 0x2e, 0xad, 0xc0, 0x46, 0x91, 0xb0, 0x50, 0x04, 0x67, 0xde, 0x40, 0x05, 0x10, 0xf6, 0xca, 0x98, 0x4c, 0x8e, 0x0b, 0x23, 0xf0, 0x21, 0x9b, 0x30,
0xe1, 0xc3, 0x75, 0xb2, 0x03, 0x3e, 0x67, 0xc5, 0xad, 0x6d, 0x7f, 0x89, 0xaf, 0xe3, 0x46, 0xc0, 0x5f, 0x78, 0xfe, 0xe3, 0x75, 0xb2, 0x03, 0xb6, 0x33, 0xe2, 0xce, 0x74, 0xbf, 0x44, 0x37, 0x51,
0x57, 0x84, 0xb1, 0xb9, 0x53, 0x10, 0x61, 0x83, 0x30, 0x8d, 0xc6, 0x3a, 0xbd, 0x8b, 0xe2, 0x1c, 0x2d, 0xe0, 0x2b, 0xc2, 0x28, 0xbf, 0x57, 0x10, 0x61, 0x3c, 0x3f, 0x0e, 0xc6, 0x3a, 0xbe, 0x0f,
0x4a, 0xa7, 0x27, 0x33, 0x99, 0xa5, 0xbe, 0x22, 0xfa, 0x38, 0x4d, 0xdf, 0x5e, 0x43, 0x8b, 0x0f, 0xa2, 0x14, 0x4a, 0xc7, 0x27, 0x73, 0x99, 0xc4, 0xae, 0x22, 0xfa, 0x28, 0x8e, 0xdf, 0xde, 0x40,
0xd2, 0x20, 0xf0, 0x44, 0xe1, 0x33, 0xd2, 0x99, 0x85, 0x7e, 0xc0, 0x07, 0x8b, 0x34, 0x2a, 0xe7, 0x8b, 0x0f, 0x32, 0x47, 0xe0, 0x89, 0xcc, 0x65, 0xa4, 0x33, 0xf3, 0x5d, 0x8f, 0x87, 0xcb, 0x38,
0x9f, 0x73, 0x72, 0x6b, 0x1a, 0x15, 0xe6, 0x3a, 0xad, 0x9f, 0xf4, 0xe7, 0xc6, 0xeb, 0x69, 0x84, 0x28, 0x16, 0x9f, 0x53, 0x72, 0x6b, 0x1c, 0x64, 0xf9, 0x4d, 0x5c, 0x3d, 0xe9, 0xcf, 0xb5, 0xd7,
0x20, 0xfc, 0x3c, 0xcd, 0xa5, 0xe6, 0x2f, 0x7e, 0x0a, 0x7f, 0x11, 0xf6, 0x77, 0x3f, 0xe8, 0x4d, 0xe3, 0x00, 0x41, 0xf8, 0x79, 0x96, 0x4a, 0xcd, 0x5f, 0xfc, 0xe4, 0xff, 0x22, 0xcc, 0xef, 0xae,
0x74, 0xe1, 0xd3, 0x49, 0x05, 0x02, 0x40, 0xf4, 0x2b, 0xce, 0x28, 0x13, 0x6a, 0x6a, 0x67, 0x3d, 0x37, 0x98, 0xea, 0xcc, 0xa5, 0x93, 0x0a, 0x04, 0x80, 0x18, 0x96, 0x9c, 0x41, 0x22, 0xd4, 0xcc,
0xd1, 0x6a, 0x05, 0xc4, 0x1c, 0xe5, 0xa5, 0x99, 0xf9, 0xd5, 0xde, 0xb9, 0xb8, 0x08, 0x5c, 0xfc, 0xcc, 0x07, 0xa2, 0xd3, 0xf1, 0x88, 0x39, 0x48, 0x8b, 0x7c, 0xee, 0x96, 0xdf, 0x2e, 0xc4, 0xa5,
0x54, 0x8b, 0x8c, 0xd6, 0x60, 0x8c, 0xc3, 0x23, 0xce, 0x2b, 0x05, 0xce, 0x3b, 0x17, 0xfb, 0xfb, 0x67, 0xe3, 0xa7, 0x5c, 0x64, 0xb4, 0x06, 0x63, 0x1c, 0x1e, 0x71, 0x5e, 0x2a, 0x70, 0xd1, 0xbb,
0xd5, 0x63, 0x64, 0x66, 0x72, 0x62, 0x7d, 0x3a, 0xcf, 0x68, 0x12, 0x8d, 0xde, 0xbc, 0x22, 0x05, 0xdc, 0xdf, 0x2f, 0x1f, 0x83, 0x7c, 0x2e, 0xa7, 0xc6, 0xa5, 0xf3, 0x9c, 0x4f, 0x83, 0xf3, 0x37,
0xf8, 0x5a, 0x8d, 0x7a, 0xfd, 0xe4, 0xc3, 0xa3, 0xeb, 0x1f, 0x4f, 0x47, 0xc3, 0xa7, 0x18, 0xde, 0xaf, 0x48, 0x01, 0xbe, 0x56, 0xa3, 0x5a, 0x3f, 0xf9, 0xb0, 0x75, 0xfd, 0xe3, 0xe9, 0xf9, 0xe8,
0x3f, 0xce, 0x31, 0x1c, 0x9d, 0x3e, 0xd8, 0x58, 0x3e, 0x6e, 0x36, 0x51, 0x14, 0xba, 0x80, 0xb7, 0x29, 0x86, 0xf7, 0xdb, 0x39, 0x46, 0xe7, 0xa7, 0x8f, 0x3e, 0xac, 0xb6, 0x9b, 0x4d, 0x64, 0x99,
0x60, 0x36, 0x24, 0xb1, 0xd1, 0x99, 0x88, 0x32, 0x3d, 0xf5, 0xd9, 0x5b, 0x5a, 0xf7, 0xea, 0x58, 0xce, 0xe0, 0x2d, 0x98, 0x0d, 0x49, 0x9c, 0xeb, 0x44, 0x04, 0x89, 0x9e, 0xb9, 0xec, 0x2d, 0xad,
0x40, 0x9c, 0x78, 0x13, 0x99, 0x09, 0xe7, 0x55, 0x64, 0x6d, 0x01, 0xef, 0x7f, 0xa8, 0xd7, 0x11, 0x3b, 0x55, 0x2c, 0x20, 0x4e, 0x9c, 0xa9, 0x4c, 0x84, 0xf5, 0x2a, 0xb2, 0x36, 0x83, 0xf7, 0x3f,
0xd8, 0x60, 0x9c, 0xc8, 0x69, 0x59, 0xc4, 0x2e, 0x78, 0x2a, 0xaf, 0x7a, 0x93, 0x18, 0x0c, 0x69, 0x54, 0xeb, 0x08, 0x6c, 0x30, 0x4e, 0xe5, 0xac, 0xc8, 0x22, 0x1b, 0x3c, 0xa5, 0x57, 0x9d, 0x69,
0xf4, 0x4f, 0x35, 0x54, 0x08, 0xdd, 0x1c, 0x96, 0x15, 0x5e, 0x1e, 0x4f, 0x85, 0x97, 0xc6, 0x36, 0x04, 0x86, 0x38, 0xf8, 0xb7, 0x1a, 0x29, 0x84, 0x6e, 0x0a, 0xcb, 0x0a, 0x27, 0x8d, 0x66, 0xc2,
0xde, 0x45, 0xb4, 0x6d, 0xc4, 0xdb, 0x08, 0xd1, 0xc9, 0xe8, 0x03, 0x5d, 0x64, 0x4b, 0x1d, 0xa6, 0x89, 0x23, 0x13, 0xed, 0x22, 0xda, 0x5a, 0xf1, 0x76, 0x8e, 0xe8, 0x64, 0xb4, 0x41, 0x1f, 0xd9,
0xc8, 0x48, 0x27, 0x2f, 0xca, 0x0b, 0x6d, 0x75, 0xa2, 0xb3, 0xfd, 0x7d, 0xdf, 0x65, 0x69, 0x27, 0x52, 0x85, 0x29, 0x32, 0xd2, 0xca, 0x0b, 0xd2, 0x4c, 0x1b, 0x3d, 0xd1, 0xc9, 0xfe, 0xbe, 0x6b,
0xf4, 0x5d, 0x76, 0x73, 0xa2, 0xc8, 0x46, 0x56, 0x17, 0x90, 0x4a, 0x99, 0x39, 0xb4, 0x62, 0x4e, 0xb3, 0xb4, 0xe7, 0xbb, 0x36, 0xbb, 0x39, 0x51, 0x24, 0xe7, 0x46, 0x67, 0x90, 0x4a, 0x99, 0x39,
0x71, 0x90, 0x0c, 0x73, 0x16, 0x04, 0xf7, 0xf7, 0x35, 0x19, 0xf8, 0xe7, 0x39, 0x14, 0xfe, 0x19, 0x32, 0x62, 0x41, 0x71, 0x30, 0x19, 0xa5, 0xcc, 0xf3, 0x1e, 0x1e, 0x2a, 0x32, 0xf0, 0x2f, 0x52,
0xf2, 0xbd, 0x8f, 0x3a, 0x15, 0x91, 0x77, 0x96, 0x89, 0xd8, 0x08, 0x0f, 0x86, 0x10, 0x85, 0x47, 0x28, 0xfc, 0x33, 0xe4, 0x3b, 0x1f, 0x75, 0x2c, 0x02, 0xe7, 0x2c, 0x11, 0x51, 0x2e, 0x1c, 0x18,
0x99, 0xe4, 0x0d, 0xcf, 0xa0, 0x52, 0xb8, 0x25, 0xd1, 0x6c, 0x4b, 0xac, 0x20, 0x25, 0x08, 0x40, 0x42, 0x64, 0x0e, 0x65, 0x92, 0x33, 0x3a, 0x83, 0x4a, 0xfe, 0x86, 0xc4, 0x7c, 0x53, 0x62, 0x09,
0x95, 0x42, 0x5f, 0x07, 0x15, 0xf8, 0x06, 0x21, 0x04, 0x2b, 0xe7, 0x2c, 0x88, 0xa4, 0x82, 0x41, 0x29, 0x9e, 0x07, 0xaa, 0x18, 0xfa, 0x5a, 0xa8, 0xc0, 0x1e, 0x84, 0x10, 0xac, 0x58, 0x30, 0x2f,
0xdf, 0xfd, 0xfa, 0xf1, 0x03, 0x67, 0x9f, 0xb4, 0x57, 0x63, 0x95, 0xf1, 0x10, 0x35, 0x36, 0xce, 0x90, 0x0a, 0x06, 0x7d, 0xf7, 0xeb, 0xc7, 0x0f, 0x9c, 0x7d, 0xd2, 0x4e, 0x85, 0x55, 0xb9, 0x83,
0xc8, 0x14, 0x6c, 0x0b, 0x2d, 0x7e, 0xde, 0x44, 0x0b, 0xce, 0x79, 0x0b, 0xf0, 0x20, 0x76, 0x39, 0xa8, 0x31, 0x51, 0x42, 0xa6, 0x60, 0x1b, 0x68, 0xf1, 0x73, 0x1b, 0x2d, 0x38, 0xe7, 0x1d, 0xc0,
0xf7, 0x3b, 0xf7, 0xdb, 0xb0, 0x32, 0x7c, 0x8c, 0x90, 0x7f, 0x45, 0x98, 0xcc, 0x44, 0x72, 0x45, 0x83, 0xd8, 0xe5, 0xdc, 0xed, 0x3d, 0x6c, 0xc2, 0xca, 0x68, 0x1b, 0x21, 0xff, 0x8a, 0x70, 0x32,
0x29, 0x1b, 0x2c, 0x08, 0x06, 0x15, 0x17, 0x11, 0xc1, 0x68, 0x54, 0x88, 0x3c, 0x8b, 0x13, 0x24, 0x17, 0x93, 0x6b, 0x4a, 0x59, 0x6f, 0x49, 0x30, 0xa8, 0xb8, 0x08, 0x08, 0x46, 0x83, 0x4c, 0xa4,
0xd5, 0xf9, 0x05, 0x72, 0x0f, 0x7a, 0x9a, 0x72, 0x6c, 0x6c, 0xe1, 0x1f, 0xbe, 0x08, 0x7a, 0x72, 0x49, 0x34, 0x41, 0x52, 0x5d, 0x5c, 0x22, 0xf7, 0xa0, 0x67, 0x5e, 0x8c, 0x73, 0x93, 0xb9, 0x87,
0xe2, 0x33, 0x9c, 0x63, 0x2c, 0x0a, 0xd8, 0x5d, 0x44, 0x94, 0x9f, 0xc0, 0x2d, 0xc4, 0x34, 0x5e, 0x2f, 0xbc, 0x81, 0x9c, 0xba, 0x0c, 0xe7, 0x18, 0x8b, 0x0c, 0x76, 0x17, 0x01, 0xe5, 0x27, 0x70,
0x55, 0x43, 0xd8, 0x09, 0x5f, 0x04, 0xc1, 0x82, 0xb2, 0x83, 0xe4, 0x4a, 0x64, 0x87, 0xec, 0xbb, 0x0b, 0x31, 0x8d, 0x57, 0x55, 0x13, 0xf6, 0xfc, 0x17, 0x9e, 0xb7, 0xa4, 0xec, 0x20, 0xb9, 0x12,
0x5c, 0xa8, 0x73, 0x43, 0x22, 0x37, 0x20, 0xc8, 0xee, 0x72, 0x4a, 0x86, 0x73, 0x79, 0x11, 0x2c, 0xd9, 0x21, 0x87, 0x36, 0x17, 0xaa, 0xdc, 0x90, 0xc8, 0x0d, 0x08, 0x32, 0xbb, 0x9c, 0x92, 0xe1,
0xf0, 0x2a, 0xa2, 0xeb, 0x38, 0x2b, 0xa1, 0x27, 0x91, 0x62, 0x11, 0x72, 0xe5, 0x04, 0x62, 0xd7, 0x42, 0x5e, 0x7a, 0x4b, 0xbc, 0x8a, 0xe0, 0x26, 0x4a, 0x0a, 0xe8, 0x49, 0xa4, 0x58, 0x84, 0x5c,
0x44, 0xb0, 0xb0, 0xbd, 0x43, 0xb8, 0xc1, 0xb5, 0xba, 0xe0, 0x2c, 0x93, 0x73, 0xc1, 0x7a, 0x63, 0x39, 0x85, 0xd8, 0x35, 0x11, 0x2c, 0x6c, 0xee, 0x11, 0x6e, 0x70, 0xad, 0xce, 0x38, 0x4b, 0xe4,
0x40, 0xcc, 0xd5, 0xf2, 0x11, 0xfe, 0xfb, 0xfb, 0x7a, 0xa5, 0x7f, 0x78, 0xb4, 0x7a, 0x1e, 0xac, 0x42, 0xb0, 0xc1, 0x18, 0x10, 0x73, 0xbd, 0xda, 0xc2, 0xff, 0xf0, 0x50, 0xad, 0x0c, 0x0f, 0x8f,
0xc3, 0xfb, 0x2b, 0x79, 0x85, 0x48, 0x1b, 0x71, 0xdb, 0x3b, 0x0e, 0x09, 0x88, 0x25, 0x32, 0x7a, 0x9a, 0xe7, 0x70, 0x1d, 0xde, 0x5f, 0xc9, 0xcb, 0x44, 0x5c, 0x8b, 0xdb, 0xfc, 0x62, 0x91, 0x80,
0x2e, 0x7c, 0xcb, 0x07, 0x16, 0x5f, 0xa1, 0x0a, 0x38, 0x04, 0xaa, 0xd5, 0x92, 0xc3, 0xa3, 0x4e, 0x58, 0x82, 0x5c, 0x2f, 0x84, 0x6b, 0x78, 0x68, 0xb0, 0x0b, 0x55, 0xc0, 0x11, 0x50, 0xad, 0x92,
0x10, 0x1c, 0x33, 0x44, 0x82, 0x9a, 0x0a, 0xd6, 0x65, 0xcf, 0x26, 0x93, 0x09, 0x5b, 0x2e, 0x45, 0xec, 0x1f, 0xf5, 0x3c, 0xef, 0x98, 0x21, 0x12, 0xd4, 0x4c, 0xb0, 0x3e, 0x7b, 0x36, 0x9d, 0x4e,
0x66, 0xc4, 0xc2, 0xdc, 0x48, 0x9b, 0xcc, 0xfc, 0xca, 0xbe, 0xc1, 0x22, 0x41, 0x28, 0x31, 0xa4, 0xd9, 0x6a, 0x25, 0x92, 0x5c, 0x2c, 0xf3, 0x5b, 0x69, 0x26, 0x73, 0xb7, 0xb4, 0xaf, 0xb7, 0x9c,
0x34, 0xeb, 0x56, 0x4f, 0x27, 0x1f, 0xea, 0x27, 0x4a, 0xdb, 0xf5, 0xe2, 0xfb, 0x66, 0x15, 0xa9, 0x20, 0x94, 0x18, 0x52, 0x9a, 0xf5, 0xcb, 0xa7, 0x93, 0x0f, 0xd5, 0x13, 0xa5, 0xed, 0x7a, 0xf1,
0xc9, 0xba, 0x4e, 0xb1, 0x5e, 0x2a, 0x26, 0x71, 0x99, 0xd9, 0x6e, 0xe5, 0xdd, 0x25, 0xd9, 0xf8, 0x7d, 0xbd, 0x8a, 0xd4, 0x64, 0x7d, 0xab, 0xd8, 0x20, 0x16, 0xd3, 0xa8, 0x48, 0x4c, 0xbf, 0xf4,
0x71, 0xfb, 0x7e, 0x97, 0x45, 0xad, 0x9e, 0xc7, 0x56, 0xff, 0xdf, 0xdb, 0x74, 0x1d, 0xc2, 0xc8, 0xee, 0x8a, 0x6c, 0xbc, 0xdd, 0xbe, 0xdf, 0x65, 0x51, 0xa3, 0x17, 0x91, 0xd1, 0xff, 0xf7, 0x36,
0xe1, 0x33, 0x68, 0x46, 0xf1, 0x0e, 0x6d, 0xab, 0x82, 0x1a, 0x90, 0x51, 0x08, 0x99, 0xec, 0xb9, 0x5d, 0x87, 0x30, 0x72, 0xf8, 0x0c, 0x9a, 0x51, 0xbc, 0x43, 0xdb, 0xb2, 0xa0, 0x7a, 0x64, 0x14,
0x0a, 0xe5, 0x05, 0xd0, 0xe6, 0xd4, 0x95, 0xd5, 0x08, 0xc9, 0x5b, 0x48, 0x41, 0xc4, 0x41, 0x4d, 0x42, 0x26, 0x73, 0xa1, 0x7c, 0x79, 0x09, 0xb4, 0x39, 0xb5, 0x65, 0x35, 0x40, 0xf2, 0x66, 0x52,
0x2c, 0x83, 0xc0, 0x15, 0x7f, 0xae, 0xc2, 0x46, 0x92, 0x0c, 0x7a, 0xe4, 0x32, 0x8f, 0x02, 0xbd, 0x10, 0xb1, 0x57, 0x11, 0x4b, 0xcf, 0xb3, 0xc5, 0x9f, 0x2b, 0xbf, 0x96, 0x24, 0xbd, 0x01, 0xb9,
0x09, 0xeb, 0x6f, 0x24, 0x04, 0x49, 0xda, 0xae, 0xd0, 0xb2, 0x52, 0x80, 0x22, 0xdf, 0xc2, 0x33, 0xcc, 0xa1, 0x40, 0xaf, 0xc3, 0xfa, 0x1b, 0x09, 0x41, 0x92, 0x36, 0x2b, 0xb4, 0x2c, 0x15, 0xa0,
0xb6, 0x2f, 0x1b, 0xb7, 0x58, 0x0a, 0xfb, 0x73, 0x7b, 0x31, 0xe0, 0x1d, 0x20, 0xd3, 0xba, 0x38, 0xc8, 0x37, 0xf0, 0x8c, 0x19, 0xca, 0xda, 0x2d, 0x86, 0xc2, 0xfe, 0xc2, 0x5c, 0x86, 0xbc, 0x07,
0xd0, 0xda, 0x66, 0x5d, 0x70, 0x2a, 0x05, 0x8d, 0x1e, 0x5f, 0x51, 0x3f, 0x4d, 0xfa, 0x84, 0x2a, 0x64, 0x5a, 0x17, 0x07, 0x5a, 0x6b, 0xd7, 0x05, 0xab, 0x92, 0x57, 0xeb, 0xf1, 0x15, 0xf5, 0xd3,
0x8f, 0xa8, 0xb1, 0x3a, 0x2d, 0x7d, 0x7a, 0x6d, 0x4e, 0x80, 0xfd, 0xcf, 0x52, 0xa0, 0x62, 0x02, 0xa4, 0x4f, 0xa8, 0xb2, 0x45, 0x8d, 0xe6, 0xb4, 0xb4, 0x75, 0x0b, 0x3a, 0xd0, 0x78, 0x9d, 0x44,
0x14, 0x42, 0x18, 0x0f, 0x0d, 0xce, 0xca, 0xb0, 0x0a, 0x29, 0xed, 0xba, 0xa3, 0x16, 0x3f, 0xe8, 0xe9, 0x1a, 0x3e, 0x18, 0x8e, 0x09, 0xc8, 0x66, 0xbb, 0x4d, 0x47, 0x72, 0xcc, 0x58, 0x1f, 0x3e,
0xcf, 0x0a, 0x2f, 0xc9, 0x62, 0x63, 0x38, 0x33, 0xf3, 0x8c, 0x0d, 0x0e, 0x7a, 0x6b, 0x9b, 0xcb, 0x44, 0xff, 0xf7, 0xca, 0xb8, 0x3d, 0x2f, 0x30, 0xfa, 0x37, 0x54, 0xda, 0xec, 0x04, 0x81, 0xea,
0xd0, 0x3c, 0x62, 0x73, 0x70, 0xb3, 0x52, 0x5d, 0x29, 0x28, 0x4c, 0x01, 0x68, 0x29, 0x78, 0xa4, 0x7a, 0x1d, 0xf8, 0x38, 0x41, 0x1f, 0xe7, 0x1e, 0xb5, 0x84, 0xa2, 0x82, 0xfc, 0x2c, 0x05, 0xca,
0x4a, 0xb2, 0x32, 0xc5, 0x26, 0x3c, 0x1b, 0x1c, 0x6f, 0x7c, 0x1b, 0x22, 0x82, 0xee, 0xfa, 0xbd, 0x30, 0x90, 0xc6, 0x87, 0x47, 0xd0, 0x35, 0x35, 0xde, 0x52, 0xc0, 0x09, 0xdb, 0x72, 0x75, 0xf8,
0x85, 0xfd, 0x96, 0x75, 0xab, 0xcb, 0xc7, 0x0f, 0xaa, 0xd6, 0x36, 0x37, 0x38, 0xac, 0xe9, 0xab, 0xc1, 0x70, 0x9e, 0x39, 0x93, 0x24, 0xca, 0x73, 0xce, 0xf2, 0x45, 0xc2, 0xc2, 0x03, 0x9f, 0x15,
0xe6, 0xb0, 0x06, 0x87, 0xdd, 0x3e, 0xd5, 0xb9, 0xb9, 0x08, 0xd1, 0xa2, 0x38, 0x93, 0x39, 0xdc, 0xea, 0x5a, 0xe1, 0x88, 0x14, 0xb2, 0x86, 0xc2, 0x4d, 0xaa, 0x49, 0x52, 0xc4, 0x70, 0x21, 0x62,
0xd3, 0x61, 0xd1, 0xf4, 0x5b, 0xaa, 0x57, 0x67, 0x6a, 0x51, 0x27, 0xe9, 0x58, 0xa3, 0xbc, 0xc5, 0x81, 0xe0, 0xba, 0x62, 0xbd, 0x1a, 0xa6, 0xe1, 0xb0, 0x08, 0xf7, 0x96, 0xb5, 0xfe, 0xc6, 0x5b,
0x8a, 0x75, 0x11, 0xca, 0x0e, 0x2e, 0xc7, 0xfa, 0x96, 0x85, 0x9a, 0x1f, 0x54, 0x69, 0xc1, 0x6c, 0x0d, 0xbb, 0x45, 0x38, 0xec, 0xa6, 0xe1, 0x55, 0x59, 0xa6, 0xcb, 0x78, 0x90, 0xbe, 0xde, 0x12,
0x51, 0x0a, 0x76, 0xd0, 0xf2, 0xd5, 0x31, 0xab, 0xe0, 0x14, 0xe1, 0xde, 0x45, 0x84, 0x54, 0x21, 0x0f, 0x50, 0xe2, 0xdb, 0x3b, 0x1d, 0xb7, 0x8e, 0x00, 0x11, 0x5e, 0x7f, 0xfd, 0xde, 0xc1, 0xf7,
0xdf, 0x73, 0x32, 0x6a, 0xb8, 0xec, 0x6a, 0x7e, 0x59, 0x73, 0xed, 0x2d, 0xd4, 0x92, 0x5d, 0x86, 0x8e, 0xb1, 0xab, 0xab, 0xed, 0x4e, 0x50, 0xeb, 0x78, 0xd0, 0x70, 0x84, 0x1e, 0xaa, 0xda, 0x11,
0x75, 0x7c, 0x71, 0xbb, 0x11, 0x4f, 0xc7, 0xbe, 0x6e, 0xf1, 0x4b, 0x8f, 0x0a, 0x31, 0xc8, 0x36, 0x1a, 0x8e, 0xd8, 0x34, 0xce, 0x85, 0xbe, 0xf4, 0xd1, 0x3e, 0x59, 0x77, 0x5a, 0x4c, 0xce, 0xfd,
0x6a, 0x31, 0xf3, 0xe6, 0x52, 0x71, 0x76, 0x78, 0xc4, 0x56, 0x96, 0x87, 0x08, 0xa8, 0x25, 0x15, 0xac, 0xb6, 0xbc, 0x1a, 0x54, 0x28, 0x92, 0x55, 0x00, 0x32, 0xd6, 0x28, 0xbd, 0x91, 0x62, 0x7d,
0xfa, 0xa1, 0x2e, 0xb8, 0x0e, 0x3c, 0x54, 0xe8, 0x9c, 0xb3, 0x58, 0xdd, 0xad, 0x68, 0x6e, 0x6f, 0xa4, 0x99, 0x85, 0xf2, 0xb1, 0xbe, 0x63, 0x7e, 0xce, 0x0f, 0xca, 0x94, 0x65, 0x26, 0x2b, 0x04,
0x33, 0x76, 0xd0, 0x7b, 0x00, 0x1d, 0xdc, 0xf5, 0x53, 0x74, 0x8c, 0x2d, 0x85, 0x3c, 0x97, 0x9e, 0x3b, 0xe8, 0xb8, 0xea, 0x98, 0x95, 0x50, 0x8f, 0x54, 0xec, 0x23, 0x7a, 0xcb, 0x74, 0x1c, 0x58,
0x75, 0x43, 0xde, 0x7d, 0xfe, 0x63, 0x27, 0xbf, 0xed, 0xb1, 0xcb, 0xe5, 0x03, 0x3f, 0x21, 0x16, 0x19, 0x15, 0x94, 0xf7, 0x73, 0x7e, 0x55, 0x71, 0xed, 0x2d, 0xd5, 0x8a, 0x5d, 0xf9, 0x55, 0xec,
0xeb, 0x28, 0x10, 0x8d, 0xda, 0x44, 0x91, 0x8a, 0xdb, 0xd3, 0x89, 0x23, 0x68, 0x1d, 0xa1, 0xe0, 0x73, 0xd3, 0x8a, 0xf5, 0x63, 0x97, 0x6c, 0xed, 0x50, 0x93, 0x00, 0xb2, 0x56, 0x9f, 0xc0, 0x9c,
0xd5, 0x24, 0x97, 0xde, 0xde, 0xc2, 0x2e, 0xbb, 0x1e, 0xce, 0xba, 0xb2, 0x1e, 0xe7, 0xc5, 0x71, 0x85, 0x54, 0x9c, 0x1d, 0x1e, 0xb1, 0xc6, 0x81, 0x10, 0x01, 0xb5, 0xa4, 0x42, 0xaf, 0xd6, 0x27,
0xb3, 0xdd, 0x97, 0x2a, 0x2f, 0xad, 0x47, 0xd6, 0xe7, 0x6c, 0x26, 0xd3, 0x14, 0x13, 0x86, 0x57, 0xe7, 0x3a, 0xe8, 0x1e, 0x52, 0xce, 0x22, 0x75, 0xdf, 0xd0, 0xdc, 0xdd, 0x25, 0xec, 0x60, 0xf0,
0xb5, 0xf2, 0x7b, 0x0b, 0xb1, 0xec, 0x12, 0xf7, 0xde, 0x42, 0x1e, 0x53, 0xe2, 0xc1, 0xac, 0xd0, 0x08, 0xd6, 0xb8, 0xed, 0xf5, 0xe8, 0x18, 0x1b, 0x0a, 0x39, 0x16, 0x3a, 0xaa, 0x61, 0xa1, 0xff,
0xb1, 0x56, 0x78, 0x12, 0xc3, 0x7b, 0x6c, 0x70, 0xd9, 0x95, 0x28, 0xa8, 0xff, 0xb5, 0xb4, 0xbd, 0xfc, 0xc7, 0x5e, 0x7a, 0x37, 0x60, 0x57, 0xab, 0xda, 0xff, 0xce, 0x86, 0xeb, 0x1d, 0xa8, 0xdf,
0x45, 0xb1, 0x84, 0xb0, 0xb5, 0xda, 0x5b, 0x92, 0xf6, 0x16, 0xce, 0xc6, 0x9c, 0x14, 0x5f, 0x39, 0x18, 0x84, 0xf3, 0xec, 0xb8, 0x09, 0x13, 0xa9, 0xd2, 0xc2, 0x38, 0x64, 0x50, 0xce, 0xe6, 0x32,
0x13, 0x0c, 0xdf, 0x16, 0xbd, 0xb7, 0xd0, 0x4b, 0x34, 0x43, 0x4e, 0x50, 0x1d, 0x3b, 0xbe, 0x9d, 0x8e, 0x31, 0xd0, 0x38, 0xe5, 0xe4, 0xb0, 0xb7, 0x14, 0xab, 0xfe, 0xde, 0xd2, 0xac, 0x20, 0xe9,
0x49, 0x13, 0x1e, 0xec, 0x2d, 0x9e, 0xb6, 0xdc, 0xf2, 0x20, 0xc0, 0xec, 0x32, 0x2e, 0x06, 0x97, 0x98, 0xf2, 0x1c, 0x96, 0xc2, 0xb6, 0x95, 0x0e, 0xd3, 0x08, 0x0e, 0x61, 0xe1, 0x55, 0x5f, 0xb6,
0xcb, 0xad, 0xac, 0x7c, 0x53, 0xe8, 0x1c, 0x2d, 0x8e, 0xaa, 0xaa, 0xf5, 0x53, 0xdd, 0xb5, 0xc8, 0x83, 0xee, 0x7b, 0xa5, 0xed, 0x2d, 0xb3, 0x15, 0x84, 0x79, 0xfe, 0x56, 0x49, 0x7b, 0x4b, 0x6b,
0x68, 0x7a, 0x08, 0x90, 0xb7, 0x9b, 0x73, 0x87, 0x79, 0x7d, 0xf7, 0x09, 0x9a, 0x36, 0x79, 0x14, 0x36, 0x4e, 0x8a, 0x37, 0xfe, 0x01, 0xc3, 0xb7, 0x45, 0xef, 0x2d, 0xf3, 0x15, 0x7a, 0x2f, 0x2b,
0x9c, 0x1f, 0x5d, 0x50, 0x19, 0x97, 0xa8, 0x06, 0xc3, 0x4f, 0x67, 0xbf, 0xfd, 0x4a, 0x27, 0x93, 0xa8, 0x0a, 0x07, 0xd7, 0xcc, 0x65, 0xee, 0x1f, 0xec, 0x11, 0x24, 0x97, 0x3e, 0xa4, 0xb0, 0x8e,
0x91, 0x8d, 0xa7, 0x44, 0x05, 0xf7, 0x56, 0xd1, 0x51, 0x2d, 0xc2, 0x00, 0xf7, 0xf7, 0xeb, 0x82, 0xc5, 0xdd, 0xe9, 0xd4, 0x46, 0x75, 0x07, 0x49, 0x7a, 0xe0, 0x61, 0x54, 0x1a, 0x67, 0xe1, 0xd5,
0x5f, 0x2f, 0x05, 0x95, 0x0a, 0x02, 0xaf, 0xce, 0x82, 0x3d, 0xe9, 0x0a, 0x5b, 0x6f, 0x3b, 0x07, 0x6a, 0x23, 0x5f, 0xdf, 0x64, 0x3a, 0x45, 0x47, 0xa5, 0xca, 0xe6, 0xe0, 0xa9, 0x66, 0x5e, 0x24,
0x65, 0x14, 0x37, 0xfd, 0xf9, 0xaa, 0x32, 0xb5, 0x5a, 0xa6, 0x6a, 0x36, 0x34, 0xdf, 0xdc, 0x46, 0x34, 0xac, 0x78, 0xc8, 0xe8, 0xf6, 0x98, 0x93, 0xbf, 0xbe, 0xff, 0x04, 0x4d, 0xeb, 0xd4, 0xf0,
0x4e, 0xf6, 0xaa, 0x5e, 0x7f, 0x97, 0x6b, 0x27, 0x0b, 0xca, 0x39, 0xd1, 0x9b, 0x0b, 0x2e, 0xa6, 0x2e, 0x8e, 0x2e, 0xa9, 0x6b, 0x90, 0x28, 0x3e, 0xa3, 0x4f, 0x67, 0xbf, 0xfd, 0x4a, 0x27, 0x93,
0x37, 0x17, 0x5c, 0xc0, 0x6e, 0x2c, 0x3c, 0x18, 0x0a, 0xaa, 0xe5, 0x50, 0x57, 0x4a, 0x06, 0xcb, 0x81, 0x89, 0x66, 0x44, 0x05, 0x64, 0x2b, 0x1d, 0x5e, 0x2e, 0xc2, 0x00, 0x0f, 0x0f, 0xeb, 0xfe,
0xba, 0x23, 0x7a, 0x38, 0x3a, 0x50, 0x77, 0x79, 0x08, 0x12, 0xd7, 0xaa, 0xca, 0x08, 0x35, 0x08, 0xa2, 0x5a, 0xf2, 0x4a, 0x15, 0x04, 0x5e, 0xad, 0x05, 0x07, 0xd2, 0xd6, 0xd1, 0xc1, 0x66, 0x5a,
0x46, 0xab, 0x6d, 0xd7, 0x40, 0x7f, 0x3d, 0x47, 0x84, 0x00, 0x5f, 0xb5, 0x92, 0x53, 0x66, 0xd9, 0xc9, 0x20, 0xaa, 0xc7, 0x81, 0xa6, 0x10, 0x76, 0x3a, 0xba, 0xec, 0x6d, 0x72, 0xde, 0xfe, 0x8c,
0x96, 0x93, 0x4e, 0x73, 0x7a, 0xaa, 0x50, 0xc6, 0xc1, 0x26, 0x51, 0xc0, 0x68, 0x22, 0xa8, 0x38, 0x34, 0x1b, 0x94, 0xa3, 0xc5, 0x2e, 0xcf, 0xad, 0x2c, 0x28, 0x67, 0x45, 0xb7, 0x17, 0x6c, 0x98,
0x7a, 0x64, 0x34, 0xf9, 0xb5, 0xdf, 0xb4, 0xe3, 0x03, 0x68, 0xd4, 0xe6, 0x44, 0x35, 0x82, 0x9d, 0xb6, 0x17, 0x6c, 0x0c, 0xb6, 0x16, 0x1e, 0xcd, 0x20, 0xe5, 0xb2, 0x9f, 0x97, 0x4a, 0x7a, 0xab,
0xe1, 0x04, 0x6e, 0x43, 0xb1, 0x35, 0xc8, 0xc8, 0xf5, 0xcc, 0x51, 0x81, 0x3a, 0xaa, 0x29, 0x6d, 0xaa, 0x01, 0x7b, 0x3c, 0xa9, 0x50, 0x33, 0x7b, 0x08, 0x12, 0xdb, 0x19, 0xcb, 0x00, 0x25, 0x0f,
0x7c, 0x42, 0x8f, 0x6a, 0x36, 0xf1, 0x7d, 0xb1, 0xb9, 0x01, 0x8c, 0x6f, 0xca, 0xb8, 0x88, 0xe8, 0x46, 0xab, 0x6c, 0x57, 0x57, 0x9a, 0x6a, 0x6c, 0xf1, 0x81, 0xf5, 0xaa, 0x91, 0x53, 0x24, 0xc9,
0xb4, 0x38, 0x3f, 0x2d, 0xc0, 0xd7, 0xd4, 0xb3, 0x52, 0xd0, 0x88, 0x74, 0x48, 0x81, 0xc8, 0x6d, 0x86, 0x93, 0x4e, 0x53, 0x7a, 0x2a, 0x81, 0xc3, 0x02, 0x2a, 0x51, 0xc0, 0x68, 0xc2, 0x2b, 0x39,
0xb0, 0x1d, 0x77, 0x43, 0x35, 0xd1, 0xcd, 0x81, 0x1a, 0xed, 0x1f, 0x89, 0x2c, 0x52, 0xbd, 0xfa, 0x06, 0x64, 0x34, 0xf9, 0xb5, 0xdf, 0xb4, 0xe5, 0x03, 0x0e, 0x54, 0xe6, 0x44, 0xf1, 0x83, 0x9d,
0x3a, 0xc5, 0x0f, 0x22, 0x1b, 0x6d, 0xfe, 0x7a, 0x8a, 0xb5, 0xfb, 0xfb, 0x12, 0x93, 0xcd, 0x31, 0xe1, 0x04, 0x6e, 0x7c, 0xb1, 0x31, 0x37, 0xc9, 0xf5, 0x88, 0x53, 0xd6, 0x10, 0x02, 0x7e, 0x7c,
0xfd, 0x89, 0x9c, 0x39, 0x67, 0x3a, 0x4b, 0x51, 0x75, 0x6d, 0x97, 0xea, 0x0f, 0xed, 0x42, 0x43, 0xf8, 0x84, 0x96, 0x38, 0x6f, 0x97, 0x93, 0x65, 0xfb, 0x03, 0x4a, 0x4a, 0xdd, 0x35, 0x88, 0x80,
0x94, 0x23, 0x4c, 0x09, 0xaf, 0xd2, 0x2f, 0xd8, 0x57, 0x96, 0xba, 0x62, 0x4c, 0x75, 0x13, 0xb4, 0x4e, 0x8b, 0xf3, 0xd3, 0x02, 0x7c, 0x4d, 0x2d, 0x32, 0x05, 0x8d, 0x88, 0x47, 0x14, 0x88, 0x1c,
0xdb, 0x38, 0x3d, 0xaa, 0xee, 0xbe, 0x1a, 0x9b, 0xbc, 0xc7, 0x5a, 0x80, 0xfa, 0x8d, 0xa9, 0x93, 0xc9, 0xba, 0x71, 0xa4, 0x91, 0x9a, 0xea, 0xa6, 0x4c, 0x00, 0xaa, 0xac, 0xdf, 0xf5, 0xf6, 0xf0,
0xfa, 0xea, 0xc5, 0x44, 0x10, 0x64, 0x53, 0xef, 0x7e, 0xec, 0x46, 0x60, 0x4c, 0xc0, 0xac, 0xe5, 0xf2, 0x06, 0xba, 0x52, 0x81, 0x82, 0xa8, 0xaa, 0x53, 0xcd, 0xe4, 0x6c, 0xf6, 0xf7, 0x35, 0xa6,
0x7a, 0x6f, 0x82, 0xe2, 0x16, 0x6b, 0x27, 0x93, 0x69, 0xf4, 0xc5, 0xc0, 0xc4, 0xe1, 0x62, 0x2e, 0xa9, 0x63, 0xfa, 0x13, 0x58, 0x9b, 0xce, 0x75, 0x12, 0xa3, 0xd2, 0x9b, 0xbe, 0x86, 0x82, 0xc4,
0xec, 0x4c, 0xa7, 0x5d, 0x86, 0x43, 0xb0, 0x65, 0x10, 0xd9, 0x19, 0x26, 0x5b, 0x4c, 0x32, 0x30, 0x02, 0x4f, 0x2a, 0xa2, 0x82, 0xba, 0x28, 0x85, 0x98, 0x50, 0x5e, 0xc5, 0x5f, 0x40, 0xa7, 0x0c,
0x84, 0xbe, 0x6a, 0x7a, 0x73, 0x40, 0x4b, 0x51, 0x50, 0x95, 0x77, 0xed, 0x4a, 0x2a, 0x0d, 0x74, 0x75, 0xe4, 0x98, 0x28, 0xa7, 0x68, 0xf5, 0x61, 0x0a, 0x54, 0xfc, 0x7d, 0x35, 0xce, 0xd3, 0x01,
0xbe, 0x23, 0xa0, 0xcd, 0xa4, 0x12, 0x48, 0x2f, 0xe1, 0x84, 0xf9, 0x68, 0xec, 0x57, 0xfc, 0xe4, 0xeb, 0x60, 0x8e, 0x24, 0x2e, 0xf9, 0x0d, 0xae, 0xb1, 0x80, 0xc5, 0xc4, 0x58, 0xcc, 0x00, 0x9f,
0xed, 0xea, 0xa6, 0x40, 0x60, 0x7a, 0x0b, 0xd7, 0x6d, 0x49, 0x05, 0x29, 0x9c, 0xb1, 0x90, 0x6a, 0xbe, 0xec, 0xd4, 0xac, 0x18, 0x02, 0x5a, 0xb3, 0x32, 0x4d, 0x03, 0xcb, 0xa9, 0x20, 0x30, 0xa7,
0xa8, 0x23, 0xd9, 0x6c, 0x50, 0x60, 0xda, 0x47, 0x8a, 0x65, 0x4d, 0xb6, 0x42, 0xa3, 0x59, 0x31, 0x89, 0xe3, 0xd8, 0x0e, 0xee, 0x98, 0xdb, 0x59, 0xc7, 0x4e, 0x0c, 0x04, 0xd2, 0x1d, 0xd6, 0x9d,
0xe8, 0xcf, 0x5e, 0x0c, 0x08, 0x69, 0xfa, 0x6d, 0x3c, 0x5c, 0x86, 0x1b, 0x25, 0x6d, 0x55, 0x56, 0x4c, 0x67, 0xc1, 0x97, 0x1c, 0x9e, 0xf2, 0x97, 0x0b, 0x61, 0xe6, 0x3a, 0xee, 0x33, 0x98, 0x81,
0x81, 0x0c, 0x3d, 0x46, 0x49, 0xea, 0xf8, 0x1a, 0x9c, 0xe6, 0x6c, 0x35, 0x57, 0x6c, 0x0f, 0x5d, 0xad, 0x50, 0x73, 0xe7, 0x98, 0xc7, 0x31, 0x7f, 0xc1, 0x9e, 0xfa, 0xba, 0x9e, 0x28, 0x80, 0x50,
0x4a, 0x63, 0xe2, 0xd2, 0xa5, 0x4a, 0x23, 0xc2, 0x9b, 0xb3, 0x42, 0x18, 0xe3, 0xf5, 0xe5, 0x60, 0x59, 0x46, 0xbd, 0x89, 0x6d, 0xb2, 0x62, 0x99, 0xe3, 0xd4, 0xf7, 0x04, 0xc1, 0x89, 0x54, 0x02,
0x14, 0x5f, 0x8b, 0x7e, 0x5b, 0x0e, 0x3c, 0xab, 0xbd, 0xfa, 0x1e, 0x46, 0xfe, 0x1b, 0x23, 0x58, 0x59, 0x2a, 0xac, 0x30, 0x17, 0x9a, 0x34, 0xfc, 0x14, 0x34, 0xe5, 0xfd, 0x86, 0xc0, 0xcc, 0xe9,
0x55, 0x3c, 0x0c, 0x46, 0x92, 0xf0, 0xb1, 0x01, 0xa6, 0xba, 0x37, 0xa9, 0x6f, 0x01, 0xbe, 0xe1, 0xaf, 0x9b, 0xa9, 0x12, 0x99, 0xe0, 0x01, 0x9f, 0x8a, 0xb4, 0x25, 0x69, 0xb7, 0x55, 0xf0, 0xd0,
0x8a, 0xe6, 0x0e, 0xa1, 0x6d, 0x60, 0xc4, 0xe3, 0x9c, 0xbf, 0x64, 0x21, 0x7a, 0x0c, 0x78, 0x02, 0x96, 0x32, 0x5a, 0x91, 0x35, 0xa0, 0x36, 0xcf, 0xc2, 0xe1, 0xfc, 0x45, 0x48, 0x80, 0x35, 0xec,
0xa3, 0x1b, 0x75, 0xc8, 0x30, 0xe5, 0x9f, 0xf0, 0x41, 0xb8, 0x39, 0x78, 0x8a, 0xad, 0xc1, 0xd0, 0xe2, 0xe1, 0xca, 0x6f, 0x15, 0xbb, 0xa6, 0xe0, 0x02, 0x60, 0x06, 0x8c, 0x72, 0xdd, 0xf2, 0xc1,
0x5c, 0x8f, 0xa8, 0x1b, 0x14, 0x18, 0x02, 0x05, 0xcd, 0xad, 0x6f, 0x2a, 0xc5, 0x9b, 0x41, 0xda, 0x2f, 0xd5, 0xd6, 0xcd, 0x34, 0xb4, 0x39, 0x2a, 0x2a, 0x8d, 0x39, 0x51, 0x17, 0x2a, 0x0e, 0x08,
0x01, 0xf1, 0xef, 0x38, 0x53, 0x2a, 0xed, 0x9d, 0x1f, 0xd0, 0xb4, 0x8d, 0x55, 0xc0, 0xf1, 0x5c, 0xb6, 0xce, 0x32, 0x91, 0xe7, 0xce, 0x50, 0x86, 0xe7, 0xd1, 0x8d, 0x18, 0x76, 0x65, 0xe8, 0x18,
0x82, 0x66, 0xb9, 0xd3, 0x6f, 0xd7, 0x37, 0x43, 0x7d, 0xf7, 0xe5, 0xc1, 0xdf, 0xe4, 0x9c, 0x2e, 0xed, 0x54, 0xb7, 0x47, 0xf2, 0xbf, 0x18, 0x1c, 0xcb, 0xb2, 0x92, 0x63, 0x90, 0xf2, 0xb7, 0x8d,
0x94, 0xbc, 0xb2, 0xc8, 0x7c, 0x56, 0xf7, 0xaf, 0x00, 0xa1, 0xa0, 0x07, 0x42, 0x47, 0x00, 0x87, 0x5d, 0xe5, 0x6d, 0x4f, 0x75, 0x77, 0xf1, 0x0d, 0x57, 0xd4, 0x37, 0x1f, 0xdd, 0x1c, 0x46, 0x3c,
0x88, 0x38, 0x05, 0x66, 0xeb, 0xf4, 0x0e, 0x78, 0x4f, 0x16, 0xe0, 0x0c, 0x51, 0x09, 0x18, 0x87, 0x4e, 0xf9, 0x4b, 0xe6, 0xa3, 0x89, 0x81, 0x27, 0x30, 0x70, 0x52, 0x5f, 0x0f, 0x53, 0xfe, 0x09,
0x9b, 0xe7, 0x3b, 0x9e, 0xc4, 0x3b, 0x3d, 0x7d, 0x36, 0x4d, 0xc5, 0x18, 0x4d, 0x50, 0xcc, 0x5d, 0x1f, 0xf8, 0xed, 0x71, 0x59, 0x6c, 0x8c, 0xb3, 0xf9, 0xcd, 0x39, 0x35, 0x5d, 0x02, 0xa3, 0xab,
0x1c, 0x72, 0x96, 0x6b, 0x63, 0x19, 0xf8, 0x2a, 0x0d, 0x50, 0xd4, 0x49, 0x7d, 0xd2, 0x9b, 0x04, 0xa0, 0x69, 0xfb, 0x4d, 0xa9, 0x78, 0x3d, 0xfe, 0x5b, 0x3c, 0xff, 0x1d, 0x67, 0x8a, 0xa5, 0xb9,
0xa4, 0xf2, 0xba, 0x29, 0xe4, 0x56, 0x63, 0x28, 0xbd, 0x61, 0x83, 0x9d, 0xcd, 0xc5, 0x99, 0xc8, 0x77, 0x3d, 0xba, 0x23, 0xc0, 0x2a, 0x50, 0x7d, 0x21, 0x41, 0xb3, 0xda, 0x19, 0x76, 0xab, 0xfb,
0xf2, 0xd7, 0x54, 0x2f, 0x4a, 0x6b, 0x71, 0xf4, 0xaa, 0x5c, 0x55, 0x2f, 0x24, 0x33, 0xc9, 0x64, 0xac, 0xa1, 0xdd, 0x39, 0xfc, 0x87, 0x5c, 0xd0, 0x35, 0x98, 0x53, 0x64, 0x89, 0xcb, 0xaa, 0xae,
0x72, 0xc5, 0xd9, 0x3b, 0x52, 0xe6, 0xb8, 0xdf, 0xae, 0x36, 0xa0, 0x30, 0x24, 0xac, 0x78, 0x76, 0x1b, 0x58, 0xe6, 0x0d, 0x40, 0x68, 0x09, 0xe0, 0x10, 0x11, 0xc5, 0x80, 0x7e, 0x1d, 0xdf, 0xa3,
0x9e, 0x60, 0x7a, 0x4d, 0x4c, 0xaf, 0xe3, 0xe4, 0x6a, 0xcd, 0xb7, 0xf5, 0x95, 0x4a, 0x5f, 0x56, 0x6c, 0x90, 0x05, 0x38, 0x43, 0x54, 0xa2, 0x1a, 0xc0, 0xcd, 0x8b, 0x1d, 0x47, 0xe2, 0x9d, 0x9e,
0x87, 0xcb, 0x8a, 0xa4, 0x80, 0x82, 0x26, 0x8f, 0x95, 0x3b, 0x75, 0x66, 0x4c, 0x99, 0xac, 0xda, 0x3e, 0xe7, 0x75, 0xe1, 0x39, 0x9f, 0xa2, 0xcc, 0xdb, 0x38, 0xe4, 0x2c, 0xd5, 0xb9, 0x61, 0xe0,
0x0a, 0xd7, 0xf6, 0x77, 0xa7, 0x85, 0x10, 0xaa, 0x57, 0xfb, 0xb3, 0xab, 0x34, 0x9c, 0x39, 0xd8, 0x2b, 0x35, 0x40, 0xb9, 0x27, 0xf5, 0x49, 0x6f, 0x12, 0x10, 0xcb, 0x9b, 0xba, 0xc4, 0x1b, 0x8d,
0x7f, 0x76, 0xd4, 0xe9, 0x74, 0x7e, 0xe8, 0x79, 0x27, 0xdb, 0xb7, 0x02, 0x10, 0x9d, 0xee, 0x92, 0x51, 0xfa, 0x96, 0x85, 0x3b, 0xed, 0xc5, 0xb9, 0x48, 0xd2, 0xd7, 0x54, 0x76, 0x0a, 0x63, 0x70,
0x47, 0x20, 0x70, 0xe0, 0x6d, 0xca, 0xa5, 0xd8, 0xd8, 0x96, 0x8b, 0x39, 0xe3, 0x81, 0xd4, 0x9d, 0xf4, 0xb2, 0xea, 0x95, 0x2f, 0x24, 0x73, 0x82, 0x06, 0xf2, 0x9a, 0xb3, 0x77, 0xa4, 0xcc, 0xf1,
0xfd, 0x67, 0x3f, 0xbd, 0x7c, 0xf9, 0x92, 0xa4, 0x96, 0x59, 0xea, 0xc2, 0x9d, 0x9c, 0xb3, 0x9d, 0xb0, 0x5b, 0x7e, 0x80, 0xc2, 0x90, 0xd0, 0xf0, 0xec, 0x3c, 0xc1, 0xf4, 0x9a, 0x98, 0x5e, 0x47,
0x05, 0x51, 0x2d, 0xdd, 0xa5, 0x58, 0x65, 0x98, 0xd9, 0xf3, 0xcd, 0x5b, 0xc3, 0x32, 0x87, 0x83, 0x93, 0xeb, 0x35, 0xdf, 0xc6, 0x2e, 0xa5, 0xbe, 0xac, 0x0a, 0x97, 0x86, 0x24, 0x83, 0x82, 0x79,
0x9f, 0x0f, 0x76, 0x7e, 0xc9, 0xf4, 0x38, 0xce, 0xbc, 0x61, 0xdf, 0x94, 0xf9, 0xe0, 0x39, 0xb8, 0x1a, 0x29, 0x7b, 0xea, 0x24, 0xcf, 0x8b, 0x49, 0xd3, 0x70, 0xd8, 0x61, 0xa5, 0x3f, 0xcb, 0x84,
0xf0, 0x73, 0xe2, 0xfd, 0x72, 0x36, 0x3c, 0x35, 0x9e, 0xff, 0xee, 0x8f, 0x80, 0x8e, 0xde, 0x97, 0x50, 0x83, 0xca, 0x9f, 0x7d, 0xa5, 0xe1, 0xcc, 0x70, 0xff, 0xd9, 0x51, 0xaf, 0xd7, 0xfb, 0x61,
0xdb, 0x3a, 0xd5, 0x63, 0xcb, 0x60, 0xc7, 0x47, 0x5c, 0xdc, 0xd1, 0x9d, 0xa9, 0x9a, 0xd2, 0x8d, 0xe0, 0x9c, 0x6c, 0xde, 0x65, 0x40, 0x74, 0xbc, 0x4b, 0x1e, 0x81, 0xc0, 0xd0, 0x69, 0xcb, 0xa5,
0x25, 0xdd, 0x91, 0xbc, 0x1d, 0x9d, 0xbd, 0x78, 0x1e, 0x56, 0x6b, 0xc2, 0x2b, 0xc4, 0xbf, 0x4a, 0xd8, 0xd8, 0x94, 0x8b, 0xe9, 0xe8, 0x91, 0xd4, 0x9d, 0xfd, 0x67, 0x3f, 0xbd, 0x7c, 0xf9, 0x92,
0x89, 0x0c, 0xc4, 0x03, 0x3a, 0x4e, 0xbb, 0x1b, 0x50, 0x06, 0x92, 0x48, 0x0c, 0x89, 0xdd, 0xba, 0xa4, 0x16, 0x49, 0x6c, 0xc3, 0x9d, 0x9c, 0xb3, 0x99, 0x05, 0x41, 0x25, 0xdd, 0xa6, 0x58, 0x69,
0x19, 0xa9, 0x3d, 0x55, 0xd7, 0xe2, 0x75, 0x37, 0xe8, 0x5a, 0xc5, 0x1f, 0x5e, 0xae, 0x82, 0x0b, 0x98, 0xf9, 0xf3, 0xf6, 0x5d, 0x67, 0x91, 0xc2, 0xc1, 0xcf, 0xc3, 0x9d, 0x5f, 0x12, 0x3d, 0x8e,
0x63, 0x25, 0xb9, 0xd1, 0x09, 0xe6, 0x07, 0x1b, 0x8d, 0x07, 0xcd, 0x7e, 0xc1, 0x81, 0xb7, 0xb3, 0x12, 0x67, 0x34, 0xcc, 0x8b, 0x34, 0x7c, 0x0e, 0x2e, 0xfc, 0x9c, 0x38, 0xbf, 0x9c, 0x8d, 0x4e,
0x6a, 0x1f, 0xbd, 0x4d, 0x2c, 0x76, 0x8c, 0x03, 0x0f, 0x63, 0x67, 0x77, 0xab, 0xfb, 0x79, 0xfa, 0x73, 0xc7, 0x7d, 0xf7, 0x87, 0x47, 0x47, 0x1f, 0xca, 0x4d, 0x9d, 0xaa, 0x61, 0x2b, 0xdc, 0x71,
0x7b, 0xf5, 0x9d, 0x2b, 0x4d, 0xaf, 0xdf, 0xfc, 0xe0, 0x53, 0xdf, 0x03, 0x1f, 0xd9, 0x7d, 0xad, 0x11, 0x17, 0xf7, 0x74, 0xd3, 0xab, 0x66, 0x74, 0xcf, 0x4a, 0x37, 0x3b, 0x6f, 0xcf, 0xcf, 0x5e,
0x10, 0x4d, 0x12, 0xb5, 0x9d, 0x47, 0x67, 0xc3, 0xff, 0xbd, 0x71, 0x69, 0xda, 0xfe, 0x8b, 0xd6, 0x3c, 0xf7, 0xcb, 0x35, 0xe1, 0x64, 0xe2, 0x3f, 0x85, 0x44, 0x06, 0xe2, 0x01, 0xbd, 0xa8, 0xd9,
0x75, 0x03, 0xfa, 0x77, 0x99, 0xd7, 0x71, 0x0e, 0x3c, 0x9a, 0xe5, 0xff, 0xa2, 0x81, 0xdd, 0xf8, 0xf5, 0x28, 0x03, 0x49, 0x24, 0x46, 0xdb, 0x7e, 0xd5, 0xd3, 0x54, 0x9e, 0xaa, 0x4a, 0xfa, 0xba,
0xff, 0x3d, 0x16, 0x76, 0x8c, 0xce, 0xa5, 0xef, 0xbb, 0x3b, 0x7f, 0xf2, 0x9b, 0x2b, 0x9f, 0xbe, 0x4f, 0xb4, 0x4d, 0xe4, 0x0f, 0x2f, 0x9b, 0xe0, 0xc2, 0x30, 0x4c, 0x6e, 0xb4, 0x82, 0xf9, 0x41,
0xff, 0xce, 0x28, 0x22, 0xce, 0x0a, 0xb9, 0x28, 0x55, 0x51, 0x25, 0x06, 0xcd, 0xb5, 0x5f, 0x03, 0xab, 0x7f, 0xa1, 0x89, 0xd5, 0x3b, 0x70, 0x76, 0x9a, 0xc6, 0xd2, 0x69, 0xa3, 0xb9, 0x65, 0x0c,
0xfd, 0x51, 0x14, 0x35, 0xa9, 0x56, 0xfc, 0x6f, 0x70, 0x08, 0x98, 0x41, 0x88, 0x8b, 0x8c, 0x26, 0x1d, 0x0c, 0xcb, 0xfd, 0x8d, 0x26, 0xea, 0xe9, 0xfd, 0xaa, 0x9b, 0x62, 0x9a, 0xb9, 0xbf, 0xb9,
0x54, 0x26, 0x88, 0xa6, 0xff, 0x64, 0xfc, 0x07, 0xdc, 0x99, 0xc1, 0xa4, 0xdf, 0x18, 0x00, 0x00 0xe1, 0x53, 0xfb, 0x81, 0x8f, 0xec, 0xbe, 0x56, 0x88, 0x46, 0x95, 0xca, 0xce, 0xe7, 0x67, 0xa3,
0xbf, 0xdf, 0xb8, 0x74, 0x47, 0xf0, 0x17, 0xad, 0x6b, 0xaf, 0x15, 0xbe, 0xcb, 0xbc, 0x96, 0x33,
0x74, 0xe8, 0x06, 0xe2, 0x2f, 0x1a, 0xd8, 0x5e, 0x5a, 0x7c, 0x8f, 0x85, 0x2d, 0xa3, 0x75, 0xe9,
0xfb, 0xfe, 0xce, 0x9f, 0xdc, 0xb3, 0xf1, 0xe9, 0xfb, 0xef, 0x8c, 0x22, 0xe2, 0x2c, 0x91, 0x8b,
0x52, 0x15, 0x55, 0x22, 0xac, 0x2f, 0x2b, 0x6b, 0xe8, 0x0f, 0x82, 0xa0, 0x4e, 0xb5, 0xec, 0xef,
0xc1, 0x21, 0x60, 0x06, 0x21, 0x2e, 0x32, 0x9a, 0x50, 0x99, 0x20, 0x9a, 0xfe, 0xff, 0xf2, 0x3f,
0x66, 0x3b, 0x04, 0x72, 0x95, 0x19, 0x00, 0x00
}; };
// Autogenerated from wled00/data/settings_2D.htm, do not edit!! // Autogenerated from wled00/data/settings_2D.htm, do not edit!!
const uint16_t PAGE_settings_2D_length = 1745; const uint16_t PAGE_settings_2D_length = 1745;
const uint8_t PAGE_settings_2D[] PROGMEM = { const uint8_t PAGE_settings_2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x58, 0x5b, 0x6f, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x58, 0x5b, 0x6f, 0xdb, 0x36,
0x14, 0x7e, 0xd7, 0xaf, 0x60, 0x88, 0xa2, 0x93, 0x5a, 0x59, 0x8e, 0xbb, 0x0b, 0x8a, 0x58, 0x52, 0x14, 0x7e, 0xd7, 0xaf, 0x60, 0x88, 0xa2, 0x93, 0x5a, 0x59, 0x8e, 0xbb, 0x0b, 0x8a, 0x58, 0x52,
0xd6, 0x34, 0xd9, 0x92, 0x21, 0x41, 0x83, 0xba, 0x4b, 0x31, 0xac, 0x43, 0x4b, 0x4b, 0xc7, 0x16, 0xd6, 0x34, 0xd9, 0x92, 0x21, 0x41, 0x83, 0xba, 0x4b, 0x31, 0xac, 0x43, 0x4b, 0x4b, 0xc7, 0x16,
0x1b, 0x89, 0x14, 0x48, 0xca, 0x49, 0xe6, 0xe6, 0xbf, 0xef, 0x90, 0x92, 0xaf, 0x71, 0xda, 0xee, 0x1b, 0x89, 0x14, 0x48, 0xca, 0x49, 0xe6, 0xe6, 0xbf, 0xef, 0x90, 0x92, 0xaf, 0x71, 0xda, 0xee,
@ -1888,7 +1928,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = {
// Autogenerated from wled00/data/settings_pin.htm, do not edit!! // Autogenerated from wled00/data/settings_pin.htm, do not edit!!
const uint16_t PAGE_settings_pin_length = 471; const uint16_t PAGE_settings_pin_length = 471;
const uint8_t PAGE_settings_pin[] PROGMEM = { const uint8_t PAGE_settings_pin[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0x6c, 0xa8, 0xa8, 0x04, 0xaa, 0xbd, 0x42, 0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0x6c, 0xa8, 0xa8, 0x04, 0xaa, 0xbd, 0x42,
0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x52, 0x55, 0x55, 0xe5, 0xd8, 0xb3, 0x89, 0x55, 0x7f, 0x2c, 0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x52, 0x55, 0x55, 0xe5, 0xd8, 0xb3, 0x89, 0x55, 0x7f, 0x2c,
0xb6, 0x37, 0x21, 0x54, 0xfc, 0x77, 0xc6, 0xbb, 0xa1, 0xa0, 0x5c, 0xd6, 0x7e, 0x33, 0xe3, 0x37, 0xb6, 0x37, 0x21, 0x54, 0xfc, 0x77, 0xc6, 0xbb, 0xa1, 0xa0, 0x5c, 0xd6, 0x7e, 0x33, 0xe3, 0x37,

File diff suppressed because it is too large Load Diff

View File

@ -110,7 +110,7 @@ void changePalette(uint8_t pal)
for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i); Segment& seg = strip.getSegment(i);
if (!seg.isActive() || !seg.isSelected()) continue; if (!seg.isActive() || !seg.isSelected()) continue;
seg.palette = pal; seg.setPalette(pal);
} }
setValuesFromFirstSelectedSeg(); setValuesFromFirstSelectedSeg();
} else { } else {

View File

@ -2,6 +2,14 @@
#include "palettes.h" #include "palettes.h"
#define JSON_PATH_STATE 1
#define JSON_PATH_INFO 2
#define JSON_PATH_STATE_INFO 3
#define JSON_PATH_NODES 4
#define JSON_PATH_PALETTES 5
#define JSON_PATH_FXDATA 6
#define JSON_PATH_NETWORKS 7
/* /*
* JSON API (De)serialization * JSON API (De)serialization
*/ */
@ -79,8 +87,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
uint16_t grp = elem["grp"] | seg.grouping; uint16_t grp = elem["grp"] | seg.grouping;
uint16_t spc = elem[F("spc")] | seg.spacing; uint16_t spc = elem[F("spc")] | seg.spacing;
uint16_t of = seg.offset; uint16_t of = seg.offset;
uint8_t soundSim = elem["ssim"] | seg.soundSim; uint8_t soundSim = elem["si"] | seg.soundSim;
uint8_t map1D2D = elem["mp12"] | seg.map1D2D; uint8_t map1D2D = elem["m12"] | seg.map1D2D;
if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps
@ -182,7 +190,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
getVal(elem["ix"], &seg.intensity); getVal(elem["ix"], &seg.intensity);
uint8_t pal = seg.palette; uint8_t pal = seg.palette;
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) seg.setPalette(pal); if (getVal(elem["pal"], &pal)) seg.setPalette(pal);
getVal(elem["c1"], &seg.custom1); getVal(elem["c1"], &seg.custom1);
getVal(elem["c2"], &seg.custom2); getVal(elem["c2"], &seg.custom2);
@ -482,8 +490,8 @@ void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, b
root["o1"] = seg.check1; root["o1"] = seg.check1;
root["o2"] = seg.check2; root["o2"] = seg.check2;
root["o3"] = seg.check3; root["o3"] = seg.check3;
root["ssim"] = seg.soundSim; root["si"] = seg.soundSim;
root["mp12"] = seg.map1D2D; root["m12"] = seg.map1D2D;
} }
void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds, bool selectedSegmentsOnly) void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds, bool selectedSegmentsOnly)
@ -558,7 +566,6 @@ void serializeInfo(JsonObject root)
leds[F("maxseg")] = strip.getMaxSegments(); leds[F("maxseg")] = strip.getMaxSegments();
//leds[F("actseg")] = strip.getActiveSegmentsNum(); //leds[F("actseg")] = strip.getActiveSegmentsNum();
//leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config //leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config
leds[F("cpal")] = strip.customPalettes.size(); //number of custom palettes
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
if (strip.isMatrix) { if (strip.isMatrix) {
@ -628,6 +635,7 @@ void serializeInfo(JsonObject root)
root[F("fxcount")] = strip.getModeCount(); root[F("fxcount")] = strip.getModeCount();
root[F("palcount")] = strip.getPaletteCount(); root[F("palcount")] = strip.getPaletteCount();
root[F("cpalcount")] = strip.customPalettes.size(); //number of custom palettes
JsonArray ledmaps = root.createNestedArray(F("maps")); JsonArray ledmaps = root.createNestedArray(F("maps"));
for (size_t i=0; i<10; i++) { for (size_t i=0; i<10; i++) {
@ -872,6 +880,35 @@ void serializePalettes(JsonObject root, AsyncWebServerRequest* request)
} }
} }
void serializeNetworks(JsonObject root)
{
JsonArray networks = root.createNestedArray(F("networks"));
int16_t status = WiFi.scanComplete();
switch (status) {
case WIFI_SCAN_FAILED:
WiFi.scanNetworks(true);
return;
case WIFI_SCAN_RUNNING:
return;
}
for (int i = 0; i < status; i++) {
JsonObject node = networks.createNestedObject();
node["ssid"] = WiFi.SSID(i);
node["rssi"] = WiFi.RSSI(i);
node["bssid"] = WiFi.BSSIDstr(i);
node["channel"] = WiFi.channel(i);
node["enc"] = WiFi.encryptionType(i);
}
WiFi.scanDelete();
if (WiFi.scanComplete() == WIFI_SCAN_FAILED) {
WiFi.scanNetworks(true);
}
}
void serializeNodes(JsonObject root) void serializeNodes(JsonObject root)
{ {
JsonArray nodes = root.createNestedArray("nodes"); JsonArray nodes = root.createNestedArray("nodes");
@ -922,12 +959,13 @@ void serveJson(AsyncWebServerRequest* request)
{ {
byte subJson = 0; byte subJson = 0;
const String& url = request->url(); const String& url = request->url();
if (url.indexOf("state") > 0) subJson = 1; if (url.indexOf("state") > 0) subJson = JSON_PATH_STATE;
else if (url.indexOf("info") > 0) subJson = 2; else if (url.indexOf("info") > 0) subJson = JSON_PATH_INFO;
else if (url.indexOf("si") > 0) subJson = 3; else if (url.indexOf("si") > 0) subJson = JSON_PATH_STATE_INFO;
else if (url.indexOf("nodes") > 0) subJson = 4; else if (url.indexOf("nodes") > 0) subJson = JSON_PATH_NODES;
else if (url.indexOf("palx") > 0) subJson = 5; else if (url.indexOf("palx") > 0) subJson = JSON_PATH_PALETTES;
else if (url.indexOf("fxda") > 0) subJson = 6; else if (url.indexOf("fxda") > 0) subJson = JSON_PATH_FXDATA;
else if (url.indexOf("net") > 0) subJson = JSON_PATH_NETWORKS;
#ifdef WLED_ENABLE_JSONLIVE #ifdef WLED_ENABLE_JSONLIVE
else if (url.indexOf("live") > 0) { else if (url.indexOf("live") > 0) {
serveLiveLeds(request); serveLiveLeds(request);
@ -970,22 +1008,24 @@ void serveJson(AsyncWebServerRequest* request)
switch (subJson) switch (subJson)
{ {
case 1: //state case JSON_PATH_STATE:
serializeState(lDoc); break; serializeState(lDoc); break;
case 2: //info case JSON_PATH_INFO:
serializeInfo(lDoc); break; serializeInfo(lDoc); break;
case 4: //node list case JSON_PATH_NODES:
serializeNodes(lDoc); break; serializeNodes(lDoc); break;
case 5: //palettes case JSON_PATH_PALETTES:
serializePalettes(lDoc, request); break; serializePalettes(lDoc, request); break;
case 6: // FX helper data case JSON_PATH_FXDATA:
serializeModeData(lDoc.as<JsonArray>()); break; serializeModeData(lDoc.as<JsonArray>()); break;
case JSON_PATH_NETWORKS:
serializeNetworks(lDoc); break;
default: //all default: //all
JsonObject state = lDoc.createNestedObject("state"); JsonObject state = lDoc.createNestedObject("state");
serializeState(state); serializeState(state);
JsonObject info = lDoc.createNestedObject("info"); JsonObject info = lDoc.createNestedObject("info");
serializeInfo(info); serializeInfo(info);
if (subJson != 3) if (subJson != JSON_PATH_STATE_INFO)
{ {
JsonArray effects = lDoc.createNestedArray(F("effects")); JsonArray effects = lDoc.createNestedArray(F("effects"));
serializeModeNames(effects); // remove WLED-SR extensions from effect names serializeModeNames(effects); // remove WLED-SR extensions from effect names
@ -1043,4 +1083,4 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
#endif #endif
return true; return true;
} }
#endif #endif

View File

@ -12,7 +12,7 @@ static volatile byte presetToApply = 0;
static volatile byte callModeToApply = 0; static volatile byte callModeToApply = 0;
static volatile byte presetToSave = 0; static volatile byte presetToSave = 0;
static volatile int8_t saveLedmap = -1; static volatile int8_t saveLedmap = -1;
static char quickLoad[3]; static char quickLoad[9];
static char saveName[33]; static char saveName[33];
static bool includeBri = true, segBounds = true, selectedOnly = false, playlistSave = false;; static bool includeBri = true, segBounds = true, selectedOnly = false, playlistSave = false;;
@ -199,7 +199,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj)
presetToSave = index; presetToSave = index;
playlistSave = false; playlistSave = false;
if (sObj[F("ql")].is<const char*>()) strlcpy(quickLoad, sObj[F("ql")].as<const char*>(), 3); // only 2 chars for QL if (sObj[F("ql")].is<const char*>()) strlcpy(quickLoad, sObj[F("ql")].as<const char*>(), 9); // client limits QL to 2 chars, buffer for 8 bytes to allow unicode
sObj.remove("v"); sObj.remove("v");
sObj.remove("time"); sObj.remove("time");
sObj.remove(F("error")); sObj.remove(F("error"));

View File

@ -411,10 +411,10 @@ void handleNotifications()
for (size_t i = 0; i < strip.getSegmentsNum(); i++) { for (size_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i); Segment& seg = strip.getSegment(i);
if (!seg.isActive() || !seg.isSelected()) continue; if (!seg.isActive() || !seg.isSelected()) continue;
if (udpIn[8] < strip.getModeCount()) strip.setMode(i, udpIn[8]); seg.setMode(udpIn[8]);
seg.speed = udpIn[9]; seg.speed = udpIn[9];
if (version > 2) seg.intensity = udpIn[16]; if (version > 2) seg.intensity = udpIn[16];
if (version > 4 && udpIn[19] < strip.getPaletteCount()) seg.palette = udpIn[19]; if (version > 4) seg.setPalette(udpIn[19]);
} }
stateChanged = true; stateChanged = true;
} }

View File

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