ESPUI/src/dataControlsJS.h

107 lines
31 KiB
C

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 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 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;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);return savedData[id];}
return[];}
function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();}
function conStatusError(){websockConnected=false;$("#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(){document.addEventListener("visibilitychange",handleVisibilityChange,false);if(window.location.port!=""||window.location.port!=80||window.location.port!=443){websock=new WebSocket("ws://"+window.location.hostname+":"+window.location.port+"/ws");}else{websock=new WebSocket("ws://"+window.location.hostname+"/ws");}
websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;};websock.onclose=function(evt){console.log("websock close");conStatusError();};websock.onerror=function(evt){console.log(evt);conStatusError();};var handleEvent=function(evt){console.log(evt);var data=JSON.parse(evt.data);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();buttonclick(data.id,true);},touchend:function(e){e.preventDefault();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();padclick(UP,data.id,true);},touchend:function(e){e.preventDefault();padclick(UP,data.id,false);},});$("#pl"+data.id).on({touchstart:function(e){e.preventDefault();padclick(LEFT,data.id,true);},touchend:function(e){e.preventDefault();padclick(LEFT,data.id,false);},});$("#pr"+data.id).on({touchstart:function(e){e.preventDefault();padclick(RIGHT,data.id,true);},touchend:function(e){e.preventDefault();padclick(RIGHT,data.id,false);},});$("#pb"+data.id).on({touchstart:function(e){e.preventDefault();padclick(DOWN,data.id,true);},touchend:function(e){e.preventDefault();padclick(DOWN,data.id,false);},});$("#pc"+data.id).on({touchstart:function(e){e.preventDefault();padclick(CENTER,data.id,true);},touchend:function(e){e.preventDefault();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("<li><a onmouseup='tabclick("+data.id+")' href='#tab"+data.id+"'>"+data.value+"</a></li>");$("#tabscontent").append("<div id='tab"+data.id+"'></div>");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("<option id='option"+
data.id+
"' value='"+
data.value+
"' "+
data.selected+
">"+
data.label+
"</option>");}
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){var parent=$("#id"+data.parentControl+" input");if(parent.size()){parent.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=Math.round(new Date().getTime()/1000);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 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($("#id"+data.id),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);}
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;default:console.error("Unknown type or event");break;}
if(data.type>=UI_TITEL&&data.type<UPDATE_OFFSET){processEnabled(data);}
if(data.type>=UPDATE_OFFSET&&data.type<UI_INITIAL_GUI){var element=$("#id"+data.id);if(data.hasOwnProperty('panelStyle')){$("#id"+data.id).attr("style",data.panelStyle);}
if(data.hasOwnProperty('visible')){if(data['visible'])
$("#id"+data.id).show();else
$("#id"+data.id).hide();}
if(data.type==UPDATE_SLIDER){element.removeClass("slider-turquoise slider-emerald slider-peterriver slider-wetasphalt slider-sunflower slider-carrot slider-alizarin");element.addClass("slider-"+colorClass(data.color));}else{element.removeClass("turquoise emerald peterriver wetasphalt sunflower carrot alizarin");element.addClass(colorClass(data.color));}
processEnabled(data);}
$(".range-slider__range").each(function(){$(this)[0].value=$(this).attr("value");$(this).next().html($(this).attr("value"));});};websock.onmessage=handleEvent;}
function sliderchange(number){var val=$("#sl"+number).val();websock.send("slvalue:"+val+":"+number);$(".range-slider__range").each(function(){$(this).attr("value",$(this)[0].value);});}
function numberchange(number){var val=$("#num"+number).val();websock.send("nvalue:"+val+":"+number);}
function textchange(number){var val=$("#text"+number).val();websock.send("tvalue:"+val+":"+number);}
function tabclick(number){var val=$("#tab"+number).val();websock.send("tabvalue:"+val+":"+number);}
function selectchange(number){var val=$("#select"+number).val();websock.send("svalue:"+val+":"+number);}
function buttonclick(number,isdown){if(isdown)websock.send("bdown:"+number);else websock.send("bup:"+number);}
function padclick(type,number,isdown){if(!$("#id"+number+" nav").hasClass("disabled")){switch(type){case CENTER:if(isdown)websock.send("pcdown:"+number);else websock.send("pcup:"+number);break;case UP:if(isdown)websock.send("pfdown:"+number);else websock.send("pfup:"+number);break;case DOWN:if(isdown)websock.send("pbdown:"+number);else websock.send("pbup:"+number);break;case LEFT:if(isdown)websock.send("pldown:"+number);else websock.send("plup:"+number);break;case RIGHT:if(isdown)websock.send("prdown:"+number);else websock.send("prup:"+number);break;}}}
function switcher(number,state){if(state==null){if(!$("#sl"+number).hasClass("checked")){websock.send("sactive:"+number);$("#sl"+number).addClass("checked");}else{websock.send("sinactive:"+number);$("#sl"+number).removeClass("checked");}}else if(state==1){$("#sl"+number).addClass("checked");$("#sl"+number).prop("checked",true);}else if(state==0){$("#sl"+number).removeClass("checked");$("#sl"+number).prop("checked",false);}}
var rangeSlider=function(isDiscrete){var range=$(".range-slider__range");var slidercb=function(){sliderchange($(this).attr("id").replace(/^\D+/g,""));};range.on({input:function(){$(this).next().html(this.value)}});range.each(function(){$(this).next().html(this.value);if($(this).attr("callbackSet")!="true"){if(!isDiscrete){$(this).on({input:slidercb});}else{$(this).on({change:slidercb});}
$(this).attr("callbackSet","true");}});};var addToHTML=function(data){panelStyle=data.hasOwnProperty('panelStyle')?" style='"+data.panelStyle+"' ":"";panelwide=data.hasOwnProperty('wide')?"wide":"";if(!data.hasOwnProperty('parentControl')||$("#tab"+data.parentControl).length>0){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:html="<div id='id"+data.id+"' "+panelStyle+" class='two columns "+panelwide+" card tcenter "+
colorClass(data.color)+"'><h5>"+data.label+"</h5><hr/>"+
elementHTML(data)+
"</div>";break;case UI_SEPARATOR:html="<div id='id"+data.id+"' "+panelStyle+" class='sectionbreak columns'>"+
"<h5>"+data.label+"</h5><hr/></div>";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+"' ":"";switch(data.type){case UI_LABEL:return"<span id='l"+id+"' "+elementStyle+
" class='label label-wrap'>"+data.value+"</span>";case UI_BUTTON:return"<button id='btn"+id+"' "+elementStyle+
" onmousedown='buttonclick("+id+", true)'"+
" onmouseup='buttonclick("+id+", false)'>"+
data.value+"</button>";case UI_SWITCHER:return"<label id='sl"+id+"' "+elementStyle+
" class='switch "+(data.value=="1"?"checked":"")+
(data.hasOwnProperty('vertical')?" vert-switcher ":"")+
"'>"+
"<div class='in'>"+
"<input type='checkbox' id='s"+id+"' onClick='switcher("+id+",null)' "+
(data.value=="1"?"checked":"")+"/></div></label>";case UI_CPAD:case UI_PAD:return"<nav class='control'><ul>"+
"<li><a onmousedown='padclick(UP, "+id+", true)' "+
"onmouseup='padclick(UP, "+id+", false)' id='pf"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(RIGHT, "+id+", true)' "+
"onmouseup='padclick(RIGHT, "+id+", false)' id='pr"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(LEFT, "+id+", true)' "+
"onmouseup='padclick(LEFT, "+id+", false)' id='pl"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(DOWN, "+id+", true)' "+
"onmouseup='padclick(DOWN, "+id+", false)' id='pb"+id+"'>&#9650;</a></li>"+
"</ul>"+
(data.type==UI_CPAD?"<a class='confirm' onmousedown='padclick(CENTER,"+id+", true)' "+
"onmouseup='padclick(CENTER, "+id+", false)' id='pc"+id+"'>OK</a>":"")+
"</nav>";case UI_SLIDER:return"<div class='range-slider "+
(data.hasOwnProperty('vertical')?" vert-slider ":"")+
"'>"+
"<input id='sl"+id+"' type='range' min='0' max='100' value='"+data.value+"' "+
elementStyle+" class='range-slider__range'><span class='range-slider__value'>"+
data.value+"</span></div>";case UI_NUMBER:return"<input style='color:black;' "+elementStyle+" id='num"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input style='color:black;' "+elementStyle+" id='text"+id+
"' value='"+data.value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black;' "+elementStyle+" id='select"+id+
"' onchange='selectchange("+id+")' />";case UI_GRAPH:return"<figure id='graph"+id+"'><figcaption>"+data.label+"</figcaption></figure>";case UI_GAUGE:return"WILL BE A GAUGE <input style='color:black;' id='gauge"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_ACCEL:return"ACCEL // Not implemented fully!<div class='accelerometer' id='accel"+id+
"' ><div class='ball"+id+"'></div><pre class='accelerometeroutput"+id+"'></pre>";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:if(data.enabled){$("#id"+data.id+" nav").removeClass('disabled');}else{$("#id"+data.id+" nav").addClass('disabled');}
break;}}
)=====";
const uint8_t JS_CONTROLS_GZIP[4173] PROGMEM = { 31,139,8,0,202,202,6,98,2,255,197,27,105,119,218,72,242,187,127,133,172,228,5,177,198,6,114,77,6,44,231,17,76,18,118,124,173,141,39,243,54,147,245,19,208,24,61,11,73,35,9,31,227,240,223,183,186,250,80,183,14,32,120,102,247,75,140,170,171,171,171,171,170,187,174,206,40,240,227,196,184,236,95,245,79,250,131,126,231,232,234,211,101,223,126,217,104,180,71,98,224,188,119,116,218,57,4,88,83,192,206,14,59,131,222,213,233,199,143,23,189,129,221,84,113,123,191,13,122,39,135,140,70,83,129,15,250,131,222,145,173,0,206,128,98,134,30,130,210,69,250,87,93,10,121,169,35,117,25,214,203,20,235,195,229,96,112,122,98,191,210,241,56,180,217,120,149,98,30,117,62,0,19,175,117,68,6,108,54,94,167,120,23,95,250,131,238,231,222,185,253,70,71,149,240,102,227,141,130,125,212,63,4,216,219,12,46,131,54,27,111,83,204,147,203,227,15,0,251,73,199,228,208,102,227,39,69,92,32,71,80,200,217,229,192,126,167,99,43,35,205,198,187,116,198,167,243,206,217,103,251,103,14,232,28,30,50,200,213,217,105,255,132,162,242,129,238,81,175,115,206,145,155,141,159,149,21,59,31,236,102,70,33,12,166,40,228,162,119,212,235,2,181,140,78,4,184,169,104,229,244,108,208,167,242,207,168,69,128,155,138,90,142,251,0,200,104,5,97,77,69,39,199,157,223,236,102,70,31,8,107,170,170,24,244,206,236,102,86,19,8,108,42,122,248,212,185,252,212,179,155,25,61,112,104,83,81,67,167,219,165,182,145,81,1,135,54,223,169,130,57,235,156,119,6,167,160,198,159,179,178,145,35,77,85,220,253,227,30,156,168,140,188,41,176,169,64,229,129,57,60,253,114,34,143,203,81,239,227,64,30,139,243,254,167,207,3,105,252,221,222,201,0,108,73,200,173,123,53,184,60,255,215,229,105,255,162,39,73,117,175,122,199,189,243,206,81,122,252,186,87,103,61,152,117,222,255,21,166,190,148,192,47,189,65,231,226,236,115,231,72,33,127,117,113,121,242,241,232,244,139,182,70,183,115,126,126,58,144,135,165,123,213,57,234,255,187,115,14,26,124,43,65,135,157,243,95,164,225,119,175,78,78,79,96,251,111,222,180,111,157,200,184,142,156,112,122,232,36,142,237,147,59,163,19,69,206,131,85,197,145,169,19,119,70,35,226,217,19,199,139,9,130,98,207,29,147,168,27,248,137,235,207,131,121,204,135,38,115,127,148,184,129,111,140,2,47,136,186,158,19,199,22,254,236,143,171,143,252,135,125,50,159,13,73,36,225,237,248,206,77,70,83,5,207,137,137,42,179,86,68,146,121,228,155,240,207,31,243,192,141,137,217,230,40,92,132,2,129,204,72,228,120,99,57,156,202,83,96,132,36,33,81,228,222,146,72,34,165,242,21,72,119,36,113,226,112,234,120,137,68,146,242,22,56,241,220,159,120,193,157,66,135,137,95,140,143,156,40,10,210,249,66,21,98,216,241,220,63,157,200,245,37,2,85,76,139,255,166,90,17,136,99,39,186,49,219,99,50,113,230,94,34,128,102,123,177,216,162,90,184,35,195,56,24,221,180,149,223,160,18,159,140,18,50,206,106,36,34,127,204,73,156,156,70,46,241,19,135,130,206,72,52,115,227,24,126,89,213,199,197,150,196,140,157,91,242,73,24,3,12,121,193,200,241,46,146,32,114,174,201,94,76,146,126,66,102,150,73,226,112,238,162,205,196,102,237,159,23,167,39,123,113,2,59,186,118,39,15,150,52,165,106,181,173,16,142,96,253,32,82,104,187,160,109,180,38,88,113,140,166,167,173,117,93,184,86,74,188,237,78,44,57,117,219,246,231,158,87,125,76,105,33,83,161,19,197,36,197,170,182,153,12,211,37,191,186,227,111,192,36,3,127,253,150,229,215,137,18,16,193,115,107,28,140,230,51,144,92,117,207,25,143,45,243,31,102,117,47,152,76,224,128,60,183,204,103,81,112,7,223,211,100,230,89,166,89,109,115,85,236,141,188,0,214,6,3,103,84,84,210,112,2,47,64,11,243,184,7,118,18,193,10,37,234,163,212,37,46,172,17,145,89,112,75,216,193,50,241,196,236,94,71,132,248,102,53,135,10,124,106,120,17,25,23,96,49,166,145,11,163,110,156,4,6,231,128,50,249,226,217,187,183,175,222,180,11,102,165,91,215,160,190,245,56,242,220,209,77,139,75,174,182,208,54,61,117,252,177,71,126,117,99,119,232,122,110,242,208,5,192,53,8,232,17,244,184,157,21,192,139,23,219,66,230,123,83,119,60,38,126,245,81,42,132,30,128,212,94,185,146,36,58,236,188,119,11,63,142,220,56,33,62,92,53,230,173,92,115,132,107,154,181,98,94,106,40,117,52,172,59,215,31,7,119,123,212,32,233,42,123,97,16,37,219,182,105,126,255,94,60,242,174,81,54,242,250,245,43,169,95,188,91,191,144,225,5,252,38,137,101,222,197,173,122,221,220,201,78,156,6,113,226,59,51,178,99,182,242,131,148,234,142,89,191,3,145,183,23,4,248,221,152,56,167,177,37,12,54,240,131,144,248,182,144,172,69,110,19,122,109,251,113,224,17,152,127,13,36,25,166,65,241,214,176,185,50,219,76,200,61,240,39,117,157,158,153,212,254,147,104,78,218,139,118,202,26,158,166,117,120,67,68,32,153,61,99,26,53,66,97,75,168,81,64,17,5,230,15,169,237,160,137,173,162,64,209,199,153,203,8,6,246,198,120,23,209,81,98,75,187,29,6,227,7,132,141,224,139,68,96,108,194,55,82,244,189,228,33,36,220,59,234,121,66,171,224,14,162,160,196,25,198,190,115,91,4,6,70,225,104,36,234,16,216,60,46,147,117,237,112,165,102,157,125,33,30,216,17,194,41,233,40,240,226,189,73,16,245,28,96,158,120,132,110,207,62,192,187,30,60,217,61,19,221,35,69,111,101,92,7,71,174,214,22,109,69,204,150,156,5,58,72,89,77,130,196,241,196,122,7,150,190,188,71,252,235,100,186,219,172,202,195,7,206,203,135,187,123,238,6,55,112,172,74,209,97,35,195,136,56,55,109,33,234,52,155,106,253,127,119,200,228,78,175,59,56,210,228,126,103,163,29,175,51,63,47,3,150,125,182,178,119,73,68,188,192,25,195,201,208,177,49,207,108,73,195,78,220,196,35,204,106,60,103,72,60,52,195,153,227,250,159,137,3,54,36,172,48,69,200,210,195,236,176,37,190,88,170,38,63,211,92,76,130,88,42,36,63,49,167,80,6,121,46,208,18,82,70,247,224,145,42,92,95,131,224,243,224,248,200,98,231,83,103,130,229,178,185,73,143,217,89,116,115,195,196,55,119,16,13,98,28,116,140,73,48,31,77,81,246,173,244,206,168,62,146,189,48,34,84,237,135,44,198,163,162,156,39,9,189,238,192,145,90,156,68,141,222,134,160,148,26,82,1,157,110,66,131,251,182,5,243,202,250,222,68,78,189,122,119,236,70,2,167,42,200,50,116,199,67,6,51,100,105,153,64,202,157,254,94,75,120,225,100,99,217,133,206,152,109,250,242,172,182,169,236,138,104,168,178,67,22,189,167,179,72,19,200,167,51,169,81,201,177,25,61,157,77,76,109,159,206,167,78,38,199,232,240,233,140,210,236,252,233,124,106,84,114,108,142,158,206,38,43,14,60,157,209,12,157,165,167,27,171,96,171,15,95,68,99,224,11,244,235,214,118,46,14,200,145,29,116,62,228,105,234,129,135,19,134,232,129,246,61,247,96,223,49,2,127,6,148,200,60,180,43,128,195,246,33,37,186,99,86,43,198,52,34,19,187,66,41,40,240,202,1,255,192,107,102,199,220,175,59,7,251,117,32,89,24,209,200,53,199,238,173,225,142,113,41,141,216,126,29,70,232,92,58,207,6,2,123,58,1,248,26,146,113,151,125,91,144,255,6,97,139,170,105,81,197,184,205,50,157,208,101,43,59,128,61,113,61,8,214,44,169,54,154,166,96,138,249,220,74,166,110,12,252,36,9,164,32,116,99,102,213,182,109,136,132,233,190,119,147,96,151,221,165,144,206,163,49,153,8,55,107,170,1,208,120,2,216,177,195,40,152,133,16,50,15,156,161,145,4,6,155,72,127,89,62,86,83,12,72,223,192,38,223,179,56,110,155,238,103,143,33,193,12,11,62,33,38,112,60,18,81,18,83,39,161,52,141,113,64,98,195,15,18,131,220,67,162,100,180,126,255,29,147,129,2,155,43,48,41,86,65,148,234,135,200,22,102,116,89,36,193,216,102,32,42,222,103,49,196,60,163,132,235,64,71,109,179,207,84,105,65,136,73,29,213,27,251,105,238,108,9,221,109,153,21,3,77,192,174,8,40,179,8,58,32,32,108,49,66,177,15,4,12,131,10,0,236,215,25,205,3,51,191,163,227,126,233,118,0,252,220,170,60,139,189,74,209,22,120,220,68,77,191,28,135,25,193,204,245,77,221,97,210,252,205,224,244,65,149,171,23,40,69,42,91,33,183,207,206,111,127,255,62,157,251,37,251,164,217,223,234,21,202,177,228,26,12,253,239,150,104,110,47,185,235,117,208,59,91,243,36,184,227,162,83,176,99,26,174,31,206,19,118,122,249,137,136,221,63,137,5,199,86,28,16,100,38,78,72,184,130,27,236,42,172,190,235,101,25,237,43,63,93,223,236,92,125,78,184,186,54,112,0,190,0,7,46,110,175,173,252,220,154,137,176,212,59,234,199,43,211,8,105,225,181,22,219,199,78,50,221,139,130,57,28,124,90,186,0,138,176,99,90,246,27,184,51,248,85,111,54,26,141,34,78,247,194,121,60,181,30,239,91,73,92,123,104,165,210,128,123,42,83,188,220,132,115,133,111,165,79,211,42,16,216,215,111,127,241,122,162,217,65,213,39,170,238,85,54,46,139,240,88,24,89,237,202,151,150,123,51,151,159,210,130,195,90,130,26,220,166,153,25,55,56,177,52,48,116,122,231,159,69,65,8,110,229,193,170,240,188,246,34,121,240,72,165,202,2,1,149,144,48,96,24,230,22,172,206,40,102,73,166,37,75,178,14,240,168,13,243,125,163,213,252,49,214,226,39,243,198,130,170,18,90,200,154,118,82,183,88,64,117,69,11,184,150,118,23,192,44,5,177,102,130,217,155,74,37,242,127,183,37,158,88,83,90,112,41,42,196,128,177,141,109,64,167,180,9,91,74,130,143,209,30,56,134,191,136,183,12,169,141,204,128,149,26,114,97,206,83,89,203,17,219,132,57,94,178,200,87,36,178,156,229,49,176,68,187,41,243,58,169,77,56,79,11,7,233,131,131,86,30,141,85,118,232,146,215,206,252,154,252,69,178,207,210,218,100,3,236,30,47,48,230,254,113,15,253,95,116,107,43,78,47,9,250,23,167,23,88,36,180,210,14,18,43,223,37,224,13,91,230,78,116,139,237,128,140,223,16,189,65,81,122,198,194,182,101,94,250,55,126,112,231,27,180,104,76,147,3,140,232,77,49,105,177,37,11,140,48,126,96,139,146,221,139,23,18,184,175,61,47,129,48,36,10,70,36,142,123,190,3,254,102,204,189,76,142,142,58,71,35,166,21,172,89,88,36,170,166,217,187,176,84,85,161,227,19,79,83,148,58,173,64,75,233,4,149,213,44,89,238,67,41,77,142,242,85,194,190,85,183,114,235,196,211,224,14,116,68,227,204,252,224,20,238,120,43,43,24,219,214,124,6,228,245,108,235,122,59,143,249,135,93,217,230,230,77,246,93,222,214,22,159,105,15,91,64,210,134,181,128,200,246,180,0,176,126,180,248,146,237,103,186,11,34,122,102,58,27,230,142,210,195,231,117,98,248,174,138,158,83,225,22,82,222,5,211,10,183,42,155,146,63,206,216,50,142,74,249,216,42,177,73,154,209,99,41,99,151,187,220,43,252,130,92,157,208,106,189,146,169,243,20,253,107,227,27,143,37,244,156,157,57,113,122,59,50,168,79,239,68,30,18,21,98,178,84,89,105,51,205,128,61,231,154,216,74,165,95,237,136,50,254,88,79,146,103,242,236,108,0,61,91,184,116,14,199,27,45,123,53,196,30,174,12,215,2,252,197,235,129,99,183,127,88,8,122,224,146,149,12,47,2,72,206,217,50,75,56,71,183,191,140,117,191,140,115,101,21,234,132,150,172,193,220,247,178,69,146,117,22,17,149,168,194,37,104,237,104,233,10,206,112,141,53,152,55,95,166,104,238,238,151,42,123,141,133,212,194,63,27,174,185,241,24,60,1,94,110,252,167,78,118,72,97,10,53,76,160,51,40,243,176,120,57,89,141,164,215,92,45,191,224,182,184,32,217,16,36,186,188,33,233,196,252,202,24,187,49,158,94,56,60,143,188,219,169,52,58,89,145,179,85,198,122,56,90,205,123,56,210,152,215,60,114,57,225,201,26,132,39,101,132,105,13,185,156,244,26,242,14,135,101,164,105,185,191,156,180,183,6,105,175,140,52,86,232,203,105,71,107,208,142,10,104,47,180,183,26,34,143,227,166,18,67,110,74,208,82,240,151,205,31,241,8,203,81,175,191,212,100,128,192,232,134,89,76,230,128,56,176,202,45,209,111,65,141,136,242,64,65,16,209,223,80,8,74,174,191,146,150,254,22,39,37,39,43,80,124,75,205,52,59,91,198,70,22,7,156,91,152,142,139,62,65,134,118,35,79,187,132,173,21,228,69,251,128,61,44,83,26,1,233,11,7,55,62,116,227,81,68,18,94,151,70,36,187,212,207,40,239,4,71,67,91,241,55,154,211,211,157,15,220,20,116,3,161,231,140,136,85,255,207,239,135,59,245,235,154,137,126,149,53,39,176,233,130,181,178,86,129,7,83,253,51,133,112,215,181,88,240,214,70,169,235,43,153,216,198,50,162,202,224,200,241,188,161,51,186,185,32,16,76,111,219,38,213,138,201,236,85,21,143,152,148,114,43,4,177,16,246,166,162,48,89,104,56,91,229,235,214,248,170,237,197,66,188,72,145,213,159,84,206,24,12,61,166,17,176,189,50,164,126,111,26,24,60,211,226,122,38,124,222,161,245,245,150,105,182,17,116,7,108,22,147,163,35,148,16,253,139,248,84,48,37,11,43,245,207,74,245,251,119,233,108,203,203,181,7,13,173,158,186,14,221,247,203,200,166,239,102,216,179,30,208,254,242,55,55,250,51,4,158,92,231,90,232,165,205,239,76,59,110,243,231,12,88,143,44,126,220,192,210,78,182,21,217,0,83,50,20,212,228,142,170,89,99,68,175,10,187,146,220,5,244,217,238,124,230,199,2,131,170,145,34,56,209,216,72,216,163,36,218,102,41,14,200,177,179,54,125,35,90,117,172,229,98,238,215,1,180,63,141,234,180,23,195,67,251,180,76,137,45,25,108,198,101,170,160,233,27,141,77,182,18,179,7,140,72,82,236,137,246,16,97,181,37,12,22,115,130,249,186,200,154,245,102,21,101,77,28,231,181,234,252,217,110,87,78,30,242,2,86,70,178,71,154,14,131,36,184,16,84,236,37,231,92,175,114,228,78,186,58,44,207,250,170,115,192,95,35,239,199,160,2,212,13,120,23,161,21,141,224,150,84,12,202,220,192,127,119,239,34,39,204,55,118,41,177,3,51,251,230,70,44,197,162,91,92,12,75,76,101,203,241,62,51,141,88,0,83,9,137,217,148,154,129,222,148,54,17,77,181,39,93,132,201,28,99,229,64,111,56,2,167,12,89,225,85,94,0,130,91,182,91,202,108,188,90,52,188,165,43,94,105,137,210,118,211,124,47,157,52,40,5,78,76,73,17,3,254,184,224,37,80,185,244,99,87,132,90,6,159,103,242,19,64,79,18,95,211,245,57,12,125,20,214,138,236,10,174,54,12,238,43,140,115,193,120,224,119,169,92,4,163,244,85,45,147,16,70,108,216,126,93,193,185,41,142,216,126,29,37,163,136,46,119,85,10,17,66,182,32,152,229,207,212,224,146,153,123,140,107,237,77,1,211,181,250,118,199,208,149,77,57,52,21,101,23,162,114,109,227,214,233,51,36,246,96,224,197,179,159,223,190,105,180,211,103,7,171,86,103,143,93,214,101,32,131,173,241,16,109,204,3,62,12,90,151,5,29,89,227,192,219,152,3,124,74,179,46,7,58,178,198,193,112,41,7,117,102,14,90,181,141,89,212,123,19,88,75,173,103,226,70,179,74,9,171,252,49,205,154,188,114,236,98,110,71,130,219,211,95,40,163,226,244,237,215,193,150,213,219,130,5,1,194,208,149,83,169,70,211,233,177,90,227,192,243,25,250,113,103,71,91,191,132,216,65,199,117,42,198,204,5,65,52,224,175,115,111,87,154,141,134,242,196,66,189,240,80,26,186,159,40,98,152,135,255,112,74,209,45,20,98,32,197,130,27,21,239,126,225,133,51,209,145,144,19,219,14,247,94,24,120,180,134,144,45,220,180,115,87,171,137,155,198,50,20,127,58,194,182,205,18,160,210,93,194,253,143,209,184,64,228,121,10,19,29,232,184,174,240,166,132,106,155,242,199,74,88,217,183,45,101,44,41,245,176,66,134,120,160,40,61,51,22,149,126,128,27,81,133,226,252,164,11,107,245,171,194,165,89,80,42,86,158,184,215,243,136,32,77,222,238,230,79,175,96,96,228,240,55,56,153,56,76,25,194,15,32,160,210,199,48,151,211,255,210,63,58,50,62,244,140,142,129,96,99,153,216,145,7,214,208,249,187,236,128,5,221,156,55,252,48,234,244,63,211,192,185,155,133,76,202,100,108,76,192,81,62,108,171,39,221,161,13,125,18,5,51,90,36,103,156,34,72,114,122,160,98,15,33,7,148,114,100,142,52,4,25,23,209,10,230,9,125,78,34,145,67,20,101,217,127,35,211,203,232,217,120,179,60,12,204,100,60,153,150,189,104,128,16,70,182,160,69,173,86,42,42,162,14,88,225,165,10,5,143,149,42,100,161,80,214,42,120,30,157,109,124,139,218,202,143,144,228,213,149,226,119,147,235,116,253,179,4,183,181,189,103,114,10,45,227,91,209,122,255,33,194,185,220,113,157,6,250,15,173,160,165,162,171,59,224,63,68,91,75,168,87,52,176,127,136,176,26,93,118,179,157,229,194,78,115,161,241,106,185,39,47,100,151,217,112,106,156,69,179,10,109,84,88,223,98,241,95,247,185,72,194,13,64,0,0 };