1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-28 07:54:12 +00:00
ESPUI/src/dataControlsJS.h
2022-01-13 17:26:00 +00:00

94 lines
28 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 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_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()){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);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;default:console.error("Unknown type or event");break;}
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.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));}}
$(".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);}
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){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+"' ":"";elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";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.type,data.id,data.value,elementStyle)+
"</div>";break;case UI_SEPARATOR:html="<div id='id"+data.id+"' "+panelStyle+" class='sectionbreak columns'>"+
"<h5>"+data.label+"</h5><hr/></div>";break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data.type,data.id,data.value,elementStyle));}}
var elementHTML=function(type,id,value,elementStyle){switch(type){case UI_LABEL:return"<span id='l"+id+"' "+elementStyle+
" class='label label-wrap'>"+value+"</span>";case UI_BUTTON:return"<button id='btn"+id+"' "+elementStyle+
" onmousedown='buttonclick("+id+", true)'"+
" onmouseup='buttonclick("+id+", false)'>"+
value+"</button>";case UI_SWITCHER:return"<label id='sl"+id+"' "+elementStyle+
" class='switch "+(value=="1"?"checked":"")+"'>"+
"<div class='in'>"+
"<input type='checkbox' id='s"+id+"' onClick='switcher("+id+",null)' "+
(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>"+
(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'>"+
"<input id='sl"+id+"' type='range' min='0' max='100' value='"+value+"' "+
elementStyle+" class='range-slider__range'><span class='range-slider__value'>"+
value+"</span></div>";case UI_NUMBER:return"<input style='color:black;' "+elementStyle+" id='num"+id+
"' type='number' value='"+value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input style='color:black;' "+elementStyle+" id='text"+id+
"' value='"+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>"+label+"</figcaption></figure>";case UI_GAUGE:return"WILL BE A GAUGE <input style='color:black;' id='gauge"+id+
"' type='number' value='"+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"";}}
)=====";
const uint8_t JS_CONTROLS_GZIP[3827] PROGMEM = { 31,139,8,0,188,95,224,97,2,255,197,27,107,115,218,72,242,187,127,133,172,108,5,113,96,30,121,109,22,44,167,8,38,9,183,196,246,217,120,179,117,217,156,75,136,193,168,44,36,173,36,140,189,14,255,253,122,122,30,154,17,2,179,120,111,239,75,140,122,122,186,123,186,123,102,250,49,113,195,32,73,141,203,254,85,255,164,63,236,119,6,87,31,47,251,246,139,70,163,237,138,129,243,222,224,180,115,12,176,166,128,157,29,119,134,189,171,211,15,31,46,122,67,187,169,226,246,126,29,246,78,142,25,141,166,2,31,246,135,189,129,173,0,206,128,98,142,30,130,50,38,253,171,46,133,188,208,145,186,12,235,69,134,245,254,114,56,60,61,177,95,234,120,28,218,108,188,204,48,7,157,247,32,196,43,29,145,1,155,141,87,25,222,197,151,254,176,251,169,119,110,191,214,81,37,188,217,120,173,96,15,250,199,0,123,147,195,101,208,102,227,77,134,121,114,249,249,61,192,126,212,49,57,180,217,248,81,81,23,232,17,12,114,118,57,180,223,234,216,202,72,179,241,54,155,241,241,188,115,246,201,254,137,3,58,199,199,12,114,117,118,218,63,161,168,124,160,59,232,117,206,57,114,179,241,147,194,177,243,222,110,230,12,194,96,138,65,46,122,131,94,23,168,229,108,34,192,77,197,42,167,103,195,62,213,127,206,44,2,220,84,204,242,185,15,128,156,85,16,214,84,108,242,185,243,171,221,204,217,3,97,77,213,20,195,222,153,221,204,91,2,129,77,197,14,31,59,151,31,123,118,51,103,7,14,109,42,102,232,116,187,212,55,114,38,224,208,230,91,85,49,103,157,243,206,240,20,204,248,83,94,55,114,68,25,146,59,225,248,244,203,137,220,7,131,222,135,161,244,247,243,254,199,79,67,233,213,221,222,201,16,156,68,40,164,123,53,188,60,255,215,229,105,255,162,39,73,117,175,122,159,123,231,157,65,182,175,186,87,103,61,152,117,222,255,5,166,190,144,192,47,189,97,231,226,236,83,103,160,144,191,186,184,60,249,48,56,253,162,241,232,118,206,207,79,135,114,23,116,175,58,131,254,191,59,231,96,154,55,18,116,220,57,255,89,122,116,247,234,228,244,164,103,191,120,253,186,125,235,196,198,117,236,68,211,99,39,117,236,128,44,140,78,28,59,247,86,25,71,166,78,210,113,93,226,219,19,199,79,8,130,18,223,27,147,184,27,6,169,23,204,195,121,194,135,38,243,192,77,189,48,48,220,208,15,227,174,239,36,137,133,63,251,227,242,3,255,97,159,204,103,35,18,75,120,59,89,120,169,59,85,240,156,132,168,58,107,197,36,157,199,129,9,255,252,62,15,189,132,152,109,142,194,85,40,16,200,140,196,142,63,150,195,153,62,5,70,68,82,18,199,222,45,137,37,82,166,95,129,180,32,169,147,68,83,199,79,37,146,212,183,192,73,230,193,196,15,23,10,29,166,126,49,238,58,113,28,102,243,133,41,196,176,227,123,127,56,177,23,72,4,106,9,49,56,118,226,27,179,61,38,19,103,238,167,2,104,182,151,203,61,170,249,5,25,37,161,123,211,86,126,131,25,2,226,166,100,156,183,66,76,126,159,147,36,61,141,61,18,164,14,5,157,145,120,230,37,9,252,178,202,15,203,61,137,153,56,183,228,163,112,0,24,242,67,215,241,47,210,48,118,174,73,45,33,105,63,37,51,203,36,73,52,247,208,79,18,179,250,207,139,211,147,90,146,194,42,174,189,201,189,37,221,167,92,110,43,132,99,224,31,198,10,109,15,44,140,30,4,28,199,232,110,26,175,235,66,94,25,241,182,55,177,228,212,125,59,152,251,126,249,33,163,133,66,69,78,156,144,12,171,220,102,58,204,88,126,245,198,223,64,72,6,254,250,45,47,175,19,167,160,130,31,172,113,232,206,103,160,185,114,205,25,143,45,243,31,102,185,22,78,38,176,41,126,176,204,103,113,184,128,239,105,58,243,45,211,44,183,185,41,106,174,31,2,111,112,106,70,69,37,13,187,238,2,172,48,79,122,224,27,49,112,88,99,62,74,93,226,2,143,152,204,194,91,194,54,147,137,187,228,224,58,38,36,48,203,43,168,32,167,134,23,147,113,1,22,19,26,165,48,234,198,73,104,112,9,168,144,207,159,189,125,243,242,117,187,96,86,182,116,13,26,88,15,174,239,185,55,45,174,185,234,82,91,244,212,9,198,62,249,197,75,188,145,231,123,233,125,23,0,215,160,160,7,176,227,126,94,1,207,159,239,11,157,215,166,222,120,76,130,242,131,52,8,221,0,153,191,114,35,73,116,88,121,239,22,126,12,188,36,37,1,28,47,230,173,228,233,34,79,179,90,44,75,21,181,142,142,181,240,130,113,184,168,81,135,164,92,106,81,24,167,251,182,105,126,255,94,60,242,182,177,110,228,213,171,151,210,190,120,158,126,33,163,11,248,77,82,203,92,36,173,122,221,172,228,39,78,195,36,13,156,25,169,152,173,213,65,74,181,98,214,23,160,242,246,146,128,188,59,19,231,52,246,132,195,134,65,24,145,192,22,154,181,200,109,74,143,234,32,9,125,2,243,175,129,36,195,52,40,222,22,62,183,206,55,83,114,7,242,73,91,103,123,38,243,255,52,158,147,246,178,157,137,134,187,105,27,217,16,17,72,230,247,152,70,141,80,216,6,106,20,80,68,129,221,129,212,119,208,197,30,163,64,209,199,185,195,8,6,106,99,60,139,232,40,177,165,223,142,194,241,61,194,92,248,34,49,56,155,184,15,41,122,45,189,143,8,191,17,245,160,191,85,112,6,81,80,234,140,146,192,185,45,2,131,160,176,53,82,117,8,124,30,217,228,175,115,56,82,243,23,124,33,30,248,17,194,41,233,56,244,147,218,36,140,123,14,8,79,124,66,151,103,31,225,89,15,55,217,29,83,221,3,69,111,229,174,14,142,92,174,46,219,138,154,45,57,11,108,144,137,154,134,169,227,11,126,71,150,206,222,39,193,117,58,61,104,150,229,230,131,203,43,128,179,123,238,133,55,176,173,214,162,195,66,70,49,113,110,218,66,213,89,106,212,250,255,174,144,233,157,30,119,176,165,201,93,101,167,21,111,51,127,85,7,44,149,108,229,207,146,152,248,161,51,134,157,161,99,99,210,216,146,142,157,122,169,79,152,215,248,206,136,248,232,134,51,199,11,62,17,7,124,72,120,97,134,144,167,135,169,94,75,124,177,188,75,126,102,137,149,4,177,188,70,126,98,130,160,12,242,192,190,37,180,140,215,131,79,202,112,124,13,195,79,195,207,3,139,237,79,93,8,150,152,174,76,122,200,207,162,139,27,165,129,89,65,52,136,113,240,98,76,195,185,59,69,221,183,178,51,163,252,64,106,81,76,168,217,143,89,140,71,85,57,79,83,122,220,193,69,106,113,18,85,122,26,130,81,170,72,5,108,186,11,13,126,183,45,217,173,172,175,77,36,200,143,175,142,157,72,112,169,10,178,12,221,241,81,192,28,89,154,243,75,189,211,223,91,41,47,154,236,172,187,200,25,179,69,95,158,85,119,213,93,17,13,85,119,40,162,255,116,17,105,210,248,116,33,53,42,43,98,198,79,23,19,211,217,167,203,169,147,89,17,116,244,116,65,105,70,254,116,57,53,42,43,98,186,79,23,147,21,4,158,46,104,142,206,198,221,141,37,173,199,55,95,76,99,224,11,188,215,173,253,149,56,96,133,236,176,243,126,149,166,30,120,56,81,132,55,208,161,239,29,29,58,70,24,204,128,18,153,71,118,9,112,216,58,164,70,43,102,185,100,76,99,50,177,75,148,130,2,47,29,241,15,60,102,42,230,97,221,57,58,172,3,201,194,136,70,242,28,123,183,134,55,70,86,26,177,195,58,140,208,185,116,158,13,4,106,58,1,248,26,145,113,151,125,91,144,255,134,81,139,154,105,89,198,184,205,50,157,200,99,156,29,192,158,120,62,4,107,150,52,27,77,83,48,197,252,193,74,167,94,2,242,164,41,164,32,116,97,102,217,182,109,136,132,233,186,15,210,240,128,157,165,144,206,163,51,153,8,55,171,170,3,208,120,2,196,177,163,56,156,69,16,50,15,157,145,145,134,6,155,72,127,89,1,86,80,12,72,223,192,39,223,177,56,110,159,174,167,198,144,96,134,5,159,16,19,56,62,137,41,137,169,147,82,154,198,56,36,137,17,132,169,65,238,32,81,50,90,191,253,134,201,64,129,207,21,184,20,43,7,74,243,67,100,11,51,186,44,146,96,98,51,16,85,239,179,4,98,30,55,229,54,208,81,219,236,51,51,90,24,97,82,71,237,198,126,154,149,61,97,187,61,179,100,160,11,216,37,1,101,30,65,7,4,132,49,35,20,251,72,192,48,168,0,192,97,157,209,60,50,87,87,244,185,191,237,114,188,113,209,82,42,166,225,5,209,60,101,38,224,203,74,188,63,32,193,45,63,136,85,162,43,204,188,192,212,175,205,21,89,58,191,254,93,178,56,119,143,200,66,171,176,127,147,48,144,174,71,143,72,131,5,240,199,79,50,89,36,250,202,125,231,155,189,82,125,18,7,121,27,36,128,147,14,7,46,110,175,173,213,185,85,19,97,217,217,175,59,79,174,102,223,194,77,155,216,159,157,116,90,139,195,57,184,53,77,204,129,34,172,152,22,181,134,222,12,126,213,155,141,70,163,72,210,90,52,79,166,214,195,93,43,77,170,247,173,76,27,176,11,115,165,185,93,36,87,228,86,90,10,173,2,133,125,253,246,23,243,19,117,121,106,62,81,71,46,179,113,89,86,198,180,255,241,139,106,99,49,51,183,181,149,110,17,102,202,106,232,150,229,29,220,225,4,107,16,232,116,17,156,197,97,4,135,230,189,85,226,89,219,69,122,239,147,82,153,93,115,42,33,225,192,48,204,61,88,157,81,44,146,12,186,55,196,212,112,95,52,204,119,141,86,243,207,137,150,60,89,54,22,50,172,161,133,162,105,59,117,143,133,11,87,180,60,105,105,103,1,204,82,16,171,38,184,189,169,212,217,254,190,37,241,180,145,210,130,75,83,33,6,130,237,236,3,58,165,93,196,82,210,87,140,101,200,93,250,23,201,150,35,181,147,27,176,68,122,229,18,127,170,104,43,196,118,17,142,39,228,171,249,246,83,36,211,41,237,34,86,150,243,102,141,239,214,42,26,43,74,80,150,215,206,252,154,252,69,226,231,105,237,178,0,118,72,51,184,104,61,137,202,38,214,77,45,243,50,184,9,194,69,96,208,154,36,141,61,49,96,52,197,105,191,220,147,245,43,24,63,178,181,103,7,207,159,203,145,67,189,142,201,226,9,81,76,203,31,34,107,213,16,57,1,241,53,37,168,211,10,52,144,77,40,231,68,181,109,237,248,131,4,140,9,163,247,93,216,81,119,32,123,144,188,3,122,192,123,142,226,51,107,48,10,72,214,77,20,16,217,59,20,0,214,44,20,95,178,55,88,110,11,73,178,18,59,199,49,43,74,131,149,23,244,224,187,44,154,3,133,75,200,100,23,66,43,210,170,98,74,249,184,96,155,36,90,43,199,114,143,38,89,152,93,30,240,123,226,10,191,32,125,34,180,128,170,36,79,60,107,250,218,248,198,47,64,61,141,98,55,15,77,190,24,52,160,157,4,126,143,23,98,178,236,69,169,252,207,72,146,56,215,196,86,138,175,106,147,138,201,199,218,68,60,185,98,126,9,244,108,113,15,113,56,238,212,172,223,199,138,173,137,143,156,91,102,5,254,98,3,135,99,171,92,24,104,3,23,188,87,54,177,9,182,224,66,47,128,13,60,216,253,176,137,73,186,13,19,145,200,23,178,160,169,247,70,14,206,104,11,30,236,186,216,100,20,126,159,108,52,204,22,140,212,186,41,27,174,122,201,24,78,58,108,82,242,159,58,217,17,133,41,212,232,166,51,114,40,243,168,152,157,44,230,208,195,167,154,99,200,123,63,74,219,135,149,124,90,235,36,137,220,199,69,137,92,77,22,237,240,95,79,120,178,5,225,201,58,194,180,162,182,158,244,22,234,139,70,235,72,211,226,231,122,210,254,22,164,253,117,164,177,94,185,158,118,188,5,237,184,128,182,214,184,22,97,63,55,124,2,169,12,65,71,195,95,54,127,209,64,11,58,249,131,7,238,64,209,104,157,18,247,134,182,80,243,77,159,196,1,46,183,68,145,32,79,68,233,214,10,34,122,67,89,80,242,130,71,105,233,15,19,50,114,72,207,200,150,212,204,130,249,77,98,228,113,34,184,237,179,113,81,52,205,209,110,172,210,94,35,214,35,228,69,45,149,189,178,81,170,162,89,187,215,75,142,189,196,141,73,202,139,116,136,100,175,189,230,148,135,82,238,200,86,174,59,237,186,209,47,48,136,98,232,2,34,223,113,137,85,255,207,111,199,149,250,117,213,196,27,141,85,106,177,2,141,165,149,214,234,5,170,221,140,20,194,163,201,229,146,215,121,215,221,188,235,38,210,248,75,23,208,117,124,127,228,184,55,23,4,66,191,125,219,164,86,49,153,191,170,234,17,147,50,105,133,34,150,194,223,84,20,166,11,13,103,111,61,223,42,231,218,94,46,69,123,94,22,11,50,61,99,213,224,33,139,251,236,71,3,201,119,166,129,33,35,173,52,230,130,198,10,45,54,182,76,179,173,70,210,246,22,17,250,10,77,117,88,82,69,70,11,88,124,49,73,58,66,73,209,191,136,79,213,189,102,57,74,17,174,84,254,254,93,94,200,5,165,60,222,252,61,106,104,69,189,109,232,190,219,68,54,123,154,192,94,78,128,79,109,126,214,160,119,122,121,134,183,210,165,92,219,95,204,117,60,118,239,24,99,81,172,184,127,204,210,35,182,20,217,99,80,82,14,180,100,69,245,23,195,165,7,144,93,74,23,33,125,13,57,159,5,137,192,160,102,164,8,78,60,54,82,246,238,131,86,178,139,67,105,108,94,76,95,139,110,8,171,106,155,135,117,0,29,78,227,58,45,119,115,151,146,181,50,84,111,117,181,174,84,213,210,64,44,141,99,83,36,87,175,203,122,229,187,172,55,97,15,201,144,164,88,56,237,229,0,183,13,171,208,37,89,238,233,29,2,42,135,56,54,182,42,63,231,91,12,187,105,72,222,6,202,244,236,124,65,18,48,187,96,98,65,24,39,221,156,191,231,60,76,64,121,168,85,184,146,132,62,181,179,97,79,170,20,181,101,224,191,7,139,216,137,168,58,101,87,140,210,57,50,243,15,22,4,23,22,219,34,31,44,114,172,227,196,155,116,52,192,1,76,37,32,102,83,170,6,222,190,180,3,99,170,13,189,34,76,118,145,162,201,165,144,12,79,17,83,238,106,33,40,91,35,149,51,121,92,33,188,21,102,86,44,81,47,109,154,239,228,85,14,7,100,153,245,15,247,152,239,242,89,94,192,97,120,33,97,25,195,46,225,164,81,120,87,98,188,5,235,48,232,210,69,9,86,244,61,33,91,30,134,103,216,120,218,192,91,248,243,97,29,151,165,172,123,229,240,18,235,15,28,41,39,127,155,3,219,126,238,51,129,181,70,42,179,145,250,96,193,208,141,68,133,51,21,35,21,162,114,43,225,170,233,219,11,214,37,125,254,236,167,55,175,27,237,172,215,250,24,119,214,225,223,86,128,28,182,38,67,188,179,12,248,26,98,91,17,116,100,77,2,127,103,9,240,253,192,182,18,232,200,154,4,163,141,18,212,153,59,88,188,104,197,156,233,157,9,82,101,142,51,241,226,89,105,141,148,252,241,192,150,98,114,236,98,65,93,33,232,233,207,84,70,230,246,84,68,112,99,117,151,179,27,89,248,184,178,23,213,128,89,219,149,250,9,192,246,40,34,151,140,153,7,171,105,192,95,231,206,46,53,27,13,165,47,204,15,26,92,141,30,96,21,49,228,17,58,108,48,60,132,11,49,144,162,126,136,225,73,43,46,170,92,148,33,150,200,22,193,35,62,188,192,91,35,136,229,111,218,43,167,153,137,75,197,146,15,239,114,179,197,178,244,164,104,109,112,208,98,152,44,112,120,2,193,116,5,150,169,43,98,41,209,206,174,162,177,74,81,190,3,95,32,141,82,113,42,148,133,135,89,242,226,195,178,205,159,16,68,212,121,184,40,25,99,173,66,84,200,154,133,116,130,243,196,187,158,199,4,105,242,142,37,127,27,2,3,174,195,31,9,84,100,108,162,64,241,3,230,170,164,49,62,228,164,191,244,7,3,227,125,207,232,24,8,54,54,41,27,217,179,138,253,255,192,240,44,80,229,98,225,135,81,167,111,252,97,103,205,34,166,91,50,54,38,112,139,221,239,171,27,210,161,157,88,18,135,51,90,18,102,66,34,72,10,121,164,98,143,32,27,147,218,99,87,93,4,154,45,162,21,206,83,250,14,64,34,71,168,197,130,255,221,242,95,254,182,162,176,219,56,0,0 };