From 4391daaef8df89aaaa1a37c3d295798a3374f0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20M=C3=BChl?= <31169771+Blueforcer@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:05:52 +0100 Subject: [PATCH] update --- .../src/ArduinoHADefines.h | 2 +- lib/index.html | 906 +++++++++++++++ lib/webserver/setup-ui/data/app.js | 22 +- lib/webserver/setup-ui/data/build/min/all.htm | 15 +- .../setup-ui/data/build/min/all.htm.gz | Bin 8177 -> 8246 bytes lib/webserver/setup-ui/data/build/min/app.js | 2 +- .../setup-ui/data/build/min/style.css | 2 +- lib/webserver/setup-ui/data/build/setup_htm.h | 519 +++++++++ lib/webserver/setup-ui/data/setup.htm | 11 +- lib/webserver/setup-ui/data/style.css | 3 +- lib/webserver/src/esp-fs-webserver.cpp | 79 +- lib/webserver/src/esp-fs-webserver.h | 75 +- lib/webserver/src/setup.htm | 4 +- lib/webserver/src/setup_htm.h | 1022 +++++++++-------- platformio.ini | 1 + src/MqttManager.cpp | 4 +- src/SystemManager.cpp | 782 ++++++------- src/SystemManager.h | 27 +- src/converter.h | 886 ++++++++++++++ src/test | 44 + 20 files changed, 3368 insertions(+), 1038 deletions(-) create mode 100644 lib/index.html create mode 100644 lib/webserver/setup-ui/data/build/setup_htm.h create mode 100644 src/converter.h create mode 100644 src/test diff --git a/lib/home-assistant-integration/src/ArduinoHADefines.h b/lib/home-assistant-integration/src/ArduinoHADefines.h index 9c4647a..f1e8512 100644 --- a/lib/home-assistant-integration/src/ArduinoHADefines.h +++ b/lib/home-assistant-integration/src/ArduinoHADefines.h @@ -1,7 +1,7 @@ // Turns on debug information of the ArduinoHA core. // Please note that you need to initialize serial interface manually // by calling Serial.begin([baudRate]) before initializing ArduinoHA. - #define ARDUINOHA_DEBUG + //#define ARDUINOHA_DEBUG // These macros allow to exclude some parts of the library to save more resources. #define EX_ARDUINOHA_BINARY_SENSOR diff --git a/lib/index.html b/lib/index.html new file mode 100644 index 0000000..8c9c1f6 --- /dev/null +++ b/lib/index.html @@ -0,0 +1,906 @@ + + + + + + + image2cpp + + + + + +
+
+
+
+

1. Select image

+
+
+ +
+
+ +
+

2. Image Settings

+
+
+ +
+
+
+
    +
    Only images file type are allowed +
    +
    +
    + +
    +
    +
    + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + 0 - 255; if the brightness of a pixel is above the given level the pixel becomes + white, otherwise they become black. When using alpha, opaque and transparent are + used instead. +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + + + + +
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + Note: centering the image only works when using a canvas larger than the original image. +
    +
    +
    + +
    +

    3. Preview

    +
    +
    +
    +
    + + + +
    + + +
    + +
    + + + + + \ No newline at end of file diff --git a/lib/webserver/setup-ui/data/app.js b/lib/webserver/setup-ui/data/app.js index 1dcd7b7..d4b5364 100644 --- a/lib/webserver/setup-ui/data/app.js +++ b/lib/webserver/setup-ui/data/app.js @@ -327,20 +327,18 @@ function saveParameters() { function doConnection() { - $('loader').classList.remove('hide'); - var httpCode; - var data = { - ssid: $('ssid').value, - password: $('password').value, - persistent: $('persistent').checked - }; - fetch('/connect', { + var formdata = new FormData(); + formdata.append("ssid", $('ssid').value); + formdata.append("password", $('password').value); + formdata.append("persistent", $('persistent').checked); + var requestOptions = { method: 'POST', - redirect: 'follow', - headers: {"Content-Type": "application/json"}, - body: JSON.stringify(data) - }) + body: formdata, + redirect: 'follow' + }; + $('loader').classList.remove('hide'); + fetch('/connect', requestOptions) .then(function(response){ httpCode = response.status; return response.text(); diff --git a/lib/webserver/setup-ui/data/build/min/all.htm b/lib/webserver/setup-ui/data/build/min/all.htm index 325f865..2abad45 100644 --- a/lib/webserver/setup-ui/data/build/min/all.htm +++ b/lib/webserver/setup-ui/data/build/min/all.htm @@ -2,9 +2,9 @@ - Smartpusher + SmartPusher - +
    @@ -13,7 +13,7 @@ -

    Smartpusher

    +

    SmartPusher

    @@ -21,8 +21,7 @@

    Smartpusher

    Files Update - About - + Wiki
    @@ -107,6 +106,10 @@

    Connect to WiFi

    - + + \ No newline at end of file diff --git a/lib/webserver/setup-ui/data/build/min/all.htm.gz b/lib/webserver/setup-ui/data/build/min/all.htm.gz index 5d999e0074342773e3c0e546a841a68211b9e83d..96f8d3111b7b06ff2186344a140b99843b0cafae 100644 GIT binary patch delta 8111 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.json())).then((e=>{listWifiNetworks(e),$("loader").classList.add("hide")}))}function selectWifi(e){try{$("select-"+e.target.parentNode.id).checked=!0}catch(t){$(e.target.id).checked=!0}$("ssid").value=this.cells[1].innerHTML,$("ssid-name").innerHTML=this.cells[1].innerHTML,$("password").focus()}function listWifiNetworks(e){const t=document.querySelector("#wifi-list");t.innerHTML="",e.forEach(((e,s)=>{var a=document.createElement("tr"),n="wifi-"+s;a.id=n,a.addEventListener("click",selectWifi),a.innerHTML=``,a.innerHTML+=`${e.ssid}`,a.innerHTML+=''+e.strength+" dBm",e.security?a.innerHTML+=""+svgLock+"":a.innerHTML+=""+svgUnlock+"",t.appendChild(a)})),$("wifi-table").classList.remove("hide")}function getParameters(){$("loader").classList.remove("hide");var e=new URL(`http://${window.location.hostname}/config.json`);fetch(e).then((e=>e.json())).then((e=>{Object.keys(e).forEach((function(t){t.startsWith("logo-name")&&($("name-logo").innerHTML=e[t],delete e[t]),t.startsWith("logo-svg")&&($("svg-logo").innerHTML=e[t],delete e[t]),$("loader").classList.add("hide")})),listParameters(options=e),options["logo-file-hidden"]&&(svgLogo="",$("svg-logo").innerHTML='',$("svg-logo").setAttribute("title",""),$("logo-file").setAttribute("type","number"))}))}function createNewBox(e,t){var s=document.createElement("div");s.setAttribute("id","option-box"+e),s.classList.add("ctn","opt-box","hide");var a=document.createElement("h2");a.classList.add("heading-2"),a.innerHTML=t,s.appendChild(a);var n=document.createElement("form");n.classList.add("form"),s.appendChild(n),$("main-box").appendChild(s);var i=document.createElement("a");return i.setAttribute("id","set-opt"+e),i.setAttribute("data-box","option-box"+e),i.classList.add("a-link"),i.innerHTML=t,i.addEventListener("click",switchPage),$("nav-link").appendChild(i),n}function listParameters(e){var t,s;Object.keys(e)[0].startsWith("param-box")||(e={"param-box1":"Options",...e},options=e),Object.entries(e).forEach((([e,a],n)=>{if(e.startsWith("name-logo"))$("name-logo").innerHTML=a;else if(!e.startsWith("logo-file"))if(e.startsWith("param-box"))s=createNewBox(n,a);else{if(e.startsWith("raw-css")){var i=document.createElement("style");return i.innerHTML=a.trim(),void document.body.appendChild(i)}if(e.startsWith("raw-javascript")){var o=document.createElement("script");return o.innerHTML=a.trim(),void document.body.appendChild(o)}if(e.startsWith("raw-html"))html=a.trim(),(t=document.createElement("div")).setAttribute("id","row"+n),t.style.width="100%",t.innerHTML=html,s.appendChild(t);else{let n=a,i=document.createElement("label");if((t=document.createElement("input")).setAttribute("id",e),t.setAttribute("type","text"),"boolean"==typeof n){t.setAttribute("type","checkbox"),t.classList.add("t-check","opt-input"),t.checked=n,i.classList.add("input-label","toggle");let a=document.createElement("div");a.classList.add("toggle-switch");let o=document.createElement("span");o.classList.add("toggle-label"),o.textContent=e,i.appendChild(t),i.appendChild(a),i.appendChild(o),s.appendChild(i),addInputListener(t)}else{if(t.value=n,t.classList.add("opt-input"),i.setAttribute("label-for",e),i.classList.add("input-label"),i.textContent=e,"number"==typeof n&&t.setAttribute("type","number"),"object"==typeof n)if(n.values)(t=document.createElement("select")).setAttribute("id",e),n.values.forEach((e=>{var s=document.createElement("option");s.textContent=e,s.value=e,t.appendChild(s)})),t.value=n.selected,s.appendChild(t);else{var d=Math.round(n.value*(1/n.step))/(1/n.step);t.setAttribute("type","number"),t.setAttribute("step",n.step),t.setAttribute("min",n.min),t.setAttribute("max",n.max),t.value=Number(d).toFixed(3)}addInputListener(t);var r=document.createElement("div");r.classList.add("tf-wrapper"),r.appendChild(i),r.appendChild(t),s.appendChild(r)}}e.endsWith("-hidden")&&t.classList.add("hide")}}))}function addInputListener(e){"number"!==e.type?"text"!==e.type?"checkbox"!==e.type?"select-one"!==e.type||e.addEventListener("change",(e=>{options[e.target.id].selected=e.target.value})):e.addEventListener("change",(()=>{options[e.id]=e.checked})):e.addEventListener("change",(()=>{options[e.id]=e.value})):e.addEventListener("change",(()=>{if(e.getAttribute("step")){var t={};t.value=Math.round(e.value*(1/e.step))/(1/e.step),t.step=e.getAttribute("step"),t.min=e.getAttribute("min"),t.max=e.getAttribute("max"),options[e.id]=t}else options[e.id]=parseInt(e.value)}))}function saveParameters(){var e=new Blob([JSON.stringify(options,null,2)],{type:"application/json"}),t=new FormData;t.append("data",e,"/config.json"),fetch("/edit",{method:"POST",body:t}).then((e=>e.text())).then((e=>{openModalMessage("Save options","
    config.json file saved successfully on flash memory!

    ")}))}function doConnection(){var e;$("loader").classList.remove("hide");var t={ssid:$("ssid").value,password:$("password").value,persistent:$("persistent").checked};fetch("/connect",{method:"POST",redirect:"follow",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(t){return e=t.status,t.text()})).then((function(t){200===e?openModalMessage("Connect to WiFi","
    "+t):openModalMessage("Error!","
    Error on connection: "+t+"

    "),$("loader").classList.add("hide")}))}function switchPage(e){if($("top-nav").classList.remove("responsive"),document.querySelectorAll("a").forEach((e=>{e.classList.remove("active")})),e.target.classList.add("active"),document.querySelectorAll(".opt-box").forEach((e=>{e.classList.add("hide")})),$(e.target.getAttribute("data-box")).classList.remove("hide"),"set-wifi"!=e.target.id){var t=document.createDocumentFragment();t.appendChild($("btn-box")),$(e.target.getAttribute("data-box")).appendChild(t),$("btn-box").classList.remove("hide")}else $("btn-box").classList.add("hide")}function showMenu(){$("top-nav").classList.add("responsive")}var closeCallback=function(){};function openModalMessage(e,t,s){$("message-title").innerHTML=e,$("message-body").innerHTML=t,$("modal-message").open=!0,$("main-box").style.filter="blur(3px)",void 0!==s?(closeCallback=s,$("ok-modal").classList.remove("hide")):$("ok-modal").classList.add("hide")}function closeModalMessage(e){$("modal-message").open=!1,$("main-box").style.filter="",void 0!==closeCallback&&e&&closeCallback()}function restartESP(){var e=new URL(`http://${window.location.hostname}/restart`);fetch(e).then((e=>e.text())).then((e=>{closeModalMessage(),openModalMessage("Restart!","
    ESP restarted. Please wait a little and then reload this page.
    ")}))}function uploadLogo(){var e=$("logo-file").files[0],t=new FileReader;t.onload=async()=>{const t=new FormData;t.append("image",e);try{await fetch("/edit",{method:"POST",body:t});options={...options,"logo-file-hidden":e.name},saveParameters()}catch(e){console.error(e)}},t.readAsDataURL(e)}$("svg-menu").innerHTML=svgMenu,$("svg-eye").innerHTML=svgEye,$("svg-no-eye").innerHTML=svgNoEye,$("svg-scan").innerHTML=svgScan,$("svg-connect").innerHTML=svgConnect,$("svg-save").innerHTML=svgSave,$("svg-restart").innerHTML=svgRestart,$("close-modal").innerHTML=svgCloseModal,$("svg-logo").innerHTML=svgLogo,$("svg-logo").setAttribute("title","Click to upload your logo file"),$("hum-btn").addEventListener("click",showMenu),$("scan-wifi").addEventListener("click",getWiFiList),$("connect-wifi").addEventListener("click",doConnection),$("save-params").addEventListener("click",saveParameters),$("show-hide-password").addEventListener("click",showHidePassword),$("set-wifi").addEventListener("click",switchPage),$("about").addEventListener("click",switchPage),$("restart").addEventListener("click",restartESP),window.addEventListener("load",getParameters),$("connect-wifi").disabled=!0,$("password").addEventListener("input",(e=>{0===$("password").value.length?$("connect-wifi").disabled=!0:$("connect-wifi").disabled=!1})); \ No newline at end of file +svgLogo='';const svgMenu='',svgLock='',svgUnlock='',svgScan='',svgConnect='',svgSave='',svgRestart='',svgEye='',svgNoEye='',svgCloseModal='';var options={},$=function(e){return document.getElementById(e)};function showHidePassword(){var e=$("password");"password"===e.type?(e.type="text",$("show-pass").classList.remove("w--current"),$("hide-pass").classList.add("w--current")):(e.type="password",$("show-pass").classList.add("w--current"),$("hide-pass").classList.remove("w--current"))}function getWiFiList(){$("loader").classList.remove("hide");var e=new URL(`http://${window.location.hostname}/scan`);fetch(e).then((e=>e.json())).then((e=>{listWifiNetworks(e),$("loader").classList.add("hide")}))}function selectWifi(e){try{$("select-"+e.target.parentNode.id).checked=!0}catch(t){$(e.target.id).checked=!0}$("ssid").value=this.cells[1].innerHTML,$("ssid-name").innerHTML=this.cells[1].innerHTML,$("password").focus()}function listWifiNetworks(e){const t=document.querySelector("#wifi-list");t.innerHTML="",e.forEach(((e,s)=>{var a=document.createElement("tr"),n="wifi-"+s;a.id=n,a.addEventListener("click",selectWifi),a.innerHTML=``,a.innerHTML+=`${e.ssid}`,a.innerHTML+=''+e.strength+" dBm",e.security?a.innerHTML+=""+svgLock+"":a.innerHTML+=""+svgUnlock+"",t.appendChild(a)})),$("wifi-table").classList.remove("hide")}function getParameters(){$("loader").classList.remove("hide");var e=new URL(`http://${window.location.hostname}/config.json`);fetch(e).then((e=>e.json())).then((e=>{Object.keys(e).forEach((function(t){t.startsWith("logo-name")&&($("name-logo").innerHTML=e[t],delete e[t]),t.startsWith("logo-svg")&&($("svg-logo").innerHTML=e[t],delete e[t]),$("loader").classList.add("hide")})),listParameters(options=e),options["logo-file-hidden"]&&(svgLogo="",$("svg-logo").innerHTML='',$("svg-logo").setAttribute("title",""),$("logo-file").setAttribute("type","number"))}))}function createNewBox(e,t){var s=document.createElement("div");s.setAttribute("id","option-box"+e),s.classList.add("ctn","opt-box","hide");var a=document.createElement("h2");a.classList.add("heading-2"),a.innerHTML=t,s.appendChild(a);var n=document.createElement("form");n.classList.add("form"),s.appendChild(n),$("main-box").appendChild(s);var i=document.createElement("a");return i.setAttribute("id","set-opt"+e),i.setAttribute("data-box","option-box"+e),i.classList.add("a-link"),i.innerHTML=t,i.addEventListener("click",switchPage),$("nav-link").appendChild(i),n}function listParameters(e){var t,s;Object.keys(e)[0].startsWith("param-box")||(e={"param-box1":"Options",...e},options=e),Object.entries(e).forEach((([e,a],n)=>{if(e.startsWith("name-logo"))$("name-logo").innerHTML=a;else if(!e.startsWith("logo-file"))if(e.startsWith("param-box"))s=createNewBox(n,a);else{if(e.startsWith("raw-css")){var i=document.createElement("style");return i.innerHTML=a.trim(),void document.body.appendChild(i)}if(e.startsWith("raw-javascript")){var o=document.createElement("script");return o.innerHTML=a.trim(),void document.body.appendChild(o)}if(e.startsWith("raw-html"))html=a.trim(),(t=document.createElement("div")).setAttribute("id","row"+n),t.style.width="100%",t.innerHTML=html,s.appendChild(t);else{let n=a,i=document.createElement("label");if((t=document.createElement("input")).setAttribute("id",e),t.setAttribute("type","text"),"boolean"==typeof n){t.setAttribute("type","checkbox"),t.classList.add("t-check","opt-input"),t.checked=n,i.classList.add("input-label","toggle");let a=document.createElement("div");a.classList.add("toggle-switch");let o=document.createElement("span");o.classList.add("toggle-label"),o.textContent=e,i.appendChild(t),i.appendChild(a),i.appendChild(o),s.appendChild(i),addInputListener(t)}else{if(t.value=n,t.classList.add("opt-input"),i.setAttribute("label-for",e),i.classList.add("input-label"),i.textContent=e,"number"==typeof n&&t.setAttribute("type","number"),"object"==typeof n)if(n.values)(t=document.createElement("select")).setAttribute("id",e),n.values.forEach((e=>{var s=document.createElement("option");s.textContent=e,s.value=e,t.appendChild(s)})),t.value=n.selected,s.appendChild(t);else{var d=Math.round(n.value*(1/n.step))/(1/n.step);t.setAttribute("type","number"),t.setAttribute("step",n.step),t.setAttribute("min",n.min),t.setAttribute("max",n.max),t.value=Number(d).toFixed(3)}addInputListener(t);var r=document.createElement("div");r.classList.add("tf-wrapper"),r.appendChild(i),r.appendChild(t),s.appendChild(r)}}e.endsWith("-hidden")&&t.classList.add("hide")}}))}function addInputListener(e){"number"!==e.type?"text"!==e.type?"checkbox"!==e.type?"select-one"!==e.type||e.addEventListener("change",(e=>{options[e.target.id].selected=e.target.value})):e.addEventListener("change",(()=>{options[e.id]=e.checked})):e.addEventListener("change",(()=>{options[e.id]=e.value})):e.addEventListener("change",(()=>{if(e.getAttribute("step")){var t={};t.value=Math.round(e.value*(1/e.step))/(1/e.step),t.step=e.getAttribute("step"),t.min=e.getAttribute("min"),t.max=e.getAttribute("max"),options[e.id]=t}else options[e.id]=parseInt(e.value)}))}function saveParameters(){var e=new Blob([JSON.stringify(options,null,2)],{type:"application/json"}),t=new FormData;t.append("data",e,"/config.json"),fetch("/edit",{method:"POST",body:t}).then((e=>e.text())).then((e=>{openModalMessage("Save options","
    config.json file saved successfully on flash memory!

    ")}))}function doConnection(){var e=new FormData;e.append("ssid",$("ssid").value),e.append("password",$("password").value),e.append("persistent",$("persistent").checked);var t={method:"POST",body:e,redirect:"follow"};$("loader").classList.remove("hide"),fetch("/connect",t).then((function(e){return httpCode=e.status,e.text()})).then((function(e){200===httpCode?openModalMessage("Connect to WiFi","
    "+e):openModalMessage("Error!","
    Error on connection: "+e+"

    "),$("loader").classList.add("hide")}))}function switchPage(e){if($("top-nav").classList.remove("responsive"),document.querySelectorAll("a").forEach((e=>{e.classList.remove("active")})),e.target.classList.add("active"),document.querySelectorAll(".opt-box").forEach((e=>{e.classList.add("hide")})),$(e.target.getAttribute("data-box")).classList.remove("hide"),"set-wifi"!=e.target.id){var t=document.createDocumentFragment();t.appendChild($("btn-box")),$(e.target.getAttribute("data-box")).appendChild(t),$("btn-box").classList.remove("hide")}else $("btn-box").classList.add("hide")}function showMenu(){$("top-nav").classList.add("responsive")}var closeCallback=function(){};function openModalMessage(e,t,s){$("message-title").innerHTML=e,$("message-body").innerHTML=t,$("modal-message").open=!0,$("main-box").style.filter="blur(3px)",void 0!==s?(closeCallback=s,$("ok-modal").classList.remove("hide")):$("ok-modal").classList.add("hide")}function closeModalMessage(e){$("modal-message").open=!1,$("main-box").style.filter="",void 0!==closeCallback&&e&&closeCallback()}function restartESP(){var e=new URL(`http://${window.location.hostname}/restart`);fetch(e).then((e=>e.text())).then((e=>{closeModalMessage(),openModalMessage("Restart!","
    ESP restarted. Please wait a little and then reload this page.
    ")}))}function uploadLogo(){var e=$("logo-file").files[0],t=new FileReader;t.onload=async()=>{const t=new FormData;t.append("image",e);try{await fetch("/edit",{method:"POST",body:t});options={...options,"logo-file-hidden":e.name},saveParameters()}catch(e){console.error(e)}},t.readAsDataURL(e)}$("svg-menu").innerHTML=svgMenu,$("svg-eye").innerHTML=svgEye,$("svg-no-eye").innerHTML=svgNoEye,$("svg-scan").innerHTML=svgScan,$("svg-connect").innerHTML=svgConnect,$("svg-save").innerHTML=svgSave,$("svg-restart").innerHTML=svgRestart,$("close-modal").innerHTML=svgCloseModal,$("svg-logo").innerHTML=svgLogo,$("svg-logo").setAttribute("title","Click to upload your logo file"),$("hum-btn").addEventListener("click",showMenu),$("scan-wifi").addEventListener("click",getWiFiList),$("connect-wifi").addEventListener("click",doConnection),$("save-params").addEventListener("click",saveParameters),$("show-hide-password").addEventListener("click",showHidePassword),$("set-wifi").addEventListener("click",switchPage),$("about").addEventListener("click",switchPage),$("restart").addEventListener("click",restartESP),window.addEventListener("load",getParameters),$("connect-wifi").disabled=!0,$("password").addEventListener("input",(e=>{0===$("password").value.length?$("connect-wifi").disabled=!0:$("connect-wifi").disabled=!1})); \ No newline at end of file diff --git a/lib/webserver/setup-ui/data/build/min/style.css b/lib/webserver/setup-ui/data/build/min/style.css index f37ce48..16aa28a 100644 --- a/lib/webserver/setup-ui/data/build/min/style.css +++ b/lib/webserver/setup-ui/data/build/min/style.css @@ -1 +1 @@ -.inputfile{height:10px;opacity:0;overflow:hidden;position:absolute;width:10px;z-index:-1}.loader,.loader:after,.loader:before{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:load7 1.8s ease-in-out infinite;animation:load7 1.8s ease-in-out infinite;border-radius:50%;height:2em;width:2em}.loader{-webkit-animation-delay:-.16s;animation-delay:-.16s;color:#333;font-size:10px;margin-left:auto;margin-right:auto;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);z-index:999}.loader:after,.loader:before{content:"";position:absolute;top:0}.loader:before{-webkit-animation-delay:-.32s;animation-delay:-.32s;left:-4.5em}.loader:after{left:4.5em}@-webkit-keyframes load7{0%,80%,to{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,80%,to{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}tr:hover{filter:brightness(85%)}.d-modal{background-color:hsla(0,0%,100%,.95);border:1px solid #3333336e;border-radius:10px;box-shadow:0 3px 8px rgba(0,0,0,.24);flex-direction:column;left:50%;max-height:90vh;max-width:90%;text-align:left;top:40%;transform:translate(-50%,-50%);width:30em;z-index:999}.d-modal,.d-modal-close{display:flex;position:absolute}.d-modal-close{align-items:center;color:#111827;cursor:pointer;height:4.5em;justify-content:center;right:0;top:0;width:4.5em}.d-modal-title{color:#111827;padding:1.5em 2em;position:relative;width:calc(100% - 4.5em)}.d-modal-content{border-top:1px solid #e0e0e0;overflow:auto;padding:2em}.topnav{background-color:#333;border-radius:5px;float:right;height:28px,;overflow:hidden;width:fit-content}.topnav a{color:#f2f2f2;display:block;float:left;font-size:16px;padding:5px 10px;text-align:center;text-decoration:none}.topnav a:hover{background-color:#ddd;color:#000}.topnav a.active{background-color:#56c080;color:#fff}.topnav .icon{display:none}*{box-sizing:border-box}.logo{width:100%}.lbl-wifi{padding:0;text-align:right}html{font-family:sans-serif}details,header,main,summary{display:block}.table{border-collapse:collapse;border-spacing:0;margin:auto;width:90%}a{background-color:transparent}a:active,a:hover{outline:0}b{font-weight:700}h1{font-size:38px}h2{font-size:24px}hr{padding:0}.input-label{background-color:#fff;border:1px solid #dcdce5;border-radius:6px;bottom:-7px;color:#015293;display:inline-block;font-size:13.5px;font-weight:500;left:8px;line-height:17px;margin-bottom:0;padding-left:6px;padding-right:7px;position:relative;z-index:2}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 30px #fff!important}input[type=checkbox]{box-sizing:border-box;padding:0}input[type=number],input[type=password],input[type=text],select{border:1px solid #ccc;border-radius:6px;box-shadow:0 1px 2px 0 rgba(220,220,230,.5);font-size:16px;height:40px;padding-left:20px;padding-top:10px;transition:border-color .2s ease,box-shadow .2s ease;width:100%}input::placeholder{color:#5e5e5e}input:hover{border-color:rgba(0,0,0,.8);box-shadow:0 1px 4px 0 rgba(220,220,229,.9)}input:focus,select:focus{border-color:#3898ec;outline:0}.ctn:after,.ctn:before{content:" ";display:table;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1}.ctn,.ctn:after{clear:both}.ctn{align-content:space-around;align-items:center;background-color:hsla(0,0%,100%,.8);border:1px solid #3333336e;border-radius:10px;box-shadow:0 3px 8px rgba(0,0,0,.24);display:block;flex-direction:row;flex-wrap:wrap;justify-content:center;margin:10px auto;max-width:940px;padding:10px 40px}.body{background-clip:border-box;background-color:#edf0f3;border-radius:10px;padding-left:20px;padding-right:20px}.title{align-items:center;display:flex;flex:1;justify-content:center}.heading-2{font-weight:400;text-align:center}.form,.heading-2{padding-left:20px;padding-right:20px}.form{position:static}.btn,button{background-color:#3898ec;border:0;border-radius:5px;color:#fff;cursor:pointer;display:inline-flex;justify-content:center;min-width:40%;padding:10px 15px}.btn:hover,button:hover{filter:brightness(85%)}.btn-bar{grid-column-gap:30px;grid-row-gap:20px;align-content:space-around;align-items:stretch;display:flex;flex-wrap:wrap;justify-content:right;margin-top:20px;padding:20px}.tf-wrapper{align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;margin-bottom:12px;position:relative;width:100%}.show-hide{background-color:#fff;display:flex;font-size:13.5px;max-width:100%}.show-hide-wrap{bottom:auto;cursor:pointer;left:auto;position:absolute;right:2%;top:40%;z-index:4}.svg{display:flex;margin-right:10px;width:20px}.svg-e{margin-top:5px}.heading{margin-left:10px;margin-right:10px}.hide,.show-hide.w--current{display:none}.toggle{cursor:pointer;display:inline-block;left:0;margin:0 0 12px;padding:5px;width:100%}.toggle-switch{background:#ccc;border-radius:16px;display:inline-block;height:32px;position:relative;transition:background .25s;vertical-align:middle;width:58px}.toggle-switch:after,.toggle-switch:before{content:""}.toggle-switch:before{background:linear-gradient(180deg,#fff 0,#eee);border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.25);display:block;height:24px;left:4px;position:absolute;top:4px;transition:left .25s;width:24px}.toggle:hover .toggle-switch:before{background:linear-gradient(180deg,#fff 0,#fff);box-shadow:0 0 0 1px rgba(0,0,0,.5)}.t-check:checked+.toggle-switch{background:#56c080}.t-check:checked+.toggle-switch:before{left:30px}.t-check{position:absolute;visibility:hidden}.toggle-label{margin-left:5px;position:relative;top:2px}@media screen and (max-width:991px){.ctn{grid-column-gap:10px;grid-row-gap:10px;max-width:728px;max-width:95%;object-fit:contain;overflow:visible;position:relative}.ctn,.wifi-connect{padding-left:20px;padding-right:20px}}@media screen and (max-width:767px){.wifi-connect{padding-left:10px;padding-right:10px}}@media screen and (max-width:608px){.btn-bar{flex-direction:column;margin-top:20px}.topnav{margin-bottom:5px;width:-webkit-fill-available}.topnav a{padding:5px 20px}.topnav a:not(.active){display:none}.topnav a.icon{display:block;float:right}.topnav a:hover{background-color:hsla(0,0%,87%,0);color:#5a5a5a}.topnav.responsive{position:relative}.topnav.responsive .icon{position:absolute;right:0;top:0}.topnav.responsive a{display:block;float:none;text-align:left}.hide-tiny{display:none}}@media screen and (max-width:479px){h1{font-size:30px}.body{padding-left:2px;padding-right:2px}.heading-2{margin-top:10px}.form,.heading-2{padding-left:0;padding-right:0}.ctn{max-width:100%;padding:0 10px}} \ No newline at end of file +.inputfile{height:10px;opacity:0;overflow:hidden;position:absolute;width:10px;z-index:-1}.loader,.loader:after,.loader:before{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:load7 1.8s ease-in-out infinite;animation:load7 1.8s ease-in-out infinite;border-radius:50%;height:2em;width:2em}.loader{-webkit-animation-delay:-.16s;animation-delay:-.16s;color:#333;font-size:10px;margin-left:auto;margin-right:auto;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);z-index:999}.loader:after,.loader:before{content:"";position:absolute;top:0}.loader:before{-webkit-animation-delay:-.32s;animation-delay:-.32s;left:-4.5em}.loader:after{left:4.5em}@-webkit-keyframes load7{0%,80%,to{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,80%,to{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}tr:hover{filter:brightness(85%)}.d-modal{background-color:hsla(0,0%,100%,.95);border:1px solid #3333336e;border-radius:10px;box-shadow:0 3px 8px rgba(0,0,0,.24);flex-direction:column;left:50%;max-height:90vh;max-width:90%;text-align:left;top:40%;transform:translate(-50%,-50%);width:30em;z-index:999}.d-modal,.d-modal-close{display:flex;position:absolute}.d-modal-close{align-items:center;color:#111827;cursor:pointer;height:4.5em;justify-content:center;right:0;top:0;width:4.5em}.d-modal-title{color:#111827;padding:1.5em 2em;position:relative;width:calc(100% - 4.5em)}.d-modal-content{border-top:1px solid #e0e0e0;overflow:auto;padding:2em}.topnav{background-color:#333;border-radius:5px;float:right;height:28px,;overflow:hidden;width:fit-content}.topnav a{color:#f2f2f2;display:block;float:left;font-size:16px;padding:5px 10px;text-align:center;text-decoration:none}.topnav a:hover{background-color:#ddd;color:#000}.topnav a.active{background-color:#56c080;color:#fff}.topnav .icon{display:none}*{box-sizing:border-box}.logo{width:100%}.lbl-wifi{padding:0;text-align:right}html{font-family:sans-serif}details,header,main,summary{display:block}.table{border-collapse:collapse;border-spacing:0;margin:auto;width:90%}a{background-color:transparent}a:active,a:hover{outline:0}b{font-weight:700}h1{font-size:38px}h2{font-size:24px}hr{padding:0}.input-label{background-color:#fff;border:1px solid #dcdce5;border-radius:6px;bottom:-7px;color:#015293;display:inline-block;font-size:13.5px;font-weight:500;left:8px;line-height:17px;margin-bottom:0;padding-left:6px;padding-right:7px;position:relative;z-index:2}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 30px #fff!important}input[type=checkbox]{box-sizing:border-box;padding:0}input[type=number],input[type=password],input[type=text],select{border:1px solid #ccc;border-radius:6px;box-shadow:0 1px 2px 0 rgba(220,220,230,.5);font-size:16px;height:40px;padding-left:20px;padding-top:10px;transition:border-color .2s ease,box-shadow .2s ease;width:100%}input::placeholder{color:#5e5e5e}input:hover{border-color:rgba(0,0,0,.8);box-shadow:0 1px 4px 0 rgba(220,220,229,.9)}input:focus,select:focus{border-color:#3898ec;outline:0}.ctn:after,.ctn:before{content:" ";display:table;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1}.ctn,.ctn:after{clear:both}.ctn{align-content:space-around;align-items:center;background-color:hsla(0,0%,100%,.8);border:1px solid #3333336e;border-radius:10px;box-shadow:0 3px 8px rgba(0,0,0,.24);display:block;flex-direction:row;flex-wrap:wrap;justify-content:center;margin:10px auto;max-width:940px;padding:10px 40px}footer{font-size:12px;margin:40px;text-align:center}#about{color:#d3d3d3}.body{background-clip:border-box;background-color:#edf0f3;border-radius:10px;padding-left:20px;padding-right:20px}.title{align-items:center;display:flex;flex:1;justify-content:center}.heading-2{font-weight:400;text-align:center}.form,.heading-2{padding-left:20px;padding-right:20px}.form{position:static}.btn,button{background-color:#3898ec;border:0;border-radius:5px;color:#fff;cursor:pointer;display:inline-flex;justify-content:center;min-width:40%;padding:10px 15px}.btn:hover,button:hover{filter:brightness(85%)}.btn-bar{grid-column-gap:30px;grid-row-gap:20px;align-content:space-around;align-items:stretch;display:flex;flex-wrap:wrap;justify-content:right;margin-top:20px;padding:20px}.tf-wrapper{align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;margin-bottom:12px;position:relative;width:100%}.show-hide{background-color:#fff;display:flex;font-size:13.5px;max-width:100%}.show-hide-wrap{bottom:auto;cursor:pointer;left:auto;position:absolute;right:2%;top:40%;z-index:4}.svg{display:flex;margin-right:10px;width:20px}.svg-e{margin-top:5px}.heading{margin-left:10px;margin-right:10px}.hide,.show-hide.w--current{display:none}.toggle{cursor:pointer;display:inline-block;left:0;margin:0 0 12px;padding:5px;width:100%}.toggle-switch{background:#ccc;border-radius:16px;display:inline-block;height:32px;position:relative;transition:background .25s;vertical-align:middle;width:58px}.toggle-switch:after,.toggle-switch:before{content:""}.toggle-switch:before{background:linear-gradient(180deg,#fff 0,#eee);border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.25);display:block;height:24px;left:4px;position:absolute;top:4px;transition:left .25s;width:24px}.toggle:hover .toggle-switch:before{background:linear-gradient(180deg,#fff 0,#fff);box-shadow:0 0 0 1px rgba(0,0,0,.5)}.t-check:checked+.toggle-switch{background:#56c080}.t-check:checked+.toggle-switch:before{left:30px}.t-check{position:absolute;visibility:hidden}.toggle-label{margin-left:5px;position:relative;top:2px}@media screen and (max-width:991px){.ctn{grid-column-gap:10px;grid-row-gap:10px;max-width:728px;max-width:95%;object-fit:contain;overflow:visible;position:relative}.ctn,.wifi-connect{padding-left:20px;padding-right:20px}}@media screen and (max-width:767px){.wifi-connect{padding-left:10px;padding-right:10px}}@media screen and (max-width:608px){.btn-bar{flex-direction:column;margin-top:20px}.topnav{margin-bottom:5px;width:-webkit-fill-available}.topnav a{padding:5px 20px}.topnav a:not(.active){display:none}.topnav a.icon{display:block;float:right}.topnav a:hover{background-color:hsla(0,0%,87%,0);color:#5a5a5a}.topnav.responsive{position:relative}.topnav.responsive .icon{position:absolute;right:0;top:0}.topnav.responsive a{display:block;float:none;text-align:left}.hide-tiny{display:none}}@media screen and (max-width:479px){h1{font-size:30px}.body{padding-left:2px;padding-right:2px}.heading-2{margin-top:10px}.form,.heading-2{padding-left:0;padding-right:0}.ctn{max-width:100%;padding:0 10px}} \ No newline at end of file diff --git a/lib/webserver/setup-ui/data/build/setup_htm.h b/lib/webserver/setup-ui/data/build/setup_htm.h new file mode 100644 index 0000000..d49b731 --- /dev/null +++ b/lib/webserver/setup-ui/data/build/setup_htm.h @@ -0,0 +1,519 @@ +#define SETUP_HTML_SIZE 8246 +const char SETUP_HTML[] PROGMEM = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xed, 0x3d, 0x69, 0x77, 0xdb, 0x46, + 0x92, 0xdf, 0xf7, 0xbd, 0xf9, 0x0f, 0x08, 0x12, 0xc7, 0xe4, 0x18, 0x80, 0x70, 0x10, 0x00, 0x0f, + 0x51, 0x99, 0x44, 0x71, 0x9e, 0xb3, 0x2b, 0x27, 0x7e, 0xa3, 0x19, 0xcf, 0xdb, 0xe4, 0xf9, 0xed, + 0x40, 0x44, 0x53, 0x44, 0x0c, 0x02, 0x5c, 0x00, 0x94, 0x2c, 0x33, 0xfc, 0xef, 0x5b, 0x55, 0xdd, + 0x0d, 0x34, 0x40, 0x90, 0x92, 0x73, 0x7c, 0xdb, 0xd8, 0xc6, 0xd1, 0x47, 0x75, 0xdd, 0x55, 0x7d, + 0x80, 0x39, 0xff, 0xec, 0xdb, 0x1f, 0x2f, 0xff, 0xf1, 0xdf, 0x6f, 0x5e, 0x6a, 0xab, 0x6a, 0x9d, + 0x5e, 0xfc, 0xe5, 0x3f, 0xce, 0xeb, 0x3b, 0x8b, 0x62, 0xb8, 0x6b, 0xf0, 0xdf, 0xf9, 0x9a, 0x55, + 0x91, 0xb6, 0x58, 0x45, 0x45, 0xc9, 0xaa, 0xf9, 0xb6, 0x5a, 0x9a, 0x63, 0xed, 0x4c, 0xd6, 0x55, + 0x49, 0x95, 0xb2, 0x8b, 0xeb, 0x75, 0x54, 0x54, 0x6f, 0xb6, 0xe5, 0x8a, 0x15, 0xe7, 0x67, 0xbc, + 0xa8, 0xd5, 0x37, 0xcf, 0x2a, 0x96, 0x55, 0x73, 0xfd, 0x3e, 0x89, 0xab, 0xd5, 0x3c, 0x66, 0x77, + 0xc9, 0x82, 0x99, 0xf4, 0x62, 0x68, 0x49, 0x96, 0x54, 0x49, 0x94, 0x9a, 0xe5, 0x22, 0x4a, 0xd9, + 0xdc, 0xd1, 0xb5, 0x2c, 0x5a, 0xb3, 0xf9, 0x5d, 0xc2, 0xee, 0x37, 0x79, 0x51, 0x35, 0x23, 0x95, + 0xd5, 0x03, 0x80, 0xb5, 0x92, 0x6c, 0x03, 0x28, 0x24, 0x29, 0xdb, 0xad, 0x58, 0x72, 0xbb, 0xaa, + 0xa6, 0x8e, 0xbd, 0xf9, 0x30, 0xcb, 0x37, 0xd1, 0x22, 0xa9, 0x1e, 0xa6, 0xf6, 0x2c, 0xbf, 0x63, + 0xc5, 0x32, 0xcd, 0xef, 0xa7, 0xab, 0x24, 0x8e, 0x59, 0x36, 0xdb, 0xe4, 0x25, 0xc0, 0xcf, 0xb3, + 0x69, 0x74, 0x53, 0xe6, 0xe9, 0xb6, 0x62, 0x33, 0x1a, 0x97, 0x77, 0xfb, 0x68, 0x26, 0x59, 0xcc, + 0x3e, 0x4c, 0x4d, 0x67, 0x6f, 0xa5, 0x79, 0x14, 0xb3, 0xc2, 0x10, 0xf7, 0x69, 0xb4, 0xac, 0x94, + 0xb7, 0x1b, 0xb6, 0xcc, 0x0b, 0xb6, 0x33, 0xef, 0xd9, 0xcd, 0xfb, 0xa4, 0x32, 0xa3, 0x2c, 0x59, + 0x47, 0x08, 0xd5, 0x04, 0x4c, 0x52, 0x73, 0x9d, 0xc7, 0x6c, 0x7a, 0x93, 0x57, 0xab, 0xd9, 0xd1, + 0x8a, 0x83, 0x9e, 0x53, 0x84, 0x1c, 0x6a, 0x8e, 0x35, 0x2e, 0x35, 0x16, 0x95, 0x0c, 0x30, 0x31, + 0xf3, 0x6d, 0x05, 0xec, 0x58, 0x22, 0x47, 0xd8, 0xec, 0xe9, 0x2d, 0x6f, 0xf2, 0x02, 0x70, 0x34, + 0x8b, 0x28, 0x4e, 0xb6, 0xe5, 0xd4, 0xb7, 0x9f, 0xcd, 0x04, 0x6b, 0x5c, 0xb6, 0x16, 0xd4, 0xc2, + 0x93, 0xa4, 0xb0, 0x87, 0x88, 0x98, 0xa5, 0xd1, 0xc3, 0xd4, 0xb4, 0x9c, 0xa0, 0x9c, 0xf5, 0x97, + 0x2e, 0xf2, 0x34, 0x2f, 0xa6, 0x9f, 0x7b, 0x9e, 0x37, 0x5b, 0x82, 0x30, 0xcd, 0x32, 0xf9, 0xc8, + 0x38, 0x0b, 0x41, 0xf2, 0xb7, 0x80, 0x50, 0xca, 0x96, 0xd5, 0x34, 0xda, 0x56, 0xb9, 0x2c, 0x28, + 0x08, 0x03, 0x2a, 0xa9, 0x45, 0x50, 0x00, 0xc4, 0x2a, 0xb9, 0x63, 0xb3, 0x8a, 0x7d, 0xa8, 0x88, + 0xf5, 0x59, 0x35, 0x35, 0x27, 0xf0, 0x1f, 0x20, 0x2a, 0xd1, 0xaa, 0x8a, 0x28, 0x2b, 0x81, 0xdb, + 0xeb, 0x29, 0x3d, 0x41, 0x0f, 0xf6, 0xd3, 0xc0, 0x1e, 0xce, 0xcc, 0x75, 0x79, 0xb4, 0xee, 0x58, + 0xb9, 0x94, 0x2f, 0x8c, 0xb0, 0x3f, 0x29, 0x58, 0xa1, 0xa1, 0x53, 0x5d, 0xef, 0x51, 0x98, 0x2a, + 0xdf, 0x4c, 0xed, 0xfd, 0xa3, 0xaa, 0x20, 0xf9, 0xe5, 0xb9, 0x7d, 0x5c, 0xc4, 0x52, 0x62, 0x92, + 0x39, 0xb2, 0xfc, 0x46, 0x1a, 0x1c, 0x9d, 0x1d, 0xd5, 0xf0, 0x8a, 0xbf, 0x49, 0xc8, 0xef, 0xd9, + 0xc3, 0xb2, 0x00, 0x5b, 0x28, 0x35, 0x52, 0x80, 0x9d, 0xfd, 0xcc, 0x18, 0xc3, 0xbf, 0x2a, 0xdf, + 0xdd, 0xe4, 0x1f, 0xcc, 0x72, 0x15, 0xc5, 0xa0, 0xe5, 0xb6, 0xe6, 0x62, 0x2f, 0xcd, 0xd6, 0x4c, + 0xc7, 0xf2, 0xa0, 0xfb, 0xc8, 0x7e, 0xd6, 0x5f, 0x6f, 0xef, 0xf7, 0x7f, 0xfb, 0xe3, 0x41, 0x56, + 0xc5, 0x74, 0x85, 0x26, 0xb7, 0x03, 0x7d, 0xaf, 0x90, 0x3b, 0x24, 0xf7, 0x8c, 0x95, 0xe5, 0x60, + 0xec, 0x3f, 0x1b, 0xee, 0xad, 0x18, 0x8d, 0x20, 0x4a, 0x77, 0x37, 0xd1, 0xe2, 0xfd, 0x6d, 0x91, + 0x6f, 0xb3, 0xd8, 0xe4, 0xca, 0xb4, 0x02, 0x31, 0x0d, 0x6c, 0x03, 0x86, 0x77, 0x6c, 0xb8, 0x58, + 0x13, 0x7f, 0x28, 0x34, 0x79, 0xea, 0x6c, 0x3e, 0x68, 0xc0, 0xfb, 0x24, 0xd6, 0x50, 0xe3, 0xe0, + 0xbf, 0xa0, 0xab, 0xe4, 0xa4, 0x7a, 0x2d, 0x9c, 0x3c, 0xe8, 0x33, 0x86, 0x7f, 0xc5, 0xed, 0x0d, + 0x81, 0x85, 0x3f, 0x96, 0x3b, 0x1a, 0xce, 0x96, 0x29, 0xfb, 0x60, 0xc6, 0x49, 0xc1, 0x16, 0x24, + 0x54, 0x18, 0x7b, 0xbb, 0xce, 0xb8, 0x24, 0xd0, 0x52, 0xd6, 0xd1, 0x07, 0x53, 0x58, 0xcb, 0xc4, + 0xbe, 0x5b, 0xd1, 0x3b, 0x37, 0x99, 0x09, 0xd4, 0x92, 0x9e, 0x46, 0x69, 0x72, 0x0b, 0x46, 0x08, + 0x3d, 0x48, 0x13, 0x46, 0x58, 0x7e, 0xa8, 0x6f, 0x03, 0x13, 0xc0, 0x19, 0x78, 0x19, 0x0a, 0x9b, + 0xf3, 0x6c, 0xd0, 0xea, 0x96, 0x06, 0x0a, 0x5e, 0x18, 0xf2, 0xc1, 0x5c, 0xa4, 0x79, 0xc9, 0x76, + 0x71, 0x52, 0x6e, 0x50, 0x49, 0x10, 0xd5, 0x43, 0xf5, 0xdb, 0x77, 0x5a, 0x13, 0x3a, 0x26, 0xd8, + 0xfd, 0xba, 0x9c, 0x2e, 0x40, 0x67, 0x59, 0x21, 0xad, 0xd3, 0x71, 0x9c, 0xb1, 0x1b, 0xce, 0x16, + 0xdb, 0xa2, 0x84, 0xd7, 0x4d, 0x9e, 0x50, 0xa5, 0xa0, 0x8e, 0x94, 0x6b, 0xf6, 0xcb, 0xb6, 0xac, + 0x92, 0xe5, 0x83, 0x29, 0xf5, 0x5d, 0x00, 0xe0, 0xc6, 0x6a, 0x73, 0x4d, 0x17, 0xe8, 0x0b, 0x35, + 0x95, 0x83, 0x93, 0x57, 0xdf, 0xb5, 0x47, 0xda, 0x44, 0x71, 0x9c, 0x64, 0xb7, 0x53, 0x87, 0xf4, + 0x01, 0xbd, 0xcd, 0xa1, 0xa9, 0x73, 0x60, 0xe0, 0xdb, 0x17, 0x03, 0x94, 0xb3, 0x66, 0x6a, 0x04, + 0x78, 0xa8, 0x90, 0xc5, 0x71, 0xd9, 0x09, 0x09, 0x23, 0x0e, 0x8a, 0x02, 0x30, 0x1b, 0xff, 0x34, + 0x6e, 0x9d, 0x7b, 0x14, 0x31, 0x30, 0xb9, 0x35, 0xe8, 0x90, 0x45, 0x77, 0x87, 0x0a, 0x46, 0xde, + 0xaa, 0xe3, 0x1b, 0x41, 0x6b, 0x00, 0x4a, 0x54, 0x4d, 0x89, 0xe2, 0xda, 0x4f, 0x82, 0xe2, 0x18, + 0x07, 0x91, 0x83, 0x63, 0xbe, 0x04, 0x4b, 0x14, 0x18, 0xca, 0xa1, 0xb4, 0x48, 0xf2, 0x61, 0xe9, + 0xe2, 0x9f, 0x99, 0x14, 0xe0, 0x4d, 0x9a, 0x2f, 0xde, 0x8b, 0x01, 0x48, 0x5f, 0x14, 0x5f, 0x19, + 0xc0, 0xd0, 0x12, 0x6d, 0x40, 0x43, 0x23, 0x0d, 0x56, 0xf4, 0x4b, 0x48, 0x82, 0x4a, 0x62, 0xb6, + 0xc8, 0x0b, 0xee, 0xfb, 0xb3, 0x3c, 0x63, 0xcd, 0xb8, 0xc2, 0xd6, 0x0e, 0x49, 0x8d, 0xe3, 0x58, + 0x6a, 0x81, 0x6d, 0xdb, 0x4d, 0x07, 0x2b, 0x5a, 0xa0, 0x14, 0x7a, 0x7a, 0xf8, 0xc1, 0xc2, 0x1e, + 0xdb, 0xb2, 0xd3, 0x72, 0xb9, 0xac, 0x3b, 0x59, 0x09, 0xd0, 0x5b, 0x2b, 0x25, 0x21, 0xf0, 0x57, + 0x6e, 0xff, 0xc9, 0x47, 0xc4, 0x5e, 0xb0, 0x14, 0x4a, 0xd0, 0x89, 0xdd, 0xe6, 0x3b, 0x19, 0x50, + 0xed, 0x67, 0x50, 0x70, 0x93, 0x82, 0xfd, 0x2c, 0x93, 0x9d, 0xa4, 0xd5, 0x56, 0x89, 0x24, 0xae, + 0xef, 0x31, 0xc7, 0xd8, 0x11, 0x6b, 0x96, 0xd1, 0x3a, 0x49, 0x1f, 0xa6, 0x25, 0xd8, 0x90, 0x59, + 0xb2, 0x22, 0x59, 0xee, 0x63, 0xc8, 0x17, 0x92, 0xb4, 0x34, 0x30, 0xff, 0x00, 0x37, 0xbd, 0x8e, + 0x92, 0xcc, 0x28, 0xb7, 0x6b, 0x08, 0x2a, 0x0f, 0xbb, 0x16, 0x9b, 0x01, 0xdd, 0xe8, 0x06, 0x34, + 0x52, 0x60, 0x03, 0x74, 0xa4, 0xd1, 0xa6, 0x64, 0x53, 0xf9, 0x20, 0x25, 0x5f, 0x62, 0x66, 0x40, + 0x78, 0xf0, 0xc0, 0xc4, 0x15, 0xa8, 0x36, 0xf1, 0x7d, 0x74, 0xc8, 0x1b, 0xb2, 0xe9, 0x4d, 0x54, + 0xa0, 0xc8, 0xa3, 0x29, 0xe7, 0xa0, 0x21, 0x79, 0x0f, 0x91, 0x37, 0x4d, 0x32, 0x06, 0x01, 0xe1, + 0x86, 0xd3, 0x70, 0xcf, 0x75, 0x28, 0x04, 0xb6, 0xaf, 0x9c, 0x5d, 0x23, 0x71, 0x0f, 0x94, 0x6a, + 0xbf, 0x72, 0x95, 0x12, 0x77, 0x84, 0x25, 0x45, 0xc3, 0x9a, 0x3d, 0xcf, 0x66, 0xcc, 0x34, 0xba, + 0x61, 0x3d, 0x1e, 0x12, 0xa5, 0xd2, 0xe3, 0x12, 0xe3, 0x45, 0xbc, 0x60, 0x7e, 0x47, 0xb3, 0x03, + 0xf2, 0x87, 0x55, 0x95, 0xaf, 0xa7, 0x66, 0x08, 0xcf, 0x52, 0x19, 0x1c, 0xdf, 0x9d, 0x78, 0xb5, + 0x82, 0x26, 0x19, 0xe2, 0x6e, 0x0a, 0x3d, 0x6d, 0x94, 0xd3, 0xb3, 0xc8, 0x32, 0x14, 0x72, 0x7c, + 0xdb, 0xe6, 0x4e, 0x12, 0xa8, 0x98, 0x51, 0x27, 0x99, 0x6e, 0x85, 0x4d, 0xd0, 0x17, 0x03, 0xda, + 0x52, 0xb1, 0x79, 0x16, 0xa0, 0x68, 0xba, 0xc8, 0x02, 0xb0, 0xcb, 0xa1, 0x67, 0x90, 0xae, 0xd1, + 0xdd, 0x13, 0x17, 0xa6, 0x75, 0x44, 0x05, 0x01, 0x61, 0xf6, 0x64, 0xf4, 0x17, 0x4b, 0x81, 0x1c, + 0xa9, 0x5d, 0xe6, 0x8b, 0x6d, 0x79, 0xac, 0x92, 0x8b, 0x50, 0x16, 0x2b, 0xf1, 0x23, 0xc9, 0x20, + 0xb7, 0xc5, 0x88, 0x06, 0x7f, 0x3c, 0xb0, 0x4c, 0x0d, 0x79, 0xff, 0x59, 0xb2, 0xc6, 0x14, 0x34, + 0x02, 0x35, 0x20, 0x78, 0x3f, 0x57, 0x0f, 0x1b, 0x36, 0x5f, 0xac, 0xd8, 0xe2, 0x3d, 0x74, 0x7d, + 0xd7, 0x6f, 0x13, 0xb3, 0x46, 0xba, 0x4a, 0xa7, 0x6c, 0xbb, 0xbe, 0x61, 0xc5, 0x3b, 0x43, 0x29, + 0xda, 0x44, 0x65, 0x79, 0x0f, 0xdd, 0x5a, 0x85, 0x68, 0x2b, 0xef, 0x8c, 0x92, 0xa5, 0x10, 0xae, + 0x76, 0x87, 0xa2, 0x5f, 0x2c, 0x16, 0xbd, 0x72, 0x57, 0xe2, 0x20, 0xb6, 0x76, 0xe1, 0x9f, 0xcd, + 0x23, 0xa1, 0xeb, 0xda, 0x06, 0xfd, 0xf3, 0x20, 0x1e, 0x42, 0x84, 0xed, 0x78, 0x24, 0x19, 0x1c, + 0x6c, 0x45, 0x66, 0x24, 0x44, 0x57, 0x2d, 0x21, 0x97, 0x4c, 0xfe, 0x0a, 0x2d, 0x83, 0x8b, 0xb1, + 0xb1, 0xbb, 0xbc, 0xd0, 0x2c, 0x97, 0xa7, 0xa6, 0x46, 0x83, 0x4a, 0x5d, 0x36, 0x53, 0xdc, 0x03, + 0x17, 0xcb, 0x14, 0x74, 0x71, 0xc1, 0x56, 0x79, 0x8a, 0xd9, 0xa8, 0x74, 0x47, 0x0c, 0xff, 0x88, + 0x06, 0xc2, 0xcb, 0x29, 0x23, 0x4c, 0xd5, 0xb0, 0x3e, 0x1e, 0x1e, 0x92, 0x3c, 0xea, 0x21, 0xd9, + 0x9d, 0x40, 0x56, 0x31, 0x14, 0x30, 0xb9, 0x5e, 0x70, 0xce, 0xf2, 0x97, 0xf6, 0x00, 0x9f, 0x7b, + 0xe3, 0xc9, 0x98, 0x2d, 0x66, 0x8d, 0x7d, 0x5b, 0x8b, 0x2a, 0x93, 0xd9, 0x22, 0x3e, 0x76, 0x53, + 0x45, 0x4d, 0xaf, 0xed, 0x8a, 0x5c, 0xd1, 0xec, 0xb6, 0x48, 0xc8, 0x74, 0x21, 0xc1, 0x30, 0x59, + 0x16, 0x4f, 0xdd, 0x56, 0x49, 0x59, 0xc1, 0x1c, 0x69, 0xea, 0xf0, 0xb2, 0x22, 0xbf, 0x57, 0x9b, + 0xe0, 0xab, 0xa8, 0xa7, 0x61, 0x8d, 0x66, 0xec, 0xdd, 0x22, 0x65, 0x51, 0x41, 0x93, 0x08, 0xaa, + 0x12, 0xf1, 0x5f, 0x62, 0x81, 0xee, 0x8d, 0x99, 0x11, 0xb9, 0x8d, 0x59, 0x4f, 0x6a, 0xf0, 0x68, + 0xda, 0x35, 0xfe, 0x53, 0xb2, 0xae, 0x6e, 0x44, 0x6c, 0xe5, 0x60, 0x40, 0x2d, 0x2f, 0xba, 0x2f, + 0xa2, 0xcd, 0x14, 0x2f, 0xc7, 0xf2, 0x12, 0xe1, 0xb2, 0x71, 0x5c, 0x4d, 0x4c, 0x2e, 0xea, 0xf4, + 0x4c, 0xd5, 0x59, 0xde, 0x02, 0x4b, 0xf6, 0xcb, 0x3c, 0x47, 0xae, 0x29, 0x7a, 0xee, 0xd6, 0x0e, + 0x8b, 0xeb, 0xf9, 0x41, 0xd0, 0xdd, 0x7f, 0x1e, 0xdd, 0x80, 0xd8, 0xa5, 0x2a, 0xc6, 0x1e, 0xfe, + 0xd9, 0x5b, 0x37, 0x79, 0xfc, 0xd0, 0x72, 0xca, 0x69, 0xb2, 0x51, 0x0d, 0xfd, 0xd0, 0x5f, 0xb3, + 0x78, 0x69, 0x2f, 0xbb, 0x39, 0x87, 0x73, 0xda, 0xb6, 0xb8, 0x87, 0xc4, 0x22, 0x88, 0x68, 0x94, + 0x63, 0xf5, 0x48, 0xb1, 0x95, 0x21, 0xe2, 0x05, 0xf4, 0xa8, 0x9f, 0x65, 0x7b, 0x0b, 0x23, 0x27, + 0x02, 0x76, 0x5b, 0xe1, 0x69, 0x64, 0xdb, 0x3d, 0x84, 0x5b, 0x98, 0xc3, 0x1a, 0x4a, 0x97, 0xa7, + 0xe1, 0x89, 0xbd, 0x76, 0xb5, 0x43, 0x07, 0xc5, 0xad, 0x92, 0x05, 0xf0, 0x0b, 0xf4, 0xf6, 0x66, + 0x0b, 0x11, 0x21, 0xeb, 0xcb, 0xc5, 0xb8, 0x75, 0x09, 0x55, 0xb3, 0x7b, 0xf2, 0x32, 0x25, 0xe6, + 0x75, 0x32, 0xd8, 0x4e, 0xf4, 0x22, 0x26, 0x1c, 0x53, 0x18, 0x88, 0x4a, 0x22, 0x7d, 0x85, 0x34, + 0xbd, 0xa5, 0x1d, 0x8e, 0x8f, 0xa8, 0x03, 0x92, 0xdc, 0xbd, 0x08, 0x54, 0x1f, 0x99, 0xbd, 0x40, + 0x73, 0xf3, 0x26, 0x2a, 0x76, 0xaa, 0x21, 0xdf, 0x82, 0xd2, 0x62, 0x8c, 0x68, 0x4c, 0x17, 0x4b, + 0x88, 0x59, 0x4f, 0xb4, 0xcd, 0xb2, 0x2a, 0x58, 0xb5, 0x58, 0x1d, 0x8a, 0xf5, 0x84, 0x45, 0xf0, + 0x84, 0x55, 0x04, 0x5e, 0x74, 0xc8, 0xaa, 0x74, 0xa4, 0xfe, 0x2c, 0x09, 0xc0, 0x06, 0x08, 0x52, + 0x87, 0x23, 0xc8, 0xe4, 0x5e, 0xea, 0x11, 0x95, 0x10, 0x78, 0x50, 0x46, 0xd8, 0xd4, 0x85, 0x30, + 0xeb, 0xc6, 0x02, 0xb5, 0x61, 0x83, 0xee, 0xc1, 0xbc, 0xaa, 0x9d, 0x18, 0x90, 0xe9, 0x1d, 0x9b, + 0x12, 0xf0, 0x7c, 0xb1, 0x5c, 0x01, 0xff, 0x20, 0xe1, 0xee, 0x4b, 0x51, 0x51, 0x15, 0xda, 0x63, + 0x76, 0x33, 0x96, 0xc6, 0x1d, 0x74, 0xa0, 0x11, 0x1f, 0x76, 0x02, 0x0d, 0xf2, 0x1c, 0x1d, 0x9d, + 0x6a, 0xd6, 0x2b, 0x0e, 0xe7, 0xfb, 0x42, 0xd5, 0x9f, 0xd5, 0xd3, 0x3d, 0x99, 0xa9, 0x8c, 0x60, + 0x84, 0xbb, 0xdb, 0xf6, 0x7c, 0xad, 0xb5, 0xdc, 0x41, 0xb6, 0x2e, 0x56, 0x5c, 0x48, 0x22, 0xd0, + 0xdc, 0x64, 0x3b, 0x45, 0x6a, 0xa4, 0x84, 0xc2, 0xde, 0x76, 0xea, 0xda, 0x89, 0xba, 0x98, 0xd2, + 0x00, 0x83, 0xb6, 0x40, 0x8d, 0xd1, 0x10, 0x66, 0xdd, 0x9b, 0x26, 0x90, 0x82, 0xb9, 0x69, 0x3b, + 0x45, 0x87, 0xec, 0xfd, 0xf6, 0x16, 0x67, 0x68, 0x27, 0x6d, 0x87, 0xfb, 0x63, 0x1a, 0xb0, 0x4e, + 0x88, 0x31, 0xe7, 0xe1, 0x92, 0x6a, 0xa6, 0x27, 0x2d, 0x19, 0x71, 0xc8, 0x66, 0x79, 0x9f, 0x80, + 0xd2, 0x2a, 0x72, 0x9a, 0xf6, 0xe4, 0x23, 0x94, 0x55, 0xf4, 0x0e, 0x2a, 0x52, 0x0d, 0xaf, 0x5f, + 0x27, 0xd4, 0xcc, 0xa2, 0x1e, 0x00, 0x72, 0x08, 0xbf, 0x9c, 0x81, 0x7d, 0x82, 0x7f, 0x81, 0x89, + 0x22, 0x77, 0x5d, 0x6b, 0x98, 0x9d, 0xa5, 0x52, 0x89, 0xfc, 0x31, 0xe9, 0xbd, 0x8a, 0xa0, 0x0c, + 0xd9, 0xed, 0xc2, 0x83, 0x75, 0x9e, 0x6e, 0x2f, 0xd1, 0x40, 0xa1, 0x0e, 0x71, 0x8f, 0x0a, 0xf3, + 0x16, 0x29, 0x83, 0x3e, 0x03, 0x67, 0x6c, 0xc7, 0xec, 0xd6, 0x40, 0xb5, 0xd4, 0x6c, 0xe3, 0x73, + 0xc6, 0xd8, 0xb0, 0x67, 0xe9, 0xad, 0x15, 0x1e, 0x89, 0xb5, 0xdd, 0xf0, 0xe8, 0x77, 0xc3, 0xa3, + 0x9c, 0x85, 0x8e, 0x30, 0xd5, 0xa6, 0x85, 0xa0, 0x4d, 0xcf, 0x3a, 0x00, 0xd7, 0xc6, 0x76, 0x12, + 0x86, 0xad, 0x39, 0x93, 0x84, 0xd2, 0x8d, 0x1a, 0x76, 0x70, 0xcf, 0xa6, 0xfd, 0x5e, 0x32, 0xe1, + 0x36, 0x7c, 0x9c, 0x28, 0x1f, 0x7c, 0x25, 0xcc, 0x93, 0x31, 0x35, 0x9e, 0xd2, 0x95, 0xc5, 0x2f, + 0x4e, 0xe8, 0x0d, 0x9f, 0x7c, 0x3e, 0xd6, 0x45, 0x22, 0x4b, 0x3c, 0xf1, 0xb8, 0x87, 0xe3, 0x1d, + 0x76, 0x87, 0xdc, 0xb9, 0x4b, 0xca, 0xe4, 0x26, 0x49, 0x71, 0x11, 0x98, 0xcf, 0xdf, 0x6b, 0x01, + 0xf3, 0xd9, 0x95, 0x6a, 0x6b, 0x7e, 0xbf, 0x0a, 0xa2, 0x53, 0x85, 0x41, 0xfe, 0xb6, 0x66, 0x71, + 0x12, 0x69, 0xe5, 0xa2, 0x60, 0x2c, 0xd3, 0x22, 0x50, 0xc3, 0x81, 0x92, 0x76, 0x4c, 0x80, 0xf4, + 0xe1, 0x8e, 0x32, 0xb1, 0x6e, 0x50, 0x70, 0x0e, 0x82, 0x82, 0x30, 0x6a, 0xd9, 0x39, 0xc4, 0x85, + 0x06, 0x35, 0x87, 0xf1, 0x9f, 0xcd, 0xf2, 0x9b, 0x5f, 0xc0, 0x85, 0x9a, 0xcb, 0x04, 0x62, 0x18, + 0x28, 0x27, 0xcc, 0x77, 0x9b, 0x85, 0x08, 0xa2, 0x09, 0x74, 0xfd, 0x00, 0x57, 0x91, 0x24, 0xe2, + 0x44, 0x1b, 0x03, 0x44, 0x86, 0xb3, 0x85, 0x27, 0x85, 0xee, 0xd3, 0xc4, 0x85, 0x41, 0x48, 0xc4, + 0x1d, 0x87, 0xeb, 0x1c, 0xc2, 0x75, 0x1e, 0x87, 0x1b, 0xd8, 0x63, 0x82, 0x2b, 0xa3, 0xe9, 0xc9, + 0xd8, 0x21, 0x63, 0x5b, 0xbd, 0xb0, 0xd3, 0x8e, 0x29, 0x8d, 0x73, 0xaa, 0xe3, 0x15, 0xae, 0xb4, + 0x47, 0x77, 0x51, 0x92, 0x62, 0x16, 0xae, 0x2c, 0xd2, 0xa8, 0xcb, 0x2d, 0x2a, 0x44, 0x2d, 0x02, + 0x97, 0x59, 0x0d, 0xc4, 0xda, 0xc8, 0xf0, 0xc0, 0x8f, 0x8a, 0xa5, 0x93, 0xd6, 0x32, 0x88, 0xba, + 0xb4, 0xc3, 0x57, 0x31, 0x1e, 0x5d, 0x94, 0x69, 0x32, 0xed, 0x71, 0xf8, 0xcc, 0xb0, 0x87, 0x32, + 0xc3, 0xf1, 0x23, 0xfc, 0x23, 0xfb, 0x5b, 0x05, 0x2b, 0x37, 0x39, 0x18, 0xf4, 0x1d, 0xdb, 0xf5, + 0xc8, 0xf9, 0xa0, 0x91, 0x58, 0x9e, 0x39, 0x16, 0xb5, 0x6c, 0xb9, 0x5a, 0x7d, 0xd8, 0x31, 0xea, + 0x25, 0x06, 0x89, 0xee, 0xae, 0x73, 0xf2, 0xa8, 0x63, 0x56, 0x49, 0xf6, 0xd0, 0x66, 0xce, 0x69, + 0x31, 0x8f, 0xc2, 0x09, 0x8a, 0xb9, 0xbd, 0x0a, 0x42, 0x7c, 0xa7, 0x54, 0xba, 0xad, 0xa0, 0x87, + 0xfa, 0xa9, 0x44, 0x46, 0xc8, 0x44, 0x15, 0x6d, 0x70, 0xea, 0xa4, 0xf3, 0x68, 0xaa, 0x6a, 0x77, + 0x80, 0xf1, 0xd9, 0xdb, 0xae, 0x9d, 0x1f, 0x34, 0x53, 0x73, 0x8d, 0x2b, 0xed, 0xf9, 0x19, 0xdf, + 0x54, 0xfa, 0xcb, 0x7f, 0x9c, 0x9f, 0x89, 0x0d, 0xaf, 0x73, 0x44, 0x55, 0x5b, 0xa4, 0x30, 0x39, + 0x9f, 0xe3, 0x63, 0xbd, 0x8f, 0x05, 0x86, 0xa9, 0x25, 0xf1, 0x1c, 0xef, 0x98, 0x35, 0x89, 0x72, + 0xaa, 0xe3, 0x6b, 0x55, 0xa2, 0x93, 0x0e, 0xe3, 0x6a, 0xbc, 0x44, 0x57, 0x1a, 0x51, 0xc3, 0x38, + 0xb9, 0x13, 0xad, 0xd4, 0x3d, 0xb2, 0x56, 0x13, 0x72, 0x56, 0x1a, 0xd0, 0x3a, 0xd7, 0x71, 0x6d, + 0x0d, 0x95, 0x9b, 0xe9, 0x12, 0x34, 0x66, 0x13, 0x3c, 0x6d, 0xed, 0x82, 0x6e, 0x0d, 0x01, 0x68, + 0x62, 0x4b, 0xec, 0xaf, 0xd1, 0x40, 0xf3, 0xe7, 0x97, 0x69, 0xb2, 0x78, 0xaf, 0x55, 0xb9, 0xb6, + 0xdd, 0xe0, 0xca, 0xbf, 0xf6, 0x90, 0x6f, 0x0b, 0x8d, 0x1a, 0xe0, 0x00, 0xcf, 0x2f, 0xce, 0xcf, + 0xa0, 0x63, 0x1f, 0x3e, 0x67, 0x84, 0x50, 0x5f, 0xcd, 0xca, 0xc1, 0x81, 0x70, 0xb3, 0x8e, 0x8f, + 0xc4, 0x71, 0x14, 0xf2, 0x69, 0xef, 0x08, 0xae, 0x9c, 0x2e, 0x27, 0x7a, 0x86, 0x53, 0xb9, 0xc3, + 0x2d, 0x0b, 0xc0, 0xc3, 0x93, 0x09, 0x8f, 0x7d, 0xe3, 0x43, 0x76, 0x4d, 0x12, 0xd1, 0xa1, 0xde, + 0x84, 0x20, 0xf6, 0xfe, 0x28, 0x4f, 0x22, 0xe2, 0x08, 0xab, 0x68, 0x61, 0x52, 0xf2, 0x32, 0xa2, + 0x3e, 0x1a, 0xf7, 0x01, 0xba, 0x16, 0x47, 0x55, 0x84, 0x72, 0xc5, 0x3d, 0x4a, 0x70, 0x7e, 0xf0, + 0xa4, 0x5f, 0xfc, 0x2b, 0xf9, 0x2e, 0xd1, 0xae, 0x59, 0xb5, 0xdd, 0x9c, 0x9f, 0x45, 0xbd, 0xcc, + 0x41, 0x1c, 0xfa, 0x2a, 0x68, 0x44, 0x9a, 0x54, 0x6a, 0x90, 0x76, 0xdf, 0xb2, 0x6a, 0xfe, 0x3f, + 0x37, 0x69, 0x04, 0xc3, 0x81, 0x61, 0xcf, 0xb3, 0x3c, 0xdf, 0xb0, 0x0c, 0x14, 0x66, 0x55, 0xb0, + 0xe5, 0xdc, 0x3a, 0x03, 0x8b, 0xaa, 0x2e, 0xbe, 0x03, 0x31, 0x94, 0x47, 0x86, 0xf9, 0x24, 0x68, + 0xdb, 0x0d, 0x90, 0xc2, 0x2e, 0xfe, 0x49, 0xb7, 0xdf, 0x0f, 0x70, 0x55, 0x55, 0x9b, 0x72, 0x7a, + 0x76, 0x76, 0x9b, 0x54, 0xab, 0xed, 0x8d, 0xb5, 0xc8, 0xd7, 0x67, 0xdf, 0xa4, 0x5b, 0x8c, 0xcb, + 0x0b, 0x56, 0x9c, 0x29, 0x52, 0x3e, 0xbb, 0x4f, 0xde, 0x27, 0xc0, 0xb2, 0xf7, 0xc9, 0xd1, 0x41, + 0xdb, 0x9c, 0x47, 0x37, 0xa6, 0x23, 0x22, 0xab, 0xed, 0xda, 0x84, 0xc8, 0x70, 0x4a, 0xa3, 0x79, + 0x4f, 0x50, 0x6a, 0x8d, 0x0c, 0x76, 0x2e, 0x32, 0x57, 0x13, 0x7c, 0xc6, 0x91, 0x6e, 0x5c, 0x45, + 0xa0, 0x83, 0x30, 0x86, 0x35, 0xcb, 0xb6, 0xa8, 0xeb, 0xe9, 0x5c, 0x64, 0xcf, 0x97, 0xb4, 0x70, + 0x85, 0xdb, 0xcc, 0xdf, 0xa0, 0xd4, 0x31, 0xa9, 0x71, 0xc1, 0x2f, 0x8c, 0x75, 0xb0, 0x05, 0xe8, + 0x70, 0x0c, 0x9b, 0xa3, 0x76, 0xd2, 0xa5, 0xb9, 0xdb, 0x92, 0x7b, 0x18, 0x56, 0xa8, 0x45, 0xc2, + 0x58, 0xa5, 0xc6, 0xa9, 0x1e, 0x24, 0xdf, 0x54, 0x5c, 0x09, 0x3b, 0x50, 0x57, 0x6e, 0xdb, 0xd0, + 0x4c, 0xf7, 0xe2, 0x92, 0x07, 0x6a, 0xb4, 0x6e, 0xd4, 0x58, 0x18, 0xc8, 0xed, 0x33, 0x2d, 0x39, + 0x10, 0xad, 0x55, 0x49, 0x20, 0xe0, 0xe6, 0xfb, 0xa8, 0x51, 0xdb, 0xd0, 0xf3, 0x31, 0x76, 0x54, + 0xe4, 0x2e, 0x25, 0xe8, 0x34, 0x29, 0x2b, 0x60, 0x5f, 0xa5, 0x38, 0xce, 0x36, 0x4b, 0x8e, 0xc1, + 0x3a, 0xbf, 0x29, 0x3e, 0xcd, 0x43, 0xa8, 0x19, 0x4a, 0x1f, 0x3c, 0x0c, 0x16, 0xa2, 0x29, 0x3e, + 0x3e, 0xae, 0x5b, 0xcd, 0xd4, 0xf9, 0x94, 0x42, 0x35, 0xde, 0xb9, 0x2c, 0x93, 0x58, 0x74, 0x55, + 0xd6, 0xf0, 0x2f, 0xae, 0xaf, 0xbf, 0xff, 0xf6, 0xb8, 0xcf, 0xac, 0xe1, 0x50, 0x17, 0xad, 0x5e, + 0xf1, 0xd5, 0x94, 0x05, 0xd1, 0xb9, 0xfe, 0x12, 0x27, 0x6e, 0xdc, 0x43, 0x83, 0x3c, 0xbf, 0xd7, + 0x10, 0x26, 0x1d, 0x8a, 0x20, 0x6b, 0xd1, 0x71, 0x64, 0xbd, 0x3e, 0x16, 0x71, 0xc8, 0xe3, 0x7e, + 0x05, 0xfd, 0x9d, 0xe4, 0xca, 0xc5, 0xea, 0x1e, 0x92, 0xdf, 0x88, 0xaa, 0x27, 0x90, 0xad, 0x98, + 0x72, 0x6b, 0xa2, 0x4e, 0x46, 0x5a, 0x97, 0xc8, 0xb1, 0x4e, 0x40, 0x22, 0x68, 0xb5, 0x43, 0xa9, + 0xbb, 0x6a, 0xcd, 0xe4, 0x58, 0xaf, 0x61, 0x22, 0xb8, 0x47, 0x40, 0x75, 0x91, 0x03, 0xf3, 0x27, + 0xdf, 0x51, 0xbf, 0x9a, 0x4c, 0xfa, 0x11, 0xf6, 0xc0, 0x3a, 0x4e, 0x63, 0x04, 0x7f, 0xa5, 0xd3, + 0x38, 0xc5, 0xfd, 0x7a, 0xa0, 0x5e, 0xf7, 0xf8, 0x08, 0x65, 0xdc, 0x51, 0x4a, 0xee, 0xfc, 0x71, + 0xe4, 0x64, 0xf9, 0x9f, 0x4e, 0xd1, 0x63, 0x10, 0x54, 0x63, 0xa8, 0xd5, 0xec, 0x84, 0x41, 0x24, + 0x9a, 0x6c, 0xa5, 0x9f, 0x46, 0x0b, 0x48, 0xac, 0xe1, 0xe1, 0x4a, 0x0f, 0xc4, 0xae, 0x4d, 0xca, + 0x2a, 0x26, 0x23, 0x40, 0xad, 0x68, 0x3c, 0xf8, 0xaf, 0x4b, 0x08, 0x12, 0xb8, 0x4b, 0x33, 0xd7, + 0xeb, 0x01, 0x3e, 0xd9, 0xcc, 0xce, 0xcf, 0x7a, 0xdc, 0xcd, 0x23, 0xbe, 0x4c, 0x17, 0xd3, 0x22, + 0xad, 0x2f, 0x81, 0x11, 0x36, 0x28, 0x5a, 0xf2, 0x19, 0xad, 0x26, 0x37, 0x59, 0x8f, 0x66, 0x3c, + 0xab, 0x63, 0x66, 0xcd, 0xb3, 0x26, 0x99, 0x65, 0x35, 0xd3, 0xe3, 0x8b, 0xeb, 0x0a, 0x66, 0xda, + 0x9c, 0xbd, 0x90, 0xdb, 0xe3, 0xc1, 0x9c, 0x24, 0x4a, 0xcb, 0xa3, 0x19, 0x0e, 0xc1, 0xe2, 0x82, + 0x43, 0x36, 0xb3, 0xa2, 0x04, 0xd7, 0x0f, 0x9d, 0xb4, 0xd6, 0x16, 0x59, 0x8d, 0x36, 0x9f, 0xb5, + 0x43, 0x1e, 0xcb, 0xe7, 0xf9, 0x4f, 0xf0, 0x4f, 0xea, 0x3a, 0xc0, 0x6f, 0xc9, 0x4e, 0x79, 0xce, + 0xb7, 0x88, 0xb2, 0x56, 0xd2, 0x07, 0x9c, 0x3e, 0x99, 0x39, 0x77, 0x0c, 0x46, 0x18, 0x09, 0x82, + 0x79, 0x34, 0x77, 0x78, 0xaa, 0xd1, 0x90, 0x04, 0x2e, 0xae, 0x11, 0x24, 0x71, 0x3b, 0x63, 0x15, + 0xa8, 0xda, 0xfb, 0xe3, 0xac, 0x3e, 0x95, 0xc3, 0x89, 0x08, 0xf8, 0x07, 0xd0, 0x28, 0x20, 0xfd, + 0xc1, 0x64, 0x2a, 0xa9, 0x49, 0x9d, 0xaf, 0x63, 0xfc, 0x32, 0x31, 0x9c, 0x89, 0x60, 0xf9, 0x64, + 0xb2, 0x0f, 0x33, 0xaa, 0xce, 0xbb, 0xc8, 0x72, 0xc8, 0x9c, 0x1a, 0xe5, 0x93, 0xd6, 0x45, 0x6e, + 0xb4, 0x0b, 0xb2, 0xc7, 0xba, 0x7a, 0xad, 0xf0, 0xc0, 0xa0, 0xfa, 0x55, 0x8f, 0x4b, 0x05, 0xe6, + 0xdc, 0xb8, 0xd8, 0xfe, 0x88, 0x40, 0x4e, 0x08, 0x43, 0x02, 0xf8, 0x23, 0x84, 0xc1, 0x05, 0xf1, + 0x77, 0x01, 0xf1, 0xe5, 0xf5, 0x9b, 0x5e, 0x8e, 0xf7, 0x70, 0x9b, 0x5b, 0x50, 0x74, 0x87, 0x21, + 0xa7, 0x88, 0xd6, 0xe5, 0x6f, 0x27, 0x07, 0x81, 0xfc, 0x81, 0xb4, 0x5c, 0x23, 0x38, 0xd0, 0xd7, + 0x65, 0x72, 0xbb, 0xe5, 0xa7, 0x64, 0x9e, 0x40, 0x92, 0x0a, 0xf2, 0xfc, 0x0c, 0x67, 0xf1, 0xf2, + 0x45, 0x71, 0xc4, 0xfc, 0x48, 0x9e, 0x56, 0x07, 0x5c, 0xfe, 0x7e, 0x71, 0x95, 0x53, 0xaa, 0x6d, + 0x59, 0x56, 0x0b, 0x8a, 0x38, 0xaa, 0x42, 0xab, 0x02, 0x74, 0x90, 0x69, 0xcd, 0xca, 0x32, 0xba, + 0x55, 0xf3, 0xdb, 0x73, 0x71, 0x74, 0x05, 0xe9, 0x12, 0x4f, 0x1d, 0x7d, 0xe5, 0x23, 0x8b, 0xa3, + 0x50, 0x87, 0x22, 0xc8, 0xb3, 0x05, 0xce, 0xdc, 0xe7, 0x74, 0xf4, 0xeb, 0x35, 0xb6, 0x79, 0xcd, + 0x07, 0x19, 0x0c, 0x4f, 0xcb, 0xa0, 0x75, 0x66, 0xec, 0xa8, 0x8d, 0x72, 0x19, 0x51, 0x1b, 0xde, + 0x5e, 0xe3, 0x27, 0x74, 0x9d, 0x91, 0xc6, 0x17, 0xa5, 0xf1, 0xa9, 0x25, 0x27, 0x78, 0x77, 0x46, + 0x3a, 0x97, 0x26, 0x2e, 0x09, 0x1d, 0x9d, 0x2d, 0xf5, 0x06, 0xbd, 0x43, 0x2d, 0x3b, 0xc4, 0x98, + 0x2f, 0x8d, 0xe0, 0x44, 0x07, 0x19, 0xcb, 0xa9, 0x95, 0x85, 0x38, 0xb5, 0x79, 0x24, 0x9a, 0x76, + 0x4e, 0x95, 0x5d, 0x9c, 0x6f, 0x54, 0x38, 0x34, 0x33, 0x39, 0x3f, 0xdb, 0x3c, 0x06, 0x45, 0x38, + 0x8d, 0xa3, 0x8e, 0x37, 0x7f, 0x2f, 0xf8, 0xd5, 0x18, 0x85, 0x50, 0x9b, 0xe3, 0x12, 0xab, 0x8a, + 0x2d, 0x1b, 0x5e, 0x70, 0x1d, 0xfe, 0xf1, 0xbf, 0x84, 0xce, 0x9e, 0xf4, 0xee, 0x8a, 0x5c, 0x14, + 0xe3, 0x3b, 0x31, 0xc4, 0x12, 0x62, 0x76, 0x3d, 0xc6, 0x25, 0x56, 0x1f, 0x1d, 0xe6, 0x94, 0x37, + 0x85, 0x67, 0xae, 0xdb, 0xf2, 0x9d, 0x6f, 0xaa, 0xd7, 0x13, 0xaa, 0x5c, 0x9d, 0x73, 0xb5, 0x7d, + 0xe3, 0xef, 0x5c, 0x5b, 0x58, 0xc0, 0x38, 0xb8, 0x9f, 0x9c, 0x55, 0x67, 0xac, 0xdc, 0x98, 0xcb, + 0x12, 0x17, 0x79, 0x4b, 0x56, 0xdc, 0x81, 0x19, 0x5e, 0x16, 0x2c, 0xaa, 0x58, 0x0c, 0x2a, 0x5a, + 0xad, 0xb4, 0x4f, 0xeb, 0xdb, 0x90, 0x8f, 0x09, 0x1a, 0xd2, 0x52, 0x9f, 0x2a, 0x5f, 0x14, 0xc9, + 0xa6, 0xba, 0x00, 0x1d, 0xbe, 0xca, 0x6f, 0xf3, 0xf9, 0x73, 0xb2, 0x09, 0x6e, 0x04, 0x01, 0x9e, + 0x29, 0x11, 0x66, 0x40, 0xcf, 0x6d, 0x87, 0x35, 0x86, 0xbf, 0xe0, 0xb0, 0x36, 0x11, 0x60, 0x03, + 0xd3, 0xb2, 0xd7, 0x8e, 0x6b, 0x4d, 0xdc, 0x40, 0x73, 0x26, 0x96, 0xe7, 0x8e, 0xa2, 0xd0, 0x0a, + 0x34, 0xfc, 0x47, 0xdb, 0x25, 0x26, 0x54, 0x8d, 0x3d, 0x33, 0xb0, 0x42, 0x7f, 0x04, 0xa5, 0x23, + 0x71, 0xe1, 0x75, 0x9e, 0x35, 0x76, 0xc7, 0xa6, 0x63, 0xf9, 0xfe, 0xc8, 0x0a, 0x26, 0x21, 0xfe, + 0xe3, 0x5b, 0x2c, 0xa6, 0x15, 0xd8, 0x81, 0x69, 0x85, 0x9e, 0x63, 0x05, 0xe1, 0x08, 0xff, 0xf1, + 0x72, 0xcd, 0x0a, 0x47, 0x1e, 0x54, 0x3a, 0xa1, 0x36, 0xb6, 0x26, 0xe2, 0xc2, 0x6b, 0xc6, 0xda, + 0xc4, 0x1a, 0xdb, 0x3e, 0x80, 0x07, 0x98, 0xe2, 0x2a, 0x60, 0xb9, 0x93, 0xb1, 0x06, 0x83, 0x8c, + 0xdc, 0xd4, 0x01, 0x64, 0x26, 0x96, 0x1f, 0x44, 0x8e, 0x63, 0xd9, 0xde, 0x44, 0x13, 0x37, 0xb1, + 0xb1, 0x63, 0x85, 0xce, 0x08, 0x80, 0xfb, 0x8e, 0x06, 0x04, 0x39, 0xfe, 0x44, 0xde, 0x78, 0xb5, + 0xe5, 0x3a, 0x21, 0x50, 0xe3, 0x8d, 0xbc, 0xaf, 0xa1, 0xdc, 0x0f, 0x35, 0x7e, 0xe5, 0x95, 0x21, + 0xd4, 0xba, 0x5a, 0x60, 0x39, 0xa1, 0x13, 0xf9, 0x96, 0xef, 0x69, 0x74, 0x11, 0x1c, 0x80, 0xeb, + 0xc8, 0xf2, 0x80, 0x7e, 0x7e, 0x95, 0x7c, 0x71, 0x80, 0x63, 0x96, 0xe7, 0x85, 0x50, 0xec, 0x86, + 0x23, 0x71, 0x95, 0xa8, 0x4c, 0xec, 0x09, 0x80, 0x1b, 0xfb, 0x01, 0x92, 0x35, 0x91, 0x57, 0x59, + 0x6b, 0x03, 0x53, 0x9c, 0x89, 0x0f, 0x7d, 0x6c, 0xc7, 0x11, 0x57, 0xce, 0x06, 0x8f, 0x20, 0x7a, + 0xd6, 0x04, 0x06, 0x82, 0x6b, 0xe0, 0x8b, 0xab, 0x64, 0x2b, 0xc4, 0x1a, 0x18, 0x18, 0x18, 0xe1, + 0x85, 0x8e, 0x35, 0x1e, 0x47, 0x8e, 0x6d, 0x39, 0x63, 0x57, 0x13, 0x37, 0x0e, 0xdf, 0xb5, 0x6c, + 0x3f, 0x04, 0x42, 0x5d, 0x20, 0xcb, 0x17, 0x17, 0xc1, 0x03, 0x90, 0x22, 0x60, 0x1e, 0xb8, 0xe3, + 0x35, 0xa2, 0x3f, 0x02, 0x09, 0x7d, 0xed, 0x78, 0x80, 0x8e, 0xa7, 0x89, 0x9b, 0x10, 0x93, 0x6d, + 0x3b, 0x08, 0x13, 0x44, 0x8f, 0x6c, 0x9a, 0xe0, 0x08, 0xfc, 0x26, 0xb1, 0xc4, 0x0a, 0xe8, 0x1d, + 0xa6, 0x28, 0x51, 0x14, 0x7c, 0x04, 0x0d, 0xec, 0x80, 0xb8, 0x8a, 0x37, 0x5b, 0xd2, 0x1a, 0x5a, + 0xce, 0xc8, 0xd1, 0xfa, 0x2a, 0x45, 0x95, 0x9d, 0x4a, 0xdd, 0x41, 0x10, 0x13, 0x6a, 0x54, 0xeb, + 0x11, 0x68, 0xa4, 0x17, 0xc0, 0x70, 0xa1, 0x1b, 0xbc, 0x86, 0x38, 0x8b, 0x28, 0x4d, 0x00, 0x65, + 0xba, 0x89, 0x37, 0x09, 0x0d, 0x7a, 0x8d, 0x40, 0xd6, 0x29, 0xe8, 0xa3, 0x03, 0x28, 0x01, 0x0b, + 0x40, 0x73, 0x7c, 0x17, 0x90, 0x74, 0x23, 0x07, 0x14, 0x0d, 0xe4, 0x2b, 0x6e, 0x9c, 0x06, 0xd0, + 0x1d, 0x7f, 0x3c, 0xa6, 0x5b, 0x18, 0xa4, 0xa8, 0xab, 0xd0, 0x3e, 0xf0, 0x16, 0xb6, 0x69, 0x79, + 0x41, 0x00, 0x78, 0x4e, 0x50, 0x81, 0x5d, 0x7a, 0x20, 0x90, 0x6b, 0xb8, 0xb9, 0xc1, 0x04, 0x54, + 0xc3, 0x09, 0xfc, 0xaf, 0x01, 0x7b, 0xd0, 0x10, 0x7e, 0x95, 0x3a, 0x34, 0x76, 0x50, 0x51, 0xdd, + 0x10, 0xd5, 0xd3, 0x71, 0x48, 0x3d, 0xf1, 0x26, 0x15, 0x66, 0x84, 0x4a, 0x67, 0x85, 0xe1, 0x1d, + 0x58, 0x85, 0xe7, 0x23, 0xe3, 0x27, 0xd8, 0x88, 0xdf, 0x04, 0x52, 0x13, 0x18, 0x62, 0x8c, 0x88, + 0xfa, 0xe1, 0x0a, 0x9b, 0x8d, 0x10, 0x56, 0xe8, 0x78, 0x9a, 0xb8, 0xd5, 0xaa, 0x1e, 0x3a, 0x08, + 0x71, 0x14, 0xbc, 0x0e, 0xc1, 0x76, 0x11, 0x8f, 0xf1, 0x18, 0xda, 0x02, 0x1b, 0x01, 0x08, 0x5d, + 0x09, 0x9c, 0x89, 0xcf, 0xa6, 0x5a, 0x2c, 0x2b, 0xa9, 0x1a, 0x9e, 0x79, 0x01, 0x4e, 0x17, 0x79, + 0x38, 0x7c, 0x3e, 0x83, 0xf0, 0x53, 0x56, 0x1a, 0x3c, 0xbf, 0x66, 0xd9, 0x16, 0xdc, 0x4a, 0xed, + 0x26, 0x3c, 0x23, 0x78, 0xe5, 0x3a, 0x6f, 0xc7, 0xaf, 0xbc, 0xb7, 0x01, 0xbc, 0x38, 0x0e, 0xbe, + 0x39, 0x1e, 0xbc, 0x3a, 0x0e, 0xbe, 0x53, 0xad, 0x83, 0xd5, 0x4e, 0xf0, 0x93, 0x7e, 0x76, 0xf1, + 0xdc, 0x20, 0xdf, 0x04, 0xee, 0x9e, 0xfb, 0x26, 0xe1, 0x90, 0x74, 0x27, 0xd8, 0x54, 0x7a, 0xdb, + 0x25, 0xf9, 0x20, 0x16, 0xf8, 0xa7, 0x38, 0xa5, 0x35, 0x0a, 0x1e, 0x8a, 0x56, 0xa6, 0x3b, 0x1e, + 0x2f, 0x4c, 0x37, 0x00, 0xf6, 0x79, 0x8e, 0x0b, 0x96, 0x60, 0x8e, 0xc6, 0xa6, 0x0b, 0x52, 0x73, + 0xc1, 0x94, 0xc7, 0xf8, 0x32, 0x1a, 0xdf, 0x99, 0xae, 0x3b, 0x02, 0xc9, 0x61, 0xab, 0x30, 0xf0, + 0x03, 0x57, 0xc3, 0x06, 0xa3, 0x60, 0x1c, 0xfa, 0x50, 0xab, 0x51, 0x9b, 0x15, 0xc2, 0x51, 0xc0, + 0x40, 0xa9, 0x56, 0x83, 0xd1, 0xa8, 0xd5, 0x1d, 0x41, 0xd1, 0x6a, 0x28, 0x66, 0x0d, 0x85, 0x83, + 0x80, 0xeb, 0xc7, 0x35, 0xe2, 0xc3, 0x71, 0x1a, 0x83, 0xc0, 0x09, 0x21, 0x07, 0x1d, 0xa6, 0x13, + 0x84, 0x13, 0xe4, 0x35, 0x78, 0x85, 0x40, 0x00, 0x82, 0x06, 0x9e, 0x6b, 0x7b, 0x0e, 0xd6, 0x22, + 0x10, 0xaa, 0x83, 0xbf, 0x84, 0x8a, 0xec, 0x0d, 0xef, 0xa6, 0xec, 0x8d, 0xcf, 0xd0, 0x5b, 0x50, + 0x23, 0xbb, 0x9b, 0xbc, 0xbb, 0x49, 0x95, 0xf0, 0xf7, 0xe3, 0x1a, 0x58, 0x06, 0xfc, 0x55, 0x78, + 0x65, 0x83, 0x5f, 0x80, 0x3e, 0x75, 0x17, 0x42, 0xca, 0x54, 0x90, 0x22, 0xb0, 0x63, 0x1b, 0xa0, + 0xfa, 0xe8, 0xec, 0x27, 0x01, 0x10, 0x81, 0x56, 0x12, 0x42, 0x63, 0xd7, 0x9c, 0x04, 0xfc, 0x6f, + 0x09, 0xff, 0x34, 0xb5, 0x58, 0x9b, 0x04, 0x77, 0xd8, 0x4b, 0x53, 0x71, 0x51, 0x50, 0x85, 0x6b, + 0x79, 0x74, 0xa4, 0xd0, 0xb6, 0xfc, 0x89, 0x07, 0x74, 0x83, 0x37, 0x1a, 0xd9, 0x81, 0x0b, 0x14, + 0x80, 0x53, 0x77, 0x30, 0x64, 0xb8, 0xe3, 0x12, 0x9f, 0x65, 0x85, 0x26, 0x2a, 0x1e, 0x1b, 0xab, + 0xa6, 0x9c, 0xab, 0x2a, 0xea, 0xd7, 0x3f, 0xb3, 0xf4, 0xff, 0x35, 0xec, 0xcf, 0xd7, 0xb0, 0xb1, + 0xfd, 0x64, 0x05, 0xfb, 0x74, 0xb1, 0x7f, 0xaa, 0x7e, 0xfd, 0x09, 0x5a, 0xdc, 0xa3, 0x59, 0xb8, + 0xd0, 0xa1, 0xba, 0x3f, 0x0c, 0x20, 0xee, 0xe5, 0x84, 0x87, 0x28, 0x00, 0x45, 0x51, 0x0d, 0xa2, + 0x59, 0x00, 0xb9, 0x12, 0x38, 0xf1, 0xf1, 0xd5, 0xc8, 0xa2, 0x70, 0x32, 0xba, 0x84, 0xc0, 0xef, + 0x50, 0xc4, 0x87, 0x8b, 0xa7, 0x61, 0x1e, 0xa2, 0x4d, 0xae, 0x31, 0xdc, 0x4d, 0x78, 0x29, 0x7a, + 0x79, 0x6a, 0x79, 0x05, 0x8e, 0x1e, 0x92, 0x06, 0x00, 0x0b, 0x0f, 0x41, 0xa0, 0xf1, 0x18, 0xe5, + 0x8f, 0xe5, 0x03, 0xd5, 0x00, 0xb3, 0x3c, 0x2a, 0x00, 0xa5, 0xa1, 0x38, 0x8c, 0xa9, 0x1a, 0xe5, + 0x27, 0xf0, 0x1c, 0x42, 0x83, 0x11, 0x68, 0x9c, 0x2c, 0xf7, 0xe8, 0xea, 0xf2, 0xbf, 0xaf, 0x5d, + 0x40, 0xe3, 0xca, 0x75, 0x01, 0x2f, 0x40, 0xf2, 0x12, 0x86, 0x0d, 0x27, 0x98, 0xc4, 0x8c, 0x10, + 0x16, 0xe4, 0x5a, 0x04, 0xd6, 0xbb, 0x86, 0xcc, 0xc5, 0x11, 0xc5, 0x16, 0x26, 0x41, 0xc1, 0x15, + 0x20, 0x7d, 0x09, 0x23, 0xa0, 0x56, 0x21, 0xa5, 0xa0, 0xed, 0x04, 0x34, 0xb8, 0x26, 0xa4, 0xa8, + 0x14, 0x41, 0x13, 0x4b, 0xfc, 0x4b, 0x88, 0xc3, 0x90, 0xa1, 0x38, 0x3e, 0x10, 0x37, 0x42, 0xcc, + 0x00, 0x9b, 0xb1, 0x45, 0x63, 0xb8, 0x57, 0xd4, 0x12, 0xae, 0x08, 0xdd, 0x05, 0xc5, 0x18, 0x5d, + 0x62, 0x52, 0xe6, 0x21, 0x0b, 0x88, 0x2f, 0xc8, 0x0a, 0x57, 0x92, 0x7b, 0xe9, 0x50, 0x24, 0xc3, + 0x40, 0x0f, 0x1d, 0x02, 0xc2, 0x12, 0x78, 0xe1, 0x21, 0x50, 0x7b, 0x8c, 0x3d, 0x03, 0x22, 0xdd, + 0x26, 0xd2, 0x3d, 0x2c, 0xa7, 0xae, 0xfe, 0x6b, 0x0c, 0xbc, 0x23, 0x04, 0xe0, 0x23, 0x89, 0xf8, + 0x48, 0xd3, 0x3d, 0xc0, 0x60, 0x42, 0x0f, 0x00, 0xfc, 0x9a, 0xd7, 0x01, 0x37, 0xa0, 0x6e, 0x4c, + 0x77, 0xe4, 0x48, 0xc0, 0x1f, 0xd1, 0x50, 0x09, 0x57, 0x30, 0x4c, 0xbc, 0x86, 0x0e, 0xa0, 0xfb, + 0xca, 0xb5, 0xb1, 0x89, 0x4f, 0xa8, 0x07, 0x0e, 0x82, 0x19, 0x13, 0xe5, 0xd8, 0xdf, 0xb9, 0x04, + 0xf0, 0x01, 0x7f, 0x45, 0x5e, 0x41, 0x43, 0x4c, 0x27, 0xe8, 0x91, 0x86, 0xa3, 0x5a, 0x54, 0x2e, + 0x28, 0x0d, 0x48, 0xc0, 0x13, 0x7a, 0xc5, 0x2c, 0x9b, 0x50, 0x1b, 0xe3, 0x73, 0x18, 0xe2, 0x73, + 0xe8, 0x5d, 0x39, 0x3c, 0xec, 0xbf, 0x72, 0xdd, 0xb7, 0x88, 0xff, 0x15, 0x0c, 0x39, 0x26, 0xca, + 0x83, 0xf0, 0x12, 0x9e, 0x21, 0x43, 0x84, 0xe2, 0x09, 0x8d, 0xc3, 0x9f, 0x89, 0x0c, 0xbc, 0xff, + 0x84, 0xd1, 0x9b, 0x54, 0x56, 0x2c, 0x5a, 0x75, 0xb4, 0x36, 0xb8, 0x14, 0x22, 0xac, 0x45, 0x0a, + 0xf2, 0xbd, 0x12, 0xb2, 0xbe, 0x6c, 0xa4, 0x1f, 0x22, 0x78, 0xa1, 0x13, 0x8a, 0xae, 0x48, 0xfd, + 0xb9, 0x42, 0x91, 0x5f, 0x36, 0x1a, 0x00, 0xa8, 0x81, 0x5b, 0xe3, 0x8a, 0xf1, 0x1a, 0x68, 0x18, + 0x8f, 0x50, 0xfd, 0x46, 0x0e, 0x6a, 0x2c, 0x62, 0x06, 0xaa, 0x18, 0x52, 0x82, 0xe4, 0xe3, 0xb3, + 0x43, 0xcf, 0x98, 0xaa, 0xc0, 0xf3, 0x55, 0x6d, 0x01, 0x97, 0xaa, 0x59, 0x40, 0x3e, 0x2a, 0xad, + 0xa5, 0x31, 0x21, 0x69, 0x55, 0x57, 0xd2, 0xce, 0x2e, 0x1b, 0xd3, 0x93, 0xc6, 0xc8, 0x4d, 0x13, + 0x2a, 0x43, 0x6e, 0x3a, 0x3e, 0xce, 0x51, 0x1c, 0x92, 0x74, 0x83, 0xd7, 0xd3, 0xb5, 0x15, 0x5c, + 0xc7, 0x08, 0xf9, 0x1c, 0x00, 0x2d, 0xa4, 0xaa, 0x98, 0xc1, 0xd2, 0x83, 0x2b, 0x1e, 0xa8, 0x3c, + 0x24, 0x75, 0xf4, 0x68, 0xac, 0x80, 0x8c, 0x14, 0xb3, 0x7a, 0x82, 0xe9, 0x21, 0x32, 0x38, 0x0a, + 0xcd, 0x12, 0x5c, 0x92, 0xb2, 0xd4, 0x55, 0x17, 0x01, 0x5c, 0xe1, 0x8e, 0x6d, 0x80, 0xd9, 0x12, + 0x5c, 0x49, 0xd3, 0xde, 0xba, 0xee, 0x15, 0x55, 0x35, 0xe2, 0xc4, 0xe5, 0xa2, 0x96, 0x2c, 0x7d, + 0x63, 0xf2, 0xca, 0x7f, 0xeb, 0xbf, 0x42, 0x8d, 0x77, 0x0d, 0x67, 0xf2, 0xb5, 0x67, 0x50, 0x4a, + 0x68, 0x00, 0xaf, 0x20, 0xff, 0x52, 0x5e, 0xb1, 0xda, 0x53, 0xdf, 0xfd, 0xc3, 0x7a, 0xb0, 0xdf, + 0xd0, 0xf0, 0x5e, 0xf9, 0x97, 0xc0, 0xd4, 0x09, 0xd4, 0x40, 0x2d, 0x18, 0xa5, 0x67, 0xf8, 0x6f, + 0x01, 0xb2, 0x6b, 0x50, 0xa2, 0x6c, 0x40, 0xe4, 0x34, 0x5c, 0xe7, 0x55, 0xab, 0xc4, 0x75, 0xa0, + 0xf3, 0xdb, 0xf0, 0x0a, 0xbb, 0x37, 0xd8, 0x8a, 0x85, 0xba, 0xb6, 0xf2, 0x19, 0x23, 0xf4, 0x4f, + 0x8e, 0x41, 0x2c, 0x82, 0x1b, 0x0a, 0x13, 0xf8, 0x66, 0x04, 0x96, 0x87, 0x5a, 0x1d, 0x1a, 0x28, + 0x05, 0x7a, 0xe0, 0x1a, 0x8d, 0x75, 0x78, 0x41, 0x4b, 0x1e, 0x1b, 0x68, 0x7c, 0xc8, 0x61, 0xcf, + 0x80, 0x26, 0x34, 0xcb, 0x99, 0x60, 0x19, 0x28, 0x2f, 0x28, 0x04, 0xb6, 0x43, 0x41, 0x00, 0x58, + 0x87, 0x54, 0x62, 0x84, 0xb5, 0x21, 0x17, 0x3a, 0x90, 0x07, 0x17, 0xd2, 0x56, 0x03, 0x33, 0x6c, + 0x8d, 0x3f, 0xd9, 0xd8, 0x0e, 0x6b, 0x43, 0x2b, 0xc4, 0x21, 0x1c, 0x43, 0x68, 0x95, 0x6f, 0xa0, + 0x9c, 0x0c, 0x90, 0x08, 0xa8, 0xc7, 0x55, 0x68, 0x80, 0xd9, 0x81, 0x36, 0x18, 0xf0, 0xf2, 0x76, + 0xf4, 0x1a, 0x90, 0xe5, 0x48, 0x79, 0x88, 0x27, 0x4e, 0xc9, 0x30, 0xfb, 0xc5, 0x89, 0x00, 0xc0, + 0x99, 0xa0, 0x62, 0x22, 0x19, 0xe8, 0x31, 0xa1, 0xd8, 0x42, 0x3b, 0x9b, 0x20, 0x39, 0x68, 0x51, + 0x63, 0x8e, 0xc7, 0x18, 0x7b, 0x80, 0x99, 0xe3, 0x8c, 0x17, 0x41, 0xa1, 0x6e, 0x13, 0xa1, 0xa3, + 0x2b, 0xa2, 0x68, 0x74, 0x89, 0xc4, 0xa2, 0x5d, 0x21, 0x2d, 0x23, 0x4d, 0x8e, 0xd8, 0x70, 0xf7, + 0xe5, 0x03, 0xeb, 0x9a, 0xb5, 0xe5, 0x2f, 0x40, 0xb3, 0x70, 0x56, 0x09, 0xee, 0x0b, 0xbd, 0x26, + 0x84, 0x5c, 0x9c, 0xe4, 0xf9, 0x30, 0x93, 0x71, 0x68, 0xe2, 0x8c, 0x1e, 0x7d, 0x14, 0xa4, 0xa0, + 0xcf, 0x38, 0x89, 0xb2, 0x83, 0x05, 0xcc, 0x1b, 0x71, 0x3a, 0x00, 0x7a, 0x06, 0x93, 0x87, 0x89, + 0x49, 0x8a, 0x09, 0x0c, 0x1c, 0xe3, 0x97, 0xbd, 0x20, 0x10, 0x9c, 0xbc, 0x20, 0x12, 0xd0, 0x1b, + 0xa6, 0xb5, 0xa8, 0xaf, 0x10, 0xf2, 0xa9, 0x90, 0xe6, 0x2f, 0xa0, 0xff, 0x30, 0xe7, 0x0f, 0xa0, + 0x6d, 0x98, 0xba, 0x68, 0xd1, 0x78, 0x59, 0x80, 0xc7, 0x84, 0xf1, 0x80, 0xf9, 0x81, 0x1c, 0x11, + 0x67, 0x5e, 0xa3, 0x8f, 0xaf, 0x5d, 0xf4, 0xa2, 0x00, 0x3d, 0x58, 0xc0, 0x94, 0x6a, 0x82, 0x23, + 0x5b, 0x38, 0x67, 0xb7, 0x6c, 0x97, 0xa6, 0x30, 0x23, 0x07, 0xe7, 0xf3, 0x38, 0x25, 0x9a, 0x84, + 0x97, 0x84, 0x62, 0x28, 0xa6, 0x95, 0x68, 0xd8, 0x18, 0xde, 0x68, 0x72, 0xa6, 0xe1, 0x14, 0x0e, + 0x2d, 0x09, 0x7c, 0x01, 0x34, 0x16, 0x51, 0x63, 0xe1, 0xf0, 0x59, 0x2d, 0xce, 0x15, 0x01, 0x2c, + 0x7a, 0x2a, 0x20, 0x78, 0xec, 0xa6, 0x18, 0x12, 0xb1, 0x8b, 0xbb, 0xe0, 0x63, 0xd2, 0x78, 0xfc, + 0x8e, 0x93, 0x4d, 0x4d, 0xa0, 0xc1, 0xf9, 0x80, 0x98, 0x98, 0x58, 0x01, 0xb1, 0x1b, 0x2c, 0xba, + 0xc6, 0xd5, 0x14, 0xd5, 0x9e, 0x78, 0x80, 0xb8, 0x6b, 0x7f, 0x7c, 0xcd, 0x63, 0xb0, 0xbf, 0x30, + 0x39, 0xd7, 0x4d, 0xdf, 0x44, 0xae, 0xc3, 0x0d, 0x33, 0x34, 0xc0, 0x1a, 0xf9, 0x08, 0x68, 0x71, + 0xc6, 0x3a, 0xa3, 0xd4, 0xa1, 0x55, 0x06, 0xb8, 0x00, 0x4c, 0x9b, 0xb8, 0x0c, 0x44, 0xc2, 0xc4, + 0x9d, 0x6e, 0xb4, 0xf4, 0xe0, 0x90, 0x07, 0x41, 0x27, 0xeb, 0xd1, 0x1f, 0xcb, 0x25, 0x0c, 0xc7, + 0xd4, 0x1e, 0x27, 0xb0, 0x36, 0x18, 0x19, 0xa0, 0x86, 0xd6, 0xb3, 0xc0, 0xa5, 0x0d, 0x08, 0x1d, + 0xf8, 0x65, 0x33, 0x28, 0x39, 0x0d, 0x61, 0xf9, 0x1f, 0xd7, 0xc4, 0x01, 0xa8, 0xf0, 0xa0, 0x81, + 0xe3, 0x23, 0xb2, 0x28, 0x31, 0xdf, 0x14, 0x02, 0x0e, 0x68, 0xc2, 0x3f, 0x4a, 0x5d, 0xbe, 0x76, + 0x10, 0x8c, 0x3e, 0xd6, 0x2a, 0xf5, 0x43, 0xde, 0x51, 0x2a, 0xb0, 0xee, 0x95, 0x3b, 0xba, 0x73, + 0x47, 0xaf, 0xec, 0xb7, 0xf6, 0x47, 0xb1, 0x54, 0xaa, 0xe3, 0x5a, 0xa9, 0x9a, 0x0b, 0x22, 0x1f, + 0x30, 0xd6, 0xe2, 0xc2, 0x87, 0x90, 0x4e, 0x48, 0xd1, 0x11, 0x24, 0xb3, 0xc0, 0x45, 0x01, 0x14, + 0xc6, 0x44, 0x43, 0x71, 0x82, 0x29, 0x62, 0x6a, 0xea, 0x97, 0xa0, 0x39, 0x21, 0xa8, 0x0e, 0x2a, + 0x16, 0x26, 0x5f, 0x3e, 0x6a, 0x55, 0xe8, 0x99, 0xd8, 0xd0, 0xc4, 0xec, 0x0e, 0xf0, 0xa6, 0x72, + 0xce, 0xe4, 0xb0, 0x87, 0xc5, 0x25, 0x7f, 0xd0, 0x90, 0xdb, 0x8d, 0xba, 0x9b, 0xfc, 0x01, 0xcb, + 0x20, 0x83, 0x33, 0xc7, 0x08, 0x37, 0xc0, 0x8e, 0x1e, 0xb1, 0x15, 0x6e, 0x5e, 0xa9, 0xf0, 0xd7, + 0x33, 0xf9, 0x8b, 0xc9, 0x1f, 0x4c, 0x7c, 0xf0, 0x3e, 0xca, 0xa9, 0xea, 0x65, 0xbd, 0x28, 0x29, + 0x99, 0x42, 0xe7, 0x33, 0x8b, 0x6d, 0xca, 0xe6, 0x3a, 0xbb, 0x63, 0x59, 0x1e, 0xc7, 0x78, 0xa0, + 0x2d, 0xd9, 0x74, 0xcb, 0x88, 0x2b, 0xe0, 0x1c, 0xec, 0x10, 0x27, 0xd5, 0x78, 0x73, 0xd0, 0xed, + 0xd9, 0x93, 0x90, 0xc4, 0xeb, 0x04, 0x3e, 0x45, 0x6a, 0x7a, 0x07, 0x97, 0x32, 0xf6, 0x46, 0x18, + 0x0e, 0x45, 0x07, 0xf0, 0x6c, 0x13, 0x77, 0x3c, 0xa1, 0x90, 0x01, 0x4d, 0x03, 0xcd, 0xb4, 0xa9, + 0xa5, 0xe7, 0xf0, 0x30, 0x07, 0xad, 0x3b, 0x45, 0xd0, 0x7e, 0x52, 0x77, 0xbb, 0x0a, 0x31, 0xae, + 0x8f, 0xfd, 0x10, 0x43, 0x3a, 0x0d, 0xad, 0x40, 0x14, 0x63, 0x2b, 0xdd, 0xeb, 0xe1, 0x5b, 0x65, + 0xbc, 0x7d, 0xd3, 0xf1, 0x91, 0x0e, 0x12, 0x6e, 0xdd, 0x51, 0x8c, 0x7c, 0x25, 0x30, 0xd1, 0xc2, + 0xab, 0xa6, 0x8a, 0xe3, 0x7b, 0xf9, 0x08, 0x55, 0x82, 0xf6, 0xa6, 0x1b, 0xe7, 0xce, 0x65, 0xc3, + 0xae, 0x23, 0xfc, 0x94, 0x44, 0x8b, 0x0e, 0x57, 0xe8, 0x63, 0x47, 0xce, 0x88, 0x67, 0x9d, 0xc4, + 0x29, 0x09, 0x4a, 0x0e, 0x5b, 0xf7, 0x14, 0x63, 0x2a, 0xef, 0x5c, 0x82, 0xb2, 0xfd, 0xb1, 0x76, + 0x12, 0x8e, 0x6c, 0xcf, 0xc7, 0xb9, 0x12, 0xe3, 0x02, 0xf1, 0x1d, 0x5d, 0xf8, 0x49, 0x9a, 0xd2, + 0x4d, 0x1a, 0xe1, 0x5e, 0x32, 0xe8, 0xdb, 0xec, 0x2e, 0x2a, 0xf0, 0xa4, 0x54, 0x92, 0x67, 0xe5, + 0x7c, 0xb7, 0x37, 0xbe, 0x98, 0x2f, 0xb7, 0x19, 0x9d, 0x29, 0x1e, 0xb0, 0xe1, 0xae, 0x60, 0xd5, + 0xb6, 0xc8, 0xb4, 0x38, 0x5f, 0x6c, 0xd7, 0x2c, 0xab, 0xac, 0x5b, 0x56, 0xbd, 0x4c, 0x19, 0x3e, + 0x7e, 0xf3, 0xf0, 0x7d, 0x0c, 0x2d, 0xf6, 0x33, 0xd9, 0x5c, 0xc3, 0x83, 0x16, 0xaf, 0x92, 0x98, + 0xc9, 0xc3, 0x2c, 0x83, 0xe1, 0x0e, 0x61, 0xb3, 0xf9, 0x17, 0x83, 0xe6, 0x34, 0xc0, 0x70, 0xd6, + 0x3c, 0xcf, 0xe7, 0x73, 0x66, 0xe1, 0x66, 0xf7, 0x57, 0x03, 0x7e, 0x9f, 0xeb, 0x78, 0x92, 0x47, + 0x37, 0xa0, 0x43, 0x7d, 0xec, 0x44, 0x1f, 0x5a, 0xb4, 0x64, 0x7e, 0x95, 0x94, 0x95, 0x55, 0xb0, + 0x75, 0x7e, 0xc7, 0x06, 0xba, 0x72, 0x46, 0x65, 0x88, 0xad, 0xeb, 0x53, 0x1d, 0xad, 0xd6, 0x51, + 0x1c, 0xb7, 0x9b, 0x0e, 0xa7, 0xf5, 0x40, 0x35, 0x12, 0xc7, 0x07, 0x3b, 0xe8, 0x7e, 0x7c, 0xa4, + 0x3e, 0xbc, 0x86, 0xfb, 0x9a, 0x33, 0xc0, 0x35, 0xdc, 0xa7, 0xc6, 0xa6, 0xc0, 0x14, 0x80, 0xc2, + 0x37, 0xc5, 0x7a, 0x41, 0xd0, 0x0e, 0xc8, 0x70, 0xc6, 0x39, 0x97, 0xb1, 0x7b, 0xed, 0x9f, 0x7f, + 0xbf, 0x1a, 0xfc, 0x1b, 0x97, 0xea, 0xa7, 0x67, 0x67, 0x5f, 0xec, 0xee, 0x93, 0x2c, 0xce, 0xef, + 0xad, 0x34, 0x5f, 0xd0, 0xae, 0x9d, 0xb5, 0xca, 0xcb, 0x0a, 0x37, 0x82, 0xf7, 0x67, 0xb8, 0xc3, + 0xfe, 0xef, 0xe1, 0x6c, 0x89, 0x5f, 0x45, 0x81, 0x60, 0xac, 0x6a, 0xc5, 0xb2, 0xc1, 0x80, 0xcd, + 0x2f, 0x98, 0xf5, 0x4b, 0x09, 0xd2, 0x1c, 0x0e, 0x95, 0xb2, 0x1d, 0x1e, 0x33, 0xfb, 0x57, 0xb2, + 0x4c, 0x7e, 0x10, 0x5b, 0xe7, 0xd0, 0xc3, 0xe8, 0x47, 0x8c, 0xd8, 0xc0, 0xb1, 0xda, 0xab, 0x44, + 0xf1, 0xcf, 0x40, 0x11, 0x06, 0x2a, 0x4a, 0x55, 0x3c, 0x20, 0x61, 0xbc, 0xd0, 0xd4, 0x5f, 0x00, + 0x9f, 0x69, 0xe7, 0xc2, 0xe2, 0xdf, 0x80, 0xff, 0x90, 0xc7, 0xcc, 0x4a, 0x62, 0x80, 0xcb, 0x4f, + 0x2f, 0xcc, 0x3f, 0xb3, 0xf7, 0x40, 0x01, 0x60, 0x5a, 0x21, 0x43, 0xea, 0xd6, 0x9d, 0x26, 0x08, + 0x11, 0x8f, 0x6a, 0x0d, 0xad, 0xbb, 0x28, 0xdd, 0xb2, 0x79, 0xb5, 0x4a, 0x4a, 0x6b, 0xc1, 0xd2, + 0xb4, 0xfc, 0xd9, 0x79, 0x67, 0x25, 0x30, 0xc7, 0x28, 0x5e, 0xfd, 0xe3, 0xf5, 0x95, 0x21, 0xda, + 0xd1, 0x96, 0x38, 0x34, 0xae, 0x2b, 0x4e, 0x75, 0x68, 0x54, 0xd2, 0xa2, 0x4f, 0x59, 0x07, 0x0a, + 0x6d, 0x3d, 0xdc, 0xd9, 0xf1, 0xd5, 0xc8, 0x6a, 0x5e, 0xdb, 0xc2, 0xff, 0x6e, 0x59, 0xf1, 0x70, + 0x4d, 0x04, 0xe7, 0xc5, 0x40, 0xff, 0xbc, 0x3e, 0xbe, 0x07, 0xe2, 0xab, 0x14, 0x1c, 0x74, 0xdd, + 0x60, 0x78, 0xf2, 0xfa, 0x65, 0x04, 0xe4, 0x02, 0xf7, 0x8d, 0x72, 0x08, 0x02, 0x40, 0x01, 0x47, + 0x0d, 0xb0, 0x05, 0x6d, 0xcc, 0x08, 0xdb, 0x1a, 0xe8, 0x15, 0xc8, 0xc0, 0xc8, 0xc4, 0x41, 0x5a, + 0xfd, 0x45, 0x39, 0x8b, 0x2c, 0x3c, 0x28, 0x6c, 0x44, 0x28, 0x8e, 0x97, 0xe0, 0xed, 0xab, 0x2b, + 0x3a, 0x2c, 0xc2, 0x60, 0x60, 0xda, 0xc8, 0xd2, 0x8d, 0x46, 0x1e, 0x43, 0x68, 0xd6, 0x0c, 0xff, + 0xef, 0xf3, 0x2a, 0xbe, 0x50, 0x0f, 0x08, 0xe9, 0xf8, 0x95, 0x4a, 0x2e, 0x7e, 0x23, 0x48, 0x48, + 0x4c, 0x1c, 0x8b, 0xe3, 0xd2, 0xfb, 0x62, 0x97, 0xed, 0x71, 0x1b, 0x19, 0xfa, 0xfd, 0x5b, 0x05, + 0xf5, 0x82, 0x60, 0xd5, 0x07, 0xe8, 0x44, 0xbb, 0x2f, 0x76, 0xcc, 0xc2, 0xd7, 0x7d, 0x5f, 0x87, + 0xe7, 0xd8, 0x41, 0xec, 0xbb, 0xd5, 0xe7, 0xe1, 0xf5, 0x8b, 0xe7, 0xa0, 0x1f, 0xf8, 0x01, 0x5f, + 0x76, 0x5b, 0xad, 0x5e, 0x40, 0xd4, 0xfa, 0x66, 0x4d, 0x9d, 0x91, 0x51, 0x25, 0x03, 0x0b, 0x4a, + 0xaa, 0x87, 0xaf, 0x5a, 0x70, 0x74, 0x24, 0x02, 0xf8, 0xc0, 0x97, 0x71, 0x5f, 0xe8, 0xbc, 0xf9, + 0xf4, 0x48, 0x1b, 0xbe, 0x14, 0x27, 0x5b, 0x19, 0xa0, 0xc3, 0x9b, 0x0d, 0xcb, 0xe2, 0xcb, 0x55, + 0x92, 0xc6, 0x83, 0x08, 0xd5, 0x18, 0x15, 0xa0, 0x39, 0xc9, 0x79, 0xc2, 0x10, 0x5b, 0x46, 0xfc, + 0x06, 0x37, 0xf1, 0x59, 0xc5, 0x8a, 0xf2, 0xcf, 0x33, 0x63, 0xbe, 0x29, 0x4f, 0x26, 0xfb, 0x74, + 0x6b, 0xfe, 0x91, 0x3e, 0x80, 0xb1, 0xde, 0xb3, 0x07, 0x54, 0xd5, 0x46, 0xd9, 0x6a, 0x57, 0x0e, + 0x56, 0x56, 0x59, 0x34, 0x2b, 0x2a, 0xff, 0x95, 0x54, 0xab, 0x01, 0x3f, 0x18, 0xcf, 0xcd, 0xe5, + 0xcb, 0x2f, 0x07, 0x40, 0x4b, 0x7d, 0x08, 0xbd, 0x65, 0x3f, 0xec, 0xe7, 0xea, 0x9d, 0x11, 0x33, + 0x3c, 0xf2, 0xa5, 0xe1, 0xf3, 0xd0, 0xe8, 0x01, 0x03, 0x1c, 0x97, 0x50, 0xe4, 0x99, 0xf9, 0x47, + 0x80, 0x3c, 0xc5, 0xd3, 0x18, 0x68, 0x4a, 0x0a, 0xc7, 0x65, 0x8c, 0x02, 0x47, 0x25, 0x1e, 0x7f, + 0x6e, 0x8e, 0xf7, 0x9b, 0xfc, 0x7b, 0x25, 0xfd, 0x1d, 0xa0, 0x21, 0xf7, 0x21, 0x75, 0xee, 0xdb, + 0xfb, 0x30, 0x7a, 0x7e, 0x9e, 0xac, 0xe5, 0x59, 0x3e, 0x3a, 0x78, 0x5f, 0x16, 0x8b, 0xb9, 0xfe, + 0xfc, 0xc5, 0x09, 0xc0, 0x2f, 0x9e, 0x53, 0x76, 0xd6, 0x86, 0x58, 0xb2, 0xea, 0xeb, 0xaa, 0x2a, + 0x92, 0x9b, 0x6d, 0x05, 0x32, 0xa7, 0x0d, 0x76, 0xdd, 0xd0, 0x75, 0x41, 0xa0, 0xfc, 0xf4, 0xe0, + 0xa0, 0x1d, 0x58, 0x21, 0x34, 0xe3, 0xbf, 0x67, 0x80, 0x81, 0x42, 0x75, 0xab, 0xdc, 0x11, 0xfc, + 0x40, 0x0b, 0xc6, 0xe0, 0x2b, 0x2a, 0x1e, 0x44, 0xcb, 0xa3, 0x9e, 0x22, 0x4e, 0xee, 0x40, 0xcf, + 0xca, 0xce, 0x10, 0xe0, 0x33, 0x0d, 0x9d, 0x53, 0x43, 0x47, 0xa0, 0x5f, 0x00, 0xd7, 0xca, 0x2e, + 0xab, 0x17, 0x55, 0xc6, 0x5b, 0x51, 0x13, 0x43, 0xd5, 0xd9, 0xe3, 0x9e, 0x69, 0xe5, 0x42, 0x93, + 0xe8, 0x40, 0x6a, 0xf2, 0x24, 0xb5, 0xde, 0x76, 0x3e, 0x15, 0x8c, 0xda, 0x36, 0x3e, 0x02, 0x9f, + 0x1d, 0x05, 0x8f, 0x47, 0xff, 0x60, 0x80, 0xac, 0x3b, 0x00, 0x2f, 0xef, 0x40, 0xcb, 0x88, 0xd1, + 0xf2, 0x73, 0x12, 0xe0, 0xb3, 0x5a, 0x59, 0xf2, 0xa1, 0x92, 0xa3, 0x43, 0x45, 0x30, 0x8e, 0xc8, + 0x6f, 0x92, 0x3e, 0xf6, 0xe1, 0xd7, 0x0e, 0xc0, 0x1c, 0xe2, 0x5d, 0xb7, 0x81, 0xfc, 0xd4, 0xe1, + 0x90, 0xcb, 0x49, 0x17, 0x73, 0x7e, 0x54, 0x5f, 0xc7, 0x1a, 0x95, 0x2f, 0xc9, 0x09, 0x4f, 0x4e, + 0x27, 0xf6, 0xde, 0x44, 0xb7, 0x3c, 0x26, 0xd7, 0xdf, 0x66, 0xb4, 0xe9, 0x03, 0x37, 0x9f, 0xb5, + 0x23, 0x96, 0x62, 0x2c, 0x8c, 0xab, 0x0d, 0xb0, 0x7f, 0xd6, 0xf6, 0x0d, 0x3f, 0xdb, 0xef, 0x5a, + 0x06, 0x4c, 0xe7, 0x92, 0x38, 0xf7, 0x7e, 0xfd, 0x15, 0x7c, 0xc9, 0xae, 0x29, 0x71, 0xf4, 0xa9, + 0xfe, 0x23, 0x37, 0x08, 0xdd, 0xb0, 0x2c, 0x8b, 0xed, 0x0d, 0xc5, 0x06, 0x05, 0x58, 0xc0, 0xbf, + 0x48, 0x58, 0xdb, 0xeb, 0x0c, 0x7e, 0x66, 0x46, 0xf4, 0xce, 0xc8, 0x30, 0xcc, 0x25, 0xcb, 0x01, + 0x6b, 0x0d, 0xa8, 0xf8, 0x99, 0xe1, 0x51, 0xb7, 0x13, 0xcd, 0x58, 0x5a, 0x32, 0x0d, 0x3a, 0x7f, + 0xc6, 0x0e, 0xfd, 0x0d, 0x37, 0xaa, 0xe1, 0x01, 0x68, 0x85, 0x96, 0x61, 0x39, 0x6f, 0x19, 0x12, + 0x44, 0xce, 0x21, 0xc1, 0x3c, 0x44, 0xa8, 0x88, 0xee, 0xcd, 0x05, 0xe6, 0x73, 0x9c, 0x65, 0xc7, + 0xf5, 0x85, 0x3e, 0x9b, 0x50, 0x75, 0x46, 0xc1, 0xd7, 0x02, 0x2e, 0xac, 0x07, 0x43, 0xe3, 0x2e, + 0x4f, 0xe2, 0x26, 0x5b, 0xc6, 0x93, 0x32, 0x1d, 0x99, 0xed, 0x7b, 0xc7, 0xff, 0x25, 0xba, 0x8b, + 0xf8, 0x29, 0x0a, 0x89, 0x46, 0x7e, 0x1c, 0x0d, 0xd1, 0x4e, 0xe2, 0x91, 0xff, 0x06, 0x3c, 0xf2, + 0x23, 0x78, 0xe0, 0xaf, 0x0a, 0x01, 0x06, 0x78, 0x6b, 0x60, 0x0d, 0xaa, 0xd3, 0xce, 0xa7, 0xeb, + 0xde, 0xc8, 0x78, 0x8a, 0xfc, 0x5e, 0x7f, 0x91, 0xf1, 0x70, 0x01, 0x6c, 0xb3, 0xf8, 0x71, 0x10, + 0x1d, 0x3f, 0x21, 0xc3, 0x80, 0xdc, 0xa0, 0x8c, 0x63, 0x75, 0xcc, 0xba, 0x12, 0xa2, 0x82, 0x80, + 0x01, 0x9e, 0x22, 0x32, 0x8e, 0x8b, 0x84, 0xce, 0x0f, 0x02, 0x2b, 0x80, 0x98, 0x13, 0x58, 0x52, + 0xee, 0xd3, 0x8f, 0x27, 0x23, 0x0c, 0xfb, 0xbc, 0x33, 0xcd, 0x44, 0x86, 0x86, 0x7e, 0x93, 0xe7, + 0x29, 0x8b, 0x32, 0x98, 0xac, 0x60, 0x45, 0xbe, 0xd4, 0x32, 0x0a, 0xa5, 0x7d, 0x5d, 0xe4, 0x91, + 0x5d, 0x1d, 0x81, 0x76, 0xbc, 0x80, 0x3c, 0xbe, 0xcb, 0xfd, 0xad, 0xc0, 0x08, 0x9b, 0x89, 0x64, + 0x37, 0x3b, 0x74, 0x1c, 0xca, 0x07, 0x02, 0x88, 0x0f, 0x3f, 0x58, 0x39, 0x9c, 0x21, 0x57, 0x8e, + 0xbb, 0x67, 0x1e, 0x0e, 0x0e, 0xfc, 0x73, 0xeb, 0x2c, 0xb0, 0x00, 0x72, 0x42, 0xc5, 0x36, 0x40, + 0xf0, 0x70, 0x96, 0x1f, 0x81, 0x22, 0xb8, 0x6e, 0xe4, 0x16, 0x32, 0xe9, 0x52, 0xfc, 0x30, 0x25, + 0x43, 0x97, 0xd6, 0x92, 0x62, 0xa7, 0x20, 0xea, 0x16, 0xe4, 0x5d, 0x7f, 0x8e, 0x99, 0x6b, 0x1c, + 0x7f, 0x8f, 0x74, 0xd7, 0x4e, 0xb1, 0x1a, 0xee, 0xa5, 0xdd, 0x56, 0x62, 0x16, 0x90, 0x1d, 0xb2, + 0x57, 0x65, 0x6a, 0xd7, 0x57, 0x13, 0xba, 0x26, 0x78, 0x27, 0x12, 0xf7, 0x49, 0x36, 0x63, 0x75, + 0x9b, 0x26, 0x19, 0xa5, 0x1b, 0xf1, 0x7f, 0xf9, 0xe5, 0x11, 0xf1, 0xcb, 0x78, 0x0e, 0x22, 0x26, + 0xdf, 0xa8, 0xaa, 0x0c, 0x60, 0x9f, 0x71, 0xec, 0xcb, 0xe1, 0x09, 0x4d, 0x15, 0xc9, 0xf8, 0x31, + 0x55, 0x95, 0x20, 0x1a, 0x57, 0xcb, 0xc4, 0x4c, 0xe2, 0x78, 0x7e, 0xc0, 0x5d, 0x36, 0xa5, 0x08, + 0x6d, 0xca, 0x4a, 0xc1, 0x4d, 0xd6, 0xc9, 0x8f, 0x4b, 0x4a, 0xbe, 0x6a, 0x5e, 0x5b, 0x1c, 0x27, + 0x16, 0x1f, 0x31, 0x52, 0x1c, 0x3d, 0x9e, 0xbf, 0x8e, 0xaa, 0x95, 0x45, 0x1f, 0xee, 0x4a, 0x3a, + 0xff, 0x3a, 0x70, 0xce, 0xa0, 0x73, 0xc5, 0x36, 0xc3, 0xe1, 0x59, 0xf3, 0x3c, 0x7b, 0x8c, 0x79, + 0xdd, 0x7a, 0xec, 0xa5, 0x1b, 0xa2, 0xf7, 0x41, 0xed, 0x3a, 0xc9, 0xb0, 0x12, 0x6e, 0x3d, 0x75, + 0xd1, 0x07, 0xaa, 0x8b, 0x3e, 0x34, 0xe4, 0xfc, 0x40, 0xc3, 0x0c, 0x60, 0x96, 0x59, 0xe5, 0xdf, + 0x25, 0x1f, 0x58, 0x3c, 0xf0, 0x86, 0xfb, 0x1e, 0x9d, 0xa3, 0xd4, 0xa1, 0x78, 0xc4, 0xca, 0x8a, + 0x03, 0xfb, 0xa8, 0xbf, 0x08, 0x02, 0x42, 0x8a, 0xae, 0x6a, 0x17, 0x5d, 0xf3, 0x68, 0x33, 0xb4, + 0x18, 0xee, 0xf7, 0x0c, 0xe2, 0x69, 0x2c, 0xfc, 0xb1, 0xcc, 0x3c, 0x87, 0xa8, 0x70, 0xfd, 0x49, + 0x72, 0x2b, 0x71, 0x3c, 0xa0, 0x02, 0x72, 0x00, 0xc9, 0xd6, 0xcf, 0xea, 0x95, 0x16, 0xee, 0xd7, + 0x94, 0xf7, 0xda, 0x69, 0x29, 0x65, 0x62, 0x1e, 0x88, 0xcb, 0xad, 0x75, 0xe9, 0xaf, 0xbf, 0xb2, + 0xbe, 0x8c, 0x65, 0x15, 0x65, 0xb7, 0x20, 0x3f, 0x52, 0x44, 0x99, 0x3d, 0x2b, 0xb3, 0xf9, 0x77, + 0xb5, 0xfa, 0xcc, 0xeb, 0x52, 0x92, 0x04, 0xa0, 0x3e, 0x3d, 0x09, 0x70, 0x30, 0x6c, 0x41, 0x04, + 0x50, 0x00, 0x41, 0x78, 0xcb, 0xdf, 0xd6, 0xf9, 0x13, 0xc6, 0xa5, 0xe0, 0x78, 0x7b, 0xa8, 0x87, + 0x22, 0x38, 0x57, 0xf3, 0xdd, 0x7e, 0x26, 0x55, 0x4a, 0x51, 0x7d, 0xd6, 0xa8, 0x3e, 0x53, 0x54, + 0x9f, 0x35, 0xca, 0x0b, 0xf7, 0x79, 0x3f, 0x64, 0xa8, 0x05, 0x2d, 0x3e, 0xa8, 0x44, 0x05, 0xa7, + 0xba, 0xe8, 0xc3, 0x61, 0x5d, 0x84, 0xa1, 0xa6, 0x4d, 0x66, 0x45, 0xde, 0x52, 0x6b, 0x17, 0x6e, + 0xf0, 0x67, 0x87, 0xbf, 0x07, 0xc5, 0x15, 0x08, 0x76, 0x16, 0x72, 0xa2, 0x3b, 0xd6, 0x9a, 0xd9, + 0x36, 0x93, 0xd6, 0x6f, 0xd2, 0xfc, 0x66, 0xf0, 0xf3, 0x7f, 0x5e, 0xff, 0xf8, 0x03, 0x4e, 0xd7, + 0x21, 0xc1, 0x4f, 0x96, 0x0f, 0x72, 0x22, 0x66, 0x64, 0xdb, 0x34, 0x35, 0xdc, 0xe1, 0x3b, 0x63, + 0x87, 0xfa, 0x31, 0xd5, 0x41, 0x99, 0x21, 0x7f, 0xa5, 0xf9, 0xec, 0x19, 0xce, 0x51, 0xf5, 0x3d, + 0x20, 0x4e, 0x60, 0xbe, 0x83, 0xe4, 0xfd, 0x5b, 0xc8, 0x98, 0x67, 0xd2, 0xd3, 0xf0, 0x04, 0x1a, + 0x7c, 0x9a, 0xa1, 0xab, 0x13, 0x5e, 0xa0, 0x86, 0x4f, 0x78, 0x75, 0xfa, 0xa0, 0x57, 0x37, 0x76, + 0x80, 0xd3, 0x2a, 0x8f, 0xa7, 0xfa, 0x9b, 0x1f, 0xaf, 0xff, 0xa1, 0x1b, 0x98, 0xc7, 0x4c, 0xab, + 0x7d, 0x6b, 0x36, 0x8c, 0xfa, 0xdc, 0x99, 0x0d, 0xe3, 0xf9, 0xd8, 0xd6, 0x91, 0x5e, 0x9d, 0x8e, + 0xbb, 0xe7, 0x32, 0x97, 0xd5, 0xf1, 0x53, 0xc9, 0xf3, 0x9b, 0x0b, 0x65, 0xe4, 0xf3, 0xb3, 0x9b, + 0x0b, 0xfa, 0x8c, 0x9b, 0xb8, 0x11, 0x6b, 0xe5, 0x76, 0xb1, 0x80, 0xce, 0x4b, 0x20, 0xf1, 0x41, + 0x03, 0x1e, 0x2d, 0xc1, 0xfe, 0x56, 0xda, 0x1a, 0x26, 0xf7, 0xc5, 0xc3, 0x67, 0xbc, 0x7b, 0x71, + 0xd1, 0x59, 0x10, 0x8b, 0x73, 0xb1, 0xeb, 0x8d, 0x13, 0x6e, 0x95, 0x8b, 0x35, 0xf9, 0xac, 0x26, + 0x9f, 0x56, 0xb5, 0x8c, 0xce, 0xf2, 0xd6, 0xd0, 0x68, 0x1a, 0xb4, 0xd6, 0x27, 0x95, 0xa5, 0xaa, + 0xc3, 0x86, 0xf5, 0x77, 0x43, 0xbc, 0x69, 0xf3, 0x5a, 0xaf, 0xa4, 0x71, 0x6f, 0x06, 0x4a, 0xdb, + 0xc3, 0x4d, 0x66, 0x14, 0x8c, 0xff, 0x8a, 0xc4, 0x14, 0xe6, 0x58, 0x69, 0x0a, 0x69, 0xdb, 0x7e, + 0xf6, 0x94, 0xa5, 0x8d, 0x5a, 0x52, 0xe2, 0xab, 0x17, 0xc8, 0xea, 0xa4, 0x0c, 0x7a, 0x16, 0x90, + 0x71, 0xe1, 0xe3, 0x32, 0x8f, 0x21, 0xda, 0x60, 0xce, 0x59, 0x6d, 0x4b, 0x43, 0x4a, 0x6e, 0x3f, + 0xec, 0xeb, 0xe6, 0xda, 0xf6, 0x7c, 0x3e, 0x97, 0xbd, 0xbe, 0x3a, 0x94, 0x68, 0xe7, 0x83, 0x5d, + 0x21, 0x54, 0x9c, 0x81, 0x4d, 0x0f, 0x1b, 0xbf, 0x2c, 0x8a, 0xbc, 0xf8, 0x4c, 0xb4, 0xa1, 0x17, + 0x94, 0xe9, 0xa2, 0x96, 0xd6, 0x54, 0x03, 0x6d, 0x80, 0xbe, 0xb8, 0x62, 0x74, 0x73, 0xd1, 0x88, + 0xf7, 0x53, 0x57, 0x44, 0xeb, 0x79, 0x1b, 0x92, 0x00, 0x3e, 0xe4, 0x0b, 0x4c, 0x99, 0xe8, 0xe3, + 0xfb, 0x5e, 0x46, 0x36, 0xbf, 0x2b, 0x01, 0x43, 0xf5, 0x2f, 0x2b, 0x7e, 0x9d, 0xa6, 0x34, 0x51, + 0x6d, 0x47, 0x7c, 0xd6, 0x03, 0x4c, 0x7c, 0x84, 0x4f, 0xc1, 0xbb, 0x76, 0xb5, 0xdd, 0xa9, 0xa8, + 0x68, 0x73, 0x6a, 0x30, 0x4b, 0xae, 0x07, 0x9c, 0x18, 0xb3, 0xb3, 0x50, 0xa3, 0xac, 0xdf, 0xde, + 0xf6, 0xcf, 0x92, 0x87, 0x27, 0xf4, 0x48, 0x97, 0xbf, 0x2a, 0x00, 0xb1, 0x46, 0x5d, 0x07, 0x16, + 0x9e, 0xb6, 0x13, 0x82, 0xbf, 0x15, 0xaf, 0xdf, 0x15, 0xd1, 0x2d, 0xc5, 0xe2, 0xe1, 0xac, 0x9d, + 0xbe, 0x00, 0xcf, 0xc5, 0xc7, 0x4b, 0xfa, 0x53, 0x51, 0xeb, 0x84, 0x65, 0x15, 0xc2, 0xf1, 0x75, + 0x41, 0x72, 0xb3, 0x47, 0x9a, 0xaa, 0xfc, 0x69, 0x6d, 0x8f, 0xe0, 0x41, 0x56, 0xbe, 0x74, 0xd8, + 0xa7, 0x17, 0xd4, 0x4d, 0x55, 0x8a, 0x3d, 0xb2, 0x80, 0xbe, 0x50, 0xb8, 0x8c, 0xd2, 0x14, 0x7f, + 0x1c, 0xa5, 0xd9, 0x9c, 0x19, 0xee, 0x94, 0xad, 0x97, 0x03, 0x95, 0x87, 0xa4, 0xce, 0x28, 0x69, + 0xa0, 0xd6, 0xd7, 0x1f, 0xed, 0x65, 0x39, 0x43, 0xa9, 0x46, 0x67, 0xd0, 0x5e, 0x39, 0xa7, 0x5a, + 0xf5, 0x9b, 0x1c, 0xa8, 0xc6, 0x71, 0xe6, 0x9f, 0xd9, 0x9d, 0x55, 0x17, 0x3e, 0xc3, 0xe3, 0x3f, + 0xff, 0x86, 0x5b, 0x4b, 0xdb, 0x62, 0xe0, 0x6d, 0x3e, 0x0c, 0x75, 0x3e, 0x0b, 0xb5, 0x21, 0x85, + 0x28, 0xbf, 0x1a, 0xb4, 0xc9, 0x28, 0x11, 0x84, 0xfc, 0x00, 0xe4, 0x04, 0x9b, 0x87, 0xd3, 0x63, + 0xed, 0x7a, 0x79, 0x7c, 0xf8, 0x35, 0x07, 0xe3, 0x4c, 0xe8, 0xa5, 0xc3, 0x39, 0x49, 0x87, 0x82, + 0x7e, 0x0b, 0xf7, 0x2f, 0xbf, 0x64, 0x5f, 0x7e, 0xd9, 0x2a, 0x51, 0x77, 0x0e, 0xc4, 0x67, 0x67, + 0x2f, 0xaf, 0xdf, 0xb4, 0x42, 0xc0, 0x53, 0x57, 0x7f, 0x45, 0xf7, 0x23, 0x2b, 0xbf, 0x3d, 0xb1, + 0xae, 0xe7, 0xa3, 0x26, 0xe3, 0xd0, 0x01, 0x8a, 0x13, 0x31, 0xb5, 0x0b, 0xbc, 0x7e, 0x23, 0x11, + 0x65, 0xb1, 0xa5, 0xbd, 0x49, 0xf1, 0x37, 0x46, 0xb5, 0xfb, 0x28, 0x81, 0x99, 0xa5, 0x96, 0x26, + 0x15, 0x68, 0x0a, 0xfd, 0x2e, 0x0d, 0x0e, 0x83, 0xdf, 0x9c, 0xe0, 0xaf, 0x9d, 0xe0, 0x4e, 0x8a, + 0xb6, 0x01, 0x68, 0x56, 0x4f, 0xe8, 0xe3, 0xbf, 0x88, 0x82, 0xab, 0xae, 0xea, 0xa6, 0x9f, 0xba, + 0x02, 0x8a, 0xb7, 0xf2, 0x67, 0xfb, 0x9d, 0xcc, 0x08, 0xe0, 0xf5, 0xef, 0xf4, 0x5b, 0x0e, 0x60, + 0xbe, 0x79, 0x86, 0xbd, 0xe7, 0x51, 0xf9, 0x90, 0x2d, 0x28, 0xfd, 0x92, 0x5b, 0x2d, 0x47, 0x72, + 0x87, 0x64, 0x8d, 0x52, 0x84, 0x09, 0xd1, 0x0c, 0x77, 0x9d, 0x22, 0xc2, 0xfb, 0x49, 0x79, 0xc3, + 0xac, 0xde, 0xe7, 0xb4, 0x2c, 0x4b, 0xa6, 0x31, 0x87, 0x6b, 0xbd, 0x90, 0x20, 0x92, 0x34, 0x8c, + 0x6e, 0x66, 0x24, 0xb6, 0xac, 0xc4, 0x66, 0x50, 0x0e, 0xca, 0xc2, 0x30, 0x98, 0xe0, 0x36, 0xe8, + 0xde, 0x40, 0xd5, 0x8d, 0xe2, 0xaf, 0x4b, 0x44, 0x16, 0xc5, 0x0d, 0x85, 0x62, 0xb1, 0x18, 0x7f, + 0x37, 0xa3, 0x65, 0x5b, 0xe2, 0x48, 0xbb, 0x5c, 0x4c, 0x66, 0x0f, 0xac, 0x5b, 0xfd, 0xf2, 0x81, + 0xc9, 0x5a, 0xfe, 0x79, 0x79, 0xb7, 0x01, 0x1d, 0x99, 0x90, 0x4d, 0x70, 0xeb, 0xaf, 0xdb, 0x00, + 0x0f, 0x8d, 0xca, 0x7a, 0x19, 0xa2, 0x3b, 0x4d, 0x44, 0x0c, 0xad, 0xa1, 0x44, 0x77, 0x07, 0xc3, + 0x60, 0xe2, 0x24, 0xeb, 0x85, 0xc6, 0x74, 0x9b, 0x08, 0xdd, 0xc2, 0x56, 0xca, 0xc7, 0x56, 0x07, + 0x63, 0xd5, 0x7a, 0x7a, 0x74, 0x51, 0x5e, 0xac, 0xdb, 0x3f, 0x69, 0x89, 0xfd, 0xf4, 0x6f, 0xf1, + 0x88, 0xad, 0x5a, 0xfe, 0x9b, 0x28, 0xb8, 0x6c, 0x7a, 0x74, 0xa5, 0x55, 0xf8, 0x64, 0x6a, 0x5f, + 0x7f, 0xe9, 0x7c, 0xaa, 0x87, 0xb2, 0x95, 0x4b, 0x9d, 0xd4, 0xaf, 0x87, 0x4f, 0xf5, 0x53, 0x93, + 0x43, 0x3e, 0x5a, 0xf3, 0x55, 0xe8, 0x49, 0x0c, 0x5b, 0x2a, 0x38, 0xac, 0x77, 0xab, 0x5b, 0xbf, + 0xf2, 0xf0, 0x18, 0x89, 0xea, 0xae, 0x3c, 0x07, 0xc1, 0x1e, 0xc7, 0xb8, 0xb3, 0x0a, 0x4d, 0x9f, + 0xa3, 0x7d, 0x42, 0xfb, 0x46, 0x5b, 0x8e, 0xf6, 0x68, 0x7c, 0xe5, 0xd0, 0x10, 0x2e, 0xf1, 0xb0, + 0x2d, 0x8a, 0x97, 0xd8, 0xde, 0xe1, 0x42, 0x87, 0xf1, 0x71, 0x52, 0xe2, 0x4e, 0x5e, 0x2c, 0xa2, + 0xd3, 0x49, 0xce, 0xf0, 0x85, 0x22, 0x3e, 0x67, 0xc5, 0x34, 0xb3, 0x27, 0xc3, 0xb6, 0x52, 0xda, + 0x9b, 0xfc, 0xea, 0xe4, 0x40, 0xd3, 0x53, 0xb5, 0x0e, 0x38, 0xc8, 0xd9, 0xf9, 0x99, 0xf8, 0x36, + 0x0e, 0x7f, 0x1d, 0x4b, 0xfc, 0xa2, 0xcb, 0xf9, 0x19, 0xfd, 0xff, 0x61, 0xfe, 0x0f, 0x8d, 0xa3, + 0x64, 0xd8, 0x37, 0x66, 0x00, 0x00 +}; \ No newline at end of file diff --git a/lib/webserver/setup-ui/data/setup.htm b/lib/webserver/setup-ui/data/setup.htm index c1869d3..5a297b2 100644 --- a/lib/webserver/setup-ui/data/setup.htm +++ b/lib/webserver/setup-ui/data/setup.htm @@ -2,7 +2,7 @@ - Smartpusher + SmartPusher @@ -13,7 +13,7 @@ -

    Smartpusher

    +

    SmartPusher

    @@ -21,8 +21,7 @@

    Smartpusher

    Files Update - About - + Wiki
    @@ -107,6 +106,10 @@

    Connect to WiFi

    + \ No newline at end of file diff --git a/lib/webserver/setup-ui/data/style.css b/lib/webserver/setup-ui/data/style.css index fd06abc..9bf1295 100644 --- a/lib/webserver/setup-ui/data/style.css +++ b/lib/webserver/setup-ui/data/style.css @@ -68,7 +68,8 @@ input:focus, select:focus {border-color:#3898EC;outline:0;} background-color: hsla(0, 0%, 100%, 0.8); box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px; } - +footer {text-align:center;font-size:12px;margin:40px} +#about {color: lightgray} .body{padding-right:20px;padding-left:20px;border-radius:10px;background-color:#edf0f3;background-clip:border-box;} .title{display:flex;justify-content:center;align-items:center;flex:1;} .heading-2{padding-right:20px;padding-left:20px;font-weight:400;text-align: center;} diff --git a/lib/webserver/src/esp-fs-webserver.cpp b/lib/webserver/src/esp-fs-webserver.cpp index 761e5f5..210874e 100644 --- a/lib/webserver/src/esp-fs-webserver.cpp +++ b/lib/webserver/src/esp-fs-webserver.cpp @@ -24,11 +24,6 @@ void FSWebServer::addHandler(const Uri &uri, HTTPMethod method, WebServerClass:: webserver->on(uri, method, fn); } -void FSWebServer::addHandler(const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn1, WebServerClass::THandlerFunction fn2) -{ - webserver->on(uri, method, fn1, fn2); -} - void FSWebServer::addHandler(const Uri &uri, WebServerClass::THandlerFunction handler) { webserver->on(uri, HTTP_ANY, handler); @@ -259,19 +254,31 @@ void FSWebServer::doWifiConnection() bool persistent = true; WiFi.mode(WIFI_AP_STA); - String json = webserver->arg("plain"); - DynamicJsonDocument data(256); - DeserializationError error = deserializeJson(data, json); - ssid = data["ssid"].as(); - pass = data["password"].as(); - persistent = data["persistent"].as(); + if (webserver->hasArg("ssid")) + { + ssid = webserver->arg("ssid"); + } + + if (webserver->hasArg("password")) + { + pass = webserver->arg("password"); + } + + if (webserver->hasArg("persistent")) + { + String pers = webserver->arg("persistent"); + if (pers.equals("false")) + { + persistent = false; + } + } if (WiFi.status() == WL_CONNECTED) { IPAddress ip = WiFi.localIP(); String resp = "ESP is currently connected to a WiFi network.

    " - "Actual connection will be closed and a new attempt will be done with "; + "Actual connection will be closed and a new attempt will be done with "; resp += ssid; resp += " WiFi network."; webserver->send(200, "text/plain", resp); @@ -336,9 +343,8 @@ void FSWebServer::doWifiConnection() esp_wifi_set_config(WIFI_IF_STA, &stationConf); #endif } - else - { -#if defined(ESP8266) + else { + #if defined(ESP8266) struct station_config stationConf; wifi_station_get_config_default(&stationConf); // Clear previuos configuration @@ -408,10 +414,10 @@ void FSWebServer::handleScanNetworks() DebugPrintln(jsonList); } + #ifdef INCLUDE_SETUP_HTM -void FSWebServer::addDropdownList(const char *label, const char **array, size_t size) -{ +void FSWebServer::addDropdownList(const char *label, const char** array, size_t size) { File file = m_filesystem->open("/config.json", "r"); int sz = file.size() * 1.33; int docSize = max(sz, 2048); @@ -434,17 +440,16 @@ void FSWebServer::addDropdownList(const char *label, const char **array, size_t DebugPrintln(F("File not found, will be created new configuration file")); } - numOptions++; + numOptions++ ; // If key is present in json, we don't need to create it. if (doc.containsKey(label)) return; JsonObject obj = doc.createNestedObject(label); - obj["selected"] = array[0]; // first element selected as default + obj["selected"] = array[0]; // first element selected as default JsonArray arr = obj.createNestedArray("values"); - for (int i = 0; i < size; i++) - { + for (int i=0; i -1) { + str.replace(String(noChars[i]), ""); + pos = str.indexOf(noChars[i]); } - pr = ch; } - tr[j] = '\0'; + // Remove doubles spaces + pos = str.indexOf(" "); + while (pos > -1) { + str.replace(" ", " "); + pos = str.indexOf(" "); + } } void FSWebServer::handleSetup() diff --git a/lib/webserver/src/esp-fs-webserver.h b/lib/webserver/src/esp-fs-webserver.h index a1f0de7..1501697 100644 --- a/lib/webserver/src/esp-fs-webserver.h +++ b/lib/webserver/src/esp-fs-webserver.h @@ -83,7 +83,7 @@ class FSWebServer void run(); void addHandler(const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn); - void addHandler(const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn1, WebServerClass::THandlerFunction fn2); + void addHandler(const Uri &uri, WebServerClass::THandlerFunction handler); void setCaptiveWebage(const char *url); @@ -99,43 +99,42 @@ class FSWebServer #define MIN_F -3.4028235E+38 #define MAX_F 3.4028235E+38 - // inline bool loadOptions() { - // return m_varList.loadValues(m_filesystem, "/config.json"); - // } - - // inline bool saveOptions() { - // return m_varList.saveValues(m_filesystem, "/config.json"); - // } + inline bool clearOptions() { + File file = m_filesystem->open("/config.json", "r"); + if (file) + { + file.close(); + m_filesystem->remove("/config.json"); + return true; + } + return false; + } - inline void addOptionBox(const char *boxTitle) - { + inline void addOptionBox(const char* boxTitle) { addOption("param-box", boxTitle, false); } - inline void addHTML(const char *html, const char *id) - { + inline void addHTML(const char* html, const char* id) { String elementId = "raw-html-"; elementId += id; - char trimmed[strlen(html)]; - removeWhiteSpaces(html, trimmed); - addOption(elementId.c_str(), trimmed, false); + String trimmed = html; + removeWhiteSpaces(trimmed); + addOption(elementId.c_str(), trimmed.c_str(), false); } - inline void addCSS(const char *css) - { - char trimmed[strlen(css)]; - removeWhiteSpaces(css, trimmed); - addOption("raw-css", trimmed, false); + inline void addCSS(const char* css) { + String trimmed = css; + removeWhiteSpaces(trimmed); + addOption("raw-css", trimmed.c_str(), false); } - inline void addJavascript(const char *script) - { - char trimmed[strlen(script)]; - removeWhiteSpaces(script, trimmed); - addOption("raw-javascript", trimmed, true); + inline void addJavascript(const char* script) { + //String trimmed = script; + // removeWhiteSpaces(trimmed); + addOption("raw-javascript", script, true); } - void addDropdownList(const char *label, const char **array, size_t size); + void addDropdownList(const char *label, const char** array, size_t size); // Only for backward-compatibility template @@ -151,10 +150,11 @@ class FSWebServer addOption(label, val, false, d_min, d_max, step); } + // Add custom option to config webpage (type of parameter will be deduced from variable itself) template inline void addOption(const char *label, T val, bool hidden = false, - double d_min = MIN_F, double d_max = MAX_F, double step = 1.0) + double d_min = MIN_F, double d_max = MAX_F, double step = 1.0) { File file = m_filesystem->open("/config.json", "r"); int sz = file.size() * 1.33; @@ -178,20 +178,18 @@ class FSWebServer DebugPrintln(F("File not found, will be created new configuration file")); } - numOptions++; + numOptions++ ; String key = label; if (hidden) key += "-hidden"; // Univoque key name - if (key.equals("param-box")) - { - key += numOptions; + if (key.equals("param-box")) { + key += numOptions ; } - if (key.equals("raw-javascript")) - { - key += numOptions; + if (key.equals("raw-javascript")) { + key += numOptions ; } // If key is present in json, we don't need to create it. @@ -207,8 +205,7 @@ class FSWebServer obj["max"] = d_max; obj["step"] = step; } - else - { + else { doc[key] = static_cast(val); } @@ -220,6 +217,8 @@ class FSWebServer file.close(); } + + // Get current value for a specific custom option (true on success) template bool getOptionValue(const char *label, T &var) @@ -283,6 +282,7 @@ class FSWebServer #endif private: + char m_basePath[16]; UpdateServerClass m_httpUpdater; DNSServer m_dnsServer; @@ -301,7 +301,7 @@ class FSWebServer void getIpAddress(); void handleRequest(); #ifdef INCLUDE_SETUP_HTM - void removeWhiteSpaces(const char *input, char *tr); + void removeWhiteSpaces(String& str); void handleSetup(); uint8_t numOptions = 0; #endif @@ -323,6 +323,7 @@ class FSWebServer void handleStatus(); void handleFileList(); #endif + }; #endif diff --git a/lib/webserver/src/setup.htm b/lib/webserver/src/setup.htm index 354c998..4bcb2d3 100644 --- a/lib/webserver/src/setup.htm +++ b/lib/webserver/src/setup.htm @@ -2,7 +2,7 @@ - Smartpusher + SmartPusher @@ -13,7 +13,7 @@ -

    Smartpusher

    +

    SmartPusher

    diff --git a/lib/webserver/src/setup_htm.h b/lib/webserver/src/setup_htm.h index 202ad5e..d49b731 100644 --- a/lib/webserver/src/setup_htm.h +++ b/lib/webserver/src/setup_htm.h @@ -1,515 +1,519 @@ -#define SETUP_HTML_SIZE 8177 +#define SETUP_HTML_SIZE 8246 const char SETUP_HTML[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xed, 0x3d, 0x6b, 0x73, 0xdb, 0x46, - 0x92, 0xdf, 0xaf, 0x6a, 0xff, 0x03, 0x8c, 0xc4, 0x31, 0xb9, 0x06, 0x20, 0x3c, 0x88, 0x07, 0x49, - 0x51, 0xd9, 0x44, 0x71, 0xca, 0xb9, 0x93, 0x13, 0xd7, 0x2a, 0xeb, 0xad, 0x4b, 0xca, 0x75, 0x0b, - 0x91, 0x43, 0x11, 0x31, 0x08, 0xf0, 0x00, 0x50, 0xb2, 0xcc, 0xf0, 0xbf, 0x5f, 0x77, 0xcf, 0x0c, - 0x30, 0x00, 0x41, 0x4a, 0xc9, 0x26, 0xdf, 0x2e, 0xb6, 0xf1, 0x98, 0x47, 0x4f, 0xbf, 0xbb, 0xe7, - 0x01, 0xe6, 0xfc, 0xd9, 0x37, 0x3f, 0x5c, 0xfe, 0xf8, 0xdf, 0x6f, 0x5f, 0x69, 0xab, 0x6a, 0x9d, - 0x5e, 0xfc, 0xe5, 0x3f, 0xce, 0xeb, 0x3b, 0x8b, 0x17, 0x70, 0xd7, 0xe0, 0xbf, 0xf3, 0x35, 0xab, - 0x62, 0x6d, 0xbe, 0x8a, 0x8b, 0x92, 0x55, 0xb3, 0x6d, 0xb5, 0x34, 0x23, 0xed, 0x4c, 0xd6, 0x55, - 0x49, 0x95, 0xb2, 0x8b, 0xeb, 0x75, 0x5c, 0x54, 0x9b, 0x6d, 0xb9, 0x62, 0xc5, 0xf9, 0x19, 0x2f, - 0x6a, 0xf5, 0xcd, 0xb3, 0x8a, 0x65, 0xd5, 0x4c, 0xbf, 0x4f, 0x16, 0xd5, 0x6a, 0xb6, 0x60, 0x77, - 0xc9, 0x9c, 0x99, 0xf4, 0x62, 0x68, 0x49, 0x96, 0x54, 0x49, 0x9c, 0x9a, 0xe5, 0x3c, 0x4e, 0xd9, - 0xcc, 0xd1, 0xb5, 0x2c, 0x5e, 0xb3, 0xd9, 0x5d, 0xc2, 0xee, 0x37, 0x79, 0x51, 0x35, 0x23, 0x95, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xed, 0x3d, 0x69, 0x77, 0xdb, 0x46, + 0x92, 0xdf, 0xf7, 0xbd, 0xf9, 0x0f, 0x08, 0x12, 0xc7, 0xe4, 0x18, 0x80, 0x70, 0x10, 0x00, 0x0f, + 0x51, 0x99, 0x44, 0x71, 0x9e, 0xb3, 0x2b, 0x27, 0x7e, 0xa3, 0x19, 0xcf, 0xdb, 0xe4, 0xf9, 0xed, + 0x40, 0x44, 0x53, 0x44, 0x0c, 0x02, 0x5c, 0x00, 0x94, 0x2c, 0x33, 0xfc, 0xef, 0x5b, 0x55, 0xdd, + 0x0d, 0x34, 0x40, 0x90, 0x92, 0x73, 0x7c, 0xdb, 0xd8, 0xc6, 0xd1, 0x47, 0x75, 0xdd, 0x55, 0x7d, + 0x80, 0x39, 0xff, 0xec, 0xdb, 0x1f, 0x2f, 0xff, 0xf1, 0xdf, 0x6f, 0x5e, 0x6a, 0xab, 0x6a, 0x9d, + 0x5e, 0xfc, 0xe5, 0x3f, 0xce, 0xeb, 0x3b, 0x8b, 0x62, 0xb8, 0x6b, 0xf0, 0xdf, 0xf9, 0x9a, 0x55, + 0x91, 0xb6, 0x58, 0x45, 0x45, 0xc9, 0xaa, 0xf9, 0xb6, 0x5a, 0x9a, 0x63, 0xed, 0x4c, 0xd6, 0x55, + 0x49, 0x95, 0xb2, 0x8b, 0xeb, 0x75, 0x54, 0x54, 0x6f, 0xb6, 0xe5, 0x8a, 0x15, 0xe7, 0x67, 0xbc, + 0xa8, 0xd5, 0x37, 0xcf, 0x2a, 0x96, 0x55, 0x73, 0xfd, 0x3e, 0x89, 0xab, 0xd5, 0x3c, 0x66, 0x77, + 0xc9, 0x82, 0x99, 0xf4, 0x62, 0x68, 0x49, 0x96, 0x54, 0x49, 0x94, 0x9a, 0xe5, 0x22, 0x4a, 0xd9, + 0xdc, 0xd1, 0xb5, 0x2c, 0x5a, 0xb3, 0xf9, 0x5d, 0xc2, 0xee, 0x37, 0x79, 0x51, 0x35, 0x23, 0x95, 0xd5, 0x03, 0x80, 0xb5, 0x92, 0x6c, 0x03, 0x28, 0x24, 0x29, 0xdb, 0xad, 0x58, 0x72, 0xbb, 0xaa, - 0x26, 0x8e, 0xbd, 0xf9, 0x38, 0xcd, 0x37, 0xf1, 0x3c, 0xa9, 0x1e, 0x26, 0xf6, 0x34, 0xbf, 0x63, - 0xc5, 0x32, 0xcd, 0xef, 0x27, 0xab, 0x64, 0xb1, 0x60, 0xd9, 0x74, 0x93, 0x97, 0x00, 0x3f, 0xcf, - 0x26, 0xf1, 0x4d, 0x99, 0xa7, 0xdb, 0x8a, 0x4d, 0x69, 0x5c, 0xde, 0xed, 0x93, 0x99, 0x64, 0x0b, - 0xf6, 0x71, 0x62, 0x3a, 0x7b, 0x2b, 0xcd, 0xe3, 0x05, 0x2b, 0x0c, 0x71, 0x9f, 0xc4, 0xcb, 0x4a, - 0x79, 0xbb, 0x61, 0xcb, 0xbc, 0x60, 0x3b, 0xf3, 0x9e, 0xdd, 0x7c, 0x48, 0x2a, 0x33, 0xce, 0x92, - 0x75, 0x8c, 0x50, 0x4d, 0xc0, 0x24, 0x35, 0xd7, 0xf9, 0x82, 0x4d, 0x6e, 0xf2, 0x6a, 0x35, 0x3d, - 0x5a, 0x71, 0xd0, 0x73, 0x82, 0x90, 0x43, 0xcd, 0xb1, 0xa2, 0x52, 0x63, 0x71, 0xc9, 0x00, 0x13, - 0x33, 0xdf, 0x56, 0xc0, 0x8e, 0x25, 0x72, 0x84, 0x4d, 0x9f, 0xde, 0xf2, 0x26, 0x2f, 0x00, 0x47, - 0xb3, 0x88, 0x17, 0xc9, 0xb6, 0x9c, 0xf8, 0xf6, 0xf3, 0xa9, 0x60, 0x8d, 0xcb, 0xd6, 0x82, 0x5a, - 0x78, 0x92, 0x14, 0xf6, 0x10, 0xb1, 0x60, 0x69, 0xfc, 0x30, 0x31, 0x2d, 0x27, 0x28, 0xa7, 0xfd, - 0xa5, 0xf3, 0x3c, 0xcd, 0x8b, 0xc9, 0x67, 0x9e, 0xe7, 0x4d, 0x97, 0x20, 0x4c, 0xb3, 0x4c, 0x3e, - 0x31, 0xce, 0x42, 0x90, 0xfc, 0x2d, 0x20, 0x94, 0xb2, 0x65, 0x35, 0x89, 0xb7, 0x55, 0x2e, 0x0b, - 0x0a, 0xc2, 0x80, 0x4a, 0x6a, 0x11, 0x14, 0x00, 0xb1, 0x4a, 0xee, 0xd8, 0xb4, 0x62, 0x1f, 0x2b, - 0x62, 0x7d, 0x56, 0x4d, 0xcc, 0x31, 0xfc, 0x07, 0x88, 0x4a, 0xb4, 0xaa, 0x22, 0xce, 0x4a, 0xe0, - 0xf6, 0x7a, 0x42, 0x4f, 0xd0, 0x83, 0xfd, 0x34, 0xb0, 0x87, 0x53, 0x73, 0x5d, 0x1e, 0xad, 0x3b, - 0x56, 0x2e, 0xe5, 0x0b, 0x23, 0xec, 0x4f, 0x0a, 0x56, 0x68, 0xe8, 0x44, 0xd7, 0x7b, 0x14, 0xa6, - 0xca, 0x37, 0x13, 0x7b, 0xff, 0xa8, 0x2a, 0x48, 0x7e, 0x79, 0x6e, 0x1f, 0x17, 0xb1, 0x94, 0x98, - 0x64, 0x8e, 0x2c, 0xbf, 0x91, 0x06, 0x47, 0x67, 0x47, 0x35, 0xbc, 0xe2, 0x6f, 0x12, 0xf2, 0x07, - 0xf6, 0xb0, 0x2c, 0xc0, 0x16, 0x4a, 0x8d, 0x14, 0x60, 0x67, 0x3f, 0x37, 0x22, 0xf8, 0x57, 0xe5, - 0xbb, 0x9b, 0xfc, 0xa3, 0x59, 0xae, 0xe2, 0x05, 0x68, 0xb9, 0xad, 0xb9, 0xd8, 0x4b, 0xb3, 0x35, - 0xd3, 0xb1, 0x3c, 0xe8, 0x3e, 0xb2, 0x9f, 0xf7, 0xd7, 0xdb, 0xfb, 0xfd, 0xdf, 0xfe, 0x78, 0x90, - 0x55, 0x31, 0x59, 0xa1, 0xc9, 0xed, 0x40, 0xdf, 0x2b, 0xe4, 0x0e, 0xc9, 0x3d, 0x63, 0x65, 0x39, - 0x88, 0xfc, 0xe7, 0xc3, 0xbd, 0xb5, 0x40, 0x23, 0x88, 0xd3, 0xdd, 0x4d, 0x3c, 0xff, 0x70, 0x5b, - 0xe4, 0xdb, 0x6c, 0x61, 0x72, 0x65, 0x5a, 0x81, 0x98, 0x06, 0xb6, 0x01, 0xc3, 0x3b, 0x36, 0x5c, - 0xac, 0xb1, 0x3f, 0x14, 0x9a, 0x3c, 0x71, 0x36, 0x1f, 0x35, 0xe0, 0x7d, 0xb2, 0xd0, 0x50, 0xe3, - 0xe0, 0xbf, 0xa0, 0xab, 0xe4, 0xa4, 0x7a, 0x2d, 0x9c, 0x3c, 0xe8, 0x13, 0xc1, 0xbf, 0xe2, 0xf6, - 0x86, 0xc0, 0xc2, 0x1f, 0xcb, 0x1d, 0x0d, 0xa7, 0xcb, 0x94, 0x7d, 0x34, 0x17, 0x49, 0xc1, 0xe6, - 0x24, 0x54, 0x18, 0x7b, 0xbb, 0xce, 0xb8, 0x24, 0xd0, 0x52, 0xd6, 0xf1, 0x47, 0x53, 0x58, 0xcb, - 0xd8, 0xbe, 0x5b, 0xd1, 0x3b, 0x37, 0x99, 0x31, 0xd4, 0x92, 0x9e, 0xc6, 0x69, 0x72, 0x0b, 0x46, - 0x08, 0x3d, 0x48, 0x13, 0x46, 0x58, 0x7e, 0xa8, 0x6f, 0x03, 0x13, 0xc0, 0x19, 0x78, 0x19, 0x0a, - 0x9b, 0xf3, 0x6c, 0xd0, 0xea, 0x96, 0x06, 0x0a, 0x5e, 0x18, 0xf2, 0xc1, 0x9c, 0xa7, 0x79, 0xc9, - 0x76, 0x8b, 0xa4, 0xdc, 0xa0, 0x92, 0x20, 0xaa, 0x87, 0xea, 0xb7, 0xef, 0xb4, 0x26, 0x74, 0x4c, - 0xb0, 0xfb, 0x75, 0x39, 0x99, 0x83, 0xce, 0xb2, 0x42, 0x5a, 0xa7, 0xe3, 0x38, 0x91, 0x1b, 0x4e, - 0xe7, 0xdb, 0xa2, 0x84, 0xd7, 0x4d, 0x9e, 0x50, 0xa5, 0xa0, 0x8e, 0x94, 0x6b, 0xfa, 0xcb, 0xb6, - 0xac, 0x92, 0xe5, 0x83, 0x29, 0xf5, 0x5d, 0x00, 0xe0, 0xc6, 0x6a, 0x73, 0x4d, 0x17, 0xe8, 0x0b, - 0x35, 0x95, 0x83, 0x93, 0x57, 0xdf, 0xb5, 0x47, 0xda, 0xc4, 0x8b, 0x45, 0x92, 0xdd, 0x4e, 0x1c, - 0xd2, 0x07, 0xf4, 0x36, 0x87, 0xa6, 0xce, 0x81, 0x81, 0x6f, 0x9f, 0x0f, 0x50, 0xce, 0x9a, 0xa9, - 0x11, 0xe0, 0xa1, 0x42, 0x16, 0xc7, 0x65, 0x27, 0x24, 0x8c, 0x38, 0x28, 0x0a, 0xc0, 0x6c, 0xfc, - 0xd3, 0xb8, 0x75, 0xee, 0x51, 0xc4, 0xc0, 0xe4, 0xd6, 0xa0, 0x43, 0x16, 0xdf, 0x1d, 0x2a, 0x18, - 0x79, 0xab, 0x8e, 0x6f, 0x04, 0xad, 0x01, 0x28, 0x71, 0x35, 0x21, 0x8a, 0x6b, 0x3f, 0x09, 0x8a, - 0x63, 0x1c, 0x44, 0x0e, 0x8e, 0xf9, 0x12, 0x2c, 0x51, 0x60, 0x28, 0x87, 0xd2, 0x62, 0xc9, 0x87, - 0xa5, 0x8b, 0x7f, 0xa6, 0x52, 0x80, 0x37, 0x69, 0x3e, 0xff, 0x20, 0x06, 0x20, 0x7d, 0x51, 0x7c, - 0x65, 0x00, 0x43, 0x4b, 0xb4, 0x01, 0x0d, 0x8d, 0x34, 0x58, 0xd1, 0x2f, 0x21, 0x09, 0x2a, 0x59, - 0xb0, 0x79, 0x5e, 0x70, 0xdf, 0x9f, 0xe5, 0x19, 0x6b, 0xc6, 0x15, 0xb6, 0x76, 0x48, 0xea, 0x62, - 0xb1, 0x90, 0x5a, 0x60, 0xdb, 0x76, 0xd3, 0xc1, 0x8a, 0xe7, 0x28, 0x85, 0x9e, 0x1e, 0x7e, 0x30, - 0xb7, 0x23, 0x5b, 0x76, 0x5a, 0x2e, 0x97, 0x75, 0x27, 0x2b, 0x01, 0x7a, 0x6b, 0xa5, 0x24, 0x04, - 0xfe, 0xca, 0xed, 0x3f, 0xf9, 0x84, 0xd8, 0x0b, 0x96, 0x42, 0x09, 0x3a, 0xb1, 0xdb, 0x7c, 0x27, - 0x03, 0xaa, 0xfd, 0x1c, 0x0a, 0x6e, 0x52, 0xb0, 0x9f, 0x65, 0xb2, 0x93, 0xb4, 0xda, 0x2a, 0x91, - 0xc4, 0xf5, 0x3d, 0xe6, 0x18, 0x3b, 0x62, 0xcd, 0x32, 0x5e, 0x27, 0xe9, 0xc3, 0xa4, 0x04, 0x1b, - 0x32, 0x4b, 0x56, 0x24, 0xcb, 0xfd, 0x02, 0xf2, 0x85, 0x24, 0x2d, 0x0d, 0xcc, 0x3f, 0xc0, 0x4d, - 0xaf, 0xe3, 0x24, 0x33, 0xca, 0xed, 0x1a, 0x82, 0xca, 0xc3, 0xae, 0xc5, 0x66, 0x40, 0x37, 0xbe, - 0x01, 0x8d, 0x14, 0xd8, 0x00, 0x1d, 0x69, 0xbc, 0x29, 0xd9, 0x44, 0x3e, 0x48, 0xc9, 0x97, 0x98, - 0x19, 0x10, 0x1e, 0x3c, 0x30, 0x71, 0x05, 0xaa, 0x4d, 0x7c, 0x1f, 0x1f, 0xf2, 0x86, 0x6c, 0x7a, - 0x13, 0x17, 0x28, 0xf2, 0x78, 0xc2, 0x39, 0x68, 0x48, 0xde, 0x43, 0xe4, 0x4d, 0x93, 0x8c, 0x41, - 0x40, 0xb8, 0xe1, 0x34, 0xdc, 0x73, 0x1d, 0x0a, 0x81, 0xed, 0x2b, 0x67, 0xd7, 0x48, 0xdc, 0x03, - 0xa5, 0xda, 0xaf, 0x5c, 0xa5, 0xc4, 0x1d, 0x61, 0x49, 0xd1, 0xb0, 0x66, 0xcf, 0xb3, 0x19, 0x33, - 0x8d, 0x6f, 0x58, 0x8f, 0x87, 0x44, 0xa9, 0xf4, 0xb8, 0xc4, 0xc5, 0x7c, 0x31, 0x67, 0x7e, 0x47, - 0xb3, 0x03, 0xf2, 0x87, 0x55, 0x95, 0xaf, 0x27, 0x66, 0x08, 0xcf, 0x52, 0x19, 0x1c, 0xdf, 0x1d, - 0x7b, 0xb5, 0x82, 0x26, 0x19, 0xe2, 0x6e, 0x0a, 0x3d, 0x6d, 0x94, 0xd3, 0xb3, 0xc8, 0x32, 0x14, - 0x72, 0x7c, 0xdb, 0xe6, 0x4e, 0x12, 0xa8, 0x98, 0x52, 0x27, 0x99, 0x6e, 0x85, 0x4d, 0xd0, 0x17, - 0x03, 0xda, 0x52, 0xb1, 0x79, 0x16, 0xa0, 0x68, 0xba, 0xc8, 0x02, 0xb0, 0xcb, 0xa1, 0x67, 0x90, - 0xae, 0xd1, 0xdd, 0x13, 0x17, 0x26, 0x75, 0x44, 0x05, 0x01, 0x61, 0xf6, 0x64, 0xf4, 0x17, 0x4b, - 0x81, 0x1c, 0xa9, 0x5d, 0xe6, 0xf3, 0x6d, 0x79, 0xac, 0x92, 0x8b, 0x50, 0x16, 0x2b, 0xf1, 0x23, - 0xc9, 0x20, 0xb7, 0xc5, 0x88, 0x06, 0x7f, 0x3c, 0xb0, 0x4c, 0x0d, 0x79, 0xff, 0x2c, 0x59, 0x63, - 0x0a, 0x1a, 0x83, 0x1a, 0x10, 0xbc, 0x9f, 0xab, 0x87, 0x0d, 0x9b, 0xcd, 0x57, 0x6c, 0xfe, 0x01, - 0xba, 0xbe, 0xef, 0xb7, 0x89, 0x69, 0x23, 0x5d, 0xa5, 0x53, 0xb6, 0x5d, 0xdf, 0xb0, 0xe2, 0xbd, - 0xa1, 0x14, 0x6d, 0xe2, 0xb2, 0xbc, 0x87, 0x6e, 0xad, 0x42, 0xb4, 0x95, 0xf7, 0x46, 0xc9, 0x52, - 0x08, 0x57, 0xbb, 0x43, 0xd1, 0xcf, 0xe7, 0xf3, 0x5e, 0xb9, 0x2b, 0x71, 0x10, 0x5b, 0xbb, 0xf0, - 0xcf, 0xe6, 0x91, 0xd0, 0x75, 0x6d, 0x83, 0xfe, 0x79, 0x10, 0x0f, 0x21, 0xc2, 0x76, 0x3c, 0x92, - 0x0c, 0x0e, 0xb6, 0x22, 0x33, 0x12, 0xa2, 0xab, 0x96, 0x90, 0x4b, 0x26, 0x7f, 0x85, 0x96, 0xc1, - 0xc5, 0xd8, 0xd8, 0x5d, 0x5e, 0x68, 0x96, 0xcb, 0x53, 0x53, 0xa3, 0x41, 0xa5, 0x2e, 0x9b, 0x2a, - 0xee, 0x81, 0x8b, 0x65, 0x02, 0xba, 0x38, 0x67, 0xab, 0x3c, 0xc5, 0x6c, 0x54, 0xba, 0x23, 0x86, - 0x7f, 0x44, 0x03, 0xe1, 0xe5, 0x94, 0x11, 0x26, 0x6a, 0x58, 0x8f, 0x86, 0x87, 0x24, 0x8f, 0x7a, - 0x48, 0x76, 0xc7, 0x90, 0x55, 0x0c, 0x05, 0x4c, 0xae, 0x17, 0x9c, 0xb3, 0xfc, 0xa5, 0x3d, 0xc0, - 0x67, 0x5e, 0x34, 0x8e, 0xd8, 0x7c, 0xda, 0xd8, 0xb7, 0x35, 0xaf, 0x32, 0x99, 0x2d, 0xe2, 0x63, - 0x37, 0x55, 0xd4, 0xf4, 0xda, 0xae, 0xc8, 0x15, 0x4d, 0x6f, 0x8b, 0x84, 0x4c, 0x17, 0x12, 0x0c, - 0x93, 0x65, 0x8b, 0x89, 0xdb, 0x2a, 0x29, 0x2b, 0x98, 0x23, 0x4d, 0x1c, 0x5e, 0x56, 0xe4, 0xf7, - 0x6a, 0x13, 0x7c, 0x15, 0xf5, 0x34, 0xac, 0xd1, 0x8c, 0xbd, 0x9b, 0xa7, 0x2c, 0x2e, 0x68, 0x12, - 0x41, 0x55, 0x22, 0xfe, 0x4b, 0x2c, 0xd0, 0xbd, 0x31, 0x33, 0x26, 0xb7, 0x31, 0xed, 0x49, 0x0d, - 0x1e, 0x4d, 0xbb, 0xa2, 0x3f, 0x25, 0xeb, 0xea, 0x46, 0xc4, 0x56, 0x0e, 0x06, 0xd4, 0xf2, 0xa2, - 0xfb, 0x22, 0xde, 0x4c, 0xf0, 0x72, 0x2c, 0x2f, 0x11, 0x2e, 0x1b, 0xc7, 0xd5, 0xc4, 0xe4, 0xa2, - 0x4e, 0xcf, 0x54, 0x9d, 0xe5, 0x2d, 0xb0, 0x64, 0x6f, 0xdd, 0xe4, 0x8b, 0x87, 0x96, 0x2f, 0x4d, - 0x93, 0x8d, 0x6a, 0x9f, 0x87, 0x6e, 0x96, 0x2d, 0x96, 0xf6, 0xb2, 0x9b, 0x2a, 0x38, 0xa7, 0x4d, - 0x82, 0x3b, 0x36, 0x97, 0x46, 0xe4, 0xa9, 0x51, 0x0f, 0xf3, 0x5b, 0x89, 0x1d, 0x5e, 0x40, 0xfc, - 0xfd, 0x94, 0xee, 0x2d, 0x0c, 0x78, 0x08, 0xd8, 0x6d, 0x45, 0x95, 0x91, 0x6d, 0x1f, 0x26, 0x09, - 0x7b, 0x0b, 0x53, 0x4f, 0x43, 0xe9, 0xf2, 0x34, 0x3c, 0xb1, 0xd7, 0xae, 0xf6, 0xc3, 0xa0, 0x6f, - 0x55, 0x32, 0x07, 0x7e, 0x81, 0xba, 0xdd, 0x6c, 0xc1, 0x91, 0x67, 0x7d, 0x29, 0x14, 0x37, 0x0a, - 0xa1, 0x21, 0x76, 0x4f, 0x3a, 0xa5, 0x84, 0xaa, 0x4e, 0xe2, 0xd9, 0x09, 0x3a, 0xc4, 0x84, 0x63, - 0x72, 0x86, 0x60, 0x22, 0xb2, 0x4e, 0xc8, 0xae, 0x5b, 0x42, 0x75, 0x7c, 0x12, 0x2a, 0x98, 0x03, - 0x79, 0x05, 0x81, 0xea, 0x23, 0x93, 0x0e, 0x68, 0x6e, 0xde, 0xc4, 0xc5, 0x4e, 0xb5, 0xbf, 0x5b, - 0xd0, 0x35, 0x74, 0xed, 0x8d, 0xc5, 0x61, 0x09, 0x31, 0xeb, 0x89, 0x26, 0x55, 0x56, 0x05, 0xab, - 0xe6, 0xab, 0x43, 0xb1, 0x9e, 0x50, 0x64, 0x9e, 0x67, 0x8a, 0x78, 0x89, 0x7e, 0x54, 0x95, 0x8e, - 0xd4, 0x9f, 0x25, 0x01, 0xd8, 0x00, 0x41, 0xea, 0x70, 0x04, 0x99, 0xbc, 0x42, 0x3d, 0xa2, 0x12, - 0xb9, 0x0e, 0xca, 0x08, 0x9b, 0xba, 0x10, 0x26, 0xcb, 0x58, 0xa0, 0x36, 0x6c, 0xd0, 0x3d, 0x98, - 0x0e, 0xb5, 0xe3, 0xb9, 0xe3, 0xf6, 0xc6, 0x6b, 0x35, 0xcd, 0x2b, 0x57, 0xc0, 0x3f, 0xc8, 0x93, - 0xfb, 0x32, 0x4b, 0x54, 0x85, 0xf6, 0x98, 0xdd, 0x44, 0xa3, 0xb1, 0xe2, 0x0e, 0x34, 0xe2, 0xc3, - 0x4e, 0xa0, 0x41, 0x06, 0xdf, 0xd1, 0xa9, 0x66, 0x99, 0xe1, 0x70, 0x9a, 0x2e, 0x54, 0xfd, 0x79, - 0x3d, 0x4b, 0x93, 0x09, 0xc6, 0x08, 0x46, 0xb8, 0xbb, 0x6d, 0x4f, 0xb3, 0x5a, 0xab, 0x14, 0x64, - 0xeb, 0x62, 0xa1, 0x84, 0x24, 0x02, 0xcd, 0x4d, 0xb6, 0x53, 0xa4, 0x46, 0x4a, 0x28, 0xec, 0x6d, - 0xa7, 0x2e, 0x79, 0xa8, 0x6b, 0x20, 0x0d, 0x30, 0x68, 0x0b, 0xd4, 0x18, 0x0d, 0x61, 0xd6, 0xbd, - 0x69, 0x02, 0x29, 0x98, 0x52, 0xb6, 0x33, 0x6b, 0x48, 0xba, 0x6f, 0x6f, 0x71, 0x62, 0x75, 0xd2, - 0x76, 0xb8, 0x1b, 0xa5, 0x01, 0xeb, 0x3c, 0x16, 0x53, 0x15, 0x2e, 0xa9, 0x66, 0x56, 0xd1, 0x92, - 0x11, 0x87, 0x6c, 0x96, 0xf7, 0x09, 0x28, 0xad, 0x22, 0xa7, 0x49, 0x4f, 0x1a, 0x41, 0xc9, 0x40, - 0xef, 0xa0, 0x22, 0x43, 0xf0, 0xfa, 0x75, 0x42, 0x4d, 0x08, 0xea, 0x01, 0x20, 0xf4, 0xfb, 0xe5, - 0x14, 0xec, 0x13, 0xfc, 0x0b, 0xcc, 0xef, 0xb8, 0xeb, 0x5a, 0xc3, 0xa4, 0x2a, 0x95, 0x4a, 0xe4, - 0x47, 0xa4, 0xf7, 0x2a, 0x82, 0x32, 0xd2, 0xb6, 0x0b, 0x0f, 0x96, 0x67, 0xba, 0xbd, 0x44, 0x03, - 0x85, 0x3a, 0xc4, 0x3d, 0x2e, 0xcc, 0x5b, 0xa4, 0x0c, 0xfa, 0x0c, 0x9c, 0xc8, 0x5e, 0xb0, 0x5b, - 0x03, 0xd5, 0x52, 0xb3, 0x8d, 0xcf, 0x18, 0x63, 0xc3, 0x9e, 0x15, 0xb3, 0x56, 0x54, 0x23, 0xd6, - 0x76, 0xa3, 0x9a, 0xdf, 0x8d, 0x6a, 0x72, 0xf2, 0x38, 0xc2, 0x0c, 0x99, 0xd6, 0x6f, 0x36, 0x3d, - 0xd3, 0x77, 0xae, 0x8d, 0xed, 0xdc, 0x09, 0x5b, 0x73, 0x26, 0x09, 0xa5, 0x1b, 0x35, 0xec, 0xe0, - 0x9e, 0x4d, 0xfb, 0x77, 0xc9, 0x84, 0xdb, 0xf0, 0x71, 0xa2, 0x7c, 0xf0, 0x95, 0x30, 0xbd, 0xc5, - 0x8c, 0x76, 0x42, 0x57, 0xb6, 0x78, 0x79, 0x42, 0x6f, 0xf8, 0x9c, 0xf1, 0xb1, 0x2e, 0x12, 0x59, - 0xe2, 0x89, 0xc7, 0x3d, 0x1c, 0xef, 0xb0, 0x3b, 0xe4, 0xce, 0x5d, 0x52, 0x26, 0x37, 0x49, 0x8a, - 0x6b, 0xb7, 0x7c, 0xda, 0x5d, 0x0b, 0x98, 0x4f, 0x8a, 0x54, 0x5b, 0xf3, 0xfb, 0x55, 0x10, 0x9d, - 0x2a, 0x0c, 0xf2, 0xb7, 0x35, 0x5b, 0x24, 0xb1, 0x56, 0xce, 0x0b, 0xc6, 0x32, 0x2d, 0x06, 0x35, - 0x1c, 0x28, 0xd9, 0xc2, 0x18, 0x48, 0x1f, 0xee, 0x28, 0x81, 0xea, 0x06, 0x05, 0xe7, 0x20, 0x28, - 0x08, 0xa3, 0x96, 0x9d, 0x43, 0x5c, 0x1f, 0x50, 0x53, 0x0f, 0xff, 0xf9, 0x34, 0xbf, 0xf9, 0x05, - 0x5c, 0xa8, 0xb9, 0x4c, 0x20, 0x86, 0x81, 0x72, 0xc2, 0x34, 0xb5, 0x59, 0x3f, 0x20, 0x9a, 0x40, - 0xd7, 0x0f, 0x70, 0x15, 0xb9, 0x1d, 0xce, 0x8f, 0x31, 0x40, 0x64, 0x98, 0xe4, 0x3f, 0x29, 0x74, - 0x9f, 0x26, 0x2e, 0x0c, 0x42, 0x22, 0xee, 0x38, 0x5c, 0xe7, 0x10, 0xae, 0xf3, 0x38, 0xdc, 0xc0, - 0x8e, 0x08, 0xae, 0x8c, 0xa6, 0x27, 0x63, 0x87, 0x8c, 0x6d, 0xf5, 0x7a, 0x4c, 0x3b, 0xa6, 0x34, - 0xce, 0xa9, 0x8e, 0x57, 0xb8, 0x40, 0x1e, 0xdf, 0xc1, 0x6c, 0x1f, 0x93, 0x67, 0x65, 0x6d, 0x45, - 0x5d, 0x25, 0x51, 0x21, 0x6a, 0x31, 0xb8, 0xcc, 0x6a, 0x20, 0x96, 0x34, 0x86, 0x07, 0x7e, 0x54, - 0xac, 0x78, 0xb4, 0x56, 0x2f, 0xd4, 0x15, 0x19, 0xbe, 0xf8, 0xf0, 0xe8, 0x5a, 0x4a, 0x93, 0x20, - 0x47, 0xe1, 0x73, 0xc3, 0x1e, 0xca, 0x0c, 0xc7, 0x8f, 0xf1, 0x8f, 0xec, 0x6f, 0x15, 0xac, 0xdc, - 0xe4, 0x60, 0xd0, 0x77, 0x6c, 0xd7, 0x23, 0xe7, 0x83, 0x46, 0x62, 0x55, 0xe5, 0x58, 0xd4, 0xb2, - 0xe5, 0x22, 0xf3, 0x61, 0xc7, 0xb8, 0x97, 0x18, 0x24, 0xba, 0xbb, 0x3c, 0xc9, 0xa3, 0x8e, 0x59, - 0x25, 0xd9, 0x43, 0x9b, 0x39, 0xa7, 0xc5, 0x3c, 0x0a, 0xc7, 0x28, 0xe6, 0xf6, 0xe2, 0x45, 0x93, - 0x4a, 0xb7, 0x15, 0xf4, 0x50, 0x3f, 0x95, 0xc8, 0x08, 0x99, 0xa8, 0xa2, 0x0d, 0x4e, 0x9d, 0x74, - 0x1e, 0x4d, 0x55, 0xed, 0x0e, 0x30, 0x3e, 0xe9, 0xda, 0xb5, 0xf3, 0x83, 0x66, 0x46, 0xad, 0x71, - 0xa5, 0x3d, 0x3f, 0xe3, 0x7b, 0x41, 0x7f, 0xf9, 0x8f, 0xf3, 0x33, 0xb1, 0x4f, 0x75, 0x8e, 0xa8, - 0x6a, 0xf3, 0x14, 0xe6, 0xd4, 0x33, 0x7c, 0xac, 0xb7, 0x9f, 0xc0, 0x30, 0xb5, 0x64, 0x31, 0xc3, - 0x3b, 0x66, 0x4d, 0xa2, 0x9c, 0xea, 0xf8, 0x12, 0x93, 0xe8, 0xa4, 0xc3, 0xb8, 0x1a, 0x2f, 0xd1, - 0x95, 0x46, 0xd4, 0x70, 0x91, 0xdc, 0x89, 0x56, 0xea, 0xd6, 0x56, 0xab, 0x09, 0x39, 0x2b, 0x0d, - 0x68, 0x9d, 0xe9, 0xb8, 0x24, 0x86, 0xca, 0xcd, 0x74, 0x09, 0x1a, 0xb3, 0x09, 0x9e, 0xb6, 0x76, - 0x41, 0xb7, 0x86, 0x00, 0x34, 0xb1, 0x25, 0xf6, 0xd7, 0x68, 0xa0, 0xd9, 0x8b, 0xcb, 0x34, 0x99, - 0x7f, 0xd0, 0xaa, 0x5c, 0xdb, 0x6e, 0x70, 0xc1, 0x5e, 0x7b, 0xc8, 0xb7, 0x85, 0x46, 0x0d, 0x70, - 0x80, 0x17, 0x17, 0xe7, 0x67, 0xd0, 0xb1, 0x0f, 0x9f, 0x33, 0x42, 0xa8, 0xaf, 0x66, 0xe5, 0xe0, - 0x40, 0xb8, 0xc7, 0xc6, 0x47, 0xe2, 0x38, 0x0a, 0xf9, 0xb4, 0x37, 0xf2, 0x56, 0x4e, 0x97, 0x13, - 0x3d, 0xc3, 0xa9, 0xdc, 0xe1, 0x96, 0x05, 0xe0, 0xe1, 0xc9, 0x84, 0xc7, 0xbe, 0xf1, 0x21, 0xbb, - 0x26, 0x89, 0xe8, 0x50, 0x6f, 0x42, 0x10, 0xfb, 0x70, 0x94, 0x27, 0x31, 0x71, 0x84, 0x55, 0xb4, - 0x9e, 0x28, 0x79, 0x19, 0x53, 0x1f, 0x8d, 0xfb, 0x00, 0x5d, 0x5b, 0xc4, 0x55, 0x8c, 0x72, 0xc5, - 0xad, 0x45, 0x70, 0x7e, 0xf0, 0xa4, 0x5f, 0xfc, 0x33, 0xf9, 0x36, 0xd1, 0xae, 0x59, 0xb5, 0xdd, - 0x9c, 0x9f, 0xc5, 0xbd, 0xcc, 0x41, 0x1c, 0xfa, 0x2a, 0x68, 0xc4, 0xf8, 0x06, 0x37, 0xd7, 0x20, - 0xed, 0xbe, 0x65, 0xd5, 0xec, 0x7f, 0x6e, 0xd2, 0x18, 0x86, 0x03, 0xc3, 0x9e, 0x65, 0x79, 0xbe, - 0x61, 0x19, 0x28, 0xcc, 0xaa, 0x60, 0xcb, 0x99, 0x75, 0x06, 0x16, 0x55, 0x5d, 0x7c, 0x0b, 0x62, - 0x28, 0x8f, 0x0c, 0xf3, 0x9b, 0xa0, 0x6d, 0x37, 0x40, 0x0a, 0xbb, 0xf8, 0x07, 0xdd, 0xfe, 0x7d, - 0x80, 0xab, 0xaa, 0xda, 0x94, 0x93, 0xb3, 0xb3, 0xdb, 0xa4, 0x5a, 0x6d, 0x6f, 0xac, 0x79, 0xbe, - 0x3e, 0xfb, 0x3a, 0xdd, 0x62, 0x5c, 0x9e, 0xb3, 0xe2, 0x8c, 0xa4, 0xfc, 0x96, 0xa4, 0x7c, 0x76, - 0x9f, 0x7c, 0x48, 0x2e, 0xbe, 0x42, 0xa0, 0xbd, 0xa3, 0xf6, 0xa2, 0xd1, 0x96, 0x05, 0x3a, 0x36, - 0x1d, 0x51, 0x5b, 0x6d, 0xd7, 0x26, 0xc4, 0x8a, 0x53, 0x3a, 0xce, 0x7b, 0x82, 0x9a, 0x6b, 0x64, - 0xc2, 0x33, 0x91, 0xcb, 0x9a, 0xe0, 0x45, 0x8e, 0x74, 0xa3, 0xae, 0xd8, 0x41, 0x98, 0xc7, 0x9a, - 0x65, 0x5b, 0xd4, 0xfe, 0x74, 0x26, 0xf2, 0xe9, 0x4b, 0x5a, 0x81, 0xc2, 0xfd, 0xe2, 0xaf, 0x51, - 0x0f, 0x30, 0xcd, 0x71, 0xc1, 0x53, 0x44, 0x3a, 0x58, 0x07, 0x74, 0x38, 0x86, 0xcd, 0x51, 0xcb, - 0xe9, 0x32, 0xa1, 0xdb, 0x92, 0xfb, 0x1c, 0x56, 0xa8, 0x45, 0xc2, 0x7c, 0xa5, 0x0e, 0xaa, 0x3e, - 0x25, 0xdf, 0x54, 0x5c, 0x2d, 0x3b, 0x50, 0x57, 0x6e, 0xdb, 0xf4, 0x4c, 0xf7, 0xe2, 0x92, 0x87, - 0x6e, 0xb4, 0x77, 0xd4, 0x61, 0x18, 0xc8, 0xed, 0x33, 0x36, 0x39, 0x10, 0x2d, 0x3a, 0x49, 0x20, - 0xe0, 0xf8, 0xfb, 0xa8, 0x51, 0xdb, 0xd0, 0xf3, 0x31, 0x76, 0x54, 0xe4, 0x40, 0x25, 0xe8, 0x34, - 0x29, 0x2b, 0x60, 0x5f, 0xa5, 0xb8, 0xd2, 0x36, 0x4b, 0x8e, 0xc1, 0x3a, 0xbf, 0x29, 0x7e, 0x9b, - 0xcf, 0x50, 0x73, 0x96, 0x3e, 0x78, 0x18, 0x3e, 0x44, 0x53, 0x7c, 0x7c, 0x5c, 0xb7, 0x9a, 0xc9, - 0xf4, 0x29, 0x85, 0x6a, 0xfc, 0x75, 0x59, 0x26, 0x0b, 0xd1, 0x55, 0x59, 0x8c, 0xbf, 0xb8, 0xbe, - 0xfe, 0xee, 0x9b, 0xe3, 0x5e, 0xb4, 0x86, 0x43, 0x5d, 0xb4, 0x7a, 0xe9, 0x56, 0x53, 0x56, 0x36, - 0x67, 0xfa, 0x2b, 0x9c, 0xca, 0x71, 0x9f, 0x0d, 0xf2, 0xfc, 0x4e, 0x43, 0x98, 0x74, 0xba, 0x81, - 0xac, 0x45, 0xc7, 0x91, 0xf5, 0xfa, 0x7c, 0xc3, 0x21, 0x8f, 0xfb, 0x15, 0xf4, 0xdf, 0x24, 0x57, - 0xae, 0x3a, 0xf7, 0x90, 0xfc, 0x56, 0x54, 0x3d, 0x81, 0x6c, 0xc5, 0x94, 0x5b, 0x53, 0x77, 0x32, - 0xd2, 0xba, 0x44, 0x8e, 0x75, 0x02, 0x12, 0x41, 0xab, 0x1d, 0x4a, 0xdd, 0x55, 0x6b, 0xa6, 0xcb, - 0x7a, 0x0d, 0x13, 0xc1, 0x3d, 0x02, 0xaa, 0x8b, 0x1c, 0x98, 0x3f, 0xf9, 0x8e, 0xfa, 0xd5, 0x64, - 0xd2, 0x8f, 0xb0, 0x07, 0xd6, 0x71, 0x1a, 0x23, 0xf8, 0x2b, 0x9d, 0xc6, 0x29, 0xee, 0xd7, 0x03, - 0xf5, 0x7a, 0xe9, 0x47, 0x28, 0xe3, 0x8e, 0x52, 0x72, 0xe7, 0x8f, 0x23, 0x27, 0xcb, 0xff, 0x74, - 0x8a, 0x1e, 0x83, 0xa0, 0x1a, 0x43, 0xad, 0x66, 0x27, 0x0c, 0x22, 0xd1, 0x64, 0x2b, 0xfd, 0x34, - 0x5a, 0x40, 0x62, 0x0d, 0x0f, 0xd7, 0x7e, 0x20, 0x9a, 0x6d, 0x52, 0x56, 0x31, 0x19, 0x01, 0x6a, - 0x45, 0xe3, 0xe9, 0xc0, 0xba, 0x84, 0x20, 0x81, 0xdb, 0x2d, 0x33, 0xbd, 0x1e, 0xe0, 0x37, 0x9b, - 0xd9, 0xf9, 0x59, 0x8f, 0xbb, 0x79, 0xc4, 0x97, 0xe9, 0x62, 0xa2, 0xa4, 0xf5, 0xa5, 0x34, 0xc2, - 0x06, 0x45, 0x4b, 0x3e, 0xc7, 0xd5, 0xe4, 0x6e, 0xe9, 0xd1, 0x1c, 0x68, 0x75, 0xcc, 0xac, 0x79, - 0x1e, 0x25, 0xf3, 0xae, 0x66, 0xc2, 0x7c, 0x71, 0x5d, 0xc1, 0xdc, 0x9b, 0xb3, 0x17, 0xb2, 0x7d, - 0x3c, 0x61, 0x93, 0xc4, 0x69, 0x79, 0x34, 0xe7, 0x21, 0x58, 0x5c, 0x70, 0xc8, 0x66, 0x56, 0x94, - 0xe0, 0xfa, 0xa1, 0x93, 0xd6, 0xda, 0xeb, 0xaa, 0xd1, 0xe6, 0xf3, 0x78, 0xc8, 0x6c, 0xf9, 0xcc, - 0xff, 0x09, 0xfe, 0x49, 0x5d, 0x19, 0xf8, 0x3d, 0xf9, 0x2a, 0xcf, 0x02, 0xe7, 0x71, 0xd6, 0x4a, - 0x03, 0x81, 0xd3, 0x27, 0x73, 0xe9, 0x8e, 0xc1, 0x08, 0x23, 0x41, 0x30, 0x8f, 0xe6, 0x0e, 0x4f, - 0x35, 0x1a, 0x92, 0xc0, 0xc5, 0x35, 0x82, 0x24, 0x6e, 0x67, 0xac, 0x02, 0x55, 0xfb, 0x70, 0x9c, - 0xd5, 0xa7, 0xb2, 0x3a, 0x11, 0x01, 0xff, 0x00, 0x1a, 0x05, 0xa4, 0x3f, 0x98, 0x4c, 0x25, 0x35, - 0xa9, 0x33, 0x78, 0x8c, 0x5f, 0x26, 0x86, 0x33, 0x11, 0x2c, 0x9f, 0x4c, 0xf6, 0x61, 0x46, 0xd5, - 0x79, 0x17, 0x59, 0x0e, 0x99, 0x53, 0xa3, 0x7c, 0xd2, 0xba, 0xc8, 0x8d, 0x76, 0x41, 0xf6, 0x58, - 0x57, 0xaf, 0x15, 0x1e, 0x18, 0x54, 0xbf, 0xea, 0x71, 0xa9, 0xc0, 0x2c, 0x1c, 0x97, 0xdf, 0x1f, - 0x11, 0xc8, 0x09, 0x61, 0x48, 0x00, 0x7f, 0x84, 0x30, 0xb8, 0x20, 0xfe, 0x2e, 0x20, 0xbe, 0xba, - 0x7e, 0xdb, 0xcb, 0xf1, 0x1e, 0x6e, 0x73, 0x0b, 0x8a, 0xef, 0x30, 0xe4, 0x14, 0xf1, 0xba, 0xfc, - 0xfd, 0xe4, 0x20, 0x90, 0x3f, 0x90, 0x96, 0x6b, 0x04, 0x07, 0xfa, 0xba, 0x4c, 0x6e, 0xb7, 0xfc, - 0xb8, 0xcb, 0x13, 0x48, 0x52, 0x41, 0x9e, 0x9f, 0xe1, 0xbc, 0x5e, 0xbe, 0x28, 0x8e, 0x98, 0x9f, - 0xad, 0xd3, 0xea, 0x80, 0xcb, 0xdf, 0x2f, 0xae, 0x72, 0x4a, 0xb5, 0x2d, 0xcb, 0x6a, 0x41, 0x11, - 0x67, 0x4e, 0x68, 0x9d, 0x80, 0x4e, 0x24, 0xad, 0x59, 0x59, 0xc6, 0xb7, 0x6a, 0x7e, 0x7b, 0x2e, - 0xce, 0xa0, 0x20, 0x5d, 0xe2, 0xa9, 0xa3, 0xaf, 0x7c, 0x64, 0x71, 0xa6, 0xe9, 0x50, 0x04, 0x79, - 0x36, 0xc7, 0xb9, 0xfc, 0x8c, 0xce, 0x70, 0xbd, 0xc1, 0x36, 0x6f, 0xf8, 0x20, 0x83, 0xe1, 0x69, - 0x19, 0xb4, 0x0e, 0x7f, 0x1d, 0xb5, 0x51, 0x2e, 0x23, 0x6a, 0xc3, 0xdb, 0x6b, 0xfc, 0xa8, 0xad, - 0x33, 0xd2, 0xf8, 0x32, 0x35, 0x3e, 0xb5, 0xe4, 0x04, 0xef, 0xce, 0x48, 0xe7, 0xd2, 0xc4, 0x45, - 0xa2, 0xa3, 0xb3, 0xa5, 0xde, 0xa0, 0x77, 0xa8, 0x65, 0x87, 0x18, 0xf3, 0xc5, 0x12, 0x9c, 0xe8, - 0x20, 0x63, 0x39, 0xb5, 0xb2, 0x10, 0xa7, 0x36, 0x8f, 0x44, 0xd3, 0xce, 0xf1, 0xb0, 0x8b, 0xf3, - 0x8d, 0x0a, 0x87, 0x66, 0x26, 0xe7, 0x67, 0x9b, 0xc7, 0xa0, 0x08, 0xa7, 0x71, 0xd4, 0xf1, 0xe6, - 0x1f, 0x04, 0xbf, 0x1a, 0xa3, 0x10, 0x6a, 0x73, 0x5c, 0x62, 0x55, 0xb1, 0x65, 0xc3, 0x0b, 0xae, - 0xc3, 0x3f, 0xfc, 0x97, 0xd0, 0xd9, 0x93, 0xde, 0x5d, 0x91, 0x8b, 0x62, 0x7c, 0x27, 0x86, 0x58, - 0x42, 0xcc, 0xae, 0xc7, 0xb8, 0xc4, 0xea, 0xa3, 0xc3, 0x9c, 0xf2, 0xa6, 0xf0, 0xcc, 0x75, 0xbb, - 0x3e, 0x44, 0x3d, 0x2f, 0x92, 0x4d, 0x75, 0x01, 0x92, 0xbe, 0xca, 0x6f, 0xf3, 0xd9, 0x0b, 0xd2, - 0x1c, 0xae, 0x2a, 0x01, 0x1e, 0xa1, 0x10, 0xca, 0x42, 0xcf, 0x6d, 0xb3, 0x8e, 0xe0, 0x2f, 0x98, - 0xf5, 0x26, 0xae, 0x56, 0x1a, 0x4c, 0x5e, 0xde, 0x38, 0xae, 0x35, 0x76, 0x03, 0xcd, 0x19, 0x5b, - 0x9e, 0x3b, 0x8a, 0x43, 0x2b, 0xd0, 0xf0, 0x1f, 0x6d, 0x33, 0x98, 0x50, 0x15, 0x79, 0x66, 0x60, - 0x85, 0xfe, 0x08, 0x4a, 0x47, 0xe2, 0xc2, 0xeb, 0x3c, 0x2b, 0x72, 0x23, 0xd3, 0xb1, 0x7c, 0x7f, - 0x64, 0x05, 0xe3, 0x10, 0xff, 0xf1, 0xad, 0x09, 0xd3, 0x0a, 0xec, 0xc0, 0xb4, 0x42, 0xcf, 0xb1, - 0x82, 0x70, 0x84, 0xff, 0x78, 0xb9, 0x66, 0x85, 0x23, 0x0f, 0x2a, 0x9d, 0x50, 0x8b, 0xac, 0xb1, - 0xb8, 0xf0, 0x9a, 0x48, 0x1b, 0x5b, 0x91, 0xed, 0x03, 0x78, 0x80, 0x29, 0xae, 0x02, 0x96, 0x3b, - 0x8e, 0x34, 0x18, 0x64, 0xe4, 0xa6, 0x0e, 0x20, 0x33, 0xb6, 0xfc, 0x20, 0x76, 0x1c, 0xcb, 0xf6, - 0xc6, 0x9a, 0xb8, 0x89, 0x0d, 0x11, 0x2b, 0x74, 0x46, 0x00, 0xdc, 0x77, 0x34, 0x20, 0xc8, 0xf1, - 0xc7, 0xf2, 0xc6, 0xab, 0x2d, 0xd7, 0x09, 0x81, 0x1a, 0x6f, 0xe4, 0x7d, 0x05, 0xe5, 0x7e, 0xa8, - 0xf1, 0x2b, 0xaf, 0x0c, 0xa1, 0xd6, 0xd5, 0x02, 0xcb, 0x09, 0x9d, 0xd8, 0xb7, 0x7c, 0x4f, 0xa3, - 0x8b, 0xe0, 0x00, 0x5c, 0x47, 0x96, 0x07, 0xf4, 0xf3, 0xab, 0xe4, 0x8b, 0x03, 0x1c, 0xb3, 0x3c, - 0x2f, 0x84, 0x62, 0x37, 0x1c, 0x89, 0xab, 0x44, 0x65, 0x6c, 0x8f, 0x01, 0x5c, 0xe4, 0x07, 0x48, - 0xd6, 0x58, 0x5e, 0x65, 0xad, 0x0d, 0x4c, 0x71, 0xc6, 0x3e, 0xf4, 0xb1, 0x1d, 0x47, 0x5c, 0x39, - 0x1b, 0x3c, 0x82, 0xe8, 0x59, 0x63, 0x18, 0x08, 0xae, 0x81, 0x2f, 0xae, 0x92, 0xad, 0xe0, 0x91, - 0x61, 0x60, 0x60, 0x84, 0x17, 0x3a, 0x56, 0x14, 0xc5, 0x8e, 0x6d, 0x39, 0x91, 0xab, 0x89, 0x1b, - 0x87, 0xef, 0x5a, 0xb6, 0x1f, 0x02, 0xa1, 0x2e, 0x90, 0xe5, 0x8b, 0x8b, 0xe0, 0x01, 0x48, 0x11, - 0x30, 0x0f, 0xdc, 0x68, 0x8d, 0xe8, 0x8f, 0x40, 0x42, 0x5f, 0x39, 0x1e, 0xa0, 0xe3, 0x69, 0xe2, - 0x26, 0xc4, 0x64, 0xdb, 0x0e, 0xc2, 0x04, 0xd1, 0x23, 0x9b, 0xc6, 0x38, 0x02, 0xbf, 0x49, 0x2c, - 0xb1, 0x02, 0x7a, 0x87, 0x29, 0x4a, 0x14, 0x05, 0x1f, 0x43, 0x03, 0x3b, 0x20, 0xae, 0xe2, 0xcd, - 0x96, 0xb4, 0x86, 0x96, 0x33, 0x72, 0xb4, 0xbe, 0x4a, 0x51, 0x65, 0xa7, 0x52, 0x77, 0x10, 0xc4, - 0x98, 0x1a, 0xd5, 0x7a, 0x04, 0x1a, 0xe9, 0x05, 0x30, 0x5c, 0xe8, 0x06, 0x6f, 0x20, 0x1a, 0x21, - 0x4a, 0x63, 0x40, 0x99, 0x6e, 0xe2, 0x4d, 0x42, 0x83, 0x5e, 0x23, 0x90, 0x75, 0x0a, 0xfa, 0xe8, - 0x00, 0x4a, 0xc0, 0x02, 0xd0, 0x1c, 0xdf, 0x05, 0x24, 0xdd, 0xd8, 0x01, 0x45, 0x03, 0xf9, 0x8a, - 0x1b, 0xa7, 0x01, 0x74, 0xc7, 0x8f, 0x22, 0xba, 0x85, 0x41, 0x8a, 0xba, 0x0a, 0xed, 0x03, 0x6f, - 0x6e, 0x9b, 0x96, 0x17, 0x04, 0x80, 0xe7, 0x18, 0x15, 0xd8, 0xa5, 0x07, 0x02, 0xb9, 0x86, 0x9b, - 0x1b, 0x8c, 0x41, 0x35, 0x9c, 0xc0, 0xff, 0x0a, 0xb0, 0x07, 0x0d, 0xe1, 0x57, 0xa9, 0x43, 0x91, - 0x83, 0x8a, 0xea, 0x86, 0xa8, 0x9e, 0x8e, 0x43, 0xea, 0x89, 0x37, 0xa9, 0x30, 0x23, 0x54, 0x3a, - 0x2b, 0x0c, 0xef, 0xc0, 0x2a, 0x3c, 0x1f, 0x19, 0x3f, 0xc6, 0x46, 0xfc, 0x26, 0x90, 0x1a, 0xc3, - 0x10, 0x11, 0x22, 0xea, 0x87, 0x2b, 0x6c, 0x36, 0x42, 0x58, 0xa1, 0xe3, 0x69, 0xe2, 0x56, 0xab, - 0x7a, 0xe8, 0x20, 0xc4, 0x51, 0xf0, 0x26, 0x04, 0xdb, 0x45, 0x3c, 0xa2, 0x08, 0xda, 0x02, 0x1b, - 0x01, 0x08, 0x5d, 0x09, 0x9c, 0x89, 0xcf, 0xa6, 0x5a, 0x2c, 0x2b, 0xa9, 0x1a, 0x9e, 0x79, 0x01, - 0x4e, 0xaa, 0x78, 0xd0, 0x78, 0x31, 0x05, 0x27, 0x5d, 0x56, 0x1a, 0x3c, 0xbf, 0x61, 0xd9, 0x16, - 0xdc, 0x4a, 0xed, 0x26, 0x3c, 0x23, 0x78, 0xed, 0x3a, 0xef, 0xa2, 0xd7, 0xde, 0xbb, 0x00, 0x5e, - 0x1c, 0x07, 0xdf, 0x1c, 0x0f, 0x5e, 0x1d, 0x07, 0xdf, 0xa9, 0xd6, 0xc1, 0x6a, 0x27, 0xf8, 0x49, - 0x3f, 0xbb, 0x78, 0x61, 0x90, 0x6f, 0x02, 0xa7, 0xc8, 0x7d, 0x93, 0x70, 0x48, 0xba, 0x13, 0x6c, - 0x2a, 0xbd, 0xed, 0x92, 0x7c, 0x10, 0x0b, 0xfc, 0x53, 0x9c, 0xd2, 0x1a, 0x05, 0x0f, 0x45, 0x2b, - 0xd3, 0x8d, 0xa2, 0xb9, 0xe9, 0x06, 0xc0, 0x3e, 0xcf, 0x71, 0xc1, 0x12, 0xcc, 0x51, 0x64, 0xba, - 0x20, 0x35, 0x17, 0x4c, 0x39, 0xc2, 0x97, 0x51, 0x74, 0x67, 0xba, 0xee, 0x08, 0x24, 0x87, 0xad, - 0xc2, 0xc0, 0x0f, 0x5c, 0x0d, 0x1b, 0x8c, 0x82, 0x28, 0xf4, 0xa1, 0x56, 0xa3, 0x36, 0x2b, 0x84, - 0xa3, 0x80, 0x81, 0x52, 0xad, 0x06, 0xa3, 0x51, 0xab, 0x3b, 0x82, 0xa2, 0xd5, 0x50, 0xcc, 0x1a, - 0x0a, 0x07, 0x01, 0xd7, 0x4f, 0x6b, 0xc4, 0x87, 0xe3, 0x14, 0x81, 0xc0, 0x09, 0x21, 0x07, 0x1d, - 0xa6, 0x13, 0x84, 0x63, 0xe4, 0x35, 0x78, 0x85, 0x40, 0x00, 0x82, 0x06, 0x9e, 0x6b, 0x7b, 0x0e, - 0xd6, 0x22, 0x10, 0xaa, 0x83, 0xbf, 0x84, 0x8a, 0xec, 0x0d, 0xef, 0xa6, 0xec, 0x8d, 0xcf, 0xd0, - 0x5b, 0x50, 0x23, 0xbb, 0x9b, 0xbc, 0xbb, 0x49, 0x95, 0xf0, 0xf7, 0xd3, 0x1a, 0x58, 0x06, 0xfc, - 0x55, 0x78, 0x65, 0x83, 0x5f, 0x80, 0x3e, 0x75, 0x17, 0x42, 0xca, 0x54, 0x90, 0x22, 0xb0, 0x91, - 0x0d, 0x50, 0x7d, 0x74, 0xf6, 0xe3, 0x00, 0x88, 0x40, 0x2b, 0x09, 0xa1, 0xb1, 0x6b, 0x8e, 0x03, - 0xfe, 0xb7, 0x84, 0x7f, 0x9a, 0x5a, 0xac, 0x8d, 0x83, 0x3b, 0xec, 0xa5, 0xa9, 0xb8, 0x28, 0xa8, - 0xc2, 0xb5, 0x3c, 0x3a, 0x52, 0x68, 0x5b, 0xfe, 0xd8, 0x03, 0xba, 0xc1, 0x1b, 0x8d, 0xec, 0xc0, - 0x05, 0x0a, 0xc0, 0xa9, 0x3b, 0x18, 0x32, 0xdc, 0xa8, 0xc4, 0x67, 0x59, 0xa1, 0x89, 0x8a, 0xc7, - 0xc6, 0xaa, 0x29, 0xe7, 0xaa, 0x8a, 0xfa, 0xf5, 0x8f, 0x2c, 0xfd, 0x7f, 0x0d, 0xfb, 0xf3, 0x35, - 0x2c, 0xb2, 0x9f, 0xac, 0x60, 0xbf, 0x5d, 0xec, 0xbf, 0x55, 0xbf, 0xfe, 0x04, 0x2d, 0xee, 0xd1, - 0x2c, 0x5c, 0x0e, 0x50, 0xdd, 0x1f, 0x06, 0x10, 0xf7, 0x72, 0xcc, 0x43, 0x14, 0x80, 0xa2, 0xa8, - 0x06, 0xd1, 0x2c, 0x80, 0x5c, 0x09, 0x9c, 0x78, 0x74, 0x35, 0xb2, 0x28, 0x9c, 0x8c, 0x2e, 0x21, - 0xf0, 0x3b, 0x14, 0xf1, 0xe1, 0xe2, 0x69, 0x98, 0x87, 0x68, 0xe3, 0x6b, 0x0c, 0x77, 0x63, 0x5e, - 0x8a, 0x5e, 0x9e, 0x5a, 0x5e, 0x81, 0xa3, 0x87, 0xa4, 0x01, 0xc0, 0xc2, 0x43, 0x10, 0x68, 0x3c, - 0x46, 0xf9, 0x91, 0x7c, 0xa0, 0x1a, 0x60, 0x96, 0x47, 0x05, 0xa0, 0x34, 0x14, 0x87, 0x31, 0x55, - 0xa3, 0xfc, 0x04, 0x9e, 0x43, 0x68, 0x30, 0x02, 0x8d, 0x93, 0xe5, 0x1e, 0x5d, 0x5d, 0xfe, 0xf7, - 0x8d, 0x0b, 0x68, 0x5c, 0xb9, 0x2e, 0xe0, 0x05, 0x48, 0x5e, 0xc2, 0xb0, 0xe1, 0x18, 0x93, 0x98, - 0x11, 0xc2, 0x82, 0x5c, 0x8b, 0xc0, 0x7a, 0xd7, 0x90, 0xb9, 0x38, 0xa2, 0xd8, 0xc2, 0x24, 0x28, - 0xb8, 0x02, 0xa4, 0x2f, 0x61, 0x04, 0xd4, 0x2a, 0xa4, 0x14, 0xb4, 0x9d, 0x80, 0x06, 0xd7, 0x84, - 0x14, 0x95, 0x22, 0x68, 0x62, 0x89, 0x7f, 0x09, 0x71, 0x18, 0x32, 0x14, 0xc7, 0x07, 0xe2, 0x46, - 0x88, 0x19, 0x60, 0x13, 0x59, 0x34, 0x86, 0x7b, 0x45, 0x2d, 0xe1, 0x8a, 0xd0, 0x5d, 0x50, 0x8c, - 0xd1, 0x25, 0x26, 0x65, 0x1e, 0xb2, 0x80, 0xf8, 0x82, 0xac, 0x70, 0x25, 0xb9, 0x97, 0x0e, 0x45, - 0x32, 0x0c, 0xf4, 0xd0, 0x21, 0x20, 0x2c, 0x81, 0x17, 0x1e, 0x02, 0xb5, 0x23, 0xec, 0x19, 0x10, - 0xe9, 0x36, 0x91, 0xee, 0x61, 0x39, 0x75, 0xf5, 0xdf, 0x60, 0xe0, 0x1d, 0x21, 0x00, 0x1f, 0x49, - 0xc4, 0x47, 0x9a, 0x14, 0x01, 0x06, 0x63, 0x7a, 0x00, 0xe0, 0xd7, 0xbc, 0x0e, 0xb8, 0x01, 0x75, - 0x11, 0xdd, 0x91, 0x23, 0x01, 0x7f, 0x44, 0x43, 0x25, 0x5c, 0xc1, 0x30, 0xf1, 0x1a, 0x3a, 0x80, - 0xee, 0x6b, 0xd7, 0xc6, 0x26, 0x3e, 0xa1, 0x1e, 0x38, 0x08, 0x26, 0x22, 0xca, 0xb1, 0xbf, 0x73, - 0x09, 0xe0, 0x03, 0xfe, 0x8a, 0xbc, 0x82, 0x86, 0x98, 0x4e, 0xd0, 0x23, 0x0d, 0x47, 0xb5, 0xa8, - 0x5c, 0x50, 0x1a, 0x90, 0x80, 0xc7, 0xf4, 0x8a, 0x59, 0x36, 0xa1, 0x16, 0xe1, 0x73, 0x18, 0xe2, - 0x73, 0xe8, 0x5d, 0x39, 0x3c, 0xec, 0xbf, 0x76, 0xdd, 0x77, 0x88, 0xff, 0x15, 0x0c, 0x19, 0x11, - 0xe5, 0x41, 0x78, 0x09, 0xcf, 0x90, 0x21, 0x42, 0xf1, 0x98, 0xc6, 0xe1, 0xcf, 0x44, 0x06, 0xde, - 0x7f, 0xc2, 0xe8, 0x4d, 0x2a, 0x2b, 0x96, 0x76, 0x3a, 0x5a, 0x1b, 0x5c, 0x0a, 0x11, 0xd6, 0x22, - 0x05, 0xf9, 0x5e, 0x09, 0x59, 0x5f, 0x36, 0xd2, 0x0f, 0x11, 0xbc, 0xd0, 0x09, 0x45, 0x57, 0xa4, - 0xfe, 0x5c, 0xa1, 0xc8, 0x2f, 0x1b, 0x0d, 0x00, 0xd4, 0xc0, 0xad, 0x71, 0xc5, 0x78, 0x03, 0x34, - 0x44, 0x23, 0x54, 0xbf, 0x91, 0x83, 0x1a, 0x8b, 0x98, 0x81, 0x2a, 0x86, 0x94, 0x20, 0xf9, 0xf8, - 0xec, 0xd0, 0x33, 0xa6, 0x2a, 0xf0, 0x7c, 0x55, 0x5b, 0xc0, 0xa5, 0x6a, 0x16, 0x90, 0x8f, 0x4a, - 0x6b, 0x69, 0x4c, 0x48, 0x5a, 0xd5, 0x95, 0xb4, 0xb3, 0xcb, 0xc6, 0xf4, 0xa4, 0x31, 0x72, 0xd3, - 0x84, 0xca, 0x90, 0x9b, 0x8e, 0x8f, 0x73, 0x14, 0x87, 0x24, 0xdd, 0xe0, 0xf5, 0x74, 0x6d, 0x05, - 0xd7, 0x31, 0x42, 0x3e, 0x07, 0x40, 0x0b, 0xa9, 0x2a, 0x66, 0xb0, 0xf4, 0xe0, 0x8a, 0x07, 0x2a, - 0x0f, 0x49, 0x1d, 0x3d, 0x1a, 0x2b, 0x20, 0x23, 0xc5, 0xac, 0x9e, 0x60, 0x7a, 0x88, 0x0c, 0x8e, - 0x42, 0xb3, 0x04, 0x97, 0xa4, 0x2c, 0x75, 0xd5, 0x45, 0x00, 0x57, 0xb8, 0xaf, 0x19, 0x60, 0xb6, - 0x04, 0x57, 0xd2, 0xb4, 0x77, 0xae, 0x7b, 0x45, 0x55, 0x8d, 0x38, 0x71, 0x51, 0xa5, 0x25, 0x4b, - 0xdf, 0x18, 0xbf, 0xf6, 0xdf, 0xf9, 0xaf, 0x51, 0xe3, 0x5d, 0xc3, 0x19, 0x7f, 0xe5, 0x19, 0x94, - 0x12, 0x1a, 0xc0, 0x2b, 0xc8, 0xbf, 0x94, 0x57, 0xac, 0xf6, 0xd4, 0x77, 0xff, 0xb0, 0x1e, 0xec, - 0x37, 0x34, 0xbc, 0xd7, 0xfe, 0x25, 0x30, 0x75, 0x0c, 0x35, 0x50, 0x0b, 0x46, 0xe9, 0x19, 0xfe, - 0x3b, 0x80, 0xec, 0x1a, 0x94, 0x28, 0x1b, 0x10, 0x39, 0x0d, 0xd7, 0x79, 0xdd, 0x2a, 0x71, 0x1d, - 0xe8, 0xfc, 0x2e, 0xbc, 0xc2, 0xee, 0x0d, 0xb6, 0x62, 0x39, 0xab, 0xad, 0x7c, 0xc6, 0x08, 0xfd, - 0x93, 0x63, 0x10, 0x8b, 0xe0, 0x86, 0xc2, 0x04, 0xbe, 0x19, 0x81, 0xe5, 0xa1, 0x56, 0x87, 0x06, - 0x4a, 0x81, 0x1e, 0xb8, 0x46, 0x63, 0x1d, 0x5e, 0xd0, 0x92, 0x23, 0x03, 0x8d, 0x0f, 0x39, 0xec, - 0x19, 0xd0, 0x84, 0x66, 0x39, 0x63, 0x2c, 0x03, 0xe5, 0x05, 0x85, 0xc0, 0x76, 0x28, 0x08, 0x00, - 0xeb, 0x90, 0x4a, 0x8c, 0xb0, 0x36, 0xe4, 0x42, 0x07, 0xf2, 0xe0, 0x42, 0xda, 0x6a, 0x60, 0x86, - 0xad, 0xf1, 0x27, 0x1b, 0xdb, 0x61, 0x6d, 0x68, 0x85, 0x38, 0x84, 0x63, 0x08, 0xad, 0xf2, 0x0d, - 0x94, 0x93, 0x01, 0x12, 0x01, 0xf5, 0xb8, 0x0a, 0x0d, 0x30, 0x3b, 0xd0, 0x06, 0x03, 0x5e, 0xde, - 0x8d, 0xde, 0x00, 0xb2, 0x1c, 0x29, 0x0f, 0xf1, 0xc4, 0x29, 0x19, 0x66, 0xbf, 0x38, 0x11, 0x00, - 0x38, 0x63, 0x54, 0x4c, 0x24, 0x03, 0x3d, 0x26, 0x14, 0x5b, 0x68, 0x67, 0x63, 0x24, 0x07, 0x2d, - 0x2a, 0xe2, 0x78, 0x44, 0xd8, 0x03, 0xcc, 0x1c, 0x67, 0xbc, 0x08, 0x0a, 0x75, 0x9b, 0x08, 0x1d, - 0x5d, 0x11, 0x45, 0xa3, 0x4b, 0x24, 0x16, 0xed, 0x0a, 0x69, 0x19, 0x69, 0x72, 0xc4, 0x86, 0xbb, - 0xaf, 0x1e, 0x58, 0xd7, 0xac, 0x2d, 0x7f, 0x0e, 0x9a, 0x85, 0xb3, 0x4a, 0x70, 0x5f, 0xe8, 0x35, - 0x21, 0xe4, 0xe2, 0x24, 0xcf, 0x87, 0x99, 0x8c, 0x43, 0x13, 0x67, 0xf4, 0xe8, 0xa3, 0x20, 0x05, - 0x7d, 0xc6, 0x49, 0x94, 0x1d, 0xcc, 0x61, 0xde, 0x88, 0xd3, 0x01, 0xd0, 0x33, 0x98, 0x3c, 0x8c, - 0x4d, 0x52, 0x4c, 0x60, 0x60, 0x84, 0x1f, 0xb2, 0x82, 0x40, 0x70, 0xf2, 0x82, 0x48, 0x40, 0x6f, - 0x98, 0xd6, 0xa2, 0xbe, 0x42, 0xc8, 0xa7, 0x42, 0x9a, 0xbf, 0x80, 0xfe, 0xc3, 0x9c, 0x3f, 0x80, - 0xb6, 0x61, 0xea, 0xa2, 0x45, 0xe3, 0x65, 0x0e, 0x1e, 0x13, 0xc6, 0x03, 0xe6, 0x07, 0x72, 0x44, - 0x9c, 0x79, 0x8d, 0x3e, 0xbd, 0x71, 0xd1, 0x8b, 0x02, 0xf4, 0x60, 0x0e, 0x53, 0xaa, 0x31, 0x8e, - 0x6c, 0xe1, 0x9c, 0xdd, 0xb2, 0x5d, 0x9a, 0xc2, 0x8c, 0x1c, 0x9c, 0xcf, 0xe3, 0x94, 0x68, 0x1c, - 0x5e, 0x12, 0x8a, 0xa1, 0x98, 0x56, 0xa2, 0x61, 0x63, 0x78, 0xa3, 0xc9, 0x99, 0x86, 0x53, 0x38, - 0xb4, 0x24, 0xf0, 0x05, 0xd0, 0x58, 0x44, 0x8d, 0xb9, 0xc3, 0x67, 0xb5, 0x38, 0x57, 0x04, 0xb0, - 0xe8, 0xa9, 0x80, 0xe0, 0xc8, 0x4d, 0x31, 0x24, 0x62, 0x17, 0x77, 0xce, 0xc7, 0xa4, 0xf1, 0xf8, - 0x1d, 0x27, 0x9b, 0x9a, 0x40, 0x83, 0xf3, 0x01, 0x31, 0x31, 0xb1, 0x02, 0x62, 0x37, 0x58, 0x74, - 0x8d, 0xab, 0x29, 0xaa, 0x3d, 0xf1, 0x00, 0x71, 0xd7, 0xfe, 0xf4, 0x86, 0xc7, 0x60, 0x7f, 0x6e, - 0x72, 0xae, 0x9b, 0xbe, 0x89, 0x5c, 0x87, 0x1b, 0x66, 0x68, 0x80, 0x35, 0xf2, 0x11, 0xd0, 0xe2, - 0x8c, 0x75, 0x46, 0xa9, 0x43, 0xab, 0x0c, 0x70, 0x01, 0x98, 0x36, 0x71, 0x19, 0x88, 0x84, 0x89, - 0x3b, 0xdd, 0x68, 0xe9, 0xc1, 0x21, 0x0f, 0x82, 0x4e, 0xd6, 0xa3, 0x3f, 0x96, 0x4b, 0x18, 0x46, - 0xd4, 0x1e, 0x27, 0xb0, 0x36, 0x18, 0x19, 0xa0, 0x86, 0xd6, 0x33, 0xc7, 0xa5, 0x0d, 0x08, 0x1d, - 0xf8, 0x21, 0x2f, 0x28, 0x39, 0x0d, 0x61, 0xf9, 0x9f, 0xd6, 0xc4, 0x01, 0xa8, 0xf0, 0xa0, 0x81, + 0xa6, 0x8e, 0xbd, 0xf9, 0x30, 0xcb, 0x37, 0xd1, 0x22, 0xa9, 0x1e, 0xa6, 0xf6, 0x2c, 0xbf, 0x63, + 0xc5, 0x32, 0xcd, 0xef, 0xa7, 0xab, 0x24, 0x8e, 0x59, 0x36, 0xdb, 0xe4, 0x25, 0xc0, 0xcf, 0xb3, + 0x69, 0x74, 0x53, 0xe6, 0xe9, 0xb6, 0x62, 0x33, 0x1a, 0x97, 0x77, 0xfb, 0x68, 0x26, 0x59, 0xcc, + 0x3e, 0x4c, 0x4d, 0x67, 0x6f, 0xa5, 0x79, 0x14, 0xb3, 0xc2, 0x10, 0xf7, 0x69, 0xb4, 0xac, 0x94, + 0xb7, 0x1b, 0xb6, 0xcc, 0x0b, 0xb6, 0x33, 0xef, 0xd9, 0xcd, 0xfb, 0xa4, 0x32, 0xa3, 0x2c, 0x59, + 0x47, 0x08, 0xd5, 0x04, 0x4c, 0x52, 0x73, 0x9d, 0xc7, 0x6c, 0x7a, 0x93, 0x57, 0xab, 0xd9, 0xd1, + 0x8a, 0x83, 0x9e, 0x53, 0x84, 0x1c, 0x6a, 0x8e, 0x35, 0x2e, 0x35, 0x16, 0x95, 0x0c, 0x30, 0x31, + 0xf3, 0x6d, 0x05, 0xec, 0x58, 0x22, 0x47, 0xd8, 0xec, 0xe9, 0x2d, 0x6f, 0xf2, 0x02, 0x70, 0x34, + 0x8b, 0x28, 0x4e, 0xb6, 0xe5, 0xd4, 0xb7, 0x9f, 0xcd, 0x04, 0x6b, 0x5c, 0xb6, 0x16, 0xd4, 0xc2, + 0x93, 0xa4, 0xb0, 0x87, 0x88, 0x98, 0xa5, 0xd1, 0xc3, 0xd4, 0xb4, 0x9c, 0xa0, 0x9c, 0xf5, 0x97, + 0x2e, 0xf2, 0x34, 0x2f, 0xa6, 0x9f, 0x7b, 0x9e, 0x37, 0x5b, 0x82, 0x30, 0xcd, 0x32, 0xf9, 0xc8, + 0x38, 0x0b, 0x41, 0xf2, 0xb7, 0x80, 0x50, 0xca, 0x96, 0xd5, 0x34, 0xda, 0x56, 0xb9, 0x2c, 0x28, + 0x08, 0x03, 0x2a, 0xa9, 0x45, 0x50, 0x00, 0xc4, 0x2a, 0xb9, 0x63, 0xb3, 0x8a, 0x7d, 0xa8, 0x88, + 0xf5, 0x59, 0x35, 0x35, 0x27, 0xf0, 0x1f, 0x20, 0x2a, 0xd1, 0xaa, 0x8a, 0x28, 0x2b, 0x81, 0xdb, + 0xeb, 0x29, 0x3d, 0x41, 0x0f, 0xf6, 0xd3, 0xc0, 0x1e, 0xce, 0xcc, 0x75, 0x79, 0xb4, 0xee, 0x58, + 0xb9, 0x94, 0x2f, 0x8c, 0xb0, 0x3f, 0x29, 0x58, 0xa1, 0xa1, 0x53, 0x5d, 0xef, 0x51, 0x98, 0x2a, + 0xdf, 0x4c, 0xed, 0xfd, 0xa3, 0xaa, 0x20, 0xf9, 0xe5, 0xb9, 0x7d, 0x5c, 0xc4, 0x52, 0x62, 0x92, + 0x39, 0xb2, 0xfc, 0x46, 0x1a, 0x1c, 0x9d, 0x1d, 0xd5, 0xf0, 0x8a, 0xbf, 0x49, 0xc8, 0xef, 0xd9, + 0xc3, 0xb2, 0x00, 0x5b, 0x28, 0x35, 0x52, 0x80, 0x9d, 0xfd, 0xcc, 0x18, 0xc3, 0xbf, 0x2a, 0xdf, + 0xdd, 0xe4, 0x1f, 0xcc, 0x72, 0x15, 0xc5, 0xa0, 0xe5, 0xb6, 0xe6, 0x62, 0x2f, 0xcd, 0xd6, 0x4c, + 0xc7, 0xf2, 0xa0, 0xfb, 0xc8, 0x7e, 0xd6, 0x5f, 0x6f, 0xef, 0xf7, 0x7f, 0xfb, 0xe3, 0x41, 0x56, + 0xc5, 0x74, 0x85, 0x26, 0xb7, 0x03, 0x7d, 0xaf, 0x90, 0x3b, 0x24, 0xf7, 0x8c, 0x95, 0xe5, 0x60, + 0xec, 0x3f, 0x1b, 0xee, 0xad, 0x18, 0x8d, 0x20, 0x4a, 0x77, 0x37, 0xd1, 0xe2, 0xfd, 0x6d, 0x91, + 0x6f, 0xb3, 0xd8, 0xe4, 0xca, 0xb4, 0x02, 0x31, 0x0d, 0x6c, 0x03, 0x86, 0x77, 0x6c, 0xb8, 0x58, + 0x13, 0x7f, 0x28, 0x34, 0x79, 0xea, 0x6c, 0x3e, 0x68, 0xc0, 0xfb, 0x24, 0xd6, 0x50, 0xe3, 0xe0, + 0xbf, 0xa0, 0xab, 0xe4, 0xa4, 0x7a, 0x2d, 0x9c, 0x3c, 0xe8, 0x33, 0x86, 0x7f, 0xc5, 0xed, 0x0d, + 0x81, 0x85, 0x3f, 0x96, 0x3b, 0x1a, 0xce, 0x96, 0x29, 0xfb, 0x60, 0xc6, 0x49, 0xc1, 0x16, 0x24, + 0x54, 0x18, 0x7b, 0xbb, 0xce, 0xb8, 0x24, 0xd0, 0x52, 0xd6, 0xd1, 0x07, 0x53, 0x58, 0xcb, 0xc4, + 0xbe, 0x5b, 0xd1, 0x3b, 0x37, 0x99, 0x09, 0xd4, 0x92, 0x9e, 0x46, 0x69, 0x72, 0x0b, 0x46, 0x08, + 0x3d, 0x48, 0x13, 0x46, 0x58, 0x7e, 0xa8, 0x6f, 0x03, 0x13, 0xc0, 0x19, 0x78, 0x19, 0x0a, 0x9b, + 0xf3, 0x6c, 0xd0, 0xea, 0x96, 0x06, 0x0a, 0x5e, 0x18, 0xf2, 0xc1, 0x5c, 0xa4, 0x79, 0xc9, 0x76, + 0x71, 0x52, 0x6e, 0x50, 0x49, 0x10, 0xd5, 0x43, 0xf5, 0xdb, 0x77, 0x5a, 0x13, 0x3a, 0x26, 0xd8, + 0xfd, 0xba, 0x9c, 0x2e, 0x40, 0x67, 0x59, 0x21, 0xad, 0xd3, 0x71, 0x9c, 0xb1, 0x1b, 0xce, 0x16, + 0xdb, 0xa2, 0x84, 0xd7, 0x4d, 0x9e, 0x50, 0xa5, 0xa0, 0x8e, 0x94, 0x6b, 0xf6, 0xcb, 0xb6, 0xac, + 0x92, 0xe5, 0x83, 0x29, 0xf5, 0x5d, 0x00, 0xe0, 0xc6, 0x6a, 0x73, 0x4d, 0x17, 0xe8, 0x0b, 0x35, + 0x95, 0x83, 0x93, 0x57, 0xdf, 0xb5, 0x47, 0xda, 0x44, 0x71, 0x9c, 0x64, 0xb7, 0x53, 0x87, 0xf4, + 0x01, 0xbd, 0xcd, 0xa1, 0xa9, 0x73, 0x60, 0xe0, 0xdb, 0x17, 0x03, 0x94, 0xb3, 0x66, 0x6a, 0x04, + 0x78, 0xa8, 0x90, 0xc5, 0x71, 0xd9, 0x09, 0x09, 0x23, 0x0e, 0x8a, 0x02, 0x30, 0x1b, 0xff, 0x34, + 0x6e, 0x9d, 0x7b, 0x14, 0x31, 0x30, 0xb9, 0x35, 0xe8, 0x90, 0x45, 0x77, 0x87, 0x0a, 0x46, 0xde, + 0xaa, 0xe3, 0x1b, 0x41, 0x6b, 0x00, 0x4a, 0x54, 0x4d, 0x89, 0xe2, 0xda, 0x4f, 0x82, 0xe2, 0x18, + 0x07, 0x91, 0x83, 0x63, 0xbe, 0x04, 0x4b, 0x14, 0x18, 0xca, 0xa1, 0xb4, 0x48, 0xf2, 0x61, 0xe9, + 0xe2, 0x9f, 0x99, 0x14, 0xe0, 0x4d, 0x9a, 0x2f, 0xde, 0x8b, 0x01, 0x48, 0x5f, 0x14, 0x5f, 0x19, + 0xc0, 0xd0, 0x12, 0x6d, 0x40, 0x43, 0x23, 0x0d, 0x56, 0xf4, 0x4b, 0x48, 0x82, 0x4a, 0x62, 0xb6, + 0xc8, 0x0b, 0xee, 0xfb, 0xb3, 0x3c, 0x63, 0xcd, 0xb8, 0xc2, 0xd6, 0x0e, 0x49, 0x8d, 0xe3, 0x58, + 0x6a, 0x81, 0x6d, 0xdb, 0x4d, 0x07, 0x2b, 0x5a, 0xa0, 0x14, 0x7a, 0x7a, 0xf8, 0xc1, 0xc2, 0x1e, + 0xdb, 0xb2, 0xd3, 0x72, 0xb9, 0xac, 0x3b, 0x59, 0x09, 0xd0, 0x5b, 0x2b, 0x25, 0x21, 0xf0, 0x57, + 0x6e, 0xff, 0xc9, 0x47, 0xc4, 0x5e, 0xb0, 0x14, 0x4a, 0xd0, 0x89, 0xdd, 0xe6, 0x3b, 0x19, 0x50, + 0xed, 0x67, 0x50, 0x70, 0x93, 0x82, 0xfd, 0x2c, 0x93, 0x9d, 0xa4, 0xd5, 0x56, 0x89, 0x24, 0xae, + 0xef, 0x31, 0xc7, 0xd8, 0x11, 0x6b, 0x96, 0xd1, 0x3a, 0x49, 0x1f, 0xa6, 0x25, 0xd8, 0x90, 0x59, + 0xb2, 0x22, 0x59, 0xee, 0x63, 0xc8, 0x17, 0x92, 0xb4, 0x34, 0x30, 0xff, 0x00, 0x37, 0xbd, 0x8e, + 0x92, 0xcc, 0x28, 0xb7, 0x6b, 0x08, 0x2a, 0x0f, 0xbb, 0x16, 0x9b, 0x01, 0xdd, 0xe8, 0x06, 0x34, + 0x52, 0x60, 0x03, 0x74, 0xa4, 0xd1, 0xa6, 0x64, 0x53, 0xf9, 0x20, 0x25, 0x5f, 0x62, 0x66, 0x40, + 0x78, 0xf0, 0xc0, 0xc4, 0x15, 0xa8, 0x36, 0xf1, 0x7d, 0x74, 0xc8, 0x1b, 0xb2, 0xe9, 0x4d, 0x54, + 0xa0, 0xc8, 0xa3, 0x29, 0xe7, 0xa0, 0x21, 0x79, 0x0f, 0x91, 0x37, 0x4d, 0x32, 0x06, 0x01, 0xe1, + 0x86, 0xd3, 0x70, 0xcf, 0x75, 0x28, 0x04, 0xb6, 0xaf, 0x9c, 0x5d, 0x23, 0x71, 0x0f, 0x94, 0x6a, + 0xbf, 0x72, 0x95, 0x12, 0x77, 0x84, 0x25, 0x45, 0xc3, 0x9a, 0x3d, 0xcf, 0x66, 0xcc, 0x34, 0xba, + 0x61, 0x3d, 0x1e, 0x12, 0xa5, 0xd2, 0xe3, 0x12, 0xe3, 0x45, 0xbc, 0x60, 0x7e, 0x47, 0xb3, 0x03, + 0xf2, 0x87, 0x55, 0x95, 0xaf, 0xa7, 0x66, 0x08, 0xcf, 0x52, 0x19, 0x1c, 0xdf, 0x9d, 0x78, 0xb5, + 0x82, 0x26, 0x19, 0xe2, 0x6e, 0x0a, 0x3d, 0x6d, 0x94, 0xd3, 0xb3, 0xc8, 0x32, 0x14, 0x72, 0x7c, + 0xdb, 0xe6, 0x4e, 0x12, 0xa8, 0x98, 0x51, 0x27, 0x99, 0x6e, 0x85, 0x4d, 0xd0, 0x17, 0x03, 0xda, + 0x52, 0xb1, 0x79, 0x16, 0xa0, 0x68, 0xba, 0xc8, 0x02, 0xb0, 0xcb, 0xa1, 0x67, 0x90, 0xae, 0xd1, + 0xdd, 0x13, 0x17, 0xa6, 0x75, 0x44, 0x05, 0x01, 0x61, 0xf6, 0x64, 0xf4, 0x17, 0x4b, 0x81, 0x1c, + 0xa9, 0x5d, 0xe6, 0x8b, 0x6d, 0x79, 0xac, 0x92, 0x8b, 0x50, 0x16, 0x2b, 0xf1, 0x23, 0xc9, 0x20, + 0xb7, 0xc5, 0x88, 0x06, 0x7f, 0x3c, 0xb0, 0x4c, 0x0d, 0x79, 0xff, 0x59, 0xb2, 0xc6, 0x14, 0x34, + 0x02, 0x35, 0x20, 0x78, 0x3f, 0x57, 0x0f, 0x1b, 0x36, 0x5f, 0xac, 0xd8, 0xe2, 0x3d, 0x74, 0x7d, + 0xd7, 0x6f, 0x13, 0xb3, 0x46, 0xba, 0x4a, 0xa7, 0x6c, 0xbb, 0xbe, 0x61, 0xc5, 0x3b, 0x43, 0x29, + 0xda, 0x44, 0x65, 0x79, 0x0f, 0xdd, 0x5a, 0x85, 0x68, 0x2b, 0xef, 0x8c, 0x92, 0xa5, 0x10, 0xae, + 0x76, 0x87, 0xa2, 0x5f, 0x2c, 0x16, 0xbd, 0x72, 0x57, 0xe2, 0x20, 0xb6, 0x76, 0xe1, 0x9f, 0xcd, + 0x23, 0xa1, 0xeb, 0xda, 0x06, 0xfd, 0xf3, 0x20, 0x1e, 0x42, 0x84, 0xed, 0x78, 0x24, 0x19, 0x1c, + 0x6c, 0x45, 0x66, 0x24, 0x44, 0x57, 0x2d, 0x21, 0x97, 0x4c, 0xfe, 0x0a, 0x2d, 0x83, 0x8b, 0xb1, + 0xb1, 0xbb, 0xbc, 0xd0, 0x2c, 0x97, 0xa7, 0xa6, 0x46, 0x83, 0x4a, 0x5d, 0x36, 0x53, 0xdc, 0x03, + 0x17, 0xcb, 0x14, 0x74, 0x71, 0xc1, 0x56, 0x79, 0x8a, 0xd9, 0xa8, 0x74, 0x47, 0x0c, 0xff, 0x88, + 0x06, 0xc2, 0xcb, 0x29, 0x23, 0x4c, 0xd5, 0xb0, 0x3e, 0x1e, 0x1e, 0x92, 0x3c, 0xea, 0x21, 0xd9, + 0x9d, 0x40, 0x56, 0x31, 0x14, 0x30, 0xb9, 0x5e, 0x70, 0xce, 0xf2, 0x97, 0xf6, 0x00, 0x9f, 0x7b, + 0xe3, 0xc9, 0x98, 0x2d, 0x66, 0x8d, 0x7d, 0x5b, 0x8b, 0x2a, 0x93, 0xd9, 0x22, 0x3e, 0x76, 0x53, + 0x45, 0x4d, 0xaf, 0xed, 0x8a, 0x5c, 0xd1, 0xec, 0xb6, 0x48, 0xc8, 0x74, 0x21, 0xc1, 0x30, 0x59, + 0x16, 0x4f, 0xdd, 0x56, 0x49, 0x59, 0xc1, 0x1c, 0x69, 0xea, 0xf0, 0xb2, 0x22, 0xbf, 0x57, 0x9b, + 0xe0, 0xab, 0xa8, 0xa7, 0x61, 0x8d, 0x66, 0xec, 0xdd, 0x22, 0x65, 0x51, 0x41, 0x93, 0x08, 0xaa, + 0x12, 0xf1, 0x5f, 0x62, 0x81, 0xee, 0x8d, 0x99, 0x11, 0xb9, 0x8d, 0x59, 0x4f, 0x6a, 0xf0, 0x68, + 0xda, 0x35, 0xfe, 0x53, 0xb2, 0xae, 0x6e, 0x44, 0x6c, 0xe5, 0x60, 0x40, 0x2d, 0x2f, 0xba, 0x2f, + 0xa2, 0xcd, 0x14, 0x2f, 0xc7, 0xf2, 0x12, 0xe1, 0xb2, 0x71, 0x5c, 0x4d, 0x4c, 0x2e, 0xea, 0xf4, + 0x4c, 0xd5, 0x59, 0xde, 0x02, 0x4b, 0xf6, 0xcb, 0x3c, 0x47, 0xae, 0x29, 0x7a, 0xee, 0xd6, 0x0e, + 0x8b, 0xeb, 0xf9, 0x41, 0xd0, 0xdd, 0x7f, 0x1e, 0xdd, 0x80, 0xd8, 0xa5, 0x2a, 0xc6, 0x1e, 0xfe, + 0xd9, 0x5b, 0x37, 0x79, 0xfc, 0xd0, 0x72, 0xca, 0x69, 0xb2, 0x51, 0x0d, 0xfd, 0xd0, 0x5f, 0xb3, + 0x78, 0x69, 0x2f, 0xbb, 0x39, 0x87, 0x73, 0xda, 0xb6, 0xb8, 0x87, 0xc4, 0x22, 0x88, 0x68, 0x94, + 0x63, 0xf5, 0x48, 0xb1, 0x95, 0x21, 0xe2, 0x05, 0xf4, 0xa8, 0x9f, 0x65, 0x7b, 0x0b, 0x23, 0x27, + 0x02, 0x76, 0x5b, 0xe1, 0x69, 0x64, 0xdb, 0x3d, 0x84, 0x5b, 0x98, 0xc3, 0x1a, 0x4a, 0x97, 0xa7, + 0xe1, 0x89, 0xbd, 0x76, 0xb5, 0x43, 0x07, 0xc5, 0xad, 0x92, 0x05, 0xf0, 0x0b, 0xf4, 0xf6, 0x66, + 0x0b, 0x11, 0x21, 0xeb, 0xcb, 0xc5, 0xb8, 0x75, 0x09, 0x55, 0xb3, 0x7b, 0xf2, 0x32, 0x25, 0xe6, + 0x75, 0x32, 0xd8, 0x4e, 0xf4, 0x22, 0x26, 0x1c, 0x53, 0x18, 0x88, 0x4a, 0x22, 0x7d, 0x85, 0x34, + 0xbd, 0xa5, 0x1d, 0x8e, 0x8f, 0xa8, 0x03, 0x92, 0xdc, 0xbd, 0x08, 0x54, 0x1f, 0x99, 0xbd, 0x40, + 0x73, 0xf3, 0x26, 0x2a, 0x76, 0xaa, 0x21, 0xdf, 0x82, 0xd2, 0x62, 0x8c, 0x68, 0x4c, 0x17, 0x4b, + 0x88, 0x59, 0x4f, 0xb4, 0xcd, 0xb2, 0x2a, 0x58, 0xb5, 0x58, 0x1d, 0x8a, 0xf5, 0x84, 0x45, 0xf0, + 0x84, 0x55, 0x04, 0x5e, 0x74, 0xc8, 0xaa, 0x74, 0xa4, 0xfe, 0x2c, 0x09, 0xc0, 0x06, 0x08, 0x52, + 0x87, 0x23, 0xc8, 0xe4, 0x5e, 0xea, 0x11, 0x95, 0x10, 0x78, 0x50, 0x46, 0xd8, 0xd4, 0x85, 0x30, + 0xeb, 0xc6, 0x02, 0xb5, 0x61, 0x83, 0xee, 0xc1, 0xbc, 0xaa, 0x9d, 0x18, 0x90, 0xe9, 0x1d, 0x9b, + 0x12, 0xf0, 0x7c, 0xb1, 0x5c, 0x01, 0xff, 0x20, 0xe1, 0xee, 0x4b, 0x51, 0x51, 0x15, 0xda, 0x63, + 0x76, 0x33, 0x96, 0xc6, 0x1d, 0x74, 0xa0, 0x11, 0x1f, 0x76, 0x02, 0x0d, 0xf2, 0x1c, 0x1d, 0x9d, + 0x6a, 0xd6, 0x2b, 0x0e, 0xe7, 0xfb, 0x42, 0xd5, 0x9f, 0xd5, 0xd3, 0x3d, 0x99, 0xa9, 0x8c, 0x60, + 0x84, 0xbb, 0xdb, 0xf6, 0x7c, 0xad, 0xb5, 0xdc, 0x41, 0xb6, 0x2e, 0x56, 0x5c, 0x48, 0x22, 0xd0, + 0xdc, 0x64, 0x3b, 0x45, 0x6a, 0xa4, 0x84, 0xc2, 0xde, 0x76, 0xea, 0xda, 0x89, 0xba, 0x98, 0xd2, + 0x00, 0x83, 0xb6, 0x40, 0x8d, 0xd1, 0x10, 0x66, 0xdd, 0x9b, 0x26, 0x90, 0x82, 0xb9, 0x69, 0x3b, + 0x45, 0x87, 0xec, 0xfd, 0xf6, 0x16, 0x67, 0x68, 0x27, 0x6d, 0x87, 0xfb, 0x63, 0x1a, 0xb0, 0x4e, + 0x88, 0x31, 0xe7, 0xe1, 0x92, 0x6a, 0xa6, 0x27, 0x2d, 0x19, 0x71, 0xc8, 0x66, 0x79, 0x9f, 0x80, + 0xd2, 0x2a, 0x72, 0x9a, 0xf6, 0xe4, 0x23, 0x94, 0x55, 0xf4, 0x0e, 0x2a, 0x52, 0x0d, 0xaf, 0x5f, + 0x27, 0xd4, 0xcc, 0xa2, 0x1e, 0x00, 0x72, 0x08, 0xbf, 0x9c, 0x81, 0x7d, 0x82, 0x7f, 0x81, 0x89, + 0x22, 0x77, 0x5d, 0x6b, 0x98, 0x9d, 0xa5, 0x52, 0x89, 0xfc, 0x31, 0xe9, 0xbd, 0x8a, 0xa0, 0x0c, + 0xd9, 0xed, 0xc2, 0x83, 0x75, 0x9e, 0x6e, 0x2f, 0xd1, 0x40, 0xa1, 0x0e, 0x71, 0x8f, 0x0a, 0xf3, + 0x16, 0x29, 0x83, 0x3e, 0x03, 0x67, 0x6c, 0xc7, 0xec, 0xd6, 0x40, 0xb5, 0xd4, 0x6c, 0xe3, 0x73, + 0xc6, 0xd8, 0xb0, 0x67, 0xe9, 0xad, 0x15, 0x1e, 0x89, 0xb5, 0xdd, 0xf0, 0xe8, 0x77, 0xc3, 0xa3, + 0x9c, 0x85, 0x8e, 0x30, 0xd5, 0xa6, 0x85, 0xa0, 0x4d, 0xcf, 0x3a, 0x00, 0xd7, 0xc6, 0x76, 0x12, + 0x86, 0xad, 0x39, 0x93, 0x84, 0xd2, 0x8d, 0x1a, 0x76, 0x70, 0xcf, 0xa6, 0xfd, 0x5e, 0x32, 0xe1, + 0x36, 0x7c, 0x9c, 0x28, 0x1f, 0x7c, 0x25, 0xcc, 0x93, 0x31, 0x35, 0x9e, 0xd2, 0x95, 0xc5, 0x2f, + 0x4e, 0xe8, 0x0d, 0x9f, 0x7c, 0x3e, 0xd6, 0x45, 0x22, 0x4b, 0x3c, 0xf1, 0xb8, 0x87, 0xe3, 0x1d, + 0x76, 0x87, 0xdc, 0xb9, 0x4b, 0xca, 0xe4, 0x26, 0x49, 0x71, 0x11, 0x98, 0xcf, 0xdf, 0x6b, 0x01, + 0xf3, 0xd9, 0x95, 0x6a, 0x6b, 0x7e, 0xbf, 0x0a, 0xa2, 0x53, 0x85, 0x41, 0xfe, 0xb6, 0x66, 0x71, + 0x12, 0x69, 0xe5, 0xa2, 0x60, 0x2c, 0xd3, 0x22, 0x50, 0xc3, 0x81, 0x92, 0x76, 0x4c, 0x80, 0xf4, + 0xe1, 0x8e, 0x32, 0xb1, 0x6e, 0x50, 0x70, 0x0e, 0x82, 0x82, 0x30, 0x6a, 0xd9, 0x39, 0xc4, 0x85, + 0x06, 0x35, 0x87, 0xf1, 0x9f, 0xcd, 0xf2, 0x9b, 0x5f, 0xc0, 0x85, 0x9a, 0xcb, 0x04, 0x62, 0x18, + 0x28, 0x27, 0xcc, 0x77, 0x9b, 0x85, 0x08, 0xa2, 0x09, 0x74, 0xfd, 0x00, 0x57, 0x91, 0x24, 0xe2, + 0x44, 0x1b, 0x03, 0x44, 0x86, 0xb3, 0x85, 0x27, 0x85, 0xee, 0xd3, 0xc4, 0x85, 0x41, 0x48, 0xc4, + 0x1d, 0x87, 0xeb, 0x1c, 0xc2, 0x75, 0x1e, 0x87, 0x1b, 0xd8, 0x63, 0x82, 0x2b, 0xa3, 0xe9, 0xc9, + 0xd8, 0x21, 0x63, 0x5b, 0xbd, 0xb0, 0xd3, 0x8e, 0x29, 0x8d, 0x73, 0xaa, 0xe3, 0x15, 0xae, 0xb4, + 0x47, 0x77, 0x51, 0x92, 0x62, 0x16, 0xae, 0x2c, 0xd2, 0xa8, 0xcb, 0x2d, 0x2a, 0x44, 0x2d, 0x02, + 0x97, 0x59, 0x0d, 0xc4, 0xda, 0xc8, 0xf0, 0xc0, 0x8f, 0x8a, 0xa5, 0x93, 0xd6, 0x32, 0x88, 0xba, + 0xb4, 0xc3, 0x57, 0x31, 0x1e, 0x5d, 0x94, 0x69, 0x32, 0xed, 0x71, 0xf8, 0xcc, 0xb0, 0x87, 0x32, + 0xc3, 0xf1, 0x23, 0xfc, 0x23, 0xfb, 0x5b, 0x05, 0x2b, 0x37, 0x39, 0x18, 0xf4, 0x1d, 0xdb, 0xf5, + 0xc8, 0xf9, 0xa0, 0x91, 0x58, 0x9e, 0x39, 0x16, 0xb5, 0x6c, 0xb9, 0x5a, 0x7d, 0xd8, 0x31, 0xea, + 0x25, 0x06, 0x89, 0xee, 0xae, 0x73, 0xf2, 0xa8, 0x63, 0x56, 0x49, 0xf6, 0xd0, 0x66, 0xce, 0x69, + 0x31, 0x8f, 0xc2, 0x09, 0x8a, 0xb9, 0xbd, 0x0a, 0x42, 0x7c, 0xa7, 0x54, 0xba, 0xad, 0xa0, 0x87, + 0xfa, 0xa9, 0x44, 0x46, 0xc8, 0x44, 0x15, 0x6d, 0x70, 0xea, 0xa4, 0xf3, 0x68, 0xaa, 0x6a, 0x77, + 0x80, 0xf1, 0xd9, 0xdb, 0xae, 0x9d, 0x1f, 0x34, 0x53, 0x73, 0x8d, 0x2b, 0xed, 0xf9, 0x19, 0xdf, + 0x54, 0xfa, 0xcb, 0x7f, 0x9c, 0x9f, 0x89, 0x0d, 0xaf, 0x73, 0x44, 0x55, 0x5b, 0xa4, 0x30, 0x39, + 0x9f, 0xe3, 0x63, 0xbd, 0x8f, 0x05, 0x86, 0xa9, 0x25, 0xf1, 0x1c, 0xef, 0x98, 0x35, 0x89, 0x72, + 0xaa, 0xe3, 0x6b, 0x55, 0xa2, 0x93, 0x0e, 0xe3, 0x6a, 0xbc, 0x44, 0x57, 0x1a, 0x51, 0xc3, 0x38, + 0xb9, 0x13, 0xad, 0xd4, 0x3d, 0xb2, 0x56, 0x13, 0x72, 0x56, 0x1a, 0xd0, 0x3a, 0xd7, 0x71, 0x6d, + 0x0d, 0x95, 0x9b, 0xe9, 0x12, 0x34, 0x66, 0x13, 0x3c, 0x6d, 0xed, 0x82, 0x6e, 0x0d, 0x01, 0x68, + 0x62, 0x4b, 0xec, 0xaf, 0xd1, 0x40, 0xf3, 0xe7, 0x97, 0x69, 0xb2, 0x78, 0xaf, 0x55, 0xb9, 0xb6, + 0xdd, 0xe0, 0xca, 0xbf, 0xf6, 0x90, 0x6f, 0x0b, 0x8d, 0x1a, 0xe0, 0x00, 0xcf, 0x2f, 0xce, 0xcf, + 0xa0, 0x63, 0x1f, 0x3e, 0x67, 0x84, 0x50, 0x5f, 0xcd, 0xca, 0xc1, 0x81, 0x70, 0xb3, 0x8e, 0x8f, + 0xc4, 0x71, 0x14, 0xf2, 0x69, 0xef, 0x08, 0xae, 0x9c, 0x2e, 0x27, 0x7a, 0x86, 0x53, 0xb9, 0xc3, + 0x2d, 0x0b, 0xc0, 0xc3, 0x93, 0x09, 0x8f, 0x7d, 0xe3, 0x43, 0x76, 0x4d, 0x12, 0xd1, 0xa1, 0xde, + 0x84, 0x20, 0xf6, 0xfe, 0x28, 0x4f, 0x22, 0xe2, 0x08, 0xab, 0x68, 0x61, 0x52, 0xf2, 0x32, 0xa2, + 0x3e, 0x1a, 0xf7, 0x01, 0xba, 0x16, 0x47, 0x55, 0x84, 0x72, 0xc5, 0x3d, 0x4a, 0x70, 0x7e, 0xf0, + 0xa4, 0x5f, 0xfc, 0x2b, 0xf9, 0x2e, 0xd1, 0xae, 0x59, 0xb5, 0xdd, 0x9c, 0x9f, 0x45, 0xbd, 0xcc, + 0x41, 0x1c, 0xfa, 0x2a, 0x68, 0x44, 0x9a, 0x54, 0x6a, 0x90, 0x76, 0xdf, 0xb2, 0x6a, 0xfe, 0x3f, + 0x37, 0x69, 0x04, 0xc3, 0x81, 0x61, 0xcf, 0xb3, 0x3c, 0xdf, 0xb0, 0x0c, 0x14, 0x66, 0x55, 0xb0, + 0xe5, 0xdc, 0x3a, 0x03, 0x8b, 0xaa, 0x2e, 0xbe, 0x03, 0x31, 0x94, 0x47, 0x86, 0xf9, 0x24, 0x68, + 0xdb, 0x0d, 0x90, 0xc2, 0x2e, 0xfe, 0x49, 0xb7, 0xdf, 0x0f, 0x70, 0x55, 0x55, 0x9b, 0x72, 0x7a, + 0x76, 0x76, 0x9b, 0x54, 0xab, 0xed, 0x8d, 0xb5, 0xc8, 0xd7, 0x67, 0xdf, 0xa4, 0x5b, 0x8c, 0xcb, + 0x0b, 0x56, 0x9c, 0x29, 0x52, 0x3e, 0xbb, 0x4f, 0xde, 0x27, 0xc0, 0xb2, 0xf7, 0xc9, 0xd1, 0x41, + 0xdb, 0x9c, 0x47, 0x37, 0xa6, 0x23, 0x22, 0xab, 0xed, 0xda, 0x84, 0xc8, 0x70, 0x4a, 0xa3, 0x79, + 0x4f, 0x50, 0x6a, 0x8d, 0x0c, 0x76, 0x2e, 0x32, 0x57, 0x13, 0x7c, 0xc6, 0x91, 0x6e, 0x5c, 0x45, + 0xa0, 0x83, 0x30, 0x86, 0x35, 0xcb, 0xb6, 0xa8, 0xeb, 0xe9, 0x5c, 0x64, 0xcf, 0x97, 0xb4, 0x70, + 0x85, 0xdb, 0xcc, 0xdf, 0xa0, 0xd4, 0x31, 0xa9, 0x71, 0xc1, 0x2f, 0x8c, 0x75, 0xb0, 0x05, 0xe8, + 0x70, 0x0c, 0x9b, 0xa3, 0x76, 0xd2, 0xa5, 0xb9, 0xdb, 0x92, 0x7b, 0x18, 0x56, 0xa8, 0x45, 0xc2, + 0x58, 0xa5, 0xc6, 0xa9, 0x1e, 0x24, 0xdf, 0x54, 0x5c, 0x09, 0x3b, 0x50, 0x57, 0x6e, 0xdb, 0xd0, + 0x4c, 0xf7, 0xe2, 0x92, 0x07, 0x6a, 0xb4, 0x6e, 0xd4, 0x58, 0x18, 0xc8, 0xed, 0x33, 0x2d, 0x39, + 0x10, 0xad, 0x55, 0x49, 0x20, 0xe0, 0xe6, 0xfb, 0xa8, 0x51, 0xdb, 0xd0, 0xf3, 0x31, 0x76, 0x54, + 0xe4, 0x2e, 0x25, 0xe8, 0x34, 0x29, 0x2b, 0x60, 0x5f, 0xa5, 0x38, 0xce, 0x36, 0x4b, 0x8e, 0xc1, + 0x3a, 0xbf, 0x29, 0x3e, 0xcd, 0x43, 0xa8, 0x19, 0x4a, 0x1f, 0x3c, 0x0c, 0x16, 0xa2, 0x29, 0x3e, + 0x3e, 0xae, 0x5b, 0xcd, 0xd4, 0xf9, 0x94, 0x42, 0x35, 0xde, 0xb9, 0x2c, 0x93, 0x58, 0x74, 0x55, + 0xd6, 0xf0, 0x2f, 0xae, 0xaf, 0xbf, 0xff, 0xf6, 0xb8, 0xcf, 0xac, 0xe1, 0x50, 0x17, 0xad, 0x5e, + 0xf1, 0xd5, 0x94, 0x05, 0xd1, 0xb9, 0xfe, 0x12, 0x27, 0x6e, 0xdc, 0x43, 0x83, 0x3c, 0xbf, 0xd7, + 0x10, 0x26, 0x1d, 0x8a, 0x20, 0x6b, 0xd1, 0x71, 0x64, 0xbd, 0x3e, 0x16, 0x71, 0xc8, 0xe3, 0x7e, + 0x05, 0xfd, 0x9d, 0xe4, 0xca, 0xc5, 0xea, 0x1e, 0x92, 0xdf, 0x88, 0xaa, 0x27, 0x90, 0xad, 0x98, + 0x72, 0x6b, 0xa2, 0x4e, 0x46, 0x5a, 0x97, 0xc8, 0xb1, 0x4e, 0x40, 0x22, 0x68, 0xb5, 0x43, 0xa9, + 0xbb, 0x6a, 0xcd, 0xe4, 0x58, 0xaf, 0x61, 0x22, 0xb8, 0x47, 0x40, 0x75, 0x91, 0x03, 0xf3, 0x27, + 0xdf, 0x51, 0xbf, 0x9a, 0x4c, 0xfa, 0x11, 0xf6, 0xc0, 0x3a, 0x4e, 0x63, 0x04, 0x7f, 0xa5, 0xd3, + 0x38, 0xc5, 0xfd, 0x7a, 0xa0, 0x5e, 0xf7, 0xf8, 0x08, 0x65, 0xdc, 0x51, 0x4a, 0xee, 0xfc, 0x71, + 0xe4, 0x64, 0xf9, 0x9f, 0x4e, 0xd1, 0x63, 0x10, 0x54, 0x63, 0xa8, 0xd5, 0xec, 0x84, 0x41, 0x24, + 0x9a, 0x6c, 0xa5, 0x9f, 0x46, 0x0b, 0x48, 0xac, 0xe1, 0xe1, 0x4a, 0x0f, 0xc4, 0xae, 0x4d, 0xca, + 0x2a, 0x26, 0x23, 0x40, 0xad, 0x68, 0x3c, 0xf8, 0xaf, 0x4b, 0x08, 0x12, 0xb8, 0x4b, 0x33, 0xd7, + 0xeb, 0x01, 0x3e, 0xd9, 0xcc, 0xce, 0xcf, 0x7a, 0xdc, 0xcd, 0x23, 0xbe, 0x4c, 0x17, 0xd3, 0x22, + 0xad, 0x2f, 0x81, 0x11, 0x36, 0x28, 0x5a, 0xf2, 0x19, 0xad, 0x26, 0x37, 0x59, 0x8f, 0x66, 0x3c, + 0xab, 0x63, 0x66, 0xcd, 0xb3, 0x26, 0x99, 0x65, 0x35, 0xd3, 0xe3, 0x8b, 0xeb, 0x0a, 0x66, 0xda, + 0x9c, 0xbd, 0x90, 0xdb, 0xe3, 0xc1, 0x9c, 0x24, 0x4a, 0xcb, 0xa3, 0x19, 0x0e, 0xc1, 0xe2, 0x82, + 0x43, 0x36, 0xb3, 0xa2, 0x04, 0xd7, 0x0f, 0x9d, 0xb4, 0xd6, 0x16, 0x59, 0x8d, 0x36, 0x9f, 0xb5, + 0x43, 0x1e, 0xcb, 0xe7, 0xf9, 0x4f, 0xf0, 0x4f, 0xea, 0x3a, 0xc0, 0x6f, 0xc9, 0x4e, 0x79, 0xce, + 0xb7, 0x88, 0xb2, 0x56, 0xd2, 0x07, 0x9c, 0x3e, 0x99, 0x39, 0x77, 0x0c, 0x46, 0x18, 0x09, 0x82, + 0x79, 0x34, 0x77, 0x78, 0xaa, 0xd1, 0x90, 0x04, 0x2e, 0xae, 0x11, 0x24, 0x71, 0x3b, 0x63, 0x15, + 0xa8, 0xda, 0xfb, 0xe3, 0xac, 0x3e, 0x95, 0xc3, 0x89, 0x08, 0xf8, 0x07, 0xd0, 0x28, 0x20, 0xfd, + 0xc1, 0x64, 0x2a, 0xa9, 0x49, 0x9d, 0xaf, 0x63, 0xfc, 0x32, 0x31, 0x9c, 0x89, 0x60, 0xf9, 0x64, + 0xb2, 0x0f, 0x33, 0xaa, 0xce, 0xbb, 0xc8, 0x72, 0xc8, 0x9c, 0x1a, 0xe5, 0x93, 0xd6, 0x45, 0x6e, + 0xb4, 0x0b, 0xb2, 0xc7, 0xba, 0x7a, 0xad, 0xf0, 0xc0, 0xa0, 0xfa, 0x55, 0x8f, 0x4b, 0x05, 0xe6, + 0xdc, 0xb8, 0xd8, 0xfe, 0x88, 0x40, 0x4e, 0x08, 0x43, 0x02, 0xf8, 0x23, 0x84, 0xc1, 0x05, 0xf1, + 0x77, 0x01, 0xf1, 0xe5, 0xf5, 0x9b, 0x5e, 0x8e, 0xf7, 0x70, 0x9b, 0x5b, 0x50, 0x74, 0x87, 0x21, + 0xa7, 0x88, 0xd6, 0xe5, 0x6f, 0x27, 0x07, 0x81, 0xfc, 0x81, 0xb4, 0x5c, 0x23, 0x38, 0xd0, 0xd7, + 0x65, 0x72, 0xbb, 0xe5, 0xa7, 0x64, 0x9e, 0x40, 0x92, 0x0a, 0xf2, 0xfc, 0x0c, 0x67, 0xf1, 0xf2, + 0x45, 0x71, 0xc4, 0xfc, 0x48, 0x9e, 0x56, 0x07, 0x5c, 0xfe, 0x7e, 0x71, 0x95, 0x53, 0xaa, 0x6d, + 0x59, 0x56, 0x0b, 0x8a, 0x38, 0xaa, 0x42, 0xab, 0x02, 0x74, 0x90, 0x69, 0xcd, 0xca, 0x32, 0xba, + 0x55, 0xf3, 0xdb, 0x73, 0x71, 0x74, 0x05, 0xe9, 0x12, 0x4f, 0x1d, 0x7d, 0xe5, 0x23, 0x8b, 0xa3, + 0x50, 0x87, 0x22, 0xc8, 0xb3, 0x05, 0xce, 0xdc, 0xe7, 0x74, 0xf4, 0xeb, 0x35, 0xb6, 0x79, 0xcd, + 0x07, 0x19, 0x0c, 0x4f, 0xcb, 0xa0, 0x75, 0x66, 0xec, 0xa8, 0x8d, 0x72, 0x19, 0x51, 0x1b, 0xde, + 0x5e, 0xe3, 0x27, 0x74, 0x9d, 0x91, 0xc6, 0x17, 0xa5, 0xf1, 0xa9, 0x25, 0x27, 0x78, 0x77, 0x46, + 0x3a, 0x97, 0x26, 0x2e, 0x09, 0x1d, 0x9d, 0x2d, 0xf5, 0x06, 0xbd, 0x43, 0x2d, 0x3b, 0xc4, 0x98, + 0x2f, 0x8d, 0xe0, 0x44, 0x07, 0x19, 0xcb, 0xa9, 0x95, 0x85, 0x38, 0xb5, 0x79, 0x24, 0x9a, 0x76, + 0x4e, 0x95, 0x5d, 0x9c, 0x6f, 0x54, 0x38, 0x34, 0x33, 0x39, 0x3f, 0xdb, 0x3c, 0x06, 0x45, 0x38, + 0x8d, 0xa3, 0x8e, 0x37, 0x7f, 0x2f, 0xf8, 0xd5, 0x18, 0x85, 0x50, 0x9b, 0xe3, 0x12, 0xab, 0x8a, + 0x2d, 0x1b, 0x5e, 0x70, 0x1d, 0xfe, 0xf1, 0xbf, 0x84, 0xce, 0x9e, 0xf4, 0xee, 0x8a, 0x5c, 0x14, + 0xe3, 0x3b, 0x31, 0xc4, 0x12, 0x62, 0x76, 0x3d, 0xc6, 0x25, 0x56, 0x1f, 0x1d, 0xe6, 0x94, 0x37, + 0x85, 0x67, 0xae, 0xdb, 0xf2, 0x9d, 0x6f, 0xaa, 0xd7, 0x13, 0xaa, 0x5c, 0x9d, 0x73, 0xb5, 0x7d, + 0xe3, 0xef, 0x5c, 0x5b, 0x58, 0xc0, 0x38, 0xb8, 0x9f, 0x9c, 0x55, 0x67, 0xac, 0xdc, 0x98, 0xcb, + 0x12, 0x17, 0x79, 0x4b, 0x56, 0xdc, 0x81, 0x19, 0x5e, 0x16, 0x2c, 0xaa, 0x58, 0x0c, 0x2a, 0x5a, + 0xad, 0xb4, 0x4f, 0xeb, 0xdb, 0x90, 0x8f, 0x09, 0x1a, 0xd2, 0x52, 0x9f, 0x2a, 0x5f, 0x14, 0xc9, + 0xa6, 0xba, 0x00, 0x1d, 0xbe, 0xca, 0x6f, 0xf3, 0xf9, 0x73, 0xb2, 0x09, 0x6e, 0x04, 0x01, 0x9e, + 0x29, 0x11, 0x66, 0x40, 0xcf, 0x6d, 0x87, 0x35, 0x86, 0xbf, 0xe0, 0xb0, 0x36, 0x11, 0x60, 0x03, + 0xd3, 0xb2, 0xd7, 0x8e, 0x6b, 0x4d, 0xdc, 0x40, 0x73, 0x26, 0x96, 0xe7, 0x8e, 0xa2, 0xd0, 0x0a, + 0x34, 0xfc, 0x47, 0xdb, 0x25, 0x26, 0x54, 0x8d, 0x3d, 0x33, 0xb0, 0x42, 0x7f, 0x04, 0xa5, 0x23, + 0x71, 0xe1, 0x75, 0x9e, 0x35, 0x76, 0xc7, 0xa6, 0x63, 0xf9, 0xfe, 0xc8, 0x0a, 0x26, 0x21, 0xfe, + 0xe3, 0x5b, 0x2c, 0xa6, 0x15, 0xd8, 0x81, 0x69, 0x85, 0x9e, 0x63, 0x05, 0xe1, 0x08, 0xff, 0xf1, + 0x72, 0xcd, 0x0a, 0x47, 0x1e, 0x54, 0x3a, 0xa1, 0x36, 0xb6, 0x26, 0xe2, 0xc2, 0x6b, 0xc6, 0xda, + 0xc4, 0x1a, 0xdb, 0x3e, 0x80, 0x07, 0x98, 0xe2, 0x2a, 0x60, 0xb9, 0x93, 0xb1, 0x06, 0x83, 0x8c, + 0xdc, 0xd4, 0x01, 0x64, 0x26, 0x96, 0x1f, 0x44, 0x8e, 0x63, 0xd9, 0xde, 0x44, 0x13, 0x37, 0xb1, + 0xb1, 0x63, 0x85, 0xce, 0x08, 0x80, 0xfb, 0x8e, 0x06, 0x04, 0x39, 0xfe, 0x44, 0xde, 0x78, 0xb5, + 0xe5, 0x3a, 0x21, 0x50, 0xe3, 0x8d, 0xbc, 0xaf, 0xa1, 0xdc, 0x0f, 0x35, 0x7e, 0xe5, 0x95, 0x21, + 0xd4, 0xba, 0x5a, 0x60, 0x39, 0xa1, 0x13, 0xf9, 0x96, 0xef, 0x69, 0x74, 0x11, 0x1c, 0x80, 0xeb, + 0xc8, 0xf2, 0x80, 0x7e, 0x7e, 0x95, 0x7c, 0x71, 0x80, 0x63, 0x96, 0xe7, 0x85, 0x50, 0xec, 0x86, + 0x23, 0x71, 0x95, 0xa8, 0x4c, 0xec, 0x09, 0x80, 0x1b, 0xfb, 0x01, 0x92, 0x35, 0x91, 0x57, 0x59, + 0x6b, 0x03, 0x53, 0x9c, 0x89, 0x0f, 0x7d, 0x6c, 0xc7, 0x11, 0x57, 0xce, 0x06, 0x8f, 0x20, 0x7a, + 0xd6, 0x04, 0x06, 0x82, 0x6b, 0xe0, 0x8b, 0xab, 0x64, 0x2b, 0xc4, 0x1a, 0x18, 0x18, 0x18, 0xe1, + 0x85, 0x8e, 0x35, 0x1e, 0x47, 0x8e, 0x6d, 0x39, 0x63, 0x57, 0x13, 0x37, 0x0e, 0xdf, 0xb5, 0x6c, + 0x3f, 0x04, 0x42, 0x5d, 0x20, 0xcb, 0x17, 0x17, 0xc1, 0x03, 0x90, 0x22, 0x60, 0x1e, 0xb8, 0xe3, + 0x35, 0xa2, 0x3f, 0x02, 0x09, 0x7d, 0xed, 0x78, 0x80, 0x8e, 0xa7, 0x89, 0x9b, 0x10, 0x93, 0x6d, + 0x3b, 0x08, 0x13, 0x44, 0x8f, 0x6c, 0x9a, 0xe0, 0x08, 0xfc, 0x26, 0xb1, 0xc4, 0x0a, 0xe8, 0x1d, + 0xa6, 0x28, 0x51, 0x14, 0x7c, 0x04, 0x0d, 0xec, 0x80, 0xb8, 0x8a, 0x37, 0x5b, 0xd2, 0x1a, 0x5a, + 0xce, 0xc8, 0xd1, 0xfa, 0x2a, 0x45, 0x95, 0x9d, 0x4a, 0xdd, 0x41, 0x10, 0x13, 0x6a, 0x54, 0xeb, + 0x11, 0x68, 0xa4, 0x17, 0xc0, 0x70, 0xa1, 0x1b, 0xbc, 0x86, 0x38, 0x8b, 0x28, 0x4d, 0x00, 0x65, + 0xba, 0x89, 0x37, 0x09, 0x0d, 0x7a, 0x8d, 0x40, 0xd6, 0x29, 0xe8, 0xa3, 0x03, 0x28, 0x01, 0x0b, + 0x40, 0x73, 0x7c, 0x17, 0x90, 0x74, 0x23, 0x07, 0x14, 0x0d, 0xe4, 0x2b, 0x6e, 0x9c, 0x06, 0xd0, + 0x1d, 0x7f, 0x3c, 0xa6, 0x5b, 0x18, 0xa4, 0xa8, 0xab, 0xd0, 0x3e, 0xf0, 0x16, 0xb6, 0x69, 0x79, + 0x41, 0x00, 0x78, 0x4e, 0x50, 0x81, 0x5d, 0x7a, 0x20, 0x90, 0x6b, 0xb8, 0xb9, 0xc1, 0x04, 0x54, + 0xc3, 0x09, 0xfc, 0xaf, 0x01, 0x7b, 0xd0, 0x10, 0x7e, 0x95, 0x3a, 0x34, 0x76, 0x50, 0x51, 0xdd, + 0x10, 0xd5, 0xd3, 0x71, 0x48, 0x3d, 0xf1, 0x26, 0x15, 0x66, 0x84, 0x4a, 0x67, 0x85, 0xe1, 0x1d, + 0x58, 0x85, 0xe7, 0x23, 0xe3, 0x27, 0xd8, 0x88, 0xdf, 0x04, 0x52, 0x13, 0x18, 0x62, 0x8c, 0x88, + 0xfa, 0xe1, 0x0a, 0x9b, 0x8d, 0x10, 0x56, 0xe8, 0x78, 0x9a, 0xb8, 0xd5, 0xaa, 0x1e, 0x3a, 0x08, + 0x71, 0x14, 0xbc, 0x0e, 0xc1, 0x76, 0x11, 0x8f, 0xf1, 0x18, 0xda, 0x02, 0x1b, 0x01, 0x08, 0x5d, + 0x09, 0x9c, 0x89, 0xcf, 0xa6, 0x5a, 0x2c, 0x2b, 0xa9, 0x1a, 0x9e, 0x79, 0x01, 0x4e, 0x17, 0x79, + 0x38, 0x7c, 0x3e, 0x83, 0xf0, 0x53, 0x56, 0x1a, 0x3c, 0xbf, 0x66, 0xd9, 0x16, 0xdc, 0x4a, 0xed, + 0x26, 0x3c, 0x23, 0x78, 0xe5, 0x3a, 0x6f, 0xc7, 0xaf, 0xbc, 0xb7, 0x01, 0xbc, 0x38, 0x0e, 0xbe, + 0x39, 0x1e, 0xbc, 0x3a, 0x0e, 0xbe, 0x53, 0xad, 0x83, 0xd5, 0x4e, 0xf0, 0x93, 0x7e, 0x76, 0xf1, + 0xdc, 0x20, 0xdf, 0x04, 0xee, 0x9e, 0xfb, 0x26, 0xe1, 0x90, 0x74, 0x27, 0xd8, 0x54, 0x7a, 0xdb, + 0x25, 0xf9, 0x20, 0x16, 0xf8, 0xa7, 0x38, 0xa5, 0x35, 0x0a, 0x1e, 0x8a, 0x56, 0xa6, 0x3b, 0x1e, + 0x2f, 0x4c, 0x37, 0x00, 0xf6, 0x79, 0x8e, 0x0b, 0x96, 0x60, 0x8e, 0xc6, 0xa6, 0x0b, 0x52, 0x73, + 0xc1, 0x94, 0xc7, 0xf8, 0x32, 0x1a, 0xdf, 0x99, 0xae, 0x3b, 0x02, 0xc9, 0x61, 0xab, 0x30, 0xf0, + 0x03, 0x57, 0xc3, 0x06, 0xa3, 0x60, 0x1c, 0xfa, 0x50, 0xab, 0x51, 0x9b, 0x15, 0xc2, 0x51, 0xc0, + 0x40, 0xa9, 0x56, 0x83, 0xd1, 0xa8, 0xd5, 0x1d, 0x41, 0xd1, 0x6a, 0x28, 0x66, 0x0d, 0x85, 0x83, + 0x80, 0xeb, 0xc7, 0x35, 0xe2, 0xc3, 0x71, 0x1a, 0x83, 0xc0, 0x09, 0x21, 0x07, 0x1d, 0xa6, 0x13, + 0x84, 0x13, 0xe4, 0x35, 0x78, 0x85, 0x40, 0x00, 0x82, 0x06, 0x9e, 0x6b, 0x7b, 0x0e, 0xd6, 0x22, + 0x10, 0xaa, 0x83, 0xbf, 0x84, 0x8a, 0xec, 0x0d, 0xef, 0xa6, 0xec, 0x8d, 0xcf, 0xd0, 0x5b, 0x50, + 0x23, 0xbb, 0x9b, 0xbc, 0xbb, 0x49, 0x95, 0xf0, 0xf7, 0xe3, 0x1a, 0x58, 0x06, 0xfc, 0x55, 0x78, + 0x65, 0x83, 0x5f, 0x80, 0x3e, 0x75, 0x17, 0x42, 0xca, 0x54, 0x90, 0x22, 0xb0, 0x63, 0x1b, 0xa0, + 0xfa, 0xe8, 0xec, 0x27, 0x01, 0x10, 0x81, 0x56, 0x12, 0x42, 0x63, 0xd7, 0x9c, 0x04, 0xfc, 0x6f, + 0x09, 0xff, 0x34, 0xb5, 0x58, 0x9b, 0x04, 0x77, 0xd8, 0x4b, 0x53, 0x71, 0x51, 0x50, 0x85, 0x6b, + 0x79, 0x74, 0xa4, 0xd0, 0xb6, 0xfc, 0x89, 0x07, 0x74, 0x83, 0x37, 0x1a, 0xd9, 0x81, 0x0b, 0x14, + 0x80, 0x53, 0x77, 0x30, 0x64, 0xb8, 0xe3, 0x12, 0x9f, 0x65, 0x85, 0x26, 0x2a, 0x1e, 0x1b, 0xab, + 0xa6, 0x9c, 0xab, 0x2a, 0xea, 0xd7, 0x3f, 0xb3, 0xf4, 0xff, 0x35, 0xec, 0xcf, 0xd7, 0xb0, 0xb1, + 0xfd, 0x64, 0x05, 0xfb, 0x74, 0xb1, 0x7f, 0xaa, 0x7e, 0xfd, 0x09, 0x5a, 0xdc, 0xa3, 0x59, 0xb8, + 0xd0, 0xa1, 0xba, 0x3f, 0x0c, 0x20, 0xee, 0xe5, 0x84, 0x87, 0x28, 0x00, 0x45, 0x51, 0x0d, 0xa2, + 0x59, 0x00, 0xb9, 0x12, 0x38, 0xf1, 0xf1, 0xd5, 0xc8, 0xa2, 0x70, 0x32, 0xba, 0x84, 0xc0, 0xef, + 0x50, 0xc4, 0x87, 0x8b, 0xa7, 0x61, 0x1e, 0xa2, 0x4d, 0xae, 0x31, 0xdc, 0x4d, 0x78, 0x29, 0x7a, + 0x79, 0x6a, 0x79, 0x05, 0x8e, 0x1e, 0x92, 0x06, 0x00, 0x0b, 0x0f, 0x41, 0xa0, 0xf1, 0x18, 0xe5, + 0x8f, 0xe5, 0x03, 0xd5, 0x00, 0xb3, 0x3c, 0x2a, 0x00, 0xa5, 0xa1, 0x38, 0x8c, 0xa9, 0x1a, 0xe5, + 0x27, 0xf0, 0x1c, 0x42, 0x83, 0x11, 0x68, 0x9c, 0x2c, 0xf7, 0xe8, 0xea, 0xf2, 0xbf, 0xaf, 0x5d, + 0x40, 0xe3, 0xca, 0x75, 0x01, 0x2f, 0x40, 0xf2, 0x12, 0x86, 0x0d, 0x27, 0x98, 0xc4, 0x8c, 0x10, + 0x16, 0xe4, 0x5a, 0x04, 0xd6, 0xbb, 0x86, 0xcc, 0xc5, 0x11, 0xc5, 0x16, 0x26, 0x41, 0xc1, 0x15, + 0x20, 0x7d, 0x09, 0x23, 0xa0, 0x56, 0x21, 0xa5, 0xa0, 0xed, 0x04, 0x34, 0xb8, 0x26, 0xa4, 0xa8, + 0x14, 0x41, 0x13, 0x4b, 0xfc, 0x4b, 0x88, 0xc3, 0x90, 0xa1, 0x38, 0x3e, 0x10, 0x37, 0x42, 0xcc, + 0x00, 0x9b, 0xb1, 0x45, 0x63, 0xb8, 0x57, 0xd4, 0x12, 0xae, 0x08, 0xdd, 0x05, 0xc5, 0x18, 0x5d, + 0x62, 0x52, 0xe6, 0x21, 0x0b, 0x88, 0x2f, 0xc8, 0x0a, 0x57, 0x92, 0x7b, 0xe9, 0x50, 0x24, 0xc3, + 0x40, 0x0f, 0x1d, 0x02, 0xc2, 0x12, 0x78, 0xe1, 0x21, 0x50, 0x7b, 0x8c, 0x3d, 0x03, 0x22, 0xdd, + 0x26, 0xd2, 0x3d, 0x2c, 0xa7, 0xae, 0xfe, 0x6b, 0x0c, 0xbc, 0x23, 0x04, 0xe0, 0x23, 0x89, 0xf8, + 0x48, 0xd3, 0x3d, 0xc0, 0x60, 0x42, 0x0f, 0x00, 0xfc, 0x9a, 0xd7, 0x01, 0x37, 0xa0, 0x6e, 0x4c, + 0x77, 0xe4, 0x48, 0xc0, 0x1f, 0xd1, 0x50, 0x09, 0x57, 0x30, 0x4c, 0xbc, 0x86, 0x0e, 0xa0, 0xfb, + 0xca, 0xb5, 0xb1, 0x89, 0x4f, 0xa8, 0x07, 0x0e, 0x82, 0x19, 0x13, 0xe5, 0xd8, 0xdf, 0xb9, 0x04, + 0xf0, 0x01, 0x7f, 0x45, 0x5e, 0x41, 0x43, 0x4c, 0x27, 0xe8, 0x91, 0x86, 0xa3, 0x5a, 0x54, 0x2e, + 0x28, 0x0d, 0x48, 0xc0, 0x13, 0x7a, 0xc5, 0x2c, 0x9b, 0x50, 0x1b, 0xe3, 0x73, 0x18, 0xe2, 0x73, + 0xe8, 0x5d, 0x39, 0x3c, 0xec, 0xbf, 0x72, 0xdd, 0xb7, 0x88, 0xff, 0x15, 0x0c, 0x39, 0x26, 0xca, + 0x83, 0xf0, 0x12, 0x9e, 0x21, 0x43, 0x84, 0xe2, 0x09, 0x8d, 0xc3, 0x9f, 0x89, 0x0c, 0xbc, 0xff, + 0x84, 0xd1, 0x9b, 0x54, 0x56, 0x2c, 0x5a, 0x75, 0xb4, 0x36, 0xb8, 0x14, 0x22, 0xac, 0x45, 0x0a, + 0xf2, 0xbd, 0x12, 0xb2, 0xbe, 0x6c, 0xa4, 0x1f, 0x22, 0x78, 0xa1, 0x13, 0x8a, 0xae, 0x48, 0xfd, + 0xb9, 0x42, 0x91, 0x5f, 0x36, 0x1a, 0x00, 0xa8, 0x81, 0x5b, 0xe3, 0x8a, 0xf1, 0x1a, 0x68, 0x18, + 0x8f, 0x50, 0xfd, 0x46, 0x0e, 0x6a, 0x2c, 0x62, 0x06, 0xaa, 0x18, 0x52, 0x82, 0xe4, 0xe3, 0xb3, + 0x43, 0xcf, 0x98, 0xaa, 0xc0, 0xf3, 0x55, 0x6d, 0x01, 0x97, 0xaa, 0x59, 0x40, 0x3e, 0x2a, 0xad, + 0xa5, 0x31, 0x21, 0x69, 0x55, 0x57, 0xd2, 0xce, 0x2e, 0x1b, 0xd3, 0x93, 0xc6, 0xc8, 0x4d, 0x13, + 0x2a, 0x43, 0x6e, 0x3a, 0x3e, 0xce, 0x51, 0x1c, 0x92, 0x74, 0x83, 0xd7, 0xd3, 0xb5, 0x15, 0x5c, + 0xc7, 0x08, 0xf9, 0x1c, 0x00, 0x2d, 0xa4, 0xaa, 0x98, 0xc1, 0xd2, 0x83, 0x2b, 0x1e, 0xa8, 0x3c, + 0x24, 0x75, 0xf4, 0x68, 0xac, 0x80, 0x8c, 0x14, 0xb3, 0x7a, 0x82, 0xe9, 0x21, 0x32, 0x38, 0x0a, + 0xcd, 0x12, 0x5c, 0x92, 0xb2, 0xd4, 0x55, 0x17, 0x01, 0x5c, 0xe1, 0x8e, 0x6d, 0x80, 0xd9, 0x12, + 0x5c, 0x49, 0xd3, 0xde, 0xba, 0xee, 0x15, 0x55, 0x35, 0xe2, 0xc4, 0xe5, 0xa2, 0x96, 0x2c, 0x7d, + 0x63, 0xf2, 0xca, 0x7f, 0xeb, 0xbf, 0x42, 0x8d, 0x77, 0x0d, 0x67, 0xf2, 0xb5, 0x67, 0x50, 0x4a, + 0x68, 0x00, 0xaf, 0x20, 0xff, 0x52, 0x5e, 0xb1, 0xda, 0x53, 0xdf, 0xfd, 0xc3, 0x7a, 0xb0, 0xdf, + 0xd0, 0xf0, 0x5e, 0xf9, 0x97, 0xc0, 0xd4, 0x09, 0xd4, 0x40, 0x2d, 0x18, 0xa5, 0x67, 0xf8, 0x6f, + 0x01, 0xb2, 0x6b, 0x50, 0xa2, 0x6c, 0x40, 0xe4, 0x34, 0x5c, 0xe7, 0x55, 0xab, 0xc4, 0x75, 0xa0, + 0xf3, 0xdb, 0xf0, 0x0a, 0xbb, 0x37, 0xd8, 0x8a, 0x85, 0xba, 0xb6, 0xf2, 0x19, 0x23, 0xf4, 0x4f, + 0x8e, 0x41, 0x2c, 0x82, 0x1b, 0x0a, 0x13, 0xf8, 0x66, 0x04, 0x96, 0x87, 0x5a, 0x1d, 0x1a, 0x28, + 0x05, 0x7a, 0xe0, 0x1a, 0x8d, 0x75, 0x78, 0x41, 0x4b, 0x1e, 0x1b, 0x68, 0x7c, 0xc8, 0x61, 0xcf, + 0x80, 0x26, 0x34, 0xcb, 0x99, 0x60, 0x19, 0x28, 0x2f, 0x28, 0x04, 0xb6, 0x43, 0x41, 0x00, 0x58, + 0x87, 0x54, 0x62, 0x84, 0xb5, 0x21, 0x17, 0x3a, 0x90, 0x07, 0x17, 0xd2, 0x56, 0x03, 0x33, 0x6c, + 0x8d, 0x3f, 0xd9, 0xd8, 0x0e, 0x6b, 0x43, 0x2b, 0xc4, 0x21, 0x1c, 0x43, 0x68, 0x95, 0x6f, 0xa0, + 0x9c, 0x0c, 0x90, 0x08, 0xa8, 0xc7, 0x55, 0x68, 0x80, 0xd9, 0x81, 0x36, 0x18, 0xf0, 0xf2, 0x76, + 0xf4, 0x1a, 0x90, 0xe5, 0x48, 0x79, 0x88, 0x27, 0x4e, 0xc9, 0x30, 0xfb, 0xc5, 0x89, 0x00, 0xc0, + 0x99, 0xa0, 0x62, 0x22, 0x19, 0xe8, 0x31, 0xa1, 0xd8, 0x42, 0x3b, 0x9b, 0x20, 0x39, 0x68, 0x51, + 0x63, 0x8e, 0xc7, 0x18, 0x7b, 0x80, 0x99, 0xe3, 0x8c, 0x17, 0x41, 0xa1, 0x6e, 0x13, 0xa1, 0xa3, + 0x2b, 0xa2, 0x68, 0x74, 0x89, 0xc4, 0xa2, 0x5d, 0x21, 0x2d, 0x23, 0x4d, 0x8e, 0xd8, 0x70, 0xf7, + 0xe5, 0x03, 0xeb, 0x9a, 0xb5, 0xe5, 0x2f, 0x40, 0xb3, 0x70, 0x56, 0x09, 0xee, 0x0b, 0xbd, 0x26, + 0x84, 0x5c, 0x9c, 0xe4, 0xf9, 0x30, 0x93, 0x71, 0x68, 0xe2, 0x8c, 0x1e, 0x7d, 0x14, 0xa4, 0xa0, + 0xcf, 0x38, 0x89, 0xb2, 0x83, 0x05, 0xcc, 0x1b, 0x71, 0x3a, 0x00, 0x7a, 0x06, 0x93, 0x87, 0x89, + 0x49, 0x8a, 0x09, 0x0c, 0x1c, 0xe3, 0x97, 0xbd, 0x20, 0x10, 0x9c, 0xbc, 0x20, 0x12, 0xd0, 0x1b, + 0xa6, 0xb5, 0xa8, 0xaf, 0x10, 0xf2, 0xa9, 0x90, 0xe6, 0x2f, 0xa0, 0xff, 0x30, 0xe7, 0x0f, 0xa0, + 0x6d, 0x98, 0xba, 0x68, 0xd1, 0x78, 0x59, 0x80, 0xc7, 0x84, 0xf1, 0x80, 0xf9, 0x81, 0x1c, 0x11, + 0x67, 0x5e, 0xa3, 0x8f, 0xaf, 0x5d, 0xf4, 0xa2, 0x00, 0x3d, 0x58, 0xc0, 0x94, 0x6a, 0x82, 0x23, + 0x5b, 0x38, 0x67, 0xb7, 0x6c, 0x97, 0xa6, 0x30, 0x23, 0x07, 0xe7, 0xf3, 0x38, 0x25, 0x9a, 0x84, + 0x97, 0x84, 0x62, 0x28, 0xa6, 0x95, 0x68, 0xd8, 0x18, 0xde, 0x68, 0x72, 0xa6, 0xe1, 0x14, 0x0e, + 0x2d, 0x09, 0x7c, 0x01, 0x34, 0x16, 0x51, 0x63, 0xe1, 0xf0, 0x59, 0x2d, 0xce, 0x15, 0x01, 0x2c, + 0x7a, 0x2a, 0x20, 0x78, 0xec, 0xa6, 0x18, 0x12, 0xb1, 0x8b, 0xbb, 0xe0, 0x63, 0xd2, 0x78, 0xfc, + 0x8e, 0x93, 0x4d, 0x4d, 0xa0, 0xc1, 0xf9, 0x80, 0x98, 0x98, 0x58, 0x01, 0xb1, 0x1b, 0x2c, 0xba, + 0xc6, 0xd5, 0x14, 0xd5, 0x9e, 0x78, 0x80, 0xb8, 0x6b, 0x7f, 0x7c, 0xcd, 0x63, 0xb0, 0xbf, 0x30, + 0x39, 0xd7, 0x4d, 0xdf, 0x44, 0xae, 0xc3, 0x0d, 0x33, 0x34, 0xc0, 0x1a, 0xf9, 0x08, 0x68, 0x71, + 0xc6, 0x3a, 0xa3, 0xd4, 0xa1, 0x55, 0x06, 0xb8, 0x00, 0x4c, 0x9b, 0xb8, 0x0c, 0x44, 0xc2, 0xc4, + 0x9d, 0x6e, 0xb4, 0xf4, 0xe0, 0x90, 0x07, 0x41, 0x27, 0xeb, 0xd1, 0x1f, 0xcb, 0x25, 0x0c, 0xc7, + 0xd4, 0x1e, 0x27, 0xb0, 0x36, 0x18, 0x19, 0xa0, 0x86, 0xd6, 0xb3, 0xc0, 0xa5, 0x0d, 0x08, 0x1d, + 0xf8, 0x65, 0x33, 0x28, 0x39, 0x0d, 0x61, 0xf9, 0x1f, 0xd7, 0xc4, 0x01, 0xa8, 0xf0, 0xa0, 0x81, 0xe3, 0x23, 0xb2, 0x28, 0x31, 0xdf, 0x14, 0x02, 0x0e, 0x68, 0xc2, 0x3f, 0x4a, 0x5d, 0xbe, 0x76, - 0x10, 0x8c, 0x3e, 0xd5, 0x2a, 0xf5, 0x7d, 0xde, 0x51, 0x2a, 0xb0, 0xee, 0x95, 0x3b, 0xba, 0x73, - 0x47, 0xaf, 0xed, 0x77, 0xf6, 0x27, 0xb1, 0xa0, 0xa8, 0xe3, 0x8a, 0xa2, 0x9a, 0x0b, 0x22, 0x1f, - 0x30, 0xd6, 0xe2, 0xc2, 0x87, 0x90, 0x4e, 0x48, 0xd1, 0x11, 0x24, 0x33, 0xc7, 0x45, 0x01, 0x14, - 0xc6, 0x58, 0x43, 0x71, 0x82, 0x29, 0x62, 0x6a, 0xea, 0x97, 0xa0, 0x39, 0x21, 0xa8, 0x0e, 0x2a, + 0x10, 0x8c, 0x3e, 0xd6, 0x2a, 0xf5, 0x43, 0xde, 0x51, 0x2a, 0xb0, 0xee, 0x95, 0x3b, 0xba, 0x73, + 0x47, 0xaf, 0xec, 0xb7, 0xf6, 0x47, 0xb1, 0x54, 0xaa, 0xe3, 0x5a, 0xa9, 0x9a, 0x0b, 0x22, 0x1f, + 0x30, 0xd6, 0xe2, 0xc2, 0x87, 0x90, 0x4e, 0x48, 0xd1, 0x11, 0x24, 0xb3, 0xc0, 0x45, 0x01, 0x14, + 0xc6, 0x44, 0x43, 0x71, 0x82, 0x29, 0x62, 0x6a, 0xea, 0x97, 0xa0, 0x39, 0x21, 0xa8, 0x0e, 0x2a, 0x16, 0x26, 0x5f, 0x3e, 0x6a, 0x55, 0xe8, 0x99, 0xd8, 0xd0, 0xc4, 0xec, 0x0e, 0xf0, 0xa6, 0x72, 0xce, 0xe4, 0xb0, 0x87, 0xc5, 0x25, 0x7f, 0xd0, 0x90, 0xdb, 0x8d, 0xba, 0x9b, 0xfc, 0x01, 0xcb, - 0x20, 0x83, 0x33, 0x23, 0x84, 0x1b, 0x60, 0x47, 0x8f, 0xd8, 0x0a, 0x37, 0xaf, 0x54, 0xf8, 0xeb, - 0x99, 0xfc, 0xc5, 0xe4, 0x0f, 0x26, 0x3e, 0x78, 0x9f, 0xe4, 0x54, 0xf5, 0xb2, 0x5e, 0xba, 0x93, - 0x4c, 0xa1, 0x73, 0x8d, 0xc5, 0x36, 0x65, 0x33, 0x9d, 0xdd, 0xb1, 0x2c, 0x5f, 0x2c, 0xf0, 0x20, - 0x58, 0xb2, 0xe9, 0x96, 0x11, 0x57, 0xc0, 0x39, 0xd8, 0x21, 0x4e, 0xaa, 0xf1, 0xe6, 0xa0, 0xdb, - 0xb3, 0xc7, 0x21, 0x89, 0xd7, 0x09, 0x7c, 0x8a, 0xd4, 0xf4, 0x0e, 0x2e, 0x25, 0xf2, 0x46, 0x18, - 0x0e, 0x45, 0x07, 0xf0, 0x6c, 0x63, 0x37, 0x1a, 0x53, 0xc8, 0x80, 0xa6, 0x81, 0x66, 0xda, 0xd4, - 0xd2, 0x73, 0x78, 0x98, 0x83, 0xd6, 0x9d, 0x22, 0x68, 0x3f, 0xae, 0xbb, 0x5d, 0x85, 0x18, 0xd7, - 0x23, 0x3f, 0xc4, 0x90, 0x4e, 0x43, 0x2b, 0x10, 0xc5, 0xd8, 0x4a, 0xf7, 0x7a, 0xf8, 0x56, 0x19, - 0x6f, 0xdf, 0x74, 0x7c, 0xa4, 0x83, 0x84, 0x5b, 0x77, 0x14, 0x23, 0x5f, 0x09, 0x4c, 0xb4, 0xf0, - 0xaa, 0xa9, 0xe2, 0xf8, 0x5e, 0x3e, 0x42, 0x95, 0xa0, 0xbd, 0xe9, 0xc6, 0xb9, 0x73, 0xd9, 0xb0, - 0xeb, 0x08, 0x3f, 0x25, 0xd1, 0xa2, 0xc3, 0x15, 0xfa, 0xd8, 0x91, 0x33, 0xe2, 0x59, 0x27, 0x71, - 0x4a, 0x82, 0x92, 0xc3, 0xd6, 0x3d, 0xc5, 0x98, 0xca, 0x3b, 0x97, 0xa0, 0x6c, 0x7f, 0xac, 0x9d, - 0x84, 0x23, 0xdb, 0xf3, 0x71, 0xae, 0xc4, 0xb8, 0x40, 0x7c, 0x47, 0x17, 0x7e, 0x92, 0xa6, 0x74, - 0x93, 0xc6, 0xb8, 0xe3, 0x0a, 0xfa, 0x36, 0xbd, 0x8b, 0x0b, 0x3c, 0x4f, 0x94, 0xe4, 0x59, 0x39, - 0xdb, 0xed, 0x8d, 0xcf, 0x67, 0xcb, 0x6d, 0x46, 0x67, 0x71, 0x07, 0x6c, 0xb8, 0x2b, 0x58, 0xb5, - 0x2d, 0x32, 0x6d, 0x91, 0xcf, 0xb7, 0x6b, 0x96, 0x55, 0xd6, 0x2d, 0xab, 0x5e, 0xa5, 0x0c, 0x1f, - 0xbf, 0x7e, 0xf8, 0x6e, 0x01, 0x2d, 0xf6, 0x53, 0xd9, 0x5c, 0xc3, 0xe3, 0x08, 0xaf, 0x93, 0x05, - 0x93, 0x47, 0x3e, 0x06, 0xc3, 0x1d, 0xc2, 0x66, 0xb3, 0xcf, 0x07, 0xcd, 0x9e, 0xf9, 0x70, 0xda, - 0x3c, 0xcf, 0x66, 0x33, 0x66, 0xe1, 0x96, 0xf0, 0x97, 0x03, 0x7e, 0x9f, 0xe9, 0x78, 0xde, 0x45, - 0x37, 0xa0, 0x43, 0x7d, 0x38, 0x43, 0x1f, 0x5a, 0xb4, 0xba, 0x7d, 0x95, 0x94, 0x95, 0x55, 0xb0, - 0x75, 0x7e, 0xc7, 0x06, 0xba, 0x72, 0x92, 0x63, 0x88, 0xad, 0xeb, 0xb3, 0x0f, 0xad, 0xd6, 0xf1, - 0x62, 0xd1, 0x6e, 0x3a, 0x9c, 0xd4, 0x03, 0xd5, 0x48, 0x1c, 0x1f, 0xec, 0xa0, 0xfb, 0xf1, 0x91, - 0xfa, 0xf0, 0x1a, 0xee, 0x6b, 0xce, 0x00, 0xd7, 0x70, 0x37, 0x17, 0x9b, 0x02, 0x53, 0x00, 0x0a, - 0xdf, 0x3a, 0xea, 0x05, 0x41, 0xfb, 0x04, 0xc3, 0x29, 0xe7, 0x5c, 0xc6, 0xee, 0xb5, 0x7f, 0xfc, - 0xfd, 0x6a, 0xf0, 0x2f, 0x3c, 0x7a, 0x37, 0x39, 0x3b, 0xfb, 0x7c, 0x77, 0x9f, 0x64, 0x8b, 0xfc, - 0xde, 0x4a, 0xf3, 0x39, 0xed, 0x6d, 0x59, 0xab, 0xbc, 0xac, 0x70, 0xbb, 0x74, 0x7f, 0x86, 0xfb, - 0xd0, 0xff, 0x1a, 0x4e, 0x97, 0xf8, 0x35, 0x11, 0x08, 0xc6, 0xaa, 0x56, 0x2c, 0x1b, 0x0c, 0xd8, - 0xec, 0x82, 0x59, 0xbf, 0x94, 0x20, 0xcd, 0xe1, 0x50, 0x29, 0xdb, 0xe1, 0x61, 0xac, 0x7f, 0x26, - 0xcb, 0xe4, 0x7b, 0xb1, 0xc1, 0x0c, 0x3d, 0x8c, 0x7e, 0xc4, 0x88, 0x0d, 0x1c, 0xab, 0xbd, 0x4a, - 0x14, 0xff, 0xea, 0x11, 0x61, 0xa0, 0xa2, 0x54, 0xc5, 0x03, 0x12, 0xc6, 0x0b, 0x4d, 0xfd, 0x25, - 0xf0, 0x99, 0x4e, 0x13, 0x5a, 0xfc, 0x93, 0xe7, 0xef, 0xf3, 0x05, 0xb3, 0x92, 0x05, 0xc0, 0xe5, - 0x7b, 0xfc, 0xb3, 0x67, 0xf6, 0x1e, 0x28, 0x00, 0x4c, 0x2b, 0x64, 0x48, 0xdd, 0xba, 0xd3, 0x04, - 0x21, 0xe2, 0x81, 0xa6, 0xa1, 0x75, 0x17, 0xa7, 0x5b, 0x36, 0xab, 0x56, 0x49, 0x69, 0xcd, 0x59, - 0x9a, 0x96, 0x3f, 0x3b, 0xef, 0xad, 0x04, 0xe6, 0x18, 0xc5, 0xeb, 0x1f, 0xdf, 0x5c, 0x19, 0xa2, - 0x1d, 0x6d, 0x1c, 0x43, 0xe3, 0xba, 0xe2, 0x54, 0x87, 0x46, 0x25, 0x2d, 0xfa, 0x72, 0x73, 0xa0, - 0xd0, 0xd6, 0xc3, 0x9d, 0x1d, 0x5f, 0x8d, 0xac, 0x66, 0xb5, 0x2d, 0xfc, 0xef, 0x96, 0x15, 0x0f, - 0xd7, 0x44, 0x70, 0x5e, 0x0c, 0xf4, 0xcf, 0xea, 0x43, 0x6e, 0x20, 0xbe, 0x4a, 0xc1, 0x41, 0xd7, - 0x0d, 0x86, 0x27, 0x96, 0x5f, 0xc5, 0x40, 0x2e, 0x70, 0xdf, 0x28, 0x87, 0x20, 0x00, 0x14, 0x70, - 0xdc, 0x00, 0x9b, 0x17, 0x2c, 0xae, 0x98, 0xb0, 0xad, 0x81, 0x5e, 0x81, 0x0c, 0x8c, 0x4c, 0x1c, - 0x40, 0xd5, 0x5f, 0x96, 0xd3, 0xd8, 0xc2, 0x03, 0xb6, 0x46, 0x8c, 0xe2, 0x78, 0x05, 0xde, 0xbe, - 0xba, 0xa2, 0x23, 0x15, 0x0c, 0x06, 0xa6, 0xed, 0x1e, 0xdd, 0x68, 0xe4, 0x31, 0x84, 0x66, 0xcd, - 0xf0, 0xff, 0x3a, 0xaf, 0x16, 0x17, 0xea, 0x31, 0x1a, 0x1d, 0xbf, 0xee, 0xc8, 0xc5, 0x4f, 0xe2, - 0x08, 0x89, 0x89, 0xc3, 0x63, 0x5c, 0x7a, 0x9f, 0xef, 0xb2, 0x3d, 0x6e, 0xb6, 0x42, 0xbf, 0x7f, - 0xa9, 0xa0, 0x5e, 0x12, 0xac, 0xfa, 0x98, 0x99, 0x68, 0xf7, 0xf9, 0x8e, 0x59, 0xf8, 0xba, 0xef, - 0xeb, 0xf0, 0x02, 0x3b, 0x88, 0xdd, 0xa9, 0xfa, 0x1c, 0xb9, 0x7e, 0xf1, 0x02, 0xf4, 0x03, 0x3f, - 0x7c, 0xcb, 0x6e, 0xab, 0xd5, 0x4b, 0x88, 0x5a, 0x5f, 0xaf, 0xa9, 0x33, 0x32, 0xaa, 0x64, 0x60, - 0x41, 0x49, 0xf5, 0xf0, 0x65, 0x0b, 0x8e, 0x8e, 0x44, 0x00, 0x1f, 0xf8, 0x32, 0xee, 0x4b, 0x9d, - 0x37, 0x9f, 0x1c, 0x69, 0xc3, 0x97, 0xe2, 0x64, 0x2b, 0x03, 0x74, 0x78, 0xb3, 0x61, 0xd9, 0xe2, - 0x72, 0x95, 0xa4, 0x8b, 0x41, 0x8c, 0x6a, 0x8c, 0x0a, 0xd0, 0x9c, 0x77, 0x3c, 0x61, 0x88, 0x2d, - 0x23, 0x7e, 0x8b, 0x5b, 0xdd, 0xac, 0x62, 0x45, 0xf9, 0xe7, 0x99, 0x31, 0xdf, 0xba, 0x26, 0x93, - 0x7d, 0xba, 0x35, 0xff, 0x40, 0x1f, 0x8e, 0x58, 0x1f, 0xd8, 0x03, 0xaa, 0x6a, 0xa3, 0x6c, 0xb5, - 0x2b, 0x07, 0x2b, 0xab, 0x2c, 0x9a, 0x15, 0x95, 0xff, 0x4c, 0xaa, 0xd5, 0x80, 0x1f, 0x28, 0xe7, - 0xe6, 0xf2, 0xc5, 0x17, 0x03, 0xa0, 0xa5, 0x3e, 0xbc, 0xdd, 0xb2, 0x1f, 0xf6, 0x73, 0xf5, 0xde, - 0x58, 0x30, 0x3c, 0x18, 0xa5, 0xe1, 0xf3, 0xd0, 0xe8, 0x01, 0x03, 0x1c, 0x97, 0x50, 0xe4, 0x59, - 0xf3, 0x47, 0x80, 0x3c, 0xc5, 0xd3, 0x18, 0x68, 0x4a, 0x0a, 0xc7, 0x65, 0x8c, 0x02, 0x47, 0x25, - 0x1e, 0x7f, 0x6e, 0x8e, 0xc5, 0x9b, 0xfc, 0x3b, 0x1f, 0xfd, 0x3d, 0xa0, 0x21, 0xf7, 0x21, 0x75, - 0xee, 0xdb, 0xfb, 0x30, 0x7a, 0x71, 0x9e, 0xac, 0xe5, 0x89, 0x37, 0x3a, 0xb0, 0x5e, 0x16, 0xf3, - 0x99, 0xfe, 0xe2, 0xe5, 0x09, 0xc0, 0x2f, 0x5f, 0x50, 0x76, 0xd6, 0x86, 0x58, 0xb2, 0xea, 0xab, - 0xaa, 0x2a, 0x92, 0x9b, 0x6d, 0x05, 0x32, 0xa7, 0x6d, 0x68, 0xdd, 0xd0, 0x75, 0x41, 0xa0, 0x3c, - 0xb2, 0x7f, 0xd0, 0x0e, 0xac, 0x10, 0x9a, 0xf1, 0xcf, 0xf7, 0x31, 0x50, 0xa8, 0x6e, 0x95, 0x3b, - 0x82, 0xef, 0x69, 0xc1, 0x18, 0x7c, 0x45, 0xc5, 0x83, 0x68, 0x79, 0xd4, 0x53, 0x2c, 0x92, 0x3b, - 0xd0, 0xb3, 0xb2, 0x33, 0x04, 0xf8, 0x4c, 0x43, 0xe7, 0xd4, 0xd0, 0x41, 0xe1, 0x97, 0xc0, 0xb5, - 0xb2, 0xcb, 0xea, 0x79, 0x95, 0xf1, 0x56, 0xd4, 0xc4, 0x50, 0x75, 0xf6, 0xb8, 0x67, 0x5a, 0xb9, - 0xd0, 0x24, 0x3e, 0x90, 0x9a, 0x3c, 0x6f, 0xac, 0xb7, 0x9d, 0x4f, 0x05, 0xa3, 0xb6, 0x8d, 0x8f, - 0xc0, 0x67, 0x47, 0xc1, 0xe3, 0x01, 0x39, 0x18, 0x20, 0xeb, 0x0e, 0xc0, 0xcb, 0x3b, 0xd0, 0x32, - 0x62, 0xb4, 0xfc, 0x0c, 0x03, 0xf8, 0xac, 0x56, 0x96, 0x7c, 0xa8, 0xe4, 0xe8, 0x50, 0x31, 0x8c, - 0x23, 0xf2, 0x9b, 0xa4, 0x8f, 0x7d, 0xf8, 0x95, 0x00, 0x30, 0x87, 0x78, 0xd7, 0x6d, 0x20, 0x3f, - 0x11, 0x38, 0xe4, 0x72, 0xd2, 0xc5, 0x9c, 0x1f, 0x68, 0xd7, 0xb1, 0x46, 0xe5, 0x4b, 0x72, 0xc2, - 0x93, 0xd3, 0xb9, 0xb6, 0xb7, 0xf1, 0x2d, 0x8f, 0xc9, 0xf5, 0x37, 0x0d, 0x6d, 0xfa, 0xc0, 0xcd, - 0x67, 0xed, 0x88, 0xa5, 0x18, 0x0b, 0xe3, 0x6a, 0x03, 0xec, 0x9f, 0xb6, 0x7d, 0xc3, 0xcf, 0xf6, - 0xfb, 0x96, 0x01, 0xd3, 0xe9, 0x1d, 0xce, 0xbd, 0x5f, 0x7f, 0x05, 0x5f, 0xb2, 0x6b, 0x4a, 0x1c, - 0x7d, 0xa2, 0xff, 0xc0, 0x0d, 0x42, 0x37, 0x2c, 0xcb, 0x62, 0x7b, 0x43, 0xb1, 0x41, 0x01, 0x16, - 0xf0, 0x2f, 0x12, 0xd6, 0xf6, 0x3a, 0x83, 0x9f, 0x99, 0x11, 0xbf, 0x37, 0x32, 0x0c, 0x73, 0xc9, - 0x72, 0xc0, 0x5a, 0x03, 0x2a, 0x7e, 0x66, 0x78, 0xd4, 0xed, 0xc4, 0x53, 0x96, 0x96, 0x4c, 0x83, - 0xce, 0xcf, 0xd8, 0xa1, 0xbf, 0xe1, 0x46, 0x35, 0x3c, 0x00, 0xad, 0xd0, 0x32, 0x2c, 0x67, 0x2d, - 0x43, 0x82, 0xc8, 0x39, 0x24, 0x98, 0x87, 0x08, 0x15, 0xf1, 0xbd, 0x39, 0xc7, 0x7c, 0x8e, 0xb3, - 0xec, 0xb8, 0xbe, 0xd0, 0xc7, 0x05, 0xaa, 0xce, 0x28, 0xf8, 0x5a, 0xc0, 0x85, 0xf5, 0x60, 0x68, - 0xdc, 0xe5, 0xc9, 0xa2, 0xc9, 0x96, 0xf1, 0x3c, 0x49, 0x47, 0x66, 0xfb, 0xde, 0xf1, 0x7f, 0x89, - 0xef, 0x62, 0x7e, 0x8a, 0x42, 0xa2, 0x91, 0x1f, 0x47, 0x43, 0xb4, 0x93, 0x78, 0xe4, 0xbf, 0x03, - 0x8f, 0xfc, 0x08, 0x1e, 0xf8, 0x23, 0x3a, 0x80, 0x01, 0xde, 0x1a, 0x58, 0x83, 0xea, 0xb4, 0xf3, - 0xe9, 0xba, 0x37, 0x32, 0x9e, 0x22, 0xbf, 0xd7, 0x5f, 0x66, 0x3c, 0x5c, 0x00, 0xdb, 0x2c, 0x7e, - 0x1c, 0x44, 0xc7, 0x4f, 0xaf, 0x30, 0x20, 0x37, 0x28, 0xe3, 0x58, 0x1d, 0xb3, 0xae, 0x84, 0xa8, - 0x20, 0x60, 0x80, 0xa7, 0x88, 0x8d, 0xe3, 0x22, 0xa1, 0x53, 0x76, 0xc0, 0x0a, 0x20, 0xe6, 0x04, - 0x96, 0x94, 0xfb, 0xf4, 0xe3, 0xc9, 0x08, 0xc3, 0x3e, 0xef, 0x4c, 0x33, 0x91, 0xa1, 0xa1, 0xdf, - 0xe4, 0x79, 0xca, 0xe2, 0x0c, 0x26, 0x2b, 0x58, 0x91, 0x2f, 0xb5, 0x8c, 0x42, 0x69, 0x5f, 0x17, - 0x79, 0xb0, 0x55, 0x47, 0xa0, 0x1d, 0x2f, 0x20, 0x0f, 0xb9, 0x72, 0x7f, 0x2b, 0x30, 0xc2, 0x66, - 0x22, 0xd9, 0xcd, 0x0e, 0x1d, 0x87, 0x72, 0x8c, 0x1e, 0xf1, 0xe1, 0xc7, 0x0f, 0x87, 0x53, 0xe4, - 0xca, 0x71, 0xf7, 0xcc, 0xc3, 0xc1, 0x81, 0x7f, 0x6e, 0x9d, 0x98, 0x15, 0x40, 0x4e, 0xa8, 0xd8, - 0x06, 0x08, 0x1e, 0x4e, 0xf3, 0x23, 0x50, 0x04, 0xd7, 0x8d, 0xdc, 0x42, 0x26, 0x5d, 0x8a, 0xdf, - 0x61, 0x64, 0xe8, 0xd2, 0x5a, 0x52, 0xec, 0x14, 0xc4, 0xdd, 0x82, 0xbc, 0xeb, 0xcf, 0x31, 0x73, - 0x5d, 0x2c, 0xbe, 0x43, 0xba, 0x6b, 0xa7, 0x58, 0x0d, 0xf7, 0xd2, 0x6e, 0x2b, 0x31, 0x0b, 0xc8, - 0x0e, 0xd9, 0xab, 0x32, 0xb5, 0xeb, 0xab, 0x09, 0x5d, 0x13, 0xbc, 0x13, 0x89, 0xfb, 0x24, 0x9b, - 0xb1, 0xba, 0x4d, 0x93, 0x8c, 0xd2, 0x8d, 0xf8, 0xbf, 0xf8, 0xe2, 0x88, 0xf8, 0x65, 0x3c, 0x07, - 0x11, 0x93, 0x6f, 0x54, 0x55, 0x06, 0xb0, 0xcf, 0x38, 0xf6, 0xe5, 0xf0, 0x84, 0xa6, 0x8a, 0x64, - 0xfc, 0x98, 0xaa, 0x4a, 0x10, 0x8d, 0xab, 0x65, 0x62, 0x26, 0x71, 0x3c, 0x3f, 0xe0, 0x2e, 0x9b, - 0x52, 0x84, 0x36, 0x65, 0xa5, 0xe0, 0x26, 0xeb, 0xe4, 0xc7, 0x25, 0x25, 0x5f, 0x35, 0xaf, 0x2d, - 0x8e, 0x13, 0x5b, 0x1c, 0x31, 0x52, 0x1c, 0x7d, 0x31, 0x7b, 0x13, 0x57, 0x2b, 0x8b, 0x3e, 0x78, - 0x95, 0x74, 0xfe, 0x75, 0xe0, 0x9c, 0x41, 0xe7, 0x8a, 0x6d, 0x86, 0xc3, 0xb3, 0xe6, 0x79, 0xfa, - 0x18, 0xf3, 0xba, 0xf5, 0xd8, 0x4b, 0x37, 0x44, 0xef, 0x83, 0xda, 0x75, 0x92, 0x61, 0x25, 0xdc, - 0x7a, 0xea, 0xe2, 0x8f, 0x54, 0x17, 0x7f, 0x6c, 0xc8, 0xf9, 0x9e, 0x86, 0x19, 0xc0, 0x2c, 0xb3, - 0xca, 0xbf, 0x4d, 0x3e, 0xb2, 0xc5, 0xc0, 0x1b, 0xee, 0x7b, 0x74, 0x8e, 0x52, 0x87, 0xe2, 0x11, - 0x2b, 0x2b, 0x0e, 0xec, 0xa3, 0xfe, 0x6e, 0x06, 0x08, 0x29, 0xba, 0xaa, 0x5d, 0x74, 0xcd, 0xa3, - 0xcd, 0xd0, 0x62, 0xb8, 0xdf, 0x33, 0x88, 0xa7, 0x0b, 0xe1, 0x8f, 0x65, 0xe6, 0x39, 0x44, 0x85, - 0xeb, 0x4f, 0x92, 0x5b, 0x89, 0xe3, 0x01, 0x15, 0x90, 0x03, 0x48, 0xb6, 0x3e, 0xab, 0x57, 0x5a, - 0xb8, 0x5f, 0x53, 0xde, 0x6b, 0xa7, 0xa5, 0x94, 0x89, 0x79, 0x20, 0x2e, 0xb7, 0xd6, 0xa5, 0xbf, - 0xfe, 0xca, 0xfa, 0x32, 0x96, 0x55, 0x9c, 0xdd, 0x82, 0xfc, 0x48, 0x11, 0x65, 0xf6, 0xac, 0xcc, - 0xe6, 0xdf, 0xd7, 0xea, 0x33, 0xab, 0x4b, 0x49, 0x12, 0x80, 0xfa, 0xe4, 0x24, 0xc0, 0xc1, 0xb0, - 0x05, 0x11, 0x40, 0x01, 0x04, 0xe1, 0x2d, 0x7f, 0x5f, 0xe7, 0xdf, 0x30, 0x2e, 0x05, 0xc7, 0xdb, - 0x43, 0x3d, 0x14, 0xc1, 0xb9, 0x9a, 0xed, 0xf6, 0x53, 0xa9, 0x52, 0x8a, 0xea, 0xb3, 0x46, 0xf5, - 0x99, 0xa2, 0xfa, 0xac, 0x51, 0x5e, 0xb8, 0xcf, 0xfa, 0x21, 0x43, 0x2d, 0x68, 0xf1, 0x41, 0x25, - 0x2a, 0x38, 0xd5, 0xc5, 0x1f, 0x0f, 0xeb, 0x62, 0x0c, 0x35, 0x6d, 0x32, 0x2b, 0xf2, 0x96, 0x5a, - 0xbb, 0x70, 0x83, 0xbf, 0xb2, 0xfb, 0x1d, 0x28, 0xae, 0x40, 0xb0, 0xb3, 0x90, 0x13, 0xdf, 0xb1, - 0xd6, 0xcc, 0xb6, 0x99, 0xb4, 0x7e, 0x9d, 0xe6, 0x37, 0x83, 0x9f, 0xff, 0xf3, 0xfa, 0x87, 0xef, - 0x71, 0xba, 0x0e, 0x09, 0x7e, 0xb2, 0x7c, 0x90, 0x13, 0x31, 0x23, 0xdb, 0xa6, 0xa9, 0xe1, 0x0e, - 0xdf, 0x1b, 0x3b, 0xd4, 0x8f, 0x89, 0x0e, 0xca, 0x0c, 0xf9, 0x2b, 0xcd, 0x67, 0xcf, 0x70, 0x8e, - 0xaa, 0xef, 0x01, 0x71, 0x02, 0xf3, 0x2d, 0x24, 0xef, 0xdf, 0x40, 0xc6, 0x3c, 0x95, 0x9e, 0x86, - 0x27, 0xd0, 0xe0, 0xd3, 0x0c, 0x5d, 0x9d, 0xf0, 0x02, 0x35, 0x7c, 0xc2, 0xab, 0xd3, 0x87, 0xb0, - 0xba, 0xb1, 0x03, 0x9c, 0x56, 0xf9, 0x62, 0xa2, 0xbf, 0xfd, 0xe1, 0xfa, 0x47, 0xdd, 0xc0, 0x3c, - 0x66, 0x52, 0xed, 0x5b, 0xb3, 0x61, 0xd4, 0xe7, 0xce, 0x6c, 0x18, 0xbf, 0x59, 0x6d, 0x1d, 0x7c, - 0xd5, 0xe9, 0x50, 0x78, 0x2e, 0x73, 0x59, 0x1d, 0x3f, 0x28, 0x3c, 0xbf, 0xb9, 0x50, 0x46, 0x3e, - 0x3f, 0xbb, 0xb9, 0xa0, 0xcf, 0x9f, 0x89, 0x1b, 0x0b, 0xad, 0xdc, 0xce, 0xe7, 0xd0, 0x79, 0x09, - 0x24, 0x3e, 0x68, 0xc0, 0xa3, 0x25, 0xd8, 0xdf, 0x4a, 0x5b, 0xc3, 0xe4, 0xbe, 0x78, 0x78, 0xc6, - 0xbb, 0x17, 0x17, 0x9d, 0x05, 0xb1, 0x45, 0x2e, 0x76, 0xbd, 0x71, 0xc2, 0x2d, 0xb8, 0x38, 0x7d, - 0xf2, 0x2a, 0x01, 0xe8, 0x14, 0xae, 0xa2, 0x4c, 0x3a, 0x4b, 0x5e, 0x86, 0x5c, 0xa6, 0x9a, 0xb4, - 0x97, 0xac, 0x44, 0x65, 0xfd, 0x69, 0x0d, 0x55, 0xd7, 0x6f, 0x7a, 0xbd, 0x8a, 0xb6, 0x9f, 0x4a, - 0x8e, 0x8a, 0x6f, 0x38, 0x0e, 0x98, 0x5a, 0x30, 0xfe, 0xeb, 0x0b, 0x13, 0x98, 0x63, 0xa5, 0x29, - 0xa4, 0x6d, 0xe2, 0x67, 0x12, 0xcb, 0xc9, 0x4e, 0x17, 0xd1, 0xc2, 0xfc, 0x11, 0x9d, 0x74, 0x9f, - 0x84, 0xb9, 0x48, 0x3a, 0x0a, 0x02, 0x21, 0x5b, 0x8a, 0x43, 0x5d, 0x80, 0x10, 0xf9, 0x2a, 0x9b, - 0xd1, 0x12, 0x42, 0xb5, 0x2d, 0x41, 0xad, 0xb9, 0xf4, 0xf6, 0xc3, 0xbe, 0xf6, 0xae, 0x6d, 0xe3, - 0x0a, 0xf1, 0x97, 0x87, 0xe2, 0xec, 0x7c, 0xd3, 0x2a, 0x24, 0xaa, 0xbf, 0xac, 0x86, 0x93, 0xc3, - 0xc6, 0xaf, 0x8a, 0x22, 0x2f, 0x9e, 0x89, 0x36, 0xf4, 0x82, 0x02, 0x9d, 0xd7, 0xa2, 0x9a, 0x68, - 0xa0, 0x0a, 0xd0, 0x17, 0x97, 0x8b, 0x6e, 0x2e, 0x1a, 0xd9, 0xfe, 0xd6, 0xe5, 0xd0, 0x7a, 0xd2, - 0x86, 0x8e, 0x17, 0x1c, 0xc8, 0xe7, 0x98, 0x2f, 0xd1, 0x17, 0xeb, 0xbd, 0xa2, 0x6f, 0x7e, 0x8c, - 0x01, 0x86, 0xea, 0x5f, 0x53, 0xfc, 0x2a, 0x4d, 0x69, 0x96, 0xda, 0x0e, 0xf7, 0xac, 0x07, 0x98, - 0xf8, 0x72, 0x9d, 0x22, 0x77, 0xed, 0x67, 0xbb, 0xf3, 0x50, 0xd1, 0xe6, 0xd4, 0x60, 0x96, 0x5c, - 0x0c, 0x38, 0x31, 0x66, 0x67, 0x95, 0x46, 0x59, 0xbc, 0xbd, 0xed, 0x9f, 0x22, 0x0f, 0x8f, 0x6b, - 0x3e, 0x9f, 0x64, 0xd3, 0xc7, 0x6a, 0xcf, 0x66, 0xea, 0x22, 0xb0, 0x70, 0xb3, 0x9d, 0xf8, 0xfb, - 0x8d, 0x78, 0xfd, 0xb6, 0x88, 0x6f, 0x29, 0x10, 0x0f, 0xa7, 0xed, 0xdc, 0x05, 0x78, 0x2e, 0xbe, - 0xef, 0xd1, 0x9f, 0x8a, 0x5a, 0x27, 0x26, 0xab, 0x10, 0x8e, 0x2f, 0x0a, 0x92, 0x8f, 0x3d, 0xd2, - 0x54, 0xe5, 0x4f, 0x6b, 0x6f, 0x04, 0x4f, 0xb1, 0xf2, 0x75, 0xc3, 0x3e, 0xbd, 0xa0, 0x6e, 0xaa, - 0x52, 0xec, 0x91, 0x05, 0x74, 0x88, 0xff, 0x32, 0x4e, 0x53, 0xfc, 0x45, 0x91, 0x66, 0x67, 0x66, - 0xb8, 0x53, 0xf6, 0x5d, 0x0e, 0x54, 0x1e, 0x32, 0x3a, 0xa3, 0xa4, 0x81, 0x5a, 0x1f, 0x48, 0xb4, - 0xd7, 0xe4, 0x0c, 0xa5, 0x1a, 0x8d, 0xb8, 0xbd, 0x6c, 0x4e, 0xb5, 0xea, 0x67, 0x2b, 0x50, 0x8d, - 0xe3, 0xcc, 0x9e, 0xd9, 0x9d, 0x25, 0x17, 0x3e, 0xbd, 0xe3, 0xbf, 0x99, 0x86, 0xfb, 0x4a, 0xdb, - 0x62, 0xe0, 0x6d, 0x3e, 0x0e, 0x75, 0x3e, 0x05, 0xb5, 0x21, 0x7f, 0x28, 0xbf, 0x1c, 0xb4, 0xc9, - 0x28, 0x11, 0x84, 0xfc, 0x46, 0xe2, 0x04, 0x9b, 0x87, 0x93, 0x63, 0xed, 0x7a, 0x79, 0x7c, 0xf8, - 0xc1, 0x03, 0xe3, 0x4c, 0xe8, 0xa5, 0xc3, 0x39, 0x49, 0x87, 0x82, 0x7e, 0x0b, 0xf7, 0x2f, 0xbe, - 0x60, 0x5f, 0x7c, 0xd1, 0x2a, 0x51, 0xb7, 0x0d, 0xc4, 0x97, 0x59, 0xaf, 0xae, 0xdf, 0xb6, 0xa2, - 0xe8, 0x53, 0x97, 0x7e, 0x45, 0xf7, 0x23, 0xcb, 0xbe, 0x3d, 0x81, 0xae, 0xe7, 0xbb, 0x1f, 0xe3, - 0xd0, 0x01, 0x8a, 0xe3, 0x30, 0xb5, 0x0b, 0xbc, 0x7e, 0x2b, 0x11, 0x65, 0x0b, 0x4b, 0x7b, 0x9b, - 0xe2, 0xef, 0x69, 0x6a, 0xf7, 0x71, 0x02, 0xd3, 0x4a, 0x2d, 0x4d, 0x2a, 0xd0, 0x14, 0xfa, 0x31, - 0x17, 0x1c, 0x06, 0x7f, 0x04, 0x02, 0x7f, 0x22, 0x04, 0xb7, 0x51, 0xb4, 0x0d, 0x40, 0xb3, 0x7a, - 0xe2, 0x1e, 0xff, 0x19, 0x11, 0x5c, 0x72, 0x55, 0x77, 0xfc, 0xd4, 0xe5, 0x4f, 0xbc, 0x95, 0x3f, - 0xdb, 0xef, 0x65, 0x3a, 0x00, 0xaf, 0x7f, 0xa7, 0x18, 0x03, 0xe6, 0x9b, 0x67, 0xd8, 0x7b, 0x16, - 0x97, 0x0f, 0xd9, 0x9c, 0x72, 0x2f, 0xb9, 0xcf, 0x72, 0x24, 0x71, 0x48, 0xd6, 0x28, 0x45, 0x98, - 0x0d, 0x4d, 0x71, 0xcb, 0x29, 0x26, 0xbc, 0x9f, 0x94, 0x34, 0x4c, 0xeb, 0x4d, 0x4e, 0xcb, 0xb2, - 0x64, 0x0e, 0x73, 0xb8, 0xd0, 0x0b, 0xd9, 0x21, 0x49, 0xc3, 0xe8, 0xa6, 0x45, 0x62, 0xbf, 0x4a, - 0xec, 0x04, 0xe5, 0xa0, 0x2c, 0x0c, 0x83, 0x09, 0xee, 0x81, 0xee, 0x0d, 0x54, 0xdd, 0x78, 0xf1, - 0x55, 0x89, 0xc8, 0xa2, 0xb8, 0xa1, 0x50, 0xac, 0x14, 0xe3, 0x4f, 0x4b, 0xb4, 0x6c, 0x4b, 0x9c, - 0x67, 0x97, 0x2b, 0xc9, 0xec, 0x81, 0x75, 0xab, 0x5f, 0x3d, 0x30, 0x59, 0xcb, 0xbf, 0xc0, 0xee, - 0x36, 0xa0, 0xf3, 0x12, 0xb2, 0x09, 0xee, 0xfb, 0x75, 0x1b, 0xe0, 0x89, 0x51, 0x59, 0x2f, 0xe3, - 0x7e, 0xa7, 0x89, 0x88, 0xa1, 0x35, 0x94, 0xf8, 0xee, 0x60, 0x18, 0xcc, 0x9a, 0x64, 0xbd, 0xd0, - 0x98, 0x6e, 0x13, 0xa1, 0x5b, 0xd8, 0x4a, 0xf9, 0x1e, 0xe9, 0x60, 0xac, 0x5a, 0x4f, 0x8f, 0xae, - 0xc8, 0x8b, 0x45, 0xfb, 0x27, 0xad, 0xaf, 0x9f, 0xfe, 0x01, 0x1b, 0xb1, 0x4f, 0xcb, 0x7f, 0x36, - 0x04, 0xd7, 0x4c, 0x8f, 0x2e, 0xb3, 0x0a, 0x9f, 0x4c, 0xed, 0xeb, 0x8f, 0x81, 0x4f, 0xf5, 0x50, - 0xf6, 0x71, 0xa9, 0x93, 0xfa, 0x81, 0xed, 0xa9, 0x7e, 0x6a, 0x66, 0xc8, 0x47, 0x6b, 0x3e, 0x9c, - 0x3c, 0x89, 0x61, 0x4b, 0x05, 0x87, 0xf5, 0x56, 0x75, 0xeb, 0x87, 0x10, 0x1e, 0x23, 0x51, 0xdd, - 0x92, 0xe7, 0x20, 0xd8, 0xe3, 0x18, 0x77, 0x96, 0xa0, 0xe9, 0xf7, 0x61, 0x7e, 0x43, 0xfb, 0x46, - 0x5b, 0x8e, 0xf6, 0x68, 0x7c, 0xe5, 0xd0, 0x10, 0x2e, 0xf1, 0xb0, 0x2d, 0x8a, 0x97, 0xd8, 0xde, - 0xe1, 0x42, 0x87, 0xf1, 0x8b, 0xa4, 0xc4, 0x6d, 0xbc, 0x85, 0x88, 0x4e, 0x27, 0x39, 0xc3, 0x57, - 0x89, 0xf8, 0x84, 0x15, 0xf3, 0xcb, 0x9e, 0xb4, 0xda, 0x4a, 0x69, 0x63, 0xf2, 0xcb, 0x93, 0x03, - 0x4d, 0x4e, 0xd5, 0x3a, 0xe0, 0x20, 0xa7, 0xe7, 0x67, 0xe2, 0xc3, 0x38, 0xfc, 0x49, 0x29, 0xf1, - 0xa3, 0x27, 0xe7, 0x67, 0xf4, 0xff, 0x42, 0xf9, 0x3f, 0xb9, 0x7e, 0x25, 0xc0, 0x23, 0x65, 0x00, - 0x00 + 0x20, 0x83, 0x33, 0xc7, 0x08, 0x37, 0xc0, 0x8e, 0x1e, 0xb1, 0x15, 0x6e, 0x5e, 0xa9, 0xf0, 0xd7, + 0x33, 0xf9, 0x8b, 0xc9, 0x1f, 0x4c, 0x7c, 0xf0, 0x3e, 0xca, 0xa9, 0xea, 0x65, 0xbd, 0x28, 0x29, + 0x99, 0x42, 0xe7, 0x33, 0x8b, 0x6d, 0xca, 0xe6, 0x3a, 0xbb, 0x63, 0x59, 0x1e, 0xc7, 0x78, 0xa0, + 0x2d, 0xd9, 0x74, 0xcb, 0x88, 0x2b, 0xe0, 0x1c, 0xec, 0x10, 0x27, 0xd5, 0x78, 0x73, 0xd0, 0xed, + 0xd9, 0x93, 0x90, 0xc4, 0xeb, 0x04, 0x3e, 0x45, 0x6a, 0x7a, 0x07, 0x97, 0x32, 0xf6, 0x46, 0x18, + 0x0e, 0x45, 0x07, 0xf0, 0x6c, 0x13, 0x77, 0x3c, 0xa1, 0x90, 0x01, 0x4d, 0x03, 0xcd, 0xb4, 0xa9, + 0xa5, 0xe7, 0xf0, 0x30, 0x07, 0xad, 0x3b, 0x45, 0xd0, 0x7e, 0x52, 0x77, 0xbb, 0x0a, 0x31, 0xae, + 0x8f, 0xfd, 0x10, 0x43, 0x3a, 0x0d, 0xad, 0x40, 0x14, 0x63, 0x2b, 0xdd, 0xeb, 0xe1, 0x5b, 0x65, + 0xbc, 0x7d, 0xd3, 0xf1, 0x91, 0x0e, 0x12, 0x6e, 0xdd, 0x51, 0x8c, 0x7c, 0x25, 0x30, 0xd1, 0xc2, + 0xab, 0xa6, 0x8a, 0xe3, 0x7b, 0xf9, 0x08, 0x55, 0x82, 0xf6, 0xa6, 0x1b, 0xe7, 0xce, 0x65, 0xc3, + 0xae, 0x23, 0xfc, 0x94, 0x44, 0x8b, 0x0e, 0x57, 0xe8, 0x63, 0x47, 0xce, 0x88, 0x67, 0x9d, 0xc4, + 0x29, 0x09, 0x4a, 0x0e, 0x5b, 0xf7, 0x14, 0x63, 0x2a, 0xef, 0x5c, 0x82, 0xb2, 0xfd, 0xb1, 0x76, + 0x12, 0x8e, 0x6c, 0xcf, 0xc7, 0xb9, 0x12, 0xe3, 0x02, 0xf1, 0x1d, 0x5d, 0xf8, 0x49, 0x9a, 0xd2, + 0x4d, 0x1a, 0xe1, 0x5e, 0x32, 0xe8, 0xdb, 0xec, 0x2e, 0x2a, 0xf0, 0xa4, 0x54, 0x92, 0x67, 0xe5, + 0x7c, 0xb7, 0x37, 0xbe, 0x98, 0x2f, 0xb7, 0x19, 0x9d, 0x29, 0x1e, 0xb0, 0xe1, 0xae, 0x60, 0xd5, + 0xb6, 0xc8, 0xb4, 0x38, 0x5f, 0x6c, 0xd7, 0x2c, 0xab, 0xac, 0x5b, 0x56, 0xbd, 0x4c, 0x19, 0x3e, + 0x7e, 0xf3, 0xf0, 0x7d, 0x0c, 0x2d, 0xf6, 0x33, 0xd9, 0x5c, 0xc3, 0x83, 0x16, 0xaf, 0x92, 0x98, + 0xc9, 0xc3, 0x2c, 0x83, 0xe1, 0x0e, 0x61, 0xb3, 0xf9, 0x17, 0x83, 0xe6, 0x34, 0xc0, 0x70, 0xd6, + 0x3c, 0xcf, 0xe7, 0x73, 0x66, 0xe1, 0x66, 0xf7, 0x57, 0x03, 0x7e, 0x9f, 0xeb, 0x78, 0x92, 0x47, + 0x37, 0xa0, 0x43, 0x7d, 0xec, 0x44, 0x1f, 0x5a, 0xb4, 0x64, 0x7e, 0x95, 0x94, 0x95, 0x55, 0xb0, + 0x75, 0x7e, 0xc7, 0x06, 0xba, 0x72, 0x46, 0x65, 0x88, 0xad, 0xeb, 0x53, 0x1d, 0xad, 0xd6, 0x51, + 0x1c, 0xb7, 0x9b, 0x0e, 0xa7, 0xf5, 0x40, 0x35, 0x12, 0xc7, 0x07, 0x3b, 0xe8, 0x7e, 0x7c, 0xa4, + 0x3e, 0xbc, 0x86, 0xfb, 0x9a, 0x33, 0xc0, 0x35, 0xdc, 0xa7, 0xc6, 0xa6, 0xc0, 0x14, 0x80, 0xc2, + 0x37, 0xc5, 0x7a, 0x41, 0xd0, 0x0e, 0xc8, 0x70, 0xc6, 0x39, 0x97, 0xb1, 0x7b, 0xed, 0x9f, 0x7f, + 0xbf, 0x1a, 0xfc, 0x1b, 0x97, 0xea, 0xa7, 0x67, 0x67, 0x5f, 0xec, 0xee, 0x93, 0x2c, 0xce, 0xef, + 0xad, 0x34, 0x5f, 0xd0, 0xae, 0x9d, 0xb5, 0xca, 0xcb, 0x0a, 0x37, 0x82, 0xf7, 0x67, 0xb8, 0xc3, + 0xfe, 0xef, 0xe1, 0x6c, 0x89, 0x5f, 0x45, 0x81, 0x60, 0xac, 0x6a, 0xc5, 0xb2, 0xc1, 0x80, 0xcd, + 0x2f, 0x98, 0xf5, 0x4b, 0x09, 0xd2, 0x1c, 0x0e, 0x95, 0xb2, 0x1d, 0x1e, 0x33, 0xfb, 0x57, 0xb2, + 0x4c, 0x7e, 0x10, 0x5b, 0xe7, 0xd0, 0xc3, 0xe8, 0x47, 0x8c, 0xd8, 0xc0, 0xb1, 0xda, 0xab, 0x44, + 0xf1, 0xcf, 0x40, 0x11, 0x06, 0x2a, 0x4a, 0x55, 0x3c, 0x20, 0x61, 0xbc, 0xd0, 0xd4, 0x5f, 0x00, + 0x9f, 0x69, 0xe7, 0xc2, 0xe2, 0xdf, 0x80, 0xff, 0x90, 0xc7, 0xcc, 0x4a, 0x62, 0x80, 0xcb, 0x4f, + 0x2f, 0xcc, 0x3f, 0xb3, 0xf7, 0x40, 0x01, 0x60, 0x5a, 0x21, 0x43, 0xea, 0xd6, 0x9d, 0x26, 0x08, + 0x11, 0x8f, 0x6a, 0x0d, 0xad, 0xbb, 0x28, 0xdd, 0xb2, 0x79, 0xb5, 0x4a, 0x4a, 0x6b, 0xc1, 0xd2, + 0xb4, 0xfc, 0xd9, 0x79, 0x67, 0x25, 0x30, 0xc7, 0x28, 0x5e, 0xfd, 0xe3, 0xf5, 0x95, 0x21, 0xda, + 0xd1, 0x96, 0x38, 0x34, 0xae, 0x2b, 0x4e, 0x75, 0x68, 0x54, 0xd2, 0xa2, 0x4f, 0x59, 0x07, 0x0a, + 0x6d, 0x3d, 0xdc, 0xd9, 0xf1, 0xd5, 0xc8, 0x6a, 0x5e, 0xdb, 0xc2, 0xff, 0x6e, 0x59, 0xf1, 0x70, + 0x4d, 0x04, 0xe7, 0xc5, 0x40, 0xff, 0xbc, 0x3e, 0xbe, 0x07, 0xe2, 0xab, 0x14, 0x1c, 0x74, 0xdd, + 0x60, 0x78, 0xf2, 0xfa, 0x65, 0x04, 0xe4, 0x02, 0xf7, 0x8d, 0x72, 0x08, 0x02, 0x40, 0x01, 0x47, + 0x0d, 0xb0, 0x05, 0x6d, 0xcc, 0x08, 0xdb, 0x1a, 0xe8, 0x15, 0xc8, 0xc0, 0xc8, 0xc4, 0x41, 0x5a, + 0xfd, 0x45, 0x39, 0x8b, 0x2c, 0x3c, 0x28, 0x6c, 0x44, 0x28, 0x8e, 0x97, 0xe0, 0xed, 0xab, 0x2b, + 0x3a, 0x2c, 0xc2, 0x60, 0x60, 0xda, 0xc8, 0xd2, 0x8d, 0x46, 0x1e, 0x43, 0x68, 0xd6, 0x0c, 0xff, + 0xef, 0xf3, 0x2a, 0xbe, 0x50, 0x0f, 0x08, 0xe9, 0xf8, 0x95, 0x4a, 0x2e, 0x7e, 0x23, 0x48, 0x48, + 0x4c, 0x1c, 0x8b, 0xe3, 0xd2, 0xfb, 0x62, 0x97, 0xed, 0x71, 0x1b, 0x19, 0xfa, 0xfd, 0x5b, 0x05, + 0xf5, 0x82, 0x60, 0xd5, 0x07, 0xe8, 0x44, 0xbb, 0x2f, 0x76, 0xcc, 0xc2, 0xd7, 0x7d, 0x5f, 0x87, + 0xe7, 0xd8, 0x41, 0xec, 0xbb, 0xd5, 0xe7, 0xe1, 0xf5, 0x8b, 0xe7, 0xa0, 0x1f, 0xf8, 0x01, 0x5f, + 0x76, 0x5b, 0xad, 0x5e, 0x40, 0xd4, 0xfa, 0x66, 0x4d, 0x9d, 0x91, 0x51, 0x25, 0x03, 0x0b, 0x4a, + 0xaa, 0x87, 0xaf, 0x5a, 0x70, 0x74, 0x24, 0x02, 0xf8, 0xc0, 0x97, 0x71, 0x5f, 0xe8, 0xbc, 0xf9, + 0xf4, 0x48, 0x1b, 0xbe, 0x14, 0x27, 0x5b, 0x19, 0xa0, 0xc3, 0x9b, 0x0d, 0xcb, 0xe2, 0xcb, 0x55, + 0x92, 0xc6, 0x83, 0x08, 0xd5, 0x18, 0x15, 0xa0, 0x39, 0xc9, 0x79, 0xc2, 0x10, 0x5b, 0x46, 0xfc, + 0x06, 0x37, 0xf1, 0x59, 0xc5, 0x8a, 0xf2, 0xcf, 0x33, 0x63, 0xbe, 0x29, 0x4f, 0x26, 0xfb, 0x74, + 0x6b, 0xfe, 0x91, 0x3e, 0x80, 0xb1, 0xde, 0xb3, 0x07, 0x54, 0xd5, 0x46, 0xd9, 0x6a, 0x57, 0x0e, + 0x56, 0x56, 0x59, 0x34, 0x2b, 0x2a, 0xff, 0x95, 0x54, 0xab, 0x01, 0x3f, 0x18, 0xcf, 0xcd, 0xe5, + 0xcb, 0x2f, 0x07, 0x40, 0x4b, 0x7d, 0x08, 0xbd, 0x65, 0x3f, 0xec, 0xe7, 0xea, 0x9d, 0x11, 0x33, + 0x3c, 0xf2, 0xa5, 0xe1, 0xf3, 0xd0, 0xe8, 0x01, 0x03, 0x1c, 0x97, 0x50, 0xe4, 0x99, 0xf9, 0x47, + 0x80, 0x3c, 0xc5, 0xd3, 0x18, 0x68, 0x4a, 0x0a, 0xc7, 0x65, 0x8c, 0x02, 0x47, 0x25, 0x1e, 0x7f, + 0x6e, 0x8e, 0xf7, 0x9b, 0xfc, 0x7b, 0x25, 0xfd, 0x1d, 0xa0, 0x21, 0xf7, 0x21, 0x75, 0xee, 0xdb, + 0xfb, 0x30, 0x7a, 0x7e, 0x9e, 0xac, 0xe5, 0x59, 0x3e, 0x3a, 0x78, 0x5f, 0x16, 0x8b, 0xb9, 0xfe, + 0xfc, 0xc5, 0x09, 0xc0, 0x2f, 0x9e, 0x53, 0x76, 0xd6, 0x86, 0x58, 0xb2, 0xea, 0xeb, 0xaa, 0x2a, + 0x92, 0x9b, 0x6d, 0x05, 0x32, 0xa7, 0x0d, 0x76, 0xdd, 0xd0, 0x75, 0x41, 0xa0, 0xfc, 0xf4, 0xe0, + 0xa0, 0x1d, 0x58, 0x21, 0x34, 0xe3, 0xbf, 0x67, 0x80, 0x81, 0x42, 0x75, 0xab, 0xdc, 0x11, 0xfc, + 0x40, 0x0b, 0xc6, 0xe0, 0x2b, 0x2a, 0x1e, 0x44, 0xcb, 0xa3, 0x9e, 0x22, 0x4e, 0xee, 0x40, 0xcf, + 0xca, 0xce, 0x10, 0xe0, 0x33, 0x0d, 0x9d, 0x53, 0x43, 0x47, 0xa0, 0x5f, 0x00, 0xd7, 0xca, 0x2e, + 0xab, 0x17, 0x55, 0xc6, 0x5b, 0x51, 0x13, 0x43, 0xd5, 0xd9, 0xe3, 0x9e, 0x69, 0xe5, 0x42, 0x93, + 0xe8, 0x40, 0x6a, 0xf2, 0x24, 0xb5, 0xde, 0x76, 0x3e, 0x15, 0x8c, 0xda, 0x36, 0x3e, 0x02, 0x9f, + 0x1d, 0x05, 0x8f, 0x47, 0xff, 0x60, 0x80, 0xac, 0x3b, 0x00, 0x2f, 0xef, 0x40, 0xcb, 0x88, 0xd1, + 0xf2, 0x73, 0x12, 0xe0, 0xb3, 0x5a, 0x59, 0xf2, 0xa1, 0x92, 0xa3, 0x43, 0x45, 0x30, 0x8e, 0xc8, + 0x6f, 0x92, 0x3e, 0xf6, 0xe1, 0xd7, 0x0e, 0xc0, 0x1c, 0xe2, 0x5d, 0xb7, 0x81, 0xfc, 0xd4, 0xe1, + 0x90, 0xcb, 0x49, 0x17, 0x73, 0x7e, 0x54, 0x5f, 0xc7, 0x1a, 0x95, 0x2f, 0xc9, 0x09, 0x4f, 0x4e, + 0x27, 0xf6, 0xde, 0x44, 0xb7, 0x3c, 0x26, 0xd7, 0xdf, 0x66, 0xb4, 0xe9, 0x03, 0x37, 0x9f, 0xb5, + 0x23, 0x96, 0x62, 0x2c, 0x8c, 0xab, 0x0d, 0xb0, 0x7f, 0xd6, 0xf6, 0x0d, 0x3f, 0xdb, 0xef, 0x5a, + 0x06, 0x4c, 0xe7, 0x92, 0x38, 0xf7, 0x7e, 0xfd, 0x15, 0x7c, 0xc9, 0xae, 0x29, 0x71, 0xf4, 0xa9, + 0xfe, 0x23, 0x37, 0x08, 0xdd, 0xb0, 0x2c, 0x8b, 0xed, 0x0d, 0xc5, 0x06, 0x05, 0x58, 0xc0, 0xbf, + 0x48, 0x58, 0xdb, 0xeb, 0x0c, 0x7e, 0x66, 0x46, 0xf4, 0xce, 0xc8, 0x30, 0xcc, 0x25, 0xcb, 0x01, + 0x6b, 0x0d, 0xa8, 0xf8, 0x99, 0xe1, 0x51, 0xb7, 0x13, 0xcd, 0x58, 0x5a, 0x32, 0x0d, 0x3a, 0x7f, + 0xc6, 0x0e, 0xfd, 0x0d, 0x37, 0xaa, 0xe1, 0x01, 0x68, 0x85, 0x96, 0x61, 0x39, 0x6f, 0x19, 0x12, + 0x44, 0xce, 0x21, 0xc1, 0x3c, 0x44, 0xa8, 0x88, 0xee, 0xcd, 0x05, 0xe6, 0x73, 0x9c, 0x65, 0xc7, + 0xf5, 0x85, 0x3e, 0x9b, 0x50, 0x75, 0x46, 0xc1, 0xd7, 0x02, 0x2e, 0xac, 0x07, 0x43, 0xe3, 0x2e, + 0x4f, 0xe2, 0x26, 0x5b, 0xc6, 0x93, 0x32, 0x1d, 0x99, 0xed, 0x7b, 0xc7, 0xff, 0x25, 0xba, 0x8b, + 0xf8, 0x29, 0x0a, 0x89, 0x46, 0x7e, 0x1c, 0x0d, 0xd1, 0x4e, 0xe2, 0x91, 0xff, 0x06, 0x3c, 0xf2, + 0x23, 0x78, 0xe0, 0xaf, 0x0a, 0x01, 0x06, 0x78, 0x6b, 0x60, 0x0d, 0xaa, 0xd3, 0xce, 0xa7, 0xeb, + 0xde, 0xc8, 0x78, 0x8a, 0xfc, 0x5e, 0x7f, 0x91, 0xf1, 0x70, 0x01, 0x6c, 0xb3, 0xf8, 0x71, 0x10, + 0x1d, 0x3f, 0x21, 0xc3, 0x80, 0xdc, 0xa0, 0x8c, 0x63, 0x75, 0xcc, 0xba, 0x12, 0xa2, 0x82, 0x80, + 0x01, 0x9e, 0x22, 0x32, 0x8e, 0x8b, 0x84, 0xce, 0x0f, 0x02, 0x2b, 0x80, 0x98, 0x13, 0x58, 0x52, + 0xee, 0xd3, 0x8f, 0x27, 0x23, 0x0c, 0xfb, 0xbc, 0x33, 0xcd, 0x44, 0x86, 0x86, 0x7e, 0x93, 0xe7, + 0x29, 0x8b, 0x32, 0x98, 0xac, 0x60, 0x45, 0xbe, 0xd4, 0x32, 0x0a, 0xa5, 0x7d, 0x5d, 0xe4, 0x91, + 0x5d, 0x1d, 0x81, 0x76, 0xbc, 0x80, 0x3c, 0xbe, 0xcb, 0xfd, 0xad, 0xc0, 0x08, 0x9b, 0x89, 0x64, + 0x37, 0x3b, 0x74, 0x1c, 0xca, 0x07, 0x02, 0x88, 0x0f, 0x3f, 0x58, 0x39, 0x9c, 0x21, 0x57, 0x8e, + 0xbb, 0x67, 0x1e, 0x0e, 0x0e, 0xfc, 0x73, 0xeb, 0x2c, 0xb0, 0x00, 0x72, 0x42, 0xc5, 0x36, 0x40, + 0xf0, 0x70, 0x96, 0x1f, 0x81, 0x22, 0xb8, 0x6e, 0xe4, 0x16, 0x32, 0xe9, 0x52, 0xfc, 0x30, 0x25, + 0x43, 0x97, 0xd6, 0x92, 0x62, 0xa7, 0x20, 0xea, 0x16, 0xe4, 0x5d, 0x7f, 0x8e, 0x99, 0x6b, 0x1c, + 0x7f, 0x8f, 0x74, 0xd7, 0x4e, 0xb1, 0x1a, 0xee, 0xa5, 0xdd, 0x56, 0x62, 0x16, 0x90, 0x1d, 0xb2, + 0x57, 0x65, 0x6a, 0xd7, 0x57, 0x13, 0xba, 0x26, 0x78, 0x27, 0x12, 0xf7, 0x49, 0x36, 0x63, 0x75, + 0x9b, 0x26, 0x19, 0xa5, 0x1b, 0xf1, 0x7f, 0xf9, 0xe5, 0x11, 0xf1, 0xcb, 0x78, 0x0e, 0x22, 0x26, + 0xdf, 0xa8, 0xaa, 0x0c, 0x60, 0x9f, 0x71, 0xec, 0xcb, 0xe1, 0x09, 0x4d, 0x15, 0xc9, 0xf8, 0x31, + 0x55, 0x95, 0x20, 0x1a, 0x57, 0xcb, 0xc4, 0x4c, 0xe2, 0x78, 0x7e, 0xc0, 0x5d, 0x36, 0xa5, 0x08, + 0x6d, 0xca, 0x4a, 0xc1, 0x4d, 0xd6, 0xc9, 0x8f, 0x4b, 0x4a, 0xbe, 0x6a, 0x5e, 0x5b, 0x1c, 0x27, + 0x16, 0x1f, 0x31, 0x52, 0x1c, 0x3d, 0x9e, 0xbf, 0x8e, 0xaa, 0x95, 0x45, 0x1f, 0xee, 0x4a, 0x3a, + 0xff, 0x3a, 0x70, 0xce, 0xa0, 0x73, 0xc5, 0x36, 0xc3, 0xe1, 0x59, 0xf3, 0x3c, 0x7b, 0x8c, 0x79, + 0xdd, 0x7a, 0xec, 0xa5, 0x1b, 0xa2, 0xf7, 0x41, 0xed, 0x3a, 0xc9, 0xb0, 0x12, 0x6e, 0x3d, 0x75, + 0xd1, 0x07, 0xaa, 0x8b, 0x3e, 0x34, 0xe4, 0xfc, 0x40, 0xc3, 0x0c, 0x60, 0x96, 0x59, 0xe5, 0xdf, + 0x25, 0x1f, 0x58, 0x3c, 0xf0, 0x86, 0xfb, 0x1e, 0x9d, 0xa3, 0xd4, 0xa1, 0x78, 0xc4, 0xca, 0x8a, + 0x03, 0xfb, 0xa8, 0xbf, 0x08, 0x02, 0x42, 0x8a, 0xae, 0x6a, 0x17, 0x5d, 0xf3, 0x68, 0x33, 0xb4, + 0x18, 0xee, 0xf7, 0x0c, 0xe2, 0x69, 0x2c, 0xfc, 0xb1, 0xcc, 0x3c, 0x87, 0xa8, 0x70, 0xfd, 0x49, + 0x72, 0x2b, 0x71, 0x3c, 0xa0, 0x02, 0x72, 0x00, 0xc9, 0xd6, 0xcf, 0xea, 0x95, 0x16, 0xee, 0xd7, + 0x94, 0xf7, 0xda, 0x69, 0x29, 0x65, 0x62, 0x1e, 0x88, 0xcb, 0xad, 0x75, 0xe9, 0xaf, 0xbf, 0xb2, + 0xbe, 0x8c, 0x65, 0x15, 0x65, 0xb7, 0x20, 0x3f, 0x52, 0x44, 0x99, 0x3d, 0x2b, 0xb3, 0xf9, 0x77, + 0xb5, 0xfa, 0xcc, 0xeb, 0x52, 0x92, 0x04, 0xa0, 0x3e, 0x3d, 0x09, 0x70, 0x30, 0x6c, 0x41, 0x04, + 0x50, 0x00, 0x41, 0x78, 0xcb, 0xdf, 0xd6, 0xf9, 0x13, 0xc6, 0xa5, 0xe0, 0x78, 0x7b, 0xa8, 0x87, + 0x22, 0x38, 0x57, 0xf3, 0xdd, 0x7e, 0x26, 0x55, 0x4a, 0x51, 0x7d, 0xd6, 0xa8, 0x3e, 0x53, 0x54, + 0x9f, 0x35, 0xca, 0x0b, 0xf7, 0x79, 0x3f, 0x64, 0xa8, 0x05, 0x2d, 0x3e, 0xa8, 0x44, 0x05, 0xa7, + 0xba, 0xe8, 0xc3, 0x61, 0x5d, 0x84, 0xa1, 0xa6, 0x4d, 0x66, 0x45, 0xde, 0x52, 0x6b, 0x17, 0x6e, + 0xf0, 0x67, 0x87, 0xbf, 0x07, 0xc5, 0x15, 0x08, 0x76, 0x16, 0x72, 0xa2, 0x3b, 0xd6, 0x9a, 0xd9, + 0x36, 0x93, 0xd6, 0x6f, 0xd2, 0xfc, 0x66, 0xf0, 0xf3, 0x7f, 0x5e, 0xff, 0xf8, 0x03, 0x4e, 0xd7, + 0x21, 0xc1, 0x4f, 0x96, 0x0f, 0x72, 0x22, 0x66, 0x64, 0xdb, 0x34, 0x35, 0xdc, 0xe1, 0x3b, 0x63, + 0x87, 0xfa, 0x31, 0xd5, 0x41, 0x99, 0x21, 0x7f, 0xa5, 0xf9, 0xec, 0x19, 0xce, 0x51, 0xf5, 0x3d, + 0x20, 0x4e, 0x60, 0xbe, 0x83, 0xe4, 0xfd, 0x5b, 0xc8, 0x98, 0x67, 0xd2, 0xd3, 0xf0, 0x04, 0x1a, + 0x7c, 0x9a, 0xa1, 0xab, 0x13, 0x5e, 0xa0, 0x86, 0x4f, 0x78, 0x75, 0xfa, 0xa0, 0x57, 0x37, 0x76, + 0x80, 0xd3, 0x2a, 0x8f, 0xa7, 0xfa, 0x9b, 0x1f, 0xaf, 0xff, 0xa1, 0x1b, 0x98, 0xc7, 0x4c, 0xab, + 0x7d, 0x6b, 0x36, 0x8c, 0xfa, 0xdc, 0x99, 0x0d, 0xe3, 0xf9, 0xd8, 0xd6, 0x91, 0x5e, 0x9d, 0x8e, + 0xbb, 0xe7, 0x32, 0x97, 0xd5, 0xf1, 0x53, 0xc9, 0xf3, 0x9b, 0x0b, 0x65, 0xe4, 0xf3, 0xb3, 0x9b, + 0x0b, 0xfa, 0x8c, 0x9b, 0xb8, 0x11, 0x6b, 0xe5, 0x76, 0xb1, 0x80, 0xce, 0x4b, 0x20, 0xf1, 0x41, + 0x03, 0x1e, 0x2d, 0xc1, 0xfe, 0x56, 0xda, 0x1a, 0x26, 0xf7, 0xc5, 0xc3, 0x67, 0xbc, 0x7b, 0x71, + 0xd1, 0x59, 0x10, 0x8b, 0x73, 0xb1, 0xeb, 0x8d, 0x13, 0x6e, 0x95, 0x8b, 0x35, 0xf9, 0xac, 0x26, + 0x9f, 0x56, 0xb5, 0x8c, 0xce, 0xf2, 0xd6, 0xd0, 0x68, 0x1a, 0xb4, 0xd6, 0x27, 0x95, 0xa5, 0xaa, + 0xc3, 0x86, 0xf5, 0x77, 0x43, 0xbc, 0x69, 0xf3, 0x5a, 0xaf, 0xa4, 0x71, 0x6f, 0x06, 0x4a, 0xdb, + 0xc3, 0x4d, 0x66, 0x14, 0x8c, 0xff, 0x8a, 0xc4, 0x14, 0xe6, 0x58, 0x69, 0x0a, 0x69, 0xdb, 0x7e, + 0xf6, 0x94, 0xa5, 0x8d, 0x5a, 0x52, 0xe2, 0xab, 0x17, 0xc8, 0xea, 0xa4, 0x0c, 0x7a, 0x16, 0x90, + 0x71, 0xe1, 0xe3, 0x32, 0x8f, 0x21, 0xda, 0x60, 0xce, 0x59, 0x6d, 0x4b, 0x43, 0x4a, 0x6e, 0x3f, + 0xec, 0xeb, 0xe6, 0xda, 0xf6, 0x7c, 0x3e, 0x97, 0xbd, 0xbe, 0x3a, 0x94, 0x68, 0xe7, 0x83, 0x5d, + 0x21, 0x54, 0x9c, 0x81, 0x4d, 0x0f, 0x1b, 0xbf, 0x2c, 0x8a, 0xbc, 0xf8, 0x4c, 0xb4, 0xa1, 0x17, + 0x94, 0xe9, 0xa2, 0x96, 0xd6, 0x54, 0x03, 0x6d, 0x80, 0xbe, 0xb8, 0x62, 0x74, 0x73, 0xd1, 0x88, + 0xf7, 0x53, 0x57, 0x44, 0xeb, 0x79, 0x1b, 0x92, 0x00, 0x3e, 0xe4, 0x0b, 0x4c, 0x99, 0xe8, 0xe3, + 0xfb, 0x5e, 0x46, 0x36, 0xbf, 0x2b, 0x01, 0x43, 0xf5, 0x2f, 0x2b, 0x7e, 0x9d, 0xa6, 0x34, 0x51, + 0x6d, 0x47, 0x7c, 0xd6, 0x03, 0x4c, 0x7c, 0x84, 0x4f, 0xc1, 0xbb, 0x76, 0xb5, 0xdd, 0xa9, 0xa8, + 0x68, 0x73, 0x6a, 0x30, 0x4b, 0xae, 0x07, 0x9c, 0x18, 0xb3, 0xb3, 0x50, 0xa3, 0xac, 0xdf, 0xde, + 0xf6, 0xcf, 0x92, 0x87, 0x27, 0xf4, 0x48, 0x97, 0xbf, 0x2a, 0x00, 0xb1, 0x46, 0x5d, 0x07, 0x16, + 0x9e, 0xb6, 0x13, 0x82, 0xbf, 0x15, 0xaf, 0xdf, 0x15, 0xd1, 0x2d, 0xc5, 0xe2, 0xe1, 0xac, 0x9d, + 0xbe, 0x00, 0xcf, 0xc5, 0xc7, 0x4b, 0xfa, 0x53, 0x51, 0xeb, 0x84, 0x65, 0x15, 0xc2, 0xf1, 0x75, + 0x41, 0x72, 0xb3, 0x47, 0x9a, 0xaa, 0xfc, 0x69, 0x6d, 0x8f, 0xe0, 0x41, 0x56, 0xbe, 0x74, 0xd8, + 0xa7, 0x17, 0xd4, 0x4d, 0x55, 0x8a, 0x3d, 0xb2, 0x80, 0xbe, 0x50, 0xb8, 0x8c, 0xd2, 0x14, 0x7f, + 0x1c, 0xa5, 0xd9, 0x9c, 0x19, 0xee, 0x94, 0xad, 0x97, 0x03, 0x95, 0x87, 0xa4, 0xce, 0x28, 0x69, + 0xa0, 0xd6, 0xd7, 0x1f, 0xed, 0x65, 0x39, 0x43, 0xa9, 0x46, 0x67, 0xd0, 0x5e, 0x39, 0xa7, 0x5a, + 0xf5, 0x9b, 0x1c, 0xa8, 0xc6, 0x71, 0xe6, 0x9f, 0xd9, 0x9d, 0x55, 0x17, 0x3e, 0xc3, 0xe3, 0x3f, + 0xff, 0x86, 0x5b, 0x4b, 0xdb, 0x62, 0xe0, 0x6d, 0x3e, 0x0c, 0x75, 0x3e, 0x0b, 0xb5, 0x21, 0x85, + 0x28, 0xbf, 0x1a, 0xb4, 0xc9, 0x28, 0x11, 0x84, 0xfc, 0x00, 0xe4, 0x04, 0x9b, 0x87, 0xd3, 0x63, + 0xed, 0x7a, 0x79, 0x7c, 0xf8, 0x35, 0x07, 0xe3, 0x4c, 0xe8, 0xa5, 0xc3, 0x39, 0x49, 0x87, 0x82, + 0x7e, 0x0b, 0xf7, 0x2f, 0xbf, 0x64, 0x5f, 0x7e, 0xd9, 0x2a, 0x51, 0x77, 0x0e, 0xc4, 0x67, 0x67, + 0x2f, 0xaf, 0xdf, 0xb4, 0x42, 0xc0, 0x53, 0x57, 0x7f, 0x45, 0xf7, 0x23, 0x2b, 0xbf, 0x3d, 0xb1, + 0xae, 0xe7, 0xa3, 0x26, 0xe3, 0xd0, 0x01, 0x8a, 0x13, 0x31, 0xb5, 0x0b, 0xbc, 0x7e, 0x23, 0x11, + 0x65, 0xb1, 0xa5, 0xbd, 0x49, 0xf1, 0x37, 0x46, 0xb5, 0xfb, 0x28, 0x81, 0x99, 0xa5, 0x96, 0x26, + 0x15, 0x68, 0x0a, 0xfd, 0x2e, 0x0d, 0x0e, 0x83, 0xdf, 0x9c, 0xe0, 0xaf, 0x9d, 0xe0, 0x4e, 0x8a, + 0xb6, 0x01, 0x68, 0x56, 0x4f, 0xe8, 0xe3, 0xbf, 0x88, 0x82, 0xab, 0xae, 0xea, 0xa6, 0x9f, 0xba, + 0x02, 0x8a, 0xb7, 0xf2, 0x67, 0xfb, 0x9d, 0xcc, 0x08, 0xe0, 0xf5, 0xef, 0xf4, 0x5b, 0x0e, 0x60, + 0xbe, 0x79, 0x86, 0xbd, 0xe7, 0x51, 0xf9, 0x90, 0x2d, 0x28, 0xfd, 0x92, 0x5b, 0x2d, 0x47, 0x72, + 0x87, 0x64, 0x8d, 0x52, 0x84, 0x09, 0xd1, 0x0c, 0x77, 0x9d, 0x22, 0xc2, 0xfb, 0x49, 0x79, 0xc3, + 0xac, 0xde, 0xe7, 0xb4, 0x2c, 0x4b, 0xa6, 0x31, 0x87, 0x6b, 0xbd, 0x90, 0x20, 0x92, 0x34, 0x8c, + 0x6e, 0x66, 0x24, 0xb6, 0xac, 0xc4, 0x66, 0x50, 0x0e, 0xca, 0xc2, 0x30, 0x98, 0xe0, 0x36, 0xe8, + 0xde, 0x40, 0xd5, 0x8d, 0xe2, 0xaf, 0x4b, 0x44, 0x16, 0xc5, 0x0d, 0x85, 0x62, 0xb1, 0x18, 0x7f, + 0x37, 0xa3, 0x65, 0x5b, 0xe2, 0x48, 0xbb, 0x5c, 0x4c, 0x66, 0x0f, 0xac, 0x5b, 0xfd, 0xf2, 0x81, + 0xc9, 0x5a, 0xfe, 0x79, 0x79, 0xb7, 0x01, 0x1d, 0x99, 0x90, 0x4d, 0x70, 0xeb, 0xaf, 0xdb, 0x00, + 0x0f, 0x8d, 0xca, 0x7a, 0x19, 0xa2, 0x3b, 0x4d, 0x44, 0x0c, 0xad, 0xa1, 0x44, 0x77, 0x07, 0xc3, + 0x60, 0xe2, 0x24, 0xeb, 0x85, 0xc6, 0x74, 0x9b, 0x08, 0xdd, 0xc2, 0x56, 0xca, 0xc7, 0x56, 0x07, + 0x63, 0xd5, 0x7a, 0x7a, 0x74, 0x51, 0x5e, 0xac, 0xdb, 0x3f, 0x69, 0x89, 0xfd, 0xf4, 0x6f, 0xf1, + 0x88, 0xad, 0x5a, 0xfe, 0x9b, 0x28, 0xb8, 0x6c, 0x7a, 0x74, 0xa5, 0x55, 0xf8, 0x64, 0x6a, 0x5f, + 0x7f, 0xe9, 0x7c, 0xaa, 0x87, 0xb2, 0x95, 0x4b, 0x9d, 0xd4, 0xaf, 0x87, 0x4f, 0xf5, 0x53, 0x93, + 0x43, 0x3e, 0x5a, 0xf3, 0x55, 0xe8, 0x49, 0x0c, 0x5b, 0x2a, 0x38, 0xac, 0x77, 0xab, 0x5b, 0xbf, + 0xf2, 0xf0, 0x18, 0x89, 0xea, 0xae, 0x3c, 0x07, 0xc1, 0x1e, 0xc7, 0xb8, 0xb3, 0x0a, 0x4d, 0x9f, + 0xa3, 0x7d, 0x42, 0xfb, 0x46, 0x5b, 0x8e, 0xf6, 0x68, 0x7c, 0xe5, 0xd0, 0x10, 0x2e, 0xf1, 0xb0, + 0x2d, 0x8a, 0x97, 0xd8, 0xde, 0xe1, 0x42, 0x87, 0xf1, 0x71, 0x52, 0xe2, 0x4e, 0x5e, 0x2c, 0xa2, + 0xd3, 0x49, 0xce, 0xf0, 0x85, 0x22, 0x3e, 0x67, 0xc5, 0x34, 0xb3, 0x27, 0xc3, 0xb6, 0x52, 0xda, + 0x9b, 0xfc, 0xea, 0xe4, 0x40, 0xd3, 0x53, 0xb5, 0x0e, 0x38, 0xc8, 0xd9, 0xf9, 0x99, 0xf8, 0x36, + 0x0e, 0x7f, 0x1d, 0x4b, 0xfc, 0xa2, 0xcb, 0xf9, 0x19, 0xfd, 0xff, 0x61, 0xfe, 0x0f, 0x8d, 0xa3, + 0x64, 0xd8, 0x37, 0x66, 0x00, 0x00 }; \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 35d466b..d157f58 100644 --- a/platformio.ini +++ b/platformio.ini @@ -14,6 +14,7 @@ board = nodemcu-32s framework = arduino monitor_speed = 115200 upload_speed = 921600 +board_build.f_cpu = 240000000L lib_deps = bxparks/AceButton@1.9.2 jandelgado/JLed@4.11.0 diff --git a/src/MqttManager.cpp b/src/MqttManager.cpp index 40a995f..73d6f34 100644 --- a/src/MqttManager.cpp +++ b/src/MqttManager.cpp @@ -166,7 +166,7 @@ void onMqttConnected() } MqttManager.publish("brightness", "255"); - MqttManager.publish("message", "Hello from Smartpusher"); + MqttManager.publish("message", "Hello from SmartPusher"); MqttManager.publish("image", "image"); MqttManager.publish("scrolling", "true"); MqttManager.publish("page", "time"); @@ -215,7 +215,7 @@ void MqttManager_::setup() Serial.println("Starting Homeassistant discorvery"); device.setUniqueId(mac, sizeof(mac)); - device.setName("Smartpusher"); + device.setName("SmartPusher"); device.setSoftwareVersion(SystemManager.VERSION); device.setManufacturer("Blueforcer"); device.setModel("8 Button Array"); diff --git a/src/SystemManager.cpp b/src/SystemManager.cpp index 278aaa2..3abe0ba 100644 --- a/src/SystemManager.cpp +++ b/src/SystemManager.cpp @@ -15,17 +15,29 @@ #include #include "OLEDDisplayUi.h" #include "MqttManager.h" +#include "converter.h" + +// Image data structure +typedef struct +{ + uint8_t *buffer; // pointer to image data in RAM + size_t bufferSize; // size of image data in bytes + char *name; // name of image file in SPIFFS +} ImageData; + +#define MAX_IMAGES 10 // maximum number of images that can be stored in RAM +ImageData images[MAX_IMAGES]; // array of stored images +int numImages = 0; // number of images stored in the array SSD1306 display(0x3c, SDA, SCL); OLEDDisplayUi ui(&display); File fsUploadFile; -// This array keeps function pointers to all frames -// frames are the single views that slide in +HTTPClient http; #define DISPLAY_WIDTH 128 // OLED display width, in pixels #define DISPLAY_HEIGHT 64 // OLED display height, in pixels int16_t x_con = 128; -const char *VERSION = "2.20"; +const char *VERSION = "2.50"; time_t now; tm timeInfo; @@ -33,26 +45,28 @@ tm timeInfo; uint8_t InternalScreen = 0; boolean connected = false; -StaticJsonDocument<1024> pages; +StaticJsonDocument<4096> pages; unsigned long previousMillis = 0; const long CLOCK_INTERVAL = 1000; const long PICTURE_INTERVAL = 2000; const long CHECK_WIFI_TIME = 10000; -bool readyForWeatherUpdate = false; +bool readyDataUpdate = false; long timeSinceLastWUpdate = 0; unsigned long PREVIOUS_WIFI_CHECK = 0; unsigned long PREVIOUS_WEATHER_CHECK = 0; unsigned long PREVIOUS_WIFI_MILLIS = 0; const int UPDATE_INTERVAL_SECS = 20 * 60; // Update every 20 minutes -const char *Pushtype; -bool _HIDE_DATE; -bool _HIDE_SECONDS; -String MY_CITY; +bool _SHOW_DATE; +bool _SHOW_SECONDS; +String _MY_CITY; + +const char *Pushtype; String MQTTMessage; -String Image; +String ImageName; uint8_t BtnNr; + boolean TypeShown; boolean MessageShown; boolean ImageShown; @@ -62,8 +76,6 @@ String fDate; String fTime; uint8_t lastBrightness = 100; -void updateData(OLEDDisplay *display); -bool FIRST_UPDATE; const String weekDays[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; #define FILESYSTEM LittleFS @@ -74,9 +86,6 @@ FSWebServer mws(FILESYSTEM, server); const char *dropdownList[LIST_SIZE] = { "Off", "On", "Fade", "Extern", "OnPush"}; -// Create a buffer for the JSON data -const size_t capacity = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 100; -DynamicJsonDocument doc(3072); String cur_temp, cur_condition, cur_icon; // The getter for the instantiated singleton instance @@ -87,12 +96,14 @@ SystemManager_ &SystemManager_::getInstance() } IPAddress local_IP; - IPAddress gateway; IPAddress subnet; IPAddress primaryDNS; IPAddress secondaryDNS; +int overlaysCount = 1; +int TotalFrames = 0; +int CustomFrames = 0; // Initialize the global shared instance SystemManager_ &SystemManager = SystemManager.getInstance(); @@ -110,11 +121,11 @@ void startFilesystem() Serial.printf("FS File: %s, size: %lu\n", fileName, (long unsigned)fileSize); file = root.openNextFile(); } - Serial.println(); + DEBUG_PRINTLN(); } else { - Serial.println("ERROR on mounting filesystem. It will be formmatted!"); + DEBUG_PRINTLN("ERROR on mounting filesystem. It will be formmatted!"); FILESYSTEM.format(); ESP.restart(); } @@ -126,7 +137,7 @@ bool SystemManager_::loadOptions() if (FILESYSTEM.exists("/config.json")) { mws.getOptionValue("Use RGB buttons", RGB_BUTTONS); - mws.getOptionValue("Use customized pages", CUSTOM_PAGES); + mws.getOptionValue("Show customized pages", CUSTOM_PAGES); mws.getOptionValue("Pushmode for Button 1", BTN1_PUSH); mws.getOptionValue("Pushmode for Button 2", BTN2_PUSH); mws.getOptionValue("Pushmode for Button 3", BTN3_PUSH); @@ -156,8 +167,10 @@ bool SystemManager_::loadOptions() mws.getOptionValue("Subnet", NET_SN); mws.getOptionValue("Primary DNS", NET_PDNS); mws.getOptionValue("Secondary DNS", NET_SDNS); - mws.getOptionValue("Hide date", HIDE_DATE); - mws.getOptionValue("Hide seconds", HIDE_SECONDS); + mws.getOptionValue("Hide date", SHOW_DATE); + mws.getOptionValue("Hide seconds", SHOW_SECONDS); + mws.getOptionValue("Show DateTime page", SHOW_DATETIME); + mws.getOptionValue("Show Weather page", SHOW_WEATHER); if (!local_IP.fromString(NET_IP) || !gateway.fromString(NET_GW) || !subnet.fromString(NET_SN) || !primaryDNS.fromString(NET_PDNS) || !secondaryDNS.fromString(NET_SDNS)) NET_STATIC = false; @@ -165,7 +178,7 @@ bool SystemManager_::loadOptions() return true; } else - Serial.println(F("File \"config.json\" not exist")); + DEBUG_PRINTLN(F("File \"config.json\" not exist")); return false; } @@ -173,7 +186,7 @@ void SystemManager_::saveOptions() { mws.saveOptionValue("Homeassistant discovery", HA_DISCOVERY); mws.saveOptionValue("Use RGB buttons", RGB_BUTTONS); - mws.saveOptionValue("Use customized pages", CUSTOM_PAGES); + mws.saveOptionValue("Show customized pages", CUSTOM_PAGES); mws.saveOptionValue("Pushmode for Button 1", BTN1_PUSH); mws.saveOptionValue("Pushmode for Button 2", BTN2_PUSH); mws.saveOptionValue("Pushmode for Button 3", BTN3_PUSH); @@ -202,13 +215,16 @@ void SystemManager_::saveOptions() mws.saveOptionValue("Subnet", NET_SN); mws.saveOptionValue("Primary DNS", NET_PDNS); mws.saveOptionValue("Secondary DNS", NET_SDNS); - mws.saveOptionValue("Hide date", HIDE_DATE); - mws.saveOptionValue("Hide seconds", HIDE_SECONDS); - Serial.println(F("Application options saved.")); + mws.saveOptionValue("Hide date", SHOW_DATE); + mws.saveOptionValue("Hide seconds", SHOW_SECONDS); + mws.saveOptionValue("Show DateTime page", SHOW_DATETIME); + mws.saveOptionValue("Show Weather page", SHOW_WEATHER); + + DEBUG_PRINTLN(F("Application options saved.")); } // function to get the name of the current screen -String getPageNameName(int index) +String getPageByIndex(int index) { int i = 0; @@ -268,7 +284,9 @@ void SystemManager_::sendCustomPageKeys() for (JsonPair item : obj.as()) { String key = item.key().c_str(); - if (key != "x" && key != "y" && key != "s") + if (key == "t" && item.value().as() == "text") + continue; + if (key != "x" && key != "y" && key != "s" && key != "t") { String topic = "custompage/" + String(page.key().c_str()) + "/" + key; String value = item.value().as(); @@ -279,168 +297,142 @@ void SystemManager_::sendCustomPageKeys() } } -// What's displayed along the top line -void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state) +void addImageToRAM(const String &name) { - display->setColor(WHITE); - display->setFont(ArialMT_Plain_10); - display->setTextAlignment(TEXT_ALIGN_LEFT); - char buff[16]; - sprintf_P(buff, PSTR("%02d:%02d"), timeInfo.tm_hour, timeInfo.tm_min); - display->drawString(0, 54, String(buff)); - display->setTextAlignment(TEXT_ALIGN_RIGHT); - display->drawString(128, 54, cur_temp + "°C"); - display->drawHorizontalLine(0, 52, 128); -} + DEBUG_PRINTLN(name); + for (int i = 0; i < numImages; i++) + { + if (strcmp(images[i].name, name.c_str()) == 0) + { + // Image already in RAM, do nothing + return; + } + } -void customFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -{ - String pageName = getPageNameName(0); - if (pageName != "") + // Load image from SPIFFS into RAM + // Load image from SPIFFS into RAM + File myFile = FILESYSTEM.open("/" + name + ".bin", "r"); + if (myFile) { - JsonArray page = pages[pageName].as(); - for (JsonObject obj : page) + uint8_t w = myFile.read(); + uint8_t h = myFile.read(); + size_t dataIndex = 2; + size_t xbmDataIndex = 0; + uint8_t xbmData[(w / 8) * h]; + for (size_t y = 0; y < h; y++) { - int x1 = obj["x"]; - int y1 = obj["y"]; - int s = obj["s"]; - switch (s) - { - case 10: - display->setFont(ArialMT_Plain_10); - break; - case 16: - display->setFont(ArialMT_Plain_16); - break; - case 24: - display->setFont(ArialMT_Plain_24); - break; - case 30: - display->setFont(Roboto_Black_30); - break; - case 36: - display->setFont(Roboto_Black_36); - break; - default: - display->setFont(ArialMT_Plain_10); - break; - } - JsonObject::iterator it = obj.begin(); - while (it != obj.end()) + for (size_t i = 0; i < (w / 8); i++) { - String key = it->key().c_str(); - if (key != "x" && key != "y" && key != "s") - { - String vt = it->value().as(); - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->drawString(x1 + x, y1 + y, vt); - } - ++it; + uint8_t b = myFile.read(); + xbmData[xbmDataIndex++] = b; + dataIndex++; } } + myFile.close(); + // Add image data to array + images[numImages].buffer = (uint8_t *)malloc(xbmDataIndex + 2); + if (!images[numImages].buffer) + { + DEBUG_PRINTLN("Out of memory error"); + return; + } + images[numImages].buffer[0] = w; + images[numImages].buffer[1] = h; + memcpy(&images[numImages].buffer[2], xbmData, xbmDataIndex); + images[numImages].bufferSize = xbmDataIndex + 2; + images[numImages].name = strdup(name.c_str()); + numImages++; } } -void customFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +void renderImage(uint8_t x, uint8_t y, const String &name) { + // Find image in array + int imageIndex = -1; + for (int i = 0; i < numImages; i++) + { + if (strcmp(images[i].name, name.c_str()) == 0) + { + imageIndex = i; + break; + } + } + if (imageIndex < 0) + { + DEBUG_PRINTLN("Image not found in RAM, load from SPIFFS"); + addImageToRAM(name); + imageIndex = numImages - 1; + } + // Display image from RAM buffer + uint8_t w = images[imageIndex].buffer[0]; + uint8_t h = images[imageIndex].buffer[1]; + uint8_t *xbmData = &images[imageIndex].buffer[2]; + size_t xbmDataSize = images[imageIndex].bufferSize - 2; + display.drawXbm(x, y, w, h, xbmData); +} - String pageName = getPageNameName(1); - if (pageName != "") +void SystemManager_::renderImagePage() +{ + display.clear(); + renderImage(0, 0, ImageName); + display.display(); + unsigned long currentMillis = millis(); + if (currentMillis - previousMillis >= TIME_PER_FRAME) { - JsonArray page = pages[pageName].as(); - for (JsonObject obj : page) + previousMillis = currentMillis; + InternalScreen = 0; + ImageShown = false; + } +} + +// What's displayed along the top line +void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state) +{ + if (TotalFrames < 7) + { + display->setColor(WHITE); + display->setFont(ArialMT_Plain_10); + display->setTextAlignment(TEXT_ALIGN_LEFT); + char buff[16]; + sprintf_P(buff, PSTR("%02d:%02d"), timeInfo.tm_hour, timeInfo.tm_min); + display->drawString(0, 54, String(buff)); + + if (cur_temp != "") { - int x1 = obj["x"]; - int y1 = obj["y"]; - int s = obj["s"]; - switch (s) - { - case 10: - display->setFont(ArialMT_Plain_10); - break; - case 16: - display->setFont(ArialMT_Plain_16); - break; - case 24: - display->setFont(ArialMT_Plain_24); - break; - case 30: - display->setFont(Roboto_Black_30); - break; - case 36: - display->setFont(Roboto_Black_36); - break; - default: - display->setFont(ArialMT_Plain_10); - break; - } - JsonObject::iterator it = obj.begin(); - while (it != obj.end()) - { - String key = it->key().c_str(); - if (key != "x" && key != "y" && key != "s") - { - String vt = it->value().as(); - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->drawString(x1 + x, y1 + y, vt); - } - ++it; - } + display->setTextAlignment(TEXT_ALIGN_RIGHT); + display->drawString(128, 54, cur_temp + "°C"); + display->drawHorizontalLine(0, 52, 128); } } } -void customFrame3(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +void SystemManager_::setCustomPageVariables(String PageName, String variableName, String Value) { - String pageName = getPageNameName(2); - if (pageName != "") + if (CustomFrames == 0) + return; + if (pages.containsKey(PageName)) { - JsonArray page = pages[pageName].as(); + pages.garbageCollect(); + JsonArray page = pages[PageName].as(); for (JsonObject obj : page) { - int x1 = obj["x"]; - int y1 = obj["y"]; - int s = obj["s"]; - switch (s) - { - case 10: - display->setFont(ArialMT_Plain_10); - break; - case 16: - display->setFont(ArialMT_Plain_16); - break; - case 24: - display->setFont(ArialMT_Plain_24); - break; - case 30: - display->setFont(Roboto_Black_30); - break; - case 36: - display->setFont(Roboto_Black_36); - break; - default: - display->setFont(ArialMT_Plain_10); - break; - } - JsonObject::iterator it = obj.begin(); - while (it != obj.end()) + if (obj.containsKey(variableName)) { - String key = it->key().c_str(); - if (key != "x" && key != "y" && key != "s") - { - String vt = it->value().as(); - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->drawString(x1 + x, y1 + y, vt); - } - ++it; + DEBUG_PRINTLN("Set " + Value + " for " + variableName + " in " + PageName); + obj[variableName] = Value; + return; } } } + else + { + DEBUG_PRINTLN("Page " + PageName + " not found!"); + } } -void customFrame4(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +void drawCustomFrame(uint8_t pageIndex, OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { - String pageName = getPageNameName(3); + String pageName = getPageByIndex(pageIndex); if (pageName != "") { JsonArray page = pages[pageName].as(); @@ -448,44 +440,116 @@ void customFrame4(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, in { int x1 = obj["x"]; int y1 = obj["y"]; - int s = obj["s"]; - switch (s) - { - case 10: - display->setFont(ArialMT_Plain_10); - break; - case 16: - display->setFont(ArialMT_Plain_16); - break; - case 24: - display->setFont(ArialMT_Plain_24); - break; - case 30: - display->setFont(Roboto_Black_30); - break; - case 36: - display->setFont(Roboto_Black_36); - break; - default: - display->setFont(ArialMT_Plain_10); - break; - } - JsonObject::iterator it = obj.begin(); - while (it != obj.end()) + display->setTextAlignment(TEXT_ALIGN_LEFT); + String type = obj["t"].as(); + if (type == "text") { - String key = it->key().c_str(); - if (key != "x" && key != "y" && key != "s") + if (obj.containsKey("s")) + { + int s = obj["s"]; + switch (s) + { + case 10: + display->setFont(ArialMT_Plain_10); + break; + case 16: + display->setFont(ArialMT_Plain_16); + break; + case 24: + display->setFont(ArialMT_Plain_24); + break; + case 30: + display->setFont(Roboto_Black_30); + break; + case 36: + display->setFont(Roboto_Black_36); + break; + default: + display->setFont(ArialMT_Plain_10); + break; + } + } + JsonObject::iterator it = obj.begin(); + while (it != obj.end()) { + String key = it->key().c_str(); String vt = it->value().as(); - display->setTextAlignment(TEXT_ALIGN_LEFT); + if (key == "x" || key == "y" || key == "s" || key == "t") + { + ++it; // Gehe zum nächsten Eintrag + continue; // Überspringe die Verarbeitung dieses Eintrags + } + + if (!it->value().is()) + { + DEBUG_PRINTLN("Ungültiger Wert für Schlüssel in " + pageName + ": " + key + "-" + vt); + serializeJson(obj, Serial); + break; // Beende die Schleife, um die komplette JSON-Ausgabe nur einmal anzuzeigen + } display->drawString(x1 + x, y1 + y, vt); + ++it; } - ++it; + } + else if (type == "image") + { + String image = obj["i"].as(); + renderImage(x1 + x, y1 + y, image); + } + else if (type == "bar") + { + int w = obj["w"]; + int h = obj["h"]; + int v = obj["v"]; + display->drawProgressBar(x1 + x, y1 + y, w, h, v); + } + else + { + // Handle andere Strings } } } } +void customFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(0, display, state, x, y); +} + +void customFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(1, display, state, x, y); +} + +void customFrame3(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(2, display, state, x, y); +} + +void customFrame4(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(3, display, state, x, y); +} + +void customFrame5(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(4, display, state, x, y); +} + +void customFrame6(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(5, display, state, x, y); +} + +void customFrame7(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(6, display, state, x, y); +} + +void customFrame8(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + drawCustomFrame(7, display, state, x, y); +} + String getMeteoconIcon(String icon) { bool night; @@ -596,8 +660,6 @@ String getMeteoconIcon(String icon) { return "M"; } - // Nothing matched: N/A - Serial.println(icon); return ")"; } @@ -623,32 +685,20 @@ void weatherFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, in display->drawString(64 + x + x_con, 38 + y, cur_condition); display->setFont(ArialMT_Plain_24); display->setTextAlignment(TEXT_ALIGN_LEFT); - String temp = cur_temp + "C°"; - display->drawString(60 + x, 5 + y, temp); + display->drawString(60 + x, 5 + y, cur_temp + "C°"); display->setFont(Meteocons_Plain_36); display->setTextAlignment(TEXT_ALIGN_CENTER); display->drawString(32 + x, 0 + y, getMeteoconIcon(cur_icon)); } -void drawProgress(OLEDDisplay *display, int percentage, String label, String adInfo) -{ - display->clear(); - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_10); - display->drawString(64, 10, label); - display->drawProgressBar(2, 28, 124, 10, percentage); - display->drawString(64, 50, adInfo); - display->display(); -} - void drawProgress(OLEDDisplay *display, int percentage, String label) { display->clear(); display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_10); - display->drawString(64, 10, label); - display->drawProgressBar(2, 28, 124, 10, percentage); + display->setFont(ArialMT_Plain_16); + display->drawStringMaxWidth(64, 4, 128, label); + display->drawProgressBar(2, 45, 124, 10, percentage); display->display(); } @@ -659,7 +709,7 @@ void DateTimeFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i timeInfo = localtime(&now); char buff[16]; - if (!_HIDE_DATE) + if (_SHOW_DATE) { display->setTextAlignment(TEXT_ALIGN_CENTER); display->setFont(ArialMT_Plain_16); @@ -669,13 +719,13 @@ void DateTimeFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i display->drawString(64 + x, 2 + y, String(buff)); display->setFont(ArialMT_Plain_24); - if (_HIDE_SECONDS) + if (_SHOW_SECONDS) { - sprintf_P(buff, PSTR("%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min); + sprintf_P(buff, PSTR("%02d:%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec); } else { - sprintf_P(buff, PSTR("%02d:%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec); + sprintf_P(buff, PSTR("%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min); } display->drawString(64 + x, 19 + y, String(buff)); @@ -684,24 +734,19 @@ void DateTimeFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i { display->setTextAlignment(TEXT_ALIGN_CENTER_BOTH); display->setFont(Roboto_Black_30); - if (_HIDE_SECONDS) + if (_SHOW_SECONDS) { - sprintf_P(buff, PSTR("%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min); + sprintf_P(buff, PSTR("%02d:%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec); } else { - sprintf_P(buff, PSTR("%02d:%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec); + sprintf_P(buff, PSTR("%02d:%02d"), timeInfo->tm_hour, timeInfo->tm_min); } display->drawString(64 + x, 28 + y, String(buff)); display->setTextAlignment(TEXT_ALIGN_LEFT); } } -FrameCallback frames[] = {DateTimeFrame, weatherFrame, customFrame1, customFrame2, customFrame3, customFrame4}; -OverlayCallback overlays[] = {msOverlay}; -int overlaysCount = 1; -int frameCount = 2; - void SettingsSaved(String result) { ButtonManager.setStates(); @@ -710,12 +755,12 @@ void SettingsSaved(String result) void update_started() { - Serial.println("CALLBACK: HTTP update process started"); + DEBUG_PRINTLN("CALLBACK: HTTP update process started"); } void update_finished() { - Serial.println("CALLBACK: HTTP update process finished"); + DEBUG_PRINTLN("CALLBACK: HTTP update process finished"); } void update_progress(int cur, int total) @@ -724,7 +769,7 @@ void update_progress(int cur, int total) Serial.printf("CALLBACK: HTTP update process at %d of %d bytes...\n", cur, total); int percent = (100 * cur) / total; - Serial.println(percent); + DEBUG_PRINTLN(percent); display.display(); if (percent != last_percent) @@ -741,14 +786,8 @@ void update_progress(int cur, int total) } } -//////////////////////////// HTTP Request Handlers //////////////////////////////////// -void handleLoadOptions() -{ - WebServerClass *webRequest = mws.getRequest(); - // loadOptions(); - Serial.println(F("Application option loaded after web request")); - webRequest->send(200, "text/plain", "Options loaded"); -} +std::vector frames; +OverlayCallback overlays[] = {msOverlay}; // function to load screens from JSON file bool loadCustomScreens() @@ -758,106 +797,77 @@ bool loadCustomScreens() File file = FILESYSTEM.open("/pages.json", "r"); if (!file) { - Serial.println("Failed to open pages.json file"); + DEBUG_PRINTLN("Failed to open pages.json file"); return false; } DeserializationError error = deserializeJson(pages, file); if (error) { - Serial.println("Failed to parse pages.json file"); + DEBUG_PRINTLN("Failed to parse pages.json file"); return false; } - frameCount = frameCount + pages.size(); - } - return true; -} - -static const char save_btn_htm[] PROGMEM = R"EOF( -
    - - -
    - -
    -)EOF"; - -void handleConverterUpload() -{ - String filename; - Serial.println("File incoming.."); - WebServerClass *webRequest = mws.getRequest(); - HTTPUpload &upload = webRequest->upload(); - if (upload.status == UPLOAD_FILE_START) - { - filename = upload.filename; - Serial.println(filename); - if (!filename.startsWith("/")) - filename = "/" + filename; - Serial.print("handleFileUpload Name: "); - Serial.println(filename); - fsUploadFile = FILESYSTEM.open(filename, "w"); // Open the file for writing in SPIFFS (create if it doesn't exist) - filename = String(); - } - else if (upload.status == UPLOAD_FILE_WRITE) - { - if (fsUploadFile) - fsUploadFile.write(upload.buf, upload.currentSize); // Write the received bytes to the file - } - else if (upload.status == UPLOAD_FILE_END) - { - if (fsUploadFile) - { // If the file was successfully created - fsUploadFile.close(); + CustomFrames = pages.size(); + DEBUG_PRINTLN("Found " + String(CustomFrames) + " custom pages"); + void (*customFrames[8])(OLEDDisplay *, OLEDDisplayUiState *, int16_t, int16_t) = {customFrame1, customFrame2, customFrame3, customFrame4, customFrame5, customFrame6, customFrame7, customFrame8}; + for (int i = 0; i < CustomFrames && i < 8; i++) + { + if (customFrames[i] != NULL) + { + frames.push_back(customFrames[i]); + } } } + return true; } void SystemManager_::setup() { - delay(2000); startFilesystem(); - ui.setTargetFPS(40); - ui.setIndicatorPosition(BOTTOM); // You can change this to TOP, LEFT, BOTTOM, RIGHT - ui.setIndicatorDirection(LEFT_RIGHT); // Defines where the first frame is located in the bar - ui.setFrameAnimation(SLIDE_LEFT); // You can change the transition that is used SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN - + ui.setIndicatorPosition(BOTTOM); // You can change this to TOP, LEFT, BOTTOM, RIGHT + ui.setIndicatorDirection(LEFT_RIGHT); // Defines where the first frame is located in the bar + ui.setFrameAnimation(SLIDE_LEFT); // You can change the transition that is used SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN ui.setOverlays(overlays, overlaysCount); // Add overlays ui.init(); // Initialising the UI will init the display too. display.flipScreenVertically(); display.clear(); display.drawXbm(0, 0, 128, 64, logo); display.display(); - delay(1500); + delay(1000); display.clear(); display.setFont(ArialMT_Plain_24); display.setTextAlignment(TEXT_ALIGN_CENTER); display.drawString(64, 20, "v" + String(VERSION)); display.display(); - delay(800); - + delay(500); + drawProgress(&display, 5, "Loading Settings"); if (loadOptions()) - Serial.println(F("Application option loaded")); - else - Serial.println(F("Application options NOT loaded!")); - MY_CITY = CITY; - _HIDE_DATE = HIDE_DATE; - _HIDE_SECONDS = HIDE_SECONDS; + DEBUG_PRINTLN("Application option loaded"); + _MY_CITY = CITY; + _SHOW_DATE = SHOW_DATE; + _SHOW_SECONDS = SHOW_SECONDS; ui.setTimePerFrame(TIME_PER_FRAME); ui.setTimePerTransition(TIME_PER_TRANSITION); if (PAGE_BUTTONS) ui.disableAutoTransition(); - display.clear(); - drawProgress(&display, 0, "Connecting to WiFi"); + drawProgress(&display, 10, "Connecting to WiFi"); if (NET_STATIC) { WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS); } - IPAddress myIP = mws.startWiFi(15000, "SmartPusher", "12345678"); + IPAddress myIP = mws.startWiFi(10000, "SmartPusher", "12345678"); + connected = !(myIP == IPAddress(192, 168, 4, 1)); + if (connected) + { + drawProgress(&display, 10, WiFi.localIP().toString()); + delay(2000); + } + + drawProgress(&display, 20, "Loading Webinterface"); mws.addOptionBox("Network"); mws.addOption("Static IP", NET_STATIC); mws.addOption("Local IP", NET_IP); @@ -884,8 +894,8 @@ void SystemManager_::setup() mws.addOption("Pushmode for Button 7", BTN7_PUSH); mws.addOption("Pushmode for Button 8", BTN8_PUSH); mws.addOptionBox("Time"); - mws.addOption("Hide date", HIDE_DATE); - mws.addOption("Hide seconds", HIDE_SECONDS); + mws.addOption("Show date", SHOW_DATE); + mws.addOption("Show seconds", SHOW_SECONDS); mws.addOption("NTP Server", NTP_SERVER); mws.addOption("Timezone", NTP_TZ); mws.addHTML("

    Find your timezone at posix_tz_db.

    ", "tz_link"); @@ -895,22 +905,29 @@ void SystemManager_::setup() mws.addHTML("

    Weather

    ", "weather_settings"); mws.addOption("City", CITY); mws.addHTML("

    Page Settings

    ", "page_settings"); + mws.addOption("Show DateTime page", SHOW_DATETIME); + mws.addOption("Show Weather page", SHOW_WEATHER); + mws.addOption("Show customized pages", CUSTOM_PAGES); mws.addOption("Control with Button 7&8", PAGE_BUTTONS); - mws.addOption("Use customized pages", CUSTOM_PAGES); mws.addOption("Duration per Page", TIME_PER_FRAME); mws.addOption("Transistion duration", TIME_PER_TRANSITION); - mws.addHandler( - "/converter", HTTP_POST, []() - { mws.getRequest()->send(200); }, - handleConverterUpload); + mws.addOptionBox("Images"); + mws.addHTML(custom_html, "custom-html"); + mws.addJavascript(custom_script); + mws.addCSS(custom_css); mws.getRequest()->setContentLength(10240); - mws.begin(); - connected = !(myIP == IPAddress(192, 168, 4, 1)); + + if (SHOW_DATETIME) + frames.push_back(DateTimeFrame); + if (SHOW_WEATHER) + frames.push_back(weatherFrame); if (CUSTOM_PAGES) loadCustomScreens(); - - ui.setFrames(frames, frameCount); // Add frames + TotalFrames = frames.size(); + ui.setFrames(frames.data(), TotalFrames); // Add frames + if (TotalFrames == 1) + ui.disableAutoTransition(); if (!connected) { display.setFont(ArialMT_Plain_16); @@ -923,70 +940,64 @@ void SystemManager_::setup() } else { - display.setFont(ArialMT_Plain_16); - Serial.print("IP-Adresse = "); - Serial.println(WiFi.localIP()); - display.clear(); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.drawString(64, 10, "CONNECTED!"); - display.drawString(64, 40, WiFi.localIP().toString()); - display.display(); - delay(2000); - connected = true; Update.onProgress(update_progress); configTzTime(NTP_TZ.c_str(), NTP_SERVER.c_str()); MqttManager.setup(); - drawProgress(&display, 10, "Connecting to MQTT"); + drawProgress(&display, 30, "Connecting to MQTT"); MqttManager.tick(); - updateData(&display); + UpdateData(); } + setBrightness(255); } -void updateData(OLEDDisplay *display) +void SystemManager_::UpdateData() { - drawProgress(display, 30, "Updating time"); + DEBUG_PRINTLN("Updating Data"); + drawProgress(&display, 40, "Updating time"); getLocalTime(&timeInfo); - drawProgress(display, 50, "Updating weather"); - HTTPClient http; - String url = "https://wttr.in/" + MY_CITY + "?format=j2"; - http.begin(url); - int httpCode = http.GET(); - if (httpCode == HTTP_CODE_OK) + + if (SHOW_WEATHER) { - String response = http.getString(); - DeserializationError error = deserializeJson(doc, response); - if (error) + drawProgress(&display, 60, "Updating weather"); + String url = "https://wttr.in/" + _MY_CITY + "?format=j2"; + http.begin(url); + int httpCode = http.GET(); + if (httpCode == HTTP_CODE_OK) { - Serial.println("Error deserializing JSON data: " + String(error.c_str())); - return; + String response = http.getString(); + DynamicJsonDocument doc(3072); + DeserializationError error = deserializeJson(doc, response); + if (error) + { + DEBUG_PRINTLN("Error deserializing JSON data: " + String(error.c_str())); + return; + } + cur_temp = doc["current_condition"][0]["temp_C"].as(); + cur_condition = doc["current_condition"][0]["weatherDesc"][0]["value"].as(); + } + else + { + DEBUG_PRINTLN(httpCode); } - cur_temp = doc["current_condition"][0]["temp_C"].as(); - cur_condition = doc["current_condition"][0]["weatherDesc"][0]["value"].as(); - } - else - { - Serial.println(httpCode); - } - http.end(); + http.end(); + drawProgress(&display, 70, "Updating weathericon"); + url = "https://wttr.in/" + _MY_CITY + "?format=%x"; + http.begin(url); + httpCode = http.GET(); + if (httpCode == HTTP_CODE_OK) + { + cur_icon = http.getString(); + } - drawProgress(display, 70, "Updating weathericon"); - url = "https://wttr.in/" + MY_CITY + "?format=%x"; - http.begin(url); - httpCode = http.GET(); - if (httpCode == HTTP_CODE_OK) - { - cur_icon = http.getString(); + http.end(); + drawProgress(&display, 80, "Updating forecasts"); } + readyDataUpdate = false; - http.end(); - FIRST_UPDATE = true; - drawProgress(display, 50, "Updating forecasts"); - - readyForWeatherUpdate = false; - drawProgress(display, 100, "Done!"); + drawProgress(&display, 100, "Done!"); delay(1000); } @@ -995,7 +1006,6 @@ void SystemManager_::tick() mws.run(); if (!connected) { - return; } @@ -1020,13 +1030,13 @@ void SystemManager_::tick() { if (millis() - timeSinceLastWUpdate > (1000L * UPDATE_INTERVAL_SECS)) { - readyForWeatherUpdate = true; + readyDataUpdate = true; timeSinceLastWUpdate = millis(); } - if (readyForWeatherUpdate && ui.getUiState()->frameState == FIXED) + if (readyDataUpdate && ui.getUiState()->frameState == FIXED) { - updateData(&display); + UpdateData(); } int remainingTimeBudget = ui.update(); @@ -1053,7 +1063,6 @@ void SystemManager_::clear() void SystemManager_::setBrightness(uint8_t val) { - display.setContrast(val); if (val == 0) { @@ -1090,7 +1099,7 @@ void SystemManager_::ShowMessage(String msg) void SystemManager_::ShowImage(String img) { - Image = img; + ImageName = img; previousMillis = millis(); InternalScreen = 2; } @@ -1111,7 +1120,6 @@ void SystemManager_::renderMessagePage() display.setTextAlignment(TEXT_ALIGN_CENTER); uint16_t firstline = display.drawStringMaxWidth(64, 0, 128, MQTTMessage.substring(start_at)); display.display(); - unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= CLOCK_INTERVAL) { @@ -1154,70 +1162,6 @@ void SystemManager_::renderButtonPage() } } -void SystemManager_::renderImagePage() -{ - if (FILESYSTEM.exists("/" + Image + ".bin")) - { - - File myFile = FILESYSTEM.open("/" + Image + ".bin", "r"); - if (myFile) - { - display.clear(); - uint8_t w = myFile.read(); - uint8_t h = myFile.read(); - for (size_t y = 0; y < h; y++) - { - uint8_t xpos = 0; - for (size_t i = 0; i < (w / 8); i++) - { - uint8_t b = myFile.read(); - for (uint8_t bt = 0; bt < 8; bt++) - { - display.setPixelColor(xpos++, y, (bitRead(b, bt) ? WHITE : BLACK)); - } - } - } - myFile.close(); - display.display(); - } - } - else - { - display.setFont(ArialMT_Plain_16); - display.drawString(14, 25, "NOT FOUND!"); - display.display(); - } - - unsigned long currentMillis = millis(); - if (currentMillis - previousMillis >= TIME_PER_FRAME) - { - previousMillis = currentMillis; - InternalScreen = 0; - ImageShown = false; - } - SPIFFS.end(); -} - -void SystemManager_::setCustomPageVariables(String PageName, String variableName, String Value) -{ - if (pages.containsKey(PageName)) - { - JsonArray page = pages[PageName].as(); - for (JsonObject obj : page) - { - if (obj.containsKey(variableName)) - { - obj[variableName] = Value; - return; - } - } - } - else - { - Serial.println("Page " + PageName + " not found!"); - } -} - void SystemManager_::nextPage() { ui.nextFrame(); diff --git a/src/SystemManager.h b/src/SystemManager.h index 98df78f..1de54bd 100644 --- a/src/SystemManager.h +++ b/src/SystemManager.h @@ -1,20 +1,34 @@ #ifndef SystemManager_h #define SystemManager_h +//#define _DEBUG_ +#if defined(_DEBUG_) + #include + #define DEBUG_PRINTLN(x) Serial.println(x); + #define DEBUG_PRINT(x) Serial.print(x); +#else + #define DEBUG_PRINTLN(x) + #define DEBUG_PRINT(x) +#endif + #include class SystemManager_ { private: SystemManager_() = default; - + IPAddress local_IP; + IPAddress gateway; + IPAddress subnet; + IPAddress primaryDNS; + IPAddress secondaryDNS; public: - const char *VERSION = "2.20"; + const char *VERSION = "2.50"; String MQTT_HOST; uint16_t MQTT_PORT = 1883; String MQTT_USER; String MQTT_PASS; - String MQTT_PREFIX = "Smartpusher"; + String MQTT_PREFIX = "SmartPusher"; String CITY = "Berlin,de"; bool IS_METRIC = true; bool BTN1_PUSH = false; @@ -32,8 +46,10 @@ class SystemManager_ bool PAGE_BUTTONS = false; bool IO_BROKER = false; bool NET_STATIC = false; - bool HIDE_DATE=false; - bool HIDE_SECONDS=false; + bool SHOW_DATE = true; + bool SHOW_WEATHER = true; + bool SHOW_DATETIME = true; + bool SHOW_SECONDS = true; String NET_IP = "192.168.178.10"; String NET_GW = "192.168.178.1"; String NET_SN = "255.255.255.0"; @@ -57,6 +73,7 @@ class SystemManager_ void renderButtonPage(); void renderClockPage(); void nextPage(); + void UpdateData(); void showPage(String pageName); void previousPage(); void renderWeatherPage(); diff --git a/src/converter.h b/src/converter.h new file mode 100644 index 0000000..c8ec719 --- /dev/null +++ b/src/converter.h @@ -0,0 +1,886 @@ + +/* + * This HTML code will be injected in /setup webpage using a
    element as parent + * The parent element will hhve the HTML id properties equal to 'raw-html-' + * where the id value will be equal to the id parameter passed to the function addHTML(html_code, id). + */ +static const char custom_html[] PROGMEM = R"EOF( +
    +
    +
    +
    +

    1. Select image

    +
    +
    + +
    +
    + +
    +

    2. Image Settings

    +
    +
    + +
    +
    +
    +
      +
      Only images file type are allowed +
      +
      +
      + +
      +
      +
      + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      + +
      + 0 - 255; if the brightness of a pixel is above the given level the pixel becomes + white, otherwise they become black. When using alpha, opaque and transparent are + used instead. +
      +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      + + + + +
      +
      + +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      +
      +
      +
      + Note: centering the image only works when using a canvas larger than the original image. +
      +
      +
      + +
      +

      3. Preview

      +
      +
      +
      +
      + + + +
      + + +
      + +
      +)EOF"; + +static const char custom_css[] PROGMEM = R"EOF( + * { + margin: 0; + padding: 0; + } + + body { + font-family: arial; + } + + .wrapper { + display: flex; + flex-direction: column; + margin: auto; + width: 100%; + } + + .section { + margin: 10px 0; + } + + .bottom-divider { + border-bottom: 2px solid #000000; + padding-bottom: 20px; + } + + .sub-section { + clear: both; + margin-bottom: 1px; + } + + .section, + .sub-section { + width: 100%; + } + + .column { + float: left; + } + + .column-center { + min-width: 160px; + text-align: center; + } + + .column-right { + float: right; + } + + .sub-section-title { + margin: 0 0 10px; + } + + p { + margin: 20px 0; + } + + .table { + display: table; + margin: 10px 0 0; + width: 100%; + } + + .table-row { + display: table-row; + width: 100%; + } + + .table-cell { + display: table-cell; + padding: 5px 0; + } + + .table-cell:first-child { + width: 30%; + } + + .table-cell:last-child { + width: 70%; + } + + .table-cell:first-child label { + font-weight: bold; + } + + .table-cell:last-child label { + margin-right: 10px; + } + + .nested-table { + margin: 0; + } + + .nested-table .table-cell { + color: #666; + font-size: .9em; + width: 200px; + } + + #format-caption-container div { + color: #505050; + display: none; + font-size: .9em; + line-height: 1.4em; + padding: 10px 0 15px; + width: 100%; + } + + .note { + color: #666666; + font-size: .9em; + line-height: 1.4em; + margin: 3px 0; + } + + .file-input-entry { + display: flex; + justify-content: space-between; + margin-bottom: 10px; + } + + .generate-button { + margin: 40px 0 20px; + } + + .remove-button { + margin: 0 0 0 10px; + padding: 1px 4px; + } + + .file-info { + color: #505050; + font-size: .7em; + margin-left: 0px; + max-width: 300px; + white-space: pre; + } + + .size-input { + width: 125px; + } + + .glyph-input { + width: 80px; + margin-left: 10px; + } + + #image-size-settings { + list-style-type: none; + } + + #image-size-settings li { + margin: 4px 0; + } + + #images-canvas-container { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + } + + #arduino-identifier, + #adafruit-gfx-settings, + #all-same-size { + display: none; + } + + .msg { + font-size: 1.2em; + } + + .error-msg { + color: #ff0000; + display: none; + } + )EOF"; + +static const char custom_script[] PROGMEM = R"EOF( + var __output; + + // Output the image as a string for horizontally drawing displays + function horizontal1bit(data, canvasWidth, canvasHeight, filname) { + var output = new Uint8Array(Math.ceil(canvasWidth * canvasHeight / 8) + 2); + var output_index = 0; + + // Write the width and height to the output buffer + output[0] = canvasWidth; + output[1] = canvasHeight; + + var byteIndex = 0; + var number = 0; + + // format is RGBA, so move 4 steps per pixel + for (var index = 0; index < data.length; index += 4) { + // Get the average of the RGB (we ignore A) + var avg = (data[index] + data[index + 1] + data[index + 2]) / 3; + if (avg > settings["threshold"]) { + number += Math.pow(2, byteIndex); + } + byteIndex++; + + // if this was the last pixel of a row or the last pixel of the + // image, fill up the rest of our byte with zeros so it always contains 8 bits + if ((index != 0 && (((index / 4) + 1) % (canvasWidth)) == 0) || (index == data.length - 4)) { + var paddingBits = 8 - byteIndex; + number = number << paddingBits; + output[output_index + 2] = number; + output_index++; + number = 0; + byteIndex = 0; + } + + // When we have the complete 8 bits, write them to the output buffer + if (byteIndex >= 8) { + output[output_index + 2] = number; + output_index++; + number = 0; + byteIndex = 0; + } + } + + // Write the output buffer to a file + var blob = new Blob([output], { type: "application/octet-stream" }); + var formData = new FormData(); + formData.append("data", blob, '/' + filname + '.bin'); + + // POST data using the Fetch API + fetch('/edit', { + method: 'POST', + mode: 'cors', + body: formData + }) + + // Handle the server response + .then(response => response.text()) + .then(text => { + openModalMessage('Success!', '
      Image saved as ' + filname + '
      '); + }); + }; + + // An images collection with helper methods + function Images() { + var collection = []; + this.push = function (img, canvas, glyph) { + collection.push({ "img": img, "canvas": canvas, "glyph": glyph }); + }; + this.remove = function (image) { + var i = collection.indexOf(image); + if (i != -1) collection.splice(i, 1); + }; + this.each = function (f) { collection.forEach(f); }; + this.length = function () { return collection.length; }; + this.first = function () { return collection[0]; }; + this.last = function () { return collection[collection.length - 1]; }; + this.getByIndex = function (index) { return collection[index]; }; + this.setByIndex = function (index, img) { collection[index] = img; }; + this.get = function (img) { + if (img) { + for (var i = 0; i < collection.length; i++) { + if (collection[i].img == img) { + return collection[i]; + } + } + } + return collection; + }; + return this; + } + + // Add events to the file input button + var fileInput = document.getElementById("file-input"); + fileInput.addEventListener("click", function () { this.value = null; }, false); + fileInput.addEventListener("change", handleImageSelection, false); + + var fileInputColumn = document.getElementById("file-input-column"); + + // Filetypes accepted by the file picker + var fileTypes = ["jpg", "jpeg", "png", "bmp", "gif", "svg"]; + + // The canvas we will draw on + var canvasContainer = document.getElementById("images-canvas-container"); + var imageSizeSettings = document.getElementById("image-size-settings"); + var images = new Images(); + + // A bunch of settings used when converting + var settings = { + screenWidth: 128, + screenHeight: 64, + scaleToFit: true, + preserveRatio: true, + centerHorizontally: false, + centerVertically: false, + flipHorizontally: false, + flipVertically: false, + backgroundColor: "white", + scale: "1", + drawMode: "horizontal", + threshold: 128, + outputFormat: "plain", + invertColors: false, + rotate180: false + }; + + // Variable name, when "arduino code" is required + var identifier = "myBitmap"; + + function update() { + images.each(function (image) { place_image(image); }); + } + + // Easy way to update settings controlled by a textfield + function updateInteger(fieldName) { + settings[fieldName] = document.getElementById(fieldName).value; + update(); + } + + // Easy way to update settings controlled by a checkbox + function updateBoolean(fieldName) { + settings[fieldName] = document.getElementById(fieldName).checked; + update(); + } + + // Easy way to update settings controlled by a radiobutton + function updateRadio(fieldName) { + var radioGroup = document.getElementsByName(fieldName); + for (var i = 0; i < radioGroup.length; i++) { + if (radioGroup[i].checked) { + settings[fieldName] = radioGroup[i].value; + } + } + update(); + } + + + // Make the canvas black and white + function blackAndWhite(canvas, ctx) { + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var data = imageData.data; + for (var i = 0; i < data.length; i += 4) { + var avg = (data[i] + data[i + 1] + data[i + 2]) / 3; + avg > settings["threshold"] ? avg = 255 : avg = 0; + data[i] = avg; // red + data[i + 1] = avg; // green + data[i + 2] = avg; // blue + } + ctx.putImageData(imageData, 0, 0); + } + + // Invert the colors of the canvas + function invert(canvas, ctx) { + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var data = imageData.data; + for (var i = 0; i < data.length; i += 4) { + data[i] = 255 - data[i]; // red + data[i + 1] = 255 - data[i + 1]; // green + data[i + 2] = 255 - data[i + 2]; // blue + } + ctx.putImageData(imageData, 0, 0); + } + + // Draw the image onto the canvas, taking into account color and scaling + function place_image(image) { + + var img = image.img; + var canvas = image.canvas; + canvas.style.border = "2px solid red"; + var ctx = canvas.getContext("2d"); + image.ctx = ctx; + + // Invert background if needed + if (settings["backgroundColor"] == "transparent") { + ctx.fillStyle = "rgba(0,0,0,0.0)"; + ctx.globalCompositeOperation = 'copy'; + } else { + if (settings["invertColors"]) { + settings["backgroundColor"] == "white" ? ctx.fillStyle = "black" : ctx.fillStyle = "white"; + } else { + ctx.fillStyle = settings["backgroundColor"]; + } + ctx.globalCompositeOperation = 'source-over'; + } + ctx.fillRect(0, 0, canvas.width, canvas.height); + + ctx.setTransform(1, 0, 0, 1, 0, 0); // start with identity matrix transform (no rotation). + if (settings["rotate180"]) { + // Matrix transformation + ctx.translate(canvas.width / 2.0, canvas.height / 2.0); + ctx.rotate(Math.PI); + ctx.translate(-canvas.width / 2.0, -canvas.height / 2.0); + } + + + // Offset used for centering the image when requested + var offset_x = 0; + var offset_y = 0; + + switch (settings["scale"]) { + case "1": // Original + if (settings["centerHorizontally"]) { offset_x = Math.round((canvas.width - img.width) / 2); } + if (settings["centerVertically"]) { offset_y = Math.round((canvas.height - img.height) / 2); } + ctx.drawImage(img, 0, 0, img.width, img.height, + offset_x, offset_y, img.width, img.height); + break; + case "2": // Fit (make as large as possible without changing ratio) + var horRatio = canvas.width / img.width; + var verRatio = canvas.height / img.height; + var useRatio = Math.min(horRatio, verRatio); + + if (settings["centerHorizontally"]) { offset_x = Math.round((canvas.width - img.width * useRatio) / 2); } + if (settings["centerVertically"]) { offset_y = Math.round((canvas.height - img.height * useRatio) / 2); } + ctx.drawImage(img, 0, 0, img.width, img.height, + offset_x, offset_y, img.width * useRatio, img.height * useRatio); + break; + case "3": // Stretch x+y (make as large as possible without keeping ratio) + ctx.drawImage(img, 0, 0, img.width, img.height, + offset_x, offset_y, canvas.width, canvas.height); + break; + case "4": // Stretch x (make as wide as possible) + offset_x = 0; + if (settings["centerVertically"]) { Math.round(offset_y = (canvas.height - img.height) / 2); } + ctx.drawImage(img, 0, 0, img.width, img.height, + offset_x, offset_y, canvas.width, img.height); + break; + case "5": // Stretch y (make as tall as possible) + if (settings["centerHorizontally"]) { offset_x = Math.round((canvas.width - img.width) / 2); } + offset_y = 0; + ctx.drawImage(img, 0, 0, img.width, img.height, + offset_x, offset_y, img.width, canvas.height); + break; + } + // Make sure the image is black and white + + blackAndWhite(canvas, ctx); + if (settings["invertColors"]) { + invert(canvas, ctx); + } + + + // Flip image if needed + if (settings["flipHorizontally"]) { + ctx.save(); + ctx.scale(-1, 1); + ctx.drawImage(canvas, -canvas.width, 0); + ctx.restore(); + } + if (settings["flipVertically"]) { + ctx.save(); + ctx.scale(1, -1); + ctx.drawImage(canvas, 0, -canvas.height); + ctx.restore(); + } + } + + + // Handle selecting an image with the file picker + function handleImageSelection(evt) { + images.each(function (image) { + images.remove(image); + }); + imageSizeSettings.innerHTML = ""; + update(); + + canvasContainer.innerHTML = ''; + var files = evt.target.files; + for (var i = 0, f; f = files[i]; i++) { + + // Only process image files. + if (!f.type.match("image.*")) { + + continue; + } + + var reader = new FileReader(); + + reader.onload = (function (file) { + return function (e) { + // Render thumbnail. + + var img = new Image(); + + img.onload = function () { + const fileInputColumnEntry = document.createElement("div"); + fileInputColumnEntry.className = "file-input-entry"; + + + + + var canvas = document.createElement("canvas"); + + var imageEntry = document.createElement("li"); + imageEntry.setAttribute("data-img", file.name); + + var w = document.createElement("input"); + w.type = "number"; + w.name = "width"; + w.id = "screenWidth"; + w.min = 0; + w.max = 128; + w.className = "size-input"; + w.value = img.width; + settings["screenWidth"] = img.width; + w.oninput = function () { canvas.width = this.value; update(); updateInteger('screenWidth'); }; + + var h = document.createElement("input"); + h.type = "number"; + h.name = "height"; + h.id = "screenHeight"; + h.min = 0; + h.max = 64; + h.className = "size-input"; + h.value = img.height; + settings["screenHeight"] = img.height; + h.oninput = function () { canvas.height = this.value; update(); updateInteger('screenHeight'); }; + + + var fn = document.createElement("span"); + fn.className = "file-info"; + fn.innerHTML = "File resolution: " + img.width + " x " + img.height; + fn.innerHTML += "
      "; + + + + fileInputColumn.appendChild(fileInputColumnEntry); + + imageEntry.appendChild(fn); + + var sn = document.createElement("span"); + sn.appendChild(w); + sn.appendChild(document.createTextNode(" x ")); + sn.appendChild(h); + imageEntry.appendChild(sn); + + imageSizeSettings.appendChild(imageEntry); + + + if (img.width > 128) { + canvas.width = 128; + w.value = 128; + } else { + canvas.width = img.width; + } + + if (img.height > 64) { + canvas.height = 64; + h.value = 64; + } else { + canvas.height = img.height; + } + + + canvasContainer.appendChild(canvas); + + images.push(img, canvas, file.name.split(".")[0]); + place_image(images.last()); + updateInteger("scale"); + updateRadio('backgroundColor') + + }; + img.src = e.target.result; + }; + })(f); + reader.readAsDataURL(f); + } + } + + function imageToString(image) { + // extract raw image data + var ctx = image.ctx; + var canvas = image.canvas; + + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var data = imageData.data; + horizontal1bit(data, canvas.width, canvas.height, image.glyph); + } + + // Get the custom arduino output variable name, if any + function getIdentifier() { + var vn = document.getElementById("identifier"); + return vn && vn.value.length ? vn.value : identifier; + } + + // Output the image string to the textfield + function outputString() { + var output_string = "", count = 1; + var code = ""; + var comment = ""; + imageToString(images.first()); + } + + function copyOutput() { + navigator.clipboard.writeText(__output); + } + + // Use the horizontally oriented list to draw the image + function listToImageHorizontal(list, canvas) { + + var ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + + var imgData = ctx.createImageData(canvas.width, canvas.height); + + var index = 0; + + var page = 0; + var x = 0; + var y = 7; + // round the width up to the next byte + var widthRoundedUp = Math.floor(canvas.width / 8 + (canvas.width % 8 ? 1 : 0)) * 8; + var widthCounter = 0; + + // Move the list into the imageData object + for (var i = 0; i < list.length; i++) { + + var binString = hexToBinary(list[i]); + if (!binString.valid) { + alert("Something went wrong converting the string. Did you forget to remove any comments from the input?"); + console.log("invalid hexToBinary: ", binString.s); + return; + } + binString = binString.result; + if (binString.length == 4) { + binString = binString + "0000"; + } + + // Check if pixel is white or black + for (var k = 0; k < binString.length; k++, widthCounter++) { + // if we've counted enough bits, reset counter for next line + if (widthCounter >= widthRoundedUp) { + widthCounter = 0; + } + // skip 'artifact' pixels due to rounding up to a byte + if (widthCounter >= canvas.width) { + continue; + } + var color = 0; + if (binString.charAt(k) == "1") { + color = 255; + } + imgData.data[index] = color; + imgData.data[index + 1] = color; + imgData.data[index + 2] = color; + imgData.data[index + 3] = 255; + + index += 4; + } + } + + // Draw the image onto the canvas, then save the canvas contents + // inside the img object. This way we can reuse the img object when + // we want to scale / invert, etc. + ctx.putImageData(imgData, 0, 0); + var img = new Image(); + img.src = canvas.toDataURL("image/png"); + images.first().img = img; + } + + // Use the vertically oriented list to draw the image + function listToImageVertical(list, canvas) { + + var ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + + var index = 0; + + var page = 0; + var x = 0; + var y = 7; + + // Move the list into the imageData object + for (var i = 0; i < list.length; i++) { + + var binString = hexToBinary(list[i]); + if (!binString.valid) { + alert("Something went wrong converting the string. Did you forget to remove any comments from the input?"); + console.log("invalid hexToBinary: ", binString.s); + return; + } + binString = binString.result; + if (binString.length == 4) { + binString = binString + "0000"; + } + + // Check if pixel is white or black + for (var k = 0; k < binString.length; k++) { + var color = 0; + if (binString.charAt(k) == "1") { + color = 255; + } + drawPixel(ctx, x, (page * 8) + y, color); + y--; + if (y < 0) { + y = 7; + x++; + if (x >= settings["screenWidth"]) { + x = 0; + page++; + } + } + + } + } + // Save the canvas contents inside the img object. This way we can + // reuse the img object when we want to scale / invert, etc. + var img = new Image(); + img.src = canvas.toDataURL("image/png"); + images.first().img = img; + } + + // Convert hex to binary + function hexToBinary(s) { + + var i, k, part, ret = ""; + // lookup table for easier conversion. "0" characters are + // padded for "1" to "7" + var lookupTable = { + "0": "0000", "1": "0001", "2": "0010", "3": "0011", "4": "0100", + "5": "0101", "6": "0110", "7": "0111", "8": "1000", "9": "1001", + "a": "1010", "b": "1011", "c": "1100", "d": "1101", "e": "1110", + "f": "1111", "A": "1010", "B": "1011", "C": "1100", "D": "1101", + "E": "1110", "F": "1111" + }; + for (i = 0; i < s.length; i += 1) { + if (lookupTable.hasOwnProperty(s[i])) { + ret += lookupTable[s[i]]; + } else { + return { valid: false, s: s }; + } + } + return { valid: true, result: ret }; + } + + // Quick and effective way to draw single pixels onto the canvas + // using a global 1x1px large canvas + function drawPixel(ctx, x, y, color) { + var single_pixel = ctx.createImageData(1, 1); + var d = single_pixel.data; + + d[0] = color; + d[1] = color; + d[2] = color; + d[3] = 255; + ctx.putImageData(single_pixel, x, y); + } + + // get the type (in arduino code) of the output image + // this is a bit of a hack, it's better to make this a property of the conversion function (should probably turn it into objects) + function getType() { + if (settings.conversionFunction == ConversionFunctions.horizontal565) { + return "uint16_t"; + } else if (settings.conversionFunction == ConversionFunctions.horizontal888) { + return "unsigned long"; + } else { + return "unsigned char"; + } + } +)EOF"; \ No newline at end of file diff --git a/src/test b/src/test new file mode 100644 index 0000000..cd9b20b --- /dev/null +++ b/src/test @@ -0,0 +1,44 @@ +void convert() +{ + File file = FILESYSTEM.open("/test.bmp", "r"); + if (!file) + { + Serial.println("Failed to open test.png"); + return; + } + + // Skip the BMP header + file.seek(10); + int pixel_offset = file.read() | (file.read() << 8) | (file.read() << 16) | (file.read() << 24); + + // Skip to the start of the pixels + file.seek(pixel_offset); + + // Create a buffer to hold the XBM data + uint8_t xbm[128 * 64 / 8]; + + // Convert the BMP image to XBM + for (int i = 0; i < 128 * 64 / 8; i++) + { + uint8_t b = 0; + for (int j = 0; j < 8; j++) + { + int pixel = file.read(); + if (pixel < 128) + { + b |= 1 << (7 - j); + } + } + xbm[i] = b; + } + for (int i = 0; i < 128 * 64 / 8; i++) + { + xbm[i] = ~xbm[i]; + } + // Display the XBM image on the OLED + display.clear(); + display.drawXbm(0, 0, 128, 64, xbm); + display.display(); + + +} \ No newline at end of file