ESPUI/src/dataControlsJS.h

107 lines
30 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){var parent=$("#id"+data.parentControl+" input");if(parent.size()){parent.attr("min",data.value);}}
break;case UI_MAX:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){if(!parent.attr("type")){parent.attr("maxlength",data.value);}else{parent.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[4145] PROGMEM = { 31,139,8,0,106,99,248,97,2,255,197,27,253,119,218,56,242,247,252,21,142,187,175,152,11,9,208,175,109,33,78,31,37,180,229,150,132,92,32,219,125,215,237,229,25,35,130,95,140,237,181,77,72,54,229,127,191,209,72,178,37,219,124,148,236,222,253,210,224,209,104,52,154,25,105,190,84,219,247,162,88,187,234,94,119,207,187,195,110,171,119,253,233,170,107,190,168,213,154,182,24,184,236,244,250,173,83,128,213,5,236,226,180,53,236,92,247,63,126,28,116,134,102,93,198,237,252,54,236,156,159,50,26,117,9,62,236,14,59,61,83,2,92,0,197,12,61,4,165,139,116,175,219,20,242,66,69,106,51,172,23,41,214,135,171,225,176,127,110,190,84,241,56,180,94,123,153,98,246,90,31,128,137,87,42,34,3,214,107,175,82,188,193,151,238,176,253,185,115,105,190,86,81,19,120,189,246,90,194,238,117,79,1,246,38,131,203,160,245,218,155,20,243,252,234,236,3,192,126,86,49,57,180,94,251,89,18,23,200,17,20,114,113,53,52,223,170,216,210,72,189,246,54,157,241,233,178,117,241,217,124,199,1,173,211,83,6,185,190,232,119,207,41,42,31,104,247,58,173,75,142,92,175,189,147,86,108,125,48,235,25,133,48,152,164,144,65,167,215,105,3,181,140,78,4,184,46,105,165,127,49,236,82,249,103,212,34,192,117,73,45,103,93,0,100,180,130,176,186,164,147,179,214,111,102,61,163,15,132,213,101,85,12,59,23,102,61,171,9,4,214,37,61,124,106,93,125,234,152,245,140,30,56,180,46,169,161,213,110,83,219,200,168,128,67,235,111,101,193,92,180,46,91,195,62,168,241,93,86,54,201,72,93,22,119,247,172,3,39,42,35,111,10,172,75,208,228,192,156,246,191,156,39,199,165,215,249,56,76,142,197,101,247,211,231,97,98,252,237,206,249,16,108,73,200,173,125,61,188,186,252,215,85,191,59,232,36,164,218,215,157,179,206,101,171,151,30,191,246,245,69,7,102,93,118,127,133,169,47,18,224,151,206,176,53,184,248,220,234,73,228,175,7,87,231,31,123,253,47,202,26,237,214,229,101,127,152,28,150,246,117,171,215,253,119,235,18,52,248,38,1,157,182,46,127,73,12,191,125,125,222,63,135,237,191,126,221,188,179,66,237,38,180,130,233,169,21,91,166,71,22,90,43,12,173,7,163,140,35,83,43,106,217,54,113,205,137,229,70,4,65,145,235,140,73,216,246,189,216,241,230,254,60,226,67,147,185,103,199,142,239,105,182,239,250,97,219,181,162,200,192,159,221,113,249,145,255,48,207,231,179,17,9,19,120,51,90,56,177,61,149,240,172,136,200,50,107,132,36,158,135,158,14,255,252,49,247,157,136,232,77,142,194,69,40,16,200,140,132,150,59,78,134,83,121,10,140,128,196,36,12,157,59,18,38,72,169,124,5,210,130,196,86,20,76,45,55,78,144,18,121,11,156,104,238,77,92,127,33,209,97,226,23,227,182,21,134,126,58,95,168,66,12,91,174,243,167,21,58,94,130,64,21,211,224,191,169,86,4,226,216,10,111,245,230,152,76,172,185,27,11,160,222,92,46,247,168,22,22,100,20,249,246,109,83,250,13,42,241,136,29,147,113,86,35,33,249,99,78,162,184,31,58,196,139,45,10,186,32,225,204,137,34,248,101,148,31,151,123,9,102,100,221,145,79,194,24,96,200,245,109,203,29,196,126,104,221,144,163,136,196,221,152,204,12,157,68,193,220,65,155,137,244,202,63,7,253,243,163,40,134,29,221,56,147,7,35,49,165,114,185,41,17,14,97,125,63,148,104,59,160,109,180,38,88,113,140,166,167,172,117,83,184,86,74,188,233,76,140,100,234,190,233,205,93,183,252,152,210,66,166,2,43,140,72,138,85,110,50,25,166,75,126,117,198,223,128,73,6,254,250,45,203,175,21,198,32,130,159,140,177,111,207,103,32,185,242,145,53,30,27,250,63,244,242,145,63,153,192,1,249,201,208,159,133,254,2,190,167,241,204,53,116,189,220,228,170,56,178,93,31,214,6,3,103,84,100,210,112,2,7,160,133,121,212,1,59,9,97,133,21,234,163,212,19,92,88,35,36,51,255,142,176,131,165,227,137,57,188,9,9,241,244,114,14,21,248,84,240,66,50,46,192,98,76,35,23,90,85,59,247,53,206,1,101,242,249,179,183,111,94,190,110,22,204,74,183,174,64,61,227,209,118,29,251,182,193,37,87,89,42,155,158,90,222,216,37,191,58,145,51,114,92,39,126,104,3,224,6,4,244,8,122,220,207,10,224,249,243,125,33,243,163,169,51,30,19,175,252,152,40,132,30,128,212,94,185,146,18,116,216,121,231,14,126,244,156,40,38,30,92,53,250,93,178,166,141,107,234,149,98,94,42,40,117,52,172,133,227,141,253,197,17,53,72,186,202,81,224,135,241,190,169,235,223,191,23,143,188,173,173,26,121,245,234,101,162,95,188,91,191,144,209,0,126,147,216,208,23,81,163,90,213,15,178,19,167,126,20,123,214,140,28,232,141,252,32,165,122,160,87,23,32,242,230,146,0,191,59,19,231,52,246,132,193,250,158,31,16,207,20,146,53,200,93,76,175,109,47,242,93,2,243,111,128,36,195,212,40,222,22,54,183,202,54,99,114,15,252,37,186,78,207,76,106,255,113,56,39,205,101,51,101,13,79,211,54,188,33,34,144,204,158,49,133,26,161,176,53,212,40,160,136,2,243,135,212,118,208,196,54,81,160,232,227,204,101,4,3,71,99,188,139,232,40,49,19,187,29,249,227,7,132,217,240,69,66,48,54,225,27,41,250,81,252,16,16,238,29,213,60,161,81,112,7,81,80,108,141,34,207,186,43,2,3,163,112,52,98,121,8,108,30,151,201,186,118,184,82,179,206,190,16,15,236,8,225,148,116,232,187,209,209,196,15,59,22,48,79,92,66,183,103,158,224,93,15,158,236,158,137,238,145,162,55,50,174,131,35,151,43,203,166,36,102,35,153,5,58,72,89,141,253,216,114,197,122,39,134,186,188,75,188,155,120,122,88,47,39,135,15,156,151,7,119,247,220,241,111,225,88,173,68,135,141,140,66,98,221,54,133,168,211,108,170,241,255,221,33,147,59,189,238,224,72,147,251,131,157,118,188,205,252,188,12,88,246,217,200,222,37,33,113,125,107,12,39,67,197,198,60,179,145,24,118,236,196,46,97,86,227,90,35,226,162,25,206,44,199,251,76,44,176,33,97,133,41,66,150,30,102,135,13,241,197,82,181,228,51,205,197,18,16,75,133,146,79,204,41,164,65,158,11,52,132,148,209,61,184,164,12,215,215,208,255,60,60,235,25,236,124,170,76,176,92,54,55,233,49,59,139,110,110,20,123,250,1,162,65,140,131,142,49,246,231,246,20,101,223,72,239,140,242,35,57,10,66,66,213,126,202,98,60,42,202,121,28,211,235,14,28,169,193,73,84,232,109,8,74,169,32,21,208,233,46,52,184,111,91,50,175,172,238,77,228,212,155,119,199,110,36,112,170,130,44,67,183,92,100,48,67,150,150,9,18,185,211,223,91,9,47,152,236,44,187,192,26,179,77,95,93,84,118,149,93,17,13,89,118,200,162,251,116,22,105,2,249,116,38,21,42,57,54,195,167,179,137,169,237,211,249,84,201,228,24,29,61,157,81,154,157,63,157,79,133,74,142,77,251,233,108,178,226,192,211,25,205,208,89,123,186,177,10,182,249,240,133,52,6,30,160,95,55,246,115,113,64,142,236,176,245,33,79,83,13,60,172,32,64,15,116,236,58,39,199,150,230,123,51,160,68,230,129,89,2,28,182,143,68,162,7,122,185,164,77,67,50,49,75,148,130,4,47,157,240,15,188,102,14,244,227,170,117,114,92,5,146,133,17,77,178,230,216,185,211,156,49,46,165,16,59,174,194,8,157,75,231,153,64,224,72,37,0,95,35,50,110,179,111,3,242,95,63,104,80,53,45,203,24,183,25,186,21,56,108,101,11,176,39,142,11,193,154,145,168,141,166,41,152,98,254,100,196,83,39,2,126,226,24,82,16,186,49,189,108,154,38,68,194,116,223,135,177,127,200,238,82,72,231,209,152,116,132,235,21,217,0,104,60,1,236,152,65,232,207,2,8,153,135,214,72,139,125,141,77,164,191,12,15,171,41,26,164,111,96,147,239,89,28,183,79,247,115,196,144,96,134,1,159,16,19,88,46,9,41,137,169,21,83,154,218,216,39,145,230,249,177,70,238,33,81,210,26,191,255,142,201,64,129,205,21,152,20,171,32,38,234,135,200,22,102,180,89,36,193,216,102,32,42,222,103,17,196,60,118,204,117,160,162,54,217,103,170,52,63,192,164,142,234,141,253,212,15,246,132,238,246,244,146,134,38,96,150,4,148,89,4,29,16,16,182,24,161,216,39,2,134,65,5,0,142,171,140,230,137,158,223,209,89,119,219,237,56,227,162,173,28,232,154,227,5,243,152,169,128,111,43,114,254,132,4,183,252,40,118,137,166,48,115,60,93,117,155,57,94,90,191,253,125,188,80,3,81,248,161,137,133,158,99,210,186,103,241,96,134,85,76,56,179,152,217,237,228,46,160,97,231,226,127,36,92,72,249,131,13,210,197,186,251,230,219,48,41,52,125,229,246,247,205,204,85,176,132,51,104,2,7,112,91,226,192,224,238,198,200,207,173,232,8,75,253,135,106,128,153,86,65,3,15,126,100,158,89,241,244,40,244,231,112,52,104,114,15,20,97,199,180,48,54,116,102,240,171,90,175,213,106,69,156,30,5,243,104,106,60,222,55,226,168,242,208,72,165,1,39,57,83,222,219,133,115,137,111,169,147,209,40,16,216,215,111,127,241,122,162,29,64,213,39,234,210,101,54,158,148,169,177,116,176,217,217,173,45,136,102,174,7,169,73,133,217,182,28,254,165,185,11,55,56,177,52,48,212,95,120,23,161,31,192,197,251,96,148,120,230,55,136,31,92,82,42,51,87,41,19,18,6,12,195,220,130,229,25,197,44,37,129,251,154,184,28,124,78,77,127,95,107,212,127,140,181,232,201,188,177,176,99,5,45,100,77,57,169,123,44,228,184,166,37,78,67,185,11,96,150,132,88,209,193,236,117,169,86,247,191,219,18,79,61,41,45,112,188,18,49,96,108,103,27,80,41,237,194,150,148,2,99,60,68,238,227,191,136,183,12,169,157,204,128,37,227,185,64,224,169,172,229,136,237,194,28,79,234,243,57,123,150,179,60,6,22,49,119,101,94,37,181,11,231,105,106,157,182,228,27,121,52,86,251,160,75,222,88,243,27,242,23,201,62,75,107,151,13,176,123,188,192,152,187,103,29,244,127,225,157,41,57,189,216,239,14,250,3,44,163,25,105,143,133,21,184,98,240,134,13,253,32,188,195,130,121,198,111,136,238,153,40,206,98,233,215,208,175,188,91,207,95,120,26,141,126,104,248,140,49,175,46,38,45,247,146,18,28,140,159,152,162,168,245,252,121,2,60,86,30,96,64,24,18,250,54,137,162,142,103,129,191,25,115,47,147,163,35,207,81,136,41,37,93,22,22,137,186,98,246,46,92,169,170,192,242,136,171,40,74,158,86,160,165,116,130,204,106,150,44,247,161,37,22,60,82,148,175,9,236,91,121,47,183,78,52,245,23,160,35,26,42,230,7,167,112,199,27,89,193,152,166,226,51,32,243,101,91,87,27,94,204,63,28,38,141,96,222,134,62,228,141,95,241,153,118,121,5,36,109,233,10,72,210,192,21,0,214,177,21,95,73,131,150,238,130,136,174,146,202,134,126,32,117,185,121,37,21,190,203,34,72,46,220,66,202,187,96,90,226,86,102,51,225,143,51,182,142,163,149,124,236,173,176,73,154,243,98,178,127,200,93,238,53,126,65,54,75,104,61,91,202,101,121,18,251,181,246,141,199,18,106,86,203,156,56,189,29,25,212,163,119,34,15,137,10,49,89,50,41,53,98,102,192,158,117,67,76,169,22,46,247,12,25,127,172,107,199,115,93,118,54,128,158,41,92,58,135,227,141,150,189,26,34,23,87,134,107,1,254,226,245,192,177,155,63,44,4,53,112,201,74,134,167,201,9,231,108,153,53,156,163,219,95,199,186,183,138,115,105,21,234,132,214,172,193,220,247,186,69,226,109,22,17,181,154,194,37,104,117,101,237,10,214,104,139,53,152,55,95,167,104,238,238,215,42,123,139,133,228,210,56,27,174,56,209,24,60,1,94,110,252,167,74,118,68,97,18,53,122,188,181,12,202,60,40,94,46,169,215,209,107,174,146,95,112,95,92,144,108,8,18,93,222,178,179,34,126,101,140,157,8,79,47,77,209,121,63,80,106,5,178,50,96,99,21,235,129,189,153,247,192,86,152,87,60,242,106,194,147,45,8,79,86,17,166,85,214,213,164,183,144,119,48,90,69,154,22,196,87,147,118,183,32,237,174,34,141,53,236,213,180,195,45,104,135,5,180,151,202,107,6,145,199,113,83,137,32,55,37,104,41,248,203,228,207,92,132,229,200,215,95,106,50,64,192,190,101,22,147,57,32,22,172,114,71,212,91,80,33,34,181,240,5,17,245,149,129,160,228,120,27,105,169,175,85,82,114,72,79,75,183,84,79,179,179,117,108,100,113,192,185,5,233,184,168,164,103,104,215,242,180,87,176,181,129,188,40,176,179,167,87,82,169,60,125,3,224,68,167,78,100,135,36,230,149,91,68,50,87,250,25,233,37,157,61,50,37,127,163,56,61,213,249,192,77,65,55,16,184,150,77,140,234,127,126,63,61,168,222,84,116,244,171,172,124,143,109,9,172,149,53,10,60,152,236,159,41,132,187,174,229,146,23,255,87,186,190,21,19,105,36,170,50,104,91,174,59,178,236,219,1,129,96,122,223,212,169,86,116,102,175,178,120,196,164,148,91,33,136,165,176,55,25,133,201,66,193,217,91,189,110,133,175,218,92,46,197,155,141,164,250,147,202,25,131,161,199,52,2,54,55,134,212,239,117,13,131,103,90,126,206,132,207,7,180,2,221,208,245,38,130,22,192,102,49,57,58,66,9,209,191,136,79,5,179,98,97,169,254,89,42,127,255,158,56,219,130,42,42,239,221,159,212,148,122,234,54,116,223,175,35,155,190,44,97,15,95,64,251,235,95,165,168,141,122,158,92,231,154,204,43,219,195,153,134,213,238,13,127,172,71,22,183,255,89,218,201,182,146,180,136,164,12,5,53,121,32,107,86,179,233,85,97,150,226,133,79,31,182,206,103,94,36,48,168,26,41,130,21,142,181,152,61,219,161,141,136,226,128,28,123,79,211,215,162,153,197,154,18,250,113,21,64,199,211,176,74,187,21,60,180,79,203,148,216,180,192,118,85,166,10,154,190,98,216,101,43,17,123,226,135,36,197,158,104,151,13,86,91,195,96,49,39,152,175,139,172,89,109,231,80,214,196,113,222,170,206,159,237,7,229,228,145,92,192,210,72,246,72,211,97,144,4,23,130,140,189,230,156,171,85,142,220,73,151,135,147,179,190,233,28,240,247,186,199,17,168,0,117,3,222,69,104,69,33,184,151,40,6,101,174,225,191,135,139,208,10,242,173,79,74,236,68,207,190,74,17,75,177,232,22,23,195,18,211,170,229,120,39,150,70,44,128,41,133,196,108,74,69,67,111,74,219,108,186,220,181,45,194,100,142,177,116,162,182,228,128,83,134,44,241,154,92,0,130,91,182,91,202,108,180,89,52,188,233,41,222,49,137,210,118,93,127,159,56,105,80,10,156,152,21,69,12,248,227,128,151,64,229,210,143,67,17,106,105,124,158,206,79,0,61,73,124,77,199,227,48,244,81,88,43,50,75,184,218,200,191,47,49,206,5,227,190,215,166,114,17,140,210,119,167,76,66,24,177,97,131,114,3,231,186,56,98,199,85,148,140,36,186,220,85,41,68,8,217,130,96,150,63,228,130,75,102,238,50,174,149,174,59,211,181,252,186,69,83,149,77,57,212,37,101,23,162,114,109,227,214,233,67,29,214,82,127,254,236,221,155,215,181,102,218,152,223,180,58,123,14,178,45,3,25,108,133,135,112,103,30,240,233,204,182,44,168,200,10,7,238,206,28,224,99,147,109,57,80,145,21,14,70,107,57,168,50,115,80,170,109,204,162,222,235,192,90,106,61,19,39,156,149,86,176,202,159,155,108,201,43,199,46,230,214,22,220,246,127,161,140,138,211,119,92,5,91,150,111,11,22,4,8,67,151,78,165,28,77,167,199,106,139,3,207,103,168,199,157,29,109,245,18,98,7,29,215,41,105,51,7,4,81,131,191,214,189,89,170,215,106,210,35,4,249,194,67,105,168,126,162,136,97,30,254,195,41,69,183,80,136,129,20,11,110,84,188,251,133,23,206,68,71,66,78,108,59,220,123,97,224,209,24,65,182,112,219,204,93,173,58,110,26,203,80,252,113,5,219,54,75,128,86,238,18,238,127,140,198,5,34,207,83,152,232,64,199,85,137,55,41,84,219,149,63,86,194,202,190,254,88,197,146,84,15,43,100,136,7,138,137,103,198,162,210,15,112,35,170,80,156,159,116,97,165,126,85,184,52,11,74,197,202,19,231,102,30,18,164,201,219,221,252,113,18,12,216,22,127,165,146,137,195,164,33,252,0,2,50,125,12,115,57,253,47,221,94,79,251,208,209,90,26,130,181,117,98,71,30,88,67,231,239,178,3,22,116,115,222,240,67,171,210,255,110,2,231,110,22,48,41,147,177,54,1,71,249,176,47,159,116,139,54,244,73,232,207,104,145,156,113,138,160,132,211,19,25,123,4,57,96,34,71,230,72,3,144,113,17,45,127,30,211,231,36,9,114,128,162,92,245,31,173,212,50,122,54,222,92,29,6,102,50,158,76,203,94,52,64,8,35,91,208,162,150,43,21,37,81,7,44,241,82,133,132,199,74,21,73,161,48,169,85,240,60,58,219,248,22,181,149,31,33,201,171,43,197,47,11,183,233,250,103,9,238,43,123,207,228,20,74,198,183,161,245,254,67,132,115,185,227,54,13,244,31,90,65,73,69,55,119,192,127,136,182,146,80,111,104,96,255,16,97,57,186,108,103,59,203,133,157,230,66,227,85,114,79,94,200,94,101,195,169,113,22,205,42,180,81,97,125,203,229,127,1,176,148,116,252,47,63,0,0 };