diff --git a/data/js/controls.js b/data/js/controls.js index dcebbc5..58da972 100644 --- a/data/js/controls.js +++ b/data/js/controls.js @@ -481,9 +481,10 @@ function start() { $("#tabscontent").append("
"); // Add touch and click handlers for tab + // Note: Do NOT use e.preventDefault() in touchend - it blocks the click + // event which tabbedcontent.js needs to actually switch tabs $("#tablink" + data.id).on({ touchend: function(e) { - e.preventDefault(); tabclick(data.id); }, mouseup: function(e) { diff --git a/src/dataControlsJS.h b/src/dataControlsJS.h index 7d74b18..dbdf544 100644 --- a/src/dataControlsJS.h +++ b/src/dataControlsJS.h @@ -1,141 +1,5 @@ const char JS_CONTROLS[] PROGMEM = R"=====( -const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UI_TIME=20;const UPDATE_TIME=120;const UI_FILEDISPLAY=21;const UPDATE_FILEDISPLAY=121;const UI_FRAGMENT=98;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var controlAssemblyArray=new Object();var FragmentAssemblyTimer=new Array();var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}} -var websock;var websockConnected=false;var WebSocketTimer=null;function requestOrientationPermission(){} -function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData));} -function restoreGraphData(id){var savedData=localStorage.getItem("espuigraphs",graphData);if(savedData!=null){savedData=JSON.parse(savedData);let idData=savedData[id];return Array.isArray(idData)?idData:[];} -return[];} -function restart(){$(document).add("*").off();$("#row").html("");conStatusError();start();} -function conStatusError(){FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=new Array();controlAssemblyArray=new Array();if(true===websockConnected){websockConnected=false;websock.close();$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart,});}} -function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}} -function start(){let location=window.location.hostname;let port=window.location.port;document.addEventListener("visibilitychange",handleVisibilityChange,false);if(port!=""||port!=80||port!=443){websock=new WebSocket("ws://"+location+":"+port+"/ws");}else{websock=new WebSocket("ws://"+location+"/ws");} -if(null===WebSocketTimer){WebSocketTimer=setInterval(function(){if(websock.readyState===3){restart();}},5000);} -websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=new Array();controlAssemblyArray=new Array();};websock.onclose=function(evt){console.log("websock close");conStatusError();FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=new Array();controlAssemblyArray=new Array();};websock.onerror=function(evt){console.log("websock Error");restart();FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=new Array();controlAssemblyArray=new Array();};var handleEvent=function(evt){try{var data=JSON.parse(evt.data);} -catch(Event){console.error(Event);websock.send("uiok:"+0);return;} -var e=document.body;var center="";switch(data.type){case UI_INITIAL_GUI:$("#row").html("");$("#tabsnav").html("");$("#tabscontent").html("");if(data.sliderContinuous){sliderContinuous=data.sliderContinuous;} -data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>(data.controls.length-1)){websock.send("uiok:"+(data.controls.length-1));} -break;case UI_EXTEND_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>data.startindex+(data.controls.length-1)){websock.send("uiok:"+(data.startindex+(data.controls.length-1)));} -break;case UI_RELOAD:window.location.reload();break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GAUGE:case UI_SEPARATOR:if(data.visible)addToHTML(data);break;case UI_BUTTON:if(data.visible){addToHTML(data);$("#btn"+data.id).on({touchstart:function(e){e.preventDefault();$(this).addClass("pressed");buttonclick(data.id,true);},touchend:function(e){e.preventDefault();$(this).removeClass("pressed");buttonclick(data.id,false);},});} -break;case UI_SWITCHER:if(data.visible){addToHTML(data);switcher(data.id,data.value);} -break;case UI_CPAD:case UI_PAD:if(data.visible){addToHTML(data);$("#pf"+data.id).on({touchstart:function(e){e.preventDefault();$(this).parent().addClass("pressed");padclick(UP,data.id,true);},touchend:function(e){e.preventDefault();$(this).parent().removeClass("pressed");padclick(UP,data.id,false);},});$("#pl"+data.id).on({touchstart:function(e){e.preventDefault();$(this).parent().addClass("pressed");padclick(LEFT,data.id,true);},touchend:function(e){e.preventDefault();$(this).parent().removeClass("pressed");padclick(LEFT,data.id,false);},});$("#pr"+data.id).on({touchstart:function(e){e.preventDefault();$(this).parent().addClass("pressed");padclick(RIGHT,data.id,true);},touchend:function(e){e.preventDefault();$(this).parent().removeClass("pressed");padclick(RIGHT,data.id,false);},});$("#pb"+data.id).on({touchstart:function(e){e.preventDefault();$(this).parent().addClass("pressed");padclick(DOWN,data.id,true);},touchend:function(e){e.preventDefault();$(this).parent().removeClass("pressed");padclick(DOWN,data.id,false);},});$("#pc"+data.id).on({touchstart:function(e){e.preventDefault();$(this).addClass("pressed");padclick(CENTER,data.id,true);},touchend:function(e){e.preventDefault();$(this).removeClass("pressed");padclick(CENTER,data.id,false);},});} -break;case UI_SLIDER:if(data.visible){addToHTML(data);rangeSlider(!sliderContinuous);} -break;case UI_TAB:if(data.visible){$("#tabsnav").append("
  • "+data.value+"
  • ");$("#tabscontent").append("
    ");$("#tablink"+data.id).on({touchend:function(e){e.preventDefault();tabclick(data.id);},mouseup:function(e){tabclick(data.id);}});tabs=$(".tabscontent").tabbedContent({loop:true}).data("api");$("a").filter(function(){return $(this).attr("href")==="#click-to-switch";}).on("click",function(e){var tab=prompt("Tab to switch to (number or id)?");if(!tabs.switchTab(tab)){alert("That tab does not exist :\\");} -e.preventDefault();});} -break;case UI_OPTION:if(data.parentControl){var parent=$("#select"+data.parentControl);parent.append("");} -break;case UI_MIN:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("min",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("min",data.value);}} -break;case UI_MAX:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("max",data.value);}else if($('#text'+data.parentControl).length){$('#text'+data.parentControl).attr("maxlength",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("max",data.value);}} -break;case UI_STEP:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("step",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("step",data.value);}} -break;case UI_GRAPH:if(data.visible){addToHTML(data);graphData[data.id]=restoreGraphData(data.id);renderGraphSvg(graphData[data.id],"graph"+data.id);} -break;case ADD_GRAPH_POINT:var ts=new Date().getTime();graphData[data.id].push({x:ts,y:data.value});saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case CLEAR_GRAPH:graphData[data.id]=[];saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case UI_ACCEL:if(hasAccel)break;hasAccel=true;if(data.visible){addToHTML(data);requestOrientationPermission();} -break;case UI_FILEDISPLAY:if(data.visible) -{addToHTML(data);FileDisplayUploadFile(data);} -break;case UPDATE_LABEL:$("#l"+data.id).html(data.value);if(data.hasOwnProperty('elementStyle')){$("#l"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_SWITCHER:switcher(data.id,data.value=="0"?0:1);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_SLIDER:$("#sl"+data.id).attr("value",data.value) -slider_move($("#sl"+data.id).parent().parent(),data.value,"100",false);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#num"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#text"+data.id).attr("style",data.elementStyle);} -if(data.hasOwnProperty('inputType')){$("#text"+data.id).attr("type",data.inputType);} -break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#select"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);$("#btn"+data.id).text(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#gauge"+data.id).attr("style",data.elementStyle);} -break;case UPDATE_ACCEL:break;case UPDATE_TIME:var rv=new Date().toISOString();websock.send("time:"+rv+":"+data.id);break;case UPDATE_FILEDISPLAY:FileDisplayUploadFile(data);break;case UI_FRAGMENT:let FragmentLen=data.length;let FragementOffset=data.offset;let NextFragmentOffset=FragementOffset+FragmentLen;let Total=data.total;let Arrived=(FragmentLen+FragementOffset);let FragmentFinal=Total===Arrived;if(!data.hasOwnProperty('control')) -{console.error("UI_FRAGMENT:Missing control record, skipping control");break;} -let control=data.control;StopFragmentAssemblyTimer(data.control.id);if(0===FragementOffset) -{controlAssemblyArray[control.id]=data;controlAssemblyArray[control.id].offset=NextFragmentOffset;StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':NextFragmentOffset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");break;} -if("undefined"===typeof controlAssemblyArray[control.id]) -{console.error("Missing first fragment for control: "+control.id);StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':0});websock.send("uifragmentok:"+0+": "+TotalRequest+":");break;} -if(FragementOffset!==controlAssemblyArray[control.id].offset) -{console.error("Wrong next fragment. Expected: "+controlAssemblyArray[control.id].offset+" Got: "+FragementOffset);StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':controlAssemblyArray[control.id].length+controlAssemblyArray[control.id].offset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");break;} -controlAssemblyArray[control.id].control.value+=control.value;controlAssemblyArray[control.id].offset=NextFragmentOffset;if(true===FragmentFinal) -{var fauxEvent={data:JSON.stringify(controlAssemblyArray[control.id].control),};handleEvent(fauxEvent);controlAssemblyArray[control.id]=null;} -else -{StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':NextFragmentOffset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");} -break;default:console.error("Unknown type or event");break;} -if(data.type>=UI_TITEL&&data.type=UPDATE_OFFSET&&data.type0){var parent=data.hasOwnProperty('parentControl')?$("#tab"+data.parentControl):$("#row");var html="";switch(data.type){case UI_LABEL:case UI_BUTTON:case UI_SWITCHER:case UI_CPAD:case UI_PAD:case UI_SLIDER:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GRAPH:case UI_GAUGE:case UI_ACCEL:case UI_FILEDISPLAY:var baseClass="two columns "+panelwide+" card tcenter "+colorClass(data.color);html="
    "+data.label+"

    "+ -elementHTML(data)+ -"
    ";break;case UI_SEPARATOR:var baseClass="sectionbreak columns";html="
    "+ -"
    "+data.label+"

    ";break;case UI_TIME:break;} -parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data));}} -var elementHTML=function(data){var id=data.id -var elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";var inputType=data.hasOwnProperty('inputType')?" type='"+data.inputType+"' ":"";switch(data.type){case UI_LABEL:return""+data.value+"";case UI_FILEDISPLAY:return"";case UI_BUTTON:return"";case UI_SWITCHER:return"";case UI_CPAD:case UI_PAD:return"";case UI_SLIDER:return"
    "+ -""+ -data.value+"
    ";case UI_NUMBER:return"";case UI_TEXT_INPUT:return"";case UI_SELECT:return"";case UI_ACCEL:return"ACCEL // Not implemented fully!
    ";default:return"";}}
    -var processEnabled=function(data){switch(data.type){case UI_SWITCHER:case UPDATE_SWITCHER:if(data.enabled){$("#sl"+data.id).removeClass('disabled');$("#s"+data.id).prop("disabled",false);}else{$("#sl"+data.id).addClass('disabled');$("#s"+data.id).prop("disabled",true);}
    -break;case UI_SLIDER:case UPDATE_SLIDER:$("#sl"+data.id).prop("disabled",!data.enabled);break;case UI_NUMBER:case UPDATE_NUMBER:$("#num"+data.id).prop("disabled",!data.enabled);break;case UI_TEXT_INPUT:case UPDATE_TEXT_INPUT:$("#text"+data.id).prop("disabled",!data.enabled);break;case UI_SELECT:case UPDATE_SELECT:$("#select"+data.id).prop("disabled",!data.enabled);break;case UI_BUTTON:case UPDATE_BUTTON:$("#btn"+data.id).prop("disabled",!data.enabled);break;case UI_PAD:case UI_CPAD:case UPDATE_PAD:case UPDATE_CPAD:case UI_FILEDISPLAY:case UPDATE_FILEDISPLAY:if(data.enabled){$("#id"+data.id+" nav").removeClass('disabled');}else{$("#id"+data.id+" nav").addClass('disabled');}
    -break;}}
    +const UI_INITIAL_GUI=200,UI_RELOAD=201,UPDATE_OFFSET=100,UI_EXTEND_GUI=210,UI_TITEL=0,UI_PAD=1,UPDATE_PAD=101,UI_CPAD=2,UPDATE_CPAD=102,UI_BUTTON=3,UPDATE_BUTTON=103,UI_LABEL=4,UPDATE_LABEL=104,UI_SWITCHER=5,UPDATE_SWITCHER=105,UI_SLIDER=6,UPDATE_SLIDER=106,UI_NUMBER=7,UPDATE_NUMBER=107,UI_TEXT_INPUT=8,UPDATE_TEXT_INPUT=108,UI_GRAPH=9,ADD_GRAPH_POINT=10,CLEAR_GRAPH=109,UI_TAB=11,UPDATE_TAB=111,UI_SELECT=12,UPDATE_SELECT=112,UI_OPTION=13,UPDATE_OPTION=113,UI_MIN=14,UPDATE_MIN=114,UI_MAX=15,UPDATE_MAX=115,UI_STEP=16,UPDATE_STEP=116,UI_GAUGE=17,UPDATE_GAUGE=117,UI_ACCEL=18,UPDATE_ACCEL=118,UI_SEPARATOR=19,UPDATE_SEPARATOR=119,UI_TIME=20,UPDATE_TIME=120,UI_FILEDISPLAY=21,UPDATE_FILEDISPLAY=121,UI_FRAGMENT=98,UP=0,DOWN=1,LEFT=2,RIGHT=3,CENTER=4,C_TURQUOISE=0,C_EMERALD=1,C_PETERRIVER=2,C_WETASPHALT=3,C_SUNFLOWER=4,C_CARROT=5,C_ALIZARIN=6,C_DARK=7,C_NONE=255;var websock,websockConnected,WebSocketTimer,rangeSlider,addToHTML,elementHTML,processEnabled,controlAssemblyArray=new Object,FragmentAssemblyTimer=new Array,graphData=new Array,hasAccel=!1,sliderContinuous=!1;function colorClass(e){switch(e=Number(e),e){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return""}}websockConnected=!1,WebSocketTimer=null;function requestOrientationPermission(){}function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData))}function restoreGraphData(e){var t=localStorage.getItem("espuigraphs",graphData);if(t!=null){t=JSON.parse(t);let n=t[e];return Array.isArray(n)?n:[]}return[]}function restart(){$(document).add("*").off(),$("#row").html(""),conStatusError(),start()}function conStatusError(){FragmentAssemblyTimer.forEach(e=>{clearInterval(e)}),FragmentAssemblyTimer=new Array,controlAssemblyArray=new Array,!0===websockConnected&&(websockConnected=!1,websock.close(),$("#conStatus").removeClass("color-green"),$("#conStatus").addClass("color-red"),$("#conStatus").html("Error / No Connection ↻"),$("#conStatus").off(),$("#conStatus").on({click:restart}))}function handleVisibilityChange(){!websockConnected&&!document.hidden&&restart()}function start(){let n=window.location.hostname,e=window.location.port;document.addEventListener("visibilitychange",handleVisibilityChange,!1),e!=""||e!=80||e!=443?websock=new WebSocket("ws://"+n+":"+e+"/ws"):websock=new WebSocket("ws://"+n+"/ws"),null===WebSocketTimer&&(WebSocketTimer=setInterval(function(){websock.readyState===3&&restart()},5e3)),websock.onopen=function(){console.log("websock open"),$("#conStatus").addClass("color-green"),$("#conStatus").text("Connected"),websockConnected=!0,FragmentAssemblyTimer.forEach(e=>{clearInterval(e)}),FragmentAssemblyTimer=new Array,controlAssemblyArray=new Array},websock.onclose=function(){console.log("websock close"),conStatusError(),FragmentAssemblyTimer.forEach(e=>{clearInterval(e)}),FragmentAssemblyTimer=new Array,controlAssemblyArray=new Array},websock.onerror=function(){console.log("websock Error"),restart(),FragmentAssemblyTimer.forEach(e=>{clearInterval(e)}),FragmentAssemblyTimer=new Array,controlAssemblyArray=new Array};var t=function(e){try{var s,o,i,a,r,c,l,d,n=JSON.parse(e.data)}catch(e){console.error(e),websock.send("uiok:"+0);return}switch(l=document.body,d="",n.type){case UI_INITIAL_GUI:$("#row").html(""),$("#tabsnav").html(""),$("#tabscontent").html(""),n.sliderContinuous&&(sliderContinuous=n.sliderContinuous),n.controls.forEach(e=>{var n={data:JSON.stringify(e)};t(n)}),n.totalcontrols>n.controls.length-1&&websock.send("uiok:"+(n.controls.length-1));break;case UI_EXTEND_GUI:n.controls.forEach(e=>{var n={data:JSON.stringify(e)};t(n)}),n.totalcontrols>n.startindex+(n.controls.length-1)&&websock.send("uiok:"+(n.startindex+(n.controls.length-1)));break;case UI_RELOAD:window.location.reload();break;case UI_TITEL:document.title=n.label,$("#mainHeader").html(n.label);break;case UI_LABEL:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GAUGE:case UI_SEPARATOR:n.visible&&addToHTML(n);break;case UI_BUTTON:n.visible&&(addToHTML(n),$("#btn"+n.id).on({touchstart:function(e){e.preventDefault(),$(this).addClass("pressed"),buttonclick(n.id,!0)},touchend:function(e){e.preventDefault(),$(this).removeClass("pressed"),buttonclick(n.id,!1)}}));break;case UI_SWITCHER:n.visible&&(addToHTML(n),switcher(n.id,n.value));break;case UI_CPAD:case UI_PAD:n.visible&&(addToHTML(n),$("#pf"+n.id).on({touchstart:function(e){e.preventDefault(),$(this).parent().addClass("pressed"),padclick(UP,n.id,!0)},touchend:function(e){e.preventDefault(),$(this).parent().removeClass("pressed"),padclick(UP,n.id,!1)}}),$("#pl"+n.id).on({touchstart:function(e){e.preventDefault(),$(this).parent().addClass("pressed"),padclick(LEFT,n.id,!0)},touchend:function(e){e.preventDefault(),$(this).parent().removeClass("pressed"),padclick(LEFT,n.id,!1)}}),$("#pr"+n.id).on({touchstart:function(e){e.preventDefault(),$(this).parent().addClass("pressed"),padclick(RIGHT,n.id,!0)},touchend:function(e){e.preventDefault(),$(this).parent().removeClass("pressed"),padclick(RIGHT,n.id,!1)}}),$("#pb"+n.id).on({touchstart:function(e){e.preventDefault(),$(this).parent().addClass("pressed"),padclick(DOWN,n.id,!0)},touchend:function(e){e.preventDefault(),$(this).parent().removeClass("pressed"),padclick(DOWN,n.id,!1)}}),$("#pc"+n.id).on({touchstart:function(e){e.preventDefault(),$(this).addClass("pressed"),padclick(CENTER,n.id,!0)},touchend:function(e){e.preventDefault(),$(this).removeClass("pressed"),padclick(CENTER,n.id,!1)}}));break;case UI_SLIDER:n.visible&&(addToHTML(n),rangeSlider(!sliderContinuous));break;case UI_TAB:n.visible&&($("#tabsnav").append("
  • "+n.value+"
  • "),$("#tabscontent").append("
    "),$("#tablink"+n.id).on({touchend:function(){tabclick(n.id)},mouseup:function(){tabclick(n.id)}}),tabs=$(".tabscontent").tabbedContent({loop:!0}).data("api"),$("a").filter(function(){return $(this).attr("href")==="#click-to-switch"}).on("click",function(e){var t=prompt("Tab to switch to (number or id)?");tabs.switchTab(t)||alert("That tab does not exist :\\"),e.preventDefault()}));break;case UI_OPTION:n.parentControl&&(i=$("#select"+n.parentControl),i.append(""));break;case UI_MIN:n.parentControl&&($("#sl"+n.parentControl).length?$("#sl"+n.parentControl).attr("min",n.value):$("#num"+n.parentControl).length&&$("#num"+n.parentControl).attr("min",n.value));break;case UI_MAX:n.parentControl&&($("#sl"+n.parentControl).length?$("#sl"+n.parentControl).attr("max",n.value):$("#text"+n.parentControl).length?$("#text"+n.parentControl).attr("maxlength",n.value):$("#num"+n.parentControl).length&&$("#num"+n.parentControl).attr("max",n.value));break;case UI_STEP:n.parentControl&&($("#sl"+n.parentControl).length?$("#sl"+n.parentControl).attr("step",n.value):$("#num"+n.parentControl).length&&$("#num"+n.parentControl).attr("step",n.value));break;case UI_GRAPH:n.visible&&(addToHTML(n),graphData[n.id]=restoreGraphData(n.id),renderGraphSvg(graphData[n.id],"graph"+n.id));break;case ADD_GRAPH_POINT:a=(new Date).getTime(),graphData[n.id].push({x:a,y:n.value}),saveGraphData(),renderGraphSvg(graphData[n.id],"graph"+n.id);break;case CLEAR_GRAPH:graphData[n.id]=[],saveGraphData(),renderGraphSvg(graphData[n.id],"graph"+n.id);break;case UI_ACCEL:if(hasAccel)break;hasAccel=!0,n.visible&&(addToHTML(n),requestOrientationPermission());break;case UI_FILEDISPLAY:n.visible&&(addToHTML(n),FileDisplayUploadFile(n));break;case UPDATE_LABEL:$("#l"+n.id).html(n.value),n.hasOwnProperty("elementStyle")&&$("#l"+n.id).attr("style",n.elementStyle);break;case UPDATE_SWITCHER:switcher(n.id,n.value=="0"?0:1),n.hasOwnProperty("elementStyle")&&$("#sl"+n.id).attr("style",n.elementStyle);break;case UPDATE_SLIDER:$("#sl"+n.id).attr("value",n.value),slider_move($("#sl"+n.id).parent().parent(),n.value,"100",!1),n.hasOwnProperty("elementStyle")&&$("#sl"+n.id).attr("style",n.elementStyle);break;case UPDATE_NUMBER:$("#num"+n.id).val(n.value),n.hasOwnProperty("elementStyle")&&$("#num"+n.id).attr("style",n.elementStyle);break;case UPDATE_TEXT_INPUT:$("#text"+n.id).val(n.value),n.hasOwnProperty("elementStyle")&&$("#text"+n.id).attr("style",n.elementStyle),n.hasOwnProperty("inputType")&&$("#text"+n.id).attr("type",n.inputType);break;case UPDATE_SELECT:$("#select"+n.id).val(n.value),n.hasOwnProperty("elementStyle")&&$("#select"+n.id).attr("style",n.elementStyle);break;case UPDATE_BUTTON:$("#btn"+n.id).val(n.value),$("#btn"+n.id).text(n.value),n.hasOwnProperty("elementStyle")&&$("#btn"+n.id).attr("style",n.elementStyle);break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+n.id).val(n.value),n.hasOwnProperty("elementStyle")&&$("#gauge"+n.id).attr("style",n.elementStyle);break;case UPDATE_ACCEL:break;case UPDATE_TIME:r=(new Date).toISOString(),websock.send("time:"+r+":"+n.id);break;case UPDATE_FILEDISPLAY:FileDisplayUploadFile(n);break;case UI_FRAGMENT:let l=n.length,s=n.offset,o=s+l,d=n.total,u=l+s,h=d===u;if(!n.hasOwnProperty("control")){console.error("UI_FRAGMENT:Missing control record, skipping control");break}let e=n.control;if(StopFragmentAssemblyTimer(n.control.id),0===s){controlAssemblyArray[e.id]=n,controlAssemblyArray[e.id].offset=o,StartFragmentAssemblyTimer(e.id);let t=JSON.stringify({id:e.id,offset:o});websock.send("uifragmentok:"+0+": "+t+":");break}if("undefined"==typeof controlAssemblyArray[e.id]){console.error("Missing first fragment for control: "+e.id),StartFragmentAssemblyTimer(e.id);let t=JSON.stringify({id:e.id,offset:0});websock.send("uifragmentok:"+0+": "+t+":");break}if(s!==controlAssemblyArray[e.id].offset){console.error("Wrong next fragment. Expected: "+controlAssemblyArray[e.id].offset+" Got: "+s),StartFragmentAssemblyTimer(e.id);let t=JSON.stringify({id:e.id,offset:controlAssemblyArray[e.id].length+controlAssemblyArray[e.id].offset});websock.send("uifragmentok:"+0+": "+t+":");break}if(controlAssemblyArray[e.id].control.value+=e.value,controlAssemblyArray[e.id].offset=o,!0===h)c={data:JSON.stringify(controlAssemblyArray[e.id].control)},t(c),controlAssemblyArray[e.id]=null;else{StartFragmentAssemblyTimer(e.id);let t=JSON.stringify({id:e.id,offset:o});websock.send("uifragmentok:"+0+": "+t+":")}break;default:console.error("Unknown type or event");break}n.type>=UI_TITEL&&n.type=UPDATE_OFFSET&&n.type0){var t,n=$(e.hasOwnProperty("parentControl")?"#tab"+e.parentControl:"#row"),s="";switch(e.type){case UI_LABEL:case UI_BUTTON:case UI_SWITCHER:case UI_CPAD:case UI_PAD:case UI_SLIDER:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GRAPH:case UI_GAUGE:case UI_ACCEL:case UI_FILEDISPLAY:t="two columns "+panelwide+" card tcenter "+colorClass(e.color),s="
    "+e.label+"

    "+elementHTML(e)+"
    ";break;case UI_SEPARATOR:t="sectionbreak columns",s="
    "+e.label+"

    ";break;case UI_TIME:break}n.append(s)}else n=$("#id"+e.parentControl),n.append(elementHTML(e))},elementHTML=function(e){var t=e.id,n=e.hasOwnProperty("elementStyle")?" style='"+e.elementStyle+"' ":"",s=e.hasOwnProperty("inputType")?" type='"+e.inputType+"' ":"";switch(e.type){case UI_LABEL:return""+e.value+"";case UI_FILEDISPLAY:return"";case UI_BUTTON:return"";case UI_SWITCHER:return"";case UI_CPAD:case UI_PAD:return"";case UI_SLIDER:return"
    "+e.value+"
    ";case UI_NUMBER:return"";case UI_TEXT_INPUT:return"";case UI_SELECT:return"";case UI_ACCEL:return"ACCEL // Not implemented fully!
    ";default:return""}},processEnabled=function(e){switch(e.type){case UI_SWITCHER:case UPDATE_SWITCHER:e.enabled?($("#sl"+e.id).removeClass("disabled"),$("#s"+e.id).prop("disabled",!1)):($("#sl"+e.id).addClass("disabled"),$("#s"+e.id).prop("disabled",!0));break;case UI_SLIDER:case UPDATE_SLIDER:$("#sl"+e.id).prop("disabled",!e.enabled);break;case UI_NUMBER:case UPDATE_NUMBER:$("#num"+e.id).prop("disabled",!e.enabled);break;case UI_TEXT_INPUT:case UPDATE_TEXT_INPUT:$("#text"+e.id).prop("disabled",!e.enabled);break;case UI_SELECT:case UPDATE_SELECT:$("#select"+e.id).prop("disabled",!e.enabled);break;case UI_BUTTON:case UPDATE_BUTTON:$("#btn"+e.id).prop("disabled",!e.enabled);break;case UI_PAD:case UI_CPAD:case UPDATE_PAD:case UPDATE_CPAD:case UI_FILEDISPLAY:case UPDATE_FILEDISPLAY:e.enabled?$("#id"+e.id+" nav").removeClass("disabled"):$("#id"+e.id+" nav").addClass("disabled");break}}
     )=====";
     
    -const uint8_t JS_CONTROLS_GZIP[5294] PROGMEM = { 31,139,8,0,74,64,43,105,2,255,213,60,107,87,219,200,146,223,249,21,66,153,19,219,139,1,59,153,204,205,216,136,28,199,56,137,247,18,96,193,220,204,110,38,203,145,237,54,232,34,36,93,73,134,176,30,254,251,86,85,63,212,173,135,109,200,36,59,251,37,88,221,213,245,238,238,234,234,234,76,194,32,73,173,243,225,197,240,104,56,26,246,14,47,222,159,15,157,23,173,86,119,34,59,78,7,135,199,189,3,104,107,203,182,147,131,222,104,112,113,252,238,221,217,96,228,180,117,216,193,111,163,193,209,1,199,209,214,218,71,195,209,224,208,209,26,78,0,99,14,31,53,101,68,134,23,125,108,121,97,2,245,57,212,139,12,234,237,249,104,116,124,228,188,52,225,68,107,187,245,50,131,60,236,189,5,38,126,54,1,121,99,187,245,115,6,119,246,105,56,234,127,24,156,58,175,76,80,213,222,110,189,210,160,15,135,7,208,246,75,14,150,183,182,91,191,100,144,71,231,31,223,66,219,223,76,72,209,218,110,253,77,83,23,232,17,12,114,114,62,114,94,155,208,90,79,187,245,58,27,241,254,180,119,242,193,249,85,52,244,14,14,120,203,197,201,241,240,8,65,69,71,255,112,208,59,21,192,237,214,175,26,197,222,91,167,157,51,8,111,211,12,114,54,56,28,244,1,91,206,38,178,185,173,89,229,248,100,52,68,253,231,204,34,155,219,154,89,62,14,161,33,103,21,106,107,107,54,249,216,251,205,105,231,236,65,109,109,221,20,163,193,137,211,206,91,130,26,219,154,29,222,247,206,223,15,156,118,206,14,162,181,173,153,161,215,239,163,111,228,76,32,90,219,175,117,197,156,244,78,123,163,99,48,227,175,121,221,168,158,182,174,238,225,199,1,204,168,156,190,177,177,253,66,155,37,239,134,135,131,131,225,217,201,97,239,63,97,62,153,208,122,95,251,133,102,165,119,167,189,247,31,7,96,245,95,51,198,213,212,59,56,254,116,164,38,222,225,224,221,72,77,176,211,225,251,15,35,53,141,250,128,0,188,82,90,160,127,49,58,63,253,143,243,227,225,217,64,161,234,95,12,62,14,78,123,135,217,68,238,95,156,12,96,212,233,240,31,48,244,133,106,252,52,24,245,206,78,62,244,14,53,244,23,103,231,71,239,14,143,63,25,52,250,189,211,211,227,145,154,118,253,139,222,225,240,191,122,167,224,11,191,168,166,131,222,233,223,213,20,234,95,28,29,31,129,34,95,189,234,222,186,177,5,141,105,28,250,189,36,97,55,99,255,190,23,199,238,189,19,176,59,235,120,252,79,54,73,235,13,130,122,23,187,151,55,44,72,37,216,200,187,97,49,129,209,0,1,117,25,187,209,213,129,155,186,133,158,43,55,233,77,38,204,119,102,174,159,48,106,74,124,111,202,226,62,144,247,130,121,56,79,68,215,108,30,76,82,47,12,128,49,63,140,251,190,155,36,117,250,57,156,54,22,226,135,115,52,191,25,179,88,181,119,147,59,47,157,92,105,112,110,194,116,253,119,98,150,206,227,192,134,127,254,53,15,189,132,217,93,1,34,204,33,1,24,136,229,250,83,213,157,217,70,66,68,44,101,113,236,221,178,88,1,101,182,146,64,119,44,117,147,232,202,245,83,5,164,108,39,97,146,121,48,243,195,59,13,15,55,165,236,159,184,113,28,102,227,165,89,101,183,235,123,255,227,198,94,160,0,208,200,29,241,27,45,44,1,167,110,124,109,119,167,108,230,206,253,84,54,218,221,135,135,13,180,194,29,27,39,225,228,186,171,253,6,147,4,96,121,54,213,140,245,137,141,207,160,139,165,194,240,115,223,207,44,21,179,127,205,89,146,30,199,30,120,136,139,77,39,44,190,241,146,4,126,213,27,139,135,13,5,153,184,183,236,189,116,18,232,242,195,137,235,159,165,33,120,23,219,73,88,58,76,217,77,221,102,73,52,247,200,151,18,187,249,239,103,199,71,59,73,10,146,94,122,179,251,186,114,177,70,163,171,33,142,129,126,24,107,184,61,240,2,242,50,160,56,37,151,52,104,93,150,210,202,144,119,189,89,93,13,221,36,121,27,139,12,23,49,21,185,113,194,50,168,70,215,103,169,229,113,0,213,250,217,155,126,233,114,165,243,9,177,227,37,124,98,112,200,198,27,254,183,243,249,11,200,195,1,233,167,33,154,27,195,68,92,252,84,159,134,147,57,78,195,198,142,59,157,214,237,127,179,27,59,225,108,6,115,236,167,186,253,44,14,239,224,251,42,189,241,235,182,221,192,217,126,6,214,152,39,3,240,163,24,96,4,26,29,119,30,102,81,58,207,119,102,97,60,112,97,126,49,159,97,167,179,191,152,248,204,141,135,1,76,133,91,215,151,237,128,186,209,93,189,82,84,174,56,18,0,116,159,198,115,230,56,78,222,35,27,139,10,31,21,205,59,19,63,4,155,112,125,40,225,64,43,49,187,9,111,25,95,77,108,90,38,182,47,99,198,2,187,8,10,154,53,224,98,54,45,129,226,106,38,181,89,187,214,81,104,9,142,80,171,207,159,189,254,229,229,171,110,201,168,204,88,70,107,80,7,133,122,147,235,142,176,117,19,244,248,160,153,233,202,13,166,62,251,135,151,120,99,207,247,210,251,62,52,92,130,152,11,208,212,102,94,35,207,159,111,74,55,217,185,242,166,83,22,52,22,202,135,12,180,210,175,208,111,113,118,96,163,115,231,5,211,240,110,71,126,239,92,133,73,26,184,55,140,188,59,10,227,180,0,129,141,93,69,18,212,55,184,133,31,135,94,146,178,0,22,105,251,86,241,61,33,190,237,102,185,60,77,50,37,153,31,81,110,58,182,253,199,31,252,215,235,150,252,245,243,207,47,149,19,144,211,168,149,169,110,223,37,157,221,93,123,75,50,182,101,119,236,45,28,181,101,239,222,129,158,187,15,12,240,175,61,88,140,217,0,118,112,250,131,55,154,139,96,99,145,91,20,113,253,146,51,66,234,152,219,72,122,103,204,220,233,61,154,29,125,251,165,105,150,230,171,86,171,133,244,36,112,24,132,17,11,28,133,137,221,166,184,1,6,73,232,51,80,254,37,176,204,33,45,132,91,195,145,171,28,62,101,95,65,126,229,63,0,81,152,100,56,29,187,127,137,181,225,161,155,233,135,38,251,58,10,34,192,178,37,241,47,39,18,67,198,214,17,137,36,0,145,50,23,250,139,200,194,163,61,156,223,180,12,228,100,73,227,123,218,150,167,185,93,20,58,119,166,180,137,62,108,192,4,4,134,105,116,38,60,41,70,52,42,125,37,44,128,93,112,238,133,215,48,211,91,13,177,207,118,121,100,195,28,181,38,141,195,233,61,15,118,25,202,13,11,139,140,24,145,230,78,122,31,49,17,51,154,103,250,78,201,182,138,77,169,59,78,2,247,182,172,25,53,4,68,244,46,88,0,136,76,62,224,133,128,34,31,2,151,194,129,60,212,46,148,159,148,216,20,101,131,248,238,43,87,249,2,193,59,185,192,73,26,186,249,208,213,204,83,87,163,200,3,36,171,105,152,186,190,164,183,95,55,201,251,44,184,76,175,182,219,13,181,16,155,134,168,4,7,65,198,176,4,94,119,165,170,179,204,71,231,255,86,66,174,119,156,72,176,183,177,175,91,79,146,120,157,241,69,29,240,76,81,39,191,169,198,204,15,221,41,204,40,19,154,114,66,29,229,216,169,151,250,140,123,141,239,142,153,79,110,120,227,122,193,7,216,105,224,100,33,188,48,3,200,227,163,76,78,71,126,241,180,138,250,204,242,38,170,137,167,45,212,39,157,255,181,78,113,110,239,72,45,211,214,239,179,6,108,69,163,240,195,232,227,97,157,79,114,147,9,158,119,42,12,90,228,71,161,112,227,52,176,183,8,12,34,124,138,156,210,112,62,185,34,221,119,178,181,166,177,96,59,81,204,208,236,7,252,228,67,113,87,122,229,37,250,198,8,32,176,148,225,150,55,158,167,41,238,40,16,133,213,5,250,38,238,122,96,176,38,81,0,123,175,139,223,8,54,151,147,16,33,207,3,69,124,57,207,144,169,179,213,138,225,139,25,196,90,18,45,7,119,125,226,63,135,22,179,129,202,100,248,123,45,189,71,179,111,86,59,172,244,56,31,203,245,31,185,83,174,153,243,147,230,183,234,95,17,170,48,68,25,45,221,16,36,175,255,131,228,197,124,210,143,147,216,160,86,144,57,254,65,50,83,218,236,199,9,109,146,43,72,61,254,65,82,99,26,241,199,9,109,80,43,200,60,249,46,139,168,34,206,51,161,205,239,180,144,86,145,89,186,152,210,221,194,234,181,46,198,147,232,25,69,96,245,205,66,196,86,64,59,234,189,45,226,52,67,68,55,138,40,86,216,243,189,253,61,215,242,166,78,13,58,125,47,184,86,54,216,178,107,214,85,204,102,78,13,199,233,205,251,226,131,214,242,45,123,111,215,221,223,219,5,68,165,17,167,162,52,245,110,37,29,3,217,222,46,244,104,99,13,38,52,71,88,195,68,48,218,216,201,80,237,55,160,34,54,143,140,161,37,112,15,52,58,113,128,137,29,83,0,248,26,179,105,159,127,215,23,126,24,70,29,244,157,135,6,29,14,234,182,27,121,156,123,23,160,103,158,15,193,188,126,212,22,121,54,229,162,105,26,215,109,84,172,221,128,3,55,156,122,145,147,237,52,220,230,27,166,13,1,33,10,109,83,187,221,212,249,198,120,19,216,113,162,56,188,137,224,120,60,114,199,86,26,90,124,32,254,170,7,148,131,182,194,24,84,221,120,195,227,252,77,148,103,135,3,193,136,58,124,66,204,232,250,44,70,20,87,110,138,56,173,105,200,18,43,8,83,139,125,245,146,212,234,252,254,59,37,26,74,180,92,226,200,252,54,72,57,29,95,15,250,60,210,228,108,243,38,84,239,179,4,98,226,73,42,76,108,130,118,249,103,230,52,97,68,73,33,244,27,254,211,222,218,144,190,179,1,14,74,46,232,212,100,43,247,72,236,144,45,156,24,67,232,125,217,70,65,39,52,236,237,114,156,251,118,81,162,143,195,74,113,160,249,167,122,237,89,226,215,202,68,16,113,53,78,184,106,24,238,4,55,94,96,155,81,17,230,130,44,129,31,76,185,154,64,37,80,21,133,130,156,189,223,190,191,156,238,215,37,114,98,166,103,53,133,106,40,69,131,131,127,111,141,22,100,41,44,234,163,193,201,119,87,105,146,178,232,59,75,90,66,34,47,42,93,63,175,222,190,212,13,198,103,49,117,191,56,133,171,17,181,18,3,39,176,189,81,199,217,237,101,189,56,182,105,83,91,182,69,152,115,55,119,99,222,161,53,51,161,124,16,160,97,16,164,92,242,220,104,189,140,177,157,104,158,92,213,23,95,59,105,210,188,239,100,194,195,154,151,187,38,122,10,163,26,155,218,253,125,167,68,63,159,191,252,201,244,228,37,56,90,75,222,123,54,120,191,186,6,165,132,234,234,96,100,233,197,90,97,33,213,110,183,11,158,178,81,64,254,206,243,217,129,151,68,190,123,127,30,97,178,1,27,234,50,9,167,99,214,138,62,40,35,166,31,141,178,252,130,240,92,73,24,68,61,190,11,78,226,48,130,205,239,190,94,19,217,153,179,244,222,103,181,6,15,146,116,68,114,38,64,183,152,10,250,136,114,150,212,9,121,201,1,24,246,253,150,253,166,213,105,63,142,181,228,155,121,227,1,103,5,46,98,205,152,242,27,60,216,188,192,136,183,94,24,165,194,126,249,67,27,218,180,219,173,150,173,221,158,252,56,33,69,194,8,113,193,18,167,33,195,212,242,83,189,194,196,244,20,182,180,196,21,69,186,176,161,253,73,188,229,80,173,102,174,10,185,23,68,243,116,116,31,45,199,140,153,105,129,88,13,168,112,55,158,152,43,4,125,223,42,112,1,217,83,236,33,18,124,197,252,93,158,179,34,4,93,78,61,149,121,19,213,83,56,207,114,101,89,41,93,167,8,198,243,160,72,242,210,157,95,178,63,73,247,121,92,79,17,128,239,68,37,83,100,248,113,64,27,118,124,171,111,216,105,56,60,59,62,163,148,122,61,127,207,146,194,78,222,177,183,226,91,186,88,45,221,249,10,85,86,157,101,187,76,110,247,18,37,88,29,188,104,150,87,81,135,44,16,233,109,138,166,186,178,143,196,62,158,205,18,150,242,254,144,126,83,255,17,184,140,28,47,64,114,67,182,52,244,52,100,132,183,1,78,118,49,64,141,61,42,243,153,58,117,13,122,43,135,169,209,213,185,125,231,5,128,134,35,115,28,49,158,206,133,165,54,23,247,3,96,238,141,220,61,151,173,235,227,35,110,248,193,165,172,212,178,98,54,9,227,105,211,74,174,189,40,210,58,108,169,209,135,13,100,74,180,58,250,85,68,247,44,13,163,210,107,62,227,198,130,236,10,108,183,64,138,188,192,196,106,225,18,240,115,54,242,11,81,236,174,130,18,22,115,138,214,2,38,221,56,45,231,82,103,80,25,238,148,135,73,78,238,62,104,81,243,166,181,78,54,162,89,227,36,107,157,34,205,135,226,165,226,76,0,240,203,69,240,121,56,232,234,228,112,22,100,26,7,109,217,115,136,26,103,94,192,166,54,232,13,151,238,112,102,173,82,67,209,244,210,220,51,47,78,82,75,114,97,205,66,85,171,135,156,232,138,248,238,250,106,253,25,234,201,57,210,166,227,172,233,34,69,21,125,138,67,80,80,0,86,84,250,217,177,6,95,35,74,63,104,218,89,133,121,203,182,222,135,41,14,40,76,235,239,174,211,149,44,242,21,111,93,81,190,217,66,43,233,200,223,60,241,227,24,159,223,50,219,179,106,47,99,25,5,171,175,113,231,187,46,215,75,46,133,87,46,103,84,236,248,176,129,135,254,141,197,255,167,181,73,198,3,178,246,51,191,199,4,215,65,120,23,88,184,82,97,26,147,114,143,230,156,85,229,17,251,142,188,124,126,254,92,53,238,25,143,26,26,139,40,14,39,44,73,6,129,11,39,206,169,58,74,230,240,232,99,12,100,70,233,5,79,101,202,251,127,140,134,188,169,22,116,84,133,81,145,27,48,223,8,162,244,97,37,17,84,54,96,89,180,46,78,209,136,83,128,124,86,109,176,132,23,232,36,87,225,29,196,79,228,50,133,206,43,56,231,213,151,81,35,158,232,214,3,9,46,213,3,118,142,33,128,34,104,71,128,9,49,17,104,27,59,183,39,216,203,51,212,10,184,177,48,161,57,76,83,245,195,218,168,242,198,146,29,202,75,233,230,116,28,227,180,155,225,52,110,110,248,201,118,91,21,95,139,210,239,109,81,108,45,63,179,202,106,217,146,149,81,203,22,85,52,45,27,120,149,180,252,82,69,209,168,123,38,235,17,77,54,112,119,80,149,229,34,234,129,239,134,172,15,44,21,33,227,93,50,173,113,171,179,169,248,19,140,45,227,168,146,143,141,138,153,132,55,38,116,65,181,45,146,5,23,244,101,55,118,24,86,203,104,55,33,226,10,228,115,235,139,200,130,152,119,34,60,253,144,93,180,225,86,90,23,201,156,82,72,126,21,161,21,170,221,0,123,176,101,58,218,162,10,12,186,201,125,48,177,84,129,233,146,224,127,131,170,78,241,116,231,184,119,174,151,90,83,88,138,12,16,121,98,66,56,172,213,30,133,231,17,180,179,225,212,177,103,217,28,160,51,163,189,101,66,240,115,23,98,111,84,244,79,200,170,0,208,243,189,203,192,110,218,62,155,165,246,82,232,187,43,47,5,205,71,238,4,22,15,27,150,206,216,141,150,143,0,255,137,209,29,0,60,153,192,66,239,175,7,190,125,255,216,1,95,87,15,224,221,163,48,170,87,43,76,37,173,139,166,52,204,51,131,127,176,38,88,88,49,102,73,4,91,11,19,150,156,49,172,172,83,48,184,234,72,8,172,145,74,231,201,38,62,150,107,44,210,171,56,188,179,240,244,201,235,49,109,68,110,157,50,119,106,157,177,24,103,22,181,119,172,26,156,58,77,12,91,118,141,54,56,233,68,23,84,80,200,233,43,80,202,29,200,170,192,12,76,47,128,95,178,157,131,82,112,187,175,58,47,225,179,147,210,158,207,67,136,25,74,107,129,47,8,165,121,82,216,92,126,82,128,33,95,248,24,140,66,170,98,102,1,245,168,160,163,136,97,103,237,48,149,160,191,49,238,124,120,120,104,182,91,173,86,115,56,109,152,22,89,162,241,106,237,85,154,130,143,89,214,109,22,196,86,67,34,203,90,241,60,173,192,188,162,93,220,5,243,189,26,144,56,50,185,42,218,249,228,202,41,42,241,105,129,3,29,193,95,74,169,8,232,238,163,151,121,51,169,156,95,251,197,53,178,226,156,147,89,194,57,37,96,151,177,30,84,113,174,81,193,233,182,132,6,79,119,46,35,146,174,67,68,86,23,148,146,192,234,135,165,20,220,241,26,52,120,6,116,153,161,69,138,116,169,177,215,32,164,215,7,242,238,166,151,224,186,43,46,51,69,62,83,146,129,24,33,130,32,207,75,40,70,128,45,122,161,202,159,1,92,140,52,185,24,99,155,70,156,238,49,115,32,243,168,156,59,85,116,131,19,174,89,206,31,134,166,188,7,162,71,81,32,237,38,34,132,42,229,84,148,97,107,21,216,188,166,167,83,37,66,52,89,45,67,52,49,132,48,18,148,213,136,103,107,32,158,85,33,198,106,171,106,212,107,232,61,26,87,161,198,146,189,106,212,254,26,168,253,42,212,84,24,87,141,59,94,3,119,92,130,219,88,38,229,205,156,240,24,220,190,25,57,76,194,223,193,240,167,117,152,35,205,47,154,153,235,0,130,201,53,247,156,220,180,114,129,202,45,51,215,78,3,137,246,8,70,34,49,223,1,73,76,94,176,18,151,249,136,44,67,167,234,1,132,72,237,236,118,109,25,27,121,24,62,161,101,191,44,154,203,225,110,21,113,87,176,181,2,189,44,150,227,143,37,180,178,183,236,197,134,151,64,240,62,129,185,42,234,161,8,200,169,220,157,180,87,189,147,177,163,237,82,198,86,105,110,89,176,98,160,0,112,66,152,176,250,238,127,255,126,176,181,123,217,180,233,188,193,75,241,168,40,141,238,190,58,37,251,158,126,110,193,22,177,225,97,137,25,31,93,181,97,86,12,236,210,66,166,51,56,113,125,127,236,78,174,207,24,156,14,54,29,27,173,98,115,127,213,213,35,7,101,220,74,69,60,72,127,211,65,184,46,12,152,141,106,186,77,65,149,74,231,248,11,27,117,153,159,233,153,142,85,139,44,159,225,172,76,144,188,177,45,74,133,96,81,87,46,25,130,21,137,176,77,217,221,236,240,239,172,204,85,188,41,73,25,96,26,65,225,185,3,113,203,209,96,15,34,192,191,4,95,121,105,98,20,208,212,26,127,252,161,182,250,234,34,156,253,150,81,25,183,14,222,55,203,208,102,239,130,248,115,39,240,162,229,111,138,204,103,22,226,58,180,80,231,95,89,161,159,43,98,125,250,115,13,170,129,41,127,188,193,47,10,203,74,73,204,28,147,157,222,133,248,54,127,126,19,36,96,110,101,87,48,244,196,141,167,86,202,223,88,89,85,105,150,46,215,150,170,81,213,210,89,228,116,91,186,19,90,148,149,66,255,204,242,82,186,111,213,172,92,146,203,4,197,146,215,171,87,178,134,150,215,34,218,123,187,208,180,119,21,239,98,145,162,200,201,100,101,49,84,171,72,85,178,185,235,201,236,113,75,78,31,9,127,245,75,208,82,49,246,15,150,210,70,182,151,72,90,46,18,221,1,203,108,175,89,14,138,236,203,133,43,87,83,170,68,89,90,79,90,80,172,218,106,180,158,252,226,133,221,160,45,161,40,29,122,201,138,102,222,156,23,214,52,189,91,173,106,68,72,22,84,56,171,10,52,0,39,37,59,37,74,213,165,240,173,154,249,226,127,93,216,75,192,172,228,15,176,47,75,79,48,24,220,80,206,64,54,180,232,223,109,204,52,21,75,193,17,217,190,93,90,253,37,233,225,41,11,204,194,171,206,49,105,198,137,194,210,5,20,126,126,36,117,32,41,241,105,100,197,98,38,41,242,67,12,209,163,211,74,149,148,97,64,213,226,24,97,2,164,118,242,225,67,154,22,133,63,88,109,172,96,231,81,57,36,143,100,106,251,102,101,50,112,203,129,53,94,213,74,43,185,229,98,34,179,201,106,139,136,218,111,249,220,79,86,151,181,237,55,42,170,2,95,128,21,164,226,14,1,254,120,176,173,147,63,225,199,182,140,141,45,49,78,78,100,92,52,4,77,47,16,109,228,115,194,13,137,218,56,252,90,227,156,75,198,195,160,143,122,145,140,226,211,123,174,33,10,177,169,78,123,5,231,182,92,41,246,118,73,51,154,234,10,123,146,84,33,28,243,36,179,178,158,97,127,111,238,115,174,249,147,7,195,214,250,227,43,203,52,54,114,104,107,198,46,5,21,214,38,209,241,81,26,127,217,240,252,217,175,191,188,106,117,179,247,17,171,168,243,55,65,235,50,144,131,54,120,136,159,204,3,61,198,90,151,5,19,216,224,192,127,50,7,244,72,104,93,14,76,96,131,131,241,82,14,118,185,59,24,215,70,220,163,222,216,192,90,230,61,51,47,190,169,85,176,42,222,250,172,201,171,128,46,231,118,34,185,61,254,59,50,42,103,223,222,46,248,178,190,90,240,104,75,58,186,54,43,245,227,79,54,173,214,152,240,98,132,57,221,249,212,54,23,33,62,209,137,78,205,186,241,64,17,45,248,235,126,117,106,237,86,75,123,139,161,47,120,164,13,115,187,43,99,88,156,215,96,150,210,110,84,10,65,24,75,86,84,218,114,100,48,145,11,67,165,158,184,56,98,19,166,152,175,51,134,227,221,117,215,170,216,145,81,114,74,57,138,135,38,92,118,126,108,173,20,21,54,1,58,67,73,64,113,186,228,250,3,67,239,106,12,106,129,177,201,36,64,103,91,249,35,57,230,9,204,252,219,152,42,38,181,108,104,41,139,34,80,87,113,2,165,20,31,171,68,153,136,20,76,101,212,141,20,102,41,125,126,50,144,228,103,222,229,60,102,132,83,212,185,139,247,99,208,49,113,197,67,158,92,168,169,117,209,7,32,208,241,211,89,67,224,255,52,60,60,180,222,14,172,158,69,205,86,181,203,112,185,68,29,228,247,114,15,126,242,17,188,209,135,181,139,255,165,15,204,201,155,136,171,153,77,173,25,108,162,247,155,250,42,224,98,37,63,139,195,27,188,9,230,156,82,147,226,116,95,135,30,195,129,94,233,145,111,178,17,232,184,12,87,56,79,65,31,25,112,68,170,172,250,31,188,204,187,226,124,72,93,29,153,230,142,157,185,138,122,121,203,207,56,218,146,122,113,61,237,84,147,201,221,154,200,59,233,165,235,102,158,90,37,158,68,82,36,95,133,46,19,101,143,65,41,82,101,229,79,62,215,41,202,207,35,220,52,100,207,29,155,140,99,247,138,58,248,71,33,46,28,224,215,169,102,127,20,5,35,31,176,186,112,252,81,184,141,172,198,138,186,239,71,33,214,35,207,126,190,32,187,180,64,187,236,72,84,85,160,92,234,232,198,113,93,220,100,84,249,123,230,200,101,163,74,253,89,122,234,195,195,255,2,161,82,13,180,74,86,0,0 };
    +const uint8_t JS_CONTROLS_GZIP[4975] PROGMEM = { 31,139,8,0,0,0,0,0,0,255,196,59,253,87,219,186,146,255,138,81,239,73,236,141,8,9,109,239,135,65,112,210,144,182,217,71,129,133,240,122,119,123,187,28,197,86,136,23,71,246,147,21,40,75,243,191,191,163,47,91,118,236,80,184,189,189,191,180,177,52,154,47,141,70,51,163,33,72,104,198,157,203,241,213,248,100,60,25,15,142,175,222,93,142,209,110,175,7,47,199,87,231,163,227,211,193,17,218,237,245,225,229,217,209,96,50,186,58,125,251,246,98,52,65,125,53,63,250,125,50,58,57,82,43,250,114,100,50,158,140,142,145,252,121,54,56,66,249,58,249,33,208,140,175,134,226,247,174,153,24,170,153,93,49,243,230,114,50,57,61,65,47,205,156,254,238,247,94,138,217,227,193,155,209,49,122,101,38,213,103,191,247,74,204,93,124,28,79,134,239,71,231,232,181,153,206,71,250,189,215,18,226,120,124,52,58,71,63,231,243,234,187,223,251,89,204,158,92,126,120,51,58,71,191,152,89,253,221,239,253,34,133,26,253,62,185,26,159,156,93,78,208,175,6,194,26,235,247,126,21,80,239,206,7,103,239,209,111,112,112,116,164,126,95,157,157,142,79,196,52,28,30,143,6,231,26,160,223,251,77,226,28,188,65,253,92,61,234,75,170,231,98,116,60,26,78,80,63,215,144,25,232,75,29,157,158,77,198,66,39,185,146,204,64,95,42,233,195,248,4,245,115,29,201,175,190,212,208,135,193,239,168,159,107,71,126,245,149,98,38,163,51,212,47,244,34,63,251,82,43,239,6,151,239,70,168,159,107,69,127,247,165,82,6,195,161,208,127,174,16,253,221,255,85,9,113,54,56,31,76,78,207,81,255,183,66,142,124,172,175,84,48,254,48,66,187,189,92,7,226,179,191,43,109,231,237,248,120,116,52,190,56,59,30,252,55,218,205,181,100,143,246,119,165,182,222,158,15,222,125,24,157,76,208,111,130,17,212,131,71,167,31,79,80,31,30,143,222,78,208,46,60,31,191,123,63,65,47,225,112,116,50,25,157,163,87,112,120,53,185,60,255,175,203,211,241,197,8,245,224,240,106,244,97,116,62,56,22,134,58,188,58,27,77,70,231,231,227,127,142,206,209,46,28,94,125,28,77,6,23,103,239,7,199,18,193,213,197,229,201,219,227,211,143,26,203,112,112,126,126,58,65,175,225,240,106,112,60,254,159,193,249,248,4,253,12,135,87,71,131,243,127,160,95,224,240,234,228,244,100,132,118,95,191,222,187,197,204,185,35,211,44,9,110,160,254,127,152,80,74,2,78,66,248,145,76,47,146,224,134,240,73,180,32,12,50,76,175,201,69,28,133,132,65,28,134,147,228,253,228,195,49,36,49,89,16,202,229,239,148,37,1,201,178,17,197,211,152,132,48,72,40,103,73,60,200,50,178,152,198,247,3,198,240,61,162,228,206,57,157,254,31,9,56,124,203,240,181,88,107,0,36,25,9,32,65,225,53,195,233,252,8,115,108,141,205,113,54,8,2,18,163,173,62,204,36,47,195,132,242,136,46,147,101,134,182,250,123,179,37,13,120,148,80,39,72,226,132,13,99,156,101,46,241,30,178,187,136,7,115,151,160,147,229,98,74,152,75,60,72,188,135,0,103,196,177,148,238,51,194,151,140,2,190,100,255,90,38,81,70,192,158,6,209,59,97,0,200,130,48,28,135,249,116,177,57,6,34,37,156,48,22,221,18,150,3,21,91,102,128,238,8,199,89,58,199,49,207,129,242,141,52,48,217,146,206,226,228,206,194,163,118,215,204,7,152,177,164,88,111,246,219,76,227,56,250,127,204,34,154,3,8,27,240,245,111,97,6,6,48,196,236,6,236,133,100,134,151,49,55,131,96,181,170,90,133,80,124,217,48,16,93,198,113,161,120,70,254,181,36,25,63,101,17,161,28,139,161,51,194,22,81,150,69,9,117,189,135,85,14,152,225,91,242,206,108,177,235,61,196,73,128,227,11,158,48,124,77,186,25,225,99,78,22,46,32,89,186,140,164,37,100,0,254,231,197,233,73,55,227,44,162,215,209,236,222,205,13,196,243,86,22,253,140,39,204,194,76,188,7,97,230,28,149,8,92,215,18,40,48,238,69,51,151,111,73,217,188,7,142,36,229,20,179,140,184,220,219,139,9,119,40,226,159,200,231,61,165,41,101,157,221,40,147,255,187,212,59,164,254,167,207,43,53,249,233,115,153,59,204,184,235,61,252,228,134,73,176,20,246,239,117,113,24,186,224,63,128,215,77,102,51,215,131,63,185,224,5,75,238,128,215,157,243,69,236,2,224,137,179,116,193,49,95,102,35,198,18,230,122,80,163,89,89,6,95,134,120,168,61,94,221,89,194,70,88,30,133,131,135,32,38,152,141,41,39,236,22,199,46,241,86,222,163,103,178,241,76,171,233,173,30,66,168,106,50,173,150,91,103,69,122,172,27,196,73,70,180,212,185,16,192,235,50,178,72,110,137,58,194,64,30,231,237,107,70,8,5,235,160,56,12,75,112,140,132,53,80,74,153,82,61,206,142,115,146,56,154,29,161,189,214,139,95,127,126,249,122,175,102,85,177,37,165,81,234,62,4,113,20,220,248,122,71,87,182,13,206,49,13,99,242,207,40,139,166,81,28,241,251,225,92,248,78,215,123,216,90,215,205,150,49,131,238,60,10,67,66,91,173,220,70,172,179,162,141,70,25,222,93,68,195,228,174,43,236,89,204,118,231,73,198,41,94,16,72,214,166,210,132,241,189,156,2,14,195,209,45,161,252,56,202,56,161,132,185,224,54,231,49,144,60,2,88,207,59,220,234,123,144,108,33,0,190,126,37,91,232,215,158,252,239,213,171,151,135,90,34,105,4,185,99,112,193,93,230,239,236,128,14,237,0,31,116,72,7,236,220,101,192,243,31,5,150,96,80,156,58,132,80,217,207,180,90,110,197,241,8,39,97,172,215,168,202,245,30,140,97,49,130,195,123,177,99,4,33,244,210,214,43,124,77,94,122,94,110,129,9,77,82,66,145,133,66,196,157,73,76,186,113,114,237,2,13,230,8,160,111,48,190,38,35,229,228,11,119,65,190,243,192,91,187,113,209,86,175,254,0,254,181,167,118,101,41,66,30,198,71,53,33,161,234,188,210,223,204,61,17,108,60,202,189,100,22,120,48,183,135,191,133,237,61,117,41,229,204,18,239,129,179,123,121,85,101,48,129,17,196,144,193,0,198,48,132,212,190,126,72,55,20,247,211,42,192,50,162,41,100,148,194,139,200,198,232,35,35,52,116,193,50,74,110,124,208,233,121,250,170,90,233,88,40,70,185,91,152,38,225,61,12,17,0,144,118,249,125,106,34,163,114,218,229,215,220,74,98,136,227,105,70,241,109,221,176,208,0,161,220,158,162,221,106,212,214,106,185,107,129,220,58,148,88,169,21,154,149,54,70,232,139,162,7,161,19,191,18,30,16,111,181,199,93,42,246,138,118,121,194,113,108,48,28,88,200,98,66,175,249,124,187,223,106,213,234,205,173,1,245,188,189,41,35,248,102,207,168,169,72,53,253,239,204,166,180,208,136,134,228,75,61,39,205,92,63,182,114,77,8,149,79,251,213,27,132,145,56,193,161,91,133,150,185,180,159,155,16,143,120,76,16,237,198,120,74,98,105,0,11,28,209,247,4,135,132,153,253,215,179,85,76,50,87,246,205,151,74,110,243,207,34,147,205,135,84,202,153,127,202,188,207,154,212,121,156,79,187,242,110,139,73,171,149,103,43,46,173,18,87,89,188,13,236,218,208,82,146,41,167,160,67,187,81,168,174,125,158,44,131,185,212,174,111,31,94,210,77,25,17,151,235,145,138,161,101,208,192,231,81,102,223,16,41,35,89,38,125,255,116,201,185,112,183,81,112,227,10,220,112,171,231,173,160,196,77,104,248,173,152,75,49,210,38,228,125,111,181,90,219,113,83,134,104,22,95,249,10,194,20,22,218,189,197,241,146,172,225,25,158,13,142,242,29,16,191,55,170,51,157,253,57,109,166,152,17,202,221,122,181,166,56,84,98,95,158,193,231,171,53,39,209,160,223,117,42,82,191,74,188,248,71,136,119,60,122,59,249,17,2,90,116,44,17,217,143,16,81,150,71,126,132,140,54,33,75,200,233,143,16,242,232,244,227,201,143,144,209,162,99,137,24,124,127,191,150,83,84,85,173,63,33,219,99,34,149,8,212,251,55,89,70,109,246,70,86,69,203,221,90,139,56,214,110,188,193,155,18,170,114,240,131,211,84,94,192,251,113,116,176,143,157,40,68,109,142,167,113,68,111,148,142,59,160,237,204,25,153,161,182,88,148,143,29,136,95,210,171,118,192,254,14,62,216,223,137,163,131,218,16,42,39,16,70,183,6,125,129,102,127,39,140,110,173,133,5,97,107,115,75,202,247,30,56,158,22,87,132,183,130,139,100,153,145,101,186,1,100,229,65,193,20,250,201,5,221,50,119,28,79,167,36,28,170,111,247,33,78,146,212,223,234,173,60,25,172,186,0,167,145,226,13,3,175,59,139,98,78,152,157,177,233,34,74,110,87,156,51,23,8,109,1,15,33,4,94,72,30,182,121,178,173,238,35,176,146,66,1,57,12,160,109,79,42,168,78,89,178,72,185,11,38,120,234,240,196,81,171,196,47,151,202,250,159,147,48,39,10,189,67,224,237,9,49,186,10,96,130,167,46,247,190,126,197,49,97,98,241,28,115,135,227,169,19,38,36,115,104,194,29,242,37,202,184,227,255,241,7,240,224,186,225,174,219,159,170,126,251,84,31,211,161,138,193,90,45,55,18,26,124,145,145,152,4,92,236,82,105,222,131,81,177,217,73,42,243,127,177,223,234,103,97,77,210,106,80,219,50,160,182,35,62,20,90,18,118,128,52,46,25,115,9,227,82,235,15,192,26,155,31,198,117,60,74,14,227,117,238,116,4,121,216,56,175,118,111,17,81,144,7,12,50,119,160,203,69,35,182,86,171,25,162,6,223,154,4,131,223,255,2,9,240,151,138,4,34,131,223,140,174,1,34,71,168,64,191,175,98,108,54,215,60,224,100,116,246,253,53,147,113,146,126,87,25,202,8,171,66,200,167,169,102,47,158,215,108,63,137,147,241,25,173,21,128,165,239,130,140,208,144,48,57,122,113,123,237,86,86,65,32,7,180,203,44,113,80,121,50,243,49,114,69,22,127,132,57,241,186,215,170,22,229,174,177,209,77,151,217,220,125,248,226,99,120,239,107,201,86,30,172,20,189,159,196,149,205,148,245,104,231,87,21,240,233,243,119,35,99,158,210,252,104,230,154,167,23,79,205,23,47,49,61,216,124,195,110,124,12,168,146,178,158,208,154,183,251,109,20,147,163,40,75,99,124,127,153,138,212,84,12,184,180,130,204,122,134,149,246,153,7,229,58,19,85,150,6,105,119,142,179,211,59,122,198,146,148,48,126,239,2,253,158,117,193,239,99,2,60,101,186,249,98,99,173,98,14,210,174,13,91,71,62,207,175,106,211,40,132,64,15,28,246,252,254,183,178,145,61,155,15,21,7,213,225,144,156,20,71,79,191,169,93,137,200,203,45,195,231,161,166,249,97,22,65,208,239,245,128,44,16,255,197,114,232,218,128,229,77,4,146,91,252,228,13,181,86,63,145,5,171,30,97,251,251,103,242,97,47,223,196,72,13,186,136,166,75,62,185,79,55,224,226,98,86,196,199,6,180,214,54,84,53,165,28,143,60,83,156,50,130,39,106,86,87,98,42,5,151,18,23,149,57,89,80,127,34,139,214,242,39,242,87,212,56,138,222,16,127,29,76,149,163,4,169,107,188,188,38,127,66,155,165,245,79,100,86,57,237,26,243,29,127,24,249,204,190,192,120,50,190,56,189,144,197,72,183,90,58,230,209,130,248,160,195,228,27,206,250,221,176,214,247,224,55,249,230,170,159,215,125,17,126,76,184,19,35,170,227,4,152,33,218,77,102,179,140,112,152,160,172,19,195,16,233,138,40,92,162,184,147,193,57,10,17,66,203,189,104,230,110,173,43,81,215,56,129,87,173,137,3,155,230,7,113,251,208,107,71,67,59,140,4,9,11,161,147,221,68,105,106,77,0,205,245,74,48,73,80,94,66,21,196,47,120,146,214,150,255,139,74,171,140,57,122,8,161,76,114,179,246,18,240,137,200,187,154,214,62,19,168,73,173,11,148,192,11,145,149,215,19,36,114,91,4,143,250,145,186,40,44,63,68,161,47,166,161,194,227,39,43,111,175,90,45,158,105,164,234,141,160,3,124,7,116,184,216,111,35,125,52,115,193,146,134,100,22,81,18,2,132,132,83,73,102,78,51,215,107,202,55,10,159,69,44,227,142,33,232,204,18,102,176,8,162,82,142,239,36,104,239,153,130,102,91,8,61,186,29,107,242,125,100,9,189,118,40,249,82,8,215,117,70,95,82,153,132,9,50,143,162,236,0,231,93,194,5,104,246,189,84,176,129,166,58,108,143,115,245,76,37,110,192,107,142,134,74,87,17,209,241,195,183,156,0,217,88,48,247,130,250,39,148,199,105,122,43,200,221,192,219,64,75,181,177,144,56,35,15,127,199,113,91,41,23,105,26,112,170,14,140,222,208,228,142,58,226,244,57,9,115,100,229,33,215,186,122,181,59,64,230,89,166,213,82,35,251,165,190,200,86,171,220,159,37,130,233,124,101,25,208,44,47,61,0,182,90,174,172,252,188,136,66,125,27,212,92,100,41,166,36,46,93,99,57,116,245,14,43,64,235,16,233,232,95,96,113,243,92,224,176,140,48,155,39,119,174,202,63,139,193,121,20,18,215,107,228,77,214,19,37,214,170,48,9,202,52,139,194,196,182,167,56,35,219,129,130,134,73,171,101,38,213,16,76,58,192,81,249,172,65,234,25,117,34,84,138,187,15,221,172,92,203,84,49,246,118,222,101,230,232,1,221,85,102,62,139,22,50,51,82,244,139,153,145,188,59,204,12,168,118,48,243,149,119,127,121,48,179,170,181,122,86,120,166,188,73,78,92,92,113,194,60,207,243,171,252,22,140,26,14,45,214,108,158,114,102,52,23,245,228,107,137,194,53,219,148,225,94,87,150,104,183,117,86,114,37,191,128,215,37,56,152,219,245,67,93,56,252,212,251,172,83,171,114,37,81,37,57,69,101,89,248,106,87,167,130,181,144,222,202,91,237,21,109,5,11,146,101,248,154,32,190,194,217,61,13,156,188,45,167,62,222,33,166,79,7,223,225,136,59,97,114,71,139,57,19,3,114,4,102,161,186,246,246,132,29,130,14,215,81,162,138,115,229,119,32,213,79,190,240,65,28,93,83,0,65,76,102,28,84,1,238,230,17,39,219,89,138,3,2,32,160,201,29,195,233,26,80,114,75,152,216,29,0,65,22,176,36,142,27,33,182,239,191,1,230,75,45,140,26,153,36,169,91,18,201,20,130,188,170,254,202,170,81,106,227,90,109,51,162,250,27,100,35,94,55,147,109,38,91,104,183,215,243,248,156,37,119,142,8,97,85,219,9,16,203,157,115,130,67,231,130,48,97,148,114,220,119,218,160,99,86,118,64,27,152,190,61,133,159,171,252,193,180,69,56,180,232,182,218,228,255,189,135,230,224,143,52,52,133,124,34,159,235,123,149,136,247,80,142,175,182,54,199,87,159,91,45,113,75,53,134,41,159,141,10,107,174,166,134,21,86,188,186,57,118,120,86,88,176,90,193,62,121,9,137,103,43,183,89,125,15,117,170,104,82,105,171,213,60,83,110,215,105,130,179,27,236,164,135,81,61,112,197,59,130,169,86,16,109,199,21,201,179,88,30,102,95,75,219,33,207,240,89,229,58,76,213,145,9,71,148,243,168,222,46,234,120,148,245,140,6,38,105,149,199,2,161,56,0,117,232,84,41,161,1,31,223,128,207,188,22,149,177,225,105,51,50,60,109,70,167,202,9,181,123,162,11,13,77,251,210,140,211,238,140,32,144,203,243,151,215,5,136,215,77,89,146,186,32,140,50,121,13,1,207,83,222,97,143,31,150,73,76,133,235,146,184,253,202,196,50,173,144,204,31,44,9,228,144,230,20,69,224,33,34,127,221,59,133,51,125,219,174,211,54,205,235,166,97,93,190,123,250,180,194,81,26,104,150,120,149,165,52,144,60,241,74,246,190,142,97,214,136,97,86,131,225,232,244,227,201,58,142,105,35,142,105,13,142,227,209,219,201,58,142,184,17,71,92,131,67,62,223,175,35,97,141,72,88,9,201,202,50,56,83,166,149,150,193,145,76,9,14,45,39,80,236,82,48,39,193,141,216,164,67,183,98,123,17,197,1,143,110,73,238,15,204,226,114,63,179,89,239,249,85,4,13,203,173,54,211,98,45,71,168,127,232,110,134,178,145,40,243,54,83,112,171,167,112,244,172,55,161,70,78,55,225,233,123,222,202,122,77,71,235,79,178,141,142,17,150,26,111,75,126,184,236,34,163,80,54,133,167,49,14,136,187,243,191,127,28,117,118,174,33,16,193,218,30,151,111,220,178,206,233,215,184,88,59,222,19,35,198,183,174,60,200,27,253,114,195,34,88,102,42,192,113,60,197,193,205,5,225,192,219,66,128,179,37,1,173,150,43,82,21,5,39,59,197,165,60,62,93,137,100,165,24,86,12,211,213,38,164,80,161,148,33,105,241,103,55,168,18,66,20,185,20,34,27,115,178,67,224,200,4,12,181,69,236,89,204,200,199,99,31,0,88,228,51,77,152,116,6,117,8,156,28,133,28,18,9,81,142,225,46,10,235,88,17,195,98,169,252,95,0,111,213,17,177,94,8,129,247,245,107,113,137,212,191,47,30,244,180,145,65,138,126,114,31,69,120,88,143,205,215,221,173,48,67,0,228,62,183,210,15,91,238,85,212,37,235,181,118,186,198,190,184,74,99,202,243,123,30,229,187,95,125,7,164,42,253,214,61,169,113,4,248,93,226,4,73,188,92,208,204,1,157,124,167,58,64,164,108,161,195,3,34,98,38,167,148,25,18,157,164,9,197,228,205,39,145,206,93,84,211,129,109,71,142,76,144,133,125,241,142,109,28,109,167,146,86,43,16,208,62,216,159,191,62,16,216,242,78,133,249,235,131,253,57,219,17,131,197,95,151,185,196,19,115,178,205,165,250,202,157,55,125,114,4,50,245,23,29,18,194,200,10,126,60,239,245,156,202,250,187,41,218,232,38,143,204,91,145,56,35,14,205,235,17,85,59,135,57,108,89,31,222,202,254,243,187,26,167,43,203,81,180,230,28,150,223,27,202,78,193,158,203,221,66,157,55,176,158,160,14,129,44,77,41,4,249,184,89,189,249,52,233,191,53,219,207,82,172,26,93,98,165,91,71,254,65,136,217,18,169,96,71,254,187,45,18,220,182,84,123,222,57,37,22,31,128,218,151,100,131,95,68,181,152,17,213,155,53,11,53,17,150,220,101,168,253,234,81,106,251,59,102,189,69,70,59,0,67,65,5,151,18,191,140,39,45,41,18,42,187,171,68,76,130,218,118,16,42,161,160,35,156,188,215,54,96,203,180,22,104,134,227,140,120,21,201,21,156,197,84,238,134,12,91,74,24,193,85,86,171,90,221,30,5,58,166,58,129,16,232,131,195,252,122,247,1,240,58,53,126,245,150,48,30,5,88,186,84,71,124,108,155,0,202,81,107,196,249,16,135,78,211,137,104,251,96,95,26,135,54,22,73,96,154,124,105,43,230,52,111,9,29,10,161,13,95,132,105,241,229,159,226,181,31,97,19,152,147,183,191,35,197,182,244,178,230,141,141,126,40,206,89,212,169,111,251,96,127,25,31,232,86,190,210,214,217,157,191,78,227,222,213,65,233,205,147,162,166,51,237,62,90,47,126,251,249,117,111,47,239,252,219,72,82,245,169,126,3,213,50,96,137,48,123,14,97,217,4,252,13,116,75,112,37,178,241,115,200,202,158,213,111,32,91,130,43,145,157,54,145,221,89,198,7,210,144,116,189,86,89,199,33,216,199,150,37,204,34,182,104,55,240,166,155,79,31,103,78,3,214,178,23,104,246,78,255,33,56,211,6,188,191,67,241,173,125,156,85,172,96,140,213,58,79,118,56,173,142,197,55,156,80,13,157,159,79,117,30,75,206,65,29,78,137,189,237,44,34,138,218,189,182,179,192,95,80,187,223,235,89,125,135,164,212,119,88,248,147,154,48,191,125,160,220,123,45,132,196,82,231,207,205,29,90,137,147,140,42,20,235,250,230,146,49,138,63,141,113,112,179,231,212,93,99,66,68,89,39,177,100,84,21,149,122,145,18,170,162,118,3,165,115,18,185,222,107,59,59,22,95,86,192,86,230,13,116,178,14,120,10,131,170,242,194,75,237,157,181,60,89,165,155,58,142,116,188,152,95,173,178,94,242,36,85,153,18,11,47,211,45,213,100,234,40,171,208,212,16,158,69,215,75,70,36,66,221,98,166,162,166,89,116,29,96,221,143,106,71,79,214,184,252,88,50,98,227,150,129,174,198,253,113,124,124,236,188,25,57,3,71,14,59,205,230,160,4,210,237,20,223,127,247,85,192,173,185,146,31,206,206,142,115,146,112,39,90,164,74,179,36,116,102,203,56,190,223,178,143,47,14,2,18,19,150,44,8,23,92,8,30,229,144,230,177,116,117,78,113,108,92,168,190,222,82,70,106,17,37,75,158,46,121,14,155,74,5,174,255,89,127,229,189,165,20,59,54,68,107,149,244,166,210,226,70,186,68,161,178,202,17,242,61,174,84,76,40,138,91,170,154,96,128,42,101,55,89,80,240,43,136,138,210,198,55,99,233,53,253,73,192,134,238,184,6,84,185,124,85,140,165,228,173,190,79,237,169,40,215,18,192,13,189,103,79,197,93,202,36,27,91,192,158,138,181,148,9,215,247,115,61,21,165,29,173,13,171,205,87,181,205,88,117,193,127,83,167,82,97,174,69,210,37,50,66,93,142,109,48,90,191,22,184,206,48,77,109,241,223,1,0,0,255,255,47,241,8,243,193,72,0,0 };