diff --git a/CHANGELOG.md b/CHANGELOG.md index e9f86e23..baf49362 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ ## WLED changelog +### WLED release 0.13.3 + +- Version bump to v0.13.3 "Toki" +- Disable ESP watchdog by default (fixes flickering and boot issues on a fresh install) +- Added support for LPD6803 + ### WLED release 0.13.2 #### Build 2208140 diff --git a/platformio.ini b/platformio.ini index f128ed6a..ee68b263 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,6 +115,8 @@ build_flags = -D DECODE_LG=true -DWLED_USE_MY_CONFIG ; -D USERMOD_SENSORSTOMQTT + #For ADS1115 sensor uncomment following + ; -D USERMOD_ADS1115 build_unflags = @@ -177,6 +179,9 @@ lib_deps = ; adafruit/Adafruit BMP280 Library @ 2.1.0 ; adafruit/Adafruit CCS811 Library @ 1.0.4 ; adafruit/Adafruit Si7021 Library @ 1.4.0 + #For ADS1115 sensor uncomment following + ; adafruit/Adafruit BusIO @ 1.13.2 + ; adafruit/Adafruit ADS1X15 @ 2.4.0 extra_scripts = ${scripts_defaults.extra_scripts} diff --git a/usermods/ADS1115_v2/ChannelSettings.h b/usermods/ADS1115_v2/ChannelSettings.h new file mode 100644 index 00000000..26538a14 --- /dev/null +++ b/usermods/ADS1115_v2/ChannelSettings.h @@ -0,0 +1,15 @@ +#include "wled.h" + +namespace ADS1115 +{ + struct ChannelSettings { + const String settingName; + bool isEnabled; + String name; + String units; + const uint16_t mux; + float multiplier; + float offset; + uint8_t decimals; + }; +} \ No newline at end of file diff --git a/usermods/ADS1115_v2/readme.md b/usermods/ADS1115_v2/readme.md new file mode 100644 index 00000000..9b778809 --- /dev/null +++ b/usermods/ADS1115_v2/readme.md @@ -0,0 +1,10 @@ +# ADS1115 16-Bit ADC with four inputs + +This usermod will read from an ADS1115 ADC. The voltages are displayed in the Info section of the web UI. + +Configuration is all completed via the Usermod menu. There are no settings to set in code! + +## Installation + +Add the build flag `-D USERMOD_ADS1115` to your platformio environment. +Uncomment libraries with comment `#For ADS1115 sensor uncomment following` diff --git a/usermods/ADS1115_v2/usermod_ads1115.h b/usermods/ADS1115_v2/usermod_ads1115.h new file mode 100644 index 00000000..5e2b4b27 --- /dev/null +++ b/usermods/ADS1115_v2/usermod_ads1115.h @@ -0,0 +1,255 @@ +#pragma once + +#include "wled.h" +#include +#include + +#include "ChannelSettings.h" + +using namespace ADS1115; + +class ADS1115Usermod : public Usermod { + public: + void setup() { + ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V + + if (!ads.begin()) { + Serial.println("Failed to initialize ADS"); + return; + } + + if (!initChannel()) { + isInitialized = true; + return; + } + + startReading(); + + isEnabled = true; + isInitialized = true; + } + + void loop() { + if (isEnabled && millis() - lastTime > loopInterval) { + lastTime = millis(); + + // If we don't have new data, skip this iteration. + if (!ads.conversionComplete()) { + return; + } + + updateResult(); + moveToNextChannel(); + startReading(); + } + } + + void addToJsonInfo(JsonObject& root) + { + if (!isEnabled) { + return; + } + + JsonObject user = root[F("u")]; + if (user.isNull()) user = root.createNestedObject(F("u")); + + for (uint8_t i = 0; i < channelsCount; i++) { + ChannelSettings* settingsPtr = &(channelSettings[i]); + + if (!settingsPtr->isEnabled) { + continue; + } + + JsonArray lightArr = user.createNestedArray(settingsPtr->name); //name + float value = round((readings[i] + settingsPtr->offset) * settingsPtr->multiplier, settingsPtr->decimals); + lightArr.add(value); //value + lightArr.add(" " + settingsPtr->units); //unit + } + } + + void addToConfig(JsonObject& root) + { + JsonObject top = root.createNestedObject(F("ADC ADS1115")); + + for (uint8_t i = 0; i < channelsCount; i++) { + ChannelSettings* settingsPtr = &(channelSettings[i]); + JsonObject channel = top.createNestedObject(settingsPtr->settingName); + channel[F("Enabled")] = settingsPtr->isEnabled; + channel[F("Name")] = settingsPtr->name; + channel[F("Units")] = settingsPtr->units; + channel[F("Multiplier")] = settingsPtr->multiplier; + channel[F("Offset")] = settingsPtr->offset; + channel[F("Decimals")] = settingsPtr->decimals; + } + + top[F("Loop Interval")] = loopInterval; + } + + bool readFromConfig(JsonObject& root) + { + JsonObject top = root[F("ADC ADS1115")]; + + bool configComplete = !top.isNull(); + bool hasEnabledChannels = false; + + for (uint8_t i = 0; i < channelsCount && configComplete; i++) { + ChannelSettings* settingsPtr = &(channelSettings[i]); + JsonObject channel = top[settingsPtr->settingName]; + + configComplete &= !channel.isNull(); + + configComplete &= getJsonValue(channel[F("Enabled")], settingsPtr->isEnabled); + configComplete &= getJsonValue(channel[F("Name")], settingsPtr->name); + configComplete &= getJsonValue(channel[F("Units")], settingsPtr->units); + configComplete &= getJsonValue(channel[F("Multiplier")], settingsPtr->multiplier); + configComplete &= getJsonValue(channel[F("Offset")], settingsPtr->offset); + configComplete &= getJsonValue(channel[F("Decimals")], settingsPtr->decimals); + + hasEnabledChannels |= settingsPtr->isEnabled; + } + + configComplete &= getJsonValue(top[F("Loop Interval")], loopInterval); + + isEnabled = isInitialized && configComplete && hasEnabledChannels; + + return configComplete; + } + + uint16_t getId() + { + return USERMOD_ID_ADS1115; + } + + private: + static const uint8_t channelsCount = 8; + + ChannelSettings channelSettings[channelsCount] = { + { + "Differential reading from AIN0 (P) and AIN1 (N)", + false, + "Differential AIN0 AIN1", + "V", + ADS1X15_REG_CONFIG_MUX_DIFF_0_1, + 1, + 0, + 3 + }, + { + "Differential reading from AIN0 (P) and AIN3 (N)", + false, + "Differential AIN0 AIN3", + "V", + ADS1X15_REG_CONFIG_MUX_DIFF_0_3, + 1, + 0, + 3 + }, + { + "Differential reading from AIN1 (P) and AIN3 (N)", + false, + "Differential AIN1 AIN3", + "V", + ADS1X15_REG_CONFIG_MUX_DIFF_1_3, + 1, + 0, + 3 + }, + { + "Differential reading from AIN2 (P) and AIN3 (N)", + false, + "Differential AIN2 AIN3", + "V", + ADS1X15_REG_CONFIG_MUX_DIFF_2_3, + 1, + 0, + 3 + }, + { + "Single-ended reading from AIN0", + false, + "Single-ended AIN0", + "V", + ADS1X15_REG_CONFIG_MUX_SINGLE_0, + 1, + 0, + 3 + }, + { + "Single-ended reading from AIN1", + false, + "Single-ended AIN1", + "V", + ADS1X15_REG_CONFIG_MUX_SINGLE_1, + 1, + 0, + 3 + }, + { + "Single-ended reading from AIN2", + false, + "Single-ended AIN2", + "V", + ADS1X15_REG_CONFIG_MUX_SINGLE_2, + 1, + 0, + 3 + }, + { + "Single-ended reading from AIN3", + false, + "Single-ended AIN3", + "V", + ADS1X15_REG_CONFIG_MUX_SINGLE_3, + 1, + 0, + 3 + }, + }; + float readings[channelsCount] = {0, 0, 0, 0, 0, 0, 0, 0}; + + unsigned long loopInterval = 1000; + unsigned long lastTime = 0; + + Adafruit_ADS1115 ads; + uint8_t activeChannel; + + bool isEnabled = false; + bool isInitialized = false; + + static float round(float value, uint8_t decimals) { + return roundf(value * powf(10, decimals)) / powf(10, decimals); + } + + bool initChannel() { + for (uint8_t i = 0; i < channelsCount; i++) { + if (channelSettings[i].isEnabled) { + activeChannel = i; + return true; + } + } + + activeChannel = 0; + return false; + } + + void moveToNextChannel() { + uint8_t oldActiveChannel = activeChannel; + + do + { + if (++activeChannel >= channelsCount){ + activeChannel = 0; + } + } + while (!channelSettings[activeChannel].isEnabled && oldActiveChannel != activeChannel); + } + + void startReading() { + ads.startADCReading(channelSettings[activeChannel].mux, /*continuous=*/false); + } + + void updateResult() { + int16_t results = ads.getLastConversionResults(); + readings[activeChannel] = ads.computeVolts(results); + } +}; \ No newline at end of file diff --git a/usermods/Analog_Clock/Analog_Clock.h b/usermods/Analog_Clock/Analog_Clock.h new file mode 100644 index 00000000..10c47588 --- /dev/null +++ b/usermods/Analog_Clock/Analog_Clock.h @@ -0,0 +1,244 @@ +#pragma once +#include "wled.h" + +/* + * Usermod for analog clock + */ +extern Timezone* tz; + +class AnalogClockUsermod : public Usermod { +private: + static constexpr uint32_t refreshRate = 50; // per second + static constexpr uint32_t refreshDelay = 1000 / refreshRate; + + struct Segment { + // config + int16_t firstLed = 0; + int16_t lastLed = 59; + int16_t centerLed = 0; + + // runtime + int16_t size; + + Segment() { + update(); + } + + void validateAndUpdate() { + if (firstLed < 0 || firstLed >= strip.getLengthTotal() || + lastLed < firstLed || lastLed >= strip.getLengthTotal()) { + *this = {}; + return; + } + if (centerLed < firstLed || centerLed > lastLed) { + centerLed = firstLed; + } + update(); + } + + void update() { + size = lastLed - firstLed + 1; + } + }; + + // configuration (available in API and stored in flash) + bool enabled = false; + Segment mainSegment; + uint32_t hourColor = 0x0000FF; + uint32_t minuteColor = 0x00FF00; + bool secondsEnabled = true; + Segment secondsSegment; + uint32_t secondColor = 0xFF0000; + bool blendColors = true; + uint16_t secondsEffect = 0; + + // runtime + bool initDone = false; + uint32_t lastOverlayDraw = 0; + + void validateAndUpdate() { + mainSegment.validateAndUpdate(); + secondsSegment.validateAndUpdate(); + if (secondsEffect < 0 || secondsEffect > 1) { + secondsEffect = 0; + } + } + + int16_t adjustToSegment(double progress, Segment const& segment) { + int16_t led = segment.centerLed + progress * segment.size; + return led > segment.lastLed + ? segment.firstLed + led - segment.lastLed - 1 + : led; + } + + void setPixelColor(uint16_t n, uint32_t c) { + if (!blendColors) { + strip.setPixelColor(n, c); + } else { + uint32_t oldC = strip.getPixelColor(n); + strip.setPixelColor(n, qadd32(oldC, c)); + } + } + + String colorToHexString(uint32_t c) { + char buffer[9]; + sprintf(buffer, "%06X", c); + return buffer; + } + + bool hexStringToColor(String const& s, uint32_t& c, uint32_t def) { + errno = 0; + char* ep; + unsigned long long r = strtoull(s.c_str(), &ep, 16); + if (*ep == 0 && errno != ERANGE) { + c = r; + return true; + } else { + c = def; + return false; + } + } + + void secondsEffectSineFade(int16_t secondLed, Toki::Time const& time) { + uint32_t ms = time.ms % 1000; + uint8_t b0 = (cos8(ms * 64 / 1000) - 128) * 2; + setPixelColor(secondLed, gamma32(scale32(secondColor, b0))); + uint8_t b1 = (sin8(ms * 64 / 1000) - 128) * 2; + setPixelColor(inc(secondLed, 1, secondsSegment), gamma32(scale32(secondColor, b1))); + } + + static inline uint32_t qadd32(uint32_t c1, uint32_t c2) { + return RGBW32( + qadd8(R(c1), R(c2)), + qadd8(G(c1), G(c2)), + qadd8(B(c1), B(c2)), + qadd8(W(c1), W(c2)) + ); + } + + static inline uint32_t scale32(uint32_t c, fract8 scale) { + return RGBW32( + scale8(R(c), scale), + scale8(G(c), scale), + scale8(B(c), scale), + scale8(W(c), scale) + ); + } + + static inline int16_t dec(int16_t n, int16_t i, Segment const& seg) { + return n - seg.firstLed >= i + ? n - i + : seg.lastLed - seg.firstLed - i + n + 1; + } + + static inline int16_t inc(int16_t n, int16_t i, Segment const& seg) { + int16_t r = n + i; + if (r > seg.lastLed) { + return seg.firstLed + n - seg.lastLed; + } + return r; + } + +public: + AnalogClockUsermod() { + } + + void setup() override { + initDone = true; + validateAndUpdate(); + } + + void loop() override { + if (millis() - lastOverlayDraw > refreshDelay) { + strip.trigger(); + } + } + + void handleOverlayDraw() override { + if (!enabled) { + return; + } + + lastOverlayDraw = millis(); + + auto time = toki.getTime(); + auto localSec = tz ? tz->toLocal(time.sec) : time.sec; + double secondP = second(localSec) / 60.0; + double minuteP = minute(localSec) / 60.0; + double hourP = (hour(localSec) % 12) / 12.0 + minuteP / 12.0; + + if (secondsEnabled) { + int16_t secondLed = adjustToSegment(secondP, secondsSegment); + + switch (secondsEffect) { + case 0: // no effect + setPixelColor(secondLed, secondColor); + break; + + case 1: // fading seconds + secondsEffectSineFade(secondLed, time); + break; + } + + // TODO: move to secondsTrailEffect + // for (uint16_t i = 1; i < secondsTrail + 1; ++i) { + // uint16_t trailLed = dec(secondLed, i, secondsSegment); + // uint8_t trailBright = 255 / (secondsTrail + 1) * (secondsTrail - i + 1); + // setPixelColor(trailLed, gamma32(scale32(secondColor, trailBright))); + // } + } + + setPixelColor(adjustToSegment(minuteP, mainSegment), minuteColor); + setPixelColor(adjustToSegment(hourP, mainSegment), hourColor); + } + + void addToConfig(JsonObject& root) override { + validateAndUpdate(); + + JsonObject top = root.createNestedObject("Analog Clock"); + top["Overlay Enabled"] = enabled; + top["First LED (Main Ring)"] = mainSegment.firstLed; + top["Last LED (Main Ring)"] = mainSegment.lastLed; + top["Center/12h LED (Main Ring)"] = mainSegment.centerLed; + top["Hour Color (RRGGBB)"] = colorToHexString(hourColor); + top["Minute Color (RRGGBB)"] = colorToHexString(minuteColor); + top["Show Seconds"] = secondsEnabled; + top["First LED (Seconds Ring)"] = secondsSegment.firstLed; + top["Last LED (Seconds Ring)"] = secondsSegment.lastLed; + top["Center/12h LED (Seconds Ring)"] = secondsSegment.centerLed; + top["Second Color (RRGGBB)"] = colorToHexString(secondColor); + top["Seconds Effect (0-1)"] = secondsEffect; + top["Blend Colors"] = blendColors; + } + + bool readFromConfig(JsonObject& root) override { + JsonObject top = root["Analog Clock"]; + + bool configComplete = !top.isNull(); + + String color; + configComplete &= getJsonValue(top["Overlay Enabled"], enabled, false); + configComplete &= getJsonValue(top["First LED (Main Ring)"], mainSegment.firstLed, 0); + configComplete &= getJsonValue(top["Last LED (Main Ring)"], mainSegment.lastLed, 59); + configComplete &= getJsonValue(top["Center/12h LED (Main Ring)"], mainSegment.centerLed, 0); + configComplete &= getJsonValue(top["Hour Color (RRGGBB)"], color, "0000FF") && hexStringToColor(color, hourColor, 0x0000FF); + configComplete &= getJsonValue(top["Minute Color (RRGGBB)"], color, "00FF00") && hexStringToColor(color, minuteColor, 0x00FF00); + configComplete &= getJsonValue(top["Show Seconds"], secondsEnabled, true); + configComplete &= getJsonValue(top["First LED (Seconds Ring)"], secondsSegment.firstLed, 0); + configComplete &= getJsonValue(top["Last LED (Seconds Ring)"], secondsSegment.lastLed, 59); + configComplete &= getJsonValue(top["Center/12h LED (Seconds Ring)"], secondsSegment.centerLed, 0); + configComplete &= getJsonValue(top["Second Color (RRGGBB)"], color, "FF0000") && hexStringToColor(color, secondColor, 0xFF0000); + configComplete &= getJsonValue(top["Seconds Effect (0-1)"], secondsEffect, 0); + configComplete &= getJsonValue(top["Blend Colors"], blendColors, true); + + if (initDone) { + validateAndUpdate(); + } + + return configComplete; + } + + uint16_t getId() override { + return USERMOD_ID_ANALOG_CLOCK; + } +}; \ No newline at end of file diff --git a/usermods/BH1750_v2/platformio_override.ini b/usermods/BH1750_v2/platformio_override.ini deleted file mode 100644 index 7b981e50..00000000 --- a/usermods/BH1750_v2/platformio_override.ini +++ /dev/null @@ -1,16 +0,0 @@ -; Options -; ------- -; USERMOD_BH1750 - define this to have this user mod included wled00\usermods_list.cpp -; USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL - the max number of milliseconds between measurements, defaults to 10000ms -; USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL - the min number of milliseconds between measurements, defaults to 500ms -; USERMOD_BH1750_FIRST_MEASUREMENT_AT - the number of milliseconds after boot to take first measurement, defaults to 10 seconds -; USERMOD_BH1750_OFFSET_VALUE - the offset value to report on, defaults to 1 -; -[env:usermod_BH1750_d1_mini] -extends = env:d1_mini -build_flags = - ${common.build_flags_esp8266} - -D USERMOD_BH1750 -lib_deps = - ${env.lib_deps} - claws/BH1750 @ ^1.2.0 diff --git a/usermods/BH1750_v2/readme.md b/usermods/BH1750_v2/readme.md index a3507770..f70300b7 100644 --- a/usermods/BH1750_v2/readme.md +++ b/usermods/BH1750_v2/readme.md @@ -3,22 +3,47 @@ This usermod will read from an ambient light sensor like the BH1750 sensor. The luminance is displayed both in the Info section of the web UI as well as published to the `/luminance` MQTT topic if enabled. -## Installation +## Dependencies +- Libraries + - `claws/BH1750 @^1.2.0` + - This must be added under `lib_deps` in your `platformio.ini` (or `platformio_override.ini`). +- Data is published over MQTT - make sure you've enabled the MQTT sync interface. -Copy the example `platformio_override.ini` to the root directory. This file should be placed in the same directory as `platformio.ini`. +## Compiliation -### Define Your Options +To enable, compile with `USERMOD_BH1750` defined (e.g. in `platformio_override.ini`) +```ini +[env:usermod_BH1750_d1_mini] +extends = env:d1_mini +build_flags = + ${common.build_flags_esp8266} + -D USERMOD_BH1750 +lib_deps = + ${esp8266.lib_deps} + claws/BH1750 @ ^1.2.0 +``` -* `USERMOD_BH1750` - define this to have this user mod included wled00\usermods_list.cpp -* `USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL` - the max number of milliseconds between measurements, defaults to 10000ms -* `USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL` - the min number of milliseconds between measurements, defaults to 500ms -* `USERMOD_BH1750_FIRST_MEASUREMENT_AT` - the number of milliseconds after boot to take first measurement, defaults to 10 seconds -* `USERMOD_BH1750_OFFSET_VALUE` - the offset value to report on, defaults to 1 +### Configuration Options +The following settings can be set at compile-time but are configurable on the usermod menu (except First Measurement time): +* `USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL` - the max number of milliseconds between measurements, defaults to 10000ms +* `USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL` - the min number of milliseconds between measurements, defaults to 500ms +* `USERMOD_BH1750_OFFSET_VALUE` - the offset value to report on, defaults to 1 +* `USERMOD_BH1750_FIRST_MEASUREMENT_AT` - the number of milliseconds after boot to take first measurement, defaults to 10 seconds -All parameters can be configured at runtime using Usermods settings page. +In addition, on the Usermod screen allows you to: +- enable/disable the usermod +- Enable Home Assistant Discovery of usermod +- Configure the SCL/SDA pins -### PlatformIO requirements - -If you are using `platformio_override.ini`, you should be able to refresh the task list and see your custom task, for example `env:usermod_BH1750_d1_mini`. +## API +The following method is available to interact with the usermod from other code modules: +- `getIlluminance` read the brightness from the sensor ## Change Log +Jul 2022 +- Added Home Assistant Discovery +- Implemented PinManager to register pins +- Made pins configurable in usermod menu +- Added API call to read illuminance from other modules +- Enhanced info-screen outputs +- Updated `readme.md` \ No newline at end of file diff --git a/usermods/BH1750_v2/usermod_bh1750.h b/usermods/BH1750_v2/usermod_bh1750.h index fb0b1c5a..a3b2cd2e 100644 --- a/usermods/BH1750_v2/usermod_bh1750.h +++ b/usermods/BH1750_v2/usermod_bh1750.h @@ -1,3 +1,6 @@ +// force the compiler to show a warning to confirm that this file is included +#warning **** Included USERMOD_BH1750 **** + #pragma once #include "wled.h" @@ -47,6 +50,24 @@ private: static const char _maxReadInterval[]; static const char _minReadInterval[]; static const char _offset[]; + static const char _HomeAssistantDiscovery[]; + + // set the default pins based on the architecture, these get overridden by Usermod menu settings + #ifdef ARDUINO_ARCH_ESP32 // ESP32 boards + #define HW_PIN_SCL 22 + #define HW_PIN_SDA 21 + #else // ESP8266 boards + #define HW_PIN_SCL 5 + #define HW_PIN_SDA 4 + #endif + int8_t ioPin[2] = {HW_PIN_SCL, HW_PIN_SDA}; // I2C pins: SCL, SDA...defaults to Arch hardware pins but overridden at setup() + bool initDone = false; + bool sensorFound = false; + + // Home Assistant and MQTT + String mqttLuminanceTopic = F(""); + bool mqttInitialized = false; + bool HomeAssistantDiscovery = true; // Publish Home Assistant Discovery messages BH1750 lightMeter; float lastLux = -1000; @@ -55,12 +76,59 @@ private: { return isnan(prevValue) || newValue <= prevValue - maxDiff || newValue >= prevValue + maxDiff || (newValue == 0.0 && prevValue > 0.0); } + + // set up Home Assistant discovery entries + void _mqttInitialize() + { + mqttLuminanceTopic = String(mqttDeviceTopic) + F("/brightness"); + + if (HomeAssistantDiscovery) _createMqttSensor(F("Brightness"), mqttLuminanceTopic, F("Illuminance"), F(" lx")); + } + + // Create an MQTT Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop. + void _createMqttSensor(const String &name, const String &topic, const String &deviceClass, const String &unitOfMeasurement) + { + String t = String(F("homeassistant/sensor/")) + mqttClientID + F("/") + name + F("/config"); + + StaticJsonDocument<600> doc; + + doc[F("name")] = String(serverDescription) + F(" ") + name; + doc[F("state_topic")] = topic; + doc[F("unique_id")] = String(mqttClientID) + name; + if (unitOfMeasurement != "") + doc[F("unit_of_measurement")] = unitOfMeasurement; + if (deviceClass != "") + doc[F("device_class")] = deviceClass; + doc[F("expire_after")] = 1800; + + JsonObject device = doc.createNestedObject(F("device")); // attach the sensor to the same device + device[F("name")] = serverDescription; + device[F("identifiers")] = "wled-sensor-" + String(mqttClientID); + device[F("manufacturer")] = F("WLED"); + device[F("model")] = F("FOSS"); + device[F("sw_version")] = versionString; + + String temp; + serializeJson(doc, temp); + DEBUG_PRINTLN(t); + DEBUG_PRINTLN(temp); + + mqtt->publish(t.c_str(), 0, true, temp.c_str()); + } public: void setup() { - Wire.begin(); - lightMeter.begin(); + bool HW_Pins_Used = (ioPin[0]==HW_PIN_SCL && ioPin[1]==HW_PIN_SDA); // note whether architecture-based hardware SCL/SDA pins used + PinOwner po = PinOwner::UM_BH1750; // defaults to being pinowner for SCL/SDA pins + PinManagerPinType pins[2] = { { ioPin[0], true }, { ioPin[1], true } }; // allocate pins + if (HW_Pins_Used) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins + if (!pinManager.allocateMultiplePins(pins, 2, po)) return; + + Wire.begin(ioPin[1], ioPin[0]); + + sensorFound = lightMeter.begin(); + initDone = true; } void loop() @@ -90,18 +158,25 @@ public: lastSend = millis(); if (WLED_MQTT_CONNECTED) { - char subuf[45]; - strcpy(subuf, mqttDeviceTopic); - strcat_P(subuf, PSTR("/luminance")); - mqtt->publish(subuf, 0, true, String(lux).c_str()); + if (!mqttInitialized) + { + _mqttInitialize(); + mqttInitialized = true; + } + mqtt->publish(mqttLuminanceTopic.c_str(), 0, true, String(lux).c_str()); + DEBUG_PRINTLN(F("Brightness: ") + String(lux) + F("lx")); } else { - DEBUG_PRINTLN("Missing MQTT connection. Not publishing data"); + DEBUG_PRINTLN(F("Missing MQTT connection. Not publishing data")); } } } + inline float getIlluminance() { + return (float)lastLux; + } + void addToJsonInfo(JsonObject &root) { JsonObject user = root[F("u")]; @@ -109,28 +184,23 @@ public: user = root.createNestedObject(F("u")); JsonArray lux_json = user.createNestedArray(F("Luminance")); - - if (!getLuminanceComplete) - { + if (!sensorFound) { + // if no sensor + lux_json.add(F("BH1750 ")); + lux_json.add(F("Not Found")); + } else if (!getLuminanceComplete) { // if we haven't read the sensor yet, let the user know - // that we are still waiting for the first measurement - lux_json.add((USERMOD_BH1750_FIRST_MEASUREMENT_AT - millis()) / 1000); - lux_json.add(F(" sec until read")); - return; + // that we are still waiting for the first measurement + lux_json.add((USERMOD_BH1750_FIRST_MEASUREMENT_AT - millis()) / 1000); + lux_json.add(F(" sec until read")); + return; + } else { + lux_json.add(lastLux); + lux_json.add(F(" lx")); } - - lux_json.add(lastLux); - lux_json.add(F(" lx")); } - uint16_t getId() - { - return USERMOD_ID_BH1750; - } - - /** - * addToConfig() (called from set.cpp) stores persistent properties to cfg.json - */ + // (called from set.cpp) stores persistent properties to cfg.json void addToConfig(JsonObject &root) { // we add JSON object. @@ -138,35 +208,68 @@ public: top[FPSTR(_enabled)] = !disabled; top[FPSTR(_maxReadInterval)] = maxReadingInterval; top[FPSTR(_minReadInterval)] = minReadingInterval; + top[FPSTR(_HomeAssistantDiscovery)] = HomeAssistantDiscovery; top[FPSTR(_offset)] = offset; + JsonArray io_pin = top.createNestedArray(F("pin")); + for (byte i=0; i<2; i++) io_pin.add(ioPin[i]); + top[F("help4Pins")] = F("SCL,SDA"); // help for Settings page - DEBUG_PRINTLN(F("Photoresistor config saved.")); + DEBUG_PRINTLN(F("BH1750 config saved.")); } - /** - * readFromConfig() is called before setup() to populate properties from values stored in cfg.json - */ + // called before setup() to populate properties from values stored in cfg.json bool readFromConfig(JsonObject &root) { + int8_t newPin[2]; for (byte i=0; i<2; i++) newPin[i] = ioPin[i]; // prepare to note changed pins + // we look for JSON object. JsonObject top = root[FPSTR(_name)]; if (top.isNull()) { DEBUG_PRINT(FPSTR(_name)); + DEBUG_PRINT(F("BH1750")); DEBUG_PRINTLN(F(": No config found. (Using defaults.)")); return false; } + bool configComplete = !top.isNull(); + + configComplete &= getJsonValue(top[FPSTR(_enabled)], disabled, false); + configComplete &= getJsonValue(top[FPSTR(_maxReadInterval)], maxReadingInterval, 10000); //ms + configComplete &= getJsonValue(top[FPSTR(_minReadInterval)], minReadingInterval, 500); //ms + configComplete &= getJsonValue(top[FPSTR(_HomeAssistantDiscovery)], HomeAssistantDiscovery, false); + configComplete &= getJsonValue(top[FPSTR(_offset)], offset, 1); + for (byte i=0; i<2; i++) configComplete &= getJsonValue(top[F("pin")][i], newPin[i], ioPin[i]); - disabled = !(top[FPSTR(_enabled)] | !disabled); - maxReadingInterval = (top[FPSTR(_maxReadInterval)] | maxReadingInterval); // ms - minReadingInterval = (top[FPSTR(_minReadInterval)] | minReadingInterval); // ms - offset = top[FPSTR(_offset)] | offset; DEBUG_PRINT(FPSTR(_name)); - DEBUG_PRINTLN(F(" config (re)loaded.")); + if (!initDone) { + // first run: reading from cfg.json + for (byte i=0; i<2; i++) ioPin[i] = newPin[i]; + DEBUG_PRINTLN(F(" config loaded.")); + } else { + DEBUG_PRINTLN(F(" config (re)loaded.")); + // changing parameters from settings page + bool pinsChanged = false; + for (byte i=0; i<2; i++) if (ioPin[i] != newPin[i]) { pinsChanged = true; break; } // check if any pins changed + if (pinsChanged) { //if pins changed, deallocate old pins and allocate new ones + PinOwner po = PinOwner::UM_BH1750; + if (ioPin[0]==HW_PIN_SCL && ioPin[1]==HW_PIN_SDA) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins + pinManager.deallocateMultiplePins((const uint8_t *)ioPin, 2, po); // deallocate pins + for (byte i=0; i<2; i++) ioPin[i] = newPin[i]; + setup(); + } + // use "return !top["newestParameter"].isNull();" when updating Usermod with new features + return !top[F("pin")].isNull(); + } - // use "return !top["newestParameter"].isNull();" when updating Usermod with new features - return true; + return configComplete; + } + + uint16_t getId() + { + return USERMOD_ID_BH1750; + } + }; // strings to reduce flash memory usage (used more than twice) @@ -174,4 +277,5 @@ const char Usermod_BH1750::_name[] PROGMEM = "BH1750"; const char Usermod_BH1750::_enabled[] PROGMEM = "enabled"; const char Usermod_BH1750::_maxReadInterval[] PROGMEM = "max-read-interval-ms"; const char Usermod_BH1750::_minReadInterval[] PROGMEM = "min-read-interval-ms"; +const char Usermod_BH1750::_HomeAssistantDiscovery[] PROGMEM = "HomeAssistantDiscoveryLux"; const char Usermod_BH1750::_offset[] PROGMEM = "offset-lx"; diff --git a/usermods/BH1750_v2/usermods_list.cpp b/usermods/BH1750_v2/usermods_list.cpp deleted file mode 100644 index 6e914df5..00000000 --- a/usermods/BH1750_v2/usermods_list.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "wled.h" -/* - * Register your v2 usermods here! - */ -#ifdef USERMOD_BH1750 -#include "../usermods/BH1750_v2/usermod_BH1750.h" -#endif - -void registerUsermods() -{ -#ifdef USERMOD_BH1750 - usermods.add(new Usermod_BH1750()); -#endif -} diff --git a/usermods/DHT/platformio_override.ini b/usermods/DHT/platformio_override.ini index 1771fd17..d192f043 100644 --- a/usermods/DHT/platformio_override.ini +++ b/usermods/DHT/platformio_override.ini @@ -6,12 +6,13 @@ ; USERMOD_DHT_CELSIUS - define this to report temperatures in degrees celsious, otherwise fahrenheit will be reported ; USERMOD_DHT_MEASUREMENT_INTERVAL - the number of milliseconds between measurements, defaults to 60 seconds ; USERMOD_DHT_FIRST_MEASUREMENT_AT - the number of milliseconds after boot to take first measurement, defaults to 90 seconds +; USERMOD_DHT_MQTT - publish measurements to the MQTT broker ; USERMOD_DHT_STATS - For debug, report delay stats [env:d1_mini_usermod_dht_C] extends = env:d1_mini build_flags = ${env:d1_mini.build_flags} -D USERMOD_DHT -D USERMOD_DHT_CELSIUS -lib_deps = ${env.lib_deps} +lib_deps = ${env:d1_mini.lib_deps} https://github.com/alwynallan/DHT_nonblocking [env:custom32_LEDPIN_16_usermod_dht_C] diff --git a/usermods/DHT/readme.md b/usermods/DHT/readme.md index 5a123d4b..55b1dd1c 100644 --- a/usermods/DHT/readme.md +++ b/usermods/DHT/readme.md @@ -1,10 +1,14 @@ # DHT Temperature/Humidity sensor usermod This usermod will read from an attached DHT22 or DHT11 humidity and temperature sensor. -The sensor readings are displayed in the Info section of the web UI. +The sensor readings are displayed in the Info section of the web UI (and optionally send to a MQTT broker). If sensor is not detected after a while (10 update intervals), this usermod will be disabled. +If enabled measured temperature and humidity will be published to the following MQTT topics +* `{devceTopic}/dht/temperature` +* `{devceTopic}/dht/humidity` + ## Installation Copy the example `platformio_override.ini` to the root directory. This file should be placed in the same directory as `platformio.ini`. @@ -17,6 +21,7 @@ Copy the example `platformio_override.ini` to the root directory. This file sho * `USERMOD_DHT_CELSIUS` - define this to report temperatures in degrees celsious, otherwise fahrenheit will be reported * `USERMOD_DHT_MEASUREMENT_INTERVAL` - the number of milliseconds between measurements, defaults to 60 seconds * `USERMOD_DHT_FIRST_MEASUREMENT_AT` - the number of milliseconds after boot to take first measurement, defaults to 90 seconds +* `USERMOD_DHT_MQTT` - publish measurements to the MQTT broker * `USERMOD_DHT_STATS` - For debug, report delay stats ## Project link @@ -29,13 +34,15 @@ If you are using `platformio_override.ini`, you should be able to refresh the ta ## Change Log - +2022-10-15 +* Add possibility to publish sensor readings to an MQTT broker +* fix compilation error for sample [env:d1_mini_usermod_dht_C] task 2020-02-04 * Change default QuinLed pin to Q2 * Instead of trying to keep updates at constant cadence, space readings out by measurement interval; hope this helps to avoid occasional bursts of readings with errors * Add some more (optional) stats 2020-02-03 * Due to poor readouts on ESP32 with previous DHT library, rewrote to use https://github.com/alwynallan/DHT_nonblocking -* The new library serializes/delays up to 5ms for the sensor readout -2020-02-02 +* The new library serializes/delays up to 5ms for the sensor readout +2020-02-02 * Created diff --git a/usermods/DHT/usermod_dht.h b/usermods/DHT/usermod_dht.h index 9f46734f..6253b85f 100644 --- a/usermods/DHT/usermod_dht.h +++ b/usermods/DHT/usermod_dht.h @@ -62,6 +62,10 @@ class UsermodDHT : public Usermod { float humidity, temperature = 0; bool initializing = true; bool disabled = false; + #ifdef USERMOD_DHT_MQTT + char dhtMqttTopic[64]; + size_t dhtMqttTopicLen; + #endif #ifdef USERMOD_DHT_STATS unsigned long nextResetStatsTime = 0; uint16_t updates = 0; @@ -76,6 +80,10 @@ class UsermodDHT : public Usermod { void setup() { nextReadTime = millis() + USERMOD_DHT_FIRST_MEASUREMENT_AT; lastReadTime = millis(); + #ifdef USERMOD_DHT_MQTT + sprintf(dhtMqttTopic, "%s/dht", mqttDeviceTopic); + dhtMqttTopicLen = strlen(dhtMqttTopic); + #endif #ifdef USERMOD_DHT_STATS nextResetStatsTime = millis() + 60*60*1000; #endif @@ -110,10 +118,29 @@ class UsermodDHT : public Usermod { temperature = tempC * 9 / 5 + 32; #endif + #ifdef USERMOD_DHT_MQTT + // 10^n where n is number of decimal places to display in mqtt message. Please adjust buff size together with this constant + #define FLOAT_PREC 100 + if (WLED_MQTT_CONNECTED) { + char buff[10]; + + strcpy(dhtMqttTopic + dhtMqttTopicLen, "/temperature"); + sprintf(buff, "%d.%d", (int)temperature, ((int)(temperature * FLOAT_PREC)) % FLOAT_PREC); + mqtt->publish(dhtMqttTopic, 0, false, buff); + + sprintf(buff, "%d.%d", (int)humidity, ((int)(humidity * FLOAT_PREC)) % FLOAT_PREC); + strcpy(dhtMqttTopic + dhtMqttTopicLen, "/humidity"); + mqtt->publish(dhtMqttTopic, 0, false, buff); + + dhtMqttTopic[dhtMqttTopicLen] = '\0'; + } + #undef FLOAT_PREC + #endif + nextReadTime = millis() + USERMOD_DHT_MEASUREMENT_INTERVAL; lastReadTime = millis(); initializing = false; - + #ifdef USERMOD_DHT_STATS unsigned long icalc = millis() - currentIteration; if (icalc > maxIteration) { @@ -134,7 +161,7 @@ class UsermodDHT : public Usermod { dcalc = millis() - dcalc; if (dcalc > maxDelay) { maxDelay = dcalc; - } + } #endif if (((millis() - lastReadTime) > 10*USERMOD_DHT_MEASUREMENT_INTERVAL)) { @@ -207,7 +234,7 @@ class UsermodDHT : public Usermod { temp.add("°F"); #endif } - + uint16_t getId() { return USERMOD_ID_DHT; diff --git a/usermods/VL53L0X_gestures/readme.md b/usermods/VL53L0X_gestures/readme.md index dec84130..74c970dc 100644 --- a/usermods/VL53L0X_gestures/readme.md +++ b/usermods/VL53L0X_gestures/readme.md @@ -5,13 +5,12 @@ It can be useful for kitchen strips to avoid any touches. - on/off - just swipe a hand below your sensor ("shortPressAction" is called and can be customized through WLED macros) - brightness correction - keep your hand below sensor for 1 second to switch to "brightness" mode. Configure brightness by changing distance to the sensor (see parameters below for customization). - "macroLongPress" is also called here. - -## Installation + +## Installation 1. Attach VL53L0X sensor to i2c pins according to default pins for your board. 2. Add `-D USERMOD_VL53L0X_GESTURES` to your build flags at platformio.ini (plaformio_override.ini) for needed environment. -In my case, for example: `build_flags = ${common.build_flags_esp8266} -D RLYPIN=12 -D USERMOD_VL53L0X_GESTURES` +In my case, for example: `build_flags = ${env.build_flags} -D USERMOD_VL53L0X_GESTURES` 3. Add "pololu/VL53L0X" dependency below to `lib_deps` like this: ```ini lib_deps = ${env.lib_deps} @@ -21,15 +20,10 @@ lib_deps = ${env.lib_deps} My entire `platformio_override.ini` for example (for nodemcu board): ```ini [platformio] -default_envs = nodemcu +default_envs = nodemcuv2 -[env:nodemcu] -board = nodemcu -platform = ${common.platform_wled_default} -platform_packages = ${common.platform_packages} -board_build.ldscript = ${common.ldscript_4m1m} -build_unflags = ${common.build_unflags} -build_flags = ${common.build_flags_esp8266} -D RLYPIN=12 -D USERMOD_VL53L0X_GESTURES +[env:nodemcuv2] +build_flags = ${env.build_flags} -D USERMOD_VL53L0X_GESTURES lib_deps = ${env.lib_deps} - pololu/VL53L0X @ ^1.3.0 + pololu/VL53L0X @ ^1.3.0 ``` \ No newline at end of file diff --git a/usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h b/usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h index 91766b9b..39c2c3ef 100644 --- a/usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h +++ b/usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h @@ -3,14 +3,13 @@ * It can be useful for kitchen strips to avoid any touches. * - on/off - just swipe a hand below your sensor ("shortPressAction" is called and can be customized through WLED macros) * - brightness correction - keep your hand below sensor for 1 second to switch to "brightness" mode. - * Configure brightness by changing distance to the sensor (see parameters below for customization). - * "macroLongPress" is also called here. + Configure brightness by changing distance to the sensor (see parameters below for customization). * - * Enabling this mod usermod: + * Enabling this usermod: * 1. Attach VL53L0X sensor to i2c pins according to default pins for your board. - * 2. Add "-D USERMOD_VL53L0X_GESTURES" to your build flags at platformio.ini (plaformio_override.ini) for needed environment. - * In my case, for example: build_flags = ${common.build_flags_esp8266} -D RLYPIN=12 -D USERMOD_VL53L0X_GESTURES - * 3. Add "pololu/VL53L0X" dependency to lib_deps like this: + * 2. Add `-D USERMOD_VL53L0X_GESTURES` to your build flags at platformio.ini (plaformio_override.ini) for needed environment. + * In my case, for example: `build_flags = ${env.build_flags} -D USERMOD_VL53L0X_GESTURES` + * 3. Add "pololu/VL53L0X" dependency below to `lib_deps` like this: * lib_deps = ${env.lib_deps} * pololu/VL53L0X @ ^1.3.0 */ @@ -22,19 +21,19 @@ #include #ifndef VL53L0X_MAX_RANGE_MM -#define VL53L0X_MAX_RANGE_MM 230 // max height in millimiters to react for motions +#define VL53L0X_MAX_RANGE_MM 230 // max height in millimeters to react for motions #endif #ifndef VL53L0X_MIN_RANGE_OFFSET -#define VL53L0X_MIN_RANGE_OFFSET 60 // minimal range in millimiters that sensor can detect. Used in long motions to correct brightnes calculation. +#define VL53L0X_MIN_RANGE_OFFSET 60 // minimal range in millimeters that sensor can detect. Used in long motions to correct brightness calculation. #endif #ifndef VL53L0X_DELAY_MS -#define VL53L0X_DELAY_MS 100 // how often to get data from sensor +#define VL53L0X_DELAY_MS 100 // how often to get data from sensor #endif #ifndef VL53L0X_LONG_MOTION_DELAY_MS -#define VL53L0X_LONG_MOTION_DELAY_MS 1000 // how often to get data from sensor +#define VL53L0X_LONG_MOTION_DELAY_MS 1000 // switch onto "long motion" action after this delay #endif class UsermodVL53L0XGestures : public Usermod { @@ -47,7 +46,7 @@ class UsermodVL53L0XGestures : public Usermod { bool wasMotionBefore = false; bool isLongMotion = false; unsigned long motionStartTime = 0; - + public: void setup() { @@ -72,40 +71,34 @@ class UsermodVL53L0XGestures : public Usermod { lastTime = millis(); int range = sensor.readRangeSingleMillimeters(); - DEBUG_PRINTF(F("range: %d, brightness: %d"), range, bri); + DEBUG_PRINTF("range: %d, brightness: %d\r\n", range, bri); if (range < VL53L0X_MAX_RANGE_MM) { if (!wasMotionBefore) { motionStartTime = millis(); - DEBUG_PRINTF(F("motionStartTime: %d"), motionStartTime); + DEBUG_PRINTF("motionStartTime: %d\r\n", motionStartTime); } wasMotionBefore = true; if (millis() - motionStartTime > VL53L0X_LONG_MOTION_DELAY_MS) //long motion { - DEBUG_PRINTF(F("long motion: %d"), motionStartTime); + DEBUG_PRINTF("long motion: %d\r\n", motionStartTime); if (!isLongMotion) { - if (macroLongPress) - { - applyMacro(macroLongPress); - } isLongMotion = true; } // set brightness according to range bri = (VL53L0X_MAX_RANGE_MM - max(range, VL53L0X_MIN_RANGE_OFFSET)) * 255 / (VL53L0X_MAX_RANGE_MM - VL53L0X_MIN_RANGE_OFFSET); - DEBUG_PRINTF(F("new brightness: %d"), bri); + DEBUG_PRINTF("new brightness: %d", bri); stateUpdated(1); } } else if (wasMotionBefore) { //released - long dur = millis() - motionStartTime; - if (!isLongMotion) { //short press - DEBUG_PRINTF(F("shortPressAction...")); + DEBUG_PRINTLN(F("shortPressAction...")); shortPressAction(); } wasMotionBefore = false; diff --git a/usermods/mpu6050_imu/readme.md b/usermods/mpu6050_imu/readme.md index adb19ef8..6e3cee3e 100644 --- a/usermods/mpu6050_imu/readme.md +++ b/usermods/mpu6050_imu/readme.md @@ -36,7 +36,7 @@ lib_deps = AsyncTCP@1.0.3 Esp Async WebServer@1.2.0 IRremoteESP8266@2.7.3 - I2Cdevlib-MPU6050@fbde122cc5 + jrowberg/I2Cdevlib-MPU6050@^1.0.0 ``` ## Wiring @@ -78,7 +78,7 @@ to the info object ## Usermod installation 1. Copy the file `usermod_mpu6050_imu.h` to the `wled00` directory. -2. Register the usermod by adding `#include "usermod_mpu6050_imu.h.h"` in the top and `registerUsermod(new MPU6050Driver());` in the bottom of `usermods_list.cpp`. +2. Register the usermod by adding `#include "usermod_mpu6050_imu.h"` in the top and `registerUsermod(new MPU6050Driver());` in the bottom of `usermods_list.cpp`. Example **usermods_list.cpp**: diff --git a/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h b/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h index 6274abce..b1a271a6 100644 --- a/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h +++ b/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h @@ -384,7 +384,7 @@ public: if (!umSSDRDisplayTime || strip.isUpdating()) { return; } - #ifdef USERMOD_ID_SN_PHOTORESISTOR + #ifdef USERMOD_SN_PHOTORESISTOR if(bri != 0 && umSSDREnableLDR && (millis() - umSSDRLastRefresh > umSSDRResfreshTime)) { if (ptr != nullptr) { uint16_t lux = ptr->getLastLDRValue(); diff --git a/usermods/smartnest/readme.md b/usermods/smartnest/readme.md new file mode 100644 index 00000000..c56f3621 --- /dev/null +++ b/usermods/smartnest/readme.md @@ -0,0 +1,61 @@ +# Smartnest + +This usermod-v2 modification allows integration with `smartnest.cz` service which provides MQTT integration with voice assistants. +In order to setup Smartnest follow the [documentation](https://www.docu.smartnest.cz/). + +## MQTT API + +The API is described in the Smartnest [Github repo](https://github.com/aososam/Smartnest/blob/master/Devices/lightRgb/lightRgb.ino). + + +## Usermod installation + +1. Register the usermod by adding `#include "../usermods/smartnest/usermod_smartnest.h"` at the top and `usermods.add(new Smartnest());` at the bottom of `usermods_list.cpp`. +or +2. Use `#define USERMOD_SMARTNEST` in wled.h or `-D USERMOD_SMARTNEST` in your platformio.ini + + +Example **usermods_list.cpp**: + +```cpp +#include "wled.h" +/* + * Register your v2 usermods here! + * (for v1 usermods using just usermod.cpp, you can ignore this file) + */ + +/* + * Add/uncomment your usermod filename here (and once more below) + * || || || + * \/ \/ \/ + */ +//#include "usermod_v2_example.h" +//#include "usermod_temperature.h" +#include "../usermods/usermod_smartnest.h" + +void registerUsermods() +{ + /* + * Add your usermod class name here + * || || || + * \/ \/ \/ + */ + //usermods.add(new MyExampleUsermod()); + //usermods.add(new UsermodTemperature()); + usermods.add(new Smartnest()); + +} +``` + +## Configuration + +Usermod has no configuration but relies on the MQTT configuration.\ +Under Config > Sync Interfaces > MQTT: +* Enable MQTT check box +* Set the `Broker` field to: `smartnest.cz` +* The `Username` and `Password` fields are the login information from the `smartnest.cz` website. +* `Client ID` field is obtained from the device configuration panel in `smartnest.cz`. + +## Change log +2022-09 +* First implementation. diff --git a/usermods/smartnest/usermod_smartnest.h b/usermods/smartnest/usermod_smartnest.h new file mode 100644 index 00000000..82673578 --- /dev/null +++ b/usermods/smartnest/usermod_smartnest.h @@ -0,0 +1,167 @@ +#pragma once + +#include "wled.h" + +class Smartnest : public Usermod +{ +private: + void sendToBroker(const char *const topic, const char *const message) + { + if (!WLED_MQTT_CONNECTED) + { + return; + } + + String topic_ = String(mqttClientID) + "/" + String(topic); + mqtt->publish(topic_.c_str(), 0, true, message); + } + + void turnOff() + { + setBrightness(0); + turnOnAtBoot = false; + offMode = true; + sendToBroker("report/powerState", "OFF"); + } + + void turnOn() + { + setBrightness(briLast); + turnOnAtBoot = true; + offMode = false; + sendToBroker("report/powerState", "ON"); + } + + void setBrightness(int value) + { + if (value == 0 && bri > 0) briLast = bri; + bri = value; + stateUpdated(CALL_MODE_DIRECT_CHANGE); + } + + void setColor(int r, int g, int b) + { + strip.setColor(0, r, g, b); + stateUpdated(CALL_MODE_DIRECT_CHANGE); + char msg[18] {}; + sprintf(msg, "rgb(%d,%d,%d)", r, g, b); + sendToBroker("report/color", msg); + } + + int splitColor(const char *const color, int * const rgb) + { + char *color_ = NULL; + const char delim[] = ","; + char *cxt = NULL; + char *token = NULL; + int position = 0; + + // We need to copy the string in order to keep it read only as strtok_r function requires mutable string + color_ = (char *)malloc(strlen(color)); + if (NULL == color_) { + return -1; + } + + strcpy(color_, color); + token = strtok_r(color_, delim, &cxt); + + while (token != NULL) + { + rgb[position++] = (int)strtoul(token, NULL, 10); + token = strtok_r(NULL, delim, &cxt); + } + free(color_); + + return position; + } + +public: + // Functions called by WLED + + /** + * handling of MQTT message + * topic should look like: /// + */ + bool onMqttMessage(char *topic, char *message) + { + String topic_{topic}; + String topic_prefix{mqttClientID + String("/directive/")}; + + if (!topic_.startsWith(topic_prefix)) + { + return false; + } + + String subtopic = topic_.substring(topic_prefix.length()); + String message_(message); + + if (subtopic == "powerState") + { + if (strcmp(message, "ON") == 0) + { + turnOn(); + } + else if (strcmp(message, "OFF") == 0) + { + turnOff(); + } + return true; + } + + if (subtopic == "percentage") + { + int val = (int)strtoul(message, NULL, 10); + if (val >= 0 && val <= 100) + { + setBrightness(map(val, 0, 100, 0, 255)); + } + return true; + } + + if (subtopic == "color") + { + // Parse the message which is in the format "rgb(<0-255>,<0-255>,<0-255>)" + int rgb[3] = {}; + String colors = message_.substring(String("rgb(").length(), message_.lastIndexOf(')')); + if (3 != splitColor(colors.c_str(), rgb)) + { + return false; + } + setColor(rgb[0], rgb[1], rgb[2]); + return true; + } + + return false; + } + + /** + * subscribe to MQTT topic and send publish current status. + */ + void onMqttConnect(bool sessionPresent) + { + String topic = String(mqttClientID) + "/#"; + + mqtt->subscribe(topic.c_str(), 0); + sendToBroker("report/online", (bri ? "true" : "false")); // Reports that the device is online + delay(100); + sendToBroker("report/firmware", versionString); // Reports the firmware version + delay(100); + sendToBroker("report/ip", (char *)WiFi.localIP().toString().c_str()); // Reports the ip + delay(100); + sendToBroker("report/network", (char *)WiFi.SSID().c_str()); // Reports the network name + delay(100); + + String signal(WiFi.RSSI(), 10); + sendToBroker("report/signal", signal.c_str()); // Reports the signal strength + delay(100); + } + + /** + * 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_SMARTNEST; + } +}; diff --git a/usermods/usermod_v2_ping_pong_clock/readme.md b/usermods/usermod_v2_ping_pong_clock/readme.md new file mode 100644 index 00000000..8731222f --- /dev/null +++ b/usermods/usermod_v2_ping_pong_clock/readme.md @@ -0,0 +1,8 @@ +# Ping Pong LED Clock + +This Usermod File contains a modification to use WLED in combination with the Ping Pong Ball LED Clock as built in [Instructables](https://www.instructables.com/Ping-Pong-Ball-LED-Clock/). + +## Installation + +To install this Usermod you instruct PlatformIO to compile the Projekt with the USERMOD_PING_PONG_CLOCK flag. WLED then automatically provides you with various settings in the Usermod Page to configure this Usermod. +Note: If your clock is bigger or smaller then mine, you may have to update the led indices for the indivdual numbers and the base indices. diff --git a/usermods/usermod_v2_ping_pong_clock/usermod_v2_ping_pong_clock.h b/usermods/usermod_v2_ping_pong_clock/usermod_v2_ping_pong_clock.h new file mode 100644 index 00000000..a690c1b1 --- /dev/null +++ b/usermods/usermod_v2_ping_pong_clock/usermod_v2_ping_pong_clock.h @@ -0,0 +1,119 @@ +#pragma once + +#include "wled.h" + +class PingPongClockUsermod : public Usermod +{ +private: + // Private class members. You can declare variables and functions only accessible to your usermod here + unsigned long lastTime = 0; + bool colonOn = true; + + // ---- Variables modified by settings below ----- + // set your config variables to their boot default value (this can also be done in readFromConfig() or a constructor if you prefer) + bool pingPongClockEnabled = true; + int colorR = 0xFF; + int colorG = 0xFF; + int colorB = 0xFF; + + // ---- Variables for correct LED numbering below, edit only if your clock is built different ---- + + int baseH = 43; // Adress for the one place of the hours + int baseHH = 7; // Adress for the tens place of the hours + int baseM = 133; // Adress for the one place of the minutes + int baseMM = 97; // Adress for the tens place of the minutes + int colon1 = 79; // Adress for the first colon led + int colon2 = 80; // Adress for the second colon led + + // Matrix for the illumination of the numbers + // Note: These only define the increments of the base adress. e.g. to define the second Minute you have to add the baseMM to every led position + const int numbers[10][10] = + { + { 0, 1, 4, 6, 13, 15, 18, 19, -1, -1 }, // 0: null + { 13, 14, 15, 18, 19, -1, -1, -1, -1, -1 }, // 1: eins + { 0, 4, 5, 6, 13, 14, 15, 19, -1, -1 }, // 2: zwei + { 4, 5, 6, 13, 14, 15, 18, 19, -1, -1 }, // 3: drei + { 1, 4, 5, 14, 15, 18, 19, -1, -1, -1 }, // 4: vier + { 1, 4, 5, 6, 13, 14, 15, 18, -1, -1 }, // 5: fünf + { 0, 5, 6, 10, 13, 14, 15, 18, -1, -1 }, // 6: sechs + { 4, 6, 9, 13, 14, 19, -1, -1, -1, -1 }, // 7: sieben + { 0, 1, 4, 5, 6, 13, 14, 15, 18, 19 }, // 8: acht + { 1, 4, 5, 6, 9, 13, 14, 19, -1, -1 } // 9: neun + }; + +public: + void setup() + { } + + void loop() + { + if (millis() - lastTime > 1000) + { + lastTime = millis(); + colonOn = !colonOn; + } + } + + void addToJsonInfo(JsonObject& root) + { + JsonObject user = root["u"]; + if (user.isNull()) user = root.createNestedObject("u"); + + JsonArray lightArr = user.createNestedArray("Uhrzeit-Anzeige"); //name + lightArr.add(pingPongClockEnabled ? "aktiv" : "inaktiv"); //value + lightArr.add(""); //unit + } + + void addToConfig(JsonObject &root) + { + JsonObject top = root.createNestedObject("Ping Pong Clock"); + top["enabled"] = pingPongClockEnabled; + top["colorR"] = colorR; + top["colorG"] = colorG; + top["colorB"] = colorB; + } + + bool readFromConfig(JsonObject &root) + { + JsonObject top = root["Ping Pong Clock"]; + + bool configComplete = !top.isNull(); + + configComplete &= getJsonValue(top["enabled"], pingPongClockEnabled); + configComplete &= getJsonValue(top["colorR"], colorR); + configComplete &= getJsonValue(top["colorG"], colorG); + configComplete &= getJsonValue(top["colorB"], colorB); + + return configComplete; + } + + void drawNumber(int base, int number) + { + for(int i = 0; i < 10; i++) + { + if(numbers[number][i] > -1) + strip.setPixelColor(numbers[number][i] + base, RGBW32(colorR, colorG, colorB, 0)); + } + } + + void handleOverlayDraw() + { + if(pingPongClockEnabled){ + if(colonOn) + { + strip.setPixelColor(colon1, RGBW32(colorR, colorG, colorB, 0)); + strip.setPixelColor(colon2, RGBW32(colorR, colorG, colorB, 0)); + } + drawNumber(baseHH, (hour(localTime) / 10) % 10); + drawNumber(baseH, hour(localTime) % 10); + drawNumber(baseM, (minute(localTime) / 10) % 10); + drawNumber(baseMM, minute(localTime) % 10); + } + } + + uint16_t getId() + { + return USERMOD_ID_PING_PONG_CLOCK; + } + +}; diff --git a/usermods/usermod_v2_word_clock/readme.md b/usermods/usermod_v2_word_clock/readme.md index ae87b744..7b81582f 100644 --- a/usermods/usermod_v2_word_clock/readme.md +++ b/usermods/usermod_v2_word_clock/readme.md @@ -8,6 +8,16 @@ active: enable/disable usermod diplayItIs: enable/disable display of "Es ist" on the clock ledOffset: number of LEDs before the wordclock LEDs +### Update for alternatative wiring pattern +Based on this fantastic work I added an alternative wiring pattern. +For original you have to use a long wire to connect DO - DI from first line to the next line. + +I wired my clock in meander style. So the first LED in second line is in the right. +With this problem every second line was inverted and showed the wrong letter. + +I added a switch in usermod called "meander wiring?" to enable/disable alternativ wiring pattern. + + ## Installation Copy and update the example `platformio_override.ini.sample` @@ -24,4 +34,6 @@ No special requirements. ## Change Log -2022/03/30 initial commit \ No newline at end of file +2022/08/18 added meander wiring pattern. + +2022/03/30 initial commit diff --git a/usermods/usermod_v2_word_clock/usermod_v2_word_clock.h b/usermods/usermod_v2_word_clock/usermod_v2_word_clock.h index 87f68f48..1068cd96 100644 --- a/usermods/usermod_v2_word_clock/usermod_v2_word_clock.h +++ b/usermods/usermod_v2_word_clock/usermod_v2_word_clock.h @@ -24,15 +24,19 @@ class WordClockUsermod : public Usermod bool usermodActive = false; bool displayItIs = false; int ledOffset = 100; + bool meander = false; // defines for mask sizes #define maskSizeLeds 114 #define maskSizeMinutes 12 + #define maskSizeMinutesMea 12 #define maskSizeHours 6 + #define maskSizeHoursMea 6 #define maskSizeItIs 5 #define maskSizeMinuteDots 4 // "minute" masks + // Normal wiring const int maskMinutes[12][maskSizeMinutes] = { {107, 108, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // :00 @@ -49,7 +53,25 @@ class WordClockUsermod : public Usermod { 7, 8, 9, 10, 33, 34, 35, -1, -1, -1, -1, -1} // :55 fünf vor }; + // Meander wiring + const int maskMinutesMea[12][maskSizeMinutesMea] = + { + { 99, 100, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // :00 + { 7, 8, 9, 10, 33, 34, 35, 36, -1, -1, -1, -1}, // :05 fünf nach + { 18, 19, 20, 21, 33, 34, 35, 36, -1, -1, -1, -1}, // :10 zehn nach + { 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1}, // :15 viertel + { 11, 12, 13, 14, 15, 16, 17, 33, 34, 35, 36, -1}, // :20 zwanzig nach + { 7, 8, 9, 10, 41, 42, 43, 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, 33, 34, 35, 36, 44, 45, 46, 47}, // :35 fünf nach halb + { 11, 12, 13, 14, 15, 16, 17, 41, 42, 43, -1, -1}, // :40 zwanzig vor + { 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1}, // :45 dreiviertel + { 18, 19, 20, 21, 41, 42, 43, -1, -1, -1, -1, -1}, // :50 zehn vor + { 7, 8, 9, 10, 41, 42, 43, -1, -1, -1, -1, -1} // :55 fünf vor + }; + // hour masks + // Normal wiring const int maskHours[13][maskSizeHours] = { { 55, 56, 57, -1, -1, -1}, // 01: ein @@ -66,6 +88,23 @@ class WordClockUsermod : public Usermod { 49, 50, 51, -1, -1, -1}, // 11: elf { 94, 95, 96, 97, 98, -1} // 12: zwölf and 00: null }; + // Meander wiring + const int maskHoursMea[13][maskSizeHoursMea] = + { + { 63, 64, 65, -1, -1, -1}, // 01: ein + { 62, 63, 64, 65, -1, -1}, // 01: eins + { 55, 56, 57, 58, -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 + { 83, 84, 85, 86, 87, -1}, // 06: sechs + { 88, 89, 90, 91, 92, 93}, // 07: sieben + { 77, 78, 79, 80, -1, -1}, // 08: acht + {103, 104, 105, 106, -1, -1}, // 09: neun + {106, 107, 108, 109, -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}; @@ -128,14 +167,24 @@ class WordClockUsermod : public Usermod } // update led mask + if (meander) + { + updateLedMask(maskHoursMea[index], maskSizeHoursMea); + } else { updateLedMask(maskHours[index], maskSizeHours); + } } // set minutes void setMinutes(int index) { // update led mask + if (meander) + { + updateLedMask(maskMinutesMea[index], maskSizeMinutesMea); + } else { updateLedMask(maskMinutes[index], maskSizeMinutes); + } } // set minutes dot @@ -360,6 +409,7 @@ class WordClockUsermod : public Usermod top["active"] = usermodActive; top["displayItIs"] = displayItIs; top["ledOffset"] = ledOffset; + top["Meander wiring?"] = meander; } /* @@ -389,6 +439,7 @@ class WordClockUsermod : public Usermod configComplete &= getJsonValue(top["active"], usermodActive); configComplete &= getJsonValue(top["displayItIs"], displayItIs); configComplete &= getJsonValue(top["ledOffset"], ledOffset); + configComplete &= getJsonValue(top["Meander wiring?"], meander); return configComplete; } diff --git a/wled00/button.cpp b/wled00/button.cpp index b251a0c4..b34e3c38 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -300,6 +300,29 @@ void handleButton() if (analog) lastRead = now; } +// If enabled, RMT idle level is set to HIGH when off +// to prevent leakage current when using an N-channel MOSFET to toggle LED power +#ifdef ESP32_DATA_IDLE_HIGH +void esp32RMTInvertIdle() +{ + bool idle_out; + for (uint8_t u = 0; u < busses.getNumBusses(); u++) + { + if (u > 7) return; // only 8 RMT channels, TODO: ESP32 variants have less RMT channels + Bus *bus = busses.getBus(u); + if (!bus || bus->getLength()==0 || !IS_DIGITAL(bus->getType()) || IS_2PIN(bus->getType())) continue; + //assumes that bus number to rmt channel mapping stays 1:1 + rmt_channel_t ch = static_cast(u); + rmt_idle_level_t lvl; + rmt_get_idle_level(ch, &idle_out, &lvl); + if (lvl == RMT_IDLE_LEVEL_HIGH) lvl = RMT_IDLE_LEVEL_LOW; + else if (lvl == RMT_IDLE_LEVEL_LOW) lvl = RMT_IDLE_LEVEL_HIGH; + else continue; + rmt_set_idle_level(ch, idle_out, lvl); + } +} +#endif + void handleIO() { handleButton(); @@ -310,6 +333,9 @@ void handleIO() lastOnTime = millis(); if (offMode) { + #ifdef ESP32_DATA_IDLE_HIGH + esp32RMTInvertIdle(); + #endif if (rlyPin>=0) { pinMode(rlyPin, OUTPUT); digitalWrite(rlyPin, rlyMde); @@ -328,6 +354,9 @@ void handleIO() digitalWrite(LED_BUILTIN, HIGH); } #endif + #ifdef ESP32_DATA_IDLE_HIGH + esp32RMTInvertIdle(); + #endif if (rlyPin>=0) { pinMode(rlyPin, OUTPUT); digitalWrite(rlyPin, !rlyMde); diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 271ded17..0f857539 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -359,8 +359,9 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(notifyAlexa, if_sync_send["va"]); CJSON(notifyHue, if_sync_send["hue"]); CJSON(notifyMacro, if_sync_send["macro"]); - CJSON(notifyTwice, if_sync_send[F("twice")]); CJSON(syncGroups, if_sync_send["grp"]); + if (if_sync_send[F("twice")]) udpNumRetries = 1; // import setting from 0.13 and earlier + CJSON(udpNumRetries, if_sync_send["ret"]); JsonObject if_nodes = interfaces["nodes"]; CJSON(nodeListEnabled, if_nodes[F("list")]); @@ -807,8 +808,8 @@ void serializeConfig() { if_sync_send["va"] = notifyAlexa; if_sync_send["hue"] = notifyHue; if_sync_send["macro"] = notifyMacro; - if_sync_send[F("twice")] = notifyTwice; if_sync_send["grp"] = syncGroups; + if_sync_send["ret"] = udpNumRetries; JsonObject if_nodes = interfaces.createNestedObject("nodes"); if_nodes[F("list")] = nodeListEnabled; diff --git a/wled00/const.h b/wled00/const.h index 0c3905cf..6ffa0d5f 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -91,7 +91,11 @@ #define USERMOD_ID_MY9291 28 //Usermod "usermod_MY9291.h" #define USERMOD_ID_SI7021_MQTT_HA 29 //Usermod "usermod_si7021_mqtt_ha.h" #define USERMOD_ID_BME280 30 //Usermod "usermod_bme280.h -#define USERMOD_ID_AUDIOREACTIVE 31 //Usermod "audioreactive.h" +#define USERMOD_ID_SMARTNEST 31 //Usermod "usermod_smartnest.h" +#define USERMOD_ID_AUDIOREACTIVE 32 //Usermod "audioreactive.h" +#define USERMOD_ID_ANALOG_CLOCK 33 //Usermod "Analog_Clock.h" +#define USERMOD_ID_PING_PONG_CLOCK 34 //Usermod "usermod_v2_ping_pong_clock.h" +#define USERMOD_ID_ADS1115 35 //Usermod "usermod_ads1115.h" //Access point behavior #define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot @@ -215,7 +219,7 @@ #define BTN_TYPE_ANALOG_INVERTED 8 //Ethernet board types -#define WLED_NUM_ETH_TYPES 8 +#define WLED_NUM_ETH_TYPES 9 #define WLED_ETH_NONE 0 #define WLED_ETH_WT32_ETH01 1 diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index 0e59c248..e10c4037 100644 --- a/wled00/data/settings_sync.htm +++ b/wled00/data/settings_sync.htm @@ -127,7 +127,7 @@ Send notifications on button press or IR:
Send Alexa notifications:
Send Philips Hue change notifications:
Send Macro notifications:
-Send notifications twice:
+UDP packet retransmissions:

Reboot required to apply changes.

Instance List

Enable instance list:
diff --git a/wled00/data/settings_time.htm b/wled00/data/settings_time.htm index a3a72954..d6d7a052 100644 --- a/wled00/data/settings_time.htm +++ b/wled00/data/settings_time.htm @@ -182,6 +182,7 @@ +
UTC offset: seconds (max. 18 hours)
Current local time is unknown.
diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index 4b9fc652..91b612e6 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -94,6 +94,7 @@ + diff --git a/wled00/html_settings.h b/wled00/html_settings.h index 833b6871..01fbb783 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -132,106 +132,106 @@ const uint8_t PAGE_settings[] PROGMEM = { // Autogenerated from wled00/data/settings_wifi.htm, do not edit!! -const uint16_t PAGE_settings_wifi_length = 1557; +const uint16_t PAGE_settings_wifi_length = 1563; const uint8_t PAGE_settings_wifi[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x57, 0xff, 0x4f, 0xdb, 0x38, - 0x14, 0xff, 0x3d, 0x7f, 0x85, 0xf1, 0x49, 0x53, 0xa3, 0x85, 0x94, 0xb6, 0xc7, 0x6e, 0x62, 0x49, - 0x76, 0x5d, 0xdb, 0x0d, 0xee, 0x18, 0xeb, 0x29, 0x68, 0xe8, 0xa4, 0x93, 0x26, 0x37, 0x79, 0x6d, - 0x3d, 0x9c, 0x38, 0x17, 0x3b, 0x2d, 0x88, 0xf1, 0xbf, 0xdf, 0xb3, 0x93, 0x96, 0x16, 0xe8, 0x36, - 0x71, 0x08, 0x01, 0xb5, 0xfd, 0xde, 0xe7, 0x7d, 0xfb, 0xf8, 0xf9, 0x35, 0xd8, 0x1b, 0x7e, 0x1a, - 0x9c, 0xff, 0x3d, 0x1e, 0x91, 0xb9, 0xce, 0x44, 0x14, 0x98, 0xbf, 0x44, 0xb0, 0x7c, 0x16, 0x52, - 0xc8, 0x29, 0xae, 0x81, 0xa5, 0x51, 0x90, 0x81, 0x66, 0x24, 0x99, 0xb3, 0x52, 0x81, 0x0e, 0x69, - 0xa5, 0xa7, 0xfb, 0xaf, 0x69, 0xb3, 0xeb, 0xe4, 0x2c, 0x83, 0x90, 0x2e, 0x38, 0x2c, 0x0b, 0x59, - 0x6a, 0x4a, 0x12, 0x99, 0x6b, 0xc8, 0x51, 0x6c, 0xc9, 0x53, 0x3d, 0x0f, 0x0f, 0x0f, 0x0e, 0xd6, - 0xa2, 0xf7, 0x8e, 0x52, 0x58, 0xf0, 0x04, 0xf6, 0xed, 0xc2, 0xe3, 0x39, 0xd7, 0x9c, 0x89, 0x7d, - 0x95, 0x30, 0x01, 0x61, 0xc7, 0xcb, 0xd8, 0x15, 0xcf, 0xaa, 0x6c, 0xbd, 0xae, 0x14, 0x94, 0x76, - 0xc1, 0x26, 0xb8, 0xce, 0x25, 0x7d, 0x60, 0x39, 0x0a, 0x34, 0xd7, 0x02, 0xa2, 0x0b, 0xfe, 0x9e, - 0x93, 0x18, 0xb4, 0xe6, 0xf9, 0x4c, 0x05, 0xed, 0x7a, 0x33, 0x50, 0x49, 0xc9, 0x0b, 0x1d, 0x39, - 0x0b, 0x56, 0x12, 0x21, 0x13, 0x5e, 0x78, 0x69, 0x98, 0xca, 0xa4, 0xca, 0xd0, 0x21, 0x0f, 0x37, - 0xc2, 0xbd, 0xce, 0x9b, 0x69, 0x95, 0x27, 0x9a, 0xcb, 0x9c, 0x1c, 0xb7, 0xdc, 0x9b, 0x25, 0xcf, - 0x53, 0xb9, 0xf4, 0x65, 0x01, 0x79, 0x8b, 0xce, 0xb5, 0x2e, 0xd4, 0x51, 0xbb, 0x7d, 0x99, 0x4b, - 0x7f, 0x29, 0x20, 0xf5, 0x67, 0xd0, 0x9e, 0x02, 0xd3, 0x55, 0x09, 0xaa, 0xad, 0x1a, 0x5b, 0xed, - 0x5f, 0x96, 0x7c, 0xca, 0xf7, 0x57, 0x4b, 0xea, 0xde, 0xae, 0x01, 0xdf, 0xdd, 0x07, 0x5c, 0x2b, - 0x51, 0x8f, 0x7e, 0x51, 0x20, 0xa6, 0x9b, 0xd2, 0x42, 0xb2, 0xf4, 0x8f, 0xb8, 0xa5, 0x3d, 0x08, - 0xf7, 0x0e, 0xdc, 0x1b, 0x01, 0x9a, 0xc8, 0x30, 0xf5, 0x93, 0x12, 0x2d, 0xc2, 0x48, 0x80, 0xf1, - 0xb9, 0x45, 0xeb, 0x88, 0xa8, 0xfb, 0x46, 0xfa, 0x08, 0xd6, 0xd7, 0xba, 0xe4, 0x93, 0x4a, 0x03, - 0x1e, 0x94, 0x09, 0xf5, 0xb4, 0xeb, 0xdd, 0xdf, 0xd7, 0xd7, 0x05, 0xa0, 0x39, 0x0d, 0x57, 0xba, - 0xfd, 0x95, 0x2d, 0xd8, 0x0a, 0xe0, 0x81, 0x20, 0x53, 0xd7, 0x39, 0x42, 0x80, 0xeb, 0xa5, 0xfe, - 0x44, 0xa6, 0xd7, 0x3e, 0x2b, 0xd0, 0xe9, 0x74, 0x30, 0xe7, 0x22, 0x6d, 0x49, 0x23, 0xcf, 0xd2, - 0x74, 0xb4, 0x40, 0x2f, 0x4e, 0xb9, 0xc2, 0x8a, 0x42, 0xd9, 0xa2, 0xc6, 0x67, 0xea, 0xb5, 0xdc, - 0x30, 0xba, 0xf9, 0x00, 0xfa, 0x73, 0xcb, 0xbd, 0x7d, 0x5c, 0x0e, 0xca, 0x52, 0x96, 0xe8, 0x1e, - 0xca, 0x21, 0x1d, 0x94, 0x14, 0xe0, 0x0b, 0x39, 0x6b, 0xd1, 0x91, 0xd9, 0x27, 0x4d, 0xf0, 0x98, - 0x18, 0x32, 0xe5, 0x02, 0x6c, 0x18, 0x58, 0xff, 0x12, 0xc3, 0x3d, 0x6d, 0xf6, 0xe5, 0xd4, 0x50, - 0x6c, 0xca, 0x67, 0x55, 0xc9, 0x6c, 0xb6, 0xea, 0x30, 0xc8, 0x94, 0x71, 0x53, 0x98, 0x7f, 0xf2, - 0x93, 0x3c, 0x91, 0x59, 0x81, 0x49, 0x03, 0x52, 0xb0, 0x19, 0x90, 0x94, 0x69, 0xb6, 0x87, 0xe9, - 0xdd, 0x48, 0x70, 0x8c, 0xe5, 0xa0, 0xc6, 0xc0, 0x11, 0x0d, 0xc3, 0xa6, 0x2e, 0xc8, 0x01, 0x8b, - 0xe7, 0x17, 0xa5, 0xd4, 0x32, 0x91, 0xe2, 0xc5, 0x8b, 0x96, 0xe5, 0xc5, 0x81, 0xd7, 0xb2, 0x84, - 0x09, 0x8d, 0x84, 0x88, 0xb5, 0x2c, 0x11, 0x15, 0x09, 0xa0, 0x4f, 0x34, 0x64, 0x26, 0xf0, 0xe4, - 0xa4, 0xa0, 0xae, 0xfb, 0xed, 0x5b, 0x23, 0x86, 0xfa, 0x59, 0x81, 0x0e, 0xbf, 0x47, 0x7c, 0xf2, - 0x51, 0xa6, 0xe0, 0x93, 0xb1, 0x00, 0xa6, 0x80, 0x60, 0x22, 0xa0, 0x24, 0x17, 0xa7, 0xa3, 0x21, - 0x39, 0x19, 0xa3, 0x4b, 0xde, 0x16, 0xa2, 0xda, 0x46, 0xf4, 0x2c, 0x9a, 0xeb, 0x1a, 0x29, 0x4b, - 0x07, 0x03, 0xff, 0xd6, 0x32, 0x11, 0x89, 0x48, 0x5f, 0xda, 0xe3, 0x23, 0x4a, 0xdd, 0x97, 0x77, - 0x64, 0x6a, 0x2b, 0xff, 0xab, 0x7a, 0x5b, 0x84, 0x1d, 0xea, 0xed, 0x75, 0xdc, 0x5b, 0x27, 0x68, - 0x37, 0xb4, 0x0f, 0x94, 0xbe, 0xc6, 0x5b, 0xf0, 0x3b, 0xcf, 0xcc, 0x55, 0x21, 0x55, 0x29, 0x90, - 0x26, 0x66, 0xcb, 0x4f, 0x14, 0x12, 0xf5, 0x0d, 0x0a, 0x5a, 0x81, 0xa0, 0x5d, 0x5f, 0x78, 0x53, - 0x75, 0x2c, 0x86, 0xb1, 0x1c, 0x52, 0xcc, 0x16, 0x5e, 0xae, 0xa9, 0x2c, 0x33, 0x87, 0x70, 0x5c, - 0x9b, 0x4f, 0x5f, 0x14, 0x25, 0xf5, 0xfd, 0x8b, 0xa7, 0x94, 0xe0, 0xf5, 0x9e, 0x4b, 0x3c, 0x29, - 0xa4, 0x32, 0xf7, 0x30, 0xe5, 0x0b, 0x92, 0x08, 0xa6, 0x54, 0x48, 0xb5, 0xc4, 0x74, 0x2c, 0xb7, - 0xf7, 0xe6, 0x20, 0x8a, 0x77, 0x34, 0x72, 0x02, 0x64, 0x9b, 0xc6, 0x6a, 0x18, 0x5e, 0x86, 0xb4, - 0x5e, 0x50, 0xb4, 0x9a, 0x08, 0x9e, 0x5c, 0x86, 0xf4, 0xd8, 0x98, 0x7d, 0x1b, 0xb4, 0xeb, 0x03, - 0x74, 0x0d, 0x21, 0xa2, 0xc7, 0x75, 0x9c, 0xb5, 0xd2, 0x3b, 0xa3, 0xf4, 0x8e, 0x25, 0x97, 0x77, - 0x7a, 0x5b, 0x1a, 0xaa, 0x9a, 0x64, 0x1c, 0x7d, 0x8c, 0xd9, 0x02, 0xc8, 0x0b, 0x32, 0x90, 0x79, - 0x0e, 0x89, 0xbe, 0x13, 0x9e, 0x97, 0xe8, 0x57, 0x6d, 0x69, 0xde, 0xad, 0x5b, 0x09, 0x26, 0xb7, - 0x2a, 0x30, 0x31, 0x5d, 0xdc, 0xea, 0x45, 0x8d, 0x06, 0xd1, 0x92, 0xc0, 0x15, 0xb2, 0xda, 0x50, - 0x32, 0x07, 0xbd, 0x94, 0x25, 0x9a, 0xc4, 0x73, 0xe7, 0xac, 0x5e, 0xd8, 0xec, 0x90, 0x56, 0x1c, - 0x9f, 0x0c, 0x3d, 0x02, 0x48, 0x88, 0x6b, 0xa3, 0x92, 0x4b, 0x6d, 0xd8, 0x6b, 0x10, 0xdc, 0xa3, - 0x60, 0x52, 0x46, 0x01, 0xcf, 0x8b, 0x4a, 0x37, 0xce, 0x99, 0x9b, 0xb9, 0x4a, 0xeb, 0x20, 0xc6, - 0xb0, 0xb0, 0x09, 0x0a, 0xc8, 0x67, 0xd8, 0x2b, 0x69, 0xaf, 0x8b, 0x49, 0x44, 0x85, 0x15, 0x7c, - 0x81, 0xa9, 0xc4, 0x0f, 0xe9, 0x43, 0x94, 0xd5, 0xc9, 0x1a, 0x69, 0xbc, 0x8d, 0xf4, 0xaa, 0x57, - 0x23, 0xc5, 0x1a, 0xf9, 0x9e, 0x20, 0x13, 0x49, 0x0b, 0xe9, 0x89, 0xe9, 0x60, 0x9a, 0x1c, 0xf8, - 0xf6, 0x87, 0x60, 0x89, 0xc9, 0xf0, 0x78, 0x30, 0xde, 0x72, 0xb2, 0x86, 0x3b, 0x39, 0x40, 0xb8, - 0xda, 0x52, 0x5e, 0x65, 0x13, 0x28, 0xe9, 0xaa, 0xae, 0x48, 0x89, 0x8c, 0xe7, 0x21, 0x45, 0x01, - 0x34, 0x17, 0xd2, 0xee, 0xe1, 0x21, 0x25, 0x25, 0xfc, 0x5b, 0xf1, 0x12, 0xd2, 0x88, 0xf8, 0x64, - 0x1b, 0xa7, 0xf3, 0x4c, 0x38, 0xdd, 0x67, 0xc2, 0xe9, 0x3d, 0x0d, 0x67, 0x23, 0x95, 0x33, 0x6c, - 0xcf, 0x4b, 0x76, 0xbd, 0x91, 0x33, 0xa7, 0x01, 0xff, 0x80, 0xba, 0xff, 0xcb, 0xc7, 0xe6, 0xb1, - 0xfb, 0xd0, 0x79, 0x26, 0x9c, 0xee, 0x33, 0xe1, 0xf4, 0x9e, 0x84, 0x63, 0x12, 0xe4, 0x34, 0x49, - 0xc3, 0x1b, 0x89, 0xf7, 0x07, 0xa5, 0xd4, 0xe5, 0x43, 0xb2, 0xc5, 0x3f, 0x91, 0x37, 0xe7, 0x27, - 0x8a, 0x1b, 0x77, 0x9e, 0x09, 0xa7, 0xfb, 0x4c, 0x38, 0xbd, 0xa7, 0xe1, 0x98, 0x04, 0x65, 0xc3, - 0xb3, 0x98, 0xe0, 0xc3, 0x8a, 0xa3, 0x87, 0x5a, 0x5d, 0xdd, 0xba, 0xc1, 0x98, 0x5b, 0x9b, 0x4b, - 0x62, 0x04, 0xea, 0x8b, 0xdb, 0x3c, 0x16, 0x64, 0x45, 0xc6, 0x47, 0xda, 0xcc, 0x47, 0x5b, 0xa0, - 0xcd, 0x2e, 0x43, 0xec, 0x53, 0x28, 0x8c, 0xfe, 0x40, 0x70, 0x7c, 0xb3, 0xb0, 0x45, 0x1c, 0x91, - 0x40, 0x15, 0x2c, 0x5f, 0x7b, 0xc9, 0x0b, 0xec, 0xdf, 0x67, 0x77, 0xcd, 0x0c, 0x52, 0x7c, 0x41, - 0x50, 0xc0, 0x3a, 0xd8, 0xb4, 0x49, 0xfb, 0x44, 0x03, 0xe9, 0x27, 0x89, 0x71, 0x74, 0x2c, 0x79, - 0xae, 0xeb, 0x0e, 0xd9, 0x1f, 0x13, 0xd3, 0x16, 0x1f, 0xf5, 0xbd, 0x3f, 0xfe, 0x41, 0x5f, 0xec, - 0xc7, 0x0f, 0x1c, 0x76, 0x8c, 0xc2, 0x31, 0x4f, 0xd1, 0xd6, 0xd8, 0x4a, 0x1d, 0x91, 0x2d, 0xf5, - 0x64, 0x0e, 0xc9, 0xe5, 0x44, 0x5e, 0xad, 0x21, 0x8e, 0xeb, 0x06, 0x68, 0x1c, 0x59, 0x35, 0xcb, - 0x87, 0xce, 0x98, 0x39, 0xcd, 0xfd, 0x71, 0x77, 0xed, 0x3f, 0xec, 0xae, 0x08, 0xaa, 0xf1, 0xa1, - 0xc7, 0x2a, 0xb6, 0xfc, 0x9b, 0xd7, 0xde, 0xab, 0xde, 0xad, 0xfb, 0x0d, 0x9f, 0x25, 0x62, 0x27, - 0xd1, 0x90, 0x8e, 0xac, 0x09, 0xb4, 0x80, 0x85, 0xf6, 0xc9, 0x6b, 0x3b, 0x57, 0x33, 0x4c, 0x61, - 0xa9, 0x56, 0x6e, 0x6d, 0x64, 0x8c, 0xd8, 0x27, 0x08, 0x45, 0x30, 0xcd, 0xe2, 0x68, 0x9b, 0x44, - 0xfd, 0xc1, 0x0e, 0x12, 0x5d, 0xad, 0x58, 0xd4, 0x59, 0xb1, 0xa8, 0xd3, 0xbb, 0x47, 0x22, 0x0c, - 0xdd, 0x04, 0xa8, 0x4c, 0x61, 0x41, 0x98, 0x07, 0xad, 0xc1, 0xc4, 0x87, 0x39, 0x90, 0x85, 0x9d, - 0x92, 0x16, 0x4c, 0x54, 0x60, 0xa8, 0x68, 0x4a, 0xbd, 0xaa, 0xb4, 0x39, 0x60, 0x53, 0x33, 0xc7, - 0x4c, 0xa4, 0xc4, 0x82, 0xd6, 0xb2, 0xf7, 0x75, 0x3a, 0x34, 0x1a, 0x72, 0xb5, 0x41, 0x8e, 0x7b, - 0x62, 0x4e, 0x23, 0x87, 0xd5, 0xeb, 0x0b, 0x6c, 0x99, 0x6a, 0x17, 0x10, 0xbe, 0x55, 0x67, 0xb0, - 0x40, 0x6b, 0x2d, 0xf3, 0x74, 0x96, 0x80, 0xa3, 0x1d, 0x4e, 0xbf, 0x29, 0xa4, 0xee, 0x5a, 0xc3, - 0x4c, 0x39, 0x36, 0x84, 0x55, 0x60, 0x8f, 0xd3, 0xd5, 0xb0, 0x15, 0xd3, 0xcc, 0x17, 0x70, 0x8f, - 0xaa, 0xa3, 0xab, 0x02, 0x4a, 0x6e, 0x66, 0x6a, 0x24, 0xbd, 0x25, 0x28, 0xba, 0x6e, 0xbe, 0x65, - 0xd4, 0xb9, 0x57, 0x02, 0xa0, 0xf8, 0x01, 0xa3, 0x2e, 0xe2, 0xba, 0x74, 0x01, 0x8f, 0x9c, 0x01, - 0xda, 0x35, 0x13, 0x0e, 0x59, 0x72, 0x3d, 0x5f, 0x67, 0x6d, 0xc1, 0xb1, 0xe6, 0x5c, 0xa9, 0x0a, - 0x94, 0x6f, 0x8b, 0x3c, 0xac, 0x87, 0x01, 0xc8, 0xad, 0x25, 0x3e, 0xad, 0x8d, 0x71, 0x45, 0xcc, - 0xeb, 0x6e, 0x86, 0x8a, 0x44, 0x96, 0x18, 0xae, 0x16, 0xd7, 0x1e, 0xe1, 0xb9, 0x19, 0xfd, 0x15, - 0x28, 0x52, 0xc8, 0x25, 0xe6, 0xc2, 0x0c, 0xce, 0x55, 0x66, 0xa3, 0xf7, 0x83, 0x36, 0xb7, 0xc3, - 0x55, 0x3d, 0x9a, 0xe1, 0x1c, 0x96, 0xd2, 0x3a, 0x2a, 0x3d, 0x47, 0x0a, 0x62, 0x63, 0x3d, 0x47, - 0x8f, 0x6d, 0x58, 0xdb, 0x85, 0x1e, 0x9d, 0x1f, 0x3f, 0x56, 0xe9, 0x33, 0x99, 0x83, 0xb3, 0xab, - 0x18, 0x58, 0xad, 0x51, 0x3c, 0xee, 0x75, 0xf7, 0xc7, 0x9f, 0x46, 0xbb, 0x64, 0x5e, 0x35, 0x32, - 0x43, 0xa8, 0xae, 0x76, 0x02, 0xfd, 0x46, 0xa3, 0x3f, 0x4f, 0xce, 0xf7, 0x3f, 0xef, 0x44, 0xf9, - 0x95, 0x46, 0x7f, 0x55, 0x3c, 0xc7, 0x49, 0x79, 0xdf, 0xa2, 0xed, 0x44, 0x3a, 0xa4, 0xd1, 0xf9, - 0x92, 0x0b, 0x3e, 0x9b, 0xeb, 0x53, 0xbc, 0x95, 0xb5, 0xf4, 0x77, 0xc8, 0x74, 0xf1, 0x7d, 0x38, - 0xe4, 0xed, 0xc5, 0x39, 0x06, 0x88, 0xd9, 0x39, 0xe8, 0xdc, 0x09, 0x6d, 0x12, 0xcc, 0xfe, 0x36, - 0x13, 0x62, 0xb9, 0x9a, 0x2e, 0x9d, 0x5d, 0x43, 0xec, 0xd3, 0xe6, 0x51, 0x67, 0x63, 0xea, 0x35, - 0xd3, 0x36, 0xfe, 0x33, 0x13, 0xb9, 0x19, 0xcf, 0xcd, 0xb7, 0xf4, 0xff, 0x00, 0x19, 0x0d, 0xc5, - 0x95, 0xb5, 0x0f, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x57, 0xe1, 0x6e, 0xdb, 0x36, + 0x10, 0xfe, 0xef, 0xa7, 0x60, 0x38, 0xa0, 0xb0, 0x50, 0x59, 0x8e, 0xed, 0xa5, 0x2b, 0x52, 0xc9, + 0x5d, 0x62, 0xbb, 0x4d, 0xb6, 0x34, 0xf5, 0xa0, 0xa0, 0xc1, 0x80, 0x01, 0x05, 0x2d, 0x9d, 0x6d, + 0x2e, 0x14, 0xa9, 0x89, 0x94, 0x9d, 0x20, 0xcd, 0xbb, 0xef, 0x48, 0xc9, 0x8e, 0x9d, 0xc4, 0x6d, + 0xd1, 0x65, 0x08, 0x1c, 0x98, 0xe4, 0xdd, 0x77, 0xc7, 0xbb, 0xef, 0x8e, 0xe7, 0x70, 0x6f, 0xf8, + 0x71, 0x70, 0xf1, 0xe7, 0x78, 0x44, 0xe6, 0x26, 0x13, 0xfd, 0xd0, 0xfe, 0x27, 0x82, 0xc9, 0x59, + 0x44, 0x41, 0x52, 0x5c, 0x03, 0x4b, 0xfb, 0x61, 0x06, 0x86, 0x91, 0x64, 0xce, 0x0a, 0x0d, 0x26, + 0xa2, 0xa5, 0x99, 0xb6, 0x5e, 0xd3, 0x7a, 0xb7, 0x21, 0x59, 0x06, 0x11, 0x5d, 0x70, 0x58, 0xe6, + 0xaa, 0x30, 0x94, 0x24, 0x4a, 0x1a, 0x90, 0x28, 0xb6, 0xe4, 0xa9, 0x99, 0x47, 0x07, 0xfb, 0xfb, + 0x6b, 0xd1, 0x07, 0x47, 0x29, 0x2c, 0x78, 0x02, 0x2d, 0xb7, 0xf0, 0xb9, 0xe4, 0x86, 0x33, 0xd1, + 0xd2, 0x09, 0x13, 0x10, 0x75, 0xfc, 0x8c, 0x5d, 0xf3, 0xac, 0xcc, 0xd6, 0xeb, 0x52, 0x43, 0xe1, + 0x16, 0x6c, 0x82, 0x6b, 0xa9, 0xe8, 0x23, 0xcb, 0xfd, 0xd0, 0x70, 0x23, 0xa0, 0x7f, 0xc9, 0xdf, + 0x71, 0x12, 0x83, 0x31, 0x5c, 0xce, 0x74, 0xd8, 0xae, 0x36, 0x43, 0x9d, 0x14, 0x3c, 0x37, 0xfd, + 0xc6, 0x82, 0x15, 0x44, 0xa8, 0x84, 0xe7, 0x7e, 0x1a, 0xa5, 0x2a, 0x29, 0x33, 0x74, 0xc8, 0xc7, + 0x8d, 0x68, 0xaf, 0xf3, 0x66, 0x5a, 0xca, 0xc4, 0x70, 0x25, 0xc9, 0x49, 0xd3, 0xbb, 0x5d, 0x72, + 0x99, 0xaa, 0x65, 0xa0, 0x72, 0x90, 0x4d, 0x3a, 0x37, 0x26, 0xd7, 0x87, 0xed, 0xf6, 0x95, 0x54, + 0xc1, 0x52, 0x40, 0x1a, 0xcc, 0xa0, 0x3d, 0x05, 0x66, 0xca, 0x02, 0x74, 0x5b, 0xd7, 0xb6, 0xda, + 0x3f, 0x2d, 0xf9, 0x94, 0xb7, 0x56, 0x4b, 0xea, 0xdd, 0xad, 0x01, 0x8f, 0x1f, 0x02, 0xae, 0x95, + 0xa8, 0x4f, 0x3f, 0x6b, 0x10, 0xd3, 0x4d, 0x69, 0xa1, 0x58, 0xfa, 0x5b, 0xdc, 0x34, 0x3e, 0x44, + 0x7b, 0xfb, 0xde, 0xad, 0x00, 0x43, 0x54, 0x94, 0x06, 0x49, 0x81, 0x16, 0x61, 0x24, 0xc0, 0xfa, + 0xdc, 0xa4, 0xd5, 0x8d, 0xa8, 0xf7, 0x46, 0x05, 0x08, 0x76, 0x64, 0x4c, 0xc1, 0x27, 0xa5, 0x01, + 0x3c, 0x28, 0x12, 0xea, 0x1b, 0xcf, 0x7f, 0xb8, 0x6f, 0x6e, 0x72, 0x40, 0x73, 0x06, 0xae, 0x4d, + 0xfb, 0x6f, 0xb6, 0x60, 0x2b, 0x80, 0x47, 0x82, 0x4c, 0xdf, 0x48, 0x84, 0x00, 0xcf, 0x4f, 0x83, + 0x89, 0x4a, 0x6f, 0x02, 0x96, 0xa3, 0xd3, 0xe9, 0x60, 0xce, 0x45, 0xda, 0x54, 0x56, 0x9e, 0xa5, + 0xe9, 0x68, 0x81, 0x5e, 0x9c, 0x71, 0x8d, 0x19, 0x85, 0xa2, 0x49, 0xad, 0xcf, 0xd4, 0x6f, 0x7a, + 0x51, 0xff, 0xf6, 0x3d, 0x98, 0x4f, 0x4d, 0xef, 0xee, 0x69, 0x39, 0x28, 0x0a, 0x55, 0xa0, 0x7b, + 0x28, 0x87, 0x74, 0xd0, 0x4a, 0x40, 0x20, 0xd4, 0xac, 0x49, 0x47, 0x76, 0x9f, 0xd4, 0x97, 0xc7, + 0xc0, 0x90, 0x29, 0x17, 0xe0, 0xae, 0x81, 0xf9, 0x2f, 0xf0, 0xba, 0x67, 0xf5, 0xbe, 0x9a, 0x5a, + 0x8a, 0x4d, 0xf9, 0xac, 0x2c, 0x98, 0x8b, 0x56, 0x75, 0x0d, 0x32, 0x65, 0xdc, 0x26, 0xe6, 0x2f, + 0x79, 0x2a, 0x13, 0x95, 0xe5, 0x18, 0x34, 0x20, 0x39, 0x9b, 0x01, 0x49, 0x99, 0x61, 0x7b, 0x18, + 0xde, 0x8d, 0x00, 0xc7, 0x98, 0x0e, 0x6a, 0x0d, 0x1c, 0xd2, 0x28, 0xaa, 0xf3, 0x82, 0x1c, 0x70, + 0x78, 0x41, 0x5e, 0x28, 0xa3, 0x12, 0x25, 0x5e, 0xbc, 0x68, 0x3a, 0x5e, 0xec, 0xfb, 0x4d, 0x47, + 0x98, 0xc8, 0x4a, 0x88, 0xd8, 0xa8, 0x02, 0x51, 0x91, 0x00, 0xe6, 0xd4, 0x40, 0x66, 0x2f, 0x9e, + 0x9c, 0xe6, 0xd4, 0xf3, 0xbe, 0x7c, 0xa9, 0xc5, 0x50, 0x3f, 0xcb, 0xd1, 0xe1, 0x77, 0x88, 0x4f, + 0x3e, 0xa8, 0x14, 0x02, 0x32, 0x16, 0xc0, 0x34, 0x10, 0x0c, 0x04, 0x14, 0xe4, 0xf2, 0x6c, 0x34, + 0x24, 0xa7, 0x63, 0x74, 0xc9, 0xdf, 0x42, 0xd4, 0xdb, 0x88, 0xbe, 0x43, 0xf3, 0x3c, 0x2b, 0xe5, + 0xe8, 0x60, 0xe1, 0xdf, 0x3a, 0x26, 0x22, 0x11, 0xe9, 0x4b, 0x77, 0x7c, 0x48, 0xa9, 0xf7, 0xf2, + 0x9e, 0x4c, 0x6d, 0x1d, 0xfc, 0xad, 0xdf, 0xe6, 0x51, 0x87, 0xfa, 0x7b, 0x1d, 0xef, 0xae, 0x11, + 0xb6, 0x6b, 0xda, 0x87, 0xda, 0xdc, 0x60, 0x15, 0xfc, 0xca, 0x33, 0x5b, 0x2a, 0xa4, 0x2c, 0x04, + 0xd2, 0xc4, 0x6e, 0x05, 0x89, 0x46, 0xa2, 0xbe, 0x41, 0x41, 0x27, 0x10, 0xb6, 0xab, 0x82, 0xb7, + 0x59, 0xc7, 0x64, 0x58, 0xcb, 0x11, 0xc5, 0x68, 0x61, 0x71, 0x4d, 0x55, 0x91, 0x35, 0x08, 0xc7, + 0xb5, 0xfd, 0xf6, 0x59, 0x53, 0x52, 0xd5, 0x5f, 0x3c, 0xa5, 0x04, 0xcb, 0x7b, 0xae, 0xf0, 0x24, + 0x57, 0xda, 0xd6, 0x61, 0xca, 0x17, 0x24, 0x11, 0x4c, 0xeb, 0x88, 0x1a, 0x85, 0xe1, 0x58, 0x6e, + 0xef, 0xcd, 0x41, 0xe4, 0xc7, 0xb4, 0xdf, 0x08, 0x91, 0x6d, 0x06, 0xb3, 0x61, 0x79, 0x19, 0xd1, + 0x6a, 0x41, 0xd1, 0x6a, 0x22, 0x78, 0x72, 0x15, 0xd1, 0x13, 0x6b, 0xf6, 0x6d, 0xd8, 0xae, 0x0e, + 0xd0, 0x35, 0x84, 0xe8, 0x3f, 0xad, 0xd3, 0x58, 0x2b, 0x1d, 0x5b, 0xa5, 0x63, 0x96, 0x5c, 0xdd, + 0xeb, 0x6d, 0x69, 0xe8, 0x72, 0x92, 0x71, 0xf4, 0x31, 0x66, 0x0b, 0x20, 0x2f, 0xc8, 0x40, 0x49, + 0x09, 0x89, 0xb9, 0x17, 0x9e, 0x17, 0xe8, 0x57, 0x65, 0x69, 0xde, 0xad, 0x5a, 0x09, 0x06, 0xb7, + 0xcc, 0x31, 0x30, 0x5d, 0xdc, 0xea, 0xf5, 0x6b, 0x0d, 0x62, 0x14, 0x81, 0x6b, 0x64, 0xb5, 0xa5, + 0xa4, 0x04, 0xb3, 0x54, 0x05, 0x9a, 0xc4, 0xf3, 0xc6, 0x79, 0xb5, 0x70, 0xd1, 0x21, 0xcd, 0x38, + 0x3e, 0x1d, 0xfa, 0x04, 0x90, 0x10, 0x37, 0x56, 0x45, 0x2a, 0x63, 0xd9, 0x6b, 0x11, 0xbc, 0xc3, + 0x70, 0x52, 0xf4, 0x43, 0x2e, 0xf3, 0xd2, 0xd4, 0xce, 0xd9, 0xca, 0x5c, 0x85, 0x75, 0x10, 0xe3, + 0xb5, 0xb0, 0x09, 0x0a, 0x90, 0x33, 0xec, 0x95, 0xb4, 0xd7, 0xc5, 0x20, 0xa2, 0xc2, 0x0a, 0x3e, + 0xc7, 0x50, 0xe2, 0x97, 0xf4, 0x31, 0xca, 0xea, 0x64, 0x8d, 0x34, 0xde, 0x46, 0x7a, 0xd5, 0xab, + 0x90, 0x62, 0x83, 0x7c, 0x4f, 0x90, 0x89, 0xa4, 0x89, 0xf4, 0xc4, 0x70, 0x30, 0x43, 0xf6, 0x03, + 0xf7, 0x47, 0x30, 0xc5, 0x64, 0x78, 0x32, 0x18, 0x6f, 0x39, 0x59, 0xc1, 0x9d, 0xee, 0x23, 0x5c, + 0x65, 0x49, 0x96, 0xd9, 0x04, 0x0a, 0xba, 0xca, 0x2b, 0x52, 0x22, 0xe3, 0x32, 0xa2, 0x28, 0x80, + 0xe6, 0x22, 0xda, 0x3d, 0x38, 0xa0, 0xa4, 0x80, 0x7f, 0x4a, 0x5e, 0x40, 0xda, 0x27, 0x01, 0xd9, + 0xc6, 0xe9, 0x3c, 0x13, 0x4e, 0xf7, 0x99, 0x70, 0x7a, 0x3f, 0x86, 0xb3, 0x11, 0xca, 0x19, 0xb6, + 0xe7, 0x25, 0xbb, 0xd9, 0x88, 0x59, 0xa3, 0x06, 0x7f, 0x8f, 0xba, 0xff, 0xc9, 0xc7, 0xfa, 0xb1, + 0x7b, 0xdf, 0x79, 0x26, 0x9c, 0xee, 0x33, 0xe1, 0xf4, 0x7e, 0x08, 0xc7, 0x06, 0xa8, 0x51, 0x07, + 0x0d, 0x2b, 0x12, 0xeb, 0x07, 0xa5, 0xf4, 0xd5, 0x63, 0xb2, 0xc5, 0xdf, 0x11, 0xb7, 0xc6, 0x77, + 0x24, 0x37, 0xee, 0x3c, 0x13, 0x4e, 0xf7, 0x99, 0x70, 0x7a, 0x3f, 0x86, 0x63, 0x03, 0x94, 0x0d, + 0xcf, 0x63, 0x82, 0x0f, 0x2b, 0x8e, 0x1e, 0x7a, 0x55, 0xba, 0x55, 0x83, 0xb1, 0x55, 0x2b, 0x15, + 0xb1, 0x02, 0x55, 0xe1, 0xd6, 0x8f, 0x05, 0x59, 0x91, 0xf1, 0x89, 0x36, 0xf3, 0xc1, 0x25, 0x68, + 0xb3, 0xcb, 0x10, 0xf7, 0x14, 0x0a, 0xab, 0x3f, 0x10, 0x1c, 0xdf, 0x2c, 0x6c, 0x11, 0x87, 0x24, + 0xd4, 0x39, 0x93, 0x6b, 0x2f, 0x79, 0x8e, 0xfd, 0xfb, 0xfc, 0xbe, 0x99, 0x41, 0x8a, 0x2f, 0x08, + 0x0a, 0x38, 0x07, 0xeb, 0x36, 0xe9, 0x9e, 0x68, 0x20, 0x47, 0x49, 0x62, 0x1d, 0x1d, 0x2b, 0x2e, + 0x4d, 0xd5, 0x21, 0x8f, 0xc6, 0xc4, 0xb6, 0xc5, 0x27, 0x7d, 0x3f, 0x1a, 0x7f, 0xa3, 0x2f, 0x1e, + 0xc5, 0x8f, 0x1c, 0x6e, 0x58, 0x85, 0x13, 0x9e, 0xa2, 0xad, 0xb1, 0x93, 0x3a, 0x24, 0x5b, 0xea, + 0xc9, 0x1c, 0x92, 0xab, 0x89, 0xba, 0x5e, 0x43, 0x9c, 0x54, 0x0d, 0xd0, 0x3a, 0xb2, 0x6a, 0x96, + 0x8f, 0x9d, 0xb1, 0x73, 0x9a, 0xf7, 0xed, 0xee, 0x7a, 0xf4, 0xb8, 0xbb, 0x22, 0xa8, 0xc1, 0x87, + 0x1e, 0xb3, 0xd8, 0x0c, 0x6e, 0x5f, 0xfb, 0xaf, 0x7a, 0x77, 0xde, 0x17, 0x7c, 0x96, 0x88, 0x9b, + 0x44, 0x23, 0x3a, 0x72, 0x26, 0xd0, 0x02, 0x26, 0x3a, 0x20, 0xaf, 0xdd, 0x5c, 0xcd, 0x30, 0x84, + 0x85, 0x5e, 0xb9, 0xb5, 0x11, 0x31, 0xe2, 0x9e, 0x20, 0x14, 0xc1, 0x30, 0x8b, 0xc3, 0x6d, 0x12, + 0x1d, 0x0d, 0x76, 0x90, 0xe8, 0x7a, 0xc5, 0xa2, 0xce, 0x8a, 0x45, 0x9d, 0xde, 0x03, 0x12, 0xe1, + 0xd5, 0xed, 0x05, 0xb5, 0x4d, 0x2c, 0x08, 0xfb, 0xa0, 0xd5, 0x98, 0xf8, 0x30, 0x87, 0x2a, 0x77, + 0x53, 0xd2, 0x82, 0x89, 0x12, 0x2c, 0x15, 0x6d, 0xaa, 0x57, 0x99, 0xb6, 0x07, 0x6c, 0x6a, 0xe7, + 0x98, 0x89, 0x52, 0x98, 0xd0, 0x4a, 0xf6, 0xa1, 0x4e, 0x87, 0xf6, 0x87, 0x5c, 0x6f, 0x90, 0xe3, + 0x81, 0x58, 0xa3, 0x96, 0xc3, 0xec, 0x1d, 0x09, 0x6c, 0x99, 0x7a, 0x17, 0x10, 0xbe, 0x55, 0xe7, + 0xb0, 0x40, 0x6b, 0x4d, 0xfb, 0x74, 0x16, 0x80, 0xa3, 0x1d, 0x4e, 0xbf, 0x29, 0xa4, 0xde, 0x5a, + 0xc3, 0x4e, 0x39, 0xee, 0x0a, 0xab, 0x8b, 0x3d, 0x4d, 0x57, 0xcb, 0x56, 0x0c, 0x33, 0x5f, 0xc0, + 0x03, 0xaa, 0x8e, 0xae, 0x73, 0x28, 0xb8, 0x9d, 0xa9, 0x91, 0xf4, 0x8e, 0xa0, 0xe8, 0xba, 0xfd, + 0x95, 0x51, 0xc5, 0x5e, 0x0b, 0x80, 0xfc, 0x1b, 0x8c, 0xba, 0x8c, 0xab, 0xd4, 0x85, 0xbc, 0xdf, + 0x18, 0xa0, 0x5d, 0x3b, 0xe1, 0x90, 0x25, 0x37, 0xf3, 0x75, 0xd4, 0x16, 0x1c, 0x73, 0xce, 0xb5, + 0x2e, 0x41, 0x07, 0x2e, 0xc9, 0xc3, 0x6a, 0x18, 0x00, 0xe9, 0x2c, 0xf1, 0x69, 0x65, 0x8c, 0x6b, + 0x62, 0x5f, 0x77, 0x3b, 0x54, 0x24, 0xaa, 0xc0, 0xeb, 0x1a, 0x71, 0xe3, 0x13, 0x2e, 0xed, 0xe8, + 0xaf, 0x41, 0x93, 0x5c, 0x2d, 0x31, 0x16, 0x76, 0x70, 0x2e, 0x33, 0x77, 0xfb, 0x20, 0x6c, 0x73, + 0x37, 0x5c, 0x55, 0xa3, 0x19, 0xce, 0x61, 0x29, 0xad, 0x6e, 0x65, 0xe6, 0x48, 0x41, 0x6c, 0xac, + 0x17, 0xe8, 0xb1, 0xbb, 0xd6, 0x76, 0xa2, 0x47, 0x17, 0x27, 0x4f, 0x65, 0xfa, 0x5c, 0x49, 0x68, + 0xec, 0x4a, 0x06, 0x66, 0x6b, 0x14, 0x8f, 0x7b, 0xdd, 0xd6, 0xf8, 0xe3, 0x68, 0x97, 0xcc, 0xab, + 0x5a, 0x66, 0x08, 0xe5, 0xf5, 0x4e, 0xa0, 0x5f, 0x68, 0xff, 0xf7, 0xd3, 0x8b, 0xd6, 0xa7, 0x9d, + 0x28, 0xf8, 0xf3, 0xf2, 0x8f, 0x92, 0x4b, 0x9c, 0x94, 0x5b, 0x43, 0x3e, 0x6b, 0x7d, 0x4c, 0x0c, + 0xdb, 0x09, 0xf6, 0xf3, 0xbd, 0xac, 0xb3, 0xbc, 0x4b, 0xee, 0x00, 0x79, 0x7c, 0xb1, 0xe4, 0x82, + 0xcf, 0xe6, 0xe6, 0x0c, 0x2b, 0xf8, 0xeb, 0xd2, 0x48, 0xbc, 0xcb, 0xaf, 0x0a, 0x20, 0xc5, 0x1b, + 0x97, 0x17, 0x18, 0x0c, 0x8c, 0xe4, 0x7e, 0xe7, 0x5e, 0x6a, 0x93, 0x8c, 0xee, 0x53, 0x4f, 0x93, + 0xc5, 0xff, 0x3e, 0xbb, 0xb6, 0xed, 0x60, 0x6e, 0xcb, 0xc1, 0x4e, 0xef, 0x76, 0x94, 0xb7, 0xbf, + 0xe8, 0xff, 0x05, 0xa1, 0x98, 0xa8, 0xba, 0xe1, 0x0f, 0x00, 0x00 }; @@ -1013,418 +1013,420 @@ const uint8_t PAGE_settings_ui[] PROGMEM = { // Autogenerated from wled00/data/settings_sync.htm, do not edit!! -const uint16_t PAGE_settings_sync_length = 3146; +const uint16_t PAGE_settings_sync_length = 3153; const uint8_t PAGE_settings_sync[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0x6d, 0x77, 0xda, 0xb8, - 0x12, 0xfe, 0xee, 0x5f, 0xa1, 0xfa, 0xc3, 0x2e, 0x6c, 0x08, 0x18, 0x12, 0xd2, 0x94, 0x60, 0xf7, - 0x86, 0x90, 0x26, 0xec, 0x36, 0x0d, 0x85, 0x64, 0x5f, 0xce, 0xb9, 0xe7, 0xec, 0x11, 0xb6, 0x00, - 0x25, 0xb6, 0xe5, 0xb5, 0xe5, 0xbc, 0x9c, 0x6e, 0xff, 0xfb, 0x9d, 0x91, 0x6c, 0x03, 0x06, 0x02, - 0xbd, 0x1f, 0x4a, 0x6c, 0x49, 0x33, 0x1a, 0xcd, 0xcb, 0x33, 0x33, 0x72, 0xbb, 0xef, 0xfa, 0xb7, - 0x17, 0x77, 0x7f, 0x0d, 0x2f, 0xc9, 0x5c, 0x06, 0xbe, 0xd3, 0xc5, 0x5f, 0xe2, 0xd3, 0x70, 0x66, - 0x9b, 0x2c, 0x34, 0xe1, 0x9d, 0x51, 0xcf, 0xe9, 0x06, 0x4c, 0x52, 0x12, 0xd2, 0x80, 0xd9, 0xe6, - 0x13, 0x67, 0xcf, 0x91, 0x88, 0xa5, 0x49, 0x5c, 0x11, 0x4a, 0x16, 0x4a, 0xdb, 0x7c, 0xe6, 0x9e, - 0x9c, 0xdb, 0x6d, 0xcb, 0x32, 0x1d, 0x43, 0x2f, 0x35, 0x4a, 0x73, 0x1e, 0x7b, 0xe2, 0x2e, 0x3b, - 0x54, 0x2f, 0x35, 0x1e, 0x72, 0xc9, 0xa9, 0x7f, 0x98, 0xb8, 0xd4, 0x67, 0x76, 0xb3, 0x16, 0xd0, - 0x17, 0x1e, 0xa4, 0x41, 0xf1, 0x9e, 0x26, 0x2c, 0x56, 0x2f, 0x74, 0x02, 0xef, 0xa1, 0x30, 0x89, - 0x51, 0xda, 0x3a, 0x13, 0xc8, 0x9d, 0xd3, 0x38, 0x61, 0xb0, 0x49, 0x2a, 0xa7, 0x87, 0xa7, 0x30, - 0x2a, 0xb9, 0xf4, 0x99, 0x33, 0x7e, 0x0d, 0x5d, 0x32, 0x66, 0x52, 0xf2, 0x70, 0x96, 0x74, 0x1b, - 0x7a, 0xb0, 0x9b, 0xb8, 0x31, 0x8f, 0xa4, 0x63, 0x3c, 0xd1, 0x98, 0xf8, 0xc2, 0xe5, 0x51, 0xcd, - 0xb3, 0x3d, 0xe1, 0xa6, 0x01, 0x88, 0x59, 0x83, 0x01, 0xfb, 0x5d, 0xf3, 0x6c, 0x9a, 0x86, 0xae, - 0xe4, 0x22, 0x24, 0xb3, 0x81, 0x57, 0x61, 0xd5, 0x6f, 0x31, 0x93, 0x69, 0x1c, 0x12, 0xaf, 0x3e, - 0x63, 0xf2, 0xd2, 0x67, 0xb8, 0xb4, 0xf7, 0xaa, 0xa6, 0xbe, 0x17, 0x4b, 0xaf, 0x2b, 0xd5, 0x6f, - 0xcf, 0x3c, 0xf4, 0xc4, 0x73, 0x5d, 0x44, 0x2c, 0xac, 0x98, 0x73, 0x29, 0xa3, 0xa4, 0xd3, 0x68, - 0x3c, 0x86, 0xa2, 0xfe, 0xec, 0x33, 0x24, 0x6e, 0x70, 0xd0, 0x46, 0x3c, 0xa5, 0x2e, 0x4b, 0x1a, - 0xa9, 0x17, 0x1d, 0x86, 0x42, 0xf2, 0x29, 0x67, 0x71, 0xc3, 0x5c, 0x62, 0xd4, 0x2b, 0x33, 0x6a, - 0x24, 0xd9, 0x19, 0xcc, 0x9a, 0xf9, 0x77, 0xc2, 0xfc, 0xe9, 0xf2, 0x6a, 0xea, 0x3d, 0xc0, 0xfa, - 0x93, 0xe3, 0xf6, 0xb1, 0x6d, 0x7b, 0xf5, 0xf1, 0xb4, 0xde, 0x1f, 0xd4, 0x9f, 0xa8, 0x9f, 0xb2, - 0x8f, 0xcd, 0x6c, 0xe0, 0xf2, 0x5e, 0x0f, 0xfc, 0xf4, 0x53, 0x65, 0xe5, 0xdd, 0xb6, 0xaa, 0x9d, - 0x76, 0xfb, 0xe4, 0xb4, 0x44, 0x07, 0xcb, 0xac, 0x7c, 0xe8, 0x7c, 0x95, 0x32, 0x7f, 0xb7, 0x9b, - 0xd5, 0x9a, 0xb5, 0x8b, 0x7b, 0xb3, 0xba, 0x24, 0xa5, 0x2f, 0xa8, 0xf7, 0xeb, 0xb8, 0xc2, 0x6a, - 0xd2, 0x7e, 0x67, 0x55, 0xbf, 0xf9, 0x4c, 0x12, 0x01, 0xf4, 0x6e, 0xcc, 0xa8, 0x64, 0x99, 0x46, - 0x2b, 0xa6, 0x36, 0x8d, 0x59, 0x3d, 0x13, 0x75, 0x38, 0xf2, 0xb9, 0x94, 0x31, 0x9f, 0xa4, 0x92, - 0xc1, 0x44, 0xec, 0x9a, 0x35, 0x56, 0xad, 0x95, 0xc7, 0xe5, 0x6b, 0xc4, 0x40, 0x29, 0x92, 0xbd, - 0xc8, 0xc6, 0x03, 0x7d, 0xa2, 0x39, 0x83, 0xb5, 0x85, 0x34, 0x01, 0x5f, 0x30, 0x6b, 0xb2, 0x5a, - 0xf3, 0xea, 0x13, 0xe1, 0xbd, 0xd6, 0x69, 0x04, 0xaa, 0xf5, 0x2e, 0xe6, 0xdc, 0xf7, 0x2a, 0x02, - 0xd7, 0x53, 0xcf, 0xbb, 0x7c, 0x02, 0x29, 0x3e, 0xf3, 0x04, 0x1c, 0x96, 0xc5, 0x15, 0x13, 0x65, - 0x36, 0x6b, 0x95, 0xaa, 0xed, 0x7c, 0xbb, 0x62, 0xf2, 0xf7, 0x4a, 0xb5, 0x06, 0xbe, 0xf4, 0x3b, - 0xf5, 0x2b, 0xd5, 0xef, 0x9b, 0x09, 0x58, 0x1c, 0x8b, 0x18, 0xe4, 0x04, 0x02, 0x70, 0xfb, 0x44, - 0xf8, 0xac, 0xee, 0x8b, 0x59, 0xc5, 0xbc, 0xc4, 0x71, 0x92, 0x69, 0x01, 0xec, 0x48, 0xa6, 0xdc, - 0x67, 0xea, 0x3c, 0xe0, 0xe7, 0x31, 0x9c, 0xfb, 0x73, 0x36, 0x2e, 0xa6, 0x18, 0x4b, 0x53, 0x3e, - 0x4b, 0x63, 0xaa, 0xd4, 0xa6, 0xcf, 0x43, 0xa6, 0x94, 0xa3, 0xff, 0xfc, 0x37, 0x1c, 0x84, 0xae, - 0x08, 0x22, 0xd0, 0x1e, 0x23, 0x11, 0x9d, 0x31, 0xe2, 0x51, 0x49, 0xdf, 0x81, 0x37, 0x2c, 0x69, - 0xfa, 0xd3, 0x05, 0xb8, 0xc3, 0x54, 0xc4, 0x95, 0x07, 0xdb, 0x3a, 0x7b, 0xe8, 0x9e, 0x9e, 0x3d, - 0x1c, 0x1c, 0x54, 0xd1, 0x8d, 0xcd, 0x2b, 0xf3, 0xa0, 0xf2, 0x70, 0x00, 0x66, 0xa9, 0xbb, 0x73, - 0xe6, 0x3e, 0x32, 0xcf, 0xd6, 0xc3, 0x63, 0xb3, 0xaa, 0x4d, 0xe6, 0x38, 0x0f, 0x3f, 0x35, 0x6b, - 0x6a, 0x70, 0xb4, 0x65, 0xed, 0x68, 0x65, 0xed, 0x62, 0xd7, 0x2b, 0xdc, 0x15, 0x23, 0x0a, 0xbc, - 0x0a, 0x6c, 0x6c, 0xd5, 0x84, 0x0d, 0x51, 0x54, 0x92, 0x82, 0x1d, 0xd8, 0x9b, 0x05, 0xf9, 0x45, - 0xd4, 0x64, 0x36, 0x37, 0xda, 0x30, 0x27, 0x7e, 0xb1, 0x5b, 0x67, 0x25, 0x59, 0x6d, 0x56, 0x2b, - 0x49, 0x64, 0xcb, 0x85, 0x38, 0xe3, 0x61, 0x21, 0xce, 0x8a, 0x6f, 0x6b, 0x2e, 0x2f, 0x11, 0xd0, - 0x24, 0xf2, 0x15, 0xec, 0xe3, 0xf1, 0x24, 0xf2, 0xe9, 0xab, 0xcd, 0x1c, 0xeb, 0xa3, 0x19, 0x8a, - 0x90, 0x99, 0x1d, 0x73, 0x02, 0x20, 0xf0, 0x08, 0xe6, 0x71, 0xac, 0xc2, 0xa7, 0x87, 0xf9, 0xa6, - 0x4b, 0x8a, 0xce, 0x9d, 0xe1, 0x5b, 0xf2, 0xcc, 0xa5, 0x3b, 0xaf, 0x44, 0x88, 0x41, 0x03, 0x70, - 0xe3, 0x15, 0x92, 0x6a, 0xf5, 0x9b, 0x4b, 0x13, 0x46, 0x30, 0xd0, 0x3a, 0x2b, 0xb2, 0xd8, 0x38, - 0x74, 0x36, 0x81, 0x08, 0x78, 0x3c, 0x53, 0x4b, 0x30, 0x86, 0x4b, 0x4b, 0x70, 0x68, 0x79, 0xc9, - 0xb1, 0x75, 0x5c, 0xe6, 0x82, 0x43, 0xdf, 0xf1, 0xbc, 0x35, 0xb4, 0xfc, 0x92, 0x78, 0x20, 0x99, - 0x89, 0x8e, 0xd6, 0x31, 0x6d, 0x3b, 0x83, 0x13, 0x38, 0x98, 0xf2, 0xab, 0x7a, 0x14, 0x0b, 0x29, - 0x5c, 0xe1, 0xc3, 0x01, 0x15, 0xe2, 0x59, 0xb5, 0x8a, 0x82, 0x42, 0x1b, 0x57, 0xf8, 0x63, 0x29, - 0x62, 0xf0, 0x2e, 0x04, 0xbb, 0x81, 0x64, 0x01, 0x46, 0x82, 0x3b, 0x00, 0x9d, 0x55, 0xff, 0xfd, - 0x37, 0x5b, 0x06, 0xf4, 0x41, 0x04, 0x8e, 0xfb, 0x09, 0xf8, 0x93, 0x1b, 0xe1, 0xb1, 0x3a, 0x19, - 0xfa, 0x0c, 0x25, 0x64, 0x08, 0x70, 0xe4, 0x8f, 0xcf, 0x97, 0x7d, 0x32, 0x18, 0x82, 0x6b, 0xd6, - 0x56, 0x38, 0x26, 0xab, 0x1c, 0x6b, 0x8a, 0x5b, 0xb5, 0x8a, 0xab, 0x14, 0x3e, 0x20, 0xfb, 0x8f, - 0x0a, 0x38, 0x01, 0x37, 0xcd, 0x03, 0x35, 0xdd, 0x31, 0xcd, 0xea, 0xc1, 0x02, 0x03, 0x1b, 0x49, - 0xfd, 0x21, 0xf9, 0x18, 0xd9, 0xc7, 0x66, 0xed, 0x5d, 0xb3, 0xfa, 0xdd, 0xe8, 0x36, 0x32, 0x40, - 0xef, 0x2a, 0x8b, 0x3a, 0xff, 0xe1, 0x01, 0xa6, 0x06, 0x92, 0xc6, 0x3e, 0xe0, 0x86, 0x32, 0xb2, - 0x9b, 0x24, 0x80, 0x29, 0xb0, 0x50, 0x2d, 0xe8, 0x36, 0x74, 0x2a, 0x43, 0x18, 0x80, 0xa0, 0xc4, - 0x9d, 0x6d, 0x13, 0xb4, 0x05, 0x69, 0x03, 0x1c, 0x36, 0x30, 0x08, 0x87, 0x77, 0x7c, 0xfa, 0x3b, - 0x31, 0xb3, 0x54, 0x37, 0x9e, 0x9a, 0x04, 0x12, 0xcd, 0x5c, 0xc0, 0x4c, 0x24, 0x12, 0x48, 0x79, - 0x10, 0xde, 0xe9, 0x24, 0xe0, 0x90, 0x72, 0xd0, 0xf3, 0x81, 0xd4, 0xe3, 0x4f, 0xc4, 0xf5, 0x69, - 0x92, 0xd8, 0xa6, 0x14, 0xa0, 0x9e, 0xe7, 0x6c, 0xcc, 0xc8, 0x06, 0xe7, 0xcc, 0x8f, 0x7a, 0x30, - 0x06, 0x70, 0x24, 0xc1, 0x3a, 0x08, 0x5c, 0xb6, 0xa9, 0x5f, 0x90, 0x9b, 0xeb, 0x73, 0xf7, 0xd1, - 0x36, 0xaf, 0x91, 0xd7, 0xc7, 0x6e, 0x43, 0x4f, 0x80, 0xa8, 0xc0, 0xa2, 0xa0, 0x31, 0xb6, 0x10, - 0xf5, 0x90, 0xa8, 0x47, 0xdd, 0xc7, 0x05, 0xdd, 0xca, 0x2e, 0x5a, 0x52, 0xd3, 0x19, 0xd3, 0x27, - 0xb6, 0x58, 0x32, 0x8f, 0x21, 0x47, 0x6b, 0xfe, 0xf3, 0x96, 0x4e, 0x95, 0xa0, 0xe2, 0x34, 0x02, - 0xf5, 0xb4, 0x60, 0xe8, 0xc8, 0x51, 0x36, 0xec, 0xc5, 0xa0, 0x1e, 0x70, 0x3d, 0x09, 0xc3, 0x47, - 0xce, 0x7d, 0x7f, 0x48, 0x86, 0xa0, 0xdc, 0x0e, 0xe9, 0xf2, 0x30, 0x4a, 0x65, 0xa6, 0x9e, 0xfb, - 0xa1, 0x99, 0x0b, 0x17, 0xa6, 0xc1, 0x84, 0xc5, 0xa0, 0x2d, 0x1e, 0xda, 0x66, 0x13, 0xfe, 0xd2, - 0x17, 0xdb, 0x3c, 0x69, 0xb7, 0x8f, 0xda, 0x66, 0xae, 0x1e, 0x0f, 0x1e, 0x63, 0xf6, 0x4f, 0xca, - 0x63, 0x86, 0x56, 0x88, 0x9d, 0x56, 0xe8, 0xad, 0x72, 0xcd, 0xb2, 0xfc, 0x7d, 0xcb, 0x24, 0xff, - 0x3f, 0x57, 0xf5, 0x6f, 0x85, 0x1f, 0x80, 0x87, 0xb2, 0x2d, 0xfe, 0x5d, 0xe5, 0xab, 0x1c, 0x03, - 0x78, 0x68, 0x30, 0xe8, 0x28, 0x1c, 0x70, 0x56, 0xcf, 0x08, 0x38, 0xa3, 0x89, 0x47, 0x6b, 0x67, - 0xdd, 0x48, 0xdd, 0x95, 0x58, 0xb4, 0xe4, 0x73, 0x01, 0x8d, 0x67, 0x3c, 0xec, 0x58, 0x84, 0xa6, - 0x52, 0xe0, 0x24, 0xc8, 0x26, 0x3d, 0xac, 0x8e, 0xfc, 0x24, 0xa2, 0x70, 0xa8, 0x0f, 0x05, 0x1b, - 0xcc, 0x65, 0x87, 0xd4, 0xe7, 0xb3, 0xb0, 0xe3, 0xaa, 0x60, 0x32, 0xb5, 0x71, 0x66, 0xb1, 0x48, - 0x23, 0xac, 0x62, 0xe0, 0x78, 0x0d, 0x45, 0xaf, 0x78, 0x38, 0x7a, 0x04, 0xfe, 0x35, 0x8d, 0xe2, - 0xb1, 0x55, 0x3c, 0x1d, 0x15, 0x4f, 0xc7, 0xc5, 0x53, 0xbb, 0x78, 0x3a, 0x29, 0x9e, 0xde, 0x17, - 0x4f, 0xa7, 0x8b, 0x2d, 0x8c, 0x7c, 0x8f, 0x31, 0xa4, 0xca, 0x4e, 0xb1, 0x22, 0xd3, 0x8b, 0x56, - 0x82, 0x42, 0xe9, 0x89, 0x78, 0xc9, 0xb4, 0xd3, 0xcc, 0x43, 0x06, 0x9e, 0x9c, 0x32, 0x85, 0xb1, - 0x91, 0xa4, 0x55, 0x90, 0xb4, 0xd6, 0x49, 0x36, 0x52, 0x1c, 0x15, 0x85, 0x20, 0x3c, 0xee, 0x47, - 0x72, 0x5c, 0x6c, 0x72, 0xbc, 0xaf, 0x5c, 0xed, 0x82, 0xa4, 0xbd, 0xe7, 0x26, 0x27, 0x0b, 0xb9, - 0x4e, 0xf6, 0x24, 0x79, 0x5f, 0x6c, 0xf2, 0x7e, 0x5f, 0xb9, 0x4e, 0x0b, 0x92, 0xd3, 0x9c, 0x64, - 0xd9, 0x1f, 0x46, 0xcc, 0x65, 0xfc, 0x89, 0x75, 0xf6, 0x62, 0x36, 0x2a, 0xec, 0x35, 0x6a, 0xee, - 0x27, 0xf1, 0xa8, 0x55, 0x1c, 0x72, 0xb4, 0xa7, 0xbd, 0x46, 0x47, 0xc5, 0x26, 0x47, 0x7b, 0x1e, - 0x72, 0x54, 0xd8, 0x6b, 0x74, 0xbc, 0xe7, 0x26, 0xed, 0x85, 0x5c, 0x7b, 0xda, 0x6b, 0x74, 0x52, - 0x6c, 0x72, 0xb2, 0xaf, 0x5c, 0x85, 0xbd, 0x46, 0xef, 0xf7, 0xdc, 0xe4, 0x74, 0x21, 0xd7, 0xaa, - 0xbd, 0x1a, 0x0a, 0x21, 0x14, 0x4e, 0x15, 0x36, 0x0b, 0xc5, 0x73, 0x4c, 0xa3, 0x6d, 0xfc, 0x72, - 0x3e, 0x90, 0x47, 0x7a, 0x31, 0x9f, 0xcd, 0x65, 0xc8, 0x92, 0xa4, 0xd6, 0x6d, 0xe4, 0x54, 0x6f, - 0x53, 0x67, 0xc4, 0x17, 0xa6, 0x73, 0x21, 0x7c, 0x11, 0xd7, 0x8c, 0x35, 0x42, 0x0a, 0x40, 0xfc, - 0x36, 0xf1, 0x9f, 0xa6, 0x73, 0x39, 0x9d, 0x32, 0x57, 0x26, 0x0b, 0xe2, 0x02, 0x67, 0x8d, 0x2d, - 0x54, 0xe3, 0x5b, 0x00, 0xd3, 0x31, 0x9b, 0x61, 0x8d, 0x4f, 0x44, 0x84, 0x05, 0x48, 0x52, 0x7b, - 0x7b, 0xa3, 0xf1, 0x15, 0x74, 0x90, 0x64, 0x22, 0xd2, 0xd0, 0x4b, 0x70, 0x03, 0x04, 0x20, 0xa2, - 0x9b, 0x25, 0x5d, 0xc1, 0x24, 0x58, 0x4e, 0x7b, 0x00, 0xf6, 0xae, 0xc4, 0xee, 0x2f, 0x9c, 0xb1, - 0x0e, 0x79, 0x5b, 0x6b, 0xe3, 0xbe, 0xe9, 0x6c, 0x67, 0x95, 0x25, 0xcc, 0x28, 0x06, 0x8d, 0x12, - 0x28, 0xd6, 0x07, 0xa3, 0x9d, 0xfc, 0x7a, 0x4b, 0xfc, 0xce, 0x7d, 0xf6, 0x42, 0x57, 0xb9, 0x76, - 0x76, 0x9c, 0xf0, 0x5c, 0x93, 0x1b, 0x8a, 0x7e, 0x08, 0x7d, 0x08, 0x8f, 0x12, 0x72, 0x9d, 0xb2, - 0xec, 0x38, 0x3f, 0xc6, 0xec, 0x7a, 0x99, 0xd9, 0x0d, 0x75, 0x63, 0xf1, 0x63, 0xf4, 0x37, 0xcb, - 0xf4, 0xab, 0xca, 0x91, 0xcf, 0xd0, 0xb0, 0xef, 0xa2, 0x6f, 0x99, 0x99, 0x1f, 0x38, 0xc6, 0x88, - 0x4d, 0x84, 0x90, 0x45, 0x2e, 0x26, 0x52, 0x10, 0xe8, 0xb5, 0xfc, 0xd7, 0xec, 0x5c, 0x49, 0xbd, - 0xdb, 0xe0, 0xaa, 0xbe, 0x18, 0x84, 0x89, 0xa4, 0xa1, 0xcb, 0x08, 0x36, 0x50, 0xaa, 0xbc, 0x30, - 0x2e, 0x43, 0x95, 0x34, 0x79, 0x3e, 0xe3, 0xc3, 0xcc, 0x8e, 0xad, 0xbf, 0x7c, 0xce, 0x44, 0xbf, - 0xa1, 0x8f, 0x8c, 0xc8, 0x39, 0x4f, 0x16, 0xe4, 0x90, 0x91, 0x5d, 0xf1, 0xc4, 0x62, 0x64, 0xba, - 0x8b, 0x0d, 0x5a, 0x13, 0x44, 0x18, 0x31, 0xea, 0x4b, 0x1e, 0x30, 0x43, 0x09, 0x94, 0xc5, 0x25, - 0xc1, 0xba, 0x27, 0xce, 0x66, 0x76, 0x30, 0x1a, 0x65, 0x6e, 0x66, 0xdc, 0x43, 0x31, 0x1c, 0x50, - 0x0e, 0x3d, 0x5c, 0xee, 0xf9, 0xa1, 0xff, 0xba, 0x83, 0xf8, 0xe6, 0xd6, 0x5c, 0xaa, 0x5d, 0x1c, - 0xe3, 0x0b, 0x93, 0xcf, 0x22, 0x7e, 0x24, 0xfd, 0x9b, 0x3f, 0x89, 0xa2, 0x53, 0xba, 0x83, 0xc9, - 0x3b, 0x20, 0x07, 0x5e, 0x09, 0xf3, 0x31, 0x00, 0x34, 0x71, 0x7f, 0xa0, 0x6a, 0x42, 0xa5, 0x65, - 0x30, 0x09, 0x76, 0x04, 0xea, 0x6e, 0x00, 0x58, 0xea, 0xa0, 0x23, 0x86, 0xee, 0x18, 0x4c, 0x6c, - 0x3c, 0x20, 0x90, 0x9b, 0xf5, 0xa3, 0x26, 0xa9, 0x24, 0xe7, 0x17, 0x5f, 0xaa, 0xdd, 0x86, 0x5e, - 0x52, 0x2c, 0xcd, 0x56, 0x62, 0xff, 0x61, 0x3a, 0xe7, 0xb1, 0x3c, 0x04, 0x51, 0xd6, 0x16, 0xe5, - 0xfc, 0x2c, 0x28, 0x5e, 0x94, 0x24, 0xd0, 0x26, 0x9a, 0xf9, 0x13, 0xc0, 0x4c, 0x9a, 0x48, 0x11, - 0x10, 0xac, 0xc6, 0x17, 0xa4, 0x0d, 0x3d, 0xaf, 0x8f, 0x88, 0x05, 0x32, 0x82, 0x24, 0x34, 0x64, - 0x8e, 0xb1, 0xa1, 0xb0, 0xbc, 0x1c, 0xee, 0x53, 0x01, 0x2e, 0x9f, 0xaa, 0xa8, 0xb7, 0xd7, 0xeb, - 0x41, 0x55, 0xeb, 0xde, 0xa4, 0x60, 0x44, 0xac, 0x67, 0x77, 0x58, 0xe2, 0xb2, 0x88, 0x08, 0x49, - 0xb1, 0x99, 0x08, 0xc1, 0x0d, 0xa0, 0xbd, 0x2b, 0xcb, 0x77, 0xbf, 0x51, 0x3e, 0x2b, 0x97, 0xef, - 0xe8, 0xc3, 0x87, 0x0f, 0x25, 0x31, 0x0c, 0xb0, 0x6b, 0x29, 0x44, 0x54, 0x44, 0x90, 0x0b, 0x94, - 0x80, 0x08, 0xe0, 0xdd, 0xa5, 0x64, 0x1e, 0xb3, 0xa9, 0x5d, 0x5c, 0x20, 0xcd, 0xb8, 0x9c, 0xa7, - 0x93, 0x3a, 0xb4, 0xfe, 0x8d, 0xcf, 0xcc, 0xfb, 0xf4, 0xa2, 0x7f, 0xb1, 0x0e, 0x85, 0xb2, 0x12, - 0xaf, 0xbd, 0xfe, 0x9e, 0xf8, 0x34, 0x7c, 0x34, 0x1d, 0x35, 0xde, 0x6d, 0x50, 0xe7, 0x9d, 0x42, - 0xa6, 0x47, 0x1e, 0x21, 0xc3, 0x43, 0x31, 0x3d, 0x4c, 0x60, 0x2f, 0x86, 0x31, 0x11, 0x41, 0x9f, - 0xc0, 0xe4, 0x02, 0x10, 0x8c, 0x2d, 0xe7, 0x1f, 0xeb, 0xf3, 0xa3, 0xe7, 0x25, 0x4a, 0x05, 0xd4, - 0xf3, 0x10, 0x1c, 0x4b, 0x1a, 0xe8, 0x9f, 0x97, 0x35, 0x60, 0xac, 0x98, 0xa8, 0xdd, 0xb4, 0x4a, - 0x0a, 0x40, 0x8e, 0x01, 0x74, 0x8c, 0x6b, 0xee, 0x7b, 0x63, 0x96, 0xbd, 0x0f, 0xaf, 0x11, 0xfb, - 0x3c, 0xc1, 0xf0, 0xf5, 0xb6, 0x79, 0x28, 0x94, 0x2d, 0x63, 0x68, 0x0b, 0x01, 0x35, 0x46, 0x57, - 0xbd, 0x6d, 0x8b, 0x00, 0x9e, 0x8c, 0x6c, 0x55, 0xff, 0x8d, 0x65, 0x47, 0x79, 0x76, 0xdb, 0xb6, - 0x00, 0x62, 0x41, 0x39, 0x10, 0xee, 0x65, 0x6c, 0x5b, 0x04, 0xd5, 0x47, 0x9f, 0x07, 0x01, 0x74, - 0xc1, 0x07, 0xa4, 0x58, 0xbd, 0x35, 0xc0, 0x40, 0xb2, 0x62, 0xd1, 0x1f, 0x5b, 0xc2, 0x84, 0x12, - 0x63, 0xd5, 0x21, 0xb6, 0xdc, 0x28, 0x32, 0x8c, 0xe8, 0x43, 0x2f, 0x78, 0x69, 0x80, 0x51, 0x4a, - 0xae, 0xa1, 0xa3, 0x9d, 0x87, 0x53, 0x81, 0xfe, 0x61, 0x28, 0x10, 0x01, 0x34, 0x03, 0xf7, 0x28, - 0xfb, 0xf4, 0xdd, 0x8e, 0x98, 0xb3, 0xac, 0x65, 0x93, 0x92, 0x40, 0x25, 0x68, 0xe3, 0x93, 0x88, - 0x5d, 0x04, 0xbc, 0x17, 0x32, 0x29, 0x4a, 0x93, 0x1d, 0x31, 0xf6, 0x29, 0xcb, 0xa0, 0xb9, 0x8d, - 0x0b, 0x88, 0x25, 0x33, 0x1a, 0x04, 0x94, 0xb8, 0x22, 0xc6, 0xfc, 0x0e, 0xfa, 0xd8, 0x85, 0xb9, - 0x57, 0x19, 0xa3, 0x1c, 0xbd, 0x09, 0xb6, 0xae, 0x62, 0x3a, 0x85, 0x86, 0xb6, 0x74, 0xba, 0x3f, - 0x6e, 0x37, 0x9e, 0xee, 0xb0, 0xd5, 0x6e, 0x67, 0x07, 0x54, 0x4f, 0xc6, 0xc2, 0x65, 0x21, 0x0d, - 0xe8, 0xec, 0xfe, 0xbb, 0x80, 0x44, 0x48, 0xce, 0x93, 0x84, 0x63, 0x7a, 0xd1, 0x19, 0xeb, 0x32, - 0x48, 0x7d, 0x2a, 0x59, 0x96, 0xff, 0xf5, 0xe5, 0xf6, 0xae, 0xd0, 0x3a, 0xcf, 0x32, 0x96, 0xa6, - 0xe1, 0xe1, 0x53, 0x76, 0x29, 0xa3, 0xa6, 0x4b, 0x27, 0xc5, 0x66, 0xb0, 0xa8, 0x38, 0xce, 0x07, - 0x4a, 0x44, 0x9f, 0x85, 0x33, 0x39, 0x07, 0x6f, 0x6d, 0xe9, 0x94, 0xd5, 0xf3, 0x5f, 0xc3, 0x47, - 0x25, 0x4d, 0x77, 0xe2, 0x18, 0xea, 0xad, 0x46, 0x6e, 0xbe, 0xde, 0xdd, 0x11, 0xac, 0xe7, 0xb0, - 0xa2, 0xc0, 0xbb, 0x4f, 0x42, 0x7d, 0x1f, 0x2f, 0x17, 0x43, 0x8c, 0x38, 0xc8, 0xc9, 0xc0, 0x98, - 0xc5, 0x21, 0xf5, 0xc9, 0x5c, 0x24, 0x32, 0x51, 0x78, 0x61, 0xdc, 0x61, 0xf6, 0x0c, 0xe8, 0x2b, - 0xe1, 0x01, 0xc0, 0x04, 0x2c, 0x9b, 0xa3, 0x4d, 0x92, 0x08, 0xca, 0x00, 0x80, 0xbf, 0x50, 0x95, - 0x46, 0x53, 0x35, 0x7a, 0x39, 0x1e, 0x9e, 0xb6, 0x4e, 0x4e, 0x00, 0xb9, 0x26, 0x4e, 0x6e, 0x7e, - 0x32, 0x61, 0x09, 0x82, 0x5a, 0x02, 0xee, 0x0c, 0xf5, 0x1d, 0xa6, 0x3b, 0x92, 0x42, 0x12, 0x84, - 0x76, 0x38, 0x23, 0x83, 0x97, 0x84, 0xc5, 0xa8, 0xa3, 0x84, 0x50, 0x40, 0x14, 0x82, 0xb6, 0xaa, - 0x2b, 0xfa, 0x0a, 0x18, 0x0e, 0xe5, 0x91, 0xb0, 0x91, 0xff, 0x5a, 0x2b, 0x24, 0xa5, 0x40, 0x01, - 0xcf, 0x1e, 0xee, 0x88, 0x62, 0x03, 0x97, 0x40, 0x9d, 0x0b, 0x39, 0xa3, 0x24, 0x98, 0x9a, 0xf1, - 0x7c, 0xd5, 0x3c, 0x6f, 0x5e, 0x0b, 0x04, 0x77, 0x63, 0x83, 0x1a, 0xb5, 0x16, 0x7b, 0xd7, 0x6b, - 0x5a, 0xdc, 0x74, 0xa7, 0xd1, 0xdb, 0xef, 0x4e, 0x23, 0x0b, 0xe3, 0x53, 0x6b, 0xf9, 0x22, 0x42, - 0xe3, 0x9c, 0x72, 0x06, 0x72, 0x9e, 0xca, 0x39, 0x08, 0xfe, 0xc8, 0xc2, 0x85, 0x50, 0xd9, 0x0e, - 0xbf, 0xad, 0x0a, 0x72, 0x54, 0xd4, 0x50, 0x17, 0x3e, 0xa3, 0xb1, 0x3a, 0x9d, 0x22, 0x24, 0x53, - 0xce, 0x7c, 0x55, 0x48, 0x79, 0x3a, 0x50, 0xea, 0x44, 0xd5, 0x01, 0xfb, 0xc2, 0xc2, 0x04, 0x5d, - 0x62, 0x03, 0x24, 0x8c, 0xf1, 0xba, 0xa7, 0x80, 0x04, 0x74, 0x25, 0x03, 0xdd, 0x46, 0x3b, 0xb6, - 0xae, 0xc4, 0xf0, 0x7d, 0x57, 0xcd, 0xf2, 0x55, 0xcb, 0xdd, 0x8b, 0x41, 0xd6, 0xb8, 0xec, 0xfc, - 0xcb, 0x9a, 0xbf, 0x19, 0xef, 0xa5, 0xf9, 0x9b, 0xaf, 0xc3, 0xdb, 0xd1, 0xdd, 0xdb, 0x69, 0x65, - 0xed, 0xee, 0x27, 0x2b, 0x9b, 0xd0, 0x87, 0xb5, 0xd4, 0xc4, 0x85, 0xe8, 0x85, 0xb2, 0x8b, 0x53, - 0x1f, 0x9c, 0x2d, 0x46, 0xcf, 0xc3, 0x1a, 0x0c, 0xb2, 0x38, 0xb8, 0x0f, 0xe4, 0x73, 0x70, 0xab, - 0x14, 0xcb, 0xd3, 0xcc, 0xd1, 0xf0, 0x52, 0x54, 0x39, 0xe2, 0x17, 0x86, 0x4b, 0x72, 0xef, 0x52, - 0x9c, 0x22, 0xd8, 0x04, 0xca, 0x30, 0x8f, 0x4c, 0x05, 0x12, 0x0b, 0x98, 0x88, 0x73, 0x47, 0x7e, - 0x97, 0x47, 0x00, 0x94, 0x7b, 0xf1, 0x4a, 0x00, 0x6f, 0x52, 0xc0, 0xd7, 0xfb, 0xf1, 0xe5, 0x68, - 0x45, 0x09, 0xc7, 0x96, 0x16, 0x7d, 0x98, 0xed, 0x51, 0x52, 0x76, 0xbe, 0x75, 0x81, 0x01, 0xa0, - 0x9c, 0xf3, 0xf1, 0xaa, 0x1e, 0x4f, 0x8e, 0x35, 0x8b, 0x0b, 0x9f, 0xe3, 0x11, 0x07, 0xfd, 0x8d, - 0x18, 0x92, 0x93, 0x5f, 0x0c, 0xfa, 0xa8, 0xcc, 0x75, 0x09, 0x32, 0x7f, 0xbd, 0x13, 0x11, 0x77, - 0xdf, 0xe2, 0xd0, 0x5f, 0x33, 0xa2, 0x4a, 0x26, 0x57, 0x78, 0x3d, 0xb5, 0x9b, 0xfa, 0x6a, 0x1d, - 0xc2, 0x50, 0xeb, 0xc3, 0x74, 0x02, 0xb5, 0xfe, 0xbc, 0xdc, 0x89, 0xed, 0x70, 0xbd, 0xde, 0xcd, - 0x0f, 0xb4, 0x1d, 0x3f, 0x16, 0x33, 0xc1, 0x3f, 0x52, 0x6e, 0x08, 0x19, 0xe5, 0x0f, 0x2b, 0x11, - 0xb3, 0xd4, 0xb9, 0x69, 0x0c, 0x06, 0x59, 0xfe, 0x12, 0x29, 0x71, 0x29, 0xc6, 0x2d, 0x00, 0x15, - 0xba, 0x11, 0xa4, 0x44, 0x0f, 0x5a, 0xba, 0xc1, 0x50, 0x41, 0x17, 0x8e, 0xf8, 0x98, 0x23, 0x89, - 0x76, 0x6e, 0x60, 0xa8, 0xc6, 0x7e, 0x3e, 0x87, 0x86, 0x57, 0xfe, 0x8c, 0x88, 0xa7, 0xf2, 0x41, - 0x86, 0xb5, 0x73, 0x40, 0x70, 0x38, 0x4a, 0xdd, 0xc8, 0x8b, 0xff, 0xa1, 0x00, 0x28, 0x47, 0x5c, - 0xd7, 0x4c, 0x56, 0x82, 0xe7, 0xfa, 0xf3, 0x9b, 0xd9, 0x1b, 0xca, 0x51, 0x87, 0xa0, 0x87, 0xbf, - 0x96, 0xc0, 0xe8, 0x7a, 0xb0, 0x99, 0xce, 0xb2, 0x56, 0xf2, 0x3e, 0xa6, 0xfb, 0x5d, 0xf9, 0xed, - 0x7a, 0xa8, 0xad, 0x02, 0x91, 0x18, 0xd6, 0xc0, 0x20, 0xba, 0x85, 0x7a, 0xd3, 0x90, 0xd7, 0xb7, - 0xd8, 0xee, 0xdf, 0x86, 0x8d, 0xdb, 0xe9, 0x74, 0xc7, 0xcd, 0xc0, 0x35, 0x14, 0x0d, 0x64, 0xe9, - 0xf6, 0x83, 0x2c, 0x5d, 0x5a, 0x6c, 0x13, 0xe8, 0x02, 0x48, 0xd4, 0x9d, 0x87, 0xca, 0x0f, 0xa0, - 0xb8, 0x5e, 0x6e, 0x8f, 0xce, 0xd2, 0x2d, 0x71, 0xb6, 0xd8, 0x5a, 0xc3, 0xfd, 0x0c, 0x65, 0x92, - 0x52, 0x75, 0x8f, 0x85, 0x82, 0x43, 0xea, 0x25, 0xfd, 0x37, 0xd7, 0x80, 0xeb, 0x87, 0xc8, 0xd7, - 0xae, 0xbc, 0xd7, 0xa9, 0x8d, 0x37, 0xc8, 0x8f, 0x76, 0x93, 0x2f, 0xa8, 0x73, 0xc8, 0x1c, 0xaa, - 0x4b, 0x0f, 0x74, 0xb5, 0x28, 0x4d, 0xe6, 0x3e, 0x0f, 0x1f, 0xf3, 0x20, 0x14, 0xe1, 0x92, 0xfb, - 0x82, 0xaa, 0xa7, 0xf8, 0x6d, 0x47, 0xce, 0x21, 0x77, 0x27, 0xf4, 0x29, 0xeb, 0xb6, 0xf1, 0x3b, - 0x64, 0x81, 0x82, 0x46, 0xe5, 0x79, 0xae, 0x12, 0x56, 0x0c, 0xa5, 0x40, 0x0e, 0xad, 0xe1, 0xac, - 0x9a, 0x2b, 0x1e, 0x2a, 0x27, 0x99, 0xa2, 0x07, 0xe1, 0xad, 0x77, 0x21, 0x1c, 0x8f, 0xb0, 0x64, - 0xd6, 0x75, 0xbe, 0x0e, 0x06, 0xe0, 0x3b, 0x49, 0xb9, 0xef, 0xe1, 0xd7, 0x1d, 0x58, 0xa9, 0x42, - 0x6d, 0xcc, 0x62, 0x00, 0x73, 0x15, 0x64, 0x3d, 0x9a, 0x7a, 0x24, 0x86, 0xc2, 0xab, 0xdc, 0x44, - 0xf4, 0xfa, 0x6b, 0x4d, 0x44, 0xb3, 0xd9, 0x06, 0x94, 0xc1, 0x5f, 0xcb, 0xda, 0x5a, 0xb3, 0xb7, - 0x8e, 0x2c, 0x40, 0x51, 0xfc, 0xb5, 0xac, 0xad, 0xc5, 0xff, 0x89, 0x05, 0x5d, 0x33, 0xfe, 0xbe, - 0xc1, 0x48, 0x47, 0x09, 0xfe, 0x6e, 0x67, 0xd4, 0x7e, 0x7f, 0x82, 0x6b, 0xe0, 0xf7, 0x0d, 0x46, - 0x1f, 0x5a, 0x4d, 0xe8, 0x0d, 0xf0, 0x77, 0x3b, 0xa3, 0xa6, 0xa5, 0x76, 0x53, 0x7f, 0xde, 0x60, - 0xd5, 0xd4, 0x42, 0x35, 0xcb, 0x52, 0xad, 0xf4, 0x18, 0x00, 0x5b, 0xbf, 0x31, 0x16, 0x61, 0x5d, - 0xa6, 0x75, 0x85, 0x08, 0x8a, 0x69, 0x70, 0x10, 0x44, 0xb1, 0x78, 0xaa, 0x93, 0xb1, 0x80, 0xba, - 0x7a, 0x22, 0x68, 0xec, 0xe9, 0x1a, 0x11, 0xf2, 0x20, 0x49, 0xd2, 0x48, 0x7d, 0x6b, 0x9b, 0x43, - 0x38, 0x2a, 0x7b, 0xe4, 0xb7, 0x3b, 0xd8, 0xe7, 0xbe, 0xfd, 0xa5, 0xeb, 0x47, 0x3e, 0x5a, 0x19, - 0x4b, 0x1f, 0xc4, 0xf0, 0xc3, 0x1c, 0xfc, 0xc1, 0x8f, 0x77, 0xf8, 0x25, 0x0f, 0xff, 0xab, 0xca, - 0xff, 0x00, 0x30, 0x96, 0xbf, 0x5c, 0xba, 0x22, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0xeb, 0x77, 0xda, 0xb8, + 0x12, 0xff, 0xee, 0xbf, 0x42, 0xf1, 0x87, 0x5d, 0xd8, 0x38, 0x60, 0x20, 0xa4, 0x29, 0xc1, 0xee, + 0x0d, 0x21, 0x4d, 0xd8, 0x6d, 0x1a, 0x0a, 0xe9, 0x3e, 0xce, 0xb9, 0xe7, 0xec, 0x11, 0xb6, 0x00, + 0x25, 0xb6, 0xe5, 0xb5, 0xe5, 0x3c, 0x4e, 0xb7, 0xff, 0xfb, 0x9d, 0x91, 0x1f, 0x80, 0x79, 0xf6, + 0x7e, 0x28, 0xb1, 0x25, 0xcd, 0x68, 0x34, 0x8f, 0xdf, 0xcc, 0xc8, 0xed, 0x1e, 0xf5, 0xef, 0xaf, + 0x1e, 0xfe, 0x1a, 0x5e, 0x93, 0xb9, 0xf4, 0x3d, 0xbb, 0x8b, 0xbf, 0xc4, 0xa3, 0xc1, 0xcc, 0xd2, + 0x59, 0xa0, 0xc3, 0x3b, 0xa3, 0xae, 0xdd, 0xf5, 0x99, 0xa4, 0x24, 0xa0, 0x3e, 0xb3, 0xf4, 0x67, + 0xce, 0x5e, 0x42, 0x11, 0x49, 0x9d, 0x38, 0x22, 0x90, 0x2c, 0x90, 0x96, 0xfe, 0xc2, 0x5d, 0x39, + 0xb7, 0xda, 0xa6, 0xa9, 0xdb, 0x5a, 0xba, 0x54, 0x2b, 0xcd, 0xb9, 0xec, 0x99, 0x3b, 0xec, 0x44, + 0xbd, 0x18, 0x3c, 0xe0, 0x92, 0x53, 0xef, 0x24, 0x76, 0xa8, 0xc7, 0xac, 0x86, 0xe1, 0xd3, 0x57, + 0xee, 0x27, 0x7e, 0xf1, 0x9e, 0xc4, 0x2c, 0x52, 0x2f, 0x74, 0x02, 0xef, 0x81, 0xd0, 0x89, 0x56, + 0xda, 0x3a, 0x13, 0xc8, 0x99, 0xd3, 0x28, 0x66, 0xb0, 0x49, 0x22, 0xa7, 0x27, 0xe7, 0x30, 0x2a, + 0xb9, 0xf4, 0x98, 0x3d, 0x7e, 0x0b, 0x1c, 0x32, 0x66, 0x52, 0xf2, 0x60, 0x16, 0x77, 0xeb, 0xe9, + 0x60, 0x37, 0x76, 0x22, 0x1e, 0x4a, 0x5b, 0x7b, 0xa6, 0x11, 0xf1, 0x84, 0xc3, 0x43, 0xc3, 0xb5, + 0x5c, 0xe1, 0x24, 0x3e, 0x88, 0x69, 0xc0, 0x80, 0x75, 0xd4, 0xb8, 0x98, 0x26, 0x81, 0x23, 0xb9, + 0x08, 0xc8, 0x6c, 0xe0, 0x56, 0x58, 0xf5, 0x5b, 0xc4, 0x64, 0x12, 0x05, 0xc4, 0xad, 0xcd, 0x98, + 0xbc, 0xf6, 0x18, 0x2e, 0xed, 0xbd, 0xa9, 0xa9, 0xef, 0xc5, 0xd2, 0xdb, 0x4a, 0xf5, 0xdb, 0x0b, + 0x0f, 0x5c, 0xf1, 0x52, 0x13, 0x21, 0x0b, 0x2a, 0xfa, 0x5c, 0xca, 0x30, 0xee, 0xd4, 0xeb, 0x4f, + 0x81, 0xa8, 0xbd, 0x78, 0x0c, 0x89, 0xeb, 0x1c, 0xb4, 0x11, 0x4d, 0xa9, 0xc3, 0xe2, 0x7a, 0xe2, + 0x86, 0x27, 0x81, 0x90, 0x7c, 0xca, 0x59, 0x54, 0xd7, 0x97, 0x18, 0xf5, 0xca, 0x8c, 0xea, 0x71, + 0x76, 0x06, 0xdd, 0xd0, 0xff, 0x8e, 0x99, 0x37, 0x5d, 0x5e, 0x4d, 0xdd, 0x47, 0x58, 0x7f, 0x76, + 0xda, 0x3e, 0xb5, 0x2c, 0xb7, 0x36, 0x9e, 0xd6, 0xfa, 0x83, 0xda, 0x33, 0xf5, 0x12, 0xf6, 0xa1, + 0x91, 0x0d, 0x5c, 0x7f, 0x4d, 0x07, 0x7e, 0xfa, 0xa9, 0xb2, 0xf2, 0x6e, 0x99, 0xd5, 0x4e, 0xbb, + 0x7d, 0x76, 0x5e, 0xa2, 0x83, 0x65, 0x66, 0x3e, 0x74, 0xb9, 0x4a, 0x99, 0xbf, 0x5b, 0x8d, 0xaa, + 0x61, 0xee, 0xe3, 0xde, 0xa8, 0x2e, 0x49, 0xe9, 0x09, 0xea, 0xfe, 0x3a, 0xae, 0x30, 0x43, 0x5a, + 0x47, 0x66, 0xf5, 0x9b, 0xc7, 0x24, 0x11, 0x40, 0xef, 0x44, 0x8c, 0x4a, 0x96, 0x69, 0xb4, 0xa2, + 0xa7, 0xa6, 0xd1, 0xab, 0x17, 0xa2, 0x06, 0x47, 0xbe, 0x94, 0x32, 0xe2, 0x93, 0x44, 0x32, 0x98, + 0x88, 0x1c, 0xdd, 0x60, 0x55, 0xa3, 0x3c, 0x2e, 0xdf, 0x42, 0x06, 0x4a, 0x91, 0xec, 0x55, 0xd6, + 0x1f, 0xe9, 0x33, 0xcd, 0x19, 0xac, 0x2d, 0xa4, 0x31, 0xf8, 0x82, 0x6e, 0xc8, 0xaa, 0xe1, 0xd6, + 0x26, 0xc2, 0x7d, 0xab, 0xd1, 0x10, 0x54, 0xeb, 0x5e, 0xcd, 0xb9, 0xe7, 0x56, 0x04, 0xae, 0xa7, + 0xae, 0x7b, 0xfd, 0x0c, 0x52, 0x7c, 0xe2, 0x31, 0x38, 0x2c, 0x8b, 0x2a, 0x3a, 0xca, 0xac, 0x1b, + 0x95, 0xaa, 0x65, 0x7f, 0xbb, 0x61, 0xf2, 0xf7, 0x4a, 0xd5, 0x00, 0x5f, 0xfa, 0x9d, 0x7a, 0x95, + 0xea, 0xf7, 0xcd, 0x04, 0x2c, 0x8a, 0x44, 0x04, 0x72, 0x02, 0x01, 0xb8, 0x7d, 0x2c, 0x3c, 0x56, + 0xf3, 0xc4, 0xac, 0xa2, 0x5f, 0xe3, 0x38, 0xc9, 0xb4, 0x00, 0x76, 0x24, 0x53, 0xee, 0x31, 0x75, + 0x1e, 0xf0, 0xf3, 0x08, 0xce, 0xfd, 0x29, 0x1b, 0x17, 0x53, 0x8c, 0xa5, 0x29, 0x9f, 0x25, 0x11, + 0x55, 0x6a, 0x4b, 0xcf, 0x43, 0xa6, 0x94, 0xa3, 0xff, 0xfc, 0x37, 0x18, 0x04, 0x8e, 0xf0, 0x43, + 0xd0, 0x1e, 0x23, 0x21, 0x9d, 0x31, 0xe2, 0x52, 0x49, 0x8f, 0xc0, 0x1b, 0x96, 0x34, 0xfd, 0xf1, + 0x0a, 0xdc, 0x61, 0x2a, 0xa2, 0xca, 0xa3, 0x65, 0x5e, 0x3c, 0x76, 0xcf, 0x2f, 0x1e, 0x8f, 0x8f, + 0xab, 0xe8, 0xc6, 0xfa, 0x8d, 0x7e, 0x5c, 0x79, 0x3c, 0x06, 0xb3, 0xd4, 0x9c, 0x39, 0x73, 0x9e, + 0x98, 0x6b, 0xa5, 0xc3, 0x63, 0xbd, 0x9a, 0x9a, 0xcc, 0xb6, 0x1f, 0x7f, 0x6a, 0x18, 0x6a, 0x70, + 0xb4, 0x65, 0xed, 0x68, 0x65, 0xed, 0x62, 0xd7, 0x1b, 0xdc, 0x15, 0x23, 0x0a, 0xbc, 0x0a, 0x6c, + 0x6c, 0x1a, 0xc2, 0x82, 0x28, 0x2a, 0x49, 0xc1, 0x8e, 0xad, 0xcd, 0x82, 0xfc, 0x22, 0x0c, 0x99, + 0xcd, 0x8d, 0x36, 0xcc, 0x89, 0x5f, 0xac, 0xe6, 0x45, 0x49, 0x56, 0x8b, 0x19, 0x25, 0x89, 0x2c, + 0xb9, 0x10, 0x67, 0x3c, 0x2c, 0xc4, 0x59, 0xf1, 0xed, 0x94, 0xcb, 0x6b, 0x08, 0x34, 0xb1, 0x7c, + 0x03, 0xfb, 0xb8, 0x3c, 0x0e, 0x3d, 0xfa, 0x66, 0x31, 0xdb, 0xfc, 0xa0, 0x07, 0x22, 0x60, 0x7a, + 0x47, 0x9f, 0x00, 0x08, 0x3c, 0x81, 0x79, 0x6c, 0xb3, 0xf0, 0xe9, 0x61, 0xbe, 0xe9, 0x92, 0xa2, + 0x73, 0x67, 0xf8, 0x16, 0xbf, 0x70, 0xe9, 0xcc, 0x2b, 0x21, 0x62, 0xd0, 0x00, 0xdc, 0x78, 0x85, + 0xa4, 0x5a, 0xfd, 0xe6, 0xd0, 0x98, 0x11, 0x0c, 0xb4, 0xce, 0x8a, 0x2c, 0x16, 0x0e, 0x5d, 0x4c, + 0x20, 0x02, 0x9e, 0x2e, 0xd4, 0x12, 0x8c, 0xe1, 0xd2, 0x12, 0x1c, 0x5a, 0x5e, 0x72, 0x6a, 0x9e, + 0x96, 0xb9, 0xe0, 0xd0, 0x77, 0x3c, 0xaf, 0x81, 0x96, 0x5f, 0x12, 0x0f, 0x24, 0xd3, 0xd1, 0xd1, + 0x3a, 0xba, 0x65, 0x65, 0x70, 0x02, 0x07, 0x53, 0x7e, 0x55, 0x0b, 0x23, 0x21, 0x85, 0x23, 0x3c, + 0x38, 0xa0, 0x42, 0x3c, 0xd3, 0xa8, 0x28, 0x28, 0xb4, 0x70, 0x85, 0x37, 0x96, 0x22, 0x02, 0xef, + 0x42, 0xb0, 0x1b, 0x48, 0xe6, 0x63, 0x24, 0x38, 0x03, 0xd0, 0x59, 0xf5, 0xdf, 0x7f, 0xb3, 0x65, + 0x40, 0xef, 0x87, 0xe0, 0xb8, 0x1f, 0x81, 0x3f, 0xb9, 0x13, 0x2e, 0xab, 0x91, 0xa1, 0xc7, 0x50, + 0x42, 0x86, 0x00, 0x47, 0xfe, 0xf8, 0x74, 0xdd, 0x27, 0x83, 0x21, 0xb8, 0xa6, 0xb1, 0xc2, 0x31, + 0x5e, 0xe5, 0x68, 0x28, 0x6e, 0xd5, 0x2a, 0xae, 0x52, 0xf8, 0x80, 0xec, 0x3f, 0x28, 0xe0, 0x04, + 0xdc, 0xd4, 0x8f, 0xd5, 0x74, 0x47, 0xd7, 0xab, 0xc7, 0x0b, 0x0c, 0xac, 0xc7, 0xb5, 0xc7, 0xf8, + 0x43, 0x68, 0x9d, 0xea, 0xc6, 0x51, 0xa3, 0xfa, 0x5d, 0xeb, 0xd6, 0x33, 0x40, 0xef, 0x2a, 0x8b, + 0xda, 0xff, 0xe1, 0x3e, 0xa6, 0x06, 0x92, 0x44, 0x1e, 0xe0, 0x86, 0x32, 0xb2, 0x13, 0xc7, 0x80, + 0x29, 0xb0, 0x50, 0x2d, 0xe8, 0xd6, 0xd3, 0x54, 0x86, 0x30, 0x00, 0x41, 0x89, 0x3b, 0x5b, 0x3a, + 0x68, 0x0b, 0xd2, 0x06, 0x38, 0xac, 0xaf, 0x11, 0x0e, 0xef, 0xf8, 0xf4, 0x77, 0xac, 0x67, 0xa9, + 0x6e, 0x3c, 0xd5, 0x09, 0x24, 0x9a, 0xb9, 0x80, 0x99, 0x50, 0xc4, 0x90, 0xf2, 0x20, 0xbc, 0x93, + 0x89, 0xcf, 0x21, 0xe5, 0xa0, 0xe7, 0x03, 0xa9, 0xcb, 0x9f, 0x89, 0xe3, 0xd1, 0x38, 0xb6, 0x74, + 0x29, 0x40, 0x3d, 0x2f, 0xd9, 0x98, 0x96, 0x0d, 0xce, 0x99, 0x17, 0xf6, 0x60, 0x0c, 0xe0, 0x48, + 0x82, 0x75, 0x10, 0xb8, 0x2c, 0x3d, 0x7d, 0x41, 0x6e, 0x8e, 0xc7, 0x9d, 0x27, 0x4b, 0xbf, 0x45, + 0x5e, 0x1f, 0xba, 0xf5, 0x74, 0x02, 0x44, 0x05, 0x16, 0x05, 0x8d, 0xb6, 0x85, 0xa8, 0x87, 0x44, + 0x3d, 0xea, 0x3c, 0x2d, 0xe8, 0x56, 0x76, 0x49, 0x25, 0xd5, 0xed, 0x31, 0x7d, 0x66, 0x8b, 0x25, + 0xf3, 0x08, 0x72, 0x74, 0xca, 0x7f, 0xde, 0x4c, 0x53, 0x25, 0xa8, 0x38, 0x09, 0x41, 0x3d, 0x4d, + 0x18, 0x6a, 0xd9, 0xca, 0x86, 0xbd, 0x08, 0xd4, 0x03, 0xae, 0x27, 0x61, 0xb8, 0x65, 0x7f, 0xed, + 0x0f, 0xc9, 0x10, 0x94, 0xdb, 0x21, 0x5d, 0x1e, 0x84, 0x89, 0xcc, 0xd4, 0xf3, 0x75, 0xa8, 0xe7, + 0xc2, 0x05, 0x89, 0x3f, 0x61, 0x11, 0x68, 0x8b, 0x07, 0x96, 0xde, 0x80, 0xbf, 0xf4, 0xd5, 0xd2, + 0xcf, 0xda, 0xed, 0x56, 0x5b, 0xcf, 0xd5, 0xe3, 0xc2, 0x63, 0xc4, 0xfe, 0x49, 0x78, 0xc4, 0xd0, + 0x0a, 0x91, 0xdd, 0x0c, 0xdc, 0x55, 0xae, 0x59, 0x96, 0xff, 0xda, 0xd4, 0xc9, 0xff, 0xcf, 0x55, + 0xfd, 0x5b, 0xe1, 0x07, 0xe0, 0xa1, 0x6c, 0x8b, 0x7f, 0x57, 0xf9, 0x2a, 0xc7, 0x00, 0x1e, 0x29, + 0x18, 0x74, 0x14, 0x0e, 0xd8, 0xab, 0x67, 0x04, 0x9c, 0x49, 0x89, 0x47, 0x6b, 0x67, 0xdd, 0x48, + 0xdd, 0x95, 0x58, 0xb4, 0xe4, 0x73, 0x3e, 0x8d, 0x66, 0x3c, 0xe8, 0x98, 0x84, 0x26, 0x52, 0xe0, + 0x24, 0xc8, 0x26, 0x5d, 0xac, 0x8e, 0xbc, 0x38, 0xa4, 0x70, 0xa8, 0xf7, 0x05, 0x1b, 0xcc, 0x65, + 0x27, 0xd4, 0xe3, 0xb3, 0xa0, 0xe3, 0xa8, 0x60, 0xd2, 0x53, 0xe3, 0xcc, 0x22, 0x91, 0x84, 0x58, + 0xc5, 0xc0, 0xf1, 0xea, 0x8a, 0x5e, 0xf1, 0xb0, 0xd3, 0x11, 0xf8, 0xd7, 0xd0, 0x8a, 0xc7, 0x66, + 0xf1, 0xd4, 0x2a, 0x9e, 0x4e, 0x8b, 0xa7, 0x76, 0xf1, 0x74, 0x56, 0x3c, 0xbd, 0x2b, 0x9e, 0xce, + 0x17, 0x5b, 0x68, 0xf9, 0x1e, 0x63, 0x48, 0x95, 0x9d, 0x62, 0x45, 0xa6, 0x97, 0x54, 0x09, 0x0a, + 0xa5, 0x27, 0xe2, 0x35, 0xd3, 0x4e, 0x23, 0x0f, 0x19, 0x78, 0xb2, 0xcb, 0x14, 0xda, 0x46, 0x92, + 0x66, 0x41, 0xd2, 0x5c, 0x27, 0xd9, 0x48, 0xd1, 0x2a, 0x0a, 0x41, 0x78, 0x3c, 0x8c, 0xe4, 0xb4, + 0xd8, 0xe4, 0xf4, 0x50, 0xb9, 0xda, 0x05, 0x49, 0xfb, 0xc0, 0x4d, 0xce, 0x16, 0x72, 0x9d, 0x1d, + 0x48, 0xf2, 0xae, 0xd8, 0xe4, 0xdd, 0xa1, 0x72, 0x9d, 0x17, 0x24, 0xe7, 0x39, 0xc9, 0xb2, 0x3f, + 0x8c, 0x98, 0xc3, 0xf8, 0x33, 0xeb, 0x1c, 0xc4, 0x6c, 0x54, 0xd8, 0x6b, 0xd4, 0x38, 0x4c, 0xe2, + 0x51, 0xb3, 0x38, 0xe4, 0xe8, 0x40, 0x7b, 0x8d, 0x5a, 0xc5, 0x26, 0xad, 0x03, 0x0f, 0x39, 0x2a, + 0xec, 0x35, 0x3a, 0x3d, 0x70, 0x93, 0xf6, 0x42, 0xae, 0x03, 0xed, 0x35, 0x3a, 0x2b, 0x36, 0x39, + 0x3b, 0x54, 0xae, 0xc2, 0x5e, 0xa3, 0x77, 0x07, 0x6e, 0x72, 0xbe, 0x90, 0x6b, 0xd5, 0x5e, 0x75, + 0x85, 0x10, 0x0a, 0xa7, 0x0a, 0x9b, 0x05, 0xe2, 0x25, 0xa2, 0xe1, 0x36, 0x7e, 0x39, 0x1f, 0xc8, + 0x23, 0xbd, 0x88, 0xcf, 0xe6, 0x32, 0x60, 0x71, 0x6c, 0x74, 0xeb, 0x39, 0xd5, 0x6e, 0xea, 0x8c, + 0xf8, 0x4a, 0xb7, 0xaf, 0x84, 0x27, 0x22, 0x43, 0x5b, 0x23, 0xa4, 0x00, 0xc4, 0xbb, 0x89, 0xff, + 0xd4, 0xed, 0xeb, 0xe9, 0x94, 0x39, 0x32, 0x5e, 0x10, 0x17, 0x38, 0xab, 0x6d, 0xa1, 0x1a, 0xdf, + 0x03, 0x98, 0x8e, 0xd9, 0x0c, 0x6b, 0x7c, 0x22, 0x42, 0x2c, 0x40, 0x62, 0x63, 0xf7, 0x46, 0xe3, + 0x1b, 0xe8, 0x20, 0xc9, 0x44, 0x24, 0x81, 0x1b, 0xe3, 0x06, 0x08, 0x40, 0x24, 0x6d, 0x96, 0xd2, + 0x0a, 0x26, 0xc6, 0x72, 0xda, 0x05, 0xb0, 0x77, 0x24, 0x76, 0x7f, 0xc1, 0x8c, 0x75, 0xc8, 0x6e, + 0xad, 0x8d, 0xfb, 0xba, 0xbd, 0x9d, 0x55, 0x96, 0x30, 0xc3, 0x08, 0x34, 0x4a, 0xa0, 0x58, 0x1f, + 0x8c, 0xf6, 0xf2, 0xeb, 0x2d, 0xf1, 0xbb, 0xf4, 0xd8, 0x2b, 0x5d, 0xe5, 0xda, 0xd9, 0x73, 0xc2, + 0xcb, 0x94, 0x5c, 0x53, 0xf4, 0x43, 0xe8, 0x43, 0x78, 0x18, 0x93, 0xdb, 0x84, 0x65, 0xc7, 0xf9, + 0x31, 0x66, 0xb7, 0xcb, 0xcc, 0xee, 0xa8, 0x13, 0x89, 0x1f, 0xa3, 0xbf, 0xcb, 0xe8, 0x31, 0xc1, + 0x87, 0x50, 0x49, 0x40, 0x7b, 0x06, 0x2d, 0x6f, 0x44, 0x83, 0xd8, 0xe7, 0x71, 0xbc, 0xc2, 0x21, + 0xcb, 0xcd, 0xa3, 0x8d, 0xb9, 0xd9, 0xcc, 0x72, 0x73, 0x0b, 0x1e, 0xb4, 0xdd, 0x99, 0x19, 0x9c, + 0x7e, 0x22, 0x84, 0x2c, 0xa6, 0x88, 0x14, 0x04, 0x9a, 0x32, 0xef, 0x2d, 0x53, 0x40, 0x5c, 0xeb, + 0xd6, 0xb9, 0x2a, 0x44, 0xb4, 0x41, 0x10, 0x4b, 0x1a, 0x38, 0x8c, 0x60, 0xab, 0xa5, 0x0a, 0x91, + 0xeb, 0x40, 0x65, 0x57, 0x9e, 0x4f, 0x78, 0x30, 0xb1, 0xe7, 0x8c, 0x9f, 0x3f, 0x65, 0x67, 0xbc, + 0xa3, 0x4f, 0x8c, 0xc8, 0x39, 0x8f, 0x17, 0xe4, 0x90, 0xba, 0x1d, 0xf1, 0xcc, 0x22, 0x64, 0xba, + 0x8f, 0x0d, 0x9a, 0x1d, 0x24, 0x18, 0x31, 0xea, 0x49, 0xee, 0x33, 0x4d, 0xc9, 0x93, 0x05, 0x30, + 0x41, 0xfd, 0x45, 0xd9, 0xcc, 0x1e, 0x46, 0xa3, 0x7e, 0xae, 0x73, 0xa8, 0x9a, 0x7d, 0xca, 0xa1, + 0xd9, 0xcb, 0x43, 0x24, 0xf0, 0xde, 0xf6, 0x10, 0xdf, 0xdd, 0xeb, 0xcb, 0xaa, 0xd4, 0x3e, 0x33, + 0xf9, 0x22, 0xa2, 0x27, 0xd2, 0xbf, 0xfb, 0x93, 0x28, 0x3a, 0xa5, 0x3b, 0x98, 0x7c, 0x00, 0x72, + 0xe0, 0x15, 0x33, 0x0f, 0x23, 0x25, 0x25, 0xee, 0x0f, 0x54, 0xf1, 0xa8, 0xb4, 0x0c, 0xb6, 0xc7, + 0xd6, 0x41, 0x5d, 0x22, 0x00, 0xcb, 0x34, 0x3a, 0x89, 0x96, 0xb6, 0x16, 0x3a, 0x76, 0x28, 0x10, + 0xf1, 0x8d, 0x5a, 0xab, 0x41, 0x2a, 0xf1, 0xe5, 0xd5, 0xe7, 0x6a, 0xb7, 0x9e, 0x2e, 0x29, 0x96, + 0x66, 0x2b, 0xb1, 0x51, 0xd1, 0xed, 0xcb, 0x48, 0x9e, 0x80, 0x28, 0x6b, 0x8b, 0x72, 0x7e, 0xe0, + 0x15, 0xa9, 0x24, 0xd0, 0x4f, 0xea, 0xf9, 0x13, 0xe0, 0x51, 0x12, 0x4b, 0xe1, 0x13, 0x2c, 0xdb, + 0x17, 0xa4, 0xf5, 0x74, 0x3e, 0x3d, 0x22, 0x56, 0xd2, 0x88, 0xa6, 0xd0, 0xb9, 0xd9, 0xda, 0x86, + 0x0a, 0xf4, 0x7a, 0x78, 0x48, 0xa9, 0xb8, 0x7c, 0xaa, 0x1d, 0xee, 0xa9, 0x8a, 0xe2, 0xbb, 0x04, + 0x8c, 0x88, 0x85, 0xef, 0x1e, 0x4b, 0x5c, 0xe7, 0xa1, 0x33, 0x96, 0x14, 0xbb, 0x8e, 0x00, 0xdc, + 0x00, 0xfa, 0xc0, 0xb2, 0x7c, 0x5f, 0x77, 0x86, 0xcb, 0x59, 0xeb, 0xfd, 0xfb, 0xf7, 0x25, 0x31, + 0xb4, 0xf5, 0x10, 0x51, 0x11, 0x41, 0xae, 0x50, 0x02, 0x22, 0x80, 0x77, 0x97, 0x92, 0x79, 0xc4, + 0xa6, 0x56, 0x71, 0xd3, 0x34, 0xe3, 0x72, 0x9e, 0x4c, 0x6a, 0x8e, 0xf0, 0xeb, 0x9f, 0x98, 0xfb, + 0xf1, 0x35, 0xfd, 0xc5, 0x82, 0x15, 0xea, 0x4f, 0xbc, 0x1f, 0xfb, 0x7b, 0xe2, 0xd1, 0xe0, 0x49, + 0xb7, 0xd5, 0x78, 0xb7, 0x4e, 0xed, 0x23, 0x05, 0x61, 0x4f, 0x3c, 0x44, 0x86, 0x27, 0x62, 0x7a, + 0x12, 0xc3, 0x5e, 0x0c, 0x63, 0x22, 0x85, 0x81, 0x45, 0xdc, 0x6b, 0x5b, 0xce, 0x3f, 0x4e, 0xcf, + 0x8f, 0x9e, 0x17, 0x2b, 0x15, 0x50, 0xd7, 0x45, 0x14, 0x2d, 0x69, 0xa0, 0x7f, 0x59, 0xd6, 0x80, + 0xb6, 0x62, 0xa2, 0x76, 0xc3, 0x2c, 0x29, 0x00, 0x39, 0xfa, 0xd0, 0x5a, 0xae, 0xb9, 0xef, 0x9d, + 0x5e, 0xf6, 0x3e, 0xbc, 0x6f, 0xec, 0xf3, 0x18, 0xc3, 0xd7, 0xdd, 0xe6, 0xa1, 0x50, 0xdf, 0x8c, + 0xa1, 0x7f, 0x04, 0xd4, 0x18, 0xdd, 0xf4, 0xb6, 0x2d, 0x82, 0x8a, 0x46, 0xcb, 0x56, 0xf5, 0x77, + 0x2c, 0x6b, 0xe5, 0x69, 0x70, 0xdb, 0x02, 0x88, 0x05, 0xe5, 0x40, 0xb8, 0x97, 0xb6, 0x6d, 0x11, + 0x94, 0x29, 0x7d, 0xee, 0xfb, 0xd0, 0x2e, 0x1f, 0x93, 0x62, 0xf5, 0xd6, 0x00, 0x03, 0xc9, 0x8a, + 0x45, 0x7f, 0x6c, 0x09, 0x13, 0x4a, 0xb4, 0x55, 0x87, 0xd8, 0x72, 0xf5, 0xc8, 0x30, 0xa2, 0x4f, + 0x5c, 0xff, 0xb5, 0x0e, 0x46, 0x29, 0xb9, 0x46, 0x1a, 0xed, 0x3c, 0x98, 0x0a, 0xf4, 0x0f, 0x4d, + 0x81, 0x08, 0xa0, 0x19, 0xb8, 0x47, 0xd9, 0xa7, 0x1f, 0xf6, 0xc4, 0x9c, 0x69, 0x2e, 0x9b, 0x94, + 0xf8, 0x2a, 0x93, 0x6b, 0x1f, 0x45, 0xe4, 0x20, 0xe0, 0xbd, 0x92, 0x49, 0x51, 0xc3, 0xec, 0x89, + 0xb1, 0x8f, 0x59, 0xaa, 0xcd, 0x6d, 0x5c, 0x40, 0x2c, 0x99, 0x51, 0xdf, 0xa7, 0xc4, 0x11, 0x11, + 0x16, 0x02, 0xa0, 0x8f, 0x7d, 0x98, 0x7b, 0x93, 0x31, 0xca, 0xd1, 0x9b, 0x60, 0x8f, 0x2b, 0xa6, + 0x53, 0xe8, 0x7c, 0x4b, 0xa7, 0xfb, 0xe3, 0x7e, 0xe3, 0xe9, 0x4e, 0x9a, 0xed, 0x76, 0x76, 0x40, + 0xf5, 0xa4, 0x2d, 0x5c, 0x16, 0xd2, 0x40, 0x5a, 0x06, 0xfc, 0x2e, 0x38, 0x9c, 0xf0, 0x12, 0xf2, + 0x26, 0xa6, 0x97, 0x2c, 0x61, 0xf9, 0x89, 0x47, 0x25, 0xcb, 0x0a, 0x85, 0xf4, 0x16, 0x7c, 0x5f, + 0x68, 0x5d, 0x66, 0x19, 0x2b, 0xa5, 0xe1, 0xc1, 0x73, 0x76, 0x7b, 0xa3, 0xa6, 0x4b, 0x27, 0xc5, + 0xae, 0xb1, 0x28, 0x4d, 0x2e, 0x07, 0x4a, 0x44, 0x8f, 0x05, 0x33, 0x39, 0x07, 0x6f, 0x6d, 0xa6, + 0x29, 0xab, 0xe7, 0xbd, 0x05, 0x4f, 0x4a, 0x9a, 0xee, 0xc4, 0xd6, 0xd4, 0x9b, 0x41, 0xee, 0xbe, + 0x3c, 0x3c, 0x10, 0x2c, 0xfc, 0xb0, 0xf4, 0xc0, 0x4b, 0x52, 0x42, 0x3d, 0x0f, 0x6f, 0x21, 0x03, + 0x8c, 0x38, 0xc8, 0xc9, 0xc0, 0x98, 0x45, 0x01, 0xf5, 0xc8, 0x5c, 0xc4, 0x32, 0x56, 0x78, 0xa1, + 0x3d, 0x60, 0xf6, 0xf4, 0xe9, 0x1b, 0xe1, 0x3e, 0xc0, 0x04, 0x2c, 0x9b, 0xa3, 0x4d, 0xe2, 0x10, + 0xea, 0x04, 0x80, 0xbf, 0x40, 0xd5, 0x50, 0x53, 0x35, 0x7a, 0x3d, 0x1e, 0x9e, 0x37, 0xcf, 0xce, + 0x00, 0xb9, 0x26, 0x76, 0x6e, 0x7e, 0x32, 0x61, 0x31, 0x82, 0x5a, 0x0c, 0xee, 0x0c, 0x85, 0x20, + 0xa6, 0x3b, 0x92, 0x40, 0x12, 0x84, 0xbe, 0x39, 0x23, 0x83, 0x97, 0x98, 0x45, 0xa8, 0xa3, 0x98, + 0x50, 0x40, 0x14, 0x82, 0xb6, 0xaa, 0x29, 0xfa, 0x0a, 0x18, 0x0e, 0xe5, 0x91, 0xb0, 0x91, 0xf7, + 0x66, 0x14, 0x92, 0x52, 0xa0, 0x80, 0x67, 0x17, 0x77, 0x44, 0xb1, 0x81, 0x8b, 0xaf, 0xce, 0x85, + 0x9c, 0x51, 0x12, 0x4c, 0xcd, 0x78, 0xbe, 0x6a, 0x9e, 0x37, 0x6f, 0x05, 0x82, 0xbb, 0xb6, 0x41, + 0x8d, 0xa9, 0x16, 0x7b, 0xb7, 0x6b, 0x5a, 0xdc, 0x74, 0xf9, 0xd1, 0x3b, 0xec, 0xf2, 0x23, 0x0b, + 0xe3, 0x73, 0x73, 0xf9, 0xc6, 0x22, 0xc5, 0x39, 0xe5, 0x0c, 0xe4, 0x32, 0x91, 0x73, 0x10, 0xfc, + 0x89, 0x05, 0x0b, 0xa1, 0xb2, 0x1d, 0x7e, 0x5b, 0x15, 0xa4, 0xa5, 0xe7, 0x79, 0xff, 0xca, 0x63, + 0x34, 0x52, 0xa7, 0x53, 0x84, 0x64, 0xca, 0x99, 0xa7, 0x0a, 0x29, 0x37, 0x0d, 0x94, 0x1a, 0x51, + 0x75, 0xc0, 0xa1, 0xb0, 0x30, 0x41, 0x97, 0xd8, 0x00, 0x09, 0x63, 0xbc, 0x17, 0x2a, 0x20, 0x41, + 0x95, 0x64, 0xe8, 0x36, 0xcb, 0x95, 0x18, 0xbe, 0xef, 0xab, 0x59, 0xbe, 0xa4, 0x72, 0xf7, 0x22, + 0x90, 0x35, 0x2a, 0x3b, 0xff, 0xb2, 0xe6, 0xef, 0xc6, 0x07, 0x69, 0xfe, 0xee, 0xcb, 0xf0, 0x7e, + 0xf4, 0xb0, 0x3b, 0xad, 0xac, 0x5d, 0x12, 0x65, 0x65, 0x13, 0xfa, 0x70, 0x2a, 0x35, 0x71, 0x20, + 0x7a, 0xa1, 0xec, 0xe2, 0xd4, 0x03, 0x67, 0x8b, 0xd0, 0xf3, 0xb0, 0x06, 0x83, 0x2c, 0x0e, 0xee, + 0x03, 0xf9, 0x1c, 0xdc, 0x2a, 0xc1, 0xf2, 0x34, 0x73, 0x34, 0xbc, 0x3d, 0x55, 0x8e, 0xf8, 0x99, + 0xe1, 0x92, 0xdc, 0xbb, 0x14, 0xa7, 0x10, 0x36, 0x81, 0x32, 0xcc, 0x25, 0x53, 0x81, 0xc4, 0x02, + 0x26, 0xa2, 0xdc, 0x91, 0x8f, 0xf2, 0x08, 0x80, 0x72, 0x2f, 0x5a, 0x09, 0xe0, 0x4d, 0x0a, 0xf8, + 0xf2, 0x75, 0x7c, 0x3d, 0x5a, 0x51, 0xc2, 0xa9, 0x99, 0x8a, 0x3e, 0xcc, 0xf6, 0x28, 0x29, 0x3b, + 0xdf, 0xba, 0xc0, 0x00, 0x50, 0xce, 0xe5, 0x78, 0x55, 0x8f, 0x67, 0xa7, 0x29, 0x8b, 0x2b, 0x8f, + 0xe3, 0x11, 0x07, 0xfd, 0x8d, 0x18, 0x92, 0x93, 0x5f, 0x0d, 0xfa, 0xa8, 0xcc, 0x75, 0x09, 0x32, + 0x7f, 0x7d, 0x10, 0x21, 0x77, 0x76, 0x71, 0xe8, 0xaf, 0x19, 0x51, 0x25, 0x93, 0x1b, 0xbc, 0xc7, + 0xda, 0x4f, 0x7d, 0xb3, 0x0e, 0x61, 0xa8, 0xf5, 0x61, 0x32, 0x81, 0x5a, 0x7f, 0x5e, 0x6e, 0xd9, + 0xf6, 0xb8, 0x5e, 0xef, 0xae, 0x08, 0x19, 0x6d, 0x6f, 0xdb, 0xf1, 0x63, 0x31, 0xe3, 0xff, 0x23, + 0xe5, 0x86, 0x90, 0x51, 0xfe, 0xb0, 0x12, 0x31, 0x4b, 0x2d, 0x5e, 0x8a, 0xc1, 0x20, 0xcb, 0x5f, + 0x22, 0x21, 0x0e, 0xc5, 0xb8, 0x05, 0xa0, 0x42, 0x37, 0x82, 0x94, 0xe8, 0x42, 0xef, 0x37, 0x18, + 0x2a, 0xe8, 0xc2, 0x11, 0x0f, 0x73, 0x24, 0x49, 0x9d, 0x1b, 0x18, 0xaa, 0xb1, 0x9f, 0x2f, 0xa1, + 0x33, 0x96, 0x3f, 0x23, 0xe2, 0xa9, 0x7c, 0x90, 0x61, 0xed, 0x1c, 0x10, 0x1c, 0x8e, 0x52, 0xd3, + 0xf2, 0xe2, 0x7f, 0x28, 0x00, 0xca, 0x11, 0xd7, 0x53, 0x26, 0x2b, 0xc1, 0x73, 0xfb, 0x69, 0x67, + 0xf6, 0x86, 0x72, 0xd4, 0x26, 0xe8, 0xe1, 0x6f, 0x25, 0x30, 0xba, 0x1d, 0x6c, 0xa6, 0x33, 0xcd, + 0x95, 0xbc, 0x8f, 0xe9, 0x7e, 0x5f, 0x7e, 0xbb, 0x1d, 0xa6, 0x56, 0x81, 0x48, 0x0c, 0x0c, 0x30, + 0x48, 0xda, 0x42, 0xed, 0x34, 0xe4, 0xed, 0x3d, 0xde, 0x0b, 0xdc, 0x07, 0xf5, 0xfb, 0xe9, 0x74, + 0xcf, 0x15, 0xc2, 0x2d, 0x14, 0x0d, 0x64, 0xe9, 0x9a, 0x84, 0x2c, 0xdd, 0x6e, 0x6c, 0x13, 0xe8, + 0x0a, 0x48, 0xd4, 0xe5, 0x88, 0xca, 0x0f, 0xa0, 0xb8, 0x5e, 0x6e, 0x8f, 0xce, 0xd2, 0x75, 0x72, + 0xb6, 0xd8, 0x5c, 0xc3, 0xfd, 0x0c, 0x65, 0xe2, 0x52, 0x75, 0x8f, 0x85, 0x82, 0x4d, 0x6a, 0x25, + 0xfd, 0x37, 0xd6, 0x80, 0xeb, 0x87, 0xc8, 0xd7, 0xee, 0xc6, 0xd7, 0xa9, 0xb5, 0x1d, 0xe4, 0xad, + 0xfd, 0xe4, 0x0b, 0xea, 0x1c, 0x32, 0x87, 0xea, 0x76, 0x04, 0x5d, 0x2d, 0x4c, 0xe2, 0xb9, 0xc7, + 0x83, 0xa7, 0x3c, 0x08, 0x45, 0xb0, 0xe4, 0xbe, 0xa0, 0xea, 0x29, 0x7e, 0x04, 0x92, 0x73, 0xc8, + 0xdd, 0x31, 0x7d, 0xce, 0xba, 0x6d, 0xfc, 0x60, 0x59, 0xa0, 0xa0, 0x56, 0x79, 0x99, 0xab, 0x84, + 0x15, 0x41, 0x29, 0x90, 0x43, 0x6b, 0x30, 0xab, 0xe6, 0x8a, 0x87, 0xca, 0x49, 0x26, 0xe8, 0x41, + 0x78, 0x3d, 0x5e, 0x08, 0xc7, 0x43, 0x2c, 0x99, 0xd3, 0x3a, 0x3f, 0x0d, 0x06, 0xe0, 0x3b, 0x49, + 0xb8, 0xe7, 0xe2, 0x67, 0x20, 0x58, 0xa9, 0x42, 0x6d, 0xcc, 0x22, 0x00, 0x73, 0x15, 0x64, 0x3d, + 0x9a, 0xb8, 0x24, 0x82, 0xc2, 0xab, 0xdc, 0x44, 0xf4, 0xfa, 0x6b, 0x4d, 0x44, 0xa3, 0xd1, 0x06, + 0x94, 0xc1, 0x5f, 0xd3, 0xdc, 0x5a, 0xb3, 0x37, 0x5b, 0x26, 0xa0, 0x28, 0xfe, 0x9a, 0xe6, 0xd6, + 0xe2, 0xff, 0xcc, 0x84, 0xae, 0x19, 0x7f, 0x77, 0x30, 0x4a, 0xa3, 0x04, 0x7f, 0xb7, 0x33, 0x6a, + 0xbf, 0x3b, 0xc3, 0x35, 0xf0, 0xbb, 0x83, 0xd1, 0xfb, 0x66, 0x03, 0x7a, 0x03, 0xfc, 0xdd, 0xce, + 0xa8, 0x61, 0xaa, 0xdd, 0xd4, 0x9f, 0x1d, 0xac, 0x1a, 0xa9, 0x50, 0x8d, 0xb2, 0x54, 0x2b, 0x3d, + 0x06, 0xc0, 0xd6, 0x6f, 0x8c, 0x85, 0x58, 0x97, 0xa5, 0xba, 0x42, 0x04, 0xc5, 0x34, 0x38, 0xf0, + 0xc3, 0x48, 0x3c, 0xd7, 0xc8, 0x58, 0x40, 0x5d, 0x3d, 0x11, 0x34, 0x72, 0xd3, 0x1a, 0x11, 0xf2, + 0x20, 0x89, 0x93, 0x50, 0x7d, 0x94, 0x9b, 0x43, 0x38, 0x2a, 0x7b, 0xe4, 0xb7, 0x3b, 0xd8, 0xe7, + 0xee, 0xfe, 0x24, 0xf6, 0x23, 0x5f, 0xb7, 0xb4, 0xa5, 0x2f, 0x67, 0xf8, 0x05, 0x0f, 0xfe, 0xe0, + 0x57, 0x3e, 0xfc, 0xe4, 0x87, 0xff, 0xa7, 0xe5, 0x7f, 0x3e, 0xc3, 0x8a, 0xee, 0xe3, 0x22, 0x00, + 0x00 }; // Autogenerated from wled00/data/settings_time.htm, do not edit!! -const uint16_t PAGE_settings_time_length = 3302; +const uint16_t PAGE_settings_time_length = 3313; const uint8_t PAGE_settings_time[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x3a, - 0xf2, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0xb8, 0xf1, 0xc5, 0x79, 0x42, 0x5a, 0x48, 0x62, 0x77, 0x43, - 0x48, 0x0b, 0x2d, 0x09, 0x9c, 0x26, 0xbd, 0xec, 0xf6, 0x71, 0x6e, 0x15, 0x5b, 0x49, 0x0c, 0x8e, - 0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x3b, 0x92, 0x1c, 0xe7, 0x85, 0x81, 0xf6, 0xde, 0xfd, - 0xb0, 0xa7, 0xa7, 0xc6, 0x96, 0x46, 0xa3, 0x99, 0xd1, 0xbc, 0x95, 0xe6, 0xd6, 0xd1, 0x59, 0x7b, - 0xf0, 0xaf, 0xf3, 0x0e, 0x9a, 0x88, 0xa9, 0x6f, 0x37, 0xe5, 0x13, 0xf9, 0x84, 0x8d, 0x2d, 0x4c, - 0x19, 0x86, 0x6f, 0x4a, 0x5c, 0xbb, 0x39, 0xa5, 0x82, 0x20, 0x46, 0xa6, 0xd4, 0xc2, 0xd7, 0x1e, - 0x9d, 0x05, 0x3c, 0x14, 0x18, 0x39, 0x9c, 0x09, 0xca, 0x84, 0x85, 0x67, 0x9e, 0x2b, 0x26, 0x56, - 0xad, 0x5c, 0xc6, 0x76, 0x4e, 0x83, 0xe6, 0xd6, 0xe6, 0x5c, 0x7a, 0xed, 0x39, 0xb4, 0xa0, 0x3e, - 0x4c, 0x8f, 0x79, 0xc2, 0x23, 0x7e, 0x21, 0x72, 0x88, 0x4f, 0xad, 0x8a, 0x39, 0x25, 0x37, 0xde, - 0x34, 0x9e, 0xa6, 0xdf, 0x71, 0x44, 0x43, 0xf5, 0x41, 0x86, 0xf0, 0xcd, 0x38, 0x46, 0xb9, 0xb5, - 0xad, 0x13, 0x82, 0x9c, 0x09, 0x09, 0x23, 0x0a, 0x9b, 0xc4, 0x62, 0x54, 0xd8, 0x87, 0x51, 0xe1, - 0x09, 0x9f, 0xda, 0x03, 0x6f, 0x4a, 0x51, 0x9f, 0x0a, 0xe1, 0xb1, 0x71, 0xd4, 0x2c, 0xe9, 0xc1, - 0x66, 0xe4, 0x84, 0x5e, 0x20, 0xec, 0xdc, 0x35, 0x09, 0x91, 0xcf, 0x1d, 0x2f, 0x30, 0x5d, 0xcb, - 0xe5, 0x4e, 0x3c, 0x05, 0x32, 0x4d, 0x18, 0xb0, 0xb6, 0x2a, 0x26, 0xf5, 0xe5, 0x73, 0x1a, 0x59, - 0x5f, 0xf0, 0x7b, 0xc2, 0xb0, 0x89, 0xdf, 0xd2, 0x21, 0x3c, 0xbb, 0x24, 0x84, 0x67, 0x2b, 0x08, - 0xd5, 0xfb, 0x2d, 0x3c, 0xdf, 0xc7, 0x4c, 0x3d, 0x7d, 0x39, 0x1e, 0x8f, 0xe1, 0xd9, 0xa7, 0x01, - 0x3c, 0xcf, 0x1c, 0x01, 0xcf, 0x1e, 0xbf, 0x86, 0xe7, 0x11, 0x75, 0xf0, 0xb7, 0xc6, 0x28, 0x66, - 0x8e, 0xf0, 0x38, 0x43, 0xc7, 0x79, 0xe3, 0x6e, 0xe6, 0x31, 0x97, 0xcf, 0x8a, 0x3c, 0xa0, 0x2c, - 0x8f, 0x27, 0x42, 0x04, 0x51, 0xbd, 0x54, 0xba, 0x62, 0xbc, 0x38, 0xf3, 0xa9, 0x5b, 0x1c, 0xd3, - 0xd2, 0x88, 0x12, 0x11, 0x87, 0x34, 0x2a, 0x45, 0x09, 0xf9, 0xa5, 0x17, 0x02, 0xb8, 0x29, 0xcc, - 0x3f, 0xb1, 0x71, 0x9f, 0x22, 0x3c, 0x5c, 0x47, 0x98, 0x2e, 0x82, 0xcd, 0xff, 0x8c, 0xa8, 0x3f, - 0x5a, 0x86, 0x1e, 0x9f, 0xb8, 0x79, 0x61, 0xdc, 0x85, 0x14, 0xf0, 0x33, 0x24, 0x37, 0x13, 0x1d, - 0x9f, 0x4a, 0xe6, 0x0f, 0x6f, 0xd5, 0xd4, 0x12, 0x68, 0x2f, 0x03, 0x32, 0x3a, 0xbc, 0xed, 0xc1, - 0x41, 0xc0, 0xec, 0x97, 0xf2, 0xb7, 0x05, 0xbc, 0xcf, 0x89, 0xfb, 0xbe, 0x9f, 0x17, 0x26, 0xb5, - 0xb6, 0xca, 0xc6, 0x9d, 0x4f, 0x05, 0x62, 0x96, 0x5b, 0x74, 0x42, 0x60, 0x86, 0x26, 0x4b, 0xf3, - 0x58, 0xcb, 0x1f, 0x1b, 0x0d, 0x56, 0x04, 0x3a, 0x5b, 0x42, 0x84, 0xde, 0x30, 0x16, 0x14, 0x26, - 0x42, 0x07, 0x9b, 0xc2, 0x30, 0xd7, 0xc7, 0xc5, 0x6d, 0x40, 0x81, 0x13, 0x41, 0x6f, 0x44, 0xe9, - 0x92, 0x5c, 0x93, 0x39, 0x82, 0x0d, 0x40, 0x12, 0xdd, 0x32, 0x40, 0x41, 0x0d, 0xd3, 0x2d, 0x0e, - 0xb9, 0x7b, 0x5b, 0x24, 0x01, 0xc8, 0xc3, 0x6d, 0x4f, 0x3c, 0xdf, 0xcd, 0x33, 0x09, 0x4f, 0x5c, - 0xb7, 0x73, 0x0d, 0x54, 0x9c, 0x7a, 0x11, 0x68, 0x25, 0x0d, 0xf3, 0x58, 0xd2, 0x8c, 0xcd, 0xbc, - 0x61, 0xd9, 0x77, 0x87, 0x03, 0x92, 0x37, 0xcc, 0x77, 0x54, 0xfc, 0x01, 0x7f, 0xe2, 0xc0, 0x3d, - 0xe5, 0x0e, 0xbc, 0xb4, 0x23, 0x78, 0xbc, 0x6d, 0xe7, 0x8d, 0xfb, 0x87, 0x11, 0xd0, 0x30, 0xe4, - 0xa0, 0x0f, 0x02, 0x10, 0x80, 0xae, 0x47, 0xdc, 0xa7, 0x45, 0x9f, 0x8f, 0xf3, 0xb8, 0x23, 0xc7, - 0x51, 0x22, 0x15, 0x38, 0x0c, 0x34, 0xf2, 0x7c, 0xaa, 0xf8, 0x03, 0xe5, 0x0e, 0x41, 0x0e, 0xa7, - 0xc9, 0x38, 0x1f, 0x49, 0x03, 0x1a, 0x79, 0xe3, 0x38, 0x24, 0x4a, 0x8c, 0x9a, 0x3f, 0x34, 0x22, - 0x9e, 0x54, 0x86, 0xaf, 0xec, 0x84, 0x39, 0x7c, 0x1a, 0x80, 0x34, 0x29, 0x0a, 0xc8, 0x98, 0x22, - 0x97, 0x08, 0xb2, 0x05, 0x47, 0xba, 0x74, 0x52, 0x7d, 0x50, 0x01, 0x2c, 0x37, 0xa8, 0x63, 0xcb, - 0x4a, 0x74, 0x01, 0x54, 0x59, 0xe1, 0x2b, 0x06, 0x21, 0x17, 0xdc, 0xe1, 0xfe, 0xf6, 0x76, 0x5e, - 0xa9, 0x77, 0xd9, 0xcc, 0x2b, 0xbd, 0xb7, 0x24, 0x84, 0xdf, 0x17, 0x3c, 0x04, 0xac, 0xf2, 0x74, - 0x4f, 0x04, 0x9d, 0x4a, 0x89, 0x38, 0x27, 0x01, 0x36, 0x8c, 0x1f, 0x3f, 0x12, 0x30, 0x58, 0x3f, - 0x0d, 0x80, 0xe0, 0xb7, 0x80, 0x1f, 0x75, 0xb9, 0x4b, 0x8b, 0xe8, 0xdc, 0xa7, 0x24, 0xa2, 0x08, - 0x04, 0x41, 0x43, 0x74, 0x71, 0xda, 0x39, 0x42, 0x27, 0xe7, 0x40, 0x92, 0xb9, 0x82, 0x31, 0x5a, - 0xc5, 0x68, 0x2a, 0x6c, 0x86, 0x21, 0xa1, 0x94, 0x9e, 0x48, 0xf4, 0x6f, 0x94, 0xf6, 0x83, 0xf2, - 0xe3, 0x1d, 0x35, 0x5d, 0xc7, 0xd8, 0xd8, 0x59, 0x28, 0x70, 0x29, 0x2a, 0x5e, 0x46, 0x6f, 0x02, - 0xab, 0x86, 0xcd, 0xad, 0xca, 0x12, 0xbf, 0xf4, 0x26, 0x20, 0xcc, 0x95, 0x9a, 0x66, 0xdc, 0x49, - 0x3b, 0x66, 0x96, 0x54, 0x6b, 0x7c, 0x71, 0x84, 0x77, 0xa8, 0x52, 0x2c, 0x71, 0x0b, 0xe7, 0xe0, - 0x7a, 0x51, 0xe0, 0x93, 0x5b, 0x0b, 0x33, 0xce, 0x28, 0xde, 0xb2, 0xac, 0xb5, 0x89, 0x37, 0x7a, - 0x02, 0xf6, 0x34, 0x45, 0xd1, 0x63, 0x70, 0x9c, 0xc7, 0x83, 0xee, 0x69, 0x02, 0x6e, 0x3d, 0x00, - 0xbe, 0xfd, 0xa2, 0x52, 0xdd, 0xaf, 0x1c, 0xbc, 0x6e, 0xc0, 0x9a, 0xed, 0x17, 0x37, 0xd5, 0xd7, - 0x95, 0x5a, 0x03, 0x2f, 0xa8, 0x92, 0xaa, 0x72, 0xa7, 0x08, 0x71, 0x88, 0x83, 0x8d, 0x35, 0x2a, - 0xc0, 0x9a, 0xf0, 0xd9, 0x29, 0x0c, 0x3b, 0x13, 0xea, 0x5c, 0x51, 0xf7, 0x0d, 0x1e, 0x02, 0xcb, - 0x57, 0x80, 0x4a, 0xed, 0xb7, 0x64, 0xcf, 0x52, 0x0f, 0x15, 0x5b, 0xe0, 0xd1, 0x9a, 0x42, 0x3b, - 0x5e, 0x11, 0xc2, 0xff, 0x89, 0xdd, 0x61, 0x45, 0x70, 0x64, 0x13, 0xf5, 0x7e, 0xcc, 0xe3, 0x30, - 0xfd, 0xe8, 0x7a, 0x0c, 0x6c, 0x20, 0xfd, 0x3c, 0x07, 0xdf, 0x41, 0x45, 0xfa, 0xa9, 0x5f, 0x4a, - 0x12, 0x49, 0x49, 0x23, 0xc4, 0x8d, 0x11, 0x0f, 0xf3, 0x9e, 0x55, 0x6e, 0x78, 0xcd, 0xfd, 0x86, - 0xb7, 0xb3, 0x63, 0xdc, 0xc9, 0x01, 0xb1, 0x63, 0x7d, 0xd7, 0x7b, 0xc1, 0x9e, 0x1e, 0x0b, 0x62, - 0x91, 0x78, 0xfb, 0x8b, 0x97, 0x77, 0xde, 0x3d, 0x46, 0x9e, 0x9b, 0xbe, 0x4a, 0xb3, 0xb4, 0xf0, - 0xc4, 0x73, 0x5d, 0x15, 0x1f, 0x34, 0x70, 0x3a, 0x5f, 0x9e, 0x03, 0x28, 0x6e, 0x87, 0xfc, 0x06, - 0xcb, 0xad, 0x5d, 0xfb, 0x2b, 0xdb, 0x40, 0x7d, 0xac, 0xf1, 0x39, 0x3e, 0x89, 0x22, 0x0b, 0xdf, - 0x44, 0xf3, 0x95, 0x2c, 0x9e, 0x0e, 0x69, 0x88, 0xd1, 0xd4, 0x63, 0x16, 0x06, 0x7c, 0x10, 0x1e, - 0x2c, 0x5c, 0xdd, 0xcb, 0x46, 0xd4, 0xfb, 0x19, 0x44, 0xb5, 0x83, 0x6c, 0x44, 0x83, 0x15, 0x44, - 0x4f, 0x10, 0x54, 0x2b, 0xaf, 0x22, 0x72, 0xbd, 0x6b, 0x25, 0x86, 0xf6, 0xa1, 0xc6, 0xc2, 0x99, - 0xe3, 0x7b, 0xce, 0x15, 0x84, 0xd1, 0x44, 0x69, 0x27, 0x5e, 0x64, 0xca, 0x29, 0x23, 0xdd, 0x01, - 0x8c, 0x06, 0xdb, 0xa9, 0x72, 0x35, 0x4b, 0x80, 0x42, 0xa3, 0x54, 0x47, 0xf6, 0xdd, 0x5c, 0x3a, - 0x15, 0xf0, 0x15, 0x7e, 0x04, 0x78, 0xac, 0xda, 0x62, 0xa7, 0x8b, 0x23, 0xbd, 0x93, 0xd2, 0x37, - 0x0b, 0x27, 0x0a, 0x57, 0x97, 0x6a, 0xd5, 0x18, 0x12, 0xe7, 0x6a, 0x1c, 0xf2, 0x98, 0xb9, 0x05, - 0x58, 0xc9, 0xc3, 0xfa, 0x8b, 0xbd, 0xbd, 0xbd, 0x86, 0x8c, 0xe7, 0xa1, 0xfd, 0x31, 0x66, 0xd2, - 0x41, 0xcd, 0x28, 0xbd, 0x72, 0xc9, 0x6d, 0xa4, 0xf6, 0x01, 0x85, 0x93, 0xd1, 0x36, 0x55, 0xb8, - 0x6e, 0xaa, 0x43, 0x83, 0xf4, 0xed, 0xe2, 0x81, 0xb1, 0xb7, 0xe9, 0x5b, 0x7f, 0xfd, 0x4d, 0xa9, - 0x1d, 0xfc, 0xc7, 0xe6, 0xa5, 0x55, 0x69, 0x5c, 0x82, 0xba, 0x5d, 0x82, 0xba, 0x69, 0x9e, 0xdc, - 0x0d, 0xc5, 0x79, 0x79, 0x77, 0x79, 0x9f, 0xa1, 0x3b, 0xdf, 0x1b, 0xa9, 0x8a, 0x26, 0xaa, 0xac, - 0x48, 0x1d, 0x81, 0x7f, 0x42, 0x4d, 0x88, 0x73, 0xd4, 0x99, 0x1f, 0x60, 0x57, 0x09, 0x04, 0x24, - 0x77, 0x09, 0x0a, 0x7e, 0xd9, 0xac, 0x54, 0x17, 0x5b, 0xf2, 0x40, 0x19, 0xd9, 0x35, 0xf1, 0x63, - 0x00, 0x84, 0xdd, 0x76, 0x2a, 0x00, 0xf9, 0xf2, 0x6e, 0x1a, 0x7d, 0xb9, 0xfc, 0x76, 0xdf, 0x2c, - 0xe9, 0xf9, 0x95, 0xbd, 0x34, 0xea, 0x55, 0x15, 0x39, 0x7a, 0x8e, 0xae, 0x55, 0x12, 0x1d, 0xd9, - 0xad, 0x48, 0x0e, 0xd4, 0x72, 0x1b, 0x09, 0xbe, 0x46, 0xec, 0xf9, 0xdf, 0x40, 0x6c, 0x36, 0xa1, - 0x9d, 0x5f, 0x25, 0xf4, 0x2b, 0xfb, 0x2a, 0xbe, 0x0a, 0xa9, 0x27, 0x1b, 0x0a, 0x79, 0x9f, 0xc8, - 0xe6, 0xb7, 0x87, 0x5d, 0xc5, 0x7e, 0xe2, 0x27, 0xf6, 0x1f, 0x73, 0x12, 0xfb, 0x8f, 0x7b, 0x88, - 0x7e, 0xcc, 0x42, 0x2f, 0xa2, 0xab, 0x8e, 0x02, 0x10, 0x26, 0xa2, 0xa8, 0xd6, 0x6a, 0x1b, 0xc8, - 0xb3, 0xbc, 0xc2, 0xfe, 0x53, 0xdc, 0x17, 0xc0, 0x17, 0x3c, 0xc3, 0x29, 0xec, 0xff, 0x75, 0x8f, - 0xb0, 0x9f, 0xe1, 0x0e, 0xf6, 0x9f, 0xeb, 0x0b, 0x36, 0xbd, 0xc0, 0x6f, 0xa6, 0x3a, 0x88, 0x85, - 0x2f, 0xd8, 0xff, 0x79, 0x47, 0xf0, 0xbf, 0xb3, 0xf9, 0xdf, 0x9e, 0xb4, 0xf9, 0xfd, 0xe7, 0x18, - 0x3c, 0x5e, 0x31, 0xf8, 0x87, 0x74, 0x12, 0x9b, 0xd9, 0xfa, 0x78, 0x90, 0xe8, 0xe3, 0xc1, 0x63, - 0xfa, 0x78, 0xf0, 0xa4, 0x3e, 0xca, 0x80, 0xba, 0xa2, 0x8e, 0x07, 0xbf, 0xa4, 0x8e, 0x07, 0x7f, - 0x93, 0x3a, 0x1e, 0xfc, 0x75, 0x75, 0x3c, 0xc8, 0x50, 0xc7, 0x83, 0xbf, 0x51, 0x1d, 0x0f, 0xfe, - 0xbf, 0xd4, 0xf1, 0xe0, 0x51, 0x75, 0x7c, 0xa6, 0x2a, 0xaa, 0x1c, 0x70, 0xd0, 0x1d, 0x40, 0xb2, - 0xb7, 0x48, 0x2b, 0xc5, 0x22, 0xc3, 0x93, 0xe5, 0xc4, 0xdd, 0x22, 0xff, 0xaa, 0x94, 0x75, 0x02, - 0x26, 0x0b, 0x26, 0x91, 0x64, 0xb2, 0x78, 0xc7, 0x33, 0x8a, 0x4a, 0xbb, 0x94, 0x0d, 0xe8, 0xd0, - 0xa0, 0xc9, 0x4e, 0x01, 0x76, 0x2e, 0xd3, 0x64, 0xd2, 0x12, 0xb6, 0x7d, 0xb9, 0x5d, 0x69, 0xe4, - 0xab, 0xb5, 0xbd, 0x2d, 0x4b, 0x3e, 0xb7, 0x05, 0x64, 0xf0, 0x90, 0xdb, 0x41, 0xd6, 0x5f, 0xd9, - 0x52, 0xc9, 0x67, 0x77, 0x81, 0xf3, 0xc7, 0x8f, 0x64, 0xec, 0x68, 0x65, 0xac, 0xaa, 0x07, 0xcf, - 0x97, 0x07, 0x77, 0x13, 0xc8, 0xce, 0x62, 0xd0, 0x30, 0xb6, 0xb7, 0x13, 0x75, 0x51, 0xb4, 0xb4, - 0x0f, 0xe5, 0x9c, 0xe9, 0x19, 0xf7, 0x0b, 0x16, 0x2f, 0xdc, 0x84, 0x45, 0x62, 0x7d, 0x29, 0x9b, - 0x1b, 0xff, 0xbe, 0x99, 0xab, 0xac, 0x4b, 0xc8, 0x29, 0x94, 0xfc, 0xcb, 0x7c, 0x92, 0x2f, 0xde, - 0xb7, 0x1d, 0xeb, 0x21, 0x6e, 0x7f, 0x9f, 0x9a, 0xd3, 0xdf, 0xad, 0x6a, 0x63, 0x5d, 0x54, 0x96, - 0x5c, 0x72, 0x8f, 0xfb, 0x32, 0x79, 0x77, 0x8b, 0xfd, 0x51, 0xf1, 0x74, 0xf0, 0x51, 0xcf, 0x80, - 0x14, 0x92, 0x81, 0x04, 0xb2, 0x50, 0xf9, 0x3d, 0x90, 0x4d, 0x83, 0xb7, 0x50, 0x8c, 0x88, 0xd5, - 0x39, 0xa8, 0x50, 0x00, 0x69, 0x8a, 0xa2, 0xb7, 0x8e, 0xa2, 0xf7, 0x08, 0x8a, 0xde, 0x1c, 0xc5, - 0x42, 0x12, 0x50, 0x32, 0x7e, 0xe4, 0x33, 0x59, 0xab, 0x98, 0x0c, 0x64, 0xa4, 0x12, 0x7b, 0xa2, - 0xd9, 0x9a, 0x12, 0x27, 0xe4, 0x50, 0xcb, 0x9b, 0xae, 0x45, 0x8a, 0x21, 0x9f, 0x45, 0x45, 0x9f, - 0xb2, 0xb1, 0x98, 0x98, 0x3e, 0x7c, 0x7b, 0xe0, 0x70, 0x42, 0x21, 0x97, 0xba, 0x86, 0xc9, 0xad, - 0x3e, 0x94, 0xb9, 0x6c, 0x5c, 0x94, 0xc9, 0x4e, 0x7b, 0x42, 0xc2, 0x36, 0xd4, 0x61, 0xf9, 0xbc, - 0x00, 0x01, 0xbe, 0xd9, 0xdb, 0xaf, 0xd7, 0x6a, 0xc6, 0x8e, 0x30, 0x1a, 0xf3, 0x36, 0xc6, 0x7a, - 0xc9, 0x2d, 0x5c, 0x28, 0xb7, 0xfd, 0x04, 0x63, 0x9b, 0xfa, 0x7e, 0xbe, 0xbc, 0xac, 0x99, 0xdf, - 0x0f, 0x63, 0x21, 0x80, 0xd2, 0x97, 0x77, 0xe2, 0xbe, 0xfe, 0xdd, 0x5c, 0x01, 0xac, 0xac, 0x00, - 0xae, 0x78, 0xa0, 0x2e, 0x24, 0x2e, 0xfc, 0x7e, 0xdd, 0xf7, 0x2c, 0x7c, 0xd2, 0x86, 0x17, 0x5a, - 0xe4, 0x31, 0x14, 0x96, 0x85, 0xf4, 0xdf, 0xb1, 0x17, 0x52, 0x30, 0xab, 0xd5, 0x1d, 0xab, 0x8f, - 0xec, 0x78, 0xfa, 0xcb, 0x3b, 0xb2, 0x47, 0x76, 0xdc, 0x7d, 0x64, 0xc7, 0xa3, 0x5f, 0xde, 0xd1, - 0x5b, 0xd9, 0x71, 0xa9, 0xab, 0x42, 0x85, 0xea, 0x2c, 0xdc, 0x51, 0x1f, 0x4a, 0xec, 0xa4, 0x58, - 0xdf, 0xec, 0x2b, 0x4c, 0x69, 0x14, 0x41, 0x15, 0xad, 0x3b, 0x0b, 0x69, 0x8f, 0x48, 0x15, 0xf5, - 0x54, 0xb7, 0x89, 0xa6, 0xaa, 0x48, 0x15, 0x45, 0x1e, 0x7a, 0x63, 0x8f, 0x6d, 0x6f, 0x8b, 0xa2, - 0xec, 0x0c, 0x20, 0x60, 0x4c, 0x10, 0xe6, 0x50, 0x3e, 0x42, 0x67, 0xc3, 0x4b, 0xc8, 0x07, 0x37, - 0x74, 0x5f, 0x03, 0x16, 0x7d, 0x22, 0xcc, 0x55, 0x8d, 0x9e, 0x4f, 0x70, 0x96, 0xf6, 0x3f, 0x8c, - 0x7b, 0x59, 0x79, 0xab, 0x86, 0x58, 0xd9, 0x30, 0x1f, 0xec, 0x5b, 0xad, 0xd1, 0x64, 0xe2, 0x3f, - 0x87, 0x3e, 0x61, 0x57, 0xcb, 0x4d, 0xa7, 0x04, 0x9b, 0x30, 0xee, 0x32, 0x8d, 0xae, 0x59, 0x7e, - 0x93, 0x5f, 0xb5, 0x59, 0x0b, 0x0c, 0xd9, 0xfc, 0x09, 0xab, 0xad, 0xaf, 0x2f, 0xef, 0x61, 0x33, - 0xd3, 0x40, 0x17, 0xdb, 0xf5, 0x52, 0xf8, 0x0b, 0x6c, 0xfe, 0x84, 0x85, 0xd7, 0xd7, 0x97, 0x77, - 0xf0, 0x7d, 0x0e, 0x72, 0x70, 0xdd, 0x5e, 0x6c, 0xaa, 0xa0, 0x67, 0xff, 0xc3, 0x9b, 0xca, 0x46, - 0x25, 0x8a, 0x43, 0x3f, 0x8f, 0x75, 0x3f, 0xc0, 0x89, 0xc0, 0xe2, 0x21, 0x92, 0x6a, 0x80, 0x66, - 0x49, 0xd7, 0xf7, 0xb2, 0x5f, 0x05, 0xc1, 0x58, 0xb6, 0x46, 0x80, 0xef, 0xbc, 0x01, 0x21, 0x07, - 0x7c, 0xe2, 0x34, 0xa7, 0xa2, 0x92, 0x7c, 0xfb, 0x13, 0xb4, 0x4d, 0xeb, 0x64, 0x7f, 0x04, 0xfa, - 0x46, 0xc5, 0x84, 0xc3, 0x4c, 0xc0, 0x23, 0x21, 0x83, 0x78, 0x14, 0x0f, 0xa7, 0x9e, 0x00, 0x16, - 0x5c, 0xb5, 0x54, 0x86, 0xdf, 0x44, 0x49, 0x05, 0x0f, 0xc0, 0xb3, 0x24, 0x63, 0xb9, 0x64, 0x70, - 0x42, 0xfd, 0xe0, 0x10, 0xc6, 0x86, 0xda, 0xf0, 0xb5, 0x76, 0xeb, 0x8f, 0xa5, 0x94, 0xe0, 0x58, - 0xe2, 0x7a, 0xd3, 0x2c, 0xe9, 0x89, 0x79, 0x9c, 0x4b, 0xd6, 0xe4, 0x32, 0x16, 0x1d, 0xca, 0x45, - 0x87, 0x10, 0xdd, 0x17, 0xeb, 0x56, 0x76, 0xd1, 0x94, 0x62, 0xbb, 0x4f, 0xae, 0xe9, 0x02, 0x04, - 0xc2, 0x68, 0x2e, 0xc1, 0x3f, 0xa9, 0xea, 0xc6, 0x2d, 0xa4, 0x5b, 0x71, 0x00, 0xe2, 0xa9, 0xda, - 0xef, 0x64, 0x5c, 0x94, 0x43, 0xaa, 0xd2, 0xeb, 0x0d, 0xce, 0x61, 0x2e, 0xbc, 0xa6, 0x61, 0x1d, - 0x25, 0xb6, 0xba, 0x16, 0xad, 0xe7, 0x6d, 0xe2, 0xde, 0x40, 0xb2, 0x18, 0xda, 0x2b, 0x50, 0xb2, - 0x8d, 0x38, 0x97, 0x64, 0xaf, 0xaf, 0x2c, 0x57, 0x3b, 0x5d, 0xa8, 0x7e, 0xaa, 0x1a, 0xfe, 0x53, - 0x44, 0x51, 0x75, 0x6f, 0x82, 0xa4, 0xd8, 0x89, 0xa8, 0xa3, 0x5c, 0xc6, 0x36, 0x1a, 0x49, 0xfb, - 0xad, 0x5e, 0xa5, 0x88, 0xfe, 0x0f, 0xe4, 0x36, 0xf5, 0xb5, 0xfa, 0x6e, 0xf0, 0x19, 0x00, 0x92, - 0x4a, 0x2e, 0x97, 0xe8, 0x0a, 0x38, 0x0a, 0x0d, 0x03, 0xa1, 0x1b, 0xcf, 0xdf, 0xb0, 0xfd, 0xae, - 0x3b, 0xc8, 0x7f, 0x1a, 0xb4, 0x8d, 0xb4, 0xb2, 0x5b, 0xab, 0x00, 0x2b, 0x0a, 0xa4, 0x74, 0xd8, - 0x1f, 0xe4, 0xb2, 0x40, 0x80, 0x87, 0x76, 0x67, 0x50, 0x6a, 0x77, 0xfa, 0x83, 0x2c, 0x90, 0x5d, - 0x6c, 0x77, 0x00, 0xa4, 0xb3, 0x0c, 0x92, 0x5b, 0x83, 0xd9, 0xc3, 0xf6, 0xa7, 0x7e, 0x01, 0x20, - 0x4a, 0x9d, 0xa3, 0x4c, 0x44, 0x35, 0x05, 0xd4, 0x06, 0xa0, 0xf6, 0x51, 0x36, 0xaa, 0x57, 0x0a, - 0xaa, 0x0b, 0x50, 0xdd, 0x6c, 0x54, 0xaf, 0x15, 0x50, 0xeb, 0xf3, 0xc6, 0xfc, 0x5c, 0x62, 0xfb, - 0x0a, 0xe0, 0x1c, 0xb0, 0x9c, 0x67, 0x63, 0x81, 0x7c, 0x19, 0xa8, 0xc9, 0xb7, 0x2e, 0xfa, 0x03, - 0x23, 0x13, 0x53, 0x05, 0xf2, 0xe1, 0xf7, 0x00, 0xf5, 0xe1, 0x21, 0xa0, 0x39, 0x0c, 0x48, 0xba, - 0x25, 0xb9, 0x6f, 0x3d, 0xc4, 0x7e, 0x8a, 0x09, 0x84, 0xdd, 0xfb, 0x0c, 0x50, 0xbd, 0xcf, 0xd9, - 0x34, 0x55, 0x40, 0xdc, 0x3d, 0xf0, 0x01, 0x13, 0xf4, 0x81, 0x43, 0x58, 0xce, 0x46, 0x06, 0x22, - 0x3f, 0xe9, 0x0f, 0x50, 0xfe, 0x84, 0xb9, 0x1e, 0xc9, 0xa6, 0x0c, 0x84, 0xde, 0x6e, 0x15, 0xfa, - 0x24, 0xba, 0x22, 0x02, 0x74, 0x71, 0x46, 0x58, 0xa6, 0xe4, 0x2b, 0x20, 0xfa, 0x56, 0x3b, 0x5b, - 0x11, 0x2a, 0xaf, 0xf5, 0x7c, 0xa9, 0xd5, 0x7e, 0x8c, 0x4b, 0x10, 0xfd, 0xb1, 0x24, 0xec, 0x98, - 0xcc, 0x88, 0xe7, 0x65, 0x53, 0x06, 0xd2, 0xef, 0x9d, 0xfd, 0x01, 0x80, 0x3d, 0x7e, 0xcd, 0x23, - 0x6f, 0xe8, 0x85, 0xd1, 0x95, 0x91, 0x49, 0x5c, 0x15, 0x8e, 0xa1, 0xf5, 0x41, 0x6e, 0xfe, 0xe1, - 0x08, 0xd6, 0xb4, 0x98, 0x33, 0x51, 0x7d, 0xe3, 0x4c, 0xfc, 0x55, 0x38, 0x93, 0xee, 0x3f, 0xe7, - 0xea, 0xb6, 0x64, 0x00, 0x69, 0xdf, 0x43, 0xda, 0xee, 0xa0, 0x8d, 0xf8, 0x68, 0x04, 0xce, 0x23, - 0xf5, 0x0e, 0xda, 0x0a, 0x3f, 0x9d, 0x3d, 0x5c, 0x6c, 0xbd, 0xaa, 0xc9, 0xfb, 0x2a, 0x94, 0x53, - 0x11, 0x3c, 0xf9, 0x48, 0xc3, 0x36, 0x18, 0xa9, 0xc3, 0x99, 0x1b, 0xa1, 0x3c, 0x4c, 0x17, 0x51, - 0x65, 0x1f, 0x4d, 0x78, 0x1c, 0x46, 0x86, 0xdc, 0xa9, 0x1d, 0x87, 0x21, 0x44, 0x6c, 0xa4, 0x7a, - 0xde, 0xda, 0x3f, 0x79, 0x11, 0x98, 0x3e, 0xe4, 0xc5, 0xa9, 0x9f, 0x95, 0xa3, 0x11, 0xb6, 0x63, - 0x76, 0xc5, 0xf8, 0x0c, 0xce, 0x49, 0x4e, 0xda, 0x45, 0xb9, 0xfa, 0x94, 0x08, 0x4f, 0xc4, 0xee, - 0x86, 0xb3, 0x80, 0xf0, 0x85, 0xd7, 0x19, 0xef, 0x61, 0x3b, 0xd7, 0xcb, 0x92, 0x4a, 0x1f, 0xcb, - 0x22, 0x67, 0x43, 0x14, 0xcb, 0xac, 0x9f, 0x0e, 0xd6, 0x59, 0x9f, 0xd3, 0x77, 0xe3, 0xaf, 0xa5, - 0x30, 0xaf, 0x5e, 0x15, 0x5f, 0xc9, 0x82, 0x8d, 0x06, 0x30, 0x56, 0x2c, 0x57, 0xb4, 0x6b, 0x3b, - 0xe5, 0x6c, 0xfc, 0x30, 0xb5, 0xbd, 0x8f, 0x78, 0xe3, 0x60, 0x3b, 0xe0, 0x5e, 0xb2, 0xa8, 0xbd, - 0xc0, 0xb2, 0x74, 0xcb, 0xa0, 0x36, 0x37, 0x47, 0x9a, 0x91, 0x6f, 0x6d, 0x50, 0x5b, 0x91, 0x4d, - 0xa4, 0x75, 0x62, 0x33, 0x02, 0x94, 0x8c, 0xa3, 0x70, 0x54, 0x43, 0xb1, 0x1c, 0xac, 0xe6, 0xb9, - 0x18, 0x56, 0x31, 0x66, 0x7e, 0x63, 0xb2, 0x08, 0x4b, 0x2a, 0x20, 0x79, 0x76, 0x2e, 0x2f, 0x33, - 0x9e, 0x08, 0x31, 0x3a, 0x43, 0x50, 0xf7, 0x99, 0x32, 0x50, 0xdf, 0xa2, 0x19, 0x0f, 0xaf, 0x22, - 0x48, 0xb7, 0xd0, 0x50, 0xa6, 0xee, 0x34, 0x04, 0xc5, 0xf5, 0xe6, 0x41, 0x72, 0x5e, 0xff, 0x46, - 0x31, 0x4b, 0xc9, 0x4f, 0x94, 0x21, 0x8d, 0x73, 0xbb, 0x76, 0x5b, 0x5e, 0x00, 0x40, 0x88, 0xdb, - 0xb5, 0x5b, 0x8c, 0xf8, 0x7c, 0x8c, 0xd4, 0x00, 0xe2, 0x10, 0xdb, 0x64, 0xa1, 0x8c, 0x1e, 0x8d, - 0x3b, 0x67, 0xa7, 0x70, 0x8e, 0xc0, 0xc9, 0x84, 0xb0, 0xb1, 0x0c, 0x43, 0x91, 0x8a, 0xfc, 0x52, - 0x00, 0xf3, 0xcd, 0xe5, 0x2d, 0x84, 0xfd, 0x16, 0xac, 0x50, 0xa0, 0xd3, 0xce, 0xd1, 0x9a, 0x3d, - 0x9c, 0x55, 0x36, 0x94, 0x62, 0x2d, 0x99, 0xad, 0x2d, 0x1b, 0xc2, 0x29, 0x79, 0x18, 0x4b, 0x35, - 0xab, 0xf7, 0x90, 0x7b, 0x00, 0x8b, 0xa4, 0xae, 0x52, 0x9d, 0x3c, 0x84, 0xa7, 0xfb, 0xb3, 0x78, - 0xfa, 0x13, 0x3e, 0x43, 0x35, 0x80, 0x02, 0x72, 0xe1, 0x1c, 0x9e, 0x12, 0x56, 0x4d, 0xcb, 0x26, - 0xd7, 0x9f, 0x1b, 0x34, 0x89, 0x90, 0x08, 0x89, 0xe7, 0x1b, 0x4f, 0xad, 0xec, 0x27, 0x52, 0x55, - 0xa7, 0xd6, 0xe6, 0x31, 0x13, 0x90, 0x02, 0x33, 0x75, 0x11, 0xf6, 0x64, 0x6a, 0xd0, 0xd1, 0x6b, - 0x17, 0xab, 0xde, 0x71, 0xe2, 0xd7, 0xe5, 0xd0, 0x11, 0xa4, 0xcc, 0xf5, 0x6d, 0x36, 0x8c, 0x82, - 0x46, 0x13, 0x7c, 0x43, 0x48, 0x02, 0xbb, 0x5a, 0xce, 0xad, 0xc8, 0xa4, 0xfd, 0xaf, 0xe7, 0xde, - 0x65, 0x1c, 0x1c, 0x2c, 0x09, 0xa7, 0xb0, 0x6a, 0x4d, 0xed, 0x93, 0xe7, 0x36, 0x7f, 0x21, 0x9a, - 0x6d, 0x62, 0x49, 0x90, 0x1c, 0x2d, 0xf9, 0x8c, 0x27, 0x5b, 0xc8, 0x4b, 0x07, 0x55, 0x4a, 0x78, - 0x9b, 0x27, 0x48, 0x09, 0xcb, 0xb9, 0x39, 0xcf, 0xab, 0xbb, 0x1c, 0x3f, 0xfb, 0x16, 0x68, 0x77, - 0x69, 0x93, 0xfa, 0x9a, 0xd8, 0xba, 0x3f, 0x71, 0x05, 0xb4, 0x84, 0x65, 0x4d, 0x6c, 0xfd, 0x5f, - 0xc2, 0xb2, 0xc2, 0xb0, 0x34, 0xf1, 0x5c, 0x57, 0xd6, 0xf8, 0x28, 0x50, 0xf7, 0x71, 0x91, 0xb2, - 0xf5, 0xe6, 0xd0, 0x56, 0x83, 0x11, 0x9a, 0x40, 0x0e, 0x8c, 0xa6, 0x60, 0xee, 0xee, 0x16, 0xf8, - 0x9c, 0x24, 0x57, 0xb5, 0x73, 0xfa, 0xf2, 0x0e, 0xdc, 0x0d, 0x68, 0x38, 0xf1, 0x23, 0x8e, 0x1c, - 0x08, 0x29, 0x43, 0x8a, 0xe2, 0x88, 0xba, 0x08, 0xf4, 0x56, 0xb7, 0x0d, 0xe4, 0x45, 0x42, 0x24, - 0x11, 0x0c, 0x39, 0xe4, 0x16, 0xef, 0xfb, 0x67, 0x3d, 0x44, 0x98, 0x8b, 0x8e, 0x07, 0x90, 0x1f, - 0xb7, 0xce, 0x4f, 0x90, 0xc3, 0xa7, 0x53, 0x18, 0x88, 0x8a, 0x39, 0x89, 0xf7, 0x7d, 0x0c, 0xf6, - 0xab, 0xef, 0x6b, 0xc5, 0x84, 0x26, 0xf4, 0xa0, 0x93, 0x23, 0xc0, 0xeb, 0xf3, 0xd9, 0x96, 0x74, - 0x5d, 0x48, 0xee, 0x2d, 0x73, 0xdf, 0xb2, 0xcc, 0x7c, 0x15, 0x98, 0x4b, 0x47, 0x24, 0xf6, 0x05, - 0x22, 0xba, 0x8c, 0x93, 0xa5, 0x25, 0x54, 0x2b, 0xf2, 0xca, 0x9a, 0x24, 0x28, 0x94, 0xcf, 0x03, - 0xfc, 0x2d, 0x9f, 0xde, 0x10, 0x74, 0xc6, 0x4a, 0x67, 0xa3, 0x11, 0xd2, 0x0c, 0x2c, 0xac, 0x43, - 0x8b, 0xb4, 0x55, 0x4e, 0x45, 0x3a, 0x7d, 0xb2, 0x63, 0xb9, 0xe4, 0x7a, 0x56, 0x0f, 0xa6, 0x55, - 0xf9, 0x25, 0x2c, 0xca, 0xf8, 0x53, 0x3b, 0x2c, 0x9c, 0x81, 0x8b, 0x4d, 0xc9, 0x5c, 0xad, 0xf8, - 0xdb, 0x4f, 0xe3, 0xcf, 0x65, 0x6c, 0x20, 0x35, 0xdc, 0x2d, 0x9c, 0x7a, 0xe3, 0x89, 0x58, 0xde, - 0x21, 0x5a, 0xdf, 0xa2, 0xb7, 0xbc, 0x45, 0xee, 0xa7, 0x78, 0x90, 0x3a, 0x95, 0xb4, 0x6b, 0xf4, - 0xa1, 0x24, 0x3a, 0xa5, 0xda, 0x91, 0x28, 0x97, 0xb4, 0x5a, 0xc1, 0x25, 0x8e, 0x3d, 0x56, 0x2f, - 0x23, 0x12, 0x0b, 0xae, 0x63, 0x5f, 0xd2, 0x6b, 0xb2, 0x57, 0x2e, 0x94, 0x5d, 0x3b, 0x88, 0xa3, - 0x89, 0xc4, 0x1b, 0xcd, 0x3c, 0xc8, 0x26, 0x75, 0x13, 0x13, 0xfe, 0x47, 0x90, 0x8b, 0x09, 0xa5, - 0x38, 0x9c, 0x15, 0xb6, 0xc7, 0xa2, 0x01, 0x39, 0x55, 0x3a, 0xe9, 0x43, 0x3a, 0xa0, 0xa6, 0x46, - 0x23, 0x3d, 0xc7, 0xd2, 0x29, 0x97, 0xc7, 0x40, 0x87, 0x9c, 0xec, 0x95, 0x5a, 0x8b, 0x96, 0x68, - 0x6e, 0x7e, 0xed, 0xdc, 0x14, 0xb2, 0xd0, 0x95, 0x83, 0xf3, 0xbf, 0xba, 0x8d, 0x4a, 0x50, 0x6e, - 0x12, 0xd2, 0x91, 0xf5, 0xf8, 0x8f, 0x61, 0x34, 0x0f, 0xa5, 0x17, 0x44, 0x45, 0xcb, 0xc2, 0x3c, - 0xb4, 0x0b, 0xe0, 0x56, 0xfe, 0xfa, 0x27, 0xe9, 0x3b, 0xd8, 0xb9, 0x24, 0x9a, 0x26, 0x72, 0x4a, - 0x0a, 0x49, 0xa2, 0x64, 0x27, 0x8f, 0xa8, 0x20, 0x7f, 0x94, 0x14, 0x72, 0x1f, 0xd0, 0xaf, 0x1a, - 0xa6, 0x2a, 0x91, 0xd7, 0xba, 0xd5, 0x1e, 0xf3, 0x3d, 0x46, 0x0b, 0xfa, 0xae, 0x7e, 0x2e, 0x67, - 0x29, 0x50, 0xd9, 0xdf, 0x9d, 0xb7, 0xb6, 0xe1, 0xd0, 0xf4, 0x6f, 0x9a, 0xea, 0xbb, 0xbb, 0xe5, - 0x40, 0xf7, 0x8b, 0x15, 0x63, 0x69, 0xb0, 0x0f, 0x9f, 0x2a, 0xb6, 0xb3, 0xeb, 0xe6, 0xdc, 0x63, - 0x85, 0x73, 0x49, 0x16, 0xa9, 0xf0, 0x27, 0x11, 0xa7, 0xfa, 0xed, 0xd6, 0x7f, 0x01, 0x73, 0x2d, - 0x5b, 0xb4, 0xcb, 0x25, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38, + 0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x98, 0x78, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0xdd, 0x10, + 0xd2, 0x42, 0x4b, 0x02, 0x67, 0x92, 0x0e, 0xbb, 0xd3, 0xf6, 0x4c, 0x15, 0x5b, 0x49, 0x0c, 0x8e, + 0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x7b, 0x25, 0x39, 0xce, 0xd3, 0xd0, 0x76, 0x66, 0x3f, + 0xec, 0xe9, 0xa9, 0xb1, 0xa5, 0xab, 0xab, 0x7b, 0xaf, 0xee, 0x5b, 0x69, 0xee, 0x9c, 0x5c, 0xb4, + 0x07, 0xff, 0xba, 0xec, 0xa0, 0x89, 0x98, 0xfa, 0x76, 0x53, 0x3e, 0x91, 0x4f, 0xd8, 0xd8, 0xc2, + 0x94, 0x61, 0xf8, 0xa6, 0xc4, 0xb5, 0x9b, 0x53, 0x2a, 0x08, 0x62, 0x64, 0x4a, 0x2d, 0x7c, 0xeb, + 0xd1, 0x59, 0xc0, 0x43, 0x81, 0x91, 0xc3, 0x99, 0xa0, 0x4c, 0x58, 0x78, 0xe6, 0xb9, 0x62, 0x62, + 0xd5, 0xca, 0x65, 0x6c, 0xe7, 0x34, 0x68, 0x6e, 0x6d, 0xce, 0xa5, 0xb7, 0x9e, 0x43, 0x0b, 0xea, + 0xc3, 0xf4, 0x98, 0x27, 0x3c, 0xe2, 0x17, 0x22, 0x87, 0xf8, 0xd4, 0xaa, 0x98, 0x53, 0x72, 0xe7, + 0x4d, 0xe3, 0x69, 0xfa, 0x1d, 0x47, 0x34, 0x54, 0x1f, 0x64, 0x08, 0xdf, 0x8c, 0x63, 0x94, 0x5b, + 0xdb, 0x3a, 0x21, 0xc8, 0x99, 0x90, 0x30, 0xa2, 0xb0, 0x49, 0x2c, 0x46, 0x85, 0x43, 0x18, 0x15, + 0x9e, 0xf0, 0xa9, 0x3d, 0xf0, 0xa6, 0x14, 0xf5, 0xa9, 0x10, 0x1e, 0x1b, 0x47, 0xcd, 0x92, 0x1e, + 0x6c, 0x46, 0x4e, 0xe8, 0x05, 0xc2, 0xce, 0xdd, 0x92, 0x10, 0xf9, 0xdc, 0xf1, 0x02, 0xd3, 0xb5, + 0x5c, 0xee, 0xc4, 0x53, 0x20, 0xd3, 0x84, 0x01, 0x6b, 0xa7, 0x62, 0x52, 0x5f, 0x3e, 0xa7, 0x91, + 0xf5, 0x09, 0xbf, 0x27, 0x0c, 0x9b, 0xf8, 0x2d, 0x1d, 0xc2, 0xb3, 0x4b, 0x42, 0x78, 0xb6, 0x82, + 0x50, 0xbd, 0xdf, 0xc3, 0xf3, 0x7d, 0xcc, 0xd4, 0xd3, 0x97, 0xe3, 0xf1, 0x18, 0x9e, 0x7d, 0x1a, + 0xc0, 0xf3, 0xc2, 0x11, 0xf0, 0xec, 0xf1, 0x5b, 0x78, 0x9e, 0x50, 0x07, 0x7f, 0x69, 0x8c, 0x62, + 0xe6, 0x08, 0x8f, 0x33, 0x74, 0x9a, 0x37, 0x1e, 0x66, 0x1e, 0x73, 0xf9, 0xac, 0xc8, 0x03, 0xca, + 0xf2, 0x78, 0x22, 0x44, 0x10, 0xd5, 0x4b, 0xa5, 0x1b, 0xc6, 0x8b, 0x33, 0x9f, 0xba, 0xc5, 0x31, + 0x2d, 0x8d, 0x28, 0x11, 0x71, 0x48, 0xa3, 0x52, 0x94, 0x90, 0x5f, 0x7a, 0x21, 0x80, 0x9b, 0xc2, + 0xfc, 0x13, 0x1b, 0x8f, 0x29, 0xc2, 0xe3, 0x75, 0x84, 0xe9, 0x22, 0xd8, 0xfc, 0xcf, 0x88, 0xfa, + 0xa3, 0x65, 0xe8, 0xf1, 0x99, 0x9b, 0x17, 0xc6, 0x43, 0x48, 0x01, 0x3f, 0x43, 0x72, 0x33, 0xd1, + 0xf1, 0xa9, 0x64, 0xfe, 0xf8, 0x5e, 0x4d, 0x2d, 0x81, 0xf6, 0x32, 0x20, 0xa3, 0xe3, 0xfb, 0x1e, + 0x1c, 0x04, 0xcc, 0x7e, 0x2a, 0x7f, 0x59, 0xc0, 0xfb, 0x9c, 0xb8, 0xef, 0xfb, 0x79, 0x61, 0x52, + 0x6b, 0xa7, 0x6c, 0x3c, 0xf8, 0x54, 0x20, 0x66, 0xb9, 0x45, 0x27, 0x04, 0x66, 0x68, 0xb2, 0x34, + 0x8f, 0xb5, 0xfc, 0xb1, 0xd1, 0x60, 0x45, 0xa0, 0xb3, 0x25, 0x44, 0xe8, 0x0d, 0x63, 0x41, 0x61, + 0x22, 0x74, 0xb0, 0x29, 0x0c, 0x73, 0x7d, 0x5c, 0xdc, 0x07, 0x14, 0x38, 0x11, 0xf4, 0x4e, 0x94, + 0xae, 0xc9, 0x2d, 0x99, 0x23, 0xd8, 0x00, 0x24, 0xd1, 0x3d, 0x03, 0x14, 0xd4, 0x30, 0xdd, 0xe2, + 0x90, 0xbb, 0xf7, 0x45, 0x12, 0x80, 0x3c, 0xdc, 0xf6, 0xc4, 0xf3, 0xdd, 0x3c, 0x93, 0xf0, 0xc4, + 0x75, 0x3b, 0xb7, 0x40, 0xc5, 0xb9, 0x17, 0x81, 0x56, 0xd2, 0x30, 0x8f, 0x25, 0xcd, 0xd8, 0xcc, + 0x1b, 0x96, 0xfd, 0x70, 0x3c, 0x20, 0x79, 0xc3, 0x7c, 0x47, 0xc5, 0xef, 0xf0, 0x27, 0x0e, 0xdc, + 0x73, 0xee, 0xc0, 0x4b, 0x3b, 0x82, 0xc7, 0xdb, 0x76, 0xde, 0x78, 0xdc, 0x8e, 0x80, 0x86, 0x21, + 0x07, 0x7d, 0x10, 0x80, 0x00, 0x74, 0x3d, 0xe2, 0x3e, 0x2d, 0xfa, 0x7c, 0x9c, 0xc7, 0x1d, 0x39, + 0x8e, 0x12, 0xa9, 0xc0, 0x61, 0xa0, 0x91, 0xe7, 0x53, 0xc5, 0x1f, 0x28, 0x77, 0x08, 0x72, 0x38, + 0x4f, 0xc6, 0xf9, 0x48, 0x1a, 0xd0, 0xc8, 0x1b, 0xc7, 0x21, 0x51, 0x62, 0xd4, 0xfc, 0xa1, 0x11, + 0xf1, 0xa4, 0x32, 0x7c, 0x66, 0x67, 0xcc, 0xe1, 0xd3, 0x00, 0xa4, 0x49, 0x51, 0x40, 0xc6, 0x14, + 0xb9, 0x44, 0x90, 0x1d, 0x38, 0xd2, 0xa5, 0x93, 0xea, 0x83, 0x0a, 0x60, 0xb9, 0x41, 0x1d, 0x5b, + 0x56, 0xa2, 0x0b, 0xa0, 0xca, 0x0a, 0x5f, 0x31, 0x08, 0xb9, 0xe0, 0x0e, 0xf7, 0x77, 0x77, 0xf3, + 0x4a, 0xbd, 0xcb, 0x66, 0x5e, 0xe9, 0xbd, 0x25, 0x21, 0xfc, 0xbe, 0xe0, 0x21, 0x60, 0x95, 0xa7, + 0x7b, 0x26, 0xe8, 0x54, 0x4a, 0xc4, 0x39, 0x0b, 0xb0, 0x61, 0x7c, 0xfb, 0x96, 0x80, 0xc1, 0xfa, + 0x69, 0x00, 0x04, 0xbf, 0x05, 0xfc, 0xa8, 0xcb, 0x5d, 0x5a, 0x44, 0x97, 0x3e, 0x25, 0x11, 0x45, + 0x20, 0x08, 0x1a, 0xa2, 0xab, 0xf3, 0xce, 0x09, 0x3a, 0xbb, 0x04, 0x92, 0xcc, 0x15, 0x8c, 0xd1, + 0x2a, 0x46, 0x53, 0x61, 0x33, 0x0c, 0x09, 0xa5, 0xf4, 0x44, 0xa2, 0x7f, 0xa3, 0xb4, 0x1f, 0x94, + 0x1f, 0xef, 0xa9, 0xe9, 0x3a, 0xc6, 0xc6, 0xde, 0x42, 0x81, 0x4b, 0x51, 0xf1, 0x3a, 0x7a, 0x13, + 0x58, 0x35, 0x6c, 0xee, 0x54, 0x96, 0xf8, 0xa5, 0x77, 0x01, 0x61, 0xae, 0xd4, 0x34, 0xe3, 0x41, + 0xda, 0x31, 0xb3, 0xa4, 0x5a, 0xe3, 0xab, 0x13, 0xbc, 0x47, 0x95, 0x62, 0x89, 0x7b, 0x38, 0x07, + 0xd7, 0x8b, 0x02, 0x9f, 0xdc, 0x5b, 0x98, 0x71, 0x46, 0xf1, 0x8e, 0x65, 0xad, 0x4d, 0xbc, 0xd1, + 0x13, 0xb0, 0xa7, 0x29, 0x8a, 0x1e, 0x83, 0xe3, 0x3c, 0x1d, 0x74, 0xcf, 0x13, 0x70, 0x6b, 0x0b, + 0xf8, 0xee, 0x8b, 0x4a, 0xf5, 0xb0, 0x72, 0xf4, 0xba, 0x01, 0x6b, 0x76, 0x5f, 0xdc, 0x55, 0x5f, + 0x57, 0x6a, 0x0d, 0xbc, 0xa0, 0x4a, 0xaa, 0xca, 0x83, 0x22, 0xc4, 0x21, 0x0e, 0x36, 0xd6, 0xa8, + 0x00, 0x6b, 0xc2, 0x17, 0xe7, 0x30, 0xec, 0x4c, 0xa8, 0x73, 0x43, 0xdd, 0x37, 0x78, 0x08, 0x2c, + 0xdf, 0x00, 0x2a, 0xb5, 0xdf, 0x92, 0x3d, 0x4b, 0x3d, 0x54, 0x6c, 0x81, 0x47, 0x6b, 0x0a, 0xed, + 0x78, 0x45, 0x08, 0xff, 0x27, 0x76, 0x87, 0x15, 0xc1, 0x91, 0x4d, 0xd4, 0xfb, 0x29, 0x8f, 0xc3, + 0xf4, 0xa3, 0xeb, 0x31, 0xb0, 0x81, 0xf4, 0xf3, 0x12, 0x7c, 0x07, 0x15, 0xe9, 0xa7, 0x7e, 0x29, + 0x49, 0x24, 0x25, 0x8d, 0x10, 0x37, 0x46, 0x3c, 0xcc, 0x7b, 0x56, 0xb9, 0xe1, 0x35, 0x0f, 0x1b, + 0xde, 0xde, 0x9e, 0xf1, 0x20, 0x07, 0xc4, 0x9e, 0xf5, 0x55, 0xef, 0x05, 0x7b, 0x7a, 0x2c, 0x88, + 0x45, 0xe2, 0xed, 0xaf, 0x5e, 0x3e, 0x78, 0x8f, 0x18, 0x79, 0x6e, 0xfa, 0x2a, 0xcd, 0xd2, 0xc2, + 0x13, 0xcf, 0x75, 0x55, 0x7c, 0xd0, 0xc0, 0xe9, 0x7c, 0x79, 0x0e, 0xa0, 0xb8, 0x1d, 0xf2, 0x3b, + 0x2c, 0xb7, 0x76, 0xed, 0xcf, 0x6c, 0x03, 0xf5, 0xa9, 0xc6, 0xe7, 0xf8, 0x24, 0x8a, 0x2c, 0x7c, + 0x17, 0xcd, 0x57, 0xb2, 0x78, 0x3a, 0xa4, 0x21, 0x46, 0x53, 0x8f, 0x59, 0x18, 0xf0, 0x41, 0x78, + 0xb0, 0x70, 0xf5, 0x20, 0x1b, 0x51, 0xef, 0x47, 0x10, 0xd5, 0x8e, 0xb2, 0x11, 0x0d, 0x56, 0x10, + 0x3d, 0x43, 0x50, 0xad, 0xbc, 0x8a, 0xc8, 0xf5, 0x6e, 0x95, 0x18, 0xda, 0xc7, 0x1a, 0x0b, 0x67, + 0x8e, 0xef, 0x39, 0x37, 0x10, 0x46, 0x13, 0xa5, 0x9d, 0x78, 0x91, 0x29, 0xa7, 0x8c, 0x74, 0x07, + 0x30, 0x1a, 0x6c, 0xa7, 0xca, 0xd5, 0x2c, 0x01, 0x0a, 0x8d, 0x52, 0x1d, 0xd9, 0x57, 0x73, 0xe9, + 0x54, 0xc0, 0x57, 0xf8, 0x11, 0xe0, 0xb1, 0x6a, 0x8b, 0x9d, 0xae, 0x4e, 0xf4, 0x4e, 0x4a, 0xdf, + 0x2c, 0x9c, 0x28, 0x5c, 0x5d, 0xaa, 0x55, 0x63, 0x48, 0x9c, 0x9b, 0x71, 0xc8, 0x63, 0xe6, 0x16, + 0x60, 0x25, 0x0f, 0xeb, 0x2f, 0x0e, 0x0e, 0x0e, 0x1a, 0x32, 0x9e, 0x87, 0xf6, 0x6f, 0x31, 0x93, + 0x0e, 0x6a, 0x46, 0xe9, 0x8d, 0x4b, 0xee, 0x23, 0xb5, 0x0f, 0x28, 0x9c, 0x8c, 0xb6, 0xa9, 0xc2, + 0x75, 0x53, 0x1d, 0x1a, 0xa4, 0x6f, 0x57, 0x5b, 0xc6, 0xde, 0xa6, 0x6f, 0xfd, 0xf5, 0x37, 0xa5, + 0x76, 0xf0, 0x1f, 0x9b, 0xd7, 0x56, 0xa5, 0x71, 0x0d, 0xea, 0x76, 0x0d, 0xea, 0xa6, 0x79, 0x72, + 0x37, 0x14, 0xe7, 0xe5, 0xc3, 0xf5, 0x63, 0x86, 0xee, 0x7c, 0x6d, 0xa4, 0x2a, 0x9a, 0xa8, 0xb2, + 0x22, 0x75, 0x04, 0xfe, 0x09, 0x35, 0x21, 0xce, 0x51, 0x67, 0x7e, 0x80, 0x5d, 0x25, 0x10, 0x90, + 0xdc, 0x35, 0x28, 0xf8, 0x75, 0xb3, 0x52, 0x5d, 0x6c, 0xc9, 0x03, 0x65, 0x64, 0xb7, 0xc4, 0x8f, + 0x01, 0x10, 0x76, 0xdb, 0xab, 0x00, 0xe4, 0xcb, 0x87, 0x69, 0xf4, 0xe9, 0xfa, 0xcb, 0x63, 0xb3, + 0xa4, 0xe7, 0x57, 0xf6, 0xd2, 0xa8, 0x57, 0x55, 0xe4, 0xe4, 0x7b, 0x74, 0xad, 0x92, 0xe8, 0xc8, + 0x7e, 0x45, 0x72, 0xa0, 0x96, 0xdb, 0x48, 0xf0, 0x35, 0x62, 0x2f, 0xff, 0x06, 0x62, 0xb3, 0x09, + 0xed, 0xfc, 0x2c, 0xa1, 0x9f, 0xd9, 0x67, 0xf1, 0x59, 0x48, 0x3d, 0xd9, 0x50, 0xc8, 0xc7, 0x44, + 0x36, 0xbf, 0x6c, 0x77, 0x15, 0x87, 0x89, 0x9f, 0x38, 0x7c, 0xca, 0x49, 0x1c, 0x3e, 0xed, 0x21, + 0xfa, 0x31, 0x0b, 0xbd, 0x88, 0xae, 0x3a, 0x0a, 0x40, 0x98, 0x88, 0xa2, 0x5a, 0xab, 0x6d, 0x20, + 0xcf, 0xf2, 0x0a, 0x87, 0xcf, 0x71, 0x5f, 0x00, 0x5f, 0xf0, 0x1d, 0x4e, 0xe1, 0xf0, 0xaf, 0x7b, + 0x84, 0xc3, 0x0c, 0x77, 0x70, 0xf8, 0xbd, 0xbe, 0x60, 0xd3, 0x0b, 0xfc, 0x62, 0xaa, 0x83, 0x58, + 0xf8, 0x82, 0xc3, 0x1f, 0x77, 0x04, 0xff, 0x3b, 0x9b, 0xff, 0xe5, 0x59, 0x9b, 0x3f, 0xfc, 0x1e, + 0x83, 0xc7, 0x2b, 0x06, 0xbf, 0x4d, 0x27, 0xb1, 0x99, 0xad, 0x8f, 0x47, 0x89, 0x3e, 0x1e, 0x3d, + 0xa5, 0x8f, 0x47, 0xcf, 0xea, 0xa3, 0x0c, 0xa8, 0x2b, 0xea, 0x78, 0xf4, 0x53, 0xea, 0x78, 0xf4, + 0x37, 0xa9, 0xe3, 0xd1, 0x5f, 0x57, 0xc7, 0xa3, 0x0c, 0x75, 0x3c, 0xfa, 0x1b, 0xd5, 0xf1, 0xe8, + 0xff, 0x4b, 0x1d, 0x8f, 0x9e, 0x54, 0xc7, 0xef, 0x54, 0x45, 0x95, 0x03, 0x0e, 0xba, 0x03, 0x48, + 0xf6, 0x16, 0x69, 0xa5, 0x58, 0x64, 0x78, 0xb2, 0x9c, 0x78, 0x58, 0xe4, 0x5f, 0x95, 0xb2, 0x4e, + 0xc0, 0x64, 0xc1, 0x24, 0x92, 0x4c, 0x16, 0xef, 0x79, 0x46, 0x51, 0x69, 0x97, 0xb2, 0x01, 0x1d, + 0x1a, 0x34, 0xd9, 0x29, 0xc0, 0xde, 0x75, 0x9a, 0x4c, 0x5a, 0xc2, 0xb6, 0xaf, 0x77, 0x2b, 0x8d, + 0x7c, 0xb5, 0x76, 0xb0, 0x63, 0xc9, 0xe7, 0xae, 0x80, 0x0c, 0x1e, 0x72, 0x3b, 0xc8, 0xfa, 0x2b, + 0x3b, 0x2a, 0xf9, 0xec, 0x2e, 0x70, 0x7e, 0xfb, 0x96, 0x8c, 0x9d, 0xac, 0x8c, 0x55, 0xf5, 0xe0, + 0xe5, 0xf2, 0xe0, 0x7e, 0x02, 0xd9, 0x59, 0x0c, 0x1a, 0xc6, 0xee, 0x6e, 0xa2, 0x2e, 0x8a, 0x96, + 0xf6, 0xb1, 0x9c, 0x33, 0x3d, 0xe3, 0x71, 0xc1, 0xe2, 0x95, 0x9b, 0xb0, 0x48, 0xac, 0x4f, 0x65, + 0x73, 0xe3, 0xdf, 0x17, 0x73, 0x95, 0x75, 0x09, 0x39, 0x85, 0x92, 0x7f, 0x99, 0x4f, 0xf2, 0xc9, + 0xfb, 0xb2, 0x67, 0x6d, 0xe3, 0xf6, 0xd7, 0xa9, 0x39, 0xfd, 0xd5, 0xaa, 0x36, 0xd6, 0x45, 0x65, + 0xc9, 0x25, 0x8f, 0xb8, 0x2f, 0x93, 0x77, 0xb7, 0xd8, 0x1f, 0x15, 0xcf, 0x07, 0xbf, 0xe9, 0x19, + 0x90, 0x42, 0x32, 0x90, 0x40, 0x16, 0x2a, 0xbf, 0x06, 0xb2, 0x69, 0xf0, 0x16, 0x8a, 0x11, 0xb1, + 0x3a, 0x07, 0x15, 0x0a, 0x20, 0x4d, 0x51, 0xf4, 0xd6, 0x51, 0xf4, 0x9e, 0x40, 0xd1, 0x9b, 0xa3, + 0x58, 0x48, 0x02, 0x4a, 0xc6, 0xdf, 0xf8, 0x4c, 0xd6, 0x2a, 0x26, 0x03, 0x19, 0xa9, 0xc4, 0x9e, + 0x68, 0xb6, 0xa6, 0xc4, 0x09, 0x39, 0xd4, 0xf2, 0xa6, 0x6b, 0x91, 0x62, 0xc8, 0x67, 0x51, 0xd1, + 0xa7, 0x6c, 0x2c, 0x26, 0xa6, 0x0f, 0xdf, 0x1e, 0x38, 0x9c, 0x50, 0xc8, 0xa5, 0xae, 0x61, 0x72, + 0xab, 0x0f, 0x65, 0x2e, 0x1b, 0x17, 0x65, 0xb2, 0xd3, 0x9e, 0x90, 0xb0, 0x0d, 0x75, 0x58, 0x3e, + 0x2f, 0x40, 0x80, 0x6f, 0x0e, 0x0e, 0xeb, 0xb5, 0x9a, 0xb1, 0x27, 0x8c, 0xc6, 0xbc, 0x8d, 0xb1, + 0x5e, 0x72, 0x0b, 0x17, 0xca, 0x6d, 0x3f, 0xc1, 0xd8, 0xa6, 0xbe, 0x9f, 0x2f, 0x2f, 0x6b, 0xe6, + 0xd7, 0xe3, 0x58, 0x08, 0xa0, 0xf4, 0xe5, 0x83, 0x78, 0xac, 0x7f, 0x35, 0x57, 0x00, 0x2b, 0x2b, + 0x80, 0x2b, 0x1e, 0xa8, 0x0b, 0x89, 0x0b, 0x7f, 0x5c, 0xf7, 0x3d, 0x0b, 0x9f, 0xb4, 0xe1, 0x85, + 0x16, 0x79, 0x0c, 0x85, 0x65, 0x21, 0xfd, 0x77, 0xec, 0x85, 0x14, 0xcc, 0x6a, 0x75, 0xc7, 0xea, + 0x13, 0x3b, 0x9e, 0xff, 0xf4, 0x8e, 0xec, 0x89, 0x1d, 0xf7, 0x9f, 0xd8, 0xf1, 0xe4, 0xa7, 0x77, + 0xf4, 0x56, 0x76, 0x5c, 0xea, 0xaa, 0x50, 0xa1, 0x3a, 0x0b, 0x0f, 0xd4, 0x87, 0x12, 0x3b, 0x29, + 0xd6, 0x37, 0xfb, 0x0a, 0x53, 0x1a, 0x45, 0x50, 0x45, 0xeb, 0xce, 0x42, 0xda, 0x23, 0x52, 0x45, + 0x3d, 0xd5, 0x6d, 0xa2, 0xa9, 0x2a, 0x52, 0x45, 0x91, 0x87, 0xde, 0xd8, 0x63, 0xbb, 0xbb, 0xa2, + 0x28, 0x3b, 0x03, 0x08, 0x18, 0x13, 0x84, 0x39, 0x94, 0x8f, 0xd0, 0xc5, 0xf0, 0x1a, 0xf2, 0xc1, + 0x0d, 0xdd, 0xd7, 0x80, 0x45, 0x9f, 0x08, 0x73, 0x55, 0xa3, 0xe7, 0x13, 0x9c, 0xa5, 0xfd, 0x0f, + 0xe3, 0x51, 0x56, 0xde, 0xaa, 0x21, 0x56, 0x36, 0xcc, 0xad, 0x7d, 0xab, 0x35, 0x9a, 0x4c, 0xfc, + 0xe7, 0xd0, 0x27, 0xec, 0x66, 0xb9, 0xe9, 0x94, 0x60, 0x13, 0xc6, 0x43, 0xa6, 0xd1, 0x35, 0xcb, + 0x6f, 0xf2, 0xab, 0x36, 0x6b, 0x81, 0x21, 0x9b, 0x3f, 0x60, 0xb5, 0xf5, 0xf5, 0xe5, 0x3d, 0x6c, + 0x66, 0x1a, 0xe8, 0x62, 0xbb, 0x5e, 0x0a, 0x7f, 0x85, 0xcd, 0x1f, 0xb0, 0xf0, 0xfa, 0xfa, 0xf2, + 0x0e, 0x7e, 0xcc, 0x41, 0x0e, 0xae, 0xdb, 0x8b, 0x4d, 0x15, 0xf4, 0xec, 0x7f, 0x78, 0x53, 0xd9, + 0xa8, 0x44, 0x71, 0xe8, 0xe7, 0xb1, 0xee, 0x07, 0x38, 0x11, 0x58, 0x3c, 0x44, 0x52, 0x0d, 0xd0, + 0x2c, 0xe9, 0xfa, 0x5e, 0xf6, 0xab, 0x20, 0x18, 0xcb, 0xd6, 0x08, 0xf0, 0x9d, 0x37, 0x20, 0xe4, + 0x80, 0x4f, 0x9c, 0xe6, 0x54, 0x54, 0x92, 0x6f, 0x7f, 0x82, 0xb6, 0x69, 0x9d, 0xec, 0x8f, 0x40, + 0xdf, 0xa8, 0x98, 0x70, 0x98, 0x09, 0x78, 0x24, 0x64, 0x10, 0x8f, 0xe2, 0xe1, 0xd4, 0x13, 0xc0, + 0x82, 0xab, 0x96, 0xca, 0xf0, 0x9b, 0x28, 0xa9, 0xe0, 0x01, 0x78, 0x96, 0x64, 0x2c, 0x97, 0x0c, + 0x4e, 0xa8, 0x1f, 0x1c, 0xc3, 0xd8, 0x50, 0x1b, 0xbe, 0xd6, 0x6e, 0xfd, 0xb1, 0x94, 0x12, 0x9c, + 0x4a, 0x5c, 0x6f, 0x9a, 0x25, 0x3d, 0x31, 0x8f, 0x73, 0xc9, 0x9a, 0x5c, 0xc6, 0xa2, 0x63, 0xb9, + 0xe8, 0x18, 0xa2, 0xfb, 0x62, 0xdd, 0xca, 0x2e, 0x9a, 0x52, 0x6c, 0xf7, 0xc9, 0x2d, 0x5d, 0x80, + 0x40, 0x18, 0xcd, 0x25, 0xf8, 0x27, 0x55, 0xdd, 0xb8, 0x85, 0x74, 0x2b, 0x0e, 0x40, 0x3c, 0x55, + 0xfb, 0x9d, 0x8c, 0x8b, 0x72, 0x48, 0x55, 0x7a, 0xbd, 0xc1, 0x25, 0xcc, 0x85, 0xb7, 0x34, 0xac, + 0xa3, 0xc4, 0x56, 0xd7, 0xa2, 0xf5, 0xbc, 0x4d, 0xdc, 0x1b, 0x48, 0x16, 0x43, 0x7b, 0x05, 0x4a, + 0xb6, 0x11, 0xe7, 0x92, 0xec, 0xf5, 0x95, 0xe5, 0x6a, 0xa7, 0x0b, 0xd5, 0x4f, 0x55, 0xc3, 0x7f, + 0x8c, 0x28, 0xaa, 0x1e, 0x4c, 0x90, 0x14, 0x3b, 0x11, 0x75, 0x94, 0xcb, 0xd8, 0x46, 0x23, 0x69, + 0xbf, 0xd5, 0xab, 0x14, 0xd1, 0xff, 0x81, 0xdc, 0xa6, 0xbe, 0x56, 0xdf, 0x0d, 0xfe, 0x00, 0x80, + 0xa4, 0x92, 0xcb, 0x25, 0xba, 0x02, 0x8e, 0x42, 0xc3, 0x40, 0xe8, 0xc6, 0xf3, 0x37, 0x6c, 0xbf, + 0xeb, 0x0e, 0xf2, 0x1f, 0x07, 0x6d, 0x23, 0xad, 0xec, 0xd6, 0x2a, 0xc0, 0x8a, 0x02, 0x29, 0x1d, + 0xf7, 0x07, 0xb9, 0x2c, 0x10, 0xe0, 0xa1, 0xdd, 0x19, 0x94, 0xda, 0x9d, 0xfe, 0x20, 0x0b, 0x64, + 0x1f, 0xdb, 0x1d, 0x00, 0xe9, 0x2c, 0x83, 0xe4, 0xd6, 0x60, 0x0e, 0xb0, 0xfd, 0xb1, 0x5f, 0x00, + 0x88, 0x52, 0xe7, 0x24, 0x13, 0x51, 0x4d, 0x01, 0xb5, 0x01, 0xa8, 0x7d, 0x92, 0x8d, 0xea, 0x95, + 0x82, 0xea, 0x02, 0x54, 0x37, 0x1b, 0xd5, 0x6b, 0x05, 0xd4, 0xfa, 0x63, 0x63, 0x7e, 0x2e, 0xb1, + 0x43, 0x05, 0x70, 0x09, 0x58, 0x2e, 0xb3, 0xb1, 0x40, 0xbe, 0x0c, 0xd4, 0xe4, 0x5b, 0x57, 0xfd, + 0x81, 0x91, 0x89, 0xa9, 0x02, 0xf9, 0xf0, 0x7b, 0x80, 0xfa, 0xb0, 0x0d, 0x68, 0x0e, 0x03, 0x92, + 0x6e, 0x49, 0xee, 0x5b, 0xdb, 0xd8, 0x4f, 0x31, 0x81, 0xb0, 0x7b, 0x7f, 0x00, 0x54, 0xef, 0x8f, + 0x6c, 0x9a, 0x2a, 0x20, 0xee, 0x1e, 0xf8, 0x80, 0x09, 0xfa, 0xc0, 0x21, 0x2c, 0x67, 0x23, 0x03, + 0x91, 0x9f, 0xf5, 0x07, 0x28, 0x7f, 0xc6, 0x5c, 0x8f, 0x64, 0x53, 0x06, 0x42, 0x6f, 0xb7, 0x0a, + 0x7d, 0x12, 0xdd, 0x10, 0x01, 0xba, 0x38, 0x23, 0x2c, 0x53, 0xf2, 0x15, 0x10, 0x7d, 0xab, 0x9d, + 0xad, 0x08, 0x95, 0xd7, 0x7a, 0xbe, 0xd4, 0x6a, 0x3f, 0xc5, 0x25, 0x88, 0xfe, 0x54, 0x12, 0x76, + 0x4a, 0x66, 0xc4, 0xf3, 0xb2, 0x29, 0x03, 0xe9, 0xf7, 0x2e, 0x7e, 0x07, 0xc0, 0x1e, 0xbf, 0xe5, + 0x91, 0x37, 0xf4, 0xc2, 0xe8, 0xc6, 0xc8, 0x24, 0xae, 0x0a, 0xc7, 0xd0, 0xfa, 0x20, 0x37, 0xff, + 0x70, 0x02, 0x6b, 0x5a, 0xcc, 0x99, 0xa8, 0xbe, 0x71, 0x26, 0xfe, 0x2a, 0x9c, 0x49, 0xf7, 0x9f, + 0x73, 0x75, 0xcb, 0x36, 0x00, 0x38, 0x94, 0xcb, 0x0f, 0x80, 0xf1, 0x92, 0xdc, 0x78, 0x32, 0x14, + 0x2e, 0x21, 0x4c, 0x3b, 0x24, 0xd2, 0xca, 0x07, 0x6d, 0xc4, 0x47, 0x23, 0x70, 0x33, 0x0b, 0x0b, + 0xd7, 0x06, 0xfb, 0xf1, 0x62, 0x7b, 0x5d, 0xf6, 0xaa, 0x26, 0xaf, 0xb6, 0x74, 0xac, 0x4f, 0xde, + 0xd3, 0x00, 0x9f, 0x03, 0x7b, 0x76, 0x38, 0x73, 0x23, 0x94, 0x87, 0xf9, 0x22, 0xaa, 0x1c, 0xa2, + 0x09, 0x8f, 0xc3, 0xc8, 0x90, 0x5b, 0xb5, 0xe3, 0x30, 0x84, 0xe0, 0x8e, 0x54, 0x7b, 0x5c, 0xbb, + 0x32, 0x2f, 0x02, 0x2f, 0x01, 0x29, 0x74, 0xea, 0xa6, 0x61, 0x30, 0xc2, 0x76, 0xcc, 0x6e, 0x18, + 0x9f, 0x31, 0x19, 0x47, 0x60, 0xd2, 0x2e, 0xca, 0xd5, 0xe7, 0x44, 0x78, 0x22, 0x76, 0x37, 0xfc, + 0x0a, 0x44, 0x3a, 0xbc, 0xce, 0x7c, 0x0f, 0x8e, 0x20, 0xf3, 0x20, 0xfb, 0x58, 0xd6, 0x43, 0x1b, + 0xb2, 0x58, 0x66, 0xfd, 0x7c, 0x90, 0x91, 0xeb, 0xdc, 0xf9, 0x8b, 0x64, 0x27, 0xa7, 0x25, 0xf0, + 0xaa, 0xf8, 0x4a, 0xd6, 0x76, 0x34, 0x80, 0xc1, 0x62, 0xb9, 0xa2, 0xbd, 0xe0, 0x39, 0x67, 0xe3, + 0xed, 0xd4, 0xf6, 0x36, 0xa9, 0xed, 0x80, 0x23, 0xca, 0x3c, 0xc7, 0x2b, 0x2c, 0xab, 0xbc, 0xa7, + 0xa9, 0xed, 0xad, 0x53, 0x9b, 0xdb, 0x42, 0xae, 0xa2, 0xb6, 0x22, 0xfb, 0x4d, 0xeb, 0xc4, 0x6e, + 0x8f, 0x7f, 0x32, 0xe2, 0xc2, 0x49, 0x0d, 0x05, 0xbc, 0xe7, 0xd2, 0xb8, 0x36, 0x4f, 0xdb, 0xb0, + 0x0a, 0x47, 0xf3, 0xcb, 0x95, 0x45, 0x04, 0x53, 0xb1, 0xcb, 0xb3, 0x73, 0x79, 0x99, 0x1c, 0x45, + 0x88, 0xd1, 0x19, 0x82, 0x12, 0xd1, 0x94, 0x31, 0xfd, 0x1e, 0xcd, 0x78, 0x78, 0x13, 0x41, 0x66, + 0x86, 0x86, 0x32, 0xcb, 0xa7, 0x21, 0xa8, 0xa4, 0x37, 0x8f, 0xa7, 0xf3, 0x52, 0x39, 0x8a, 0x19, + 0x5e, 0xd3, 0x86, 0x34, 0x24, 0xee, 0xdb, 0x6d, 0x79, 0x57, 0x00, 0xd1, 0x70, 0xdf, 0x6e, 0x31, + 0xe2, 0xf3, 0x31, 0x52, 0x03, 0x88, 0x43, 0x18, 0x94, 0x35, 0x35, 0x7a, 0x32, 0x44, 0x5d, 0x9c, + 0x6b, 0x4e, 0x26, 0x84, 0x8d, 0x65, 0xc4, 0x8a, 0x54, 0x92, 0x20, 0x05, 0x30, 0xdf, 0x5c, 0x5e, + 0x58, 0xd8, 0x6f, 0xc1, 0x60, 0x05, 0x3a, 0xef, 0x9c, 0xa4, 0xe8, 0x92, 0xe5, 0x95, 0x0d, 0x31, + 0xaf, 0xe5, 0xbd, 0xb5, 0x25, 0x4b, 0x40, 0xe7, 0x64, 0x3b, 0x96, 0x6a, 0x56, 0x9b, 0x22, 0xb7, + 0x05, 0x8b, 0xa4, 0xae, 0x52, 0x9d, 0x6c, 0xc3, 0xd3, 0xfd, 0x51, 0x3c, 0xfd, 0x09, 0x9f, 0xa1, + 0x1a, 0x40, 0x01, 0xb9, 0x70, 0x0e, 0xcf, 0x09, 0xab, 0xa6, 0x65, 0x93, 0xeb, 0xcf, 0x0d, 0x9a, + 0x44, 0x48, 0x84, 0xc4, 0xf3, 0x8d, 0xe7, 0x56, 0xf6, 0x13, 0xa9, 0xaa, 0x53, 0x6b, 0xf3, 0x98, + 0x09, 0xc8, 0x96, 0x99, 0xba, 0x33, 0x7b, 0x36, 0x8b, 0xe8, 0xe8, 0xb5, 0x8b, 0x55, 0xef, 0x38, + 0xf1, 0xeb, 0x72, 0xe8, 0x04, 0xb2, 0xeb, 0xfa, 0x2e, 0x1b, 0x46, 0x41, 0xa3, 0x09, 0xce, 0x21, + 0x24, 0x81, 0x5d, 0x2d, 0xaf, 0x7a, 0xac, 0xf6, 0xbf, 0xbe, 0xf7, 0xda, 0xe3, 0xe8, 0x68, 0x49, + 0x38, 0x85, 0x04, 0x49, 0x92, 0x2f, 0xb5, 0xcf, 0xbe, 0xb7, 0x4f, 0x0c, 0x81, 0x6f, 0x13, 0x4b, + 0x82, 0xe4, 0x64, 0xc9, 0x0a, 0x9f, 0xed, 0x36, 0x2f, 0x1d, 0x54, 0x29, 0xe1, 0x6d, 0x9e, 0x4b, + 0x25, 0x2c, 0xe7, 0xe6, 0x3c, 0xaf, 0xee, 0x72, 0xfa, 0xdd, 0x17, 0x46, 0xfb, 0x4b, 0x9b, 0xd4, + 0xd7, 0xc4, 0xd6, 0xfd, 0x81, 0xdb, 0xa2, 0x25, 0x2c, 0x6b, 0x62, 0xeb, 0xff, 0x14, 0x96, 0x15, + 0x86, 0xa5, 0x89, 0xe7, 0xba, 0xb2, 0x1d, 0x80, 0x02, 0x75, 0x75, 0x17, 0x29, 0x5b, 0x6f, 0x0e, + 0x6d, 0x35, 0x18, 0xa1, 0x09, 0xa4, 0xcb, 0x68, 0x0a, 0xe6, 0xee, 0xee, 0x80, 0xcf, 0x49, 0xd2, + 0x5a, 0x3b, 0xa7, 0xef, 0xf9, 0xc0, 0xdd, 0x80, 0x86, 0x13, 0x3f, 0xe2, 0xc8, 0x81, 0x90, 0x32, + 0xa4, 0x28, 0x8e, 0xa8, 0x8b, 0x40, 0x6f, 0x75, 0x87, 0x41, 0xde, 0x39, 0x44, 0x12, 0xc1, 0x90, + 0x43, 0x1a, 0xf2, 0xbe, 0x7f, 0xd1, 0x43, 0x84, 0xb9, 0xe8, 0x74, 0x00, 0xa9, 0x74, 0xeb, 0xf2, + 0x0c, 0x39, 0x7c, 0x3a, 0x85, 0x81, 0xa8, 0x98, 0x93, 0x78, 0xdf, 0xc7, 0x60, 0xbf, 0xfa, 0x6a, + 0x57, 0x4c, 0x68, 0x42, 0x0f, 0x3a, 0x3b, 0x01, 0xbc, 0x3e, 0x9f, 0xed, 0x48, 0xd7, 0x85, 0xe4, + 0xde, 0x32, 0x4d, 0x2e, 0xcb, 0x24, 0x59, 0x81, 0xb9, 0x74, 0x44, 0x62, 0x5f, 0x20, 0xa2, 0x2b, + 0x3e, 0x59, 0x85, 0x42, 0x61, 0x23, 0x6f, 0xb7, 0x49, 0x82, 0x42, 0xf9, 0x3c, 0xc0, 0xdf, 0xf2, + 0xe9, 0x1d, 0x41, 0x17, 0xac, 0x74, 0x31, 0x1a, 0x21, 0xcd, 0xc0, 0x7a, 0x04, 0x6e, 0x95, 0x53, + 0x91, 0x4e, 0x9f, 0x6d, 0x6e, 0x2e, 0xb9, 0x9e, 0xd5, 0x83, 0x69, 0x55, 0x7e, 0x0a, 0x8b, 0x32, + 0xfe, 0xd4, 0x0e, 0x0b, 0x17, 0xe0, 0x62, 0x53, 0x32, 0x57, 0x9b, 0x03, 0xed, 0xe7, 0xf1, 0xe7, + 0x32, 0x36, 0x90, 0x1a, 0xee, 0x16, 0xce, 0xbd, 0xf1, 0x44, 0x2c, 0xef, 0x10, 0xad, 0x6f, 0xd1, + 0x5b, 0xde, 0x22, 0xf7, 0x43, 0x3c, 0x48, 0x9d, 0x4a, 0x3a, 0x3b, 0xfa, 0x50, 0x12, 0x9d, 0x52, + 0x9d, 0x4b, 0x94, 0x4b, 0xba, 0xb2, 0xe0, 0x12, 0xc7, 0x1e, 0xab, 0x97, 0x11, 0x89, 0x05, 0xd7, + 0xc1, 0x2f, 0x69, 0x4b, 0xd9, 0x2b, 0x77, 0xcf, 0xae, 0x1d, 0xc4, 0xd1, 0x44, 0xe2, 0x8d, 0x66, + 0x1e, 0x24, 0x9e, 0xba, 0xdf, 0x09, 0xff, 0x23, 0x48, 0xdb, 0x84, 0x52, 0x1c, 0xce, 0x0a, 0xbb, + 0x63, 0xd1, 0x80, 0xa4, 0x2a, 0x9d, 0xf4, 0x21, 0x1d, 0x50, 0x53, 0xa3, 0x91, 0x9e, 0x63, 0xe9, + 0x94, 0xcb, 0x63, 0xa0, 0x43, 0x4e, 0xf6, 0x4a, 0xad, 0x45, 0xf7, 0x34, 0x37, 0xbf, 0xa1, 0x6e, + 0x0a, 0x59, 0x13, 0xcb, 0xc1, 0xf9, 0x5f, 0xdd, 0x71, 0x25, 0x28, 0x37, 0x09, 0xe9, 0xc8, 0x7a, + 0xfa, 0x77, 0x33, 0x9a, 0x87, 0xd2, 0x0b, 0xa2, 0xa2, 0x65, 0x61, 0x1e, 0xdb, 0x05, 0x70, 0x2b, + 0x7f, 0x28, 0x94, 0xb4, 0x28, 0xec, 0x5c, 0x12, 0x4d, 0x13, 0x39, 0x25, 0x35, 0x27, 0x51, 0xb2, + 0x93, 0x47, 0x54, 0x90, 0xbf, 0x5f, 0x0a, 0xb9, 0x0f, 0xe8, 0x57, 0x0d, 0x53, 0x55, 0xd3, 0x6b, + 0x8d, 0x6d, 0x8f, 0xf9, 0x1e, 0xa3, 0x05, 0x7d, 0xad, 0x3f, 0x97, 0xb3, 0x14, 0xa8, 0x6c, 0x05, + 0xcf, 0xbb, 0xe0, 0x70, 0x68, 0xfa, 0xe7, 0x4f, 0xf5, 0xfd, 0xfd, 0x72, 0xa0, 0x5b, 0xcb, 0x8a, + 0xb1, 0x34, 0xd8, 0x87, 0xcf, 0xd5, 0xe5, 0xd9, 0x25, 0x76, 0xee, 0xa9, 0x1a, 0xbb, 0x24, 0xeb, + 0x59, 0xf8, 0x93, 0x88, 0x53, 0xfd, 0xcc, 0xeb, 0xbf, 0x2f, 0xac, 0x05, 0xc7, 0xf6, 0x25, 0x00, + 0x00 }; diff --git a/wled00/mqtt.cpp b/wled00/mqtt.cpp index e53a14e7..1690341b 100644 --- a/wled00/mqtt.cpp +++ b/wled00/mqtt.cpp @@ -117,6 +117,7 @@ void publishMqtt() if (!WLED_MQTT_CONNECTED) return; DEBUG_PRINTLN(F("Publish MQTT")); + #ifndef USERMOD_SMARTNEST char s[10]; char subuf[38]; @@ -139,6 +140,7 @@ void publishMqtt() strlcpy(subuf, mqttDeviceTopic, 33); strcat_P(subuf, PSTR("/v")); mqtt->publish(subuf, 0, false, apires); // do not retain message + #endif } @@ -166,9 +168,11 @@ bool initMqtt() mqtt->setClientId(mqttClientID); if (mqttUser[0] && mqttPass[0]) mqtt->setCredentials(mqttUser, mqttPass); + #ifndef USERMOD_SMARTNEST strlcpy(mqttStatusTopic, mqttDeviceTopic, 33); strcat_P(mqttStatusTopic, PSTR("/status")); mqtt->setWill(mqttStatusTopic, 0, true, "offline"); // LWT message + #endif mqtt->setKeepAlive(MQTT_KEEP_ALIVE_TIME); mqtt->connect(); return true; diff --git a/wled00/network.cpp b/wled00/network.cpp index ec73c0f9..f0bbbe58 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -93,7 +93,17 @@ const ethernet_settings ethernetBoards[] = { 18, // eth_mdio, ETH_PHY_IP101, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode - } + }, + + // QuinLed-Dig-Octa Brainboard-32-8L and LilyGO-T-ETH-POE + { + 0, // eth_address, + -1, // eth_power, + 23, // eth_mdc, + 18, // eth_mdio, + ETH_PHY_LAN8720, // eth_type, + ETH_CLOCK_GPIO17_OUT // eth_clk_mode + }, }; #endif diff --git a/wled00/ntp.cpp b/wled00/ntp.cpp index 0c42cd99..02fe8adc 100644 --- a/wled00/ntp.cpp +++ b/wled00/ntp.cpp @@ -31,7 +31,8 @@ Timezone* tz; #define TZ_HAWAII 18 #define TZ_NOVOSIBIRSK 19 #define TZ_ANCHORAGE 20 -#define TZ_MX_CENTRAL 21 +#define TZ_MX_CENTRAL 21 +#define TZ_PAKISTAN 22 #define TZ_INIT 255 byte tzCurrent = TZ_INIT; //uninitialized @@ -147,6 +148,11 @@ void updateTimezone() { tcrStandard = {Last, Sun, Oct, 2, -360}; //CST = UTC - 6 hours break; } + case TZ_PAKISTAN : { + tcrDaylight = {Last, Sun, Mar, 1, 300}; //Pakistan Standard Time = UTC + 5 hours + tcrStandard = tcrDaylight; + break; + } } tzCurrent = currentTimezone; diff --git a/wled00/pin_manager.h b/wled00/pin_manager.h index c9d87319..4a0c6889 100644 --- a/wled00/pin_manager.h +++ b/wled00/pin_manager.h @@ -56,6 +56,7 @@ enum struct PinOwner : uint8_t { UM_RGBRotaryEncoder = USERMOD_RGB_ROTARY_ENCODER, // 0x16 // Usermod "rgb-rotary-encoder.h" UM_QuinLEDAnPenta = USERMOD_ID_QUINLED_AN_PENTA, // 0x17 // Usermod "quinled-an-penta.h" UM_BME280 = USERMOD_ID_BME280, // 0x18 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins + UM_BH1750 = USERMOD_ID_BH1750, // 0x19 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins UM_Audioreactive = USERMOD_ID_AUDIOREACTIVE // 0x1E // Usermod "audio_reactive.h" }; static_assert(0u == static_cast(PinOwner::None), "PinOwner::None must be zero, so default array initialization works as expected"); diff --git a/wled00/set.cpp b/wled00/set.cpp index 235f8985..70700c32 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -247,7 +247,10 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) notifyAlexa = request->hasArg(F("SA")); notifyHue = request->hasArg(F("SH")); notifyMacro = request->hasArg(F("SM")); - notifyTwice = request->hasArg(F("S2")); + + t = request->arg(F("UR")).toInt(); + if ((t>=0) && (t<30)) udpNumRetries = t; + nodeListEnabled = request->hasArg(F("NL")); if (!nodeListEnabled) Nodes.clear(); diff --git a/wled00/udp.cpp b/wled00/udp.cpp index 734618fa..9fc83a09 100644 --- a/wled00/udp.cpp +++ b/wled00/udp.cpp @@ -138,7 +138,7 @@ void notify(byte callMode, bool followUp) notifierUdp.endPacket(); notificationSentCallMode = callMode; notificationSentTime = millis(); - notificationTwoRequired = (followUp)? false:notifyTwice; + notificationCount = followUp ? notificationCount + 1 : 0; } void realtimeLock(uint32_t timeoutMs, byte md) @@ -207,7 +207,7 @@ void handleNotifications() IPAddress localIP; //send second notification if enabled - if(udpConnected && notificationTwoRequired && millis()-notificationSentTime > 250){ + if(udpConnected && (notificationCount < udpNumRetries) && ((millis()-notificationSentTime) > 250)){ notify(notificationSentCallMode,true); } diff --git a/wled00/usermods_list.cpp b/wled00/usermods_list.cpp index d63730d4..f161bef7 100644 --- a/wled00/usermods_list.cpp +++ b/wled00/usermods_list.cpp @@ -12,39 +12,46 @@ //#include "../usermods/EXAMPLE_v2/usermod_v2_example.h" #ifdef USERMOD_BATTERY_STATUS_BASIC -#include "../usermods/battery_status_basic/usermod_v2_battery_status_basic.h" + #include "../usermods/battery_status_basic/usermod_v2_battery_status_basic.h" #endif #ifdef USERMOD_DALLASTEMPERATURE -#include "../usermods/Temperature/usermod_temperature.h" + #include "../usermods/Temperature/usermod_temperature.h" #endif #ifdef USERMOD_SN_PHOTORESISTOR -#include "../usermods/SN_Photoresistor/usermod_sn_photoresistor.h" + #include "../usermods/SN_Photoresistor/usermod_sn_photoresistor.h" #endif #ifdef USERMOD_PWM_FAN -#include "../usermods/PWM_fan/usermod_PWM_fan.h" + #include "../usermods/PWM_fan/usermod_PWM_fan.h" #endif #ifdef USERMOD_BUZZER -#include "../usermods/buzzer/usermod_v2_buzzer.h" + #include "../usermods/buzzer/usermod_v2_buzzer.h" #endif + #ifdef USERMOD_SENSORSTOMQTT -#include "../usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h" + #include "../usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h" #endif + #ifdef USERMOD_PIRSWITCH -#include "../usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h" + #include "../usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h" #endif #ifdef USERMOD_MODE_SORT -#include "../usermods/usermod_v2_mode_sort/usermod_v2_mode_sort.h" + #include "../usermods/usermod_v2_mode_sort/usermod_v2_mode_sort.h" +#endif + +#ifdef USERMOD_BH1750 + #include "../usermods/BH1750_v2/usermod_BH1750.h" #endif // BME280 v2 usermod. Define "USERMOD_BME280" in my_config.h #ifdef USERMOD_BME280 -#include "../usermods/BME280_v2/usermod_bme280.h" + #include "../usermods/BME280_v2/usermod_bme280.h" #endif + #ifdef USERMOD_FOUR_LINE_DISPLAY #ifdef USE_ALT_DISPlAY #include "../usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h" @@ -52,6 +59,7 @@ #include "../usermods/usermod_v2_four_line_display/usermod_v2_four_line_display.h" #endif #endif + #ifdef USERMOD_ROTARY_ENCODER_UI #ifdef USE_ALT_DISPlAY #include "../usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h" @@ -59,41 +67,41 @@ #include "../usermods/usermod_v2_rotary_encoder_ui/usermod_v2_rotary_encoder_ui.h" #endif #endif + #ifdef USERMOD_AUTO_SAVE -#include "../usermods/usermod_v2_auto_save/usermod_v2_auto_save.h" + #include "../usermods/usermod_v2_auto_save/usermod_v2_auto_save.h" #endif #ifdef USERMOD_DHT -#include "../usermods/DHT/usermod_dht.h" + #include "../usermods/DHT/usermod_dht.h" #endif #ifdef USERMOD_VL53L0X_GESTURES -#include //it's needed here to correctly resolve dependencies #include "../usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h" #endif #ifdef USERMOD_ANIMATED_STAIRCASE -#include "../usermods/Animated_Staircase/Animated_Staircase.h" + #include "../usermods/Animated_Staircase/Animated_Staircase.h" #endif #ifdef USERMOD_MULTI_RELAY -#include "../usermods/multi_relay/usermod_multi_relay.h" + #include "../usermods/multi_relay/usermod_multi_relay.h" #endif #ifdef USERMOD_RTC -#include "../usermods/RTC/usermod_rtc.h" + #include "../usermods/RTC/usermod_rtc.h" #endif #ifdef USERMOD_ELEKSTUBE_IPS -#include "../usermods/EleksTube_IPS/usermod_elekstube_ips.h" + #include "../usermods/EleksTube_IPS/usermod_elekstube_ips.h" #endif #ifdef USERMOD_ROTARY_ENCODER_BRIGHTNESS_COLOR -#include "../usermods/usermod_rotary_brightness_color/usermod_rotary_brightness_color.h" + #include "../usermods/usermod_rotary_brightness_color/usermod_rotary_brightness_color.h" #endif #ifdef RGB_ROTARY_ENCODER -#include "../usermods/rgb-rotary-encoder/rgb-rotary-encoder.h" + #include "../usermods/rgb-rotary-encoder/rgb-rotary-encoder.h" #endif #ifdef USERMOD_ST7789_DISPLAY @@ -101,41 +109,57 @@ #endif #ifdef USERMOD_SEVEN_SEGMENT -#include "../usermods/seven_segment_display/usermod_v2_seven_segment_display.h" + #include "../usermods/seven_segment_display/usermod_v2_seven_segment_display.h" #endif #ifdef USERMOD_SSDR -#include "../usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h" + #include "../usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h" #endif #ifdef USERMOD_CRONIXIE -#include "../usermods/Cronixie/usermod_cronixie.h" + #include "../usermods/Cronixie/usermod_cronixie.h" #endif #ifdef QUINLED_AN_PENTA -#include "../usermods/quinled-an-penta/quinled-an-penta.h" + #include "../usermods/quinled-an-penta/quinled-an-penta.h" #endif #ifdef USERMOD_WIZLIGHTS -#include "../usermods/wizlights/wizlights.h" + #include "../usermods/wizlights/wizlights.h" #endif #ifdef USERMOD_WORDCLOCK -#include "../usermods/usermod_v2_word_clock/usermod_v2_word_clock.h" + #include "../usermods/usermod_v2_word_clock/usermod_v2_word_clock.h" #endif #ifdef USERMOD_MY9291 -#include "../usermods/MY9291/usermode_MY9291.h" + #include "../usermods/MY9291/usermode_MY9291.h" #endif #ifdef USERMOD_SI7021_MQTT_HA -#include "../usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h" + #include "../usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h" +#endif + +#ifdef USERMOD_SMARTNEST +#include "../usermods/smartnest/usermod_smartnest.h" #endif #ifdef USERMOD_AUDIOREACTIVE #include "../usermods/audioreactive/audio_reactive.h" #endif +#ifdef USERMOD_ANALOG_CLOCK +#include "../usermods/Analog_Clock/Analog_Clock.h" +#endif + +#ifdef USERMOD_PING_PONG_CLOCK +#include "../usermods/usermod_v2_ping_pong_clock/usermod_v2_ping_pong_clock.h" +#endif + +#ifdef USERMOD_ADS1115 +#include "../usermods/ADS1115_v2/usermod_ads1115.h" +#endif + void registerUsermods() { /* @@ -144,82 +168,90 @@ void registerUsermods() * \/ \/ \/ */ //usermods.add(new MyExampleUsermod()); - #ifdef USERMOD_BATTERY_STATUS_BASIC usermods.add(new UsermodBatteryBasic()); #endif - + #ifdef USERMOD_DALLASTEMPERATURE usermods.add(new UsermodTemperature()); #endif - + #ifdef USERMOD_SN_PHOTORESISTOR usermods.add(new Usermod_SN_Photoresistor()); #endif - + #ifdef USERMOD_PWM_FAN usermods.add(new PWMFanUsermod()); #endif - + #ifdef USERMOD_BUZZER usermods.add(new BuzzerUsermod()); #endif - + + #ifdef USERMOD_BH1750 + usermods.add(new Usermod_BH1750()); + #endif + #ifdef USERMOD_BME280 usermods.add(new UsermodBME280()); #endif + #ifdef USERMOD_SENSORSTOMQTT usermods.add(new UserMod_SensorsToMQTT()); #endif + #ifdef USERMOD_PIRSWITCH usermods.add(new PIRsensorSwitch()); #endif - + #ifdef USERMOD_MODE_SORT usermods.add(new ModeSortUsermod()); #endif + #ifdef USERMOD_FOUR_LINE_DISPLAY usermods.add(new FourLineDisplayUsermod()); #endif + #ifdef USERMOD_ROTARY_ENCODER_UI usermods.add(new RotaryEncoderUIUsermod()); // can use USERMOD_FOUR_LINE_DISPLAY #endif + #ifdef USERMOD_AUTO_SAVE usermods.add(new AutoSaveUsermod()); // can use USERMOD_FOUR_LINE_DISPLAY #endif - + #ifdef USERMOD_DHT usermods.add(new UsermodDHT()); #endif - + #ifdef USERMOD_VL53L0X_GESTURES usermods.add(new UsermodVL53L0XGestures()); #endif - + #ifdef USERMOD_ANIMATED_STAIRCASE usermods.add(new Animated_Staircase()); #endif - + #ifdef USERMOD_MULTI_RELAY usermods.add(new MultiRelay()); #endif - + #ifdef USERMOD_RTC usermods.add(new RTCUsermod()); #endif - + #ifdef USERMOD_ELEKSTUBE_IPS usermods.add(new ElekstubeIPSUsermod()); #endif - + #ifdef USERMOD_ROTARY_ENCODER_BRIGHTNESS_COLOR usermods.add(new RotaryEncoderBrightnessColor()); #endif - + #ifdef RGB_ROTARY_ENCODER usermods.add(new RgbRotaryEncoderUsermod()); #endif - + #ifdef USERMOD_ST7789_DISPLAY usermods.add(new St7789DisplayUsermod()); #endif @@ -227,19 +259,19 @@ void registerUsermods() #ifdef USERMOD_SEVEN_SEGMENT usermods.add(new SevenSegmentDisplay()); #endif - + #ifdef USERMOD_SSDR usermods.add(new UsermodSSDR()); #endif - + #ifdef USERMOD_CRONIXIE usermods.add(new UsermodCronixie()); #endif - + #ifdef QUINLED_AN_PENTA usermods.add(new QuinLEDAnPentaUsermod()); #endif - + #ifdef USERMOD_WIZLIGHTS usermods.add(new WizLightsUsermod()); #endif @@ -247,7 +279,7 @@ void registerUsermods() #ifdef USERMOD_WORDCLOCK usermods.add(new WordClockUsermod()); #endif - + #ifdef USERMOD_MY9291 usermods.add(new MY9291Usermod()); #endif @@ -255,8 +287,24 @@ void registerUsermods() #ifdef USERMOD_SI7021_MQTT_HA usermods.add(new Si7021_MQTT_HA()); #endif + + #ifdef USERMOD_SMARTNEST + usermods.add(new Smartnest()); + #endif #ifdef USERMOD_AUDIOREACTIVE usermods.add(new AudioReactive()); #endif + + #ifdef USERMOD_ANALOG_CLOCK + usermods.add(new AnalogClockUsermod()); + #endif + + #ifdef USERMOD_PING_PONG_CLOCK + usermods.add(new PingPongClockUsermod()); + #endif + + #ifdef USERMOD_ADS1115 + usermods.add(new ADS1115Usermod()); + #endif } diff --git a/wled00/wled.h b/wled00/wled.h index e7cbca8f..48621754 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2210181 +#define VERSION 2210220 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -354,7 +354,7 @@ WLED_GLOBAL bool notifyButton _INIT(false); // send if upd WLED_GLOBAL bool notifyAlexa _INIT(false); // send notification if updated via Alexa WLED_GLOBAL bool notifyMacro _INIT(false); // send notification for macro WLED_GLOBAL bool notifyHue _INIT(true); // send notification if Hue light changes -WLED_GLOBAL bool notifyTwice _INIT(false); // notifications use UDP: enable if devices don't sync reliably +WLED_GLOBAL uint8_t udpNumRetries _INIT(0); // Number of times a UDP sync message is retransmitted. Increase to increase reliability WLED_GLOBAL bool alexaEnabled _INIT(false); // enable device discovery by Amazon Echo WLED_GLOBAL char alexaInvocationName[33] _INIT("Light"); // speech control name of device. Choose something voice-to-text can understand @@ -505,7 +505,7 @@ WLED_GLOBAL bool notifyDirectDefault _INIT(notifyDirect); WLED_GLOBAL bool receiveNotifications _INIT(true); WLED_GLOBAL unsigned long notificationSentTime _INIT(0); WLED_GLOBAL byte notificationSentCallMode _INIT(CALL_MODE_INIT); -WLED_GLOBAL bool notificationTwoRequired _INIT(false); +WLED_GLOBAL uint8_t notificationCount _INIT(0); // effects WLED_GLOBAL byte effectCurrent _INIT(0); diff --git a/wled00/wled_eeprom.cpp b/wled00/wled_eeprom.cpp index a05f1431..5e56a8b0 100644 --- a/wled00/wled_eeprom.cpp +++ b/wled00/wled_eeprom.cpp @@ -102,7 +102,7 @@ void loadSettingsFromEEPROM() busses.add(bc); notifyButton = EEPROM.read(230); - notifyTwice = EEPROM.read(231); + if (EEPROM.read(231)) udpNumRetries = 1; buttonType[0] = EEPROM.read(232) ? BTN_TYPE_PUSH : BTN_TYPE_NONE; staticIP[0] = EEPROM.read(234); diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 626c2708..6e779228 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -37,17 +37,22 @@ void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t return; } if (!index) { - request->_tempFile = WLED_FS.open(filename, "w"); + String finalname = filename; + if (finalname.charAt(0) != '/') { + finalname = "/" + finalname; // prepend slash if missing + } + + request->_tempFile = WLED_FS.open(finalname, "w"); DEBUG_PRINT("Uploading "); - DEBUG_PRINTLN(filename); - if (filename == F("/presets.json")) presetsModifiedTime = toki.second(); + DEBUG_PRINTLN(finalname); + if (finalname == "/presets.json") presetsModifiedTime = toki.second(); } if (len) { request->_tempFile.write(data,len); } if (final) { request->_tempFile.close(); - if (filename == F("/cfg.json")) { + if (filename == "/cfg.json") { doReboot = true; request->send(200, "text/plain", F("Configuration restore successful.\nRebooting...")); } else diff --git a/wled00/xml.cpp b/wled00/xml.cpp index e5cf95e5..d5bfd876 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -489,7 +489,7 @@ void getSettingsJS(byte subPage, char* dest) sappend('c',SET_F("SB"),notifyButton); sappend('c',SET_F("SH"),notifyHue); sappend('c',SET_F("SM"),notifyMacro); - sappend('c',SET_F("S2"),notifyTwice); + sappend('v',SET_F("UR"),udpNumRetries); sappend('c',SET_F("NL"),nodeListEnabled); sappend('c',SET_F("NB"),nodeBroadcastEnabled);