Merge branch 'mdev' into audio_fastpath

This commit is contained in:
Ewoud
2023-05-17 11:58:43 +02:00
16 changed files with 762 additions and 661 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "wled",
"version": "0.14.0-b15.24",
"version": "0.14.0-b15.25",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "wled",
"version": "0.14.0-b15.24",
"version": "0.14.0-b15.25",
"license": "ISC",
"dependencies": {
"clean-css": "^4.2.3",

View File

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

View File

@@ -1,13 +1,12 @@
; Options
; -------
; USERMOD_DALLASTEMPERATURE - define this to have this user mod included wled00\usermods_list.cpp
; USERMOD_DALLASTEMPERATURE_CELSIUS - define this to report temperatures in degrees celsius, otherwise fahrenheit will be reported
; USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL - the number of milliseconds between measurements, defaults to 60 seconds
; USERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT - the number of milliseconds after boot to take first measurement, defaults to 20 seconds
;
[env:d1_mini_usermod_dallas_temperature_C]
extends = env:d1_mini
build_flags = ${common.build_flags_esp8266} -D USERMOD_DALLASTEMPERATURE -D USERMOD_DALLASTEMPERATURE_CELSIUS
build_flags = ${common.build_flags_esp8266} -D USERMOD_DALLASTEMPERATURE
lib_deps = ${env.lib_deps}
milesburton/DallasTemperature@^3.9.0
OneWire@~2.3.5
paulstoffregen/OneWire@~2.3.7
# you may want to use following with ESP32
; https://github.com/blazoncek/OneWire.git # fixes Sensor error on ESP32

View File

@@ -7,6 +7,8 @@ May be expanded with support for different sensor types in the future.
If temperature sensor is not detected during boot, this usermod will be disabled.
Maintained by @blazoncek
## Installation
Copy the example `platformio_override.ini` to the root directory. This file should be placed in the same directory as `platformio.ini`.
@@ -14,7 +16,7 @@ Copy the example `platformio_override.ini` to the root directory. This file sho
### Define Your Options
* `USERMOD_DALLASTEMPERATURE` - enables this user mod wled00/usermods_list.cpp
* `USERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT` - number of milliseconds after boot to take first measurement, defaults to 20000 ms
* `USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL` - number of milliseconds between measurements, defaults to 60000 ms (60s)
All parameters can be configured at runtime via the Usermods settings page, including pin, temperature in degrees Celsius or Farenheit and measurement interval.
@@ -27,7 +29,6 @@ All parameters can be configured at runtime via the Usermods settings page, incl
If you are using `platformio_override.ini`, you should be able to refresh the task list and see your custom task, for example `env:d1_mini_usermod_dallas_temperature_C`.
If you are not using `platformio_override.ini`, you might have to uncomment `OneWire@~2.3.5 under` `[common]` section in `platformio.ini`:
```ini
@@ -43,8 +44,9 @@ default_envs = d1_mini
lib_deps =
...
#For Dallas sensor uncomment following line
OneWire@~2.3.5
...
OneWire@~2.3.7
# ... or you may want to use following with ESP32
; https://github.com/blazoncek/OneWire.git # fixes Sensor error on ESP32...
```
## Change Log
@@ -56,3 +58,6 @@ lib_deps =
* Report the number of seconds until the first read in the info screen instead of sensor error
2021-04
* Adaptation for runtime configuration.
2023-05
* Rewrite to conform to newer recommendations.
* Recommended @blazoncek fork of OneWire for ESP32 to avoid Sensor error

View File

@@ -52,350 +52,378 @@ class UsermodTemperature : public Usermod {
static const char _parasitePin[];
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
float readDallas() {
byte data[9];
int16_t result; // raw data from sensor
float retVal = -127.0f;
if (oneWire->reset()) { // if reset() fails there are no OneWire devices
oneWire->skip(); // skip ROM
oneWire->write(0xBE); // read (temperature) from EEPROM
oneWire->read_bytes(data, 9); // first 2 bytes contain temperature
#ifdef WLED_DEBUG
if (OneWire::crc8(data,8) != data[8]) {
DEBUG_PRINTLN(F("CRC error reading temperature."));
for (byte i=0; i < 9; i++) DEBUG_PRINTF("0x%02X ", data[i]);
DEBUG_PRINT(F(" => "));
DEBUG_PRINTF("0x%02X\n", OneWire::crc8(data,8));
}
#endif
switch(sensorFound) {
case 0x10: // DS18S20 has 9-bit precision
result = (data[1] << 8) | data[0];
retVal = float(result) * 0.5f;
break;
case 0x22: // DS18B20
case 0x28: // DS1822
case 0x3B: // DS1825
case 0x42: // DS28EA00
result = (data[1]<<4) | (data[0]>>4); // we only need whole part, we will add fraction when returning
if (data[1] & 0x80) result |= 0xF000; // fix negative value
retVal = float(result) + ((data[0] & 0x08) ? 0.5f : 0.0f);
break;
}
}
for (byte i=1; i<9; i++) data[0] &= data[i];
return data[0]==0xFF ? -127.0f : retVal;
}
void requestTemperatures() {
DEBUG_PRINTLN(F("Requesting temperature."));
oneWire->reset();
oneWire->skip(); // skip ROM
oneWire->write(0x44,parasite); // request new temperature reading
if (parasite && parasitePin >=0 ) digitalWrite(parasitePin, HIGH); // has to happen within 10us (open MOSFET)
lastTemperaturesRequest = millis();
waitingForConversion = true;
}
void readTemperature() {
if (parasite && parasitePin >=0 ) digitalWrite(parasitePin, LOW); // deactivate power (close MOSFET)
temperature = readDallas();
lastMeasurement = millis();
waitingForConversion = false;
//DEBUG_PRINTF("Read temperature %2.1f.\n", temperature); // does not work properly on 8266
DEBUG_PRINT(F("Read temperature "));
DEBUG_PRINTLN(temperature);
}
bool findSensor() {
DEBUG_PRINTLN(F("Searching for sensor..."));
uint8_t deviceAddress[8] = {0,0,0,0,0,0,0,0};
// find out if we have DS18xxx sensor attached
oneWire->reset_search();
delay(10);
while (oneWire->search(deviceAddress)) {
DEBUG_PRINTLN(F("Found something..."));
if (oneWire->crc8(deviceAddress, 7) == deviceAddress[7]) {
switch (deviceAddress[0]) {
case 0x10: // DS18S20
case 0x22: // DS18B20
case 0x28: // DS1822
case 0x3B: // DS1825
case 0x42: // DS28EA00
DEBUG_PRINTLN(F("Sensor found."));
sensorFound = deviceAddress[0];
DEBUG_PRINTF("0x%02X\n", sensorFound);
return true;
}
}
}
DEBUG_PRINTLN(F("Sensor NOT found."));
return false;
}
float readDallas();
void requestTemperatures();
void readTemperature();
bool findSensor();
#ifndef WLED_DISABLE_MQTT
void publishHomeAssistantAutodiscovery() {
if (!WLED_MQTT_CONNECTED) return;
char json_str[1024], buf[128];
size_t payload_size;
StaticJsonDocument<1024> json;
sprintf_P(buf, PSTR("%s Temperature"), serverDescription);
json[F("name")] = buf;
strcpy(buf, mqttDeviceTopic);
strcat_P(buf, PSTR("/temperature"));
json[F("state_topic")] = buf;
json[F("device_class")] = F("temperature");
json[F("unique_id")] = escapedMac.c_str();
json[F("unit_of_measurement")] = F("°C");
payload_size = serializeJson(json, json_str);
sprintf_P(buf, PSTR("homeassistant/sensor/%s/config"), escapedMac.c_str());
mqtt->publish(buf, 0, true, json_str, payload_size);
HApublished = true;
}
void publishHomeAssistantAutodiscovery();
#endif
public:
UsermodTemperature(const char *name, bool enabled):Usermod(name, enabled) {} //WLEDMM: this shouldn't be necessary (passthrough of constructor), maybe because Usermod is an abstract class
void setup() {
int retries = 10;
sensorFound = 0;
temperature = -127.0f; // default to -127, DS18B20 only goes down to -50C
if (enabled) {
// config says we are enabled
USER_PRINTLN(F("Finding temperature pin..."));
// pin retrieved from cfg.json (readFromConfig()) prior to running setup()
if (temperaturePin >= 0 && pinManager.allocatePin(temperaturePin, true, PinOwner::UM_Temperature)) {
oneWire = new OneWire(temperaturePin);
if (oneWire->reset()) {
while (!findSensor() && retries--) {
delay(25); // try to find sensor
}
}
if (parasite && pinManager.allocatePin(parasitePin, true, PinOwner::UM_Temperature)) {
pinMode(parasitePin, OUTPUT);
digitalWrite(parasitePin, LOW); // deactivate power (close MOSFET)
} else {
parasitePin = -1;
}
} else {
if (temperaturePin >= 0) {
USER_PRINTLN(F("Temperature pin allocation failed."));
}
temperaturePin = -1; // allocation failed
}
}
lastMeasurement = millis() - readingInterval + 10000;
initDone = true;
USER_PRINTLN(F("temperature usermod initialized."));
}
void loop() {
unsigned long last_runtime = 0; // WLEDMM ensure that strip.isUpdating() will not block longer that 4000ms
if (!enabled || !sensorFound || (strip.isUpdating() && (millis()-last_runtime < 4000))) return; // WLEDMM be nice, but not too nice
last_runtime = millis();
static uint8_t errorCount = 0;
unsigned long now = millis();
// check to see if we are due for taking a measurement
// lastMeasurement will not be updated until the conversion
// is complete the the reading is finished
if (now - lastMeasurement < readingInterval) return;
// we are due for a measurement, if we are not already waiting
// for a conversion to complete, then make a new request for temps
if (!waitingForConversion) {
requestTemperatures();
return;
}
// we were waiting for a conversion to complete, have we waited log enough?
if (now - lastTemperaturesRequest >= 750 /* 93.75ms per the datasheet but can be up to 750ms */) {
readTemperature();
if (getTemperatureC() < -100.0f) {
if (++errorCount > 10) sensorFound = 0;
lastMeasurement = now - readingInterval + 300; // force new measurement in 300ms
return;
}
errorCount = 0;
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) {
char subuf[64];
strcpy(subuf, mqttDeviceTopic);
if (temperature > -100.0f) {
// dont publish super low temperature as the graph will get messed up
// the DallasTemperature library returns -127C or -196.6F when problem
// reading the sensor
strcat_P(subuf, PSTR("/temperature"));
mqtt->publish(subuf, 0, false, String(getTemperatureC()).c_str());
strcat_P(subuf, PSTR("_f"));
mqtt->publish(subuf, 0, false, String(getTemperatureF()).c_str());
} else {
// publish something else to indicate status?
}
}
#endif
}
}
/**
* connected() is called every time the WiFi is (re)connected
* Use it to initialize network interfaces
*/
//void connected() {}
#ifndef WLED_DISABLE_MQTT
/**
* subscribe to MQTT topic if needed
*/
void onMqttConnect(bool sessionPresent) {
//(re)subscribe to required topics
//char subuf[64];
if (mqttDeviceTopic[0] != 0) {
publishHomeAssistantAutodiscovery();
}
}
#endif
/*
* API calls te enable data exchange between WLED modules
*/
inline float getTemperatureC() {
return (float)temperature;
inline float getTemperatureC() { return temperature; }
inline float getTemperatureF() { return temperature * 1.8f + 32.0f; }
float getTemperature();
const char *getTemperatureUnit();
uint16_t getId() { return USERMOD_ID_TEMPERATURE; }
void setup();
void loop();
//void connected();
#ifndef WLED_DISABLE_MQTT
void onMqttConnect(bool sessionPresent);
#endif
//void onUpdateBegin(bool init);
//bool handleButton(uint8_t b);
//void handleOverlayDraw();
void addToJsonInfo(JsonObject& root);
//void addToJsonState(JsonObject &root);
//void readFromJsonState(JsonObject &root);
void addToConfig(JsonObject &root);
bool readFromConfig(JsonObject &root);
void appendConfigData();
};
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
float UsermodTemperature::readDallas() {
byte data[9];
int16_t result; // raw data from sensor
float retVal = -127.0f;
if (oneWire->reset()) { // if reset() fails there are no OneWire devices
oneWire->skip(); // skip ROM
oneWire->write(0xBE); // read (temperature) from EEPROM
oneWire->read_bytes(data, 9); // first 2 bytes contain temperature
#ifdef WLED_DEBUG
if (OneWire::crc8(data,8) != data[8]) {
DEBUG_PRINTLN(F("CRC error reading temperature."));
for (byte i=0; i < 9; i++) DEBUG_PRINTF("0x%02X ", data[i]);
DEBUG_PRINT(F(" => "));
DEBUG_PRINTF("0x%02X\n", OneWire::crc8(data,8));
}
inline float getTemperatureF() {
return (float)temperature * 1.8f + 32;
#endif
switch(sensorFound) {
case 0x10: // DS18S20 has 9-bit precision
result = (data[1] << 8) | data[0];
retVal = float(result) * 0.5f;
break;
case 0x22: // DS18B20
case 0x28: // DS1822
case 0x3B: // DS1825
case 0x42: // DS28EA00
result = (data[1]<<4) | (data[0]>>4); // we only need whole part, we will add fraction when returning
if (data[1] & 0x80) result |= 0xF000; // fix negative value
retVal = float(result) + ((data[0] & 0x08) ? 0.5f : 0.0f);
break;
}
}
for (byte i=1; i<9; i++) data[0] &= data[i];
return data[0]==0xFF ? -127.0f : retVal;
}
/*
* addToJsonInfo() can be used to add custom entries to the /json/info part of the JSON API.
* Creating an "u" object allows you to add custom key/value pairs to the Info section of the WLED web UI.
* Below it is shown how this could be used for e.g. a light sensor
*/
void addToJsonInfo(JsonObject& root) {
// dont add temperature to info if we are disabled
if (!enabled) return;
void UsermodTemperature::requestTemperatures() {
DEBUG_PRINTLN(F("Requesting temperature."));
oneWire->reset();
oneWire->skip(); // skip ROM
oneWire->write(0x44,parasite); // request new temperature reading
if (parasite && parasitePin >=0 ) digitalWrite(parasitePin, HIGH); // has to happen within 10us (open MOSFET)
lastTemperaturesRequest = millis();
waitingForConversion = true;
}
JsonObject user = root["u"];
if (user.isNull()) user = root.createNestedObject("u");
void UsermodTemperature::readTemperature() {
if (parasite && parasitePin >=0 ) digitalWrite(parasitePin, LOW); // deactivate power (close MOSFET)
temperature = readDallas();
lastMeasurement = millis();
waitingForConversion = false;
//DEBUG_PRINTF("Read temperature %2.1f.\n", temperature); // does not work properly on 8266
DEBUG_PRINT(F("Read temperature "));
DEBUG_PRINTLN(temperature);
}
JsonArray temp = user.createNestedArray(FPSTR(_name));
if (temperature <= -100.0f) {
temp.add(0);
temp.add(F(" Sensor Error!"));
return;
bool UsermodTemperature::findSensor() {
DEBUG_PRINTLN(F("Searching for sensor..."));
uint8_t deviceAddress[8] = {0,0,0,0,0,0,0,0};
// find out if we have DS18xxx sensor attached
oneWire->reset_search();
delay(10);
while (oneWire->search(deviceAddress)) {
DEBUG_PRINTLN(F("Found something..."));
if (oneWire->crc8(deviceAddress, 7) == deviceAddress[7]) {
switch (deviceAddress[0]) {
case 0x10: // DS18S20
case 0x22: // DS18B20
case 0x28: // DS1822
case 0x3B: // DS1825
case 0x42: // DS28EA00
DEBUG_PRINTLN(F("Sensor found."));
sensorFound = deviceAddress[0];
DEBUG_PRINTF("0x%02X\n", sensorFound);
return true;
}
temp.add(degC ? getTemperatureC() : getTemperatureF());
temp.add(degC ? F("°C") : F("°F"));
JsonObject sensor = root[F("sensor")];
if (sensor.isNull()) sensor = root.createNestedObject(F("sensor"));
temp = sensor.createNestedArray(F("temp"));
temp.add(degC ? temperature : (float)temperature * 1.8f + 32);
temp.add(degC ? F("°C") : F("°F"));
}
}
DEBUG_PRINTLN(F("Sensor NOT found."));
return false;
}
/**
* addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object).
* Values in the state object may be modified by connected clients
*/
//void addToJsonState(JsonObject &root)
//{
//}
#ifndef WLED_DISABLE_MQTT
void UsermodTemperature::publishHomeAssistantAutodiscovery() {
if (!WLED_MQTT_CONNECTED) return;
/**
* readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object).
* Values in the state object may be modified by connected clients
* Read "<usermodname>_<usermodparam>" from json state and and change settings (i.e. GPIO pin) used.
*/
//void readFromJsonState(JsonObject &root) {
// if (!initDone) return; // prevent crash on boot applyPreset()
//}
char json_str[1024], buf[128];
size_t payload_size;
StaticJsonDocument<1024> json;
/**
* addToConfig() (called from set.cpp) stores persistent properties to cfg.json
*/
void addToConfig(JsonObject &root) {
Usermod::addToConfig(root);
JsonObject top = root[FPSTR(_name)];
sprintf_P(buf, PSTR("%s Temperature"), serverDescription);
json[F("name")] = buf;
strcpy(buf, mqttDeviceTopic);
strcat_P(buf, PSTR("/temperature"));
json[F("state_topic")] = buf;
json[F("device_class")] = F("temperature");
json[F("unique_id")] = escapedMac.c_str();
json[F("unit_of_measurement")] = F("°C");
payload_size = serializeJson(json, json_str);
// we add JSON object: {"Temperature": {"pin": 0, "degC": true}}
top["pin"] = temperaturePin; // usermodparam
top["degC"] = degC; // usermodparam
top[FPSTR(_readInterval)] = readingInterval / 1000;
top[FPSTR(_parasite)] = parasite;
top[FPSTR(_parasitePin)] = parasitePin;
DEBUG_PRINTLN(F("Temperature config saved."));
}
sprintf_P(buf, PSTR("homeassistant/sensor/%s/config"), escapedMac.c_str());
mqtt->publish(buf, 0, true, json_str, payload_size);
HApublished = true;
}
#endif
/**
* readFromConfig() is called before setup() to populate properties from values stored in cfg.json
*
* The function should return true if configuration was successfully loaded or false if there was no configuration.
*/
bool readFromConfig(JsonObject &root) {
/*bool configComplete = */Usermod::readFromConfig(root); //WLEDMM: configComplete not implemented here (todo?)
JsonObject top = root[FPSTR(_name)];
DEBUG_PRINT(FPSTR(_name));
// we look for JSON object: {"Temperature": {"pin": 0, "degC": true}}
int8_t newTemperaturePin = temperaturePin;
if (top.isNull()) {
DEBUG_PRINTLN(F(": No config found. (Using defaults.)"));
return false;
}
newTemperaturePin = top["pin"] | newTemperaturePin;
degC = top["degC"] | degC;
readingInterval = top[FPSTR(_readInterval)] | readingInterval/1000;
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
parasite = top[FPSTR(_parasite)] | parasite;
parasitePin = top[FPSTR(_parasitePin)] | parasitePin;
if (!initDone) {
// first run: reading from cfg.json
temperaturePin = newTemperaturePin;
DEBUG_PRINTLN(F(" config loaded."));
} else {
DEBUG_PRINTLN(F(" config (re)loaded."));
// changing paramters from settings page
if (newTemperaturePin != temperaturePin) {
DEBUG_PRINTLN(F("Re-init temperature."));
// deallocate pin and release memory
delete oneWire;
pinManager.deallocatePin(temperaturePin, PinOwner::UM_Temperature);
temperaturePin = newTemperaturePin;
pinManager.deallocatePin(parasitePin, PinOwner::UM_Temperature);
// initialise
setup();
void UsermodTemperature::setup() {
int retries = 10;
sensorFound = 0;
temperature = -127.0f; // default to -127, DS18B20 only goes down to -50C
if (enabled) {
// config says we are enabled
DEBUG_PRINTLN(F("Allocating temperature pin..."));
// pin retrieved from cfg.json (readFromConfig()) prior to running setup()
if (temperaturePin >= 0 && pinManager.allocatePin(temperaturePin, true, PinOwner::UM_Temperature)) {
oneWire = new OneWire(temperaturePin);
if (oneWire->reset()) {
while (!findSensor() && retries--) {
delay(25); // try to find sensor
}
}
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
return !top[FPSTR(_parasitePin)].isNull();
if (parasite && pinManager.allocatePin(parasitePin, true, PinOwner::UM_Temperature)) {
pinMode(parasitePin, OUTPUT);
digitalWrite(parasitePin, LOW); // deactivate power (close MOSFET)
} else {
parasitePin = -1;
}
} else {
if (temperaturePin >= 0) {
DEBUG_PRINTLN(F("Temperature pin allocation failed."));
}
temperaturePin = -1; // allocation failed
}
}
lastMeasurement = millis() - readingInterval + 10000;
initDone = true;
}
void appendConfigData()
{
oappend(SET_F("addHB('Temperature');")); // WLEDMM
oappend(SET_F("addInfo('Temperature:parasite-pwr")); //WLEDMM use literals
oappend(SET_F("',1,'<i>(if no Vcc connected)</i>');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('Temperature:parasite-pwr-pin")); //WLEDMM use literals
oappend(SET_F("',1,'<i>(for external MOSFET)</i>');")); // 0 is field type, 1 is actual field
}
void UsermodTemperature::loop() {
if (!enabled || !sensorFound || strip.isUpdating()) return;
uint16_t getId()
{
return USERMOD_ID_TEMPERATURE;
static uint8_t errorCount = 0;
unsigned long now = millis();
// check to see if we are due for taking a measurement
// lastMeasurement will not be updated until the conversion
// is complete the the reading is finished
if (now - lastMeasurement < readingInterval) return;
// we are due for a measurement, if we are not already waiting
// for a conversion to complete, then make a new request for temps
if (!waitingForConversion) {
requestTemperatures();
return;
}
// we were waiting for a conversion to complete, have we waited log enough?
if (now - lastTemperaturesRequest >= 750 /* 93.75ms per the datasheet but can be up to 750ms */) {
readTemperature();
if (getTemperatureC() < -100.0f) {
if (++errorCount > 10) sensorFound = 0;
lastMeasurement = now - readingInterval + 300; // force new measurement in 300ms
return;
}
};
errorCount = 0;
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) {
char subuf[64];
strcpy(subuf, mqttDeviceTopic);
if (temperature > -100.0f) {
// dont publish super low temperature as the graph will get messed up
// the DallasTemperature library returns -127C or -196.6F when problem
// reading the sensor
strcat_P(subuf, PSTR("/temperature"));
mqtt->publish(subuf, 0, false, String(getTemperatureC()).c_str());
strcat_P(subuf, PSTR("_f"));
mqtt->publish(subuf, 0, false, String(getTemperatureF()).c_str());
} else {
// publish something else to indicate status?
}
}
#endif
}
}
/**
* connected() is called every time the WiFi is (re)connected
* Use it to initialize network interfaces
*/
//void UsermodTemperature::connected() {}
#ifndef WLED_DISABLE_MQTT
/**
* subscribe to MQTT topic if needed
*/
void UsermodTemperature::onMqttConnect(bool sessionPresent) {
//(re)subscribe to required topics
//char subuf[64];
if (mqttDeviceTopic[0] != 0) {
publishHomeAssistantAutodiscovery();
}
}
#endif
/*
* addToJsonInfo() can be used to add custom entries to the /json/info part of the JSON API.
* Creating an "u" object allows you to add custom key/value pairs to the Info section of the WLED web UI.
* Below it is shown how this could be used for e.g. a light sensor
*/
void UsermodTemperature::addToJsonInfo(JsonObject& root) {
// dont add temperature to info if we are disabled
if (!enabled) return;
JsonObject user = root["u"];
if (user.isNull()) user = root.createNestedObject("u");
JsonArray temp = user.createNestedArray(FPSTR(_name));
if (temperature <= -100.0f) {
temp.add(0);
temp.add(F(" Sensor Error!"));
return;
}
temp.add(getTemperature());
temp.add(getTemperatureUnit());
JsonObject sensor = root[F("sensor")];
if (sensor.isNull()) sensor = root.createNestedObject(F("sensor"));
temp = sensor.createNestedArray(F("temperature"));
temp.add(getTemperature());
temp.add(getTemperatureUnit());
}
/**
* addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object).
* Values in the state object may be modified by connected clients
*/
//void UsermodTemperature::addToJsonState(JsonObject &root)
//{
//}
/**
* readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object).
* Values in the state object may be modified by connected clients
* Read "<usermodname>_<usermodparam>" from json state and and change settings (i.e. GPIO pin) used.
*/
//void UsermodTemperature::readFromJsonState(JsonObject &root) {
// if (!initDone) return; // prevent crash on boot applyPreset()
//}
/**
* addToConfig() (called from set.cpp) stores persistent properties to cfg.json
*/
void UsermodTemperature::addToConfig(JsonObject &root) {
// we add JSON object: {"Temperature": {"pin": 0, "degC": true}}
//WLEDMM: call superclass
Usermod::addToConfig(root);
JsonObject top = root[FPSTR(_name)];
top["pin"] = temperaturePin; // usermodparam
top["degC"] = degC; // usermodparam
top[FPSTR(_readInterval)] = readingInterval / 1000;
top[FPSTR(_parasite)] = parasite;
top[FPSTR(_parasitePin)] = parasitePin;
DEBUG_PRINTLN(F("Temperature config saved."));
}
/**
* readFromConfig() is called before setup() to populate properties from values stored in cfg.json
*
* The function should return true if configuration was successfully loaded or false if there was no configuration.
*/
bool UsermodTemperature::readFromConfig(JsonObject &root) {
// we look for JSON object: {"Temperature": {"pin": 0, "degC": true}}
//WLEDMM call superclass
Usermod::readFromConfig(root); //WLEDMM: configComplete not implemented here (todo?)
JsonObject top = root[FPSTR(_name)];
DEBUG_PRINT(FPSTR(_name));
int8_t newTemperaturePin = temperaturePin;
if (top.isNull()) {
DEBUG_PRINTLN(F(": No config found. (Using defaults.)"));
return false;
}
newTemperaturePin = top["pin"] | newTemperaturePin;
degC = top["degC"] | degC;
readingInterval = top[FPSTR(_readInterval)] | readingInterval/1000;
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
parasite = top[FPSTR(_parasite)] | parasite;
parasitePin = top[FPSTR(_parasitePin)] | parasitePin;
if (!initDone) {
// first run: reading from cfg.json
temperaturePin = newTemperaturePin;
DEBUG_PRINTLN(F(" config loaded."));
} else {
DEBUG_PRINTLN(F(" config (re)loaded."));
// changing paramters from settings page
if (newTemperaturePin != temperaturePin) {
DEBUG_PRINTLN(F("Re-init temperature."));
// deallocate pin and release memory
delete oneWire;
pinManager.deallocatePin(temperaturePin, PinOwner::UM_Temperature);
temperaturePin = newTemperaturePin;
pinManager.deallocatePin(parasitePin, PinOwner::UM_Temperature);
// initialise
setup();
}
}
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
return !top[FPSTR(_parasitePin)].isNull();
}
void UsermodTemperature::appendConfigData() {
oappend(SET_F("addHB('Temperature');")); // WLEDMM
oappend(SET_F("addInfo('")); oappend(String(FPSTR(_name)).c_str()); oappend(SET_F(":")); oappend(String(FPSTR(_parasite)).c_str());
oappend(SET_F("',1,'<i>(if no Vcc connected)</i>');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('")); oappend(String(FPSTR(_name)).c_str()); oappend(SET_F(":")); oappend(String(FPSTR(_parasitePin)).c_str());
oappend(SET_F("',1,'<i>(for external MOSFET)</i>');")); // 0 is field type, 1 is actual field
}
float UsermodTemperature::getTemperature() {
return degC ? getTemperatureC() : getTemperatureF();
}
const char *UsermodTemperature::getTemperatureUnit() {
return degC ? "°C" : "°F";
}
// strings to reduce flash memory usage (used more than twice)
const char UsermodTemperature::_readInterval[] PROGMEM = "read-interval-s";

View File

@@ -1,31 +0,0 @@
#include "wled.h"
/*
* Register your v2 usermods here!
*/
/*
* Add/uncomment your usermod filename here (and once more below)
* || || ||
* \/ \/ \/
*/
//#include "usermod_v2_example.h"
#ifdef USERMOD_DALLASTEMPERATURE
#include "../usermods/Temperature/usermod_temperature.h"
#endif
//#include "usermod_v2_empty.h"
void registerUsermods()
{
/*
* Add your usermod class name here
* || || ||
* \/ \/ \/
*/
//usermods.add(new MyExampleUsermod());
#ifdef USERMOD_DALLASTEMPERATURE
usermods.add(new UsermodTemperature());
#endif
//usermods.add(new UsermodRenameMe());
}

View File

@@ -7631,6 +7631,7 @@ uint16_t mode_2Ddistortionwaves() {
}
static const char _data_FX_MODE_2DDISTORTIONWAVES[] PROGMEM = "Distortion Waves@!,Scale;;;2";
//Soap
//@Stepko
//Idea from https://www.youtube.com/watch?v=DiHBgITrZck&ab_channel=StefanPetrick
@@ -7648,8 +7649,10 @@ uint16_t mode_2Dsoap() {
uint32_t *noise32_x = reinterpret_cast<uint32_t*>(SEGENV.data + dataSize);
uint32_t *noise32_y = reinterpret_cast<uint32_t*>(SEGENV.data + dataSize + sizeof(uint32_t));
uint32_t *noise32_z = reinterpret_cast<uint32_t*>(SEGENV.data + dataSize + sizeof(uint32_t)*2);
uint32_t scale32_x = 160000U/cols;
uint32_t scale32_y = 160000U/rows;
const uint32_t scale32_x = 160000U/cols;
const uint32_t scale32_y = 160000U/rows;
const uint32_t mov = MIN(cols,rows)*(SEGMENT.speed+2)/2;
const uint8_t smoothness = MIN(250,SEGMENT.intensity); // limit as >250 produces very little changes
// init
if (SEGENV.call == 0) {
@@ -7657,28 +7660,28 @@ uint16_t mode_2Dsoap() {
*noise32_x = random16();
*noise32_y = random16();
*noise32_z = random16();
for (int i = 0; i < cols; i++) {
int32_t ioffset = scale32_x * (i - cols / 2);
for (int j = 0; j < rows; j++) {
int32_t joffset = scale32_y * (j - rows / 2);
uint8_t data = inoise16(*noise32_x + ioffset, *noise32_y + joffset, *noise32_z) >> 8;
noise3d[XY(i,j)] = scale8(noise3d[XY(i,j)], SEGMENT.intensity) + scale8(data, 255 - SEGMENT.intensity);
SEGMENT.setPixelColorXY(i, j, ColorFromPalette(SEGPALETTE,~noise3d[XY(i,j)]*3));
}
}
} else {
*noise32_x += mov;
*noise32_y += mov;
*noise32_z += mov;
}
uint32_t mov = MAX(cols,rows)*(SEGMENT.speed+1)/2;
*noise32_x += mov;
*noise32_y += mov;
*noise32_z += mov;
for (int i = 0; i < cols; i++) {
int32_t ioffset = scale32_x * (i - cols / 2);
for (int j = 0; j < rows; j++) {
int32_t joffset = scale32_y * (j - rows / 2);
uint8_t data = inoise16(*noise32_x + ioffset, *noise32_y + joffset, *noise32_z) >> 8;
noise3d[XY(i,j)] = scale8(noise3d[XY(i,j)], SEGMENT.intensity) + scale8(data, 256 - SEGMENT.intensity);
noise3d[XY(i,j)] = scale8(noise3d[XY(i,j)], smoothness) + scale8(data, 255 - smoothness);
}
}
// init also if dimensions changed
if (SEGENV.call == 0 || SEGMENT.aux0 != cols || SEGMENT.aux1 != rows) {
SEGMENT.aux0 = cols;
SEGMENT.aux1 = rows;
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
SEGMENT.setPixelColorXY(i, j, ColorFromPalette(SEGPALETTE,~noise3d[XY(i,j)]*3));
}
}
}
@@ -7740,6 +7743,85 @@ uint16_t mode_2Dsoap() {
}
static const char _data_FX_MODE_2DSOAP[] PROGMEM = "Soap@!,Smoothness;;!;2";
//Idea from https://www.youtube.com/watch?v=HsA-6KIbgto&ab_channel=GreatScott%21
//Octopus (https://editor.soulmatelights.com/gallery/671-octopus)
//Stepko and Sutaburosu
// adapted for WLED by @blazoncek
uint16_t mode_2Doctopus() {
if (!strip.isMatrix) return mode_static(); // not a 2D set-up
const uint16_t cols = SEGMENT.virtualWidth();
const uint16_t rows = SEGMENT.virtualHeight();
const uint8_t mapp = 180 / MAX(cols,rows);
typedef struct {
uint8_t angle;
uint8_t radius;
} map_t;
const size_t dataSize = SEGMENT.width() * SEGMENT.height() * sizeof(map_t); // prevent reallocation if mirrored or grouped
if (!SEGENV.allocateData(dataSize + 2)) return mode_static(); //allocation failed
map_t *rMap = reinterpret_cast<map_t*>(SEGENV.data);
uint8_t *offsX = reinterpret_cast<uint8_t*>(SEGENV.data + dataSize);
uint8_t *offsY = reinterpret_cast<uint8_t*>(SEGENV.data + dataSize + 1);
// re-init if SEGMENT dimensions or offset changed
if (SEGENV.call == 0 || SEGENV.aux0 != cols || SEGENV.aux1 != rows || SEGMENT.custom1 != *offsX || SEGMENT.custom2 != *offsY) {
SEGENV.step = 0; // t
SEGENV.aux0 = cols;
SEGENV.aux1 = rows;
*offsX = SEGMENT.custom1;
*offsY = SEGMENT.custom2;
const uint8_t C_X = cols / 2 + (SEGMENT.custom1 - 128)*cols/255;
const uint8_t C_Y = rows / 2 + (SEGMENT.custom2 - 128)*rows/255;
for (int x = 0; x < cols; x++) {
for (int y = 0; y < rows; y++) {
rMap[XY(x, y)].angle = 40.7436f * atan2f(y - C_Y, x - C_X); // avoid 128*atan2()/PI
rMap[XY(x, y)].radius = hypotf(x - C_X, y - C_Y) * mapp; //thanks Sutaburosu
}
}
}
SEGENV.step += SEGMENT.speed / 32 + 1; // 1-4 range
for (int x = 0; x < cols; x++) {
for (int y = 0; y < rows; y++) {
byte angle = rMap[XY(x,y)].angle;
byte radius = rMap[XY(x,y)].radius;
//CRGB c = CHSV(SEGENV.step / 2 - radius, 255, sin8(sin8((angle * 4 - radius) / 4 + SEGENV.step) + radius - SEGENV.step * 2 + angle * (SEGMENT.custom3/3+1)));
uint16_t intensity = sin8(sin8((angle * 4 - radius) / 4 + SEGENV.step/2) + radius - SEGENV.step + angle * (SEGMENT.custom3/4+1));
intensity = map(intensity*intensity, 0, 65535, 0, 255); // add a bit of non-linearity for cleaner display
CRGB c = ColorFromPalette(SEGPALETTE, SEGENV.step / 2 - radius, intensity);
SEGMENT.setPixelColorXY(x, y, c);
}
}
return FRAMETIME;
}
static const char _data_FX_MODE_2DOCTOPUS[] PROGMEM = "Octopus@!,,Offset X,Offset Y,Legs;;!;2;";
//Waving Cell
//@Stepko (https://editor.soulmatelights.com/gallery/1704-wavingcells)
// adapted for WLED by @blazoncek
uint16_t mode_2Dwavingcell() {
if (!strip.isMatrix) return mode_static(); // not a 2D set-up
const uint16_t cols = SEGMENT.virtualWidth();
const uint16_t rows = SEGMENT.virtualHeight();
uint32_t t = millis()/(257-SEGMENT.speed);
uint8_t aX = SEGMENT.custom1/16 + 9;
uint8_t aY = SEGMENT.custom2/16 + 1;
uint8_t aZ = SEGMENT.custom3 + 1;
for (int x = 0; x < cols; x++) for (int y = 0; y <rows; y++)
SEGMENT.setPixelColorXY(x, y, ColorFromPalette(SEGPALETTE, ((sin8((x*aX)+sin8((y+t)*aY))+cos8(y*aZ))+1)+t));
return FRAMETIME;
}
static const char _data_FX_MODE_2DWAVINGCELL[] PROGMEM = "Waving Cell@!,,Amplitude 1,Amplitude 2,Amplitude 3;;!;2";
#endif // WLED_DISABLE_2D
@@ -7974,6 +8056,8 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_2DDNASPIRAL, &mode_2DDNASpiral, _data_FX_MODE_2DDNASPIRAL);
addEffect(FX_MODE_2DBLACKHOLE, &mode_2DBlackHole, _data_FX_MODE_2DBLACKHOLE);
addEffect(FX_MODE_2DSOAP, &mode_2Dsoap, _data_FX_MODE_2DSOAP);
addEffect(FX_MODE_2DOCTOPUS, &mode_2Doctopus, _data_FX_MODE_2DOCTOPUS);
addEffect(FX_MODE_2DWAVINGCELL, &mode_2Dwavingcell, _data_FX_MODE_2DWAVINGCELL);
addEffect(FX_MODE_2DAKEMI, &mode_2DAkemi, _data_FX_MODE_2DAKEMI); // audio
#endif // WLED_DISABLE_2D

View File

@@ -268,6 +268,8 @@
#define FX_MODE_2DDRIFTROSE 123 //gap fill
#define FX_MODE_2DDISTORTIONWAVES 124 //gap fill
#define FX_MODE_2DSOAP 125 //gap fill
#define FX_MODE_2DOCTOPUS 126 //gap fill
#define FX_MODE_2DWAVINGCELL 127 //gap fill
// WLED-SR effects (SR compatible IDs !!!)
#define FX_MODE_PIXELS 128

View File

@@ -276,7 +276,7 @@
#define BTN_TYPE_ANALOG_INVERTED 8
//Ethernet board types
#define WLED_NUM_ETH_TYPES 10
#define WLED_NUM_ETH_TYPES 11
#define WLED_ETH_NONE 0
#define WLED_ETH_WT32_ETH01 1
@@ -285,7 +285,10 @@
#define WLED_ETH_QUINLED 4
#define WLED_ETH_TWILIGHTLORD 5
#define WLED_ETH_ESP32DEUX 6
#define WLED_ETH_ESP32ETHKITVE 7
#define WLED_ETH_QUINLED_OCTA 8
#define WLED_ETH_ABCWLEDV43ETH 9
#define WLED_ETH_SERG74 10
//Hue error codes
#define HUE_ERROR_INACTIVE 0

View File

@@ -192,6 +192,7 @@
<option value="7">KIT-VE</option>
<option value="8">QuinLED-Dig-Octa</option>
<option value="4">QuinLED-ESP32</option>
<option value="10">Serg74-ETH32</option>
<option value="5">TwilightLord-ESP32</option>
<option value="3">WESP32</option>
<option value="1">WT32-ETH01</option>

View File

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

View File

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

View File

@@ -189,7 +189,7 @@ void sendImprovInfoResponse() {
out[11] = 4; //Firmware len ("WLED")
out[12] = 'W'; out[13] = 'L'; out[14] = 'E'; out[15] = 'D';
uint8_t lengthSum = 17;
uint8_t vlen = sprintf_P(out+lengthSum,PSTR("0.14.0-b15.24/%i"),VERSION);
uint8_t vlen = sprintf_P(out+lengthSum,PSTR("0.14.0-b15.25/%i"),VERSION);
out[16] = vlen; lengthSum += vlen;
uint8_t hlen = 7;
#ifdef ESP8266

View File

@@ -27,22 +27,22 @@ const ethernet_settings ethernetBoards[] = {
// These pins do not appear to work from my testing:
// IO35, IO36, IO39
{
1, // eth_address,
16, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_LAN8720, // eth_type,
ETH_CLOCK_GPIO0_IN // eth_clk_mode
1, // eth_address,
16, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_LAN8720, // eth_type,
ETH_CLOCK_GPIO0_IN // eth_clk_mode
},
// ESP32-POE
{
0, // eth_address,
12, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_LAN8720, // eth_type,
ETH_CLOCK_GPIO17_OUT // eth_clk_mode
0, // eth_address,
12, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_LAN8720, // eth_type,
ETH_CLOCK_GPIO17_OUT // eth_clk_mode
},
// WESP32
@@ -88,11 +88,11 @@ const ethernet_settings ethernetBoards[] = {
// ESP32-ETHERNET-KIT-VE
{
0, // eth_address,
5, // eth_power,
5, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_IP101, // eth_type,
ETH_CLOCK_GPIO0_IN // eth_clk_mode
ETH_PHY_IP101, // eth_type,
ETH_CLOCK_GPIO0_IN // eth_clk_mode
},
// QuinLed-Dig-Octa Brainboard-32-8L and LilyGO-T-ETH-POE
@@ -115,6 +115,15 @@ const ethernet_settings ethernetBoards[] = {
ETH_CLOCK_GPIO17_OUT // eth_clk_mode
},
// Serg74-ESP32 Ethernet Shield
{
1, // eth_address,
5, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_LAN8720, // eth_type,
ETH_CLOCK_GPIO17_OUT // eth_clk_mode
}
};
#endif

View File

@@ -189,7 +189,7 @@ void realtimeLock(uint32_t timeoutMs, byte md)
void exitRealtime() {
if (!realtimeMode) return;
if (realtimeOverride == REALTIME_OVERRIDE_ONCE) realtimeOverride = REALTIME_OVERRIDE_NONE;
strip.setBrightness(scaledBri(bri));
strip.setBrightness(scaledBri(bri), true);
realtimeTimeout = 0; // cancel realtime mode immediately
realtimeMode = REALTIME_MODE_INACTIVE; // inform UI immediately
realtimeIP[0] = 0;

View File

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