Merge branch 'settings-pin' into dev

This commit is contained in:
Blaz Kristan 2022-03-03 11:06:11 +01:00
commit 4ebfc1516c
20 changed files with 2982 additions and 2850 deletions

View File

@ -365,6 +365,12 @@ writeChunks(
/function GetV().*\<\/script\>/gms, /function GetV().*\<\/script\>/gms,
"</script><script src=\"settings.js?p=8\"></script>" "</script><script src=\"settings.js?p=8\"></script>"
) )
},
{
file: "settings_pin.htm",
name: "PAGE_settings_pin",
method: "gzip",
filter: "html-minify"
} }
], ],
"wled00/html_settings.h" "wled00/html_settings.h"
@ -410,6 +416,12 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
name: "PAGE_update", name: "PAGE_update",
method: "gzip", method: "gzip",
filter: "html-minify", filter: "html-minify",
mangle: (str) =>
str
.replace(
/function GetV().*\<\/script\>/gms,
"</script><script src=\"settings.js?p=9\"></script>"
)
}, },
{ {
file: "welcome.htm", file: "welcome.htm",

View File

@ -864,6 +864,9 @@ bool deserializeConfigSec() {
getStringFromJson(hueApiKey, interfaces["hue"][F("key")], 47); getStringFromJson(hueApiKey, interfaces["hue"][F("key")], 47);
#endif #endif
getStringFromJson(settingsPIN, doc["pin"], 5);
correctPIN = !strlen(settingsPIN);
JsonObject ota = doc["ota"]; JsonObject ota = doc["ota"];
getStringFromJson(otaPass, ota[F("pwd")], 33); getStringFromJson(otaPass, ota[F("pwd")], 33);
CJSON(otaLock, ota[F("lock")]); CJSON(otaLock, ota[F("lock")]);
@ -903,6 +906,8 @@ void serializeConfigSec() {
if_hue[F("key")] = hueApiKey; if_hue[F("key")] = hueApiKey;
#endif #endif
doc["pin"] = settingsPIN;
JsonObject ota = doc.createNestedObject("ota"); JsonObject ota = doc.createNestedObject("ota");
ota[F("pwd")] = otaPass; ota[F("pwd")] = otaPass;
ota[F("lock")] = otaLock; ota[F("lock")] = otaLock;

View File

@ -310,17 +310,13 @@ button {
#segutil, #segutil2, #segcont, #putil, #pcont, #pql { #segutil, #segutil2, #segcont, #putil, #pcont, #pql {
width: 280px; width: 280px;
margin: 0 auto; margin: 10px auto 0;
} }
#segutil .seg { #segutil .seg {
margin: 10px 0; margin: 10px 0;
} }
#segcont, #segutil, #putil {
padding: 10px 0 0;
}
.smooth { transition: transform calc(var(--f, 1)*.5s) ease-out } .smooth { transition: transform calc(var(--f, 1)*.5s) ease-out }
.tab-label { .tab-label {
@ -663,18 +659,16 @@ input[type=range]::-moz-range-thumb {
transform:translate3d(0,0,0); transform:translate3d(0,0,0);
overflow: clip; overflow: clip;
text-overflow: clip; text-overflow: clip;
border: 1px solid var(--c-2);
background-color: var(--c-2);
} }
.btn:hover { .btn:hover {
border: 1px solid var(--c-4); border: 1px solid var(--c-5);
background-color: var(--c-5); background-color: var(--c-5);
} }
.btn {
border: 1px solid var(--c-1);
background-color: var(--c-2);
}
.btn-s { .btn-s {
width: 100%; width: 100%;
margin: 0 0 10px; margin: 0;
} }
.btn-icon { .btn-icon {
margin: -4px 4px 0 0; margin: -4px 4px 0 0;
@ -683,7 +677,7 @@ input[type=range]::-moz-range-thumb {
} }
.btn-n { .btn-n {
width: 230px; width: 230px;
margin: 0 8px 10px 0; margin: 0 8px 0 0;
} }
.btn-p { .btn-p {
width: 120px; width: 120px;
@ -762,7 +756,7 @@ option {
input[type=number], input[type=text] { input[type=number], input[type=text] {
background: var(--c-3); background: var(--c-3);
color: var(--c-f); color: var(--c-f);
border: 1px solid var(--c-2); border: 0px solid var(--c-2);
border-radius: 5px; border-radius: 5px;
padding: 8px; padding: 8px;
margin: 6px 6px 6px 0; margin: 6px 6px 6px 0;
@ -827,21 +821,22 @@ input[type=number]::-webkit-outer-spin-button {
} }
*/ */
.segname, .pname { .segname, .pname {
padding: 4px 0; /*padding: 4px 0;*/
white-space: nowrap; white-space: nowrap;
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
overflow: hidden; overflow: hidden;
text-overflow: clip; text-overflow: clip;
line-height: 24px;
} }
.segpwr { .segpwr {
padding: 4px 0 4px 8px; padding: 4px 0 0 8px;
} }
.pid { .pid {
position: absolute; position: absolute;
top: 0px; top: 2px;
left: 0px; left: 0px;
padding: 12px 0px 0px 12px; padding: 12px 0px 0px 12px;
font-size: 16px; font-size: 16px;
@ -993,18 +988,22 @@ input[type=number]::-webkit-outer-spin-button {
.seg, .pres { .seg, .pres {
position: relative; position: relative;
display: block; display: block;
padding: 8px 0; padding: 10px 0;
margin: 0 0 10px; margin: 0 0 10px;
background-color: var(--c-2); background-color: var(--c-2);
color: var(--c-f); color: var(--c-f);
border: 0px solid var(--c-f); border: 0px solid var(--c-f);
border-radius: 20px; border-radius: 24px;
text-align: left; text-align: left;
transition: background-color 0.5s; transition: background-color 0.5s;
filter: brightness(1); filter: brightness(1);
font-size: 19px; font-size: 19px;
} }
.pres {
min-height: 24px;
}
.seg:last-child { .seg:last-child {
margin: 0; margin: 0;
} }
@ -1015,10 +1014,6 @@ input[type=number]::-webkit-outer-spin-button {
left: 8px; left: 8px;
} }
.pres {
padding-bottom: 4px;
}
.list { .list {
position: relative; position: relative;
width: 280px; width: 280px;
@ -1029,15 +1024,15 @@ input[type=number]::-webkit-outer-spin-button {
} }
.lstI { .lstI {
display: flex; /*display: flex;*/
align-items: center; align-items: center;
padding: 8px 10px; padding: 8px 10px;
cursor: pointer; cursor: pointer;
background-color: var(--c-2); background-color: var(--c-2);
overflow: hidden; overflow: hidden;
position: sticky; position: sticky;
border: 1px solid var(--c-2); /*border: 1px solid var(--c-2);*/
border-radius: 25px; border-radius: 24px;
margin: 10px auto 0; margin: 10px auto 0;
min-height: 24px; min-height: 24px;
} }
@ -1046,22 +1041,18 @@ input[type=number]::-webkit-outer-spin-button {
background: var(--c-4); background: var(--c-4);
} }
#pcont .pres:hover, #pcont .selected:hover, #segcont .seg:hover:not([class*="expanded"]),
#pcont .pres:hover:not([class*="expanded"]),
#pcont .selected:hover:not([class*="expanded"]),
.lstI:hover { .lstI:hover {
border: 1px solid var(--c-5); /*border: 1px solid var(--c-5);*/
background: var(--c-5); background: var(--c-5);
} }
#pcont .expand, #pcont .expand:hover {
border: 1px solid var(--c-1);
background-color: var(--c-2);
}
.selected .checkmark, .selected .checkmark,
.selected .radiomark, .selected .radiomark,
.selected input[type=number], .selected input[type=number],
.selected input[type=text], .selected input[type=text] {
.selected button.btn {
background-color: var(--c-3); background-color: var(--c-3);
} }
@ -1073,22 +1064,22 @@ input[type=number]::-webkit-outer-spin-button {
.lstI.sticky, .lstI.selected { .lstI.sticky, .lstI.selected {
z-index: 1; z-index: 1;
} }
/* /* calculated in index.js
#fxlist .lstI.selected { #fxlist .lstI.selected {
top: 142px; top: 142px;
} }
*/ */
#pallist .lstI.selected { #pallist .lstI.selected {
top: 84px; top: 82px;
} }
/* must be after .selected */ /* must be after .selected */
/* /* calculated in index.js
#fxlist .lstI.sticky { #fxlist .lstI.sticky {
top: 99px; top: 99px;
} }
*/ */
#pallist .lstI.sticky { #pallist .lstI.sticky {
top: 42px; top: 40px;
} }
.lstIcontent { .lstIcontent {
@ -1098,7 +1089,7 @@ input[type=number]::-webkit-outer-spin-button {
text-align: left; text-align: left;
display: inline-block;*/ display: inline-block;*/
position: relative; position: relative;
left: 40px; /*left: 40px;*/
} }
.lstIname { .lstIname {
@ -1128,35 +1119,34 @@ input[type="text"].fnd {
text-align: left; text-align: left;
border-radius: 25px; border-radius: 25px;
background: var(--c-2); background: var(--c-2);
border: 1px solid var(--c-3); /*border: 1px solid var(--c-3);*/
} }
input[type="text"].fnd:focus { input[type="text"].fnd:focus {
background-color: var(--c-4); background-color: var(--c-4);
} }
.selected button.btn:hover,
input[type="text"].fnd:not(:placeholder-shown), input[type="text"].fnd:not(:placeholder-shown),
input[type="text"].fnd:hover { input[type="text"].fnd:hover {
background-color: var(--c-3); background-color: var(--c-3);
} }
.segin { .segin {
padding: 0 8px 8px; padding: 8px;
display: none; display: none;
} }
.segin .btn { .segin .btn {
border: 1px solid var(--c-2); border: 1px solid var(--c-3);
background-color: var(--c-3); background-color: var(--c-3);
} }
.segin .btn:hover { .segin .btn:hover {
border: 1px solid var(--c-4); border: 1px solid var(--c-5);
background-color: var(--c-5); background-color: var(--c-5);
} }
.check input:checked ~ .checkmark:after, .radio input:checked ~ .radiomark:after, .check input:checked ~ .checkmark:after, .radio input:checked ~ .radiomark:after,
.expanded { .expanded, .expanded .segin {
display: block; display: block;
} }

View File

@ -155,7 +155,7 @@
<button id="csl1" class="btn xxs" onclick="selectSlot(1);">2</button> <button id="csl1" class="btn xxs" onclick="selectSlot(1);">2</button>
<button id="csl2" class="btn xxs" onclick="selectSlot(2);">3</button> <button id="csl2" class="btn xxs" onclick="selectSlot(2);">3</button>
</div> </div>
<p class="labels h" id="cslLabel"></p> <p class="labels hd h" id="cslLabel"></p>
<div id="hexw"> <div id="hexw">
<input id="hexc" type="text" class="noslide" onkeydown="hexEnter()" autocomplete="off" maxlength="8" /> <input id="hexc" type="text" class="noslide" onkeydown="hexEnter()" autocomplete="off" maxlength="8" />
<button id="hexcnf" class="btn btn-xs" onclick="fromHex();"><i class="icons btn-icon">&#xe390;</i></button> <button id="hexcnf" class="btn btn-xs" onclick="fromHex();"><i class="icons btn-icon">&#xe390;</i></button>
@ -239,7 +239,7 @@
<output class="sliderbubble"></output> <output class="sliderbubble"></output>
</div> </div>
<div class="il"> <div class="il">
<p class="labels" id="modeLabel">Effect mode</p> <p class="labels hd" id="modeLabel">Effect mode</p>
<div class="staytop fnd" id="fxFind"> <div class="staytop fnd" id="fxFind">
<input type="text" class="fnd" placeholder="Search" oninput="search(this,'fxlist')" onfocus="search(this,'fxlist')" /> <input type="text" class="fnd" placeholder="Search" oninput="search(this,'fxlist')" onfocus="search(this,'fxlist')" />
<i class="icons clear-icon" onclick="clean(this);">&#xe38f;</i> <i class="icons clear-icon" onclick="clean(this);">&#xe38f;</i>
@ -269,7 +269,7 @@
<div id="pql"> <div id="pql">
</div> </div>
<div id="pcont"> <div id="pcont">
Loading... <span onclick="loadPresets()">Loading...</span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -52,7 +52,7 @@ function applyCfg()
gId('hexw').style.display = ccfg.hex ? "block":"none"; gId('hexw').style.display = ccfg.hex ? "block":"none";
gId('picker').style.display = ccfg.picker ? "block":"none"; gId('picker').style.display = ccfg.picker ? "block":"none";
gId('vwrap').style.display = ccfg.picker ? "block":"none"; gId('vwrap').style.display = ccfg.picker ? "block":"none";
gId('kwrap').style.display = ccfg.picker ? "block":"none"; //gId('kwrap').style.display = ccfg.picker ? "block":"none";
gId('rgbwrap').style.display = ccfg.rgb ? "block":"none"; gId('rgbwrap').style.display = ccfg.rgb ? "block":"none";
gId('qcs-w').style.display = ccfg.quick ? "block":"none"; gId('qcs-w').style.display = ccfg.quick ? "block":"none";
var l = cfg.comp.labels; var l = cfg.comp.labels;
@ -514,7 +514,7 @@ function populateQL()
var cn = ""; var cn = "";
if (pQL.length > 0) { if (pQL.length > 0) {
pQL.sort((a,b) => (a[0]>b[0])); pQL.sort((a,b) => (a[0]>b[0]));
cn += `<p class="labels">Quick load</p>`; cn += `<p class="labels hd">Quick load</p>`;
for (var key of (pQL||[])) { for (var key of (pQL||[])) {
cn += `<button class="btn btn-xs psts" id="p${key[0]}qlb" title="${key[2]?key[2]:''}" onclick="setPreset(${key[0]});">${key[1]}</button>`; cn += `<button class="btn btn-xs psts" id="p${key[0]}qlb" title="${key[2]?key[2]:''}" onclick="setPreset(${key[0]});">${key[1]}</button>`;
} }
@ -527,7 +527,7 @@ function populatePresets(fromls)
if (fromls) pJson = JSON.parse(localStorage.getItem("wledP")); if (fromls) pJson = JSON.parse(localStorage.getItem("wledP"));
if (!pJson) {setTimeout(loadPresets,250); return;} if (!pJson) {setTimeout(loadPresets,250); return;}
delete pJson["0"]; delete pJson["0"];
var cn = `<p class="labels">All presets</p>`; var cn = `<p class="labels hd">All presets</p>`;
var arr = Object.entries(pJson); var arr = Object.entries(pJson);
arr.sort(cmpP); arr.sort(cmpP);
pQL = []; pQL = [];
@ -633,7 +633,7 @@ function populateSegments(s)
if (i == lowestUnused) lowestUnused = i+1; if (i == lowestUnused) lowestUnused = i+1;
if (i > lSeg) lSeg = i; if (i > lSeg) lSeg = i;
cn += `<div class="seg ${i==s.mainseg ? 'selected' : ''}" id="seg${i}wrp"> cn += `<div class="seg ${i==s.mainseg ? 'selected' : ''} ${expanded[i] ? "expanded":""}" id="seg${i}">
<label class="check schkl"> <label class="check schkl">
<input type="checkbox" id="seg${i}sel" onchange="selSeg(${i})" ${inst.sel ? "checked":""}> <input type="checkbox" id="seg${i}sel" onchange="selSeg(${i})" ${inst.sel ? "checked":""}>
<span class="checkmark schk"></span> <span class="checkmark schk"></span>
@ -649,7 +649,7 @@ function populateSegments(s)
<div class="sliderdisplay"></div> <div class="sliderdisplay"></div>
</div> </div>
</div> </div>
<div class="segin ${expanded[i] ? "expanded":""}" id="seg${i}"> <div class="segin" id="seg${i}in">
<input type="text" class="ptxt noslide" id="seg${i}t" autocomplete="off" maxlength=32 value="${inst.n?inst.n:""}" placeholder="Enter name..."/> <input type="text" class="ptxt noslide" id="seg${i}t" autocomplete="off" maxlength=32 value="${inst.n?inst.n:""}" placeholder="Enter name..."/>
<table class="infot segt"> <table class="infot segt">
<tr> <tr>
@ -1248,7 +1248,7 @@ function setSliderAndColorControl(idx, applyDef=false)
// set top position of the effect list // set top position of the effect list
gId("fxFind").style.top = topPosition + "px"; gId("fxFind").style.top = topPosition + "px";
topPosition += 42; topPosition += 40;
var fxList = gId("fxlist"); var fxList = gId("fxlist");
for (let f of fxList.children) f.style.top = null; // remove top for (let f of fxList.children) f.style.top = null; // remove top
var selected = fxList.querySelector('.selected'); var selected = fxList.querySelector('.selected');
@ -1379,6 +1379,7 @@ function requestJson(command=null)
var s = json.state ? json.state : json; var s = json.state ? json.state : json;
readState(s); readState(s);
if (!(ws && ws.readyState === WebSocket.OPEN)) makeWS(); if (!(ws && ws.readyState === WebSocket.OPEN)) makeWS();
if (!pJson) loadPresets();
reqsLegal = true; reqsLegal = true;
}) })
.catch((e)=>{ .catch((e)=>{
@ -1483,7 +1484,6 @@ function makeSeg()
function resetUtil() function resetUtil()
{ {
gId('segutil').innerHTML = '<button class="btn btn-s" onclick="makeSeg()"><i class="icons btn-icon">&#xe18a;</i>Add segment</button>'; gId('segutil').innerHTML = '<button class="btn btn-s" onclick="makeSeg()"><i class="icons btn-icon">&#xe18a;</i>Add segment</button>';
//for (var i=0; i<expanded.length; i++) if (expanded[i]) expand(i); // collapse all expanded elements
} }
var plJson = {"0":{ var plJson = {"0":{
@ -1660,7 +1660,6 @@ function makePUtil()
block: 'start', block: 'start',
}); });
gId('putil').innerHTML = `<div class="pres"><div class="segin expanded">${makeP(0)}</div></div>`; gId('putil').innerHTML = `<div class="pres"><div class="segin expanded">${makeP(0)}</div></div>`;
//for (var i=0; i<expanded.length; i++) if (expanded[i]) expand(i); // collapse all expanded elements
} }
function makePlEntry(p,i) { function makePlEntry(p,i) {
@ -2262,9 +2261,10 @@ function expand(i, c=false)
gId('sege' +i).classList.toggle("exp"); gId('sege' +i).classList.toggle("exp");
gId(util).classList.toggle(stay); gId(util).classList.toggle(stay);
// presets
if (i >= 100) { if (i >= 100) {
var p = i-100; var p = i-100;
gId(`p${p}o`).classList.toggle('expand'); gId(`p${p}o`).classList.toggle('expanded');
if (expanded[i]) { if (expanded[i]) {
if (isPlaylist(p)) { if (isPlaylist(p)) {
plJson[p] = pJson[p].playlist; plJson[p] = pJson[p].playlist;

View File

@ -4,27 +4,13 @@
<head> <head>
<meta content='width=device-width' name='viewport'> <meta content='width=device-width' name='viewport'>
<title>WLED Message</title> <title>WLED Message</title>
<script>function B() { window.history.back() }; function RS() { window.location = "/settings"; } function RP() { top.location.href = "/"; }</script> <script>
function B() { window.history.back() };
function RS() { window.location = "/settings"; }
function RP() { top.location.href = "/"; }
</script>
<style> <style>
.bt { @import url("style.css");
background: #333;
color: #fff;
font-family: Verdana, sans-serif;
border: .3ch solid #333;
display: inline-block;
font-size: 20px;
margin: 8px;
margin-top: 12px
}
body {
font-family: Verdana, sans-serif;
text-align: center;
background: #222;
color: #fff;
line-height: 200%%;
margin: 0
}
</style> </style>
</head> </head>

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=500">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<meta charset="utf-8">
<title>Misc Settings</title>
<script>
var d = document;
function H() { window.open("https://kno.wled.ge/features/settings/#security-settings"); }
function B() { window.open("/settings","_self"); }
function gId(s) { return d.getElementById(s); }
function isObj(item) { return (item && typeof item === 'object' && !Array.isArray(item)); }
</script>
<style>
@import url("style.css");
</style>
</head>
<body>
<form id="form_s" name="Sf" method="post">
<div class="toprow">
<div class="helpB"><button type="button" onclick="H()">?</button></div>
<button type="button" onclick="B()">Back</button><button type="submit">Submit</button><hr>
</div>
<h2>Please enter settings PIN code</h2>
<input type="password" name="PIN" size="4" maxlength="4" minlength="4"><br>
<hr>
<button type="button" onclick="B()">Back</button><button type="submit">Submit</button>
</form>
</body>
</html>

View File

@ -7,25 +7,11 @@
<title>Misc Settings</title> <title>Misc Settings</title>
<script> <script>
var d = document; var d = document;
function H() function H() { window.open("https://kno.wled.ge/features/settings/#security-settings"); }
{ function B() { window.open("/settings","_self"); }
window.open("https://kno.wled.ge/features/settings/#security-settings"); function U() { window.open("/update","_self"); }
} function gId(s) { return d.getElementById(s); }
function B() function isObj(o) { return (o && typeof o === 'object' && !Array.isArray(o)); }
{
window.open("/settings","_self");
}
function U()
{
window.open("/update","_self");
}
function gId(s)
{
return d.getElementById(s);
}
function isObject(item) {
return (item && typeof item === 'object' && !Array.isArray(item));
}
var timeout; var timeout;
function showToast(text, error = false) function showToast(text, error = false)
{ {
@ -47,6 +33,12 @@
fO.value = ''; fO.value = '';
return false; return false;
} }
function checkNum(o) {
// numeric keys only
if ([8,9,13,37,39,46,48,49,50,51,52,53,54,55,56,57,127].includes(event.keyCode)) return true;
event.preventDefault();
return false;
}
function GetV() function GetV()
{ {
//values injected by server while sending HTML //values injected by server while sending HTML
@ -60,9 +52,10 @@
<form id="form_s" name="Sf" method="post"> <form id="form_s" name="Sf" method="post">
<div class="toprow"> <div class="toprow">
<div class="helpB"><button type="button" onclick="H()">?</button></div> <div class="helpB"><button type="button" onclick="H()">?</button></div>
<button type="button" onclick="B()">Back</button><button type="submit">Save & Reboot</button><hr> <button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
</div> </div>
<h2>Security & Update setup</h2> <h2>Security & Update setup</h2>
Settings PIN: <input type="password" name="PIN" size="4" maxlength="4" minlength="4" onkeydown="checkNum(this)"><br>
Lock wireless (OTA) software update: <input type="checkbox" name="NO"><br> Lock wireless (OTA) software update: <input type="checkbox" name="NO"><br>
Passphrase: <input type="password" name="OP" maxlength="32"><br> Passphrase: <input type="password" name="OP" maxlength="32"><br>
To enable OTA, for security reasons you need to also enter the correct password!<br> To enable OTA, for security reasons you need to also enter the correct password!<br>
@ -76,7 +69,8 @@
<hr> <hr>
<h3>Software Update</h3> <h3>Software Update</h3>
<button type="button" onclick="U()">Manual OTA Update</button><br> <button type="button" onclick="U()">Manual OTA Update</button><br>
Enable ArduinoOTA: <input type="checkbox" name="AO"><br> Enable ArduinoOTA: <input type="checkbox" name="AO">
<hr>
<h3>Backup & Restore</h3> <h3>Backup & Restore</h3>
<a class="btn lnk" href="/presets.json?download" target="download-frame">Backup presets</a><br> <a class="btn lnk" href="/presets.json?download" target="download-frame">Backup presets</a><br>
<div>Restore presets<br><input type="file" name="data" accept=".json"> <input type="button" value="Upload" onclick="uploadFile(d.Sf.data,'/presets.json');"><br></div><br> <div>Restore presets<br><input type="file" name="data" accept=".json"> <input type="button" value="Upload" onclick="uploadFile(d.Sf.data,'/presets.json');"><br></div><br>
@ -85,6 +79,7 @@
<div style="color: #fa0;">&#9888; Restoring presets/configuration will OVERWRITE your current presets/configuration.<br> <div style="color: #fa0;">&#9888; Restoring presets/configuration will OVERWRITE your current presets/configuration.<br>
Incorrect configuration may require a factory reset or re-flashing of your ESP.</div> Incorrect configuration may require a factory reset or re-flashing of your ESP.</div>
For security reasons, passwords are not backed up. For security reasons, passwords are not backed up.
<hr>
<h3>About</h3> <h3>About</h3>
<a href="https://github.com/Aircoookie/WLED/" target="_blank">WLED</a> version ##VERSION##<!-- Autoreplaced from package.json --><br><br> <a href="https://github.com/Aircoookie/WLED/" target="_blank">WLED</a> version ##VERSION##<!-- Autoreplaced from package.json --><br><br>
<a href="https://github.com/Aircoookie/WLED/wiki/Contributors-and-credits" target="_blank">Contributors, dependencies and special thanks</a><br> <a href="https://github.com/Aircoookie/WLED/wiki/Contributors-and-credits" target="_blank">Contributors, dependencies and special thanks</a><br>
@ -93,7 +88,7 @@
<i>Licensed under the <a href="https://github.com/Aircoookie/WLED/blob/master/LICENSE" target="_blank">MIT license</a></i><br><br> <i>Licensed under the <a href="https://github.com/Aircoookie/WLED/blob/master/LICENSE" target="_blank">MIT license</a></i><br><br>
Server message: <span class="sip"> Response error! </span><hr> Server message: <span class="sip"> Response error! </span><hr>
<div id="toast"></div> <div id="toast"></div>
<button type="button" onclick="B()">Back</button><button type="submit">Save & Reboot</button> <button type="button" onclick="B()">Back</button><button type="submit">Save</button>
</form> </form>
<iframe name=download-frame style='display:none;'></iframe> <iframe name=download-frame style='display:none;'></iframe>
</body> </body>

View File

@ -31,7 +31,7 @@
{ {
var t = gId("WD"+i); var t = gId("WD"+i);
t.style.display = t.style.display!=="none" ? "none" : ""; t.style.display = t.style.display!=="none" ? "none" : "";
o.innerHTML = t.style.display==="none" ? "&#128467;" : "&#x2715;"; o.innerHTML = t.style.display==="none" ? "&#128197;" : "&#x2715;";
} }
function Cs() function Cs()
{ {
@ -97,7 +97,7 @@
for(j=0;j<8;j++) { for(j=0;j<8;j++) {
gId("W"+i+j).checked=wd>>j&1; gId("W"+i+j).checked=wd>>j&1;
} }
if ((wd&127) != 127 || (i<8 && (gN("M"+i).value != 1 || gN("D"+i).value != 1 || gN("P"+i).value != 12 || gN("E"+i).value != 31))) { if ((wd&254) != 254 || (i<8 && (gN("M"+i).value != 1 || gN("D"+i).value != 1 || gN("P"+i).value != 12 || gN("E"+i).value != 31))) {
expand(gId("CB"+i),i); //expand macros with custom DOW or date range set expand(gId("CB"+i),i); //expand macros with custom DOW or date range set
} }
} }

View File

@ -95,6 +95,9 @@ input[type="checkbox"] {
td input[type="checkbox"] { td input[type="checkbox"] {
margin-right: revert; margin-right: revert;
} }
input[type=file] {
font-size: 16px
}
select { select {
margin: 2px; margin: 2px;
background: #333; background: #333;
@ -118,6 +121,11 @@ td {
#TMT table { #TMT table {
width: 100%; width: 100%;
} }
#msg {
display: none;
}
#toast { #toast {
opacity: 0; opacity: 0;
background-color: #444; background-color: #444;

View File

@ -1,52 +1,29 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta content='width=device-width' name='viewport'> <meta content='width=device-width' name='viewport'>
<title>WLED Update</title> <title>WLED Update</title>
<script>function B() { window.history.back() } <script>
function U() {document.getElementById("uf").style.display="none";document.getElementById("msg").style.display="block";} function B() { window.history.back(); }
</script> function U() { document.getElementById("uf").style.display="none";document.getElementById("msg").style.display="block"; }
<style> function GetV() {/*injected values here*/}
.bt { </script>
background: #333; <style>
color: #fff; @import url("style.css");
font-family: Verdana, sans-serif; </style>
border: .3ch solid #333;
display: inline-block;
font-size: 20px;
margin: 8px;
margin-top: 12px
}
input[type=file] {
font-size: 16px
}
body {
font-family: Verdana, sans-serif;
text-align: center;
background: #222;
color: #fff;
line-height: 200%
}
#msg {
display: none;
}
</style>
</head> </head>
<body> <body onload="GetV()">
<h2>WLED Software Update</h2> <h2>WLED Software Update</h2>
<form method='POST' action='/update' id='uf' enctype='multipart/form-data' onsubmit="U()"> <form method='POST' action='/update' id='uf' enctype='multipart/form-data' onsubmit="U()">
Installed version: ##VERSION##<br> Installed version: <span class="sip">##VERSION##</span><br>
Download the latest binary: <a href="https://github.com/Aircoookie/WLED/releases" target="_blank"> Download the latest binary: <a href="https://github.com/Aircoookie/WLED/releases" target="_blank">
<img src="https://img.shields.io/github/release/Aircoookie/WLED.svg?style=flat-square"></a><br> <img src="https://img.shields.io/github/release/Aircoookie/WLED.svg?style=flat-square"></a><br>
<input type='file' class="bt" name='update' required><br> <!--should have accept='.bin', but it prevents file upload from android app--> <input type='file' class="bt" name='update' required><br> <!--should have accept='.bin', but it prevents file upload from android app-->
<input type='submit' class="bt" value='Update!' ><br> <input type='submit' class="bt" value='Update!' ><br>
<button type="button" class="bt" onclick="B()">Back</button></form> <button type="button" class="bt" onclick="B()">Back</button>
<div id="msg"><b>Updating...</b><br>Please do not close or refresh the page :)</div> </form>
<div id="msg"><b>Updating...</b><br>Please do not close or refresh the page :)</div>
</body> </body>
</html> </html>

View File

@ -320,6 +320,7 @@ void updateBaudRate(uint32_t rate);
//wled_server.cpp //wled_server.cpp
bool isIp(String str); bool isIp(String str);
void createEditHandler(bool enable);
bool captivePortal(AsyncWebServerRequest *request); bool captivePortal(AsyncWebServerRequest *request);
void initServer(); void initServer();
void serveIndexOrWelcome(AsyncWebServerRequest *request); void serveIndexOrWelcome(AsyncWebServerRequest *request);

View File

@ -21,9 +21,7 @@ const uint8_t PAGE_usermod[] PROGMEM = {
const char PAGE_msg[] PROGMEM = R"=====(<!DOCTYPE html><html><head><meta content="width=device-width" name="viewport"> const char PAGE_msg[] PROGMEM = R"=====(<!DOCTYPE html><html><head><meta content="width=device-width" name="viewport">
<title>WLED Message</title><script> <title>WLED Message</title><script>
function B(){window.history.back()}function RS(){window.location="/settings"}function RP(){top.location.href="/"} function B(){window.history.back()}function RS(){window.location="/settings"}function RP(){top.location.href="/"}
</script><style> </script><style>@import url("style.css");</style></head><body><h2>%MSG%</body></html>)=====";
.bt{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.3ch solid #333;display:inline-block;font-size:20px;margin:8px;margin-top:12px}body{font-family:Verdana,sans-serif;text-align:center;background:#222;color:#fff;line-height:200%%;margin:0}
</style></head><body><h2>%MSG%</body></html>)=====";
#ifdef WLED_ENABLE_DMX #ifdef WLED_ENABLE_DMX
@ -43,54 +41,48 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
#endif #endif
// Autogenerated from wled00/data/update.htm, do not edit!! // Autogenerated from wled00/data/update.htm, do not edit!!
const uint16_t PAGE_update_length = 734; const uint16_t PAGE_update_length = 626;
const uint8_t PAGE_update[] PROGMEM = { const uint8_t PAGE_update[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x85, 0x54, 0xef, 0x6b, 0xdc, 0x46, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x75, 0x53, 0xc1, 0x6e, 0xd4, 0x30,
0x10, 0xfd, 0xae, 0xbf, 0x62, 0xb3, 0xa6, 0x60, 0x43, 0x4e, 0xb2, 0xef, 0x20, 0x2d, 0x3a, 0x49, 0x10, 0xbd, 0xe7, 0x2b, 0x5c, 0x9f, 0x76, 0x25, 0xd6, 0xa1, 0x70, 0x40, 0x14, 0x27, 0x85, 0xa5,
0xa5, 0xae, 0xfd, 0x21, 0x50, 0x88, 0x21, 0x49, 0x4b, 0x28, 0xa5, 0xac, 0xb4, 0x23, 0x69, 0xb8, 0x15, 0xaa, 0x84, 0xd4, 0x4a, 0x6d, 0x41, 0x9c, 0x90, 0x13, 0x4f, 0x36, 0x66, 0x1d, 0x3b, 0xb5,
0xd5, 0xae, 0xb2, 0x3b, 0xba, 0xf3, 0xf5, 0xf0, 0xff, 0x9e, 0xd1, 0xca, 0x76, 0x9c, 0x94, 0xd2, 0x27, 0xbb, 0x8a, 0x50, 0xff, 0x9d, 0x71, 0xb2, 0x5b, 0xb5, 0x20, 0x2e, 0x51, 0x6c, 0xcf, 0x7b,
0x2f, 0x62, 0x7f, 0xcc, 0x7b, 0x33, 0xf3, 0xe6, 0xad, 0x8a, 0x57, 0x37, 0xef, 0x7e, 0xfd, 0xf0, 0x9e, 0xf7, 0xde, 0x58, 0x9e, 0x5c, 0x5c, 0x7f, 0xbe, 0xfb, 0x71, 0x73, 0xc9, 0x5a, 0xec, 0x6c,
0xe9, 0xee, 0x56, 0xf4, 0x34, 0x98, 0xaa, 0x78, 0xfc, 0x82, 0xd2, 0x55, 0x31, 0x00, 0x29, 0xd1, 0x29, 0x0f, 0x5f, 0x50, 0xba, 0x94, 0x1d, 0xa0, 0x62, 0xb5, 0x77, 0x08, 0x0e, 0x0b, 0xbe, 0x37,
0x38, 0x4b, 0x60, 0xa9, 0x94, 0x07, 0xd4, 0xd4, 0x97, 0x1a, 0xf6, 0xd8, 0xc0, 0x2a, 0x6e, 0xa4, 0x1a, 0xdb, 0x42, 0xc3, 0xce, 0xd4, 0xb0, 0x9a, 0x16, 0x9c, 0x39, 0xd5, 0x41, 0xc1, 0x77, 0x06,
0xb0, 0x6a, 0x80, 0x52, 0xee, 0x11, 0x0e, 0xa3, 0xf3, 0x24, 0xab, 0xa4, 0x20, 0x24, 0x03, 0xd5, 0xf6, 0xbd, 0x0f, 0xc8, 0xcb, 0x4c, 0xa2, 0x41, 0x0b, 0xe5, 0xf7, 0xaf, 0x97, 0x17, 0xec, 0xbe,
0x1f, 0xbf, 0xdd, 0xde, 0x88, 0x8f, 0xa3, 0x56, 0x04, 0x45, 0xb6, 0x1c, 0x15, 0xa1, 0xf1, 0x38, 0xd7, 0x0a, 0x41, 0xe6, 0xf3, 0x96, 0x8c, 0x75, 0x30, 0x3d, 0x96, 0x59, 0x33, 0xb8, 0x1a, 0x8d,
0x52, 0x95, 0xb4, 0x93, 0x6d, 0x08, 0x9d, 0x15, 0xd7, 0xe7, 0x17, 0xa7, 0x03, 0x5a, 0xed, 0x0e, 0x77, 0x6c, 0xbd, 0x58, 0xfe, 0xde, 0x1b, 0xa7, 0xfd, 0x5e, 0xb4, 0x26, 0xa2, 0x0f, 0xa3, 0xa8,
0x69, 0x8f, 0x81, 0x9c, 0x3f, 0xa6, 0xb5, 0x6a, 0x76, 0xe7, 0x17, 0x0f, 0xcf, 0x21, 0x1f, 0x39, 0x54, 0xbd, 0x5d, 0x2c, 0x1f, 0x9f, 0x4a, 0xee, 0xa9, 0x44, 0xfb, 0x7a, 0xe8, 0xa8, 0x03, 0xb1,
0x44, 0xbb, 0x66, 0x1a, 0xb8, 0x82, 0xb4, 0x03, 0xba, 0x35, 0x30, 0x2f, 0xaf, 0x8f, 0x6f, 0xf5, 0x01, 0xbc, 0xb4, 0x90, 0x7e, 0xd7, 0xe3, 0x95, 0x5e, 0xf0, 0xa1, 0xe1, 0x4b, 0x11, 0x71, 0xb4,
0xb9, 0x9c, 0x5a, 0x79, 0x91, 0x06, 0x3a, 0x1a, 0x48, 0x35, 0x86, 0xd1, 0xa8, 0x63, 0x29, 0xad, 0x20, 0xb4, 0x89, 0xbd, 0x55, 0x63, 0xc1, 0x9d, 0x77, 0xc0, 0x5f, 0xfd, 0x17, 0xd2, 0xc5, 0xcd,
0xb3, 0x20, 0x5f, 0xff, 0x27, 0x64, 0x08, 0xdd, 0xbf, 0x31, 0xb5, 0x71, 0xcd, 0x4e, 0x3e, 0x24, 0xbf, 0x98, 0xca, 0xfa, 0x7a, 0xcb, 0x1f, 0x33, 0x99, 0x1f, 0x5a, 0x3c, 0xb4, 0xca, 0x62, 0xa8,
0x45, 0xf6, 0x58, 0x62, 0x11, 0x03, 0xaa, 0x24, 0xad, 0xe9, 0x34, 0x57, 0xd4, 0x79, 0x37, 0x59, 0x0b, 0x1e, 0x01, 0xd1, 0xb8, 0x4d, 0x14, 0xbf, 0xe2, 0x79, 0x5f, 0xbc, 0xe7, 0xe5, 0xb3, 0xb2,
0x9d, 0x9f, 0x6d, 0x36, 0x9b, 0x6d, 0xe3, 0x8c, 0xf3, 0xf9, 0x59, 0xdb, 0xb6, 0xdb, 0x96, 0x95, 0xc4, 0x53, 0x7e, 0x34, 0x5d, 0x12, 0xcf, 0x86, 0x60, 0x17, 0x7c, 0xa6, 0xae, 0x63, 0xe4, 0xcb,
0x59, 0xb5, 0x6a, 0x40, 0x73, 0xcc, 0x7f, 0x07, 0xaf, 0x95, 0x55, 0xaf, 0x83, 0xb2, 0x61, 0x15, 0x0f, 0x89, 0x70, 0xaa, 0x90, 0xf9, 0xec, 0x67, 0xe5, 0xf5, 0xc8, 0xbc, 0xb3, 0x5e, 0xe9, 0x82,
0xc0, 0x63, 0xbb, 0xad, 0x9d, 0xd7, 0xe0, 0xf3, 0x74, 0xd3, 0xf4, 0x22, 0x38, 0x83, 0x5a, 0x44, 0x7f, 0x01, 0xfc, 0xb6, 0x58, 0x12, 0x5d, 0xfb, 0x66, 0xb6, 0xeb, 0xd6, 0x37, 0xb8, 0x57, 0x01,
0x82, 0xc7, 0xb4, 0x39, 0x5a, 0x83, 0x16, 0x56, 0x31, 0xf9, 0x42, 0x15, 0xf0, 0x1f, 0xc8, 0xd7, 0x9e, 0x7c, 0xa3, 0x03, 0xd9, 0xf8, 0xd0, 0xb1, 0x8c, 0x82, 0x68, 0x3d, 0x61, 0x6e, 0xae, 0x6f,
0x97, 0xe3, 0xfd, 0x76, 0x50, 0xbe, 0x43, 0x9b, 0xff, 0xf4, 0xbc, 0x5c, 0x91, 0x1b, 0xf3, 0xab, 0xef, 0x38, 0x53, 0x93, 0x37, 0x05, 0xcf, 0x87, 0xa9, 0x90, 0x33, 0x43, 0x47, 0x64, 0x06, 0x03,
0xf5, 0x78, 0xff, 0x80, 0x76, 0x9c, 0xe8, 0x4f, 0x3a, 0x8e, 0x50, 0xb6, 0x68, 0xe0, 0xaf, 0xd3, 0x72, 0x6d, 0xec, 0x29, 0x90, 0x6e, 0xb0, 0x68, 0x7a, 0x15, 0x30, 0x4f, 0xf8, 0x15, 0x55, 0x29,
0x57, 0xe8, 0xd5, 0x1b, 0xbe, 0xaf, 0x9d, 0x3e, 0x9e, 0xfe, 0xa7, 0x32, 0x82, 0x7b, 0x5a, 0x29, 0xce, 0x32, 0xef, 0xe2, 0x50, 0x75, 0x86, 0xa2, 0xbc, 0x4f, 0x17, 0x5f, 0xb9, 0x88, 0xca, 0x5a,
0x83, 0x9d, 0xcd, 0x1b, 0x96, 0x06, 0xfc, 0xf6, 0x65, 0x97, 0xeb, 0xf5, 0xfa, 0x65, 0x97, 0xb1, 0xd0, 0x6c, 0x07, 0x21, 0x12, 0xe3, 0x19, 0x93, 0xb1, 0x57, 0x8e, 0xd5, 0x56, 0xc5, 0x48, 0xc2,
0xca, 0x1e, 0xb0, 0xeb, 0x89, 0x8b, 0xbb, 0xfc, 0xe1, 0xe1, 0x8c, 0x45, 0x3c, 0x3d, 0x75, 0x31, 0x4d, 0xcf, 0xcb, 0xd7, 0xe2, 0xf4, 0xad, 0x38, 0x5d, 0x55, 0xf6, 0x1d, 0x89, 0xa1, 0x43, 0x12,
0xeb, 0x1d, 0x95, 0x8b, 0x8a, 0x15, 0xd9, 0x62, 0x9c, 0xb9, 0x08, 0x36, 0xd1, 0x7a, 0xf1, 0xc1, 0x11, 0xca, 0xec, 0xc2, 0xef, 0x27, 0x15, 0x0c, 0x5b, 0x60, 0x96, 0x7a, 0x88, 0xc8, 0x2a, 0xe3,
0x7b, 0xd7, 0xd2, 0x41, 0x79, 0x78, 0x36, 0x04, 0x5f, 0x14, 0xad, 0xf3, 0x83, 0x60, 0x83, 0xf5, 0x54, 0x18, 0x89, 0x43, 0xb1, 0xac, 0x0d, 0xd0, 0x14, 0xbc, 0x45, 0xec, 0xe3, 0x59, 0x9e, 0x6f,
0x4e, 0x97, 0xf2, 0xee, 0xdd, 0xfb, 0x0f, 0x52, 0x24, 0x2a, 0x0e, 0xbd, 0x94, 0xd9, 0x14, 0x03, 0x0c, 0xb6, 0x43, 0x25, 0x6a, 0xdf, 0xe5, 0x9f, 0x4c, 0xa8, 0xbd, 0xf7, 0x5b, 0x03, 0x79, 0xd2,
0xa5, 0x40, 0xbe, 0xe3, 0x29, 0x0b, 0x60, 0x3b, 0xcc, 0x1d, 0xcb, 0x61, 0x32, 0x84, 0xa3, 0xf2, 0x9c, 0x07, 0xb0, 0xa0, 0x22, 0x44, 0xce, 0x50, 0x05, 0x0a, 0xab, 0xe0, 0x3f, 0x2b, 0xab, 0xdc,
0x94, 0xcd, 0xf8, 0x15, 0x47, 0x29, 0x29, 0x9c, 0x0d, 0x53, 0x3d, 0x20, 0x5b, 0x94, 0xed, 0xc2, 0x96, 0x6c, 0x31, 0xdd, 0x86, 0x65, 0x53, 0x02, 0x47, 0x1e, 0xda, 0x11, 0xb1, 0x35, 0x60, 0x75,
0x1e, 0x7c, 0x6b, 0x03, 0x29, 0x63, 0x40, 0x8b, 0x3d, 0xf8, 0xc0, 0x8c, 0xb9, 0xb8, 0x4c, 0xaf, 0x14, 0xc6, 0x1f, 0x68, 0x8f, 0x14, 0x7f, 0x53, 0x8b, 0xb8, 0xdb, 0x9c, 0x4f, 0xf6, 0x17, 0x0d,
0x36, 0xe9, 0x15, 0x8b, 0xfd, 0x63, 0x51, 0xfb, 0xea, 0xc6, 0x1d, 0xac, 0x71, 0x4a, 0x0b, 0xea, 0x75, 0xb8, 0x8a, 0x0f, 0x03, 0x79, 0x9b, 0x26, 0x34, 0x57, 0x93, 0x08, 0x69, 0x5c, 0x3f, 0x20,
0x41, 0x18, 0xce, 0x14, 0x48, 0xd4, 0x68, 0x95, 0x3f, 0xe6, 0xa2, 0x50, 0x22, 0xe9, 0x3d, 0xb4, 0x9b, 0x0d, 0x6b, 0x8c, 0x25, 0x1f, 0x0f, 0xc2, 0x2b, 0x3c, 0x0e, 0xf6, 0xd1, 0xe0, 0x00, 0x0f,
0xa5, 0xec, 0x89, 0xc6, 0x90, 0x67, 0x59, 0x87, 0xd4, 0x4f, 0x75, 0xda, 0xb8, 0x21, 0xfb, 0x05, 0x83, 0x09, 0xa0, 0x9f, 0x03, 0xb3, 0x19, 0x39, 0x5b, 0xfa, 0x02, 0xbb, 0x53, 0x76, 0xa0, 0x93,
0x7d, 0xe3, 0x9c, 0xdb, 0x21, 0x64, 0x73, 0x67, 0x99, 0x07, 0x03, 0x2a, 0x40, 0x90, 0x82, 0x78, 0x39, 0xc6, 0x13, 0x3e, 0x83, 0xaa, 0x01, 0x91, 0x06, 0x7a, 0x06, 0xcd, 0x8b, 0x17, 0x20, 0x4a,
0x4c, 0xc0, 0x15, 0xfc, 0x5d, 0x1b, 0x65, 0x77, 0xb2, 0x2a, 0x70, 0xe8, 0x44, 0x12, 0x7c, 0xf3, 0xa7, 0xb6, 0xa6, 0xde, 0x16, 0x7c, 0x9d, 0xc2, 0x59, 0xd3, 0x43, 0x90, 0xf9, 0x5c, 0x47, 0xf3,
0x95, 0x87, 0x4f, 0xd2, 0xd0, 0x23, 0x18, 0x1d, 0x52, 0x74, 0x8f, 0xb4, 0x4f, 0x14, 0xdf, 0x53, 0x93, 0x62, 0x2c, 0xa5, 0x36, 0xbb, 0x29, 0xeb, 0x34, 0xc5, 0xc4, 0x58, 0x4e, 0x37, 0xd0, 0x6c,
0xa7, 0x61, 0xdf, 0xfd, 0x1c, 0x45, 0x2d, 0x5b, 0xae, 0x70, 0x15, 0x3e, 0x4f, 0xac, 0xe0, 0xfc, 0x0a, 0x21, 0xa8, 0x76, 0x8e, 0xe6, 0x66, 0x72, 0x83, 0x69, 0xcf, 0x9c, 0x47, 0xba, 0xc0, 0xd3,
0xc0, 0x32, 0x55, 0xcd, 0x3d, 0x14, 0xd1, 0x08, 0x62, 0x91, 0x65, 0x76, 0x82, 0x14, 0x8d, 0x51, 0xc2, 0x07, 0x52, 0xd0, 0x04, 0x88, 0xed, 0x14, 0x58, 0xaf, 0x36, 0xc0, 0xce, 0x96, 0x32, 0x27,
0x21, 0xb0, 0x9d, 0xe9, 0xe9, 0x5d, 0x3e, 0xc9, 0xe8, 0xe1, 0xf3, 0x84, 0x1e, 0xf4, 0x4b, 0x60, 0x3e, 0xe2, 0x4e, 0x53, 0x99, 0x46, 0x34, 0x3d, 0xfc, 0x3f, 0xc2, 0x07, 0x2a, 0x64, 0x0e, 0x04,
0xb2, 0x20, 0x17, 0xe5, 0xbe, 0xc1, 0xee, 0x95, 0x99, 0xf8, 0x66, 0x19, 0xd6, 0x2b, 0xb9, 0x80, 0x00, 0x00
0xea, 0x89, 0x88, 0xdf, 0xe3, 0x02, 0x5a, 0x36, 0xdf, 0x80, 0x12, 0x67, 0x1b, 0x83, 0xcd, 0xae,
0x94, 0xd7, 0xf3, 0x0c, 0xae, 0xd9, 0x4f, 0x45, 0xb6, 0xc4, 0xb1, 0x2b, 0xe6, 0x61, 0x55, 0x85,
0xc6, 0x7d, 0x9c, 0xe8, 0xfc, 0x08, 0x99, 0xb1, 0x8a, 0x19, 0xd0, 0x76, 0x69, 0x9a, 0x72, 0x6c,
0xcc, 0x93, 0xdc, 0x45, 0x35, 0x84, 0x76, 0xc2, 0x3a, 0xe2, 0x04, 0x8e, 0x37, 0xce, 0x73, 0x07,
0xad, 0x87, 0xd0, 0xc7, 0x81, 0x8d, 0xaa, 0x03, 0x91, 0x5f, 0x14, 0x19, 0xf3, 0x31, 0xf7, 0xe2,
0xb5, 0x2c, 0xfe, 0xb7, 0xbe, 0x00, 0x19, 0x01, 0xc2, 0x19, 0xcd, 0x04, 0x00, 0x00
}; };

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -7,10 +7,19 @@
//called upon POST settings form submit //called upon POST settings form submit
void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
{ {
// PIN code request
if (subPage == 252)
{
correctPIN = (strlen(settingsPIN)==0 || strncmp(settingsPIN, request->arg(F("PIN")).c_str(), 4)==0);
lastEditTime = millis();
return;
}
//0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec 7: DMX 8: usermods //0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec 7: DMX 8: usermods
if (subPage <1 || subPage >8) return; if (subPage <1 || subPage >8) return;
if (correctPIN) lastEditTime = millis();
//WIFI SETTINGS //WIFI SETTINGS
if (subPage == 1) if (subPage == 1)
{ {
@ -393,6 +402,14 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
doReboot = true; doReboot = true;
} }
if (request->hasArg(F("PIN"))) {
const char *pin = request->arg(F("PIN")).c_str();
if (strlen(pin) == 4 || strlen(pin) == 0) {
strlcpy(settingsPIN, pin, 5);
settingsPIN[4] = 0;
}
}
bool pwdCorrect = !otaLock; //always allow access if ota not locked bool pwdCorrect = !otaLock; //always allow access if ota not locked
if (request->hasArg(F("OP"))) if (request->hasArg(F("OP")))
{ {
@ -408,11 +425,14 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
if (pwdCorrect) //allow changes if correct pwd or no ota active if (pwdCorrect) //allow changes if correct pwd or no ota active
{ {
bool oldOTALock = otaLock;
otaLock = request->hasArg(F("NO")); otaLock = request->hasArg(F("NO"));
wifiLock = request->hasArg(F("OW")); wifiLock = request->hasArg(F("OW"));
aOtaEnabled = request->hasArg(F("AO")); aOtaEnabled = request->hasArg(F("AO"));
doReboot = (otaLock ^ oldOTALock);
} }
} }
#ifdef WLED_ENABLE_DMX // include only if DMX is enabled #ifdef WLED_ENABLE_DMX // include only if DMX is enabled
if (subPage == 7) if (subPage == 7)
{ {
@ -526,7 +546,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
releaseJSONBufferLock(); releaseJSONBufferLock();
} }
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

@ -139,6 +139,13 @@ void WLED::loop()
yield(); yield();
} }
// 15min PIN time-out
if (strlen(settingsPIN)>0 && millis() - lastEditTime > 900000) {
correctPIN = false;
server.removeHandler(editHandler);
createEditHandler(correctPIN);
}
//LED settings have been saved, re-init busses //LED settings have been saved, re-init busses
//This code block causes severe FPS drop on ESP32 with the original "if (busConfigs[0] != nullptr)" conditional. Investigate! //This code block causes severe FPS drop on ESP32 with the original "if (busConfigs[0] != nullptr)" conditional. Investigate!
if (doInitBusses) { if (doInitBusses) {
@ -723,9 +730,6 @@ void WLED::handleStatusLED()
{ {
#if defined(STATUSLED) #if defined(STATUSLED)
uint32_t c = 0; uint32_t c = 0;
static unsigned long ledStatusLastMillis = 0;
static unsigned short ledStatusType = 0; // current status type - corresponds to number of blinks per second
static bool ledStatusState = false; // the current LED state
#if STATUSLED>=0 #if STATUSLED>=0
if (pinManager.isPinAllocated(STATUSLED)) { if (pinManager.isPinAllocated(STATUSLED)) {

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2202281 #define VERSION 2203042
//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
@ -417,6 +417,9 @@ WLED_GLOBAL byte macroDoublePress[WLED_MAX_BUTTONS] _INIT({0});
WLED_GLOBAL bool otaLock _INIT(false); // prevents OTA firmware updates without password. ALWAYS enable if system exposed to any public networks WLED_GLOBAL bool otaLock _INIT(false); // prevents OTA firmware updates without password. ALWAYS enable if system exposed to any public networks
WLED_GLOBAL bool wifiLock _INIT(false); // prevents access to WiFi settings when OTA lock is enabled WLED_GLOBAL bool wifiLock _INIT(false); // prevents access to WiFi settings when OTA lock is enabled
WLED_GLOBAL bool aOtaEnabled _INIT(true); // ArduinoOTA allows easy updates directly from the IDE. Careful, it does not auto-disable when OTA lock is on WLED_GLOBAL bool aOtaEnabled _INIT(true); // ArduinoOTA allows easy updates directly from the IDE. Careful, it does not auto-disable when OTA lock is on
WLED_GLOBAL char settingsPIN[5] _INIT(""); // PIN for settings pages
WLED_GLOBAL bool correctPIN _INIT(true);
WLED_GLOBAL unsigned long lastEditTime _INIT(0);
WLED_GLOBAL uint16_t userVar0 _INIT(0), userVar1 _INIT(0); //available for use in usermod WLED_GLOBAL uint16_t userVar0 _INIT(0), userVar1 _INIT(0); //available for use in usermod
@ -603,6 +606,13 @@ WLED_GLOBAL byte optionType;
WLED_GLOBAL bool doReboot _INIT(false); // flag to initiate reboot from async handlers WLED_GLOBAL bool doReboot _INIT(false); // flag to initiate reboot from async handlers
WLED_GLOBAL bool doPublishMqtt _INIT(false); WLED_GLOBAL bool doPublishMqtt _INIT(false);
// status led
#if defined(STATUSLED)
WLED_GLOBAL unsigned long ledStatusLastMillis _INIT(0);
WLED_GLOBAL uint8_t ledStatusType _INIT(0); // current status type - corresponds to number of blinks per second
WLED_GLOBAL bool ledStatusState _INIT(false); // the current LED state
#endif
// server library objects // server library objects
WLED_GLOBAL AsyncWebServer server _INIT_N(((80))); WLED_GLOBAL AsyncWebServer server _INIT_N(((80)));
#ifdef WLED_ENABLE_WEBSOCKETS #ifdef WLED_ENABLE_WEBSOCKETS
@ -610,6 +620,7 @@ WLED_GLOBAL AsyncWebSocket ws _INIT_N((("/ws")));
#endif #endif
WLED_GLOBAL AsyncClient* hueClient _INIT(NULL); WLED_GLOBAL AsyncClient* hueClient _INIT(NULL);
WLED_GLOBAL AsyncMqttClient* mqtt _INIT(NULL); WLED_GLOBAL AsyncMqttClient* mqtt _INIT(NULL);
WLED_GLOBAL AsyncWebHandler *editHandler _INIT(nullptr);
// udp interface objects // udp interface objects
WLED_GLOBAL WiFiUDP notifierUdp, rgbUdp, notifier2Udp; WLED_GLOBAL WiFiUDP notifierUdp, rgbUdp, notifier2Udp;

View File

@ -18,8 +18,8 @@ bool isIp(String str) {
return true; return true;
} }
void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){ void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {
if (otaLock) { if (otaLock || !correctPIN) {
if (final) request->send(500, "text/plain", F("Please unlock OTA in security settings!")); if (final) request->send(500, "text/plain", F("Please unlock OTA in security settings!"));
return; return;
} }
@ -27,18 +27,42 @@ void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t
request->_tempFile = WLED_FS.open(filename, "w"); request->_tempFile = WLED_FS.open(filename, "w");
DEBUG_PRINT("Uploading "); DEBUG_PRINT("Uploading ");
DEBUG_PRINTLN(filename); DEBUG_PRINTLN(filename);
if (filename == "/presets.json") presetsModifiedTime = toki.second(); if (filename == F("/presets.json")) presetsModifiedTime = toki.second();
} }
if (len) { if (len) {
request->_tempFile.write(data,len); request->_tempFile.write(data,len);
} }
if (final) { if (final) {
request->_tempFile.close(); request->_tempFile.close();
request->send(200, "text/plain", F("File Uploaded!")); if (filename == F("/cfg.json")) {
doReboot = true;
request->send(200, "text/plain", F("Configuration restore successful.\nRebooting..."));
} else
request->send(200, "text/plain", F("File Uploaded!"));
cacheInvalidate++; cacheInvalidate++;
} }
} }
void createEditHandler(bool enable) {
if (enable) {
#ifdef WLED_ENABLE_FS_EDITOR
#ifdef ARDUINO_ARCH_ESP32
editHandler = &server.addHandler(new SPIFFSEditor(WLED_FS));//http_username,http_password));
#else
editHandler = &server.addHandler(new SPIFFSEditor("","",WLED_FS));//http_username,http_password));
#endif
#else
editHandler = server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("The FS editor is disabled in this build."), 254);
});
#endif
} else {
editHandler = &server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 500, "Access Denied", F("Please unlock settings page!"), 254);
});
}
}
bool captivePortal(AsyncWebServerRequest *request) bool captivePortal(AsyncWebServerRequest *request)
{ {
if (ON_STA_FILTER(request)) return false; //only serve captive in AP mode if (ON_STA_FILTER(request)) return false; //only serve captive in AP mode
@ -88,6 +112,18 @@ void initServer()
serveSettings(request); serveSettings(request);
}); });
server.on("/settings.js", HTTP_GET, [](AsyncWebServerRequest *request){
serveSettingsJS(request);
});
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", PAGE_settingsCss, PAGE_settingsCss_length);
response->addHeader(F("Content-Encoding"),"gzip");
setStaticContentCacheHeaders(response);
request->send(response);
});
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
if(!handleFileRead(request, "/favicon.ico")) if(!handleFileRead(request, "/favicon.ico"))
{ {
@ -212,37 +248,30 @@ void initServer()
request->send(response); request->send(response);
}); });
createEditHandler(correctPIN);
#ifndef WLED_DISABLE_OTA
//if OTA is allowed //if OTA is allowed
if (!otaLock){ if (!otaLock) {
#ifdef WLED_ENABLE_FS_EDITOR
#ifdef ARDUINO_ARCH_ESP32
server.addHandler(new SPIFFSEditor(WLED_FS));//http_username,http_password));
#else
server.addHandler(new SPIFFSEditor("","",WLED_FS));//http_username,http_password));
#endif
#else
server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("The FS editor is disabled in this build."), 254);
});
#endif
//init ota page //init ota page
#ifndef WLED_DISABLE_OTA
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_update, PAGE_update_length); AsyncWebServerResponse *response;
if (correctPIN) response = request->beginResponse_P(200, "text/html", PAGE_update, PAGE_update_length);
else response = request->beginResponse_P(200, "text/html", PAGE_settings_pin, PAGE_settings_pin_length);
response->addHeader(F("Content-Encoding"),"gzip"); response->addHeader(F("Content-Encoding"),"gzip");
setStaticContentCacheHeaders(response); setStaticContentCacheHeaders(response);
request->send(response); request->send(response);
//request->send_P(200, "text/html", PAGE_update);
}); });
server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){
if (Update.hasError()) if (Update.hasError() || !correctPIN) {
{ serveMessage(request, 500, F("Update failed!"), F("Please check your file and retry!"), 254);
serveMessage(request, 500, F("Update failed!"), F("Please check your file and retry!"), 254); return; } else {
serveMessage(request, 200, F("Update successful!"), F("Rebooting..."), 131);
doReboot = true;
} }
serveMessage(request, 200, F("Update successful!"), F("Rebooting..."), 131);
doReboot = true;
},[](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){ },[](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
if (!correctPIN) return;
if(!index){ if(!index){
DEBUG_PRINTLN(F("OTA Update Start")); DEBUG_PRINTLN(F("OTA Update Start"));
#ifdef ESP8266 #ifdef ESP8266
@ -259,21 +288,16 @@ void initServer()
} }
} }
}); });
} else {
#else
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("OTA updating is disabled in this build."), 254);
});
#endif
} else
{
server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 500, "Access Denied", F("Please unlock OTA in security settings!"), 254);
});
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 500, "Access Denied", F("Please unlock OTA in security settings!"), 254); serveMessage(request, 500, "Access Denied", F("Please unlock OTA in security settings!"), 254);
}); });
} }
#else
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("OTA updating is disabled in this build."), 254);
});
#endif
#ifdef WLED_ENABLE_DMX #ifdef WLED_ENABLE_DMX
@ -449,7 +473,7 @@ void serveSettingsJS(AsyncWebServerRequest* request)
char buf[SETTINGS_STACK_BUF_SIZE+37]; char buf[SETTINGS_STACK_BUF_SIZE+37];
buf[0] = 0; buf[0] = 0;
byte subPage = request->arg(F("p")).toInt(); byte subPage = request->arg(F("p")).toInt();
if (subPage<0 || subPage>8) { if (subPage<0 || subPage>9) {
strcpy_P(buf, PSTR("alert('Settings for this request are not implemented.');")); strcpy_P(buf, PSTR("alert('Settings for this request are not implemented.');"));
request->send(501, "application/javascript", buf); request->send(501, "application/javascript", buf);
return; return;
@ -479,6 +503,10 @@ void serveSettings(AsyncWebServerRequest* request, bool post)
else if (url.indexOf("um") > 0) subPage = 8; else if (url.indexOf("um") > 0) subPage = 8;
} else subPage = 255; //welcome page } else subPage = 255; //welcome page
if (subPage > 0 && subPage < 9 && strlen(settingsPIN)>0 && !correctPIN) {
subPage = 252; // require PIN
}
if (subPage == 1 && wifiLock && otaLock) if (subPage == 1 && wifiLock && otaLock)
{ {
serveMessage(request, 500, "Access Denied", F("Please unlock OTA in security settings!"), 254); return; serveMessage(request, 500, "Access Denied", F("Please unlock OTA in security settings!"), 254); return;
@ -496,16 +524,21 @@ void serveSettings(AsyncWebServerRequest* request, bool post)
case 3: strcpy_P(s, PSTR("UI")); break; case 3: strcpy_P(s, PSTR("UI")); break;
case 4: strcpy_P(s, PSTR("Sync")); break; case 4: strcpy_P(s, PSTR("Sync")); break;
case 5: strcpy_P(s, PSTR("Time")); break; case 5: strcpy_P(s, PSTR("Time")); break;
case 6: strcpy_P(s, PSTR("Security")); strcpy_P(s2, PSTR("Rebooting, please wait ~10 seconds...")); break; case 6: strcpy_P(s, PSTR("Security")); if (doReboot) strcpy_P(s2, PSTR("Rebooting, please wait ~10 seconds...")); break;
case 7: strcpy_P(s, PSTR("DMX")); break; case 7: strcpy_P(s, PSTR("DMX")); break;
case 8: strcpy_P(s, PSTR("Usermods")); break; case 8: strcpy_P(s, PSTR("Usermods")); break;
case 252: strcpy_P(s, correctPIN ? PSTR("PIN accepted") : PSTR("PIN rejected"));
} }
strcat_P(s, PSTR(" settings saved.")); if (subPage != 252) strcat_P(s, PSTR(" settings saved."));
else {
server.removeHandler(editHandler);
createEditHandler(correctPIN);
}
if (!s2[0]) strcpy_P(s2, PSTR("Redirecting...")); if (!s2[0]) strcpy_P(s2, PSTR("Redirecting..."));
if (!doReboot) serveMessage(request, 200, s, s2, (subPage == 1 || subPage == 6) ? 129 : 1); serveMessage(request, 200, s, s2, (subPage == 1 || (subPage == 6 && doReboot)) ? 129 : (correctPIN ? 1 : 10));
if (subPage == 6) doReboot = true; //if (subPage == 6) doReboot = true;
return; return;
} }
@ -527,6 +560,7 @@ void serveSettings(AsyncWebServerRequest* request, bool post)
case 6: response = request->beginResponse_P(200, "text/html", PAGE_settings_sec, PAGE_settings_sec_length); break; case 6: response = request->beginResponse_P(200, "text/html", PAGE_settings_sec, PAGE_settings_sec_length); break;
case 7: response = request->beginResponse_P(200, "text/html", PAGE_settings_dmx, PAGE_settings_dmx_length); break; case 7: response = request->beginResponse_P(200, "text/html", PAGE_settings_dmx, PAGE_settings_dmx_length); break;
case 8: response = request->beginResponse_P(200, "text/html", PAGE_settings_um, PAGE_settings_um_length); break; case 8: response = request->beginResponse_P(200, "text/html", PAGE_settings_um, PAGE_settings_um_length); break;
case 252: response = request->beginResponse_P(200, "text/html", PAGE_settings_pin, PAGE_settings_pin_length); break;
case 253: response = request->beginResponse_P(200, "text/css", PAGE_settingsCss, PAGE_settingsCss_length); break; case 253: response = request->beginResponse_P(200, "text/css", PAGE_settingsCss, PAGE_settingsCss_length); break;
case 254: serveSettingsJS(request); return; case 254: serveSettingsJS(request); return;
case 255: response = request->beginResponse_P(200, "text/html", PAGE_welcome, PAGE_welcome_length); break; case 255: response = request->beginResponse_P(200, "text/html", PAGE_welcome, PAGE_welcome_length); break;

File diff suppressed because it is too large Load Diff