1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-02 15:03:27 +00:00
ESPUI/src/dataControlsJS.h
2023-11-27 13:00:29 +01:00

133 lines
37 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 UI_FRAGMENT=21;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 Object();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 Object();controlAssemblyArray=new Object();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+"/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 Object();controlAssemblyArray=new Object();};websock.onclose=function(evt){console.log("websock close");conStatusError();FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=new Object();controlAssemblyArray=new Object();};websock.onerror=function(evt){console.log("websock Error");restart();FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=new Object();controlAssemblyArray=new Object();};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();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){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 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 date=new Date();date.setMinutes(date.getMinutes()-date.getTimezoneOffset());var rv=date.toISOString();websock.send("time:"+rv+":"+data.id);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){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 StartFragmentAssemblyTimer(Id)
{StopFragmentAssemblyTimer(Id);FragmentAssemblyTimer[Id]=setInterval(function(_Id)
{if("undefined"!==typeof controlAssemblyArray[_Id])
{if(null!==controlAssemblyArray[_Id])
{let TotalRequest=JSON.stringify({'id':controlAssemblyArray[_Id].control.id,'offset':controlAssemblyArray[_Id].offset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");}}},1000,Id);}
function StopFragmentAssemblyTimer(Id)
{if("undefined"!==typeof FragmentAssemblyTimer[Id])
{if(FragmentAssemblyTimer[Id])
{clearInterval(FragmentAssemblyTimer[Id]);}}}
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")){return;}
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+"' ":"";var inputType=data.hasOwnProperty('inputType')?" type='"+data.inputType+"' ":"";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; "+data.elementStyle+"' id='num"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input "+inputType+"style='color:black; "+data.elementStyle+"' id='text"+id+
"' value='"+data.value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black; "+data.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[4872] PROGMEM = { 31,139,8,0,172,132,100,101,2,255,213,60,107,119,218,72,178,223,253,43,100,101,78,16,215,24,67,50,201,102,192,114,14,193,36,97,215,175,107,227,205,156,205,228,250,8,212,216,90,11,73,43,9,59,94,134,255,126,171,171,31,234,214,3,176,61,185,59,247,203,4,85,87,87,215,171,187,171,170,203,51,9,131,36,53,46,135,87,195,147,225,104,216,59,186,250,116,57,180,95,181,90,221,137,24,56,31,28,157,246,14,1,214,22,176,179,195,222,104,112,117,250,241,227,197,96,100,183,85,220,193,175,163,193,201,33,163,209,86,224,163,225,104,112,100,43,128,51,160,152,163,135,160,108,145,225,85,159,66,94,233,72,125,134,245,42,195,250,112,57,26,157,158,216,175,117,60,14,109,183,94,103,152,71,189,15,192,196,207,58,34,3,182,91,63,103,120,23,95,134,163,254,231,193,185,253,70,71,149,240,118,235,141,130,125,52,60,4,216,219,28,46,131,182,91,111,51,204,147,203,227,15,0,251,139,142,201,161,237,214,95,20,117,129,30,193,32,103,151,35,251,157,142,173,140,180,91,239,178,25,159,206,123,103,159,237,95,56,160,119,120,200,32,87,103,167,195,19,138,202,7,250,71,131,222,57,71,110,183,126,81,86,236,125,176,219,57,131,48,152,98,144,139,193,209,160,15,212,114,54,17,224,182,98,149,211,179,209,144,234,63,103,22,1,110,43,102,57,30,2,32,103,21,132,181,21,155,28,247,126,181,219,57,123,32,172,173,154,98,52,56,179,219,121,75,32,176,173,216,225,83,239,242,211,192,110,231,236,192,161,109,197,12,189,126,159,250,70,206,4,28,218,126,167,42,230,172,119,222,27,157,130,25,127,201,235,70,142,180,85,117,15,143,7,176,163,114,250,166,192,246,43,101,151,124,60,239,125,58,30,128,1,95,101,166,145,187,232,240,244,203,137,220,67,71,131,143,35,185,87,206,135,159,62,143,228,142,232,3,1,112,48,161,204,254,213,232,242,252,191,47,79,135,23,3,73,170,127,53,56,30,156,247,142,178,61,217,191,58,27,192,172,243,225,223,97,234,43,9,252,50,24,245,46,206,62,247,142,20,242,87,23,151,39,31,143,78,191,104,107,244,123,231,231,167,35,185,131,250,87,189,163,225,63,122,231,96,214,183,18,116,216,59,255,155,220,13,253,171,147,211,19,208,201,155,55,221,59,39,54,0,152,198,161,223,75,18,50,27,251,15,189,56,118,30,236,128,220,27,167,227,127,146,73,106,213,17,235,99,236,92,207,72,144,10,180,145,55,35,113,17,237,58,118,162,155,67,39,117,112,8,105,241,145,27,39,233,77,38,196,183,167,142,159,16,4,37,190,231,146,184,15,235,123,193,60,156,39,124,104,58,15,38,169,23,6,192,153,31,198,125,223,73,18,11,127,14,221,250,130,255,176,79,230,179,49,137,37,188,155,220,123,233,228,70,193,115,18,162,26,160,19,147,116,30,7,38,252,231,95,243,208,75,136,217,229,40,220,30,2,129,128,92,142,239,202,225,204,56,2,35,34,41,137,99,239,142,196,18,41,51,150,64,186,39,169,147,68,55,142,159,74,36,105,60,129,147,204,131,169,31,222,43,116,152,45,197,248,196,137,227,48,155,47,236,42,134,29,223,251,183,19,123,129,68,160,86,238,240,223,212,196,2,209,117,226,91,179,235,146,169,51,247,83,1,52,187,203,229,22,181,194,61,25,39,225,228,182,171,252,6,147,4,96,83,226,42,198,250,66,198,23,48,68,82,110,249,185,239,103,150,138,201,191,230,36,73,79,99,15,92,196,161,160,51,18,207,188,36,129,95,86,125,177,220,146,152,137,115,71,62,9,39,129,33,63,156,56,254,69,26,130,123,145,102,66,210,97,74,102,150,73,146,104,238,161,47,37,102,227,175,23,167,39,205,36,5,73,175,189,233,131,37,93,172,94,239,42,132,99,88,63,140,21,218,30,120,1,122,25,172,232,162,75,106,107,93,151,174,149,17,239,122,83,75,78,221,70,121,235,139,140,22,50,21,57,113,66,50,172,122,215,39,169,225,49,4,9,253,234,185,223,186,76,233,108,67,52,189,132,109,12,134,89,127,207,254,237,124,253,6,242,48,68,252,169,137,230,196,176,197,22,63,89,110,56,153,211,125,88,111,58,174,107,153,255,101,214,155,225,116,10,123,236,39,203,124,17,135,247,240,125,147,206,124,203,52,235,116,187,95,128,53,230,201,0,252,40,6,28,78,70,165,157,199,89,148,110,244,230,52,140,7,14,236,47,226,19,58,104,31,44,38,62,113,226,97,0,91,225,206,241,5,28,72,215,187,27,28,21,235,207,28,208,126,26,207,137,109,219,121,159,172,47,42,188,148,131,155,19,63,4,171,48,141,72,241,64,47,49,153,133,119,132,157,39,38,30,20,187,215,49,33,129,89,68,5,221,106,120,49,113,75,176,152,162,81,113,198,158,113,18,26,156,35,170,215,151,47,222,189,125,253,166,91,50,43,51,151,6,13,44,80,169,55,185,237,112,107,55,64,147,75,197,80,55,78,224,250,228,239,94,226,141,61,223,75,31,250,0,184,6,49,23,160,169,237,188,70,94,190,220,22,142,210,188,241,92,151,4,245,133,244,34,141,172,240,44,234,185,116,127,80,160,125,239,5,110,120,223,20,223,205,155,48,73,3,103,70,208,191,163,48,78,11,24,20,216,149,75,130,250,6,119,240,227,200,75,82,18,192,49,109,222,73,190,39,200,183,217,40,151,167,129,166,68,243,83,146,219,182,105,254,254,59,251,245,174,37,126,253,252,243,107,233,4,232,53,242,108,178,204,251,164,179,183,103,238,8,198,118,204,189,123,80,111,119,73,128,236,99,231,108,1,23,116,223,131,19,234,167,95,125,145,59,13,233,193,37,182,130,80,45,51,141,112,202,152,56,238,3,181,54,117,233,215,186,53,26,111,90,173,22,93,79,32,135,65,24,145,192,150,148,200,93,74,111,190,32,9,125,2,58,191,6,150,25,166,65,241,54,240,223,42,63,79,201,119,144,95,186,13,96,20,246,22,221,133,221,63,201,161,176,236,102,26,194,93,190,137,138,16,177,236,52,252,19,10,69,40,107,155,8,133,50,128,80,153,27,253,105,164,97,193,30,221,220,120,6,228,164,73,227,7,188,149,221,220,37,10,131,77,23,239,208,229,22,108,67,96,25,103,103,226,163,106,56,80,106,44,33,1,92,130,115,47,188,237,152,59,173,58,191,102,187,44,176,33,182,60,144,198,161,251,192,130,93,66,37,135,83,69,4,140,116,205,102,250,16,17,30,50,234,233,121,167,228,86,165,160,212,25,39,129,115,87,6,166,42,130,69,212,33,56,6,112,153,124,188,11,241,68,62,2,46,197,3,121,16,206,181,159,148,88,149,202,6,225,221,119,166,242,5,69,239,228,226,38,97,234,198,178,171,152,199,146,179,208,7,4,171,105,152,58,190,88,239,192,210,151,247,73,112,157,222,236,182,235,242,20,214,13,81,137,14,130,140,225,32,188,237,10,85,103,69,140,206,127,86,66,166,119,186,149,224,98,35,223,119,158,36,241,38,243,139,58,96,69,159,78,254,70,141,137,31,58,46,236,40,29,27,203,59,29,233,216,169,151,250,132,121,141,239,140,137,143,110,56,115,188,224,51,220,55,144,88,112,47,204,16,242,244,176,40,211,17,95,172,66,34,63,179,18,136,4,177,10,132,252,196,84,94,25,228,41,120,71,104,25,239,125,159,212,225,66,26,133,159,71,199,71,22,219,228,58,19,172,132,84,152,180,200,207,162,194,141,211,192,220,65,52,8,240,49,108,74,195,249,228,6,117,223,201,206,154,250,130,52,163,152,80,179,31,178,196,135,170,114,158,166,244,230,128,48,203,226,36,26,244,126,3,163,52,144,10,216,244,41,52,120,208,178,196,152,45,103,94,81,202,90,47,29,59,145,32,90,18,100,25,186,227,35,131,57,178,180,58,39,245,78,127,111,164,188,104,250,100,221,69,142,203,132,190,60,107,60,85,119,101,52,84,221,33,139,254,243,89,164,37,154,231,51,169,81,41,176,25,63,159,77,44,30,61,159,79,157,76,129,209,241,243,25,165,245,175,231,243,169,81,41,176,57,121,62,155,172,252,246,124,70,115,116,86,238,110,44,62,175,223,124,49,77,110,46,240,94,183,182,11,113,64,129,236,168,247,161,72,83,15,60,156,40,194,27,104,223,247,14,246,29,35,12,102,64,137,204,35,187,6,56,76,14,169,209,29,179,94,51,110,98,50,181,107,148,130,2,175,29,240,15,60,102,118,204,253,61,231,96,127,15,72,150,70,52,114,77,215,187,51,60,23,151,210,136,237,239,193,8,157,75,231,217,64,160,169,19,128,175,49,113,251,236,219,90,248,97,24,117,168,153,150,117,12,254,44,211,137,60,182,178,3,216,83,207,135,96,77,77,168,120,25,229,39,43,189,241,18,224,39,77,33,183,164,130,153,117,72,171,32,183,161,114,239,166,225,46,59,75,77,184,240,169,51,153,8,55,27,170,3,208,120,2,216,177,163,56,156,69,144,4,141,156,177,145,134,6,155,72,127,65,234,71,75,140,6,36,247,224,147,239,89,28,183,77,229,105,50,36,152,97,193,39,196,4,142,79,98,74,226,198,73,41,77,195,13,73,98,4,97,106,144,239,144,1,27,157,223,126,195,116,178,196,231,74,92,138,21,238,165,249,33,60,134,25,125,22,73,48,182,25,136,170,247,69,2,49,207,36,229,54,208,81,187,236,51,51,90,24,97,198,79,237,198,126,154,59,91,194,118,91,102,205,64,23,176,107,2,202,60,130,14,8,8,91,140,80,236,3,1,195,160,2,0,251,123,140,230,129,89,148,232,120,88,41,14,128,127,178,106,47,18,191,86,38,2,143,155,168,235,87,227,48,39,152,121,129,169,95,152,52,227,55,56,125,48,229,250,5,42,145,170,86,40,200,217,251,245,199,203,233,124,95,33,39,205,231,215,175,80,141,37,215,96,232,63,90,163,5,89,10,199,235,104,112,246,195,85,154,164,36,250,193,146,150,44,145,23,21,95,10,215,95,36,178,64,253,149,111,221,111,118,161,242,45,238,81,72,135,33,25,137,113,224,226,238,218,42,206,109,152,8,203,174,94,125,239,230,30,55,59,120,102,38,152,240,3,25,98,213,105,21,157,150,9,172,50,198,154,209,60,185,177,22,223,59,105,210,120,232,100,194,195,153,151,123,5,120,10,163,10,155,202,83,107,167,68,63,95,191,253,193,235,137,247,74,106,45,241,172,85,103,227,242,149,11,203,102,235,195,130,149,239,38,185,131,84,121,69,199,186,132,26,40,103,89,30,247,47,177,52,48,116,122,31,156,197,97,4,87,212,131,85,227,57,242,69,250,224,147,90,157,5,21,42,33,225,175,48,204,29,86,157,81,206,146,76,113,86,100,48,112,59,183,204,247,173,78,251,113,172,37,207,230,141,5,104,21,180,144,53,109,99,110,177,224,236,138,62,21,88,133,89,108,115,91,217,15,101,106,195,108,183,90,166,82,192,254,191,19,146,167,237,148,22,28,68,10,49,90,226,123,170,87,232,148,158,194,150,82,62,192,88,18,174,157,63,136,183,28,169,245,204,85,17,247,130,104,158,142,30,162,213,148,105,125,144,19,150,19,42,220,141,149,71,10,161,217,115,5,46,16,123,138,61,120,153,165,88,69,201,115,86,196,192,135,130,167,50,175,147,122,10,231,89,177,35,235,77,234,20,209,88,53,138,46,121,237,204,175,201,31,164,251,60,173,167,8,192,238,139,146,45,50,60,30,116,120,61,156,40,23,107,151,126,211,247,240,99,72,17,83,146,88,248,125,157,125,215,119,5,132,222,191,255,14,3,114,58,157,2,190,85,103,237,22,241,157,141,8,105,56,188,56,189,192,18,169,149,175,155,167,48,179,99,238,196,119,59,102,167,242,166,19,141,49,29,250,246,39,158,8,142,72,192,139,142,24,3,117,197,24,170,129,49,194,198,67,252,141,227,39,224,66,98,62,71,201,77,217,81,200,227,148,17,173,209,218,89,185,22,129,61,236,189,112,109,75,193,222,201,81,170,119,85,110,63,122,1,144,97,196,108,155,207,199,108,174,212,7,120,213,22,204,191,149,123,125,48,85,125,28,211,107,58,184,22,253,51,70,76,38,97,236,54,140,228,214,139,34,101,192,20,26,93,110,81,166,56,212,86,11,196,221,139,52,140,74,159,95,180,58,50,90,7,216,110,129,20,121,129,145,213,194,219,204,215,108,230,55,92,177,187,14,139,91,204,46,90,11,152,116,226,180,156,75,149,65,105,184,115,22,220,216,185,42,253,162,230,185,181,78,54,163,81,99,75,214,58,197,53,151,197,167,158,41,71,96,79,62,224,185,144,158,170,203,81,95,206,52,14,218,50,231,16,235,77,189,128,184,38,232,141,30,229,225,212,88,167,134,162,233,133,185,167,94,12,41,189,224,194,152,134,178,131,138,114,162,42,226,135,235,171,245,71,168,39,231,72,219,182,189,161,139,20,85,244,37,14,65,65,1,88,81,234,167,105,12,190,71,88,52,80,180,179,142,242,142,105,124,10,83,58,161,176,173,127,184,78,215,178,200,78,188,77,69,121,182,133,214,174,35,126,179,114,141,173,125,62,103,183,103,13,56,218,49,10,86,223,224,37,110,83,174,87,60,213,173,61,206,176,3,109,185,69,83,245,173,197,255,167,179,73,196,7,162,33,47,127,199,4,183,65,120,31,24,244,164,162,197,71,172,24,234,123,86,62,90,31,216,226,73,240,229,75,9,220,215,186,198,235,139,40,14,39,36,73,6,129,3,57,168,107,137,87,246,28,29,117,142,70,76,123,16,103,5,72,241,42,75,163,35,207,85,66,135,170,176,42,114,2,226,107,65,149,58,173,36,162,202,38,172,138,222,121,94,77,105,114,148,175,18,6,71,120,97,157,228,38,188,135,40,8,93,166,48,120,3,121,159,149,87,140,109,107,121,100,125,193,69,215,155,201,88,206,184,43,123,75,121,103,235,46,239,37,21,159,89,227,168,128,100,93,162,2,34,123,66,5,128,53,129,138,47,217,243,73,165,32,162,217,74,103,131,158,179,178,113,150,199,15,240,93,23,93,80,165,34,100,188,11,166,21,110,85,54,37,127,156,177,85,28,85,242,177,85,225,147,244,197,0,159,74,118,121,26,126,133,95,102,189,73,104,55,128,242,18,192,159,0,190,182,190,241,250,130,254,38,192,18,123,154,201,48,40,189,148,44,94,38,41,197,100,165,120,165,21,103,6,236,193,229,99,43,199,147,218,55,185,226,192,25,186,117,122,32,85,69,116,180,91,185,116,228,235,16,78,181,210,78,178,43,36,169,199,50,219,171,99,25,152,242,141,205,161,231,100,213,173,206,177,30,117,44,22,41,52,55,190,72,17,251,153,55,227,114,185,108,180,91,173,86,99,232,214,117,139,172,208,120,181,246,42,77,193,230,172,26,214,91,169,170,49,41,203,74,199,37,122,54,107,131,228,111,76,236,84,5,34,182,40,7,113,56,230,173,121,69,37,62,250,44,232,8,254,197,212,141,99,119,31,189,125,244,50,88,126,79,241,231,41,201,57,91,102,5,231,88,50,90,197,122,80,197,185,178,10,45,53,172,88,131,21,104,86,45,146,110,178,136,120,35,45,93,130,190,106,174,92,193,25,111,176,6,171,217,172,50,52,47,234,172,52,246,6,11,169,45,41,108,184,225,37,46,196,16,120,45,242,159,58,217,49,133,41,212,240,193,35,135,50,143,202,151,147,239,228,116,7,53,138,11,138,155,149,141,64,48,207,59,229,156,132,223,53,174,151,224,177,15,167,238,66,118,236,241,126,60,165,21,143,61,195,119,170,68,136,38,235,101,136,38,154,16,90,253,165,154,240,116,3,194,211,42,194,180,203,161,154,244,6,122,143,198,85,164,105,67,74,53,105,127,3,210,126,21,105,236,33,169,166,29,111,64,59,46,161,173,157,123,226,113,128,123,76,66,155,161,209,97,18,214,22,205,254,196,130,150,101,242,167,96,230,58,64,96,114,203,60,39,183,79,28,88,229,142,232,135,161,70,68,233,137,22,68,244,182,112,65,9,210,156,117,180,244,63,37,200,200,201,135,67,46,82,59,43,240,175,98,35,143,3,209,81,148,141,139,70,150,28,237,86,145,118,5,91,107,200,139,254,22,214,53,171,116,170,100,173,187,94,114,232,37,19,216,171,188,113,2,145,236,202,235,70,249,235,174,201,216,86,174,29,237,238,211,239,32,56,49,168,0,145,239,76,136,181,247,63,191,29,238,236,93,55,76,12,204,88,247,12,118,5,97,249,189,83,114,145,169,1,30,133,240,27,108,185,228,189,55,149,55,96,197,196,46,30,100,42,131,19,199,247,199,206,228,246,130,64,54,182,109,155,212,42,38,243,87,85,61,98,82,198,173,80,196,82,248,155,138,194,116,161,225,108,85,175,219,224,171,118,151,75,209,106,45,159,20,51,61,99,52,189,200,82,40,123,109,78,246,222,52,48,251,162,221,31,185,252,107,135,54,128,116,76,179,139,160,123,96,179,156,28,29,161,132,232,191,136,95,89,95,213,94,200,107,245,223,127,151,119,110,245,43,251,65,75,107,125,217,132,238,251,85,100,179,198,110,214,175,14,214,95,221,20,174,247,201,242,151,148,66,143,103,101,119,102,174,95,236,233,253,182,248,200,93,222,125,203,222,24,152,40,178,67,75,73,113,209,146,59,170,101,141,9,61,42,236,90,122,31,210,63,182,156,207,130,68,96,80,51,82,4,39,118,141,148,117,205,211,62,160,242,140,14,91,191,110,222,136,94,50,214,19,100,238,239,1,104,255,38,222,163,205,66,60,55,204,222,190,177,103,8,187,197,114,15,14,89,19,241,83,68,73,216,223,95,33,73,33,19,109,114,131,213,86,48,88,206,9,62,206,136,178,139,222,77,69,89,19,219,57,215,146,37,217,92,217,142,85,208,135,60,128,149,145,252,150,166,195,160,9,174,4,21,123,197,62,215,159,180,10,59,93,29,150,123,29,23,18,47,157,246,186,151,83,160,137,181,18,65,82,14,73,122,235,246,21,255,155,212,253,4,76,138,182,134,219,74,88,89,99,112,75,26,26,109,104,224,127,119,239,99,39,42,118,50,82,98,7,102,190,201,92,44,197,130,102,92,12,223,39,171,150,227,141,149,52,0,2,76,37,210,102,83,26,6,222,206,180,107,206,84,155,48,203,48,217,69,91,59,208,59,236,128,83,134,172,240,42,15,20,193,45,147,150,50,155,172,87,13,239,97,20,127,150,32,250,47,218,230,123,121,233,131,81,96,7,86,84,213,224,31,15,110,29,52,44,253,216,21,161,155,193,231,153,124,71,209,157,201,215,244,2,14,67,227,115,127,192,213,198,225,247,26,227,92,48,30,6,125,170,23,193,40,253,251,64,166,33,140,0,177,223,112,13,231,166,216,178,251,123,168,25,69,117,133,163,87,168,16,178,16,193,172,120,225,59,216,159,251,140,107,173,137,150,217,90,109,86,55,116,99,83,14,77,197,216,165,168,220,218,40,58,237,187,103,29,178,47,95,252,242,246,77,171,155,245,217,174,91,157,117,119,111,202,64,14,91,227,33,126,50,15,216,9,191,41,11,58,178,198,129,255,100,14,176,119,124,83,14,116,100,141,131,241,74,14,246,152,59,104,229,95,230,81,239,77,96,45,243,158,169,23,207,106,21,172,242,238,241,13,121,229,216,229,220,78,4,183,167,127,163,140,138,221,183,191,7,190,172,158,22,44,168,16,142,174,236,74,53,58,207,182,213,6,27,158,207,208,183,59,219,218,250,33,196,54,58,174,83,51,102,30,40,162,5,255,58,223,237,90,187,213,82,122,138,213,3,15,181,161,223,59,101,12,243,116,2,118,41,94,11,165,24,72,177,228,68,197,179,95,220,234,185,104,75,232,137,137,195,111,67,12,100,58,99,200,62,110,187,70,197,213,72,37,199,18,23,111,152,102,178,179,172,170,82,84,184,4,48,196,23,136,60,249,97,250,3,67,239,41,12,42,241,159,206,36,96,103,119,234,35,57,102,5,179,124,143,119,21,147,74,245,173,148,69,30,143,202,11,27,75,88,143,85,162,40,124,113,166,178,213,181,146,89,233,250,44,0,22,203,79,189,235,121,76,144,38,239,215,228,127,135,0,3,19,135,55,164,231,98,62,101,8,63,128,128,74,31,67,106,78,255,203,240,232,200,248,48,48,122,6,130,141,106,151,97,114,241,78,161,31,229,30,44,192,231,188,225,135,177,71,255,191,3,176,39,103,17,83,51,113,141,41,92,162,15,219,234,41,224,208,142,84,18,135,51,250,162,195,56,69,144,228,244,64,197,30,67,190,41,245,200,46,217,8,116,92,70,43,156,167,160,143,12,57,66,85,86,253,143,70,244,55,159,124,108,91,29,34,230,178,171,92,207,169,120,173,35,140,108,73,71,165,90,21,169,137,218,99,141,151,69,212,230,78,44,139,200,226,164,172,139,240,156,61,223,167,41,234,56,143,33,201,43,57,229,127,68,180,73,219,106,158,224,182,38,123,46,127,209,178,203,53,157,162,143,34,92,200,83,55,233,247,124,212,10,90,218,187,190,181,242,81,180,181,228,125,77,103,228,163,8,171,145,103,63,223,178,88,218,194,88,234,188,90,158,203,139,231,85,62,156,57,103,217,172,82,31,21,222,183,92,254,47,95,220,26,123,145,78,0,0 };