Merge branch 'master' into merge-master

This commit is contained in:
Blaz Kristan 2022-04-04 20:52:42 +02:00
commit 081f211231
32 changed files with 2111 additions and 416 deletions

6
package-lock.json generated
View File

@ -1339,9 +1339,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.5", "version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.5", "version": "0.5.5",

View File

@ -482,6 +482,15 @@ board_build.ldscript = ${common.ldscript_2m512k}
build_flags = ${common.build_flags_esp8266} -D WLED_USE_IC_CCT -D BTNPIN=-1 -D IRPIN=-1 -D WLED_DISABLE_INFRARED build_flags = ${common.build_flags_esp8266} -D WLED_USE_IC_CCT -D BTNPIN=-1 -D IRPIN=-1 -D WLED_DISABLE_INFRARED
lib_deps = ${esp8266.lib_deps} lib_deps = ${esp8266.lib_deps}
[env:MY9291]
board = esp01_1m
platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_1m128k}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_DISABLE_OTA -D USERMOD_MY9291
lib_deps = ${esp8266.lib_deps}
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# travis test board configurations # travis test board configurations
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

321
usermods/MY9291/MY92xx.h Normal file
View File

@ -0,0 +1,321 @@
/*
MY92XX LED Driver for Arduino
Based on the C driver by MaiKe Labs
Copyright (c) 2016 - 2026 MaiKe Labs
Copyright (C) 2017 - 2018 Xose Pérez for the Arduino compatible library
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _my92xx_h
#define _my92xx_h
#include <Arduino.h>
#ifdef DEBUG_MY92XX
#if ARDUINO_ARCH_ESP8266
#define DEBUG_MSG_MY92XX(...) DEBUG_MY92XX.printf( __VA_ARGS__ )
#elif ARDUINO_ARCH_AVR
#define DEBUG_MSG_MY92XX(...) { char buffer[80]; snprintf(buffer, sizeof(buffer), __VA_ARGS__ ); DEBUG_MY92XX.print(buffer); }
#endif
#else
#define DEBUG_MSG_MY92XX(...)
#endif
typedef enum my92xx_model_t {
MY92XX_MODEL_MY9291 = 0X00,
MY92XX_MODEL_MY9231 = 0X01,
} my92xx_model_t;
typedef enum my92xx_cmd_one_shot_t {
MY92XX_CMD_ONE_SHOT_DISABLE = 0X00,
MY92XX_CMD_ONE_SHOT_ENFORCE = 0X01,
} my92xx_cmd_one_shot_t;
typedef enum my92xx_cmd_reaction_t {
MY92XX_CMD_REACTION_FAST = 0X00,
MY92XX_CMD_REACTION_SLOW = 0X01,
} my92xx_cmd_reaction_t;
typedef enum my92xx_cmd_bit_width_t {
MY92XX_CMD_BIT_WIDTH_16 = 0X00,
MY92XX_CMD_BIT_WIDTH_14 = 0X01,
MY92XX_CMD_BIT_WIDTH_12 = 0X02,
MY92XX_CMD_BIT_WIDTH_8 = 0X03,
} my92xx_cmd_bit_width_t;
typedef enum my92xx_cmd_frequency_t {
MY92XX_CMD_FREQUENCY_DIVIDE_1 = 0X00,
MY92XX_CMD_FREQUENCY_DIVIDE_4 = 0X01,
MY92XX_CMD_FREQUENCY_DIVIDE_16 = 0X02,
MY92XX_CMD_FREQUENCY_DIVIDE_64 = 0X03,
} my92xx_cmd_frequency_t;
typedef enum my92xx_cmd_scatter_t {
MY92XX_CMD_SCATTER_APDM = 0X00,
MY92XX_CMD_SCATTER_PWM = 0X01,
} my92xx_cmd_scatter_t;
typedef struct {
my92xx_cmd_scatter_t scatter : 1;
my92xx_cmd_frequency_t frequency : 2;
my92xx_cmd_bit_width_t bit_width : 2;
my92xx_cmd_reaction_t reaction : 1;
my92xx_cmd_one_shot_t one_shot : 1;
unsigned char resv : 1;
} __attribute__((aligned(1), packed)) my92xx_cmd_t;
#define MY92XX_COMMAND_DEFAULT { \
.scatter = MY92XX_CMD_SCATTER_APDM, \
.frequency = MY92XX_CMD_FREQUENCY_DIVIDE_1, \
.bit_width = MY92XX_CMD_BIT_WIDTH_8, \
.reaction = MY92XX_CMD_REACTION_FAST, \
.one_shot = MY92XX_CMD_ONE_SHOT_DISABLE, \
.resv = 0 \
}
class my92xx {
public:
my92xx(my92xx_model_t model, unsigned char chips, unsigned char di, unsigned char dcki, my92xx_cmd_t command);
unsigned char getChannels();
void setChannel(unsigned char channel, unsigned int value);
unsigned int getChannel(unsigned char channel);
void setState(bool state);
bool getState();
void update();
private:
void _di_pulse(unsigned int times);
void _dcki_pulse(unsigned int times);
void _set_cmd(my92xx_cmd_t command);
void _send();
void _write(unsigned int data, unsigned char bit_length);
my92xx_cmd_t _command;
my92xx_model_t _model = MY92XX_MODEL_MY9291;
unsigned char _chips = 1;
unsigned char _channels;
uint16_t* _value;
bool _state = false;
unsigned char _pin_di;
unsigned char _pin_dcki;
};
#if ARDUINO_ARCH_ESP8266
extern "C" {
void os_delay_us(unsigned int);
}
#elif ARDUINO_ARCH_AVR
#define os_delay_us delayMicroseconds
#endif
void my92xx::_di_pulse(unsigned int times) {
for (unsigned int i = 0; i < times; i++) {
digitalWrite(_pin_di, HIGH);
digitalWrite(_pin_di, LOW);
}
}
void my92xx::_dcki_pulse(unsigned int times) {
for (unsigned int i = 0; i < times; i++) {
digitalWrite(_pin_dcki, HIGH);
digitalWrite(_pin_dcki, LOW);
}
}
void my92xx::_write(unsigned int data, unsigned char bit_length) {
unsigned int mask = (0x01 << (bit_length - 1));
for (unsigned int i = 0; i < bit_length / 2; i++) {
digitalWrite(_pin_dcki, LOW);
digitalWrite(_pin_di, (data & mask) ? HIGH : LOW);
digitalWrite(_pin_dcki, HIGH);
data = data << 1;
digitalWrite(_pin_di, (data & mask) ? HIGH : LOW);
digitalWrite(_pin_dcki, LOW);
digitalWrite(_pin_di, LOW);
data = data << 1;
}
}
void my92xx::_set_cmd(my92xx_cmd_t command) {
// ets_intr_lock();
// TStop > 12us.
os_delay_us(12);
// Send 12 DI pulse, after 6 pulse's falling edge store duty data, and 12
// pulse's rising edge convert to command mode.
_di_pulse(12);
// Delay >12us, begin send CMD data
os_delay_us(12);
// Send CMD data
unsigned char command_data = *(unsigned char*)(&command);
for (unsigned char i = 0; i < _chips; i++) {
_write(command_data, 8);
}
// TStart > 12us. Delay 12 us.
os_delay_us(12);
// Send 16 DI pulseat 14 pulse's falling edge store CMD data, and
// at 16 pulse's falling edge convert to duty mode.
_di_pulse(16);
// TStop > 12us.
os_delay_us(12);
// ets_intr_unlock();
}
void my92xx::_send() {
#ifdef DEBUG_MY92XX
DEBUG_MSG_MY92XX("[MY92XX] Refresh: %s (", _state ? "ON" : "OFF");
for (unsigned char channel = 0; channel < _channels; channel++) {
DEBUG_MSG_MY92XX(" %d", _value[channel]);
}
DEBUG_MSG_MY92XX(" )\n");
#endif
unsigned char bit_length = 8;
switch (_command.bit_width) {
case MY92XX_CMD_BIT_WIDTH_16:
bit_length = 16;
break;
case MY92XX_CMD_BIT_WIDTH_14:
bit_length = 14;
break;
case MY92XX_CMD_BIT_WIDTH_12:
bit_length = 12;
break;
case MY92XX_CMD_BIT_WIDTH_8:
bit_length = 8;
break;
default:
bit_length = 8;
break;
}
// ets_intr_lock();
// TStop > 12us.
os_delay_us(12);
// Send color data
for (unsigned char channel = 0; channel < _channels; channel++) {
_write(_state ? _value[channel] : 0, bit_length);
}
// TStart > 12us. Ready for send DI pulse.
os_delay_us(12);
// Send 8 DI pulse. After 8 pulse falling edge, store old data.
_di_pulse(8);
// TStop > 12us.
os_delay_us(12);
// ets_intr_unlock();
}
// -----------------------------------------------------------------------------
unsigned char my92xx::getChannels() {
return _channels;
}
void my92xx::setChannel(unsigned char channel, unsigned int value) {
if (channel < _channels) {
_value[channel] = value;
}
}
unsigned int my92xx::getChannel(unsigned char channel) {
if (channel < _channels) {
return _value[channel];
}
return 0;
}
bool my92xx::getState() {
return _state;
}
void my92xx::setState(bool state) {
_state = state;
}
void my92xx::update() {
_send();
}
// -----------------------------------------------------------------------------
my92xx::my92xx(my92xx_model_t model, unsigned char chips, unsigned char di, unsigned char dcki, my92xx_cmd_t command) : _command(command) {
_model = model;
_chips = chips;
_pin_di = di;
_pin_dcki = dcki;
// Init channels
if (_model == MY92XX_MODEL_MY9291) {
_channels = 4 * _chips;
}
else if (_model == MY92XX_MODEL_MY9231) {
_channels = 3 * _chips;
}
_value = new uint16_t[_channels];
for (unsigned char i = 0; i < _channels; i++) {
_value[i] = 0;
}
// Init GPIO
pinMode(_pin_di, OUTPUT);
pinMode(_pin_dcki, OUTPUT);
digitalWrite(_pin_di, LOW);
digitalWrite(_pin_dcki, LOW);
// Clear all duty register
_dcki_pulse(32 * _chips);
// Send init command
_set_cmd(command);
DEBUG_MSG_MY92XX("[MY92XX] Initialized\n");
}
#endif

View File

@ -0,0 +1,45 @@
#pragma once
#include "wled.h"
#include "MY92xx.h"
#define MY92XX_MODEL MY92XX_MODEL_MY9291
#define MY92XX_CHIPS 1
#define MY92XX_DI_PIN 13
#define MY92XX_DCKI_PIN 15
#define MY92XX_RED 0
#define MY92XX_GREEN 1
#define MY92XX_BLUE 2
#define MY92XX_WHITE 3
class MY9291Usermod : public Usermod {
private:
my92xx _my92xx = my92xx(MY92XX_MODEL, MY92XX_CHIPS, MY92XX_DI_PIN, MY92XX_DCKI_PIN, MY92XX_COMMAND_DEFAULT);
public:
void setup() {
_my92xx.setState(true);
}
void connected() {
}
void loop() {
uint32_t c = strip.getPixelColor(0);
int w = ((c >> 24) & 0xff) * bri / 255.0;
int r = ((c >> 16) & 0xff) * bri / 255.0;
int g = ((c >> 8) & 0xff) * bri / 255.0;
int b = (c & 0xff) * bri / 255.0;
_my92xx.setChannel(MY92XX_RED, r);
_my92xx.setChannel(MY92XX_GREEN, g);
_my92xx.setChannel(MY92XX_BLUE, b);
_my92xx.setChannel(MY92XX_WHITE, w);
_my92xx.update();
}
uint16_t getId() {
return USERMOD_ID_MY9291;
}
};

View File

@ -0,0 +1,26 @@
# Word Clock Usermod V2
This usermod can be used to drive a wordclock with a 11x10 pixel matrix with WLED. There are also 4 additional dots for the minutes.
The visualisation is desribed in 4 mask with LED numbers (single dots for minutes, minutes, hours and "clock/Uhr").
There are 2 parameters to chnage the behaviour:
active: enable/disable usermod
diplayItIs: enable/disable display of "Es ist" on the clock.
## Installation
Copy and update the example `platformio_override.ini.sample`
from the Rotary Encoder UI usermode folder to the root directory of your particular build.
This file should be placed in the same directory as `platformio.ini`.
### Define Your Options
* `USERMOD_WORDCLOCK` - define this to have this the Auto Save usermod included wled00\usermods_list.cpp
### PlatformIO requirements
No special requirements.
## Change Log
2022/03/30 initial commit

View File

@ -0,0 +1,427 @@
#pragma once
#include "wled.h"
/*
* Usermods allow you to add own functionality to WLED more easily
* See: https://github.com/Aircoookie/WLED/wiki/Add-own-functionality
*
* This usermod can be used to drive a wordclock with a 11x10 pixel matrix with WLED. There are also 4 additional dots for the minutes.
* The visualisation is desribed in 4 mask with LED numbers (single dots for minutes, minutes, hours and "clock/Uhr").
* There are 2 parameters to chnage the behaviour:
*
* active: enable/disable usermod
* diplayItIs: enable/disable display of "Es ist" on the clock.
*/
class WordClockUsermod : public Usermod
{
private:
unsigned long lastTime = 0;
int lastTimeMinutes = -1;
// set your config variables to their boot default value (this can also be done in readFromConfig() or a constructor if you prefer)
bool usermodActive = false;
bool displayItIs = false;
// defines for mask sizes
#define maskSizeLeds 114
#define maskSizeMinutes 12
#define maskSizeHours 6
#define maskSizeItIs 5
#define maskSizeMinuteDots 4
// "minute" masks
const int maskMinutes[12][maskSizeMinutes] =
{
{107, 108, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // :00
{ 7, 8, 9, 10, 40, 41, 42, 43, -1, -1, -1, -1}, // :05 fünf nach
{ 11, 12, 13, 14, 40, 41, 42, 43, -1, -1, -1, -1}, // :10 zehn nach
{ 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1}, // :15 viertel
{ 15, 16, 17, 18, 19, 20, 21, 40, 41, 42, 43, -1}, // :20 zwanzig nach
{ 7, 8, 9, 10, 33, 34, 35, 44, 45, 46, 47, -1}, // :25 fünf vor halb
{ 44, 45, 46, 47, -1, -1, -1, -1, -1, -1, -1, -1}, // :30 halb
{ 7, 8, 9, 10, 40, 41, 42, 43, 44, 45, 46, 47}, // :35 fünf nach halb
{ 15, 16, 17, 18, 19, 20, 21, 33, 34, 35, -1, -1}, // :40 zwanzig vor
{ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1}, // :45 dreiviertel
{ 11, 12, 13, 14, 33, 34, 35, -1, -1, -1, -1, -1}, // :50 zehn vor
{ 7, 8, 9, 10, 33, 34, 35, -1, -1, -1, -1, -1} // :55 fünf vor
};
// hour masks
const int maskHours[13][maskSizeHours] =
{
{ 55, 56, 57, -1, -1, -1}, // 01: ein
{ 55, 56, 57, 58, -1, -1}, // 01: eins
{ 62, 63, 64, 65, -1, -1}, // 02: zwei
{ 66, 67, 68, 69, -1, -1}, // 03: drei
{ 73, 74, 75, 76, -1, -1}, // 04: vier
{ 51, 52, 53, 54, -1, -1}, // 05: fünf
{ 77, 78, 79, 80, 81, -1}, // 06: sechs
{ 88, 89, 90, 91, 92, 93}, // 07: sieben
{ 84, 85, 86, 87, -1, -1}, // 08: acht
{102, 103, 104, 105, -1, -1}, // 09: neun
{ 99, 100, 101, 102, -1, -1}, // 10: zehn
{ 49, 50, 51, -1, -1, -1}, // 11: elf
{ 94, 95, 96, 97, 98, -1} // 12: zwölf and 00: null
};
// mask "it is"
const int maskItIs[maskSizeItIs] = {0, 1, 3, 4, 5};
// mask minute dots
const int maskMinuteDots[maskSizeMinuteDots] = {110, 111, 112, 113};
// overall mask to define which LEDs are on
int maskLedsOn[maskSizeLeds] =
{
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0
};
// update led mask
void updateLedMask(const int wordMask[], int arraySize)
{
// loop over array
for (int x=0; x < arraySize; x++)
{
// check if mask has a valid LED number
if (wordMask[x] >= 0 && wordMask[x] < maskSizeLeds)
{
// turn LED on
maskLedsOn[wordMask[x]] = 1;
}
}
}
// set hours
void setHours(int hours, bool fullClock)
{
int index = hours;
// handle 00:xx as 12:xx
if (hours == 0)
{
index = 12;
}
// check if we get an overrun of 12 o´clock
if (hours == 13)
{
index = 1;
}
// special handling for "ein Uhr" instead of "eins Uhr"
if (hours == 1 && fullClock == true)
{
index = 0;
}
// update led mask
updateLedMask(maskHours[index], maskSizeHours);
}
// set minutes
void setMinutes(int index)
{
// update led mask
updateLedMask(maskMinutes[index], maskSizeMinutes);
}
// set minutes dot
void setSingleMinuteDots(int minutes)
{
// modulo to get minute dots
int minutesDotCount = minutes % 5;
// check if minute dots are active
if (minutesDotCount > 0)
{
// activate all minute dots until number is reached
for (int i = 0; i < minutesDotCount; i++)
{
// activate LED
maskLedsOn[maskMinuteDots[i]] = 1;
}
}
}
// update the display
void updateDisplay(uint8_t hours, uint8_t minutes)
{
// disable complete matrix at the bigging
for (int x = 0; x < maskSizeLeds; x++)
{
maskLedsOn[x] = 0;
}
// display it is/es ist if activated
if (displayItIs)
{
updateLedMask(maskItIs, maskSizeItIs);
}
// set single minute dots
setSingleMinuteDots(minutes);
// switch minutes
switch (minutes / 5)
{
case 0:
// full hour
setMinutes(0);
setHours(hours, true);
break;
case 1:
// 5 nach
setMinutes(1);
setHours(hours, false);
break;
case 2:
// 10 nach
setMinutes(2);
setHours(hours, false);
break;
case 3:
// viertel
setMinutes(3);
setHours(hours + 1, false);
break;
case 4:
// 20 nach
setMinutes(4);
setHours(hours, false);
break;
case 5:
// 5 vor halb
setMinutes(5);
setHours(hours + 1, false);
break;
case 6:
// halb
setMinutes(6);
setHours(hours + 1, false);
break;
case 7:
// 5 nach halb
setMinutes(7);
setHours(hours + 1, false);
break;
case 8:
// 20 vor
setMinutes(8);
setHours(hours + 1, false);
break;
case 9:
// viertel vor
setMinutes(9);
setHours(hours + 1, false);
break;
case 10:
// 10 vor
setMinutes(10);
setHours(hours + 1, false);
break;
case 11:
// 5 vor
setMinutes(11);
setHours(hours + 1, false);
break;
}
}
public:
//Functions called by WLED
/*
* setup() is called once at boot. WiFi is not yet connected at this point.
* You can use it to initialize variables, sensors or similar.
*/
void setup()
{
}
/*
* connected() is called every time the WiFi is (re)connected
* Use it to initialize network interfaces
*/
void connected()
{
}
/*
* loop() is called continuously. Here you can check for events, read sensors, etc.
*
* Tips:
* 1. You can use "if (WLED_CONNECTED)" to check for a successful network connection.
* Additionally, "if (WLED_MQTT_CONNECTED)" is available to check for a connection to an MQTT broker.
*
* 2. Try to avoid using the delay() function. NEVER use delays longer than 10 milliseconds.
* Instead, use a timer check as shown here.
*/
void loop() {
// do it every 5 seconds
if (millis() - lastTime > 5000)
{
// check the time
int minutes = minute(localTime);
// check if we already updated this minute
if (lastTimeMinutes != minutes)
{
// update the display with new time
updateDisplay(hourFormat12(localTime), minute(localTime));
// remember last update time
lastTimeMinutes = minutes;
}
// remember last update
lastTime = millis();
}
}
/*
* 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)
{
}
*/
/*
* 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)
{
}
/*
* 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
*/
void readFromJsonState(JsonObject& root)
{
}
/*
* addToConfig() can be used to add custom persistent settings to the cfg.json file in the "um" (usermod) object.
* It will be called by WLED when settings are actually saved (for example, LED settings are saved)
* If you want to force saving the current state, use serializeConfig() in your loop().
*
* CAUTION: serializeConfig() will initiate a filesystem write operation.
* It might cause the LEDs to stutter and will cause flash wear if called too often.
* Use it sparingly and always in the loop, never in network callbacks!
*
* addToConfig() will make your settings editable through the Usermod Settings page automatically.
*
* Usermod Settings Overview:
* - Numeric values are treated as floats in the browser.
* - If the numeric value entered into the browser contains a decimal point, it will be parsed as a C float
* before being returned to the Usermod. The float data type has only 6-7 decimal digits of precision, and
* doubles are not supported, numbers will be rounded to the nearest float value when being parsed.
* The range accepted by the input field is +/- 1.175494351e-38 to +/- 3.402823466e+38.
* - If the numeric value entered into the browser doesn't contain a decimal point, it will be parsed as a
* C int32_t (range: -2147483648 to 2147483647) before being returned to the usermod.
* Overflows or underflows are truncated to the max/min value for an int32_t, and again truncated to the type
* used in the Usermod when reading the value from ArduinoJson.
* - Pin values can be treated differently from an integer value by using the key name "pin"
* - "pin" can contain a single or array of integer values
* - On the Usermod Settings page there is simple checking for pin conflicts and warnings for special pins
* - Red color indicates a conflict. Yellow color indicates a pin with a warning (e.g. an input-only pin)
* - Tip: use int8_t to store the pin value in the Usermod, so a -1 value (pin not set) can be used
*
* See usermod_v2_auto_save.h for an example that saves Flash space by reusing ArduinoJson key name strings
*
* If you need a dedicated settings page with custom layout for your Usermod, that takes a lot more work.
* You will have to add the setting to the HTML, xml.cpp and set.cpp manually.
* See the WLED Soundreactive fork (code and wiki) for reference. https://github.com/atuline/WLED
*
* I highly recommend checking out the basics of ArduinoJson serialization and deserialization in order to use custom settings!
*/
void addToConfig(JsonObject& root)
{
JsonObject top = root.createNestedObject("WordClockUsermod");
top["active"] = usermodActive;
top["displayItIs"] = displayItIs;
}
/*
* readFromConfig() can be used to read back the custom settings you added with addToConfig().
* This is called by WLED when settings are loaded (currently this only happens immediately after boot, or after saving on the Usermod Settings page)
*
* readFromConfig() is called BEFORE setup(). This means you can use your persistent values in setup() (e.g. pin assignments, buffer sizes),
* but also that if you want to write persistent values to a dynamic buffer, you'd need to allocate it here instead of in setup.
* If you don't know what that is, don't fret. It most likely doesn't affect your use case :)
*
* Return true in case the config values returned from Usermod Settings were complete, or false if you'd like WLED to save your defaults to disk (so any missing values are editable in Usermod Settings)
*
* getJsonValue() returns false if the value is missing, or copies the value into the variable provided and returns true if the value is present
* The configComplete variable is true only if the "exampleUsermod" object and all values are present. If any values are missing, WLED will know to call addToConfig() to save them
*
* This function is guaranteed to be called on boot, but could also be called every time settings are updated
*/
bool readFromConfig(JsonObject& root)
{
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed)
JsonObject top = root["WordClockUsermod"];
bool configComplete = !top.isNull();
configComplete &= getJsonValue(top["active"], usermodActive);
configComplete &= getJsonValue(top["displayItIs"], displayItIs);
return configComplete;
}
/*
* handleOverlayDraw() is called just before every show() (LED strip update frame) after effects have set the colors.
* Use this to blank out some LEDs or set them to a different color regardless of the set effect mode.
* Commonly used for custom clocks (Cronixie, 7 segment)
*/
void handleOverlayDraw()
{
// check if usermod is active
if (usermodActive == true)
{
// loop over all leds
for (int x = 0; x < maskSizeLeds; x++)
{
// check mask
if (maskLedsOn[x] == 0)
{
// set pixel off
strip.setPixelColor(x, RGBW32(0,0,0,0));
}
}
}
}
/*
* getId() allows you to optionally give your V2 usermod an unique ID (please define it in const.h!).
* This could be used in the future for the system to determine whether your usermod is installed.
*/
uint16_t getId()
{
return USERMOD_ID_WORDCLOCK;
}
//More methods can be added in the future, this example will then be extended.
//Your usermod will remain compatible as it does not need to implement all methods from the Usermod base class!
};

View File

@ -0,0 +1,13 @@
# Controlling Wiz lights
This usermod allows the control of [WiZ](https://www.wizconnected.com/en/consumer/) lights that are in the same network as the WLED controller.
The mod takes the colors from the first few pixels and sends them to the lights.
## Configuration
First, enter how often the data will be sent to the lights (in ms).
Then enter the IPs for the lights to be controlled, in order. There is currently a limit of 10 devices that can be controled, but that number
can be easily changed by updating _MAX_WIZ_LIGHTS_.

View File

@ -0,0 +1,142 @@
#pragma once
#include "wled.h"
#include <WiFiUdp.h>
// Maximum number of lights supported
#define MAX_WIZ_LIGHTS 10
// UDP object, to send messages
WiFiUDP UDP;
// Function to send a color to a light
void sendColor(IPAddress ip, uint32_t color) {
UDP.beginPacket(ip, 38899);
if (color == 0) {
UDP.print("{\"method\":\"setPilot\",\"params\":{\"state\":false}}");
} else {
UDP.print("{\"method\":\"setPilot\",\"params\":{\"state\":true, \"r\":");
UDP.print(R(color));
UDP.print(",\"g\":");
UDP.print(G(color));
UDP.print(",\"b\":");
UDP.print(B(color));
UDP.print("}}");
}
UDP.endPacket();
}
// Create label for the usermode page (I cannot make it work with JSON arrays...)
String getJsonLabel(uint8_t i) {
return "ip_light_" + String(i);
}
class WizLightsUsermod : public Usermod {
private:
// Keep track of the last time the lights were updated
unsigned long lastTime = 0;
// Specify how often WLED sends data to the Wiz lights
long updateInterval;
// Save the IP of the lights
IPAddress lightsIP[MAX_WIZ_LIGHTS];
bool lightsValid[MAX_WIZ_LIGHTS];
// Variable that keeps track of RBG values for the lights
uint32_t colorsSent[MAX_WIZ_LIGHTS];
public:
//Functions called by WLED
/*
* loop() is called continuously. Here you can check for events, read sensors, etc.
*/
void loop() {
// Calculate how long since the last update
unsigned long ellapsedTime = millis() - lastTime;
if (ellapsedTime > updateInterval) {
// Keep track of whether we are updating any of the lights
bool update = false;
// Loop through the lights
for (uint8_t i = 0; i < MAX_WIZ_LIGHTS; i++) {
// Check if we have a valid IP
if (!lightsValid[i]) { continue; }
// Get the first colors in the strip
uint32_t new_color = strip.getPixelColor(i);
// Check if the color has changed from the last one sent
// Force an update every 5 minutes, in case the colors don't change
// (the lights could have been reset by turning off and on)
if ((new_color != colorsSent[i]) | (ellapsedTime > 5*60000)) {
// It has changed, send the new color to the light
update = true;
sendColor(lightsIP[i], new_color);
colorsSent[i] = new_color;
}
}
// We sent an update, wait until we do this again
if (update) {
lastTime = millis();
}
}
}
/*
* addToConfig() can be used to add custom persistent settings to the cfg.json file in the "um" (usermod) object.
* It will be called by WLED when settings are actually saved (for example, LED settings are saved)
* If you want to force saving the current state, use serializeConfig() in your loop().
*/
void addToConfig(JsonObject& root)
{
JsonObject top = root.createNestedObject("wizLightsUsermod");
top["interval_ms"] = updateInterval;
for (uint8_t i = 0; i < MAX_WIZ_LIGHTS; i++) {
top[getJsonLabel(i)] = lightsIP[i].toString();
}
}
/*
* readFromConfig() can be used to read back the custom settings you added with addToConfig().
* This is called by WLED when settings are loaded (currently this only happens immediately after boot, or after saving on the Usermod Settings page)
*/
bool readFromConfig(JsonObject& root)
{
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed)
JsonObject top = root["wizLightsUsermod"];
bool configComplete = !top.isNull();
// Read interval to update the lights
configComplete &= getJsonValue(top["interval_ms"], updateInterval, 1000);
// Read list of IPs
String tempIp;
for (uint8_t i = 0; i < MAX_WIZ_LIGHTS; i++) {
configComplete &= getJsonValue(top[getJsonLabel(i)], tempIp, "0.0.0.0");
lightsValid[i] = lightsIP[i].fromString(tempIp);
// If the IP is not valid, force the value to be empty
if (!lightsValid[i]) {
lightsIP[i].fromString("0.0.0.0");
}
}
return configComplete;
}
/*
* getId() allows you to optionally give your V2 usermod an unique ID (please define it in const.h!).
* This could be used in the future for the system to determine whether your usermod is installed.
*/
uint16_t getId()
{
return USERMOD_ID_WIZLIGHTS;
}
};

View File

@ -131,7 +131,6 @@ void WS2812FX::service() {
for(uint8_t i=0; i < MAX_NUM_SEGMENTS; i++) for(uint8_t i=0; i < MAX_NUM_SEGMENTS; i++)
{ {
// freezing main segment will acheve the same as following
//if (realtimeMode && useMainSegmentOnly && i == getMainSegmentId()) continue; //if (realtimeMode && useMainSegmentOnly && i == getMainSegmentId()) continue;
_segment_index = i; _segment_index = i;

View File

@ -72,6 +72,9 @@
#define USERMOD_ID_QUINLED_AN_PENTA 23 //Usermod "quinled-an-penta.h" #define USERMOD_ID_QUINLED_AN_PENTA 23 //Usermod "quinled-an-penta.h"
#define USERMOD_ID_SSDR 24 //Usermod "usermod_v2_seven_segment_display_reloaded.h" #define USERMOD_ID_SSDR 24 //Usermod "usermod_v2_seven_segment_display_reloaded.h"
#define USERMOD_ID_CRONIXIE 25 //Usermod "usermod_cronixie.h" #define USERMOD_ID_CRONIXIE 25 //Usermod "usermod_cronixie.h"
#define USERMOD_ID_WIZLIGHTS 26 //Usermod "wizlights.h"
#define USERMOD_ID_WORDCLOCK 27 //Usermod "usermod_v2_word_clock.h"
#define USERMOD_ID_MY9291 28 //Usermod "usermod_MY9291.h"
//Access point behavior //Access point behavior
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot #define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot
@ -192,7 +195,7 @@
#define BTN_TYPE_ANALOG_INVERTED 8 #define BTN_TYPE_ANALOG_INVERTED 8
//Ethernet board types //Ethernet board types
#define WLED_NUM_ETH_TYPES 7 #define WLED_NUM_ETH_TYPES 8
#define WLED_ETH_NONE 0 #define WLED_ETH_NONE 0
#define WLED_ETH_WT32_ETH01 1 #define WLED_ETH_WT32_ETH01 1

View File

@ -0,0 +1,7 @@
Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/#docs/local-fonts
You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.

View File

@ -0,0 +1,152 @@
body {
padding: 0;
margin: 0;
font-family: sans-serif;
font-size: 1em;
line-height: 1.5;
color: #555;
background: #fff;
}
h1 {
font-size: 1.5em;
font-weight: normal;
}
small {
font-size: .66666667em;
}
a {
color: #e74c3c;
text-decoration: none;
}
a:hover, a:focus {
box-shadow: 0 1px #e74c3c;
}
.bshadow0, input {
box-shadow: inset 0 -2px #e7e7e7;
}
input:hover {
box-shadow: inset 0 -2px #ccc;
}
input, fieldset {
font-family: sans-serif;
font-size: 1em;
margin: 0;
padding: 0;
border: 0;
}
input {
color: inherit;
line-height: 1.5;
height: 1.5em;
padding: .25em 0;
}
input:focus {
outline: none;
box-shadow: inset 0 -2px #449fdb;
}
.glyph {
font-size: 16px;
width: 15em;
padding-bottom: 1em;
margin-right: 4em;
margin-bottom: 1em;
float: left;
overflow: hidden;
}
.liga {
width: 80%;
width: calc(100% - 2.5em);
}
.talign-right {
text-align: right;
}
.talign-center {
text-align: center;
}
.bgc1 {
background: #f1f1f1;
}
.fgc1 {
color: #999;
}
.fgc0 {
color: #000;
}
p {
margin-top: 1em;
margin-bottom: 1em;
}
.mvm {
margin-top: .75em;
margin-bottom: .75em;
}
.mtn {
margin-top: 0;
}
.mtl, .mal {
margin-top: 1.5em;
}
.mbl, .mal {
margin-bottom: 1.5em;
}
.mal, .mhl {
margin-left: 1.5em;
margin-right: 1.5em;
}
.mhmm {
margin-left: 1em;
margin-right: 1em;
}
.mls {
margin-left: .25em;
}
.ptl {
padding-top: 1.5em;
}
.pbs, .pvs {
padding-bottom: .25em;
}
.pvs, .pts {
padding-top: .25em;
}
.unit {
float: left;
}
.unitRight {
float: right;
}
.size1of2 {
width: 50%;
}
.size1of1 {
width: 100%;
}
.clearfix:before, .clearfix:after {
content: " ";
display: table;
}
.clearfix:after {
clear: both;
}
.hidden-true {
display: none;
}
.textbox0 {
width: 3em;
background: #f1f1f1;
padding: .25em .5em;
line-height: 1.5;
height: 1.5em;
}
#testDrive {
display: block;
padding-top: 24px;
line-height: 1.5;
}
.fs0 {
font-size: 16px;
}
.fs1 {
font-size: 32px;
}

View File

@ -0,0 +1,30 @@
if (!('boxShadow' in document.body.style)) {
document.body.setAttribute('class', 'noBoxShadow');
}
document.body.addEventListener("click", function(e) {
var target = e.target;
if (target.tagName === "INPUT" &&
target.getAttribute('class').indexOf('liga') === -1) {
target.select();
}
});
(function() {
var fontSize = document.getElementById('fontSize'),
testDrive = document.getElementById('testDrive'),
testText = document.getElementById('testText');
function updateTest() {
testDrive.innerHTML = testText.value || String.fromCharCode(160);
if (window.icomoonLiga) {
window.icomoonLiga(testDrive);
}
}
function updateSize() {
testDrive.style.fontSize = fontSize.value + 'px';
}
fontSize.addEventListener('change', updateSize, false);
testText.addEventListener('input', updateTest, false);
testText.addEventListener('change', updateTest, false);
updateSize();
}());

View File

@ -0,0 +1,360 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>IcoMoon Demo</title>
<meta name="description" content="An Icon Font Generated By IcoMoon.io">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="demo-files/demo.css">
<link rel="stylesheet" href="style.css"></head>
<body>
<div class="bgc1 clearfix">
<h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> wled122 <small class="fgc1">(Glyphs:&nbsp;23)</small></h1>
</div>
<div class="clearfix mhl ptl">
<h1 class="mvm mtn fgc1">Grid Size: Unknown</h1>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-pattern"></span>
<span class="mls"> i-pattern</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e23d" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe23d;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-segments"></span>
<span class="mls"> i-segments</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e34b" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe34b;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-sun"></span>
<span class="mls"> i-sun</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e333" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe333;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-palette"></span>
<span class="mls"> i-palette</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e2b3" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe2b3;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-eye"></span>
<span class="mls"> i-eye</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e0e8" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe0e8;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-speed"></span>
<span class="mls"> i-speed</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e325" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe325;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-expand"></span>
<span class="mls"> i-expand</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e395" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe395;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-power"></span>
<span class="mls"> i-power</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e08f" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe08f;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-settings"></span>
<span class="mls"> i-settings</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e0a2" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe0a2;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-playlist"></span>
<span class="mls"> i-playlist</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e139" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe139;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-night"></span>
<span class="mls"> i-night</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e2a2" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe2a2;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-cancel"></span>
<span class="mls"> i-cancel</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e38f" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe38f;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-sync"></span>
<span class="mls"> i-sync</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e116" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe116;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-confirm"></span>
<span class="mls"> i-confirm</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e390" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe390;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-brightness"></span>
<span class="mls"> i-brightness</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e2a6" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe2a6;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-nodes"></span>
<span class="mls"> i-nodes</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e22d" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe22d;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-add"></span>
<span class="mls"> i-add</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e18a" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe18a;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-edit"></span>
<span class="mls"> i-edit</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e2c6" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe2c6;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-intensity"></span>
<span class="mls"> i-intensity</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e409" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe409;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-star"></span>
<span class="mls"> i-star</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e410" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe410;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-info"></span>
<span class="mls"> i-info</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e066" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe066;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-del"></span>
<span class="mls"> i-del</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e037" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe037;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="i-presets"></span>
<span class="mls"> i-presets</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e04c" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe04c;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
</div>
<!--[if gt IE 8]><!-->
<div class="mhl clearfix mbl">
<h1>Font Test Drive</h1>
<label>
Font Size: <input id="fontSize" type="number" class="textbox0 mbm"
min="8" value="48" />
px
</label>
<input id="testText" type="text" class="phl size1of1 mvl"
placeholder="Type some text to test..." value=""/>
<div id="testDrive" class="i-" style="font-family: wled122">&nbsp;
</div>
</div>
<!--<![endif]-->
<div class="bgc1 clearfix">
<p class="mhl">Generated by <a href="https://icomoon.io/app">IcoMoon</a></p>
</div>
<script src="demo-files/demo.js"></script>
</body>
</html>

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,96 @@
@font-face {
font-family: 'wled122';
src:
url('fonts/wled122.woff2?e3eban') format('woff2'),
url('fonts/wled122.ttf?e3eban') format('truetype'),
url('fonts/wled122.woff?e3eban') format('woff'),
url('fonts/wled122.svg?e3eban#wled122') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="i-"], [class*=" i-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'wled122' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.i-pattern:before {
content: "\e23d";
}
.i-segments:before {
content: "\e34b";
}
.i-sun:before {
content: "\e333";
}
.i-palette:before {
content: "\e2b3";
}
.i-eye:before {
content: "\e0e8";
}
.i-speed:before {
content: "\e325";
}
.i-expand:before {
content: "\e395";
}
.i-power:before {
content: "\e08f";
}
.i-settings:before {
content: "\e0a2";
}
.i-playlist:before {
content: "\e139";
}
.i-night:before {
content: "\e2a2";
}
.i-cancel:before {
content: "\e38f";
}
.i-sync:before {
content: "\e116";
}
.i-confirm:before {
content: "\e390";
}
.i-brightness:before {
content: "\e2a6";
}
.i-nodes:before {
content: "\e22d";
}
.i-add:before {
content: "\e18a";
}
.i-edit:before {
content: "\e2c6";
}
.i-intensity:before {
content: "\e409";
}
.i-star:before {
content: "\e410";
}
.i-info:before {
content: "\e066";
}
.i-del:before {
content: "\e037";
}
.i-presets:before {
content: "\e04c";
}

View File

@ -1901,7 +1901,11 @@ function setSegBri(s)
function tglFreeze(s=null) function tglFreeze(s=null)
{ {
var obj = {"seg": {"frz": "t"}}; // toggle var obj = {"seg": {"frz": "t"}}; // toggle
if (s!==null) obj.seg.id = s; if (s!==null) {
obj.seg.id = s;
// if live segment, enter live override (which also unfreezes)
if (lastinfo && s==lastinfo.liveseg && lastinfo.live) obj = {"lor":1};
}
requestJson(obj); requestJson(obj);
} }

View File

@ -45,7 +45,10 @@
} }
} }
var ws = top.window.ws; var ws;
try {
ws = top.window.ws;
} catch (e) {}
if (ws && ws.readyState === WebSocket.OPEN) { if (ws && ws.readyState === WebSocket.OPEN) {
console.info("Peek uses top WS"); console.info("Peek uses top WS");
ws.send("{'lv':true}"); ws.send("{'lv':true}");

View File

@ -60,16 +60,17 @@
<i>Can help with connectivity issues.<br> <i>Can help with connectivity issues.<br>
Do not enable if WiFi is working correctly, increases power consumption.</i> Do not enable if WiFi is working correctly, increases power consumption.</i>
<div id="ethd"> <div id="ethd">
<h3>Ethernet Type</h3> <h3>Ethernet Type</h3>
<select name="ETH"> <select name="ETH">
<option value="0">None</option> <option value="0">None</option>
<option value="2">ESP32-POE</option> <option value="2">ESP32-POE</option>
<option value="6">ESP32Deux</option> <option value="6">ESP32Deux</option>
<option value="4">QuinLED-ESP32</option> <option value="7">KIT-VE</option>
<option value="5">TwilightLord-ESP32</option> <option value="4">QuinLED-ESP32</option>
<option value="3">WESP32</option> <option value="5">TwilightLord-ESP32</option>
<option value="1">WT32-ETH01</option> <option value="3">WESP32</option>
</select><br><br> <option value="1">WT32-ETH01</option>
</select><br><br>
</div> </div>
<hr> <hr>
<button type="button" onclick="B()">Back</button><button type="submit">Save & Connect</button> <button type="button" onclick="B()">Back</button><button type="submit">Save & Connect</button>

View File

@ -206,6 +206,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply=tru
void notify(byte callMode, bool followUp=false); void notify(byte callMode, bool followUp=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false); uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false);
void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC); void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC);
void exitRealtime();
void handleNotifications(); void handleNotifications();
void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w); void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w);
void refreshNodeList(); void refreshNodeList();

View File

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

View File

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

View File

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

View File

@ -230,6 +230,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
bool stateResponse = root[F("v")] | false; bool stateResponse = root[F("v")] | false;
bool onBefore = bri;
getVal(root["bri"], &bri); getVal(root["bri"], &bri);
bool on = root["on"] | (bri > 0); bool on = root["on"] | (bri > 0);
@ -237,6 +238,15 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
if (root["on"].is<const char*>() && root["on"].as<const char*>()[0] == 't') toggleOnOff(); if (root["on"].is<const char*>() && root["on"].as<const char*>()[0] == 't') toggleOnOff();
if (bri && !onBefore) { // unfreeze all segments when turning on
for (uint8_t s=0; s < strip.getMaxSegments(); s++) {
strip.getSegment(s).setOption(SEG_OPTION_FREEZE, false, s);
}
if (realtimeMode && !realtimeOverride && useMainSegmentOnly) { // keep live segment frozen if live
strip.getMainSegment().setOption(SEG_OPTION_FREEZE, true, strip.getMainSegmentId());
}
}
int tr = -1; int tr = -1;
if (!presetId || currentPlaylist < 0) { //do not apply transition time from preset if playlist active, as it would override playlist transition times if (!presetId || currentPlaylist < 0) { //do not apply transition time from preset if playlist active, as it would override playlist transition times
tr = root[F("transition")] | -1; tr = root[F("transition")] | -1;
@ -283,6 +293,9 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
realtimeOverride = root[F("lor")] | realtimeOverride; realtimeOverride = root[F("lor")] | realtimeOverride;
if (realtimeOverride > 2) realtimeOverride = REALTIME_OVERRIDE_ALWAYS; if (realtimeOverride > 2) realtimeOverride = REALTIME_OVERRIDE_ALWAYS;
if (realtimeMode && useMainSegmentOnly) {
strip.getMainSegment().setOption(SEG_OPTION_FREEZE, !realtimeOverride, strip.getMainSegmentId());
}
if (root.containsKey("live")) { if (root.containsKey("live")) {
if (root["live"].as<bool>()) { if (root["live"].as<bool>()) {
@ -290,11 +303,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
jsonTransitionOnce = true; jsonTransitionOnce = true;
realtimeLock(65000); realtimeLock(65000);
} else { } else {
if (realtimeOverride == REALTIME_OVERRIDE_ONCE) realtimeOverride = REALTIME_OVERRIDE_NONE; exitRealtime();
strip.setBrightness(scaledBri(bri));
realtimeTimeout = 0; //cancel realtime mode immediately
realtimeMode = REALTIME_MODE_INACTIVE; // inform UI immediatelly
realtimeIP[0] = 0;
} }
} }
@ -508,7 +517,7 @@ void serializeInfo(JsonObject root)
root[F("udpport")] = udpPort; root[F("udpport")] = udpPort;
root["live"] = (bool)realtimeMode; root["live"] = (bool)realtimeMode;
root[F("liveseg")] = useMainSegmentOnly ? strip.getMainSegmentId() : -1; // if using main segment only for live root[F("liveseg")] = useMainSegmentOnly ? strip.getMainSegmentId() : -1; // if using main segment only for live
// root[F("mso")] = useMainSegmentOnly; // using main segment only for live //root[F("mso")] = useMainSegmentOnly; // using main segment only for live
switch (realtimeMode) { switch (realtimeMode) {
case REALTIME_MODE_INACTIVE: root["lm"] = ""; break; case REALTIME_MODE_INACTIVE: root["lm"] = ""; break;

View File

@ -83,6 +83,16 @@ const ethernet_settings ethernetBoards[] = {
18, // eth_mdio, 18, // eth_mdio,
ETH_PHY_LAN8720, // eth_type, ETH_PHY_LAN8720, // eth_type,
ETH_CLOCK_GPIO17_OUT // eth_clk_mode ETH_CLOCK_GPIO17_OUT // eth_clk_mode
},
// ESP32-ETHERNET-KIT-VE
{
0, // eth_address,
5, // eth_power,
23, // eth_mdc,
18, // eth_mdio,
ETH_PHY_IP101, // eth_type,
ETH_CLOCK_GPIO0_IN // eth_clk_mode
} }
}; };
#endif #endif

View File

@ -466,6 +466,7 @@ void calculateSunriseAndSunset() {
int minUTC = getSunriseUTC(year(localTime), month(localTime), day(localTime), latitude, longitude); int minUTC = getSunriseUTC(year(localTime), month(localTime), day(localTime), latitude, longitude);
if (minUTC) { if (minUTC) {
// there is a sunrise // there is a sunrise
if (minUTC < 0) minUTC += 24*60; // add a day if negative
tim_0.tm_hour = minUTC / 60; tim_0.tm_hour = minUTC / 60;
tim_0.tm_min = minUTC % 60; tim_0.tm_min = minUTC % 60;
sunrise = tz->toLocal(mktime(&tim_0) + utcOffsetSecs); sunrise = tz->toLocal(mktime(&tim_0) + utcOffsetSecs);
@ -477,6 +478,7 @@ void calculateSunriseAndSunset() {
minUTC = getSunriseUTC(year(localTime), month(localTime), day(localTime), latitude, longitude, true); minUTC = getSunriseUTC(year(localTime), month(localTime), day(localTime), latitude, longitude, true);
if (minUTC) { if (minUTC) {
// there is a sunset // there is a sunset
if (minUTC < 0) minUTC += 24*60; // add a day if negative
tim_0.tm_hour = minUTC / 60; tim_0.tm_hour = minUTC / 60;
tim_0.tm_min = minUTC % 60; tim_0.tm_min = minUTC % 60;
sunset = tz->toLocal(mktime(&tim_0) + utcOffsetSecs); sunset = tz->toLocal(mktime(&tim_0) + utcOffsetSecs);

View File

@ -886,6 +886,9 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
if (pos > 0) { if (pos > 0) {
realtimeOverride = getNumVal(&req, pos); realtimeOverride = getNumVal(&req, pos);
if (realtimeOverride > 2) realtimeOverride = REALTIME_OVERRIDE_ALWAYS; if (realtimeOverride > 2) realtimeOverride = REALTIME_OVERRIDE_ALWAYS;
if (realtimeMode && useMainSegmentOnly) {
strip.getMainSegment().setOption(SEG_OPTION_FREEZE, !realtimeOverride, strip.getMainSegmentId());
}
} }
pos = req.indexOf(F("RB")); pos = req.indexOf(F("RB"));

View File

@ -140,7 +140,7 @@ void notify(byte callMode, bool followUp)
void realtimeLock(uint32_t timeoutMs, byte md) void realtimeLock(uint32_t timeoutMs, byte md)
{ {
if (!realtimeMode) { if (!realtimeMode && !realtimeOverride) {
uint16_t stop, start; uint16_t stop, start;
if (useMainSegmentOnly) { if (useMainSegmentOnly) {
WS2812FX::Segment& mainseg = strip.getMainSegment(); WS2812FX::Segment& mainseg = strip.getMainSegment();
@ -152,30 +152,41 @@ void realtimeLock(uint32_t timeoutMs, byte md)
stop = strip.getLengthTotal(); stop = strip.getLengthTotal();
} }
// clear strip/segment // clear strip/segment
if (useMainSegmentOnly || !realtimeOverride) for (uint16_t i = start; i < stop; i++) strip.setPixelColor(i,0,0,0,0); for (uint16_t i = start; i < stop; i++) strip.setPixelColor(i,0,0,0,0);
// if WLED was off and using main segment only, turn non-main segments off // if WLED was off and using main segment only, freeze non-main segments so they stay off
if (useMainSegmentOnly && bri == 0) { if (useMainSegmentOnly && bri == 0) {
for (uint8_t s=0; s < strip.getMaxSegments(); s++) { for (uint8_t s=0; s < strip.getMaxSegments(); s++) {
if (s != strip.getMainSegmentId()) strip.getSegment(s).setOption(SEG_OPTION_ON, false, s); strip.getSegment(s).setOption(SEG_OPTION_FREEZE, true, s);
else strip.getSegment(s).setOption(SEG_OPTION_ON, true, s);
} }
} }
} }
// if strip is off (bri==0) and not already in RTM
if (briT == 0 && !realtimeMode && !realtimeOverride) {
strip.setBrightness(scaledBri(briLast), true);
}
if (realtimeTimeout != UINT32_MAX) { if (realtimeTimeout != UINT32_MAX) {
if (timeoutMs == 255001 || timeoutMs == 65000) realtimeTimeout = UINT32_MAX; realtimeTimeout = (timeoutMs == 255001 || timeoutMs == 65000) ? UINT32_MAX : millis() + timeoutMs;
else realtimeTimeout = millis() + timeoutMs;
}
// if strip is off (bri==0) and not already in RTM
if (briT == 0 && !realtimeMode) {
strip.setBrightness(scaledBri(briLast), true);
} }
realtimeMode = md; realtimeMode = md;
if (arlsForceMaxBri && !realtimeOverride) strip.setBrightness(scaledBri(255), true); if (realtimeOverride) return;
if (arlsForceMaxBri) strip.setBrightness(scaledBri(255), true);
if (briT > 0 && md == REALTIME_MODE_GENERIC) strip.show(); if (briT > 0 && md == REALTIME_MODE_GENERIC) strip.show();
} }
void exitRealtime() {
if (!realtimeMode) return;
if (realtimeOverride == REALTIME_OVERRIDE_ONCE) realtimeOverride = REALTIME_OVERRIDE_NONE;
strip.setBrightness(scaledBri(bri));
realtimeTimeout = 0; // cancel realtime mode immediately
realtimeMode = REALTIME_MODE_INACTIVE; // inform UI immediately
realtimeIP[0] = 0;
if (useMainSegmentOnly) { // unfreeze live segment again
strip.getMainSegment().setOption(SEG_OPTION_FREEZE, false, strip.getMainSegmentId());
}
}
#define TMP2NET_OUT_PORT 65442 #define TMP2NET_OUT_PORT 65442
@ -203,14 +214,7 @@ void handleNotifications()
} }
//unlock strip when realtime UDP times out //unlock strip when realtime UDP times out
if (realtimeMode && millis() > realtimeTimeout) if (realtimeMode && millis() > realtimeTimeout) exitRealtime();
{
if (realtimeOverride == REALTIME_OVERRIDE_ONCE) realtimeOverride = REALTIME_OVERRIDE_NONE;
if (useMainSegmentOnly) strip.getMainSegment().setOption(SEG_OPTION_FREEZE, false, strip.getMainSegmentId());
strip.setBrightness(scaledBri(bri));
realtimeMode = REALTIME_MODE_INACTIVE;
realtimeIP[0] = 0;
}
//receive UDP notifications //receive UDP notifications
if (!udpConnected) return; if (!udpConnected) return;

View File

@ -116,6 +116,18 @@
#include "../usermods/quinled-an-penta/quinled-an-penta.h" #include "../usermods/quinled-an-penta/quinled-an-penta.h"
#endif #endif
#ifdef USERMOD_WIZLIGHTS
#include "../usermods/wizlights/wizlights.h"
#endif
#ifdef USERMOD_WORDCLOCK
#include "../usermods/usermod_v2_word_clock/usermod_v2_word_clock.h"
#endif
#ifdef USERMOD_MY9291
#include "../usermods/MY9291/usermode_MY9291.h"
#endif
void registerUsermods() void registerUsermods()
{ {
/* /*
@ -219,4 +231,16 @@ void registerUsermods()
#ifdef QUINLED_AN_PENTA #ifdef QUINLED_AN_PENTA
usermods.add(new QuinLEDAnPentaUsermod()); usermods.add(new QuinLEDAnPentaUsermod());
#endif #endif
#ifdef USERMOD_WIZLIGHTS
usermods.add(new WizLightsUsermod());
#endif
#ifdef USERMOD_WORDCLOCK
usermods.add(new WordClockUsermod());
#endif
#ifdef USERMOD_MY9291
usermods.add(new MY9291Usermod());
#endif
} }

View File

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