Merge branch 'single-doc' into dev

This commit is contained in:
Blaz Kristan 2021-11-08 21:51:26 +01:00
commit 89ff8b3fcb
23 changed files with 1657 additions and 1466 deletions

View File

@ -55,6 +55,7 @@ class St7789DisplayUsermod : public Usermod {
private: private:
//Private class members. You can declare variables and functions only accessible to your usermod here //Private class members. You can declare variables and functions only accessible to your usermod here
unsigned long lastTime = 0; unsigned long lastTime = 0;
bool enabled = true;
bool displayTurnedOff = false; bool displayTurnedOff = false;
long lastRedraw = 0; long lastRedraw = 0;
@ -140,7 +141,7 @@ class St7789DisplayUsermod : public Usermod {
void setup() void setup()
{ {
PinManagerPinType pins[] = { { TFT_MOSI, true }, { TFT_MISO, false}, { TFT_SCLK, true }, { TFT_CS, true}, { TFT_DC, true}, { TFT_RST, true }, { TFT_BL, true } }; PinManagerPinType pins[] = { { TFT_MOSI, true }, { TFT_MISO, false}, { TFT_SCLK, true }, { TFT_CS, true}, { TFT_DC, true}, { TFT_RST, true }, { TFT_BL, true } };
if (!pinManager.allocateMultiplePins(pins, 7, PinOwner::UM_FourLineDisplay)) { return; } if (!pinManager.allocateMultiplePins(pins, 7, PinOwner::UM_FourLineDisplay)) { enabled = false; return; }
tft.init(); tft.init();
tft.setRotation(0); //Rotation here is set up for the text to be readable with the port on the left. Use 1 to flip. tft.setRotation(0); //Rotation here is set up for the text to be readable with the port on the left. Use 1 to flip.
@ -321,7 +322,7 @@ class St7789DisplayUsermod : public Usermod {
if (user.isNull()) user = root.createNestedObject("u"); if (user.isNull()) user = root.createNestedObject("u");
JsonArray lightArr = user.createNestedArray("ST7789"); //name JsonArray lightArr = user.createNestedArray("ST7789"); //name
lightArr.add(F("installed")); //unit lightArr.add(enabled?F("installed"):F("disabled")); //unit
} }
@ -362,7 +363,15 @@ class St7789DisplayUsermod : public Usermod {
*/ */
void addToConfig(JsonObject& root) void addToConfig(JsonObject& root)
{ {
//JsonObject top = root.createNestedObject("exampleUsermod"); JsonObject top = root.createNestedObject("ST7789");
JsonArray pins = top.createNestedArray("pin");
pins.add(TFT_MOSI);
pins.add(TFT_MISO);
pins.add(TFT_SCLK);
pins.add(TFT_CS);
pins.add(TFT_DC);
pins.add(TFT_RST);
pins.add(TFT_BL);
//top["great"] = userVar0; //save this var persistently whenever settings are saved //top["great"] = userVar0; //save this var persistently whenever settings are saved
} }

View File

@ -657,8 +657,9 @@ class FourLineDisplayUsermod : public Usermod {
top[FPSTR(_enabled)] = enabled; top[FPSTR(_enabled)] = enabled;
JsonArray io_pin = top.createNestedArray("pin"); JsonArray io_pin = top.createNestedArray("pin");
for (byte i=0; i<5; i++) io_pin.add(ioPin[i]); for (byte i=0; i<5; i++) io_pin.add(ioPin[i]);
top["help4PinTypes"] = F("Clk,Data,CS,DC,RST"); // help for Settings page top["help4Pins"] = F("Clk,Data,CS,DC,RST"); // help for Settings page
top["type"] = type; top["type"] = type;
top["help4Type"] = F("1=SSD1306,2=SH1106,3=SSD1306_128x64,4=SSD1305,5=SSD1305_128x64,6=SSD1306_SPI,7=SSD1306_SPI_128x64"); // help for Settings page
top[FPSTR(_flip)] = (bool) flip; top[FPSTR(_flip)] = (bool) flip;
top[FPSTR(_contrast)] = contrast; top[FPSTR(_contrast)] = contrast;
top[FPSTR(_refreshRate)] = refreshRate/1000; top[FPSTR(_refreshRate)] = refreshRate/1000;

View File

@ -86,8 +86,6 @@ void WS2812FX::finalizeInit(void)
busses.add(defCfg); busses.add(defCfg);
} }
} }
deserializeMap();
_length = 0; _length = 0;
for (uint8_t i=0; i<busses.getNumBusses(); i++) { for (uint8_t i=0; i<busses.getNumBusses(); i++) {
@ -1073,7 +1071,7 @@ uint32_t WS2812FX::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8
} }
//load custom mapping table from JSON file //load custom mapping table from JSON file (called from finalizeInit() or deserializeState())
void WS2812FX::deserializeMap(uint8_t n) { void WS2812FX::deserializeMap(uint8_t n) {
char fileName[32]; char fileName[32];
strcpy_P(fileName, PSTR("/ledmap")); strcpy_P(fileName, PSTR("/ledmap"));
@ -1091,11 +1089,21 @@ void WS2812FX::deserializeMap(uint8_t n) {
return; return;
} }
DynamicJsonDocument doc(JSON_BUFFER_SIZE); // full sized buffer for larger maps #ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
DEBUG_PRINT(F("Reading LED map from ")); DEBUG_PRINT(F("Reading LED map from "));
DEBUG_PRINTLN(fileName); DEBUG_PRINTLN(fileName);
if (!readObjectFromFile(fileName, nullptr, &doc)) return; //if file does not exist just exit if (!readObjectFromFile(fileName, nullptr, &doc)) {
jsonBufferLock = false;
return; //if file does not exist just exit
}
// erase old custom ledmap // erase old custom ledmap
if (customMappingTable != nullptr) { if (customMappingTable != nullptr) {
@ -1112,6 +1120,8 @@ void WS2812FX::deserializeMap(uint8_t n) {
customMappingTable[i] = (uint16_t) map[i]; customMappingTable[i] = (uint16_t) map[i];
} }
} }
jsonBufferLock = false;
} }
//gamma 2.8 lookup table used for color correction //gamma 2.8 lookup table used for color correction

View File

@ -14,6 +14,7 @@ void getStringFromJson(char* dest, const char* src, size_t len) {
} }
bool deserializeConfig(JsonObject doc, bool fromFS) { bool deserializeConfig(JsonObject doc, bool fromFS) {
bool needsSave = false;
//int rev_major = doc["rev"][0]; // 1 //int rev_major = doc["rev"][0]; // 1
//int rev_minor = doc["rev"][1]; // 0 //int rev_minor = doc["rev"][1]; // 0
@ -411,13 +412,12 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
DEBUG_PRINTLN(F("Starting usermod config.")); DEBUG_PRINTLN(F("Starting usermod config."));
JsonObject usermods_settings = doc["um"]; JsonObject usermods_settings = doc["um"];
if (!usermods_settings.isNull()) { if (!usermods_settings.isNull()) {
bool allComplete = usermods.readFromConfig(usermods_settings); needsSave = usermods.readFromConfig(usermods_settings);
if (!allComplete && fromFS) serializeConfig();
} }
if (fromFS) return false; if (fromFS) return needsSave;
doReboot = doc[F("rb")] | doReboot; doReboot = doc[F("rb")] | doReboot;
return (doc["sv"] | true); return (doc["sv"] | needsSave);
} }
void deserializeConfigFromFS() { void deserializeConfigFromFS() {
@ -427,19 +427,29 @@ void deserializeConfigFromFS() {
return; return;
} }
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
DEBUG_PRINTLN(F("Reading settings from /cfg.json...")); DEBUG_PRINTLN(F("Reading settings from /cfg.json..."));
success = readObjectFromFile("/cfg.json", nullptr, &doc); success = readObjectFromFile("/cfg.json", nullptr, &doc);
if (!success) { //if file does not exist, try reading from EEPROM if (!success) { //if file does not exist, try reading from EEPROM
deEEPSettings(); deEEPSettings();
jsonBufferLock = false;
return; return;
} }
// NOTE: This routine deserializes *and* applies the configuration // NOTE: This routine deserializes *and* applies the configuration
// Therefore, must also initialize ethernet from this function // Therefore, must also initialize ethernet from this function
deserializeConfig(doc.as<JsonObject>(), true); bool needsSave = deserializeConfig(doc.as<JsonObject>(), true);
jsonBufferLock = false;
if (needsSave) serializeConfig(); // usermods required new prameters
} }
void serializeConfig() { void serializeConfig() {
@ -447,7 +457,13 @@ void serializeConfig() {
DEBUG_PRINTLN(F("Writing settings to /cfg.json...")); DEBUG_PRINTLN(F("Writing settings to /cfg.json..."));
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
JsonArray rev = doc.createNestedArray("rev"); JsonArray rev = doc.createNestedArray("rev");
rev.add(1); //major settings revision rev.add(1); //major settings revision
@ -754,16 +770,26 @@ void serializeConfig() {
File f = WLED_FS.open("/cfg.json", "w"); File f = WLED_FS.open("/cfg.json", "w");
if (f) serializeJson(doc, f); if (f) serializeJson(doc, f);
f.close(); f.close();
jsonBufferLock = false;
} }
//settings in /wsec.json, not accessible via webserver, for passwords and tokens //settings in /wsec.json, not accessible via webserver, for passwords and tokens
bool deserializeConfigSec() { bool deserializeConfigSec() {
DEBUG_PRINTLN(F("Reading settings from /wsec.json...")); DEBUG_PRINTLN(F("Reading settings from /wsec.json..."));
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
bool success = readObjectFromFile("/wsec.json", nullptr, &doc); bool success = readObjectFromFile("/wsec.json", nullptr, &doc);
if (!success) return false; if (!success) {
jsonBufferLock = false;
return false;
}
JsonObject nw_ins_0 = doc["nw"]["ins"][0]; JsonObject nw_ins_0 = doc["nw"]["ins"][0];
getStringFromJson(clientPass, nw_ins_0["psk"], 65); getStringFromJson(clientPass, nw_ins_0["psk"], 65);
@ -795,13 +821,20 @@ bool deserializeConfigSec() {
CJSON(wifiLock, ota[F("lock-wifi")]); CJSON(wifiLock, ota[F("lock-wifi")]);
CJSON(aOtaEnabled, ota[F("aota")]); CJSON(aOtaEnabled, ota[F("aota")]);
jsonBufferLock = false;
return true; return true;
} }
void serializeConfigSec() { void serializeConfigSec() {
DEBUG_PRINTLN(F("Writing settings to /wsec.json...")); DEBUG_PRINTLN(F("Writing settings to /wsec.json..."));
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
JsonObject nw = doc.createNestedObject("nw"); JsonObject nw = doc.createNestedObject("nw");
@ -836,4 +869,5 @@ void serializeConfigSec() {
File f = WLED_FS.open("/wsec.json", "w"); File f = WLED_FS.open("/wsec.json", "w");
if (f) serializeJson(doc, f); if (f) serializeJson(doc, f);
f.close(); f.close();
jsonBufferLock = false;
} }

View File

@ -288,7 +288,7 @@
// Size of buffer for API JSON object (increase for more segments) // Size of buffer for API JSON object (increase for more segments)
#ifdef ESP8266 #ifdef ESP8266
#define JSON_BUFFER_SIZE 9216 #define JSON_BUFFER_SIZE 10240
#else #else
#define JSON_BUFFER_SIZE 20480 #define JSON_BUFFER_SIZE 20480
#endif #endif

View File

@ -66,6 +66,8 @@ function handleVisibilityChange() {if (!d.hidden && new Date () - lastUpdate > 3
function sCol(na, col) {d.documentElement.style.setProperty(na, col);} function sCol(na, col) {d.documentElement.style.setProperty(na, col);}
function gId(c) {return d.getElementById(c);} function gId(c) {return d.getElementById(c);}
function gEBCN(c) {return d.getElementsByClassName(c);} function gEBCN(c) {return d.getElementsByClassName(c);}
function isEmpty(o) {return Object.keys(o).length === 0;}
function isObj(i) {return (i && typeof i === 'object' && !Array.isArray(i));}
function applyCfg() function applyCfg()
{ {
@ -210,6 +212,8 @@ function onLoad()
var sett = localStorage.getItem('wledUiCfg'); var sett = localStorage.getItem('wledUiCfg');
if (sett) cfg = mergeDeep(cfg, JSON.parse(sett)); if (sett) cfg = mergeDeep(cfg, JSON.parse(sett));
makeWS();
resetPUtil(); resetPUtil();
applyCfg(); applyCfg();
@ -249,7 +253,7 @@ function onLoad()
loadPalettesData(redrawPalPrev); loadPalettesData(redrawPalPrev);
loadFX(()=>{ loadFX(()=>{
loadPresets(()=>{ loadPresets(()=>{
loadInfo(requestJson); if (isObj(lastinfo) && isEmpty(lastinfo)) loadInfo(requestJson); // if not filled by WS
}); });
}); });
}); });
@ -529,7 +533,7 @@ function populatePresets(fromls)
pNum = 0; pNum = 0;
for (var key of (arr||[])) for (var key of (arr||[]))
{ {
if (!isObject(key[1])) continue; if (!isObj(key[1])) continue;
let i = parseInt(key[0]); let i = parseInt(key[0]);
var qll = key[1].ql; var qll = key[1].ql;
if (qll) pQL.push([i, qll, pName(i)]); if (qll) pQL.push([i, qll, pName(i)]);
@ -579,6 +583,11 @@ function parseInfo() {
function loadInfo(callback=null) function loadInfo(callback=null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/info'; var url = (loc?`http://${locip}`:'') + '/json/info';
var useWs = (ws && ws.readyState === WebSocket.OPEN);
if (useWs) {
ws.send('{"v":true}');
return;
}
fetch(url, { fetch(url, {
method: 'get' method: 'get'
}) })
@ -2283,19 +2292,14 @@ function togglePcMode(fromB = false)
lastw = w; lastw = w;
} }
function isObject(item)
{
return (item && typeof item === 'object' && !Array.isArray(item));
}
function mergeDeep(target, ...sources) function mergeDeep(target, ...sources)
{ {
if (!sources.length) return target; if (!sources.length) return target;
const source = sources.shift(); const source = sources.shift();
if (isObject(target) && isObject(source)) { if (isObj(target) && isObj(source)) {
for (const key in source) { for (const key in source) {
if (isObject(source[key])) { if (isObj(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} }); if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]); mergeDeep(target[key], source[key]);
} else { } else {

View File

@ -69,32 +69,27 @@
<input id="sliderR" onchange="fromRgb()" max="255" min="0" type="range" value="128" /> <input id="sliderR" onchange="fromRgb()" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div> <div class="sliderdisplay"></div>
</div> </div>
<!--output class="sliderbubble"></output-->
</div><br> </div><br>
<div id="gwrap" class="il"> <div id="gwrap" class="il">
<div class="sliderwrap il"> <div class="sliderwrap il">
<input id="sliderG" onchange="fromRgb()" max="255" min="0" type="range" value="128" /> <input id="sliderG" onchange="fromRgb()" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div> <div class="sliderdisplay"></div>
</div> </div>
<!--output class="sliderbubble"></output-->
</div><br> </div><br>
<div id="bwrap" class="il"> <div id="bwrap" class="il">
<div class="sliderwrap il"> <div class="sliderwrap il">
<input id="sliderB" onchange="fromRgb()" max="255" min="0" type="range" value="128" /> <input id="sliderB" onchange="fromRgb()" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div> <div class="sliderdisplay"></div>
</div> </div>
<!--output class="sliderbubble"></output-->
</div><br> </div><br>
</div> </div>
<div id="wwrap" class="center"> <div id="wwrap" class="center">
<p class="label hd">White channel</p> <p class="label hd">White channel</p>
<!--i class="icons slider-icon" id="wht" title="White channel">&#xe333;</i-->
<div class="sliderwrap il"> <div class="sliderwrap il">
<input id="sliderW" onchange="setColor(0)" max="255" min="0" type="range" value="128" /> <input id="sliderW" onchange="setColor(0)" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div> <div class="sliderdisplay"></div>
</div> </div>
<!--output class="sliderbubble"></output-->
</div> </div>
<div id="wbal"> <div id="wbal">
<p class="labels hd">White balance</p> <p class="labels hd">White balance</p>
@ -102,7 +97,6 @@
<input id="sliderA" onchange="setBalance(this.value)" max="255" min="0" type="range" value="128" /> <input id="sliderA" onchange="setBalance(this.value)" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div> <div class="sliderdisplay"></div>
</div> </div>
<!--output class="sliderbubble"></output-->
</div> </div>
<div id="Segments" class="center"> <div id="Segments" class="center">
@ -126,7 +120,6 @@
<div id="Effects" class="center"> <div id="Effects" class="center">
<p class="label h">Effect</p> <p class="label h">Effect</p>
<!--p class="label h">Effect speed</p-->
<div title="Effect speed"> <div title="Effect speed">
<i class="icons slider-icon">&#xe325;</i> <i class="icons slider-icon">&#xe325;</i>
<div class="sliderwrap il"> <div class="sliderwrap il">
@ -135,7 +128,6 @@
</div> </div>
<output class="sliderbubble"></output> <output class="sliderbubble"></output>
</div> </div>
<!--p class="label h">Effect intensity</p-->
<div title="Effect intensity"> <div title="Effect intensity">
<i class="icons slider-icon" onclick="tglLabels()">&#xe409;</i> <i class="icons slider-icon" onclick="tglLabels()">&#xe409;</i>
<div class="sliderwrap il"> <div class="sliderwrap il">

View File

@ -61,7 +61,8 @@ function handleVisibilityChange() {if (!d.hidden && new Date () - lastUpdate > 3
function sCol(na, col) {d.documentElement.style.setProperty(na, col);} function sCol(na, col) {d.documentElement.style.setProperty(na, col);}
function gId(c) {return d.getElementById(c);} function gId(c) {return d.getElementById(c);}
function gEBCN(c) {return d.getElementsByClassName(c);} function gEBCN(c) {return d.getElementsByClassName(c);}
function isO(item) { return (item && typeof item === 'object' && !Array.isArray(item)); } function isEmpty(o) {return Object.keys(o).length === 0;}
function isObj(i) { return (i && typeof i === 'object' && !Array.isArray(i)); }
function applyCfg() function applyCfg()
{ {
@ -191,6 +192,8 @@ async function onLoad()
var sett = localStorage.getItem('wledUiCfg'); var sett = localStorage.getItem('wledUiCfg');
if (sett) cfg = mergeDeep(cfg, JSON.parse(sett)); if (sett) cfg = mergeDeep(cfg, JSON.parse(sett));
makeWS();
applyCfg(); applyCfg();
if (cfg.theme.bg.url=="" || cfg.theme.bg.url === "https://picsum.photos/1920/1080") { if (cfg.theme.bg.url=="" || cfg.theme.bg.url === "https://picsum.photos/1920/1080") {
var iUrl = cfg.theme.bg.url; var iUrl = cfg.theme.bg.url;
@ -235,7 +238,7 @@ async function onLoad()
loadPalettesData(redrawPalPrev); loadPalettesData(redrawPalPrev);
loadFX(()=>{ loadFX(()=>{
loadPresets(()=>{ loadPresets(()=>{
loadInfo(requestJson); if (isObj(lastinfo) && isEmpty(lastinfo)) loadInfo(requestJson); // if not filled by WS
}); });
}); });
}); });
@ -446,7 +449,7 @@ function populatePresets()
pNum = 0; pNum = 0;
for (var key of (arr||[])) for (var key of (arr||[]))
{ {
if (!isO(key[1])) continue; if (!isObj(key[1])) continue;
let i = parseInt(key[0]); let i = parseInt(key[0]);
var qll = key[1].ql; var qll = key[1].ql;
if (qll) pQL.push([i, qll, pName(i)]); if (qll) pQL.push([i, qll, pName(i)]);
@ -462,9 +465,29 @@ function populatePresets()
populateQL(); populateQL();
} }
function parseInfo() {
var li = lastinfo;
var name = li.name;
gId('namelabel').innerHTML = name;
// if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)";
if (li.live) name = "(Live) " + name;
if (loc) name = "(L) " + name;
d.title = name;
isRgbw = li.leds.wv;
ledCount = li.leds.count;
syncTglRecv = li.str;
maxSeg = li.leds.maxseg;
pmt = li.fs.pmt;
}
function loadInfo(callback=null) function loadInfo(callback=null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/info'; var url = (loc?`http://${locip}`:'') + '/json/info';
var useWs = (ws && ws.readyState === WebSocket.OPEN);
if (useWs) {
ws.send('{"v":true}');
return;
}
fetch(url, { fetch(url, {
method: 'get' method: 'get'
}) })
@ -475,18 +498,10 @@ function loadInfo(callback=null)
.then(json => { .then(json => {
clearErrorToast(); clearErrorToast();
lastinfo = json; lastinfo = json;
var name = json.name; parseInfo();
gId('namelabel').innerHTML = name; showNodes();
// if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)";
if (json.live) name = "(Live) " + name;
if (loc) name = "(L) " + name;
d.title = name;
isRgbw = json.leds.wv;
ledCount = json.leds.count;
syncTglRecv = json.str;
maxSeg = json.leds.maxseg;
pmt = json.fs.pmt;
if (isInfo) populateInfo(json); if (isInfo) populateInfo(json);
updateUI();
reqsLegal = true; reqsLegal = true;
if (!ws && lastinfo.ws > -1) setTimeout(makeWS,500); if (!ws && lastinfo.ws > -1) setTimeout(makeWS,500);
}) })
@ -860,23 +875,14 @@ function makeWS() {
clearErrorToast(); clearErrorToast();
gId('connind').style.backgroundColor = "var(--c-l)"; gId('connind').style.backgroundColor = "var(--c-l)";
// json object should contain json.info AND json.state (but may not) // json object should contain json.info AND json.state (but may not)
var info = json.info; var i = json.info;
if (info) { if (i) {
var name = info.name; lastinfo = i;
lastinfo = info; parseInfo();
gId('namelabel').innerHTML = name; showNodes();
//if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)"; if (isInfo) populateInfo(i);
if (info.live) name = "(Live) " + name;
if (loc) name = "(L) " + name;
d.title = name;
isRgbw = info.leds.wv;
ledCount = info.leds.count;
syncTglRecv = info.str;
maxSeg = info.leds.maxseg;
pmt = info.fs.pmt;
if (isInfo) populateInfo(info);
} else } else
info = lastinfo; i = lastinfo;
var s = json.state ? json.state : json; var s = json.state ? json.state : json;
readState(s); readState(s);
}; };
@ -1398,9 +1404,9 @@ function mergeDeep(target, ...sources)
if (!sources.length) return target; if (!sources.length) return target;
const source = sources.shift(); const source = sources.shift();
if (isO(target) && isO(source)) { if (isObj(target) && isObj(source)) {
for (const key in source) { for (const key in source) {
if (isO(source[key])) { if (isObj(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} }); if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]); mergeDeep(target[key], source[key]);
} else { } else {

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -572,18 +572,25 @@ void decodeIRJson(uint32_t code)
{ {
char objKey[10]; char objKey[10];
String cmdStr; String cmdStr;
DynamicJsonDocument irDoc(JSON_BUFFER_SIZE);
JsonObject fdo; JsonObject fdo;
JsonObject jsonCmdObj; JsonObject jsonCmdObj;
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
sprintf_P(objKey, PSTR("\"0x%lX\":"), (unsigned long)code); sprintf_P(objKey, PSTR("\"0x%lX\":"), (unsigned long)code);
// attempt to read command from ir.json // attempt to read command from ir.json
// this may fail for two reasons: ir.json does not exist or IR code not found // this may fail for two reasons: ir.json does not exist or IR code not found
// if the IR code is not found readObjectFromFile() will clean() irDoc JSON document // if the IR code is not found readObjectFromFile() will clean() doc JSON document
// so we can differentiate between the two // so we can differentiate between the two
readObjectFromFile("/ir.json", objKey, &irDoc); readObjectFromFile("/ir.json", objKey, &doc);
fdo = irDoc.as<JsonObject>(); fdo = doc.as<JsonObject>();
lastValidCode = 0; lastValidCode = 0;
if (fdo.isNull()) { if (fdo.isNull()) {
//the received code does not exist //the received code does not exist
@ -630,10 +637,11 @@ void decodeIRJson(uint32_t code)
} else if (!jsonCmdObj.isNull()) { } else if (!jsonCmdObj.isNull()) {
// command is JSON object // command is JSON object
//allow applyPreset() to reuse JSON buffer, or it would alloc. a second buffer and run out of mem. //allow applyPreset() to reuse JSON buffer, or it would alloc. a second buffer and run out of mem.
fileDoc = &irDoc; fileDoc = &doc;
deserializeState(jsonCmdObj, CALL_MODE_BUTTON); deserializeState(jsonCmdObj, CALL_MODE_BUTTON);
fileDoc = nullptr; fileDoc = nullptr;
} }
jsonBufferLock = false;
} }
void initIR() void initIR()

View File

@ -216,13 +216,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
} }
strip.setPixelSegment(255); strip.setPixelSegment(255);
strip.trigger(); strip.trigger();
// this is now handled using the "frz" toggle.
} else if (!elem["frz"] && iarr.isNull()) { //return to regular effect } else if (!elem["frz"] && iarr.isNull()) { //return to regular effect
seg.setOption(SEG_OPTION_FREEZE, false); seg.setOption(SEG_OPTION_FREEZE, false);
} }
return; // seg.differs(prev); return; // seg.differs(prev);
} }
// deserializes WLED state (fileDoc points to doc object if called from web server)
bool deserializeState(JsonObject root, byte callMode, byte presetId) bool deserializeState(JsonObject root, byte callMode, byte presetId)
{ {
DEBUG_PRINTLN(F("Deserializing state")); DEBUG_PRINTLN(F("Deserializing state"));
@ -336,7 +336,8 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
int8_t ledmap = root[F("ledmap")] | -1; int8_t ledmap = root[F("ledmap")] | -1;
if (ledmap >= 0) { if (ledmap >= 0) {
strip.deserializeMap(ledmap); //strip.deserializeMap(ledmap); // requires separate JSON buffer
loadLedmap = ledmap;
} }
byte ps = root[F("psave")]; byte ps = root[F("psave")];
@ -912,37 +913,46 @@ void serveJson(AsyncWebServerRequest* request)
return; return;
} }
#ifdef WLED_USE_DYNAMIC_JSON
AsyncJsonResponse* response = new AsyncJsonResponse(JSON_BUFFER_SIZE); AsyncJsonResponse* response = new AsyncJsonResponse(JSON_BUFFER_SIZE);
JsonObject doc = response->getRoot(); #else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
AsyncJsonResponse *response = new AsyncJsonResponse(&doc);
#endif
JsonObject lDoc = response->getRoot();
switch (subJson) switch (subJson)
{ {
case 1: //state case 1: //state
serializeState(doc); break; serializeState(lDoc); break;
case 2: //info case 2: //info
serializeInfo(doc); break; serializeInfo(lDoc); break;
case 4: //node list case 4: //node list
serializeNodes(doc); break; serializeNodes(lDoc); break;
case 5: //palettes case 5: //palettes
serializePalettes(doc, request); break; serializePalettes(lDoc, request); break;
default: //all default: //all
JsonObject state = doc.createNestedObject("state"); JsonObject state = lDoc.createNestedObject("state");
serializeState(state); serializeState(state);
JsonObject info = doc.createNestedObject("info"); JsonObject info = lDoc.createNestedObject("info");
serializeInfo(info); serializeInfo(info);
if (subJson != 3) if (subJson != 3)
{ {
//doc[F("effects")] = serialized((const __FlashStringHelper*)JSON_mode_names); //lDoc[F("effects")] = serialized((const __FlashStringHelper*)JSON_mode_names);
JsonArray effects = doc.createNestedArray(F("effects")); JsonArray effects = lDoc.createNestedArray(F("effects"));
deserializeModeNames(effects, JSON_mode_names); // remove WLED-SR extensions from effect names deserializeModeNames(effects, JSON_mode_names); // remove WLED-SR extensions from effect names
doc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names); lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names);
} }
} }
DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", doc.memoryUsage(), subJson); DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson);
response->setLength(); response->setLength();
request->send(response); request->send(response);
jsonBufferLock = false;
} }
#define MAX_LIVE_LEDS 180 #define MAX_LIVE_LEDS 180

View File

@ -91,11 +91,20 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties
colorUpdated(CALL_MODE_DIRECT_CHANGE); colorUpdated(CALL_MODE_DIRECT_CHANGE);
} else if (strcmp_P(topic, PSTR("/api")) == 0) { } else if (strcmp_P(topic, PSTR("/api")) == 0) {
if (payload[0] == '{') { //JSON API if (payload[0] == '{') { //JSON API
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
deserializeJson(doc, payloadStr); deserializeJson(doc, payloadStr);
fileDoc = &doc; fileDoc = &doc;
deserializeState(doc.as<JsonObject>()); deserializeState(doc.as<JsonObject>());
fileDoc = nullptr; fileDoc = nullptr;
jsonBufferLock = false;
} else { //HTTP API } else { //HTTP API
String apireq = "win&"; String apireq = "win&";
apireq += (char*)payloadStr; apireq += (char*)payloadStr;

View File

@ -20,14 +20,22 @@ bool applyPreset(byte index, byte callMode)
deserializeState(fdo, callMode, index); deserializeState(fdo, callMode, index);
} else { } else {
DEBUGFS_PRINTLN(F("Make read buf")); DEBUGFS_PRINTLN(F("Make read buf"));
DynamicJsonDocument fDoc(JSON_BUFFER_SIZE); #ifdef WLED_USE_DYNAMIC_JSON
errorFlag = readObjectFromFileUsingId(filename, index, &fDoc) ? ERR_NONE : ERR_FS_PLOAD; DynamicJsonDocument doc(JSON_BUFFER_SIZE);
JsonObject fdo = fDoc.as<JsonObject>(); #else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
errorFlag = readObjectFromFileUsingId(filename, index, &doc) ? ERR_NONE : ERR_FS_PLOAD;
JsonObject fdo = doc.as<JsonObject>();
if (fdo["ps"] == index) fdo.remove("ps"); if (fdo["ps"] == index) fdo.remove("ps");
#ifdef WLED_DEBUG_FS #ifdef WLED_DEBUG_FS
serializeJson(fDoc, Serial); serializeJson(doc, Serial);
#endif #endif
deserializeState(fdo, callMode, index); deserializeState(fdo, callMode, index);
jsonBufferLock = false;
} }
if (!errorFlag) { if (!errorFlag) {
@ -40,22 +48,31 @@ bool applyPreset(byte index, byte callMode)
void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj) void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
{ {
if (index == 0 || (index > 250 && persist) || (index<255 && !persist)) return; if (index == 0 || (index > 250 && persist) || (index<255 && !persist)) return;
bool docAlloc = (fileDoc != nullptr);
JsonObject sObj = saveobj; JsonObject sObj = saveobj;
const char *filename = persist ? "/presets.json" : "/tmp.json"; const char *filename = persist ? "/presets.json" : "/tmp.json";
if (!docAlloc) { if (!fileDoc) {
DEBUGFS_PRINTLN(F("Allocating saving buffer")); DEBUGFS_PRINTLN(F("Allocating saving buffer"));
DynamicJsonDocument lDoc(JSON_BUFFER_SIZE); #ifdef WLED_USE_DYNAMIC_JSON
sObj = lDoc.to<JsonObject>(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
sObj = doc.to<JsonObject>();
if (pname) sObj["n"] = pname; if (pname) sObj["n"] = pname;
DEBUGFS_PRINTLN(F("Save current state")); DEBUGFS_PRINTLN(F("Save current state"));
serializeState(sObj, true); serializeState(sObj, true);
if (persist) currentPreset = index; if (persist) currentPreset = index;
writeObjectToFileUsingId(filename, index, &lDoc); writeObjectToFileUsingId(filename, index, &doc);
} else { //from JSON API
jsonBufferLock = false;
} else { //from JSON API (fileDoc != nullptr)
DEBUGFS_PRINTLN(F("Reuse recv buffer")); DEBUGFS_PRINTLN(F("Reuse recv buffer"));
sObj.remove(F("psave")); sObj.remove(F("psave"));
sObj.remove(F("v")); sObj.remove(F("v"));

View File

@ -415,7 +415,14 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
//USERMODS //USERMODS
if (subPage == 8) if (subPage == 8)
{ {
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
JsonObject um = doc.createNestedObject("um"); JsonObject um = doc.createNestedObject("um");
size_t args = request->args(); size_t args = request->args();
@ -490,6 +497,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
usermods.readFromConfig(um); // force change of usermod parameters usermods.readFromConfig(um); // force change of usermod parameters
} }
jsonBufferLock = false;
if (subPage != 2 && (subPage != 6 || !doReboot)) serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init) if (subPage != 2 && (subPage != 6 || !doReboot)) serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init)
if (subPage == 4) alexaInit(); if (subPage == 4) alexaInit();
} }

View File

@ -64,6 +64,15 @@ class AsyncJsonResponse: public AsyncAbstractResponse {
public: public:
AsyncJsonResponse(JsonDocument *ref, bool isArray=false) : _jsonBuffer(1), _isValid{false} {
_code = 200;
_contentType = JSON_MIMETYPE;
if(isArray)
_root = ref->to<JsonArray>();
else
_root = ref->to<JsonObject>();
}
AsyncJsonResponse(size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE, bool isArray=false) : _jsonBuffer(maxJsonBufferSize), _isValid{false} { AsyncJsonResponse(size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE, bool isArray=false) : _jsonBuffer(maxJsonBufferSize), _isValid{false} {
_code = 200; _code = 200;
_contentType = JSON_MIMETYPE; _contentType = JSON_MIMETYPE;
@ -84,7 +93,7 @@ class AsyncJsonResponse: public AsyncAbstractResponse {
return _contentLength; return _contentLength;
} }
size_t getSize() { return _jsonBuffer.size(); } size_t getSize() { return _root.size(); }
size_t _fillBuffer(uint8_t *data, size_t len){ size_t _fillBuffer(uint8_t *data, size_t len){
ChunkPrint dest(data, _sentLength, len); ChunkPrint dest(data, _sentLength, len);

View File

@ -147,11 +147,16 @@ void WLED::loop()
delete busConfigs[i]; busConfigs[i] = nullptr; delete busConfigs[i]; busConfigs[i] = nullptr;
} }
strip.finalizeInit(); strip.finalizeInit();
loadLedmap = 0;
if (aligned) strip.makeAutoSegments(); if (aligned) strip.makeAutoSegments();
else strip.fixInvalidSegments(); else strip.fixInvalidSegments();
yield(); yield();
serializeConfig(); serializeConfig();
} }
if (loadLedmap >= 0) {
strip.deserializeMap(loadLedmap);
loadLedmap = -1;
}
yield(); yield();
handleWs(); handleWs();
@ -336,6 +341,7 @@ void WLED::beginStrip()
{ {
// Initialize NeoPixel Strip and button // Initialize NeoPixel Strip and button
strip.finalizeInit(); // busses created during deserializeConfig() strip.finalizeInit(); // busses created during deserializeConfig()
strip.deserializeMap();
strip.makeAutoSegments(); strip.makeAutoSegments();
strip.setBrightness(0); strip.setBrightness(0);
strip.setShowCallback(handleOverlayDraw); strip.setShowCallback(handleOverlayDraw);

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2111031 #define VERSION 2111051
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG
@ -597,10 +597,17 @@ WLED_GLOBAL BusManager busses _INIT(BusManager());
WLED_GLOBAL WS2812FX strip _INIT(WS2812FX()); WLED_GLOBAL WS2812FX strip _INIT(WS2812FX());
WLED_GLOBAL BusConfig* busConfigs[WLED_MAX_BUSSES] _INIT({nullptr}); //temporary, to remember values from network callback until after WLED_GLOBAL BusConfig* busConfigs[WLED_MAX_BUSSES] _INIT({nullptr}); //temporary, to remember values from network callback until after
WLED_GLOBAL bool doInitBusses _INIT(false); WLED_GLOBAL bool doInitBusses _INIT(false);
WLED_GLOBAL int8_t loadLedmap _INIT(-1);
// Usermod manager // Usermod manager
WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager()); WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
// global ArduinoJson buffer
#ifndef WLED_USE_DYNAMIC_JSON
WLED_GLOBAL StaticJsonDocument<JSON_BUFFER_SIZE> doc;
#endif
WLED_GLOBAL volatile bool jsonBufferLock _INIT(false);
// enable additional debug output // enable additional debug output
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
#ifndef ESP8266 #ifndef ESP8266

View File

@ -382,8 +382,15 @@ void deEEP() {
DEBUG_PRINTLN(F("Preset file not found, attempting to load from EEPROM")); DEBUG_PRINTLN(F("Preset file not found, attempting to load from EEPROM"));
DEBUGFS_PRINTLN(F("Allocating saving buffer for dEEP")); DEBUGFS_PRINTLN(F("Allocating saving buffer for dEEP"));
DynamicJsonDocument dDoc(JSON_BUFFER_SIZE *2); #ifdef WLED_USE_DYNAMIC_JSON
JsonObject sObj = dDoc.to<JsonObject>(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
JsonObject sObj = doc.to<JsonObject>();
sObj.createNestedObject("0"); sObj.createNestedObject("0");
EEPROM.begin(EEPSIZE); EEPROM.begin(EEPSIZE);
@ -442,8 +449,6 @@ void deEEP() {
} }
} }
for (uint16_t index = 1; index <= 16; index++) { //copy macros to presets.json for (uint16_t index = 1; index <= 16; index++) { //copy macros to presets.json
char m[65]; char m[65];
readStringFromEEPROM(1024+64*(index-1), m, 64); readStringFromEEPROM(1024+64*(index-1), m, 64);
@ -465,8 +470,11 @@ void deEEP() {
errorFlag = ERR_FS_GENERAL; errorFlag = ERR_FS_GENERAL;
return; return;
} }
serializeJson(dDoc, f); serializeJson(doc, f);
f.close(); f.close();
jsonBufferLock = false;
DEBUG_PRINTLN(F("deEEP complete!")); DEBUG_PRINTLN(F("deEEP complete!"));
} }

View File

@ -43,18 +43,26 @@ void handleSerial()
} }
else if (next == '{') { //JSON API else if (next == '{') { //JSON API
bool verboseResponse = false; bool verboseResponse = false;
{ #ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
Serial.setTimeout(100); #else
DeserializationError error = deserializeJson(doc, Serial); while (jsonBufferLock) delay(1);
if (error) return; jsonBufferLock = true;
fileDoc = &doc; doc.clear();
verboseResponse = deserializeState(doc.as<JsonObject>()); #endif
fileDoc = nullptr; Serial.setTimeout(100);
DeserializationError error = deserializeJson(doc, Serial);
if (error) {
jsonBufferLock = false;
return;
} }
fileDoc = &doc;
verboseResponse = deserializeState(doc.as<JsonObject>());
fileDoc = nullptr;
//only send response if TX pin is unused for other purposes //only send response if TX pin is unused for other purposes
if (verboseResponse && !pinManager.isPinAllocated(1)) { if (verboseResponse && !pinManager.isPinAllocated(1)) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); doc.clear();
JsonObject state = doc.createNestedObject("state"); JsonObject state = doc.createNestedObject("state");
serializeState(state); serializeState(state);
JsonObject info = doc.createNestedObject("info"); JsonObject info = doc.createNestedObject("info");
@ -62,6 +70,7 @@ void handleSerial()
serializeJson(doc, Serial); serializeJson(doc, Serial);
} }
jsonBufferLock = false;
} }
break; break;
case AdaState::Header_d: case AdaState::Header_d:

View File

@ -110,9 +110,16 @@ void initServer()
bool verboseResponse = false; bool verboseResponse = false;
bool isConfig = false; bool isConfig = false;
{ //scope JsonDocument so it releases its buffer { //scope JsonDocument so it releases its buffer
DynamicJsonDocument jsonBuffer(JSON_BUFFER_SIZE); #ifdef WLED_USE_DYNAMIC_JSON
DeserializationError error = deserializeJson(jsonBuffer, (uint8_t*)(request->_tempObject)); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
JsonObject root = jsonBuffer.as<JsonObject>(); #else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
DeserializationError error = deserializeJson(doc, (uint8_t*)(request->_tempObject));
JsonObject root = doc.as<JsonObject>();
if (error || root.isNull()) { if (error || root.isNull()) {
request->send(400, "application/json", F("{\"error\":9}")); return; request->send(400, "application/json", F("{\"error\":9}")); return;
} }
@ -124,12 +131,13 @@ void initServer()
serializeJson(root,Serial); serializeJson(root,Serial);
DEBUG_PRINTLN(); DEBUG_PRINTLN();
#endif #endif
fileDoc = &jsonBuffer; // used for applying presets (presets.cpp) fileDoc = &doc; // used for applying presets (presets.cpp)
verboseResponse = deserializeState(root); verboseResponse = deserializeState(root);
fileDoc = nullptr; fileDoc = nullptr;
} else { } else {
verboseResponse = deserializeConfig(root); //use verboseResponse to determine whether cfg change should be saved immediately verboseResponse = deserializeConfig(root); //use verboseResponse to determine whether cfg change should be saved immediately
} }
jsonBufferLock = false;
} }
if (verboseResponse) { if (verboseResponse) {
if (!isConfig) { if (!isConfig) {

View File

@ -36,16 +36,27 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp
} }
bool verboseResponse = false; bool verboseResponse = false;
{ //scope JsonDocument so it releases its buffer { //scope JsonDocument so it releases its buffer
DynamicJsonDocument jsonBuffer(JSON_BUFFER_SIZE); #ifdef WLED_USE_DYNAMIC_JSON
DeserializationError error = deserializeJson(jsonBuffer, data, len); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
JsonObject root = jsonBuffer.as<JsonObject>(); #else
if (error || root.isNull()) return; while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
DeserializationError error = deserializeJson(doc, data, len);
JsonObject root = doc.as<JsonObject>();
if (error || root.isNull()) {
jsonBufferLock = false;
return;
}
/*
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
DEBUG_PRINT(F("Incoming WS: ")); DEBUG_PRINT(F("Incoming WS: "));
serializeJson(root,Serial); serializeJson(root,Serial);
DEBUG_PRINTLN(); DEBUG_PRINTLN();
#endif #endif
*/
if (root["v"] && root.size() == 1) { if (root["v"] && root.size() == 1) {
//if the received value is just "{"v":true}", send only to this client //if the received value is just "{"v":true}", send only to this client
verboseResponse = true; verboseResponse = true;
@ -53,7 +64,7 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp
{ {
wsLiveClientId = root["lv"] ? client->id() : 0; wsLiveClientId = root["lv"] ? client->id() : 0;
} else { } else {
fileDoc = &jsonBuffer; fileDoc = &doc;
verboseResponse = deserializeState(root); verboseResponse = deserializeState(root);
fileDoc = nullptr; fileDoc = nullptr;
if (!interfaceUpdateCallMode) { if (!interfaceUpdateCallMode) {
@ -61,6 +72,7 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp
if (millis() - lastInterfaceUpdate > 1700) verboseResponse = false; if (millis() - lastInterfaceUpdate > 1700) verboseResponse = false;
} }
} }
jsonBufferLock = false;
} }
//update if it takes longer than 300ms until next "broadcast" //update if it takes longer than 300ms until next "broadcast"
if (verboseResponse && (millis() - lastInterfaceUpdate < 1700 || !interfaceUpdateCallMode)) sendDataWs(client); if (verboseResponse && (millis() - lastInterfaceUpdate < 1700 || !interfaceUpdateCallMode)) sendDataWs(client);
@ -102,14 +114,24 @@ void sendDataWs(AsyncWebSocketClient * client)
AsyncWebSocketMessageBuffer * buffer; AsyncWebSocketMessageBuffer * buffer;
{ //scope JsonDocument so it releases its buffer { //scope JsonDocument so it releases its buffer
#ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
JsonObject state = doc.createNestedObject("state"); JsonObject state = doc.createNestedObject("state");
serializeState(state); serializeState(state);
JsonObject info = doc.createNestedObject("info"); JsonObject info = doc.createNestedObject("info");
serializeInfo(info); serializeInfo(info);
size_t len = measureJson(doc); size_t len = measureJson(doc);
buffer = ws.makeBuffer(len); buffer = ws.makeBuffer(len);
if (!buffer) return; //out of memory if (!buffer) {
jsonBufferLock = false;
return; //out of memory
}
/* /*
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
DEBUG_PRINT(F("Outgoing WS: ")); DEBUG_PRINT(F("Outgoing WS: "));
@ -118,6 +140,7 @@ void sendDataWs(AsyncWebSocketClient * client)
#endif #endif
*/ */
serializeJson(doc, (char *)buffer->get(), len +1); serializeJson(doc, (char *)buffer->get(), len +1);
jsonBufferLock = false;
} }
DEBUG_PRINT(F("Sending WS data ")); DEBUG_PRINT(F("Sending WS data "));
if (client) { if (client) {

View File

@ -249,13 +249,22 @@ void getSettingsJS(byte subPage, char* dest)
{ {
char nS[8]; char nS[8];
// Pin reservations will become unnecessary when settings pages will read cfg.json directly
// add reserved and usermod pins as d.um_p array // add reserved and usermod pins as d.um_p array
oappend(SET_F("d.um_p=[6,7,8,9,10,11")); oappend(SET_F("d.um_p=[6,7,8,9,10,11"));
DynamicJsonDocument doc(JSON_BUFFER_SIZE/2); #ifdef WLED_USE_DYNAMIC_JSON
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
#else
while (jsonBufferLock) delay(1);
jsonBufferLock = true;
doc.clear();
#endif
JsonObject mods = doc.createNestedObject(F("um")); JsonObject mods = doc.createNestedObject(F("um"));
usermods.addToConfig(mods); usermods.addToConfig(mods);
if (!mods.isNull()) fillUMPins(mods); if (!mods.isNull()) fillUMPins(mods);
jsonBufferLock = false;
#ifdef WLED_ENABLE_DMX #ifdef WLED_ENABLE_DMX
oappend(SET_F(",2")); // DMX hardcoded pin oappend(SET_F(",2")); // DMX hardcoded pin