Plugin Directory

Changeset 2107932


Ignore:
Timestamp:
06/18/2019 09:32:28 AM (7 years ago)
Author:
gtanyware
Message:

V2.4.0; sorting and filtering

Location:
easycoder/trunk
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • easycoder/trunk/easycoder-min.js

    r2102119 r2107932  
    33$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var d=$jscomp.global.Symbol.iterator;d||(d=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[d]&&$jscomp.defineProperty(Array.prototype,d,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(d){var h=0;return $jscomp.iteratorPrototype(function(){return h<d.length?{done:!1,value:d[h++]}:{done:!0}})};
    44$jscomp.iteratorPrototype=function(d){$jscomp.initSymbolIterator();d={next:d};d[$jscomp.global.Symbol.iterator]=function(){return this};return d};$jscomp.makeIterator=function(d){$jscomp.initSymbolIterator();var h=d[Symbol.iterator];return h?h.call(d):$jscomp.arrayIterator(d)};$jscomp.owns=function(d,h){return Object.prototype.hasOwnProperty.call(d,h)};
    5 $jscomp.assign="function"==typeof Object.assign?Object.assign:function(d,h){for(var g=1;g<arguments.length;g++){var e=arguments[g];if(e)for(var b in e)$jscomp.owns(e,b)&&(d[b]=e[b])}return d};$jscomp.polyfill=function(d,h,g,e){if(h){g=$jscomp.global;d=d.split(".");for(e=0;e<d.length-1;e++){var b=d[e];b in g||(g[b]={});g=g[b]}d=d[d.length-1];e=g[d];h=h(e);h!=e&&null!=h&&$jscomp.defineProperty(g,d,{configurable:!0,writable:!0,value:h})}};
    6 $jscomp.polyfill("Object.assign",function(d){return d||$jscomp.assign},"es6","es3");$jscomp.iteratorFromArray=function(d,h){$jscomp.initSymbolIterator();d instanceof String&&(d+="");var g=0,e={next:function(){if(g<d.length){var b=g++;return{value:h(b,d[b]),done:!1}}e.next=function(){return{done:!0,value:void 0}};return e.next()}};e[Symbol.iterator]=function(){return e};return e};
     5$jscomp.assign="function"==typeof Object.assign?Object.assign:function(d,h){for(var g=1;g<arguments.length;g++){var f=arguments[g];if(f)for(var b in f)$jscomp.owns(f,b)&&(d[b]=f[b])}return d};$jscomp.polyfill=function(d,h,g,f){if(h){g=$jscomp.global;d=d.split(".");for(f=0;f<d.length-1;f++){var b=d[f];b in g||(g[b]={});g=g[b]}d=d[d.length-1];f=g[d];h=h(f);h!=f&&null!=h&&$jscomp.defineProperty(g,d,{configurable:!0,writable:!0,value:h})}};
     6$jscomp.polyfill("Object.assign",function(d){return d||$jscomp.assign},"es6","es3");$jscomp.iteratorFromArray=function(d,h){$jscomp.initSymbolIterator();d instanceof String&&(d+="");var g=0,f={next:function(){if(g<d.length){var b=g++;return{value:h(b,d[b]),done:!1}}f.next=function(){return{done:!0,value:void 0}};return f.next()}};f[Symbol.iterator]=function(){return f};return f};
    77$jscomp.polyfill("Array.prototype.keys",function(d){return d?d:function(){return $jscomp.iteratorFromArray(this,function(d){return d})}},"es6","es3");$jscomp.checkStringArgs=function(d,h,g){if(null==d)throw new TypeError("The 'this' value for String.prototype."+g+" must not be null or undefined");if(h instanceof RegExp)throw new TypeError("First argument to String.prototype."+g+" must not be a regular expression");return d+""};
    8 $jscomp.polyfill("String.prototype.endsWith",function(d){return d?d:function(d,g){var e=$jscomp.checkStringArgs(this,d,"endsWith");d+="";void 0===g&&(g=e.length);g=Math.max(0,Math.min(g|0,e.length));for(var b=d.length;0<b&&0<g;)if(e[--g]!=d[--b])return!1;return 0>=b}},"es6","es3");$jscomp.polyfill("Object.is",function(d){return d?d:function(d,g){return d===g?0!==d||1/d===1/g:d!==d&&g!==g}},"es6","es3");
    9 $jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,g){var e=this;e instanceof String&&(e=String(e));var b=e.length;g=g||0;for(0>g&&(g=Math.max(g+b,0));g<b;g++){var a=e[g];if(a===d||Object.is(a,d))return!0}return!1}},"es7","es3");$jscomp.polyfill("String.prototype.includes",function(d){return d?d:function(d,g){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,g||0)}},"es6","es3");
    10 $jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var h=Math.floor(Math.abs(d));return 0>d?-h:h}},"es6","es3");$jscomp.polyfill("String.prototype.repeat",function(d){return d?d:function(d){var h=$jscomp.checkStringArgs(this,null,"repeat");if(0>d||1342177279<d)throw new RangeError("Invalid count value");d|=0;for(var e="";d;)if(d&1&&(e+=h),d>>>=1)h+=h;return e}},"es6","es3");
    11 $jscomp.stringPadding=function(d,h){d=void 0!==d?String(d):" ";return 0<h&&d?d.repeat(Math.ceil(h/d.length)).substring(0,h):""};$jscomp.polyfill("String.prototype.padStart",function(d){return d?d:function(d,g){var e=$jscomp.checkStringArgs(this,null,"padStart");return $jscomp.stringPadding(g,d-e.length)+e}},"es8","es3");$jscomp.polyfill("Number.isFinite",function(d){return d?d:function(d){return"number"!==typeof d?!1:!isNaN(d)&&Infinity!==d&&-Infinity!==d}},"es6","es3");
     8$jscomp.polyfill("String.prototype.endsWith",function(d){return d?d:function(d,g){var f=$jscomp.checkStringArgs(this,d,"endsWith");d+="";void 0===g&&(g=f.length);g=Math.max(0,Math.min(g|0,f.length));for(var b=d.length;0<b&&0<g;)if(f[--g]!=d[--b])return!1;return 0>=b}},"es6","es3");$jscomp.polyfill("Object.is",function(d){return d?d:function(d,g){return d===g?0!==d||1/d===1/g:d!==d&&g!==g}},"es6","es3");
     9$jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,g){var f=this;f instanceof String&&(f=String(f));var b=f.length;g=g||0;for(0>g&&(g=Math.max(g+b,0));g<b;g++){var a=f[g];if(a===d||Object.is(a,d))return!0}return!1}},"es7","es3");$jscomp.polyfill("String.prototype.includes",function(d){return d?d:function(d,g){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,g||0)}},"es6","es3");
     10$jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var h=Math.floor(Math.abs(d));return 0>d?-h:h}},"es6","es3");$jscomp.polyfill("String.prototype.repeat",function(d){return d?d:function(d){var h=$jscomp.checkStringArgs(this,null,"repeat");if(0>d||1342177279<d)throw new RangeError("Invalid count value");d|=0;for(var f="";d;)if(d&1&&(f+=h),d>>>=1)h+=h;return f}},"es6","es3");
     11$jscomp.stringPadding=function(d,h){d=void 0!==d?String(d):" ";return 0<h&&d?d.repeat(Math.ceil(h/d.length)).substring(0,h):""};$jscomp.polyfill("String.prototype.padStart",function(d){return d?d:function(d,g){var f=$jscomp.checkStringArgs(this,null,"padStart");return $jscomp.stringPadding(g,d-f.length)+f}},"es8","es3");$jscomp.polyfill("Number.isFinite",function(d){return d?d:function(d){return"number"!==typeof d?!1:!isNaN(d)&&Infinity!==d&&-Infinity!==d}},"es6","es3");
    1212$jscomp.polyfill("Number.isInteger",function(d){return d?d:function(d){return Number.isFinite(d)?d===Math.floor(d):!1}},"es6","es3");
    13 (function(){function d(h,g,e){function b(c,m){if(!g[c]){if(!h[c]){var f="function"==typeof require&&require;if(!m&&f)return f(c,!0);if(a)return a(c,!0);m=Error("Cannot find module '"+c+"'");throw m.code="MODULE_NOT_FOUND",m;}m=g[c]={exports:{}};h[c][0].call(m.exports,function(a){return b(h[c][1][a]||a)},m,m.exports,d,h,g,e)}return g[c].exports}for(var a="function"==typeof require&&require,c=0;c<e.length;c++)b(e[c]);return b}return d})()({1:[function(d,h,g){var e=d("./easycoder/Main");e.version="2.3.1";
    14 e.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");window.onload=function(){console.log(Date.now()-e.timestamp+" ms: Page loaded; reset timer & start EasyCoder");e.timestamp=Date.now();e.scripts={};window.EasyCoder=e;var b=document.getElementById("easycoder-script");if(b){b.style.display="none";try{e.start(b.innerText)}catch(a){e.reportError(a)}}}},{"./easycoder/Main":6}],2:[function(d,h,g){h.exports=function(d,b,a){b=d.value.evaluate(d,b);d=d.value.evaluate(d,a);a=b.content;
    15 var c=d.content;b.numeric&&!d.numeric&&(a=a.toString());!b.numeric&&d.numeric&&(c=c.toString());b.numeric||"undefined"!==typeof a||(a="");d.numeric||"undefined"!==typeof c||(c="");return a>c?1:a<c?-1:0}},{}],3:[function(d,h,g){var e=Object.assign||function(a){for(var c=1;c<arguments.length;c++){var b=arguments[c],d;for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d])}return a},b=this,a={getTokens:function(){return b.tokens},addWarning:function(a){b.warnings.push(a)},warning:function(c){a.addWarning(c)},
     13(function(){function d(h,g,f){function b(c,m){if(!g[c]){if(!h[c]){var e="function"==typeof require&&require;if(!m&&e)return e(c,!0);if(a)return a(c,!0);m=Error("Cannot find module '"+c+"'");throw m.code="MODULE_NOT_FOUND",m;}m=g[c]={exports:{}};h[c][0].call(m.exports,function(a){return b(h[c][1][a]||a)},m,m.exports,d,h,g,f)}return g[c].exports}for(var a="function"==typeof require&&require,c=0;c<f.length;c++)b(f[c]);return b}return d})()({1:[function(d,h,g){var f=d("./easycoder/Main");f.version="2.4.0";
     14f.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");window.onload=function(){console.log(Date.now()-f.timestamp+" ms: Page loaded; reset timer & start EasyCoder");f.timestamp=Date.now();f.scripts={};window.EasyCoder=f;var b=document.getElementById("easycoder-script");if(b){b.style.display="none";try{f.start(b.innerText)}catch(a){f.reportError(a)}}}},{"./easycoder/Main":6}],2:[function(d,h,g){h.exports=function(d,b,a){b=d.value.evaluate(d,b);d=d.value.evaluate(d,a);a=b.content;
     15var c=d.content;a&&b.numeric?d.numeric||(c="undefined"===typeof c?0:parseInt(c)):(c&&d.numeric&&(c=c.toString()),"undefined"===typeof a&&(a=""),"undefined"===typeof c&&(c=""));return a>c?1:a<c?-1:0}},{}],3:[function(d,h,g){var f=Object.assign||function(a){for(var c=1;c<arguments.length;c++){var b=arguments[c],d;for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d])}return a},b=this,a={getTokens:function(){return b.tokens},addWarning:function(a){b.warnings.push(a)},warning:function(c){a.addWarning(c)},
    1616unrecognisedSymbol:function(c){a.addWarning("Unrecognised symbol '"+c+"'")},getWarnings:function(){return b.warnings},getIndex:function(){return b.index},next:function(a){b.index+=void 0===a?1:a},peek:function(){return b.tokens[b.index+1].token},more:function(){return b.index<b.tokens.length},getToken:function(){return b.index>=b.tokens.length?null:b.tokens[b.index]?b.tokens[b.index].token:null},nextToken:function(){a.next();return a.getToken()},tokenIs:function(a){return b.index>=b.tokens.length?
    1717!1:a===b.tokens[b.index].token},nextTokenIs:function(c){a.next();return a.tokenIs(c)},skip:function(c){if(b.index>=b.tokens.length)return null;a.next();a.tokenIs(c)&&a.next()},prev:function(){b.index--},getLino:function(){return b.index>=b.tokens.length?0:b.tokens[b.index].lino},getTarget:function(a){a=void 0===a?b.index:a;return b.tokens[a].token},getTargetPc:function(c){c=void 0===c?b.index:c;return b.symbols[a.getTarget(c)].pc},getCommandAt:function(a){return b.program[a]},isSymbol:function(c){c=
    1818void 0===c?!1:c;if(a.getTarget()in b.symbols)return!0;if(c)throw Error("Unknown symbol: '"+a.getTarget()+"'");return!1},nextIsSymbol:function(c){c=void 0===c?!1:c;a.next();return a.isSymbol(c)},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){var c=b.program[a.getSymbolPc()];c.used=!0;return c},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},getPc:function(){return b.program.length},getValue:function(){return a.value.compile(a)},
    19 getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,f){return a.value.constant(c,void 0===f?!1:f)},addCommand:function(a){b.program.push(e({pc:b.program.length},a))},addSymbol:function(a,f){b.symbols[a]={pc:f}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),f=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c,
    20 goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});a.getCommandAt(f).goto=a.getPc();return!0},compileVariable:function(c,f,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:f,lino:p,isSymbol:!0,used:!1,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d};
    21 "dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.mark();for(var f=$jscomp.makeIterator(Object.keys(a.domain)),b=f.next();!b.done;b=f.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var f=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+
    22 c+"'");b.symbols[c]={pc:f};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var f=b.tokens[b.index].token;if("else"===f)return b.program;a.compileOne();if(-1<c.indexOf(f))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"exit",lino:a.getLino(),next:0});for(var f in b.symbols)c=b.program[b.symbols[f].pc],c.isSymbol&&!c.used&&console.log("Symbol '"+c.name+"' has not been used.");
    23 return b.program}};h.exports=a},{}],4:[function(d,h,g){var e=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],f;for(f in c)Object.prototype.hasOwnProperty.call(c,f)&&(b[f]=c[f])}return b};h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return e({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}],
    24 5:[function(d,h,g){var e=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var f=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:f,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:f,target:b});return!0}a.warning("core "+e.name+": Expected value holder")}else{b=
    25 a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:f,value2:b,target:d}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],f=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];b?(a=a.getValue(b)+a.getValue(f),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!e.numeric&&isNaN(e.content)&&a.nonNumericValueError(c.lino),a=parseInt(e.content)+
    26 parseInt(a.getValue(f)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var f=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getSymbolRecord();b.used=!0;a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:f,symbol:b.name});return!0}}return!1},run:function(a){var c=a[a.pc],f=a.symbols[c.alias].pc,b=a[f],d=a.getSymbolRecord(c.symbol);
    27 a[f]={pc:b.pc,domain:d.domain,keyword:d.keyword,lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var f=a.getSymbolRecord();if(f.isValueHolder)return f=a.getToken(),a.next(),a.addCommand({domain:"core",
    28 keyword:"clear",lino:c,symbol:f}),!0;a.warning("'Variable '"+f.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],f=a.getSymbolRecord(c.symbol);f.isValueHolder?(a.domain[f.domain].value.put(f,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var f=a.getSymbolRecord();if("module"===f.keyword)return a.next(),a.addCommand({domain:"core",keyword:"close",lino:c,
    29 module:f.name}),!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var f=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:f});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:"program"});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug",
    30 lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(f=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:f}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],f=c.item;switch(f){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);f=a.exporter;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2));
    31 a.exporter=f;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=f.content&&console.log("Debug item "+f.content+": "+JSON.stringify(a[f.content],null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:f});return!0}return!1},run:function(a){var c=a[a.pc],f=a.getSymbolRecord(c.symbol);if(f.isValueHolder){var b=
    32 a.getValue(f.value[f.index]);f.value[f.index]={type:"constant",numeric:!1,content:a.decode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var f=a.getSymbol();var b=a.getCommandAt(f.pc).name}f=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide",
    33 lino:c,value1:f,value2:d,target:b}),!0;a.warning("core "+e.name+": Expected value holder")}else return"undefined"===typeof b&&a.warning("core "+e.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],f=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];f?(a=a.getValue(f)/a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(!e.numeric&&
    34 isNaN(e.content)&&a.nonNumericValueError(c,lino),a=parseInt(e.content)/parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:f});return!0}return!1},run:function(a){var c=a[a.pc],f=a.getSymbolRecord(c.symbol);if(f.isValueHolder){var b=
    35 a.getValue(f.value[f.index]);f.value[f.index]={type:"constant",numeric:!1,content:a.encode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});return!0},run:function(a){a.exit();return 0}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",
    36 keyword:"fork",lino:c,label:f});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(f){console.log(f.message),alert(f.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:c,label:f});return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var f=a.symbols[c.label];if(f)return f.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");
    37 return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:f});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc;a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var f=a.condition.compile(a),b=a.getPc();a.addCommand({domain:"core",keyword:"if",
    38 lino:c,condition:f});a.compileOne();if(!a.getToken())return a.getCommandAt(b).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(b).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(b).else=a.getPc();return!0},run:function(a){var c=a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,f=a.getProgram();c=$jscomp.makeIterator(c);for(var b=c.next();!b.done;b=
    39 c.next()){b=b.value;var d=a.nextToken(),e=b.keyword;if(d===e){if(d=a.compileVariable(b.domain,e,!0),d=f[a.getSymbols()[d.name].pc],d.element=b.element,d.exporter=b.exporter,d.exportedName=b.name,d.extra=b.extra,d.isValueHolder=b.isValueHolder,d.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+b.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();
    40 if(a.nextIsSymbol(!0)){var b=a.getToken();if(a.nextTokenIs("to")){var d=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:c,symbol:b,value:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol),d=a.getValue(c.value);d>=b.elements&&a.runtimeError(c.lino,"Array index "+d+" is out of range for '"+b.name+"'");b.index=d;b.imported&&(b.exporter.getSymbolRecord(b.exportedName).index=d);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var b=
    41 a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(b))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,b,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+1)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();
    42 a.next();if(a.isSymbol()){var b=a.getSymbol();var d=a.getCommandAt(b.pc).name}b=a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:b,value2:e,target:d}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof d&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",
    43 lino:c,value2:e,target:d}),!0;return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var g=e.value[e.index];b?(a=a.getValue(b)*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c,lino),a=parseInt(g.content)*parseInt(a.getValue(d)),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Negate:{compile:function(a){var c=
    44 a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);b.isValueHolder?b.value[b.index]={type:"constant",numeric:!0,content:-b.value[b.index].content}:a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),b=a.nextToken();switch(b){case "close":case "restore":case "message":return a.next(),a.addCommand({domain:"core",
    45 keyword:"on",lino:c,action:b}),a.completeHandler()}return a.isSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:b.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],b=c.pc+2;switch(c.action){case "close":a.onClose=b;break;case "restore":a.onRestore=b;break;case "message":a.onMessage=b;break;default:var d=a.getSymbolRecord(c.action);if(d)d.cb=b;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+
    46 1}},Print:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:b});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=a.getLino(),b=a.getNextValue();if(a.tokenIs("into")){if(a.nextIsSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:b,target:d});return!0}a.warning("core:put: No such variable: '"+a.getToken()+
    47 "'")}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.target);b.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,b.name);a=a.evaluate(c.value);b.value[b.index]=a;b.imported&&(b=b.exporter.getSymbolRecord(b.exportedName),b.value[b.index]=a);return c.pc+1}},Replace:{compile:function(a){var c=a.getLino(),b=a.getNextValue();if(a.tokenIs("with")){var d=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var e=a.getSymbolRecord();a.next();if(e.isValueHolder)return a.addCommand({domain:"core",
    48 keyword:"replace",lino:c,original:b,replacement:d,target:e.name}),!0;throw Error("'"+e.name+"' does not hold a value");}}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.original),d=a.getValue(c.replacement),e=a.getSymbolRecord(c.target);a=a.getValue(e.value[e.index]).split(b).join(d);e.value[e.index]={type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),b=a.nextToken();if(["css","js"].includes(b)){var d=a.getNextValue();a.addCommand({domain:"core",
    49 keyword:"require",lino:c,type:b,url:d});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var c=a[a.pc];a.require(c.type,a.getValue(c.url),function(){a.run(c.pc+1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),b=a.getNextValue(),d=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var e=a.getSymbolRecord();
    50 e.exporter=a.getProgram();d.push(e);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var g=a.getSymbolRecord();a.next();if("module"!==g.keyword)throw Error("'"+g.name+"' is not a module");g=g.name}var l=!1;a.tokenIs("nowait")&&(a.next(),l=!0);e=a.getPc();a.addCommand({domain:"core",keyword:"run",lino:c,script:b,imports:d,module:g,nowait:l,then:0});a.tokenIs("then")&&(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(e).then=a.getPc(),a.next(),
    51 a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(c).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+1}},Script:{compile:function(a){var c=
    52 a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c=a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+
    53 "' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient),a.program&&(a.program.message=b,a.program.run(a.program.onMessage));return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;
    54 if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}if(a.tokenIs("ready"))return a.next(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;if(a.tokenIs("property")&&(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(d=
    55 a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to")))){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:e});return!0}a.tokenIs("the")&&a.next();if(a.tokenIs("elements")&&(a.next(),a.tokenIs("of"))){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setElements",
    56 symbol:b,value:d}),!0}if(a.tokenIs("encoding")){if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");return!1}return a.tokenIs("payload")&&a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to"))?(d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),!0):!1},run:function(a){var c=
    57 a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean",content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);a.parent.nextPc=0;break;case "setElements":b=a.getSymbolRecord(c.symbol);b.elements=a.getValue(c.value);b.index=0;b.value=[];b.element=[];for(a=0;a<b.elements;a++)b.value.push({}),b.element.push({});break;case "setArray":b=a.getSymbolRecord(c.target);
    58 b.elements=c.value.length;b.value=c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var d=a.getValue(b.value[b.index]);d||(d="{}");var e="";try{e=JSON.parse(d)}catch(k){return a.runtimeError(c.lino,"Can't parse "+b.name),0}d=a.getValue(c.name);if(a=a.evaluate(c.value))e[d]=a.content instanceof Array?JSON.stringify(a.content):"boolean"===a.type?a.content:a.numeric?a.content:'{"'===a.content.substr(0,2)?JSON.parse(a.content):a.content.split('"').join('\\"'),
    59 b.value[b.index]={type:"constant",numeric:!1,content:JSON.stringify(e)};break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload)}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();if(a.more()&&a.isSymbol()){var b=a.getSymbolRecord();return"module"===b.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:c,name:b.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(a){var c=a[a.pc];if(c.name)a.getSymbolRecord(c.name).program.exit();
    60 else return 0;return c.pc+1}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+e.name+": Expected value holder")}else{d=
    61 a.getValue();if(a.tokenIs("giving"))return a.next(),g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var g=e.value[e.index];d?(a=a.getValue(d)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c.lino),a=parseInt(a.getValue(g))-
    62 parseInt(a.getValue(b)),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino,
    63 b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0},
    64 run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next();var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?
    65 a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "begin":return b.Begin;case "callback":return b.Callback;case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;case "decode":return b.Decode;case "divide":return b.Divide;case "encode":return b.Encode;case "end":return b.End;case "exit":return b.Exit;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import;
    66 case "index":return b.Index;case "load":return b.Load;case "module":return b.Module;case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "stop":return b.Stop;case "take":return b.Take;
    67 case "toggle":return b.Toggle;case "variable":return b.Variable;case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",
    68 name:c};case "variable":var b=a.nextToken();return["format","modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),
    69 {domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if(["now","today"].includes(c))return a.next(),{domain:"core",type:c};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"===
    70 c)return a.next(),{domain:"core",type:"break"};if(["encode","decode","lowercase","hash"].includes(c))return a.next(),a=a.getValue(),{domain:"core",type:c,value:a};if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",
    71 type:"property",property:c,symbol:b.name}:null;a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":case "index":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a=
    72 a.getNextValue(),{domain:"core",type:c,count:b,value:a};break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&
    73 (c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(),{domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),{domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a=
    74 a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*
    75 parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return b=a.getValue(c.value),{type:"constant",numeric:!1,content:b.substr(b.length-a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value);
    76 return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)};case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "format":d=a.getSymbolRecord(c.name);d=1E3*
    77 a.getValue(d.value[d.index]);try{switch(b=JSON.parse(a.getValue(c.value)),b.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(d)).toLocaleTimeString(b.locale,b.options)};default:return{type:"constant",numeric:!0,content:(new Date(d)).toLocaleDateString(b.locale,b.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)};
    78 case "today":return a=new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,content:Math.floor(a.getTime()/1E3)};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()};
    79 case "hash":a=a.getValue(c.value);c=0;if(0===a.length)return c;for(b=0;b<a.length;b++)d=a.charCodeAt(b),c=(c<<5)-c+d;return{type:"constant",numeric:!0,content:c};case "element":b=a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(command.lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":b=a.getValue(c.property);c=a.getSymbolRecord(c.symbol);
    80 a=a.getValue(c.value[c.index]);c="";if(b&&a)if("object"===typeof a)c=a[b];else if("{"===a.charAt(0))try{c=JSON.parse(a)[b]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",numeric:!isNaN(c),content:"object"===typeof c?JSON.stringify(c):c};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(c.name).program};case "message":return c=a.message,{type:"constant",numeric:!1,content:c};case "error":return c=a.errorMessage,{type:"constant",numeric:!1,content:c}}return null},
    81 put:function(a,c){a.value[a.index]=c}},condition:{compile:function(a){if(a.isSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword){if(a.nextTokenIs("is")){var d=!0;a.nextTokenIs("not")&&(a.next(),d=!1);if(a.tokenIs("running"))return a.next(),{domain:"core",type:"moduleRunning",name:c.name,sense:d}}return null}}if(a.tokenIs("not"))return{domain:"core",type:"not",value:a.getNextValue()};try{if(d=a.getValue(),"is"===a.getToken()){a.next();var e=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),
    82 {domain:"core",type:"numeric",value1:d};case "even":return a.next(),{domain:"core",type:"even",value1:d};case "odd":return a.next(),{domain:"core",type:"odd",value1:d};case "greater":a.next();if(a.tokenIs("than")){a.next();var g=a.getValue();return{domain:"core",type:"greater",value1:d,value2:g,negate:e}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var h=a.getValue();return{domain:"core",type:"less",value1:d,value2:h,negate:e}}break;default:var l=a.getValue();return{domain:"core",type:"is",
    83 value1:d,value2:l,negate:e}}}else if(d)return{domain:"core",type:"boolean",value:d}}catch(n){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return!isNaN(a.getValue(c.value1));case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=
    84 a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value);case "moduleRunning":return a=a.getSymbolRecord(c.name).program,c.sense?a:!a}return!1}}};h.exports=b},{}],6:[function(d,h,g){var e=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),f=d("./Value"),m=d("./Condition"),p=d("./Compare"),k={domain:{core:d("./Core")},setupTracer:function(){var a=document.getElementById("easycoder-tracer");a&&(a.innerHTML='<div><input id="easycoder-run-button" type="button" value="Run" /><input id="easycoder-step-button" type="button" value="Step" /><div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%></div>',
    85 a.style.display="none")},runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program);program.aborted=!0},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling?
    86 "Compile error":"Runtime error in '"+b.script+"'";b+=":\n";var f=e-5;for(f=0>f?0:f;f<e;f++){var l=(""+(f+1)).padStart(4," ");b+=l+" "+d[f].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b)}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];
    87 return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return f.encode(a,this.encoding)},decode:function(a){return f.decode(a,this.encoding)},evaluate:function(a){return f.evaluate(this,a)},getValue:function(a){return f.getValue(this,a)},getFormattedValue:function(a){a=f.evaluate(this,a);return a.numeric?a.content:'{"'===a.content.substr(0,2)||"["===a.content.charAt(0)?
    88 JSON.stringify(JSON.parse(a.content),null,2):a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&(k.program=this,c.run(this,a))},exit:function(){c.exit(this)},register:function(a){k.program=a},require:function(a,c,b){var d=document.createElement("css"===a?"link":"script");switch(a){case "css":d.type="text/css";d.href=c;d.rel="stylesheet";break;case "js":d.type="text/javascript";d.src=c;break;
    89 default:return}d.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");b()};document.head.appendChild(d)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports,e=c.module?a.getSymbolRecord(c.module):null;k.tokeniseScript(b.split("\n"),d,e,this,c.then);c.nowait&&this.run(a.nextPc)},close:function(){},compileScript:function(c,b,d,e){var g=c.tokens;this.compiling=!0;var h=Date.now();a.value=f;a.condition=
    90 m;a.domain=k.domain;a.imports=b;b=a.compile(g);var l=Date.now();console.log(l-k.timestamp+" ms: Compiled "+g.length+" tokens in "+(l-h+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=f;b.condition=m;b.compare=p;b.source=c;b.run=this.run;b.exit=this.exit;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.require=this.require;b.isUndefined=
    91 this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];
    92 b.module=d;b.parent=e;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,f,g){var h=null,l=Date.now();a=b.tokenise(a);var m=Date.now();console.log(m-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(m-l+" ms"));try{h=k.compileScript(a,d,e,f)}catch(u){"stop"!==u.message&&this.reportError(u,k.program,a)}this.setupTracer();h&&(h.onExit=g,c.run(h,0))},tokenize:function(a){var b=a.split("\n");if(!e.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}e.tokenising=!0}},
    93 setPluginCount:function(a){e.plugins=[];e.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+k.version,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){e.plugins.push({name:a,handler:b});e.plugins.length===e.pluginCount&&(e.plugins.forEach(function(a){k.domain[a.name]=a.handler}),
    94 k.tokenize(e.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-k.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+k.version;b.type="text/javascript";b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0,
    95 a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,e.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){e.source=a;a=window.location.pathname;a=a.endsWith("/")?a.slice(0,-1):"";k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,h,g){var e={run:function(b,a){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;
    96 0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",b),b);break}b.watchdog++;var g=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+g+":"+b[b.pc].keyword);var h=b.domain[g];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+g+"'");break}b.pc=h.run(b);if(!b.pc)break;
    97 if(b.stop){b.tracing=!1;break}if(b.tracing){g=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(g.lino,"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n="";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f=
    98 e.value[a];n=f?n+(f.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--)g.lino&&(q+='<input type="text" name="'+r+'"'+('value="'+h[g.lino-r].line.substr(k)+'"')+'style="width:100%;border:none;enabled:false">'),q+="<br>";l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button");
    99 a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{e.run(b,b.resume)}catch(t){var c="Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{b.run(b.resume)}catch(t){var c=
    100 "Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}},exit:function(b){b.onExit&&(b.parent.run(b.onExit),b.module.program=null)}};h.exports=e},{}],8:[function(d,h,g){var e={markComments:function(b){var a=b.list,c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,g=void 0===b.newList?[]:b.newList;if(c>=a.length)return g;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:g.concat({lino:b,index:c,
    101 token:h})};g={list:a,index:c+1,inComment:!0,newList:g.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?e.markComments(g):"!"===h.charAt(0)?e.markComments(g):e.markComments(k)},findStrings:function(b){var a=b.original,c=b.line,d=void 0===b.inComment?!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var g=c.charAt(0),h=b&&[" ","\\t"].includes(g)?"\\s":g;if(1===c.length)return h;c=c.substring(1);if("!"===g&&!b)return g+e.findStrings({original:a,line:c,inComment:!0,inQuote:!1});
    102 if("`"===g&&!d&&!b)return g+e.findStrings({original:a,line:c,inComment:d,inQuote:!0});if("`"===g&&b)return g+e.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!g.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(g))throw Error('Bad syntax in "'+a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+g+'" in\n"'+a+'".');}return h+e.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b=
    103 a.trim();return b.length?e.findStrings({original:a,line:b}):""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});a=e.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=e},{}],9:[function(d,
    104 h,g){var e={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c=eval(a);if(Number.isInteger(c))return b.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain));
    105 for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=e.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b));return a}return c},doValue:function(b,a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null;
    106 switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,c){return a+e.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b,a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}},
    107 evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=e.doValue(b,a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return e.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g,"+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b},
    108 decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=e},{}]},{},[1]);
     19getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,e){return a.value.constant(c,void 0===e?!1:e)},addCommand:function(a){b.program.push(f({pc:b.program.length},a))},addSymbol:function(a,e){b.symbols[a]={pc:e}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),e=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c,
     20goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});a.getCommandAt(e).goto=a.getPc();return!0},compileVariable:function(c,e,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:e,lino:p,isSymbol:!0,used:!1,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d};
     21"dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.mark();for(var e=$jscomp.makeIterator(Object.keys(a.domain)),b=e.next();!b.done;b=e.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var e=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+
     22c+"'");b.symbols[c]={pc:e};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var e=b.tokens[b.index].token;if("else"===e)return b.program;a.compileOne();if(-1<c.indexOf(e))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"exit",lino:a.getLino(),next:0});for(var e in b.symbols)c=b.program[b.symbols[e].pc],c.isSymbol&&!c.used&&console.log("Symbol '"+c.name+"' has not been used.");
     23return b.program}};h.exports=a},{}],4:[function(d,h,g){var f=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(b[e]=c[e])}return b};h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return f({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}],
     245:[function(d,h,g){var f=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var e=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,target:b});return!0}a.warning("core "+f.name+": Expected value holder")}else{b=
     25a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,value2:b,target:d}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];b?(a=a.getValue(b)+a.getValue(e),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c.lino),a=parseInt(f.content)+
     26parseInt(a.getValue(e)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getSymbolRecord();b.used=!0;a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:e,symbol:b.name});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.symbols[c.alias].pc,b=a[e],d=a.getSymbolRecord(c.symbol);
     27a[e]={pc:b.pc,domain:d.domain,keyword:d.keyword,lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Append:{compile:function(a){var c=a.getLino(),e=a.getNextValue();if(a.tokenIs("to")&&a.nextIsSymbol()){var b=a.getSymbolRecord();if(b.isValueHolder)return a.next(),a.addCommand({domain:"core",keyword:"append",lino:c,value:e,select:b.name}),!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.select);try{var b=a.getValue(c.value),d=["{","["].includes(b[0])?JSON.parse(b):b,f=e.value[e.index],
     28l=f.content;l=l?JSON.parse(l):[];l.push(d);f.content=JSON.stringify(l);return c.pc+1}catch(n){return a.runtimeError(c.lino,"JSON: Unable to parse value"),!1}}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbolRecord();if(e.isValueHolder)return e=
     29a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:c,symbol:e}),!0;a.warning("'Variable '"+e.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);e.isValueHolder?(a.domain[e.domain].value.put(e,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if("module"===e.keyword)return a.next(),
     30a.addCommand({domain:"core",keyword:"close",lino:c,module:e.name}),!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:e});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:"program"});return!0}return a.tokenIs("symbols")?
     31(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(e=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:e}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],e=c.item;switch(e){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);e=a.exporter;delete a.exporter;
     32console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=e;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=e.content&&console.log("Debug item "+e.content+": "+JSON.stringify(a[e.content],null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],
     33e=a.getSymbolRecord(c.symbol);if(e.isValueHolder){var b=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.decode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbol();var b=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,
     34a.next(),a.addCommand({domain:"core",keyword:"divide",lino:c,value1:e,value2:d,target:b}),!0;a.warning("core "+f.name+": Expected value holder")}else return"undefined"===typeof b&&a.warning("core "+f.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];e?(a=a.getValue(e)/a.getValue(b),d.value[d.index]={type:"constant",
     35numeric:!0,content:Math.trunc(a)}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c,lino),a=parseInt(f.content)/parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Dummy:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"dummy",lino:c});return!0},run:function(a){return a[a.pc].pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=
     36a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);if(e.isValueHolder){var b=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.encode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});
     37return!0},run:function(a){a.exit();return 0}},Filter:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if(a.nextTokenIs("with")){var b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"filter",lino:c,array:e.name,func:b});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.array),b=e.value[e.index].content,d=a.getSymbolRecord(c.func).pc;try{var f=JSON.parse(b).filter(function(c){e.a=c;a.run(d);return e.v});e.value[e.index].content=
     38JSON.stringify(f)}catch(l){a.runtimeError(c.lino,"Can't parse this array")}return c.pc+1}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(e){console.log(e.message),alert(e.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",
     39keyword:"go",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var e=a.symbols[c.label];if(e)return e.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc;
     40a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var e=a.condition.compile(a),b=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:e});a.compileOne();if(!a.getToken())return a.getCommandAt(b).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(b).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(b).else=a.getPc();
     41return!0},run:function(a){var c=a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,e=a.getProgram();c=$jscomp.makeIterator(c);for(var b=c.next();!b.done;b=c.next()){b=b.value;var d=a.nextToken(),f=b.keyword;if(d===f){if(d=a.compileVariable(b.domain,f,!0),d=e[a.getSymbols()[d.name].pc],d.element=b.element,d.exporter=b.exporter,d.exportedName=b.name,d.extra=b.extra,d.isValueHolder=b.isValueHolder,d.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+
     42b.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol(!0)){var e=a.getToken();if(a.nextTokenIs("to")){var b=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:c,symbol:e,value:b});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol),b=a.getValue(c.value);b>=e.elements&&a.runtimeError(c.lino,"Array index "+b+" is out of range for '"+
     43e.name+"'");e.index=b;e.imported&&(e.exporter.getSymbolRecord(e.exportedName).index=b);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var e=a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(e))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,e,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+
     441)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbol();var b=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:e,
     45value2:d,target:b}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof b&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];e?(a=a.getValue(e)*a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c,
     46lino),a=parseInt(f.content)*parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Negate:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);e.isValueHolder?e.value[e.index]={type:"constant",numeric:!0,content:-e.value[e.index].content}:
     47a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),e=a.nextToken();switch(e){case "close":case "restore":case "message":case "error":return a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:e}),a.completeHandler()}return a.isSymbol()&&(e=a.getSymbolRecord(),"callback"===e.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:e.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],e=c.pc+2;switch(c.action){case "close":a.onClose=
     48e;break;case "restore":a.onRestore=e;break;case "message":a.onMessage=e;break;case "error":a.onError=e;break;default:var b=a.getSymbolRecord(c.action);if(b)b.cb=e;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+1}},Print:{compile:function(a){var c=a.getLino();a.next();var e=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:e});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=
     49a.getLino(),e=a.getNextValue();if(a.tokenIs("into")){if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:e,target:b});return!0}a.warning("core:put: No such variable: '"+a.getToken()+"'")}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.target);e.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,e.name);a=a.evaluate(c.value);e.value[e.index]=a;e.imported&&(e=e.exporter.getSymbolRecord(e.exportedName),e.value[e.index]=a);return c.pc+
     501}},Replace:{compile:function(a){var c=a.getLino(),e=a.getNextValue();if(a.tokenIs("with")){var b=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var d=a.getSymbolRecord();a.next();if(d.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",lino:c,original:e,replacement:b,target:d.name}),!0;throw Error("'"+d.name+"' does not hold a value");}}return!1},run:function(a){var c=a[a.pc],e=a.getValue(c.original),b=a.getValue(c.replacement),d=a.getSymbolRecord(c.target);a=a.getValue(d.value[d.index]).split(e).join(b);
     51d.value[d.index]={type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),e=a.nextToken();if(["css","js"].includes(e)){var b=a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:c,type:e,url:b});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var c=a[a.pc];a.require(c.type,a.getValue(c.url),function(){a.run(c.pc+1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",
     52lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),e=a.getNextValue(),b=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var d=a.getSymbolRecord();d.exporter=a.getProgram();b.push(d);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var f=a.getSymbolRecord();a.next();if("module"!==f.keyword)throw Error("'"+f.name+"' is not a module");f=f.name}var l=!1;a.tokenIs("nowait")&&(a.next(),l=!0);d=a.getPc();a.addCommand({domain:"core",
     53keyword:"run",lino:c,script:e,imports:b,module:f,nowait:l,then:0});a.tokenIs("then")&&(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).then=a.getPc(),a.next(),a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(c).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",
     54lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+1}},Script:{compile:function(a){var c=a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c=
     55a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+"' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient),
     56a.program&&(a.program.message=b,a.program.run(a.program.onMessage));return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}switch(a.getToken()){case "ready":return a.next(),
     57a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;case "property":b=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to"))){var f=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:f});return!0}break;case "arg":if(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),a.nextTokenIs("to")))return f=a.getNextValue(),a.addCommand({domain:"core",
     58keyword:"set",lino:c,request:"setArg",target:d.name,name:b,value:f}),!0}a.tokenIs("the")&&a.next();switch(a.getToken()){case "elements":a.next();if(a.tokenIs("of")){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setElements",symbol:b,value:d}),!0}break;case "encoding":if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core",
     59keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to")))return d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),!0}return!1},run:function(a){var c=a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean",
     60content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);a.parent.nextPc=0;break;case "setElements":b=a.getSymbolRecord(c.symbol);var d=b.elements;b.elements=a.getValue(c.value);b.index=0;if(b.elements>d)for(a=d;a<b.elements;a++)b.value.push({}),b.element.push({});else b.value=b.value.slice(0,b.elements),b.element=b.element.slice(0,b.elements);break;case "setArray":b=a.getSymbolRecord(c.target);b.elements=c.value.length;b.value=
     61c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var f=a.getValue(b.value[b.index]);f||(f="{}");d="";try{d=JSON.parse(f)}catch(n){return a.runtimeError(c.lino,"Can't parse "+b.name),0}f=a.getValue(c.name);var k=a.evaluate(c.value);if(k){if(["{","["].includes(k.content[0]))try{var l=JSON.parse(k.content);d[f]=l}catch(n){a.runtimeError(c.lino,"Can't parse "+b.name)}else k.content instanceof Array?d[f]=k.content:"boolean"===k.type?
     62d[f]=k.content:k.numeric?d[f]=k.content:'{"'===k.content.substr(0,2)?d[f]=JSON.parse(k.content):d[f]=k.content.split('"').join('\\"');b.value[b.index]={type:"constant",numeric:!1,content:JSON.stringify(d)}}break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload);break;case "setArg":d=a.getValue(c.name),b=a.getSymbolRecord(c.target),b[d]=a.getValue(c.value)}return c.pc+1}},Sort:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(a.nextTokenIs("with")){var d=
     63a.nextToken();a.next();a.addCommand({domain:"core",keyword:"sort",lino:c,array:b.name,func:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.array),d=b.value[b.index].content,f=a.getSymbolRecord(c.func).pc;try{var k=JSON.parse(d);k.sort(function(c,e){b.a=c;b.b=e;a.run(f);return b.v});b.value[b.index].content=JSON.stringify(k)}catch(l){a.runtimeError(c.lino,"Can't parse this array")}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();if(a.more()&&a.isSymbol()){var b=
     64a.getSymbolRecord();return"module"===b.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:c,name:b.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(a){var c=a[a.pc];if(c.name)a.getSymbolRecord(c.name).program.exit();else return 0;return c.pc+1}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=
     65a.getValue();a.next();var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+f.name+": Expected value holder")}else{d=a.getValue();if(a.tokenIs("giving"))return a.next(),g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},
     66run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,f=a.getSymbolRecord(c.target);if(f.isValueHolder){var g=f.value[f.index];d?(a=a.getValue(d)-a.getValue(b),f.value[f.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c.lino),a=parseInt(a.getValue(g))-parseInt(a.getValue(b)),f.value[f.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next();
     67if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c=
     68a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next();
     69var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "append":return b.Append;case "begin":return b.Begin;case "callback":return b.Callback;
     70case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;case "decode":return b.Decode;case "divide":return b.Divide;case "dummy":return b.Dummy;case "encode":return b.Encode;case "end":return b.End;case "exit":return b.Exit;case "filter":return b.Filter;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import;case "index":return b.Index;case "load":return b.Load;case "module":return b.Module;
     71case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "sort":return b.Sort;case "stop":return b.Stop;case "take":return b.Take;case "toggle":return b.Toggle;case "variable":return b.Variable;
     72case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:c};case "variable":var b=a.nextToken();return["format",
     73"modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"===
     74c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if(["now","today"].includes(c))return a.next(),{domain:"core",type:c};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"===c)return a.next(),{domain:"core",type:"break"};if(["encode",
     75"decode","lowercase","hash"].includes(c))return a.next(),a=a.getValue(),{domain:"core",type:c,value:a};if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"property",property:c,symbol:b.name}:null;if("arg"===
     76c&&(c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()))return b=a.getSymbolRecord(),a.next(),{domain:"core",type:"arg",value:c,target:b.name};a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "index":if(a.nextTokenIs("of")){if(a.nextIsSymbol()){if("in"===a.peek())return c=a.getValue(),a=a.getNextValue(),{domain:"core",type:"indexOf",value1:c,value2:a};b=a.getToken();
     77a.next();return{domain:"core",type:c,name:b}}c=a.getValue();if(a.tokenIs("in"))return a=a.getNextValue(),{domain:"core",type:"indexOf",value1:c,value2:a}}break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,count:b,value:a};
     78break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(),
     79{domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),{domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a=a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*
     80a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)),
     81{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return b=a.getValue(c.value),{type:"constant",numeric:!1,content:b.substr(b.length-a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value);return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)};
     82case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "format":b=a.getSymbolRecord(c.name);b=1E3*a.getValue(b.value[b.index]);try{switch(d=JSON.parse(a.getValue(c.value)),
     83d.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(b)).toLocaleTimeString(d.locale,d.options)};default:return{type:"constant",numeric:!0,content:(new Date(b)).toLocaleDateString(d.locale,d.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)};case "today":return a=new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,
     84content:Math.floor(a.getTime()/1E3)};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()};case "hash":a=a.getValue(c.value);c=0;if(0===a.length)return c;for(b=
     850;b<a.length;b++)d=a.charCodeAt(b),c=(c<<5)-c+d;return{type:"constant",numeric:!0,content:c};case "element":b=a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":d=a.getValue(c.property);c=a.getSymbolRecord(c.symbol);a=a.getValue(c.value[c.index]);b="";if(d&&a)if("object"===typeof a)b=
     86a[d];else if("{"===a.charAt(0))try{b=JSON.parse(a)[d]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",numeric:!isNaN(b),content:"object"===typeof b?JSON.stringify(b):b};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(c.name).program};case "message":return b=a.message,{type:"constant",numeric:!1,content:b};case "error":return b=a.errorMessage,{type:"constant",numeric:!1,content:b};case "indexOf":d=a.getValue(c.value1);c=a.getValue(c.value2);try{return b=
     87JSON.parse(c).indexOf(d),{type:"constant",numeric:!0,content:b}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c)}break;case "arg":return b=a.getValue(c.value),b=a.getSymbolRecord(c.target)[b],{type:"constant",numeric:!isNaN(b),content:b}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(a){if(a.isSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword){if(a.nextTokenIs("is")){var d=!0;a.nextTokenIs("not")&&(a.next(),d=!1);if(a.tokenIs("running"))return a.next(),
     88{domain:"core",type:"moduleRunning",name:c.name,sense:d}}return null}}if(a.tokenIs("not"))return{domain:"core",type:"not",value:a.getNextValue()};try{if(d=a.getValue(),"is"===a.getToken()){a.next();var f=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),{domain:"core",type:"numeric",value1:d};case "even":return a.next(),{domain:"core",type:"even",value1:d};case "odd":return a.next(),{domain:"core",type:"odd",value1:d};case "greater":a.next();if(a.tokenIs("than")){a.next();var g=a.getValue();
     89return{domain:"core",type:"greater",value1:d,value2:g,negate:f}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var k=a.getValue();return{domain:"core",type:"less",value1:d,value2:k,negate:f}}break;default:var l=a.getValue();return{domain:"core",type:"is",value1:d,value2:l,negate:f}}}else if(d)return{domain:"core",type:"boolean",value:d}}catch(n){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return!isNaN(a.getValue(c.value1));
     90case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value);case "moduleRunning":return a=a.getSymbolRecord(c.name).program,c.sense?a:!a}return!1}}};h.exports=b},{}],6:[function(d,h,g){var f=this,b=d("./Tokenise"),a=d("./Compile"),
     91c=d("./Run"),e=d("./Value"),m=d("./Condition"),p=d("./Compare"),k={domain:{core:d("./Core")},runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program);k.program.aborted=!0},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;
     92e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling?"Compile error":"Runtime error in '"+b.script+"'";b+=":\n";var f=e-5;for(f=0>f?0:f;f<e;f++){var l=(""+(f+1)).padStart(4," ");b+=l+" "+d[f].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b)}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+
     93c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return e.encode(a,this.encoding)},decode:function(a){return e.decode(a,this.encoding)},evaluate:function(a){return e.evaluate(this,a)},getValue:function(a){return e.getValue(this,a)},getFormattedValue:function(a){a=e.evaluate(this,
     94a);if(a.numeric)return a.content;if('{"'===a.content.substr(0,2)||"["===a.content[0])try{var c=JSON.parse(a.content);return JSON.stringify(c,null,2)}catch(q){return this.reportError(q),"{}"}return a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&(k.program=this,c.run(this,a))},exit:function(){c.exit(this)},register:function(a){k.program=a},require:function(a,c,b){var d=document.createElement("css"===
     95a?"link":"script");switch(a){case "css":d.type="text/css";d.href=c;d.rel="stylesheet";break;case "js":d.type="text/javascript";d.src=c;break;default:return}d.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");b()};document.head.appendChild(d)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports,e=c.module?a.getSymbolRecord(c.module):null;try{k.tokeniseScript(b.split("\n"),d,e,this,c.then)}catch(w){this.reportError(w,
     96k.program,a.source);a.onError?a.run(a.onError):a.parent&&a.parent.onError&&a.parent.run(a.parent.onError);return}c.nowait&&this.run(a.nextPc)},close:function(){},compileScript:function(c,b,d,f){var g=c.tokens;this.compiling=!0;var l=Date.now();a.value=e;a.condition=m;a.domain=k.domain;a.imports=b;b=a.compile(g);var h=Date.now();console.log(h-k.timestamp+" ms: Compiled "+g.length+" tokens in "+(h-l+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=e;b.condition=m;b.compare=p;b.source=c;b.run=this.run;
     97b.exit=this.exit;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.require=this.require;b.isUndefined=this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=
     98this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];b.module=d;b.parent=f;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,f,g){var l=null,h=Date.now();a=b.tokenise(a);var m=Date.now();console.log(m-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(m-h+" ms"));try{l=
     99k.compileScript(a,d,e,f)}catch(u){"stop"!==u.message&&(d=k.program,this.reportError(u,d,a),d.onError&&d.run(d.onError))}l&&(l.onExit=g,c.run(l,0))},tokenize:function(a){var b=a.split("\n");if(!f.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}f.tokenising=!0}},setPluginCount:function(a){f.plugins=[];f.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+
     100k.version,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){f.plugins.push({name:a,handler:b});f.plugins.length===f.pluginCount&&(f.plugins.forEach(function(a){k.domain[a.name]=a.handler}),k.tokenize(f.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-k.timestamp+" ms: Load "+a+"/easycoder/plugins.js");
     101var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+k.version;b.type="text/javascript";b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,f.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){f.source=a;a=window.location.pathname;a=a.endsWith("/")?
     102a.slice(0,-1):"";k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,h,g){var f={run:function(b,a){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",
     103b),b);break}b.watchdog++;var g=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+g+":"+b[b.pc].keyword);var h=b.domain[g];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+g+"'");break}b.pc=h.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;break}if(b.tracing){g=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(g.lino,"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n=
     104"";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f=e.value[a];n=f?n+(f.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--){if(g.lino){var v=
     105h[g.lino-r].line.substr(k);q+='<input type="text" name="'+r+'"'+('value="'+(g.lino-r+1)+": "+v.split("\\s").join(" ")+'"')+'style="width:100%;border:none;enabled:false">'}q+="<br>"}l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{f.run(b,b.resume)}catch(t){var c=
     106"Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{b.run(b.resume)}catch(t){var c="Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}},exit:function(b){b.onExit&&(b.parent.run(b.onExit),b.module.program=null)}};h.exports=f},{}],8:[function(d,h,g){var f=
     107{markComments:function(b){var a=b.list,c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,g=void 0===b.newList?[]:b.newList;if(c>=a.length)return g;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:g.concat({lino:b,index:c,token:h})};g={list:a,index:c+1,inComment:!0,newList:g.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?f.markComments(g):"!"===h.charAt(0)?f.markComments(g):f.markComments(k)},findStrings:function(b){var a=b.original,
     108c=b.line,d=void 0===b.inComment?!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var g=c.charAt(0),h=b&&[" ","\\t"].includes(g)?"\\s":g;if(1===c.length)return h;c=c.substring(1);if("!"===g&&!b)return g+f.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===g&&!d&&!b)return g+f.findStrings({original:a,line:c,inComment:d,inQuote:!0});if("`"===g&&b)return g+f.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!g.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(g))throw Error('Bad syntax in "'+
     109a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+g+'" in\n"'+a+'".');}return h+f.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b=a.trim();return b.length?f.findStrings({original:a,line:b}):""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,
     110index:a.index,token:a.token.split("\\s").join(" ")}});a=f.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=f},{}],9:[function(d,h,g){var f={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c=
     111eval(a);if(Number.isInteger(c))return b.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain));for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=f.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b));
     112return a}return c},doValue:function(b,a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null;switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,c){return a+f.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b,
     113a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}},evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=f.doValue(b,a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return f.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g,
     114"+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b},decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=f},{}]},{},[1]);
  • easycoder/trunk/easycoder.js

    r2102119 r2107932  
    44const EasyCoder = require(`./easycoder/Main`);
    55
    6 EasyCoder.version = `2.3.1`;
     6EasyCoder.version = `2.4.0`;
    77EasyCoder.timestamp = Date.now();
    88console.log(`EasyCoder loaded; waiting for page`);
     
    3030    var v1 = val1.content;
    3131    var v2 = val2.content;
    32     if (val1.numeric && !val2.numeric) {
    33         v1 = v1.toString();
    34     }
    35     if (!val1.numeric && val2.numeric) {
    36         v2 = v2.toString();
    37     }
    38     if (!val1.numeric && typeof v1 === `undefined`) {
    39         v1 = ``;
    40     }
    41     if (!val2.numeric && typeof v2 === `undefined`) {
    42         v2 = ``;
     32    if (v1 && val1.numeric) {
     33        if (!val2.numeric) {
     34            v2 = typeof v2 === `undefined` ? 0 : parseInt(v2);
     35        }
     36    } else {
     37        if (v2 && val2.numeric) {
     38            v2 = v2.toString();
     39        }
     40        if (typeof v1 === `undefined`) {
     41            v1 = ``;
     42        }
     43        if (typeof v2 === `undefined`) {
     44            v2 = ``;
     45        }
    4346    }
    4447    if (v1 > v2) {
     
    556559    },
    557560
     561    Append: {
     562
     563        compile: compiler => {
     564            const lino = compiler.getLino();
     565            const value = compiler.getNextValue();
     566            if (compiler.tokenIs(`to`)) {
     567                if (compiler.nextIsSymbol()) {
     568                    const symbolRecord = compiler.getSymbolRecord();
     569                    if (symbolRecord.isValueHolder) {
     570                        compiler.next();
     571                        compiler.addCommand({
     572                            domain: `core`,
     573                            keyword: `append`,
     574                            lino,
     575                            value,
     576                            select: symbolRecord.name
     577                        });
     578                        return true;
     579                    }
     580                }
     581            }
     582            return false;
     583        },
     584
     585        run: program => {
     586            const command = program[program.pc];
     587            const array = program.getSymbolRecord(command.select);
     588            try {
     589                const v = program.getValue(command.value);
     590                const value = [`{`, `[`].includes(v[0]) ? JSON.parse(v) : v;
     591                const item = array.value[array.index];
     592                let a = item.content;
     593                if (a) {
     594                    a = JSON.parse(a);
     595                } else {
     596                    a = [];
     597                }
     598                a.push(value);
     599                item.content = JSON.stringify(a);
     600                return command.pc + 1;
     601            } catch (err) {
     602                program.runtimeError(command.lino, `JSON: Unable to parse value`);
     603                return false;
     604            }
     605        }
     606    },
     607
    558608    Begin: {
    559609
     
    857907    },
    858908
     909    Dummy: {
     910
     911        compile: compiler => {
     912            const lino = compiler.getLino();
     913            compiler.next();
     914            compiler.addCommand({
     915                domain: `core`,
     916                keyword: `dummy`,
     917                lino
     918            });
     919            return true;
     920        },
     921
     922        run: program => {
     923            return program[program.pc].pc + 1;
     924        }
     925    },
     926
    859927    Encode: {
    860928
     
    920988            program.exit();
    921989            return 0;
     990        }
     991    },
     992
     993    Filter: {
     994
     995        compile: compiler => {
     996            const lino = compiler.getLino();
     997            if (compiler.nextIsSymbol()) {
     998                const arrayRecord = compiler.getSymbolRecord();
     999                if (compiler.nextTokenIs(`with`)) {
     1000                    const func = compiler.nextToken();
     1001                    compiler.next();
     1002                    compiler.addCommand({
     1003                        domain: `core`,
     1004                        keyword: `filter`,
     1005                        lino,
     1006                        array: arrayRecord.name,
     1007                        func
     1008                    });
     1009                    return true;
     1010                }
     1011            }
     1012            return false;
     1013        },
     1014
     1015        run: program => {
     1016            const command = program[program.pc];
     1017            const variable = program.getSymbolRecord(command.array);
     1018            const value = variable.value[variable.index].content;
     1019            const func = program.getSymbolRecord(command.func).pc;
     1020            try {
     1021                const array = JSON.parse(value);
     1022                const result = array.filter(function (a) {
     1023                    variable.a = a;
     1024                    program.run(func);
     1025                    return variable.v;
     1026                });
     1027                variable.value[variable.index].content = JSON.stringify(result);
     1028            } catch (err) {
     1029                program.runtimeError(command.lino, `Can't parse this array`);
     1030            }
     1031            return command.pc + 1;
    9221032        }
    9231033    },
     
    13241434                case `restore`:
    13251435                case `message`:
     1436                case `error`:
    13261437                    compiler.next();
    13271438                    compiler.addCommand({
     
    13611472                case `message`:
    13621473                    program.onMessage = cb;
     1474                    break;
     1475                case `error`:
     1476                    program.onError = cb;
    13631477                    break;
    13641478                default:
     
    17261840
    17271841        compile: compiler => {
     1842            let name;
    17281843            const lino = compiler.getLino();
    17291844            if (compiler.nextIsSymbol()) {
     
    17631878                return true;
    17641879            }
    1765             if (compiler.tokenIs(`ready`)) {
    1766                 compiler.next();
    1767                 compiler.addCommand({
    1768                     domain: `core`,
    1769                     keyword: `set`,
    1770                     lino,
    1771                     request: `setReady`
    1772                 });
    1773                 return true;
    1774             }
    1775             if (compiler.tokenIs(`property`)) {
    1776                 const name = compiler.getNextValue();
    1777                 if (compiler.tokenIs(`of`)) {
    1778                     if (compiler.nextIsSymbol()) {
    1779                         const targetRecord = compiler.getSymbolRecord();
    1780                         if (targetRecord.keyword === `variable`) {
     1880            switch (compiler.getToken()) {
     1881                case `ready`:
     1882                    compiler.next();
     1883                    compiler.addCommand({
     1884                        domain: `core`,
     1885                        keyword: `set`,
     1886                        lino,
     1887                        request: `setReady`
     1888                    });
     1889                    return true;
     1890                case `property`:
     1891                    name = compiler.getNextValue();
     1892                    if (compiler.tokenIs(`of`)) {
     1893                        if (compiler.nextIsSymbol()) {
     1894                            const targetRecord = compiler.getSymbolRecord();
     1895                            if (targetRecord.keyword === `variable`) {
     1896                                if (compiler.nextTokenIs(`to`)) {
     1897                                    const value = compiler.getNextValue();
     1898                                    compiler.addCommand({
     1899                                        domain: `core`,
     1900                                        keyword: `set`,
     1901                                        lino,
     1902                                        request: `setProperty`,
     1903                                        target: targetRecord.name,
     1904                                        name,
     1905                                        value
     1906                                    });
     1907                                    return true;
     1908                                }
     1909                            }
     1910                        }
     1911                    }
     1912                    break;
     1913                case `arg`:
     1914                    name = compiler.getNextValue();
     1915                    if (compiler.tokenIs(`of`)) {
     1916                        if (compiler.nextIsSymbol()) {
     1917                            const targetRecord = compiler.getSymbolRecord();
    17811918                            if (compiler.nextTokenIs(`to`)) {
    17821919                                const value = compiler.getNextValue();
     
    17851922                                    keyword: `set`,
    17861923                                    lino,
    1787                                     request: `setProperty`,
     1924                                    request: `setArg`,
    17881925                                    target: targetRecord.name,
    17891926                                    name,
     
    17941931                        }
    17951932                    }
    1796                 }
    17971933            }
    17981934            if (compiler.tokenIs(`the`)) {
    17991935                compiler.next();
    18001936            }
    1801             if (compiler.tokenIs(`elements`)) {
    1802                 compiler.next();
    1803                 if (compiler.tokenIs(`of`)) {
     1937            switch (compiler.getToken()) {
     1938                case `elements`:
    18041939                    compiler.next();
    1805                     if (!compiler.isSymbol()) {
    1806                         throw new Error(`Unknown variable '${compiler.getToken()}'`);
    1807                     }
    1808                     const symbol = compiler.getToken();
    1809                     compiler.next();
    1810                     if (compiler.tokenIs(`to`)) {
     1940                    if (compiler.tokenIs(`of`)) {
    18111941                        compiler.next();
    1812                         // get the value
    1813                         const value = compiler.getValue();
     1942                        if (!compiler.isSymbol()) {
     1943                            throw new Error(`Unknown variable '${compiler.getToken()}'`);
     1944                        }
     1945                        const symbol = compiler.getToken();
     1946                        compiler.next();
     1947                        if (compiler.tokenIs(`to`)) {
     1948                            compiler.next();
     1949                            // get the value
     1950                            const value = compiler.getValue();
     1951                            compiler.addCommand({
     1952                                domain: `core`,
     1953                                keyword: `set`,
     1954                                lino,
     1955                                request: `setElements`,
     1956                                symbol,
     1957                                value
     1958                            });
     1959                            return true;
     1960                        }
     1961                    }
     1962                    break;
     1963                case `encoding`:
     1964                    if (compiler.nextTokenIs(`to`)) {
     1965                        const encoding = compiler.getNextValue();
    18141966                        compiler.addCommand({
    18151967                            domain: `core`,
    18161968                            keyword: `set`,
     1969                            request: `encoding`,
    18171970                            lino,
    1818                             request: `setElements`,
    1819                             symbol,
    1820                             value
     1971                            encoding
    18211972                        });
    18221973                        return true;
    18231974                    }
    1824                 }
    1825             }
    1826             if (compiler.tokenIs(`encoding`)) {
    1827                 if (compiler.nextTokenIs(`to`)) {
    1828                     const encoding = compiler.getNextValue();
    1829                     compiler.addCommand({
    1830                         domain: `core`,
    1831                         keyword: `set`,
    1832                         request: `encoding`,
    1833                         lino,
    1834                         encoding
    1835                     });
    1836                     return true;
    1837                 }
    1838                 compiler.addWarning(`Unknown encoding option`);
    1839                 return false;
    1840             }
    1841             if (compiler.tokenIs(`payload`)) {
    1842                 if (compiler.nextTokenIs(`of`)) {
    1843                     if (compiler.nextIsSymbol()) {
    1844                         const callbackRecord = compiler.getSymbolRecord();
    1845                         if (callbackRecord.keyword === `callback`) {
    1846                             if (compiler.nextTokenIs(`to`)) {
    1847                                 const payload = compiler.getNextValue();
    1848                                 compiler.addCommand({
    1849                                     domain: `core`,
    1850                                     keyword: `set`,
    1851                                     request: `setPayload`,
    1852                                     lino,
    1853                                     callback: callbackRecord.name,
    1854                                     payload
    1855                                 });
    1856                                 return true;
     1975                    compiler.addWarning(`Unknown encoding option`);
     1976                    break;
     1977                case `payload`:
     1978                    if (compiler.nextTokenIs(`of`)) {
     1979                        if (compiler.nextIsSymbol()) {
     1980                            const callbackRecord = compiler.getSymbolRecord();
     1981                            if (callbackRecord.keyword === `callback`) {
     1982                                if (compiler.nextTokenIs(`to`)) {
     1983                                    const payload = compiler.getNextValue();
     1984                                    compiler.addCommand({
     1985                                        domain: `core`,
     1986                                        keyword: `set`,
     1987                                        request: `setPayload`,
     1988                                        lino,
     1989                                        callback: callbackRecord.name,
     1990                                        payload
     1991                                    });
     1992                                    return true;
     1993                                }
    18571994                            }
    18581995                        }
    18591996                    }
    1860                 }
    18611997            }
    18621998            return false;
     
    18852021                case `setElements`:
    18862022                    const symbol = program.getSymbolRecord(command.symbol);
     2023                    const oldCount = symbol.elements;
    18872024                    symbol.elements = program.getValue(command.value);
    18882025                    symbol.index = 0;
    1889                     symbol.value = [];
    1890                     symbol.element = [];
    1891                     for (var n = 0; n < symbol.elements; n++) {
    1892                         symbol.value.push({});
    1893                         symbol.element.push({});
     2026                    if (symbol.elements > oldCount) {
     2027                        for (var n = oldCount; n < symbol.elements; n++) {
     2028                            symbol.value.push({});
     2029                            symbol.element.push({});
     2030                        }
     2031                    } else {
     2032                        symbol.value = symbol.value.slice(0, symbol.elements);
     2033                        symbol.element = symbol.element.slice(0, symbol.elements);
    18942034                    }
    18952035                    break;
     
    19182058                    const itemValue = program.evaluate(command.value);
    19192059                    if (itemValue) {
    1920                         if (itemValue.content instanceof Array) {
    1921                             targetJSON[itemName] = JSON.stringify(itemValue.content);
    1922                         } else if (itemValue.type === `boolean`) {
    1923                             targetJSON[itemName] = itemValue.content;
     2060                        if ([`{`, `[`].includes(itemValue.content[0])) {
     2061                            try {
     2062                                const parsed = JSON.parse(itemValue.content);
     2063                                targetJSON[itemName] = parsed;
     2064                            } catch (err) {
     2065                                program.runtimeError(command.lino, `Can't parse ${targetRecord.name}`);
     2066                            }
    19242067                        } else {
    1925                             targetJSON[itemName] = itemValue.numeric ? itemValue.content : itemValue.content.substr(0, 2) === `{"` ? JSON.parse(itemValue.content) : itemValue.content.split(`"`).join(`\\"`);
     2068                            if (itemValue.content instanceof Array) {
     2069                                targetJSON[itemName] = itemValue.content;
     2070                            } else if (itemValue.type === `boolean`) {
     2071                                targetJSON[itemName] = itemValue.content;
     2072                            } else if (itemValue.numeric) {
     2073                                targetJSON[itemName] = itemValue.content;
     2074                            } else if (itemValue.content.substr(0, 2) === `{"`) {
     2075                                targetJSON[itemName] = JSON.parse(itemValue.content);
     2076                            } else {
     2077                                targetJSON[itemName] = itemValue.content.split(`"`).join(`\\"`);
     2078                            }
    19262079                        }
    19272080                        targetRecord.value[targetRecord.index] = {
     
    19352088                    program.getSymbolRecord(command.callback).payload = program.getValue(command.payload);
    19362089                    break;
     2090                case `setArg`:
     2091                    const name = program.getValue(command.name);
     2092                    targetRecord = program.getSymbolRecord(command.target);
     2093                    targetRecord[name] = program.getValue(command.value);
     2094                    break;
    19372095                default:
    19382096                    break;
     2097            }
     2098            return command.pc + 1;
     2099        }
     2100    },
     2101
     2102    Sort: {
     2103
     2104        compile: compiler => {
     2105            const lino = compiler.getLino();
     2106            if (compiler.nextIsSymbol()) {
     2107                const arrayRecord = compiler.getSymbolRecord();
     2108                if (compiler.nextTokenIs(`with`)) {
     2109                    const func = compiler.nextToken();
     2110                    compiler.next();
     2111                    compiler.addCommand({
     2112                        domain: `core`,
     2113                        keyword: `sort`,
     2114                        lino,
     2115                        array: arrayRecord.name,
     2116                        func
     2117                    });
     2118                    return true;
     2119                }
     2120            }
     2121            return false;
     2122        },
     2123
     2124        run: program => {
     2125            const command = program[program.pc];
     2126            const variable = program.getSymbolRecord(command.array);
     2127            const value = variable.value[variable.index].content;
     2128            const func = program.getSymbolRecord(command.func).pc;
     2129            try {
     2130                const array = JSON.parse(value);
     2131                array.sort(function (a, b) {
     2132                    variable.a = a;
     2133                    variable.b = b;
     2134                    program.run(func);
     2135                    return variable.v;
     2136                });
     2137                variable.value[variable.index].content = JSON.stringify(array);
     2138            } catch (err) {
     2139                program.runtimeError(command.lino, `Can't parse this array`);
    19392140            }
    19402141            return command.pc + 1;
     
    22302431            case `alias`:
    22312432                return EasyCoder_Core.Alias;
     2433            case `append`:
     2434                return EasyCoder_Core.Append;
    22322435            case `begin`:
    22332436                return EasyCoder_Core.Begin;
     
    22442447            case `divide`:
    22452448                return EasyCoder_Core.Divide;
     2449            case `dummy`:
     2450                return EasyCoder_Core.Dummy;
    22462451            case `encode`:
    22472452                return EasyCoder_Core.Encode;
     
    22502455            case `exit`:
    22512456                return EasyCoder_Core.Exit;
     2457            case `filter`:
     2458                return EasyCoder_Core.Filter;
    22522459            case `fork`:
    22532460                return EasyCoder_Core.Fork;
     
    22932500            case `set`:
    22942501                return EasyCoder_Core.Set;
     2502            case `sort`:
     2503                return EasyCoder_Core.Sort;
    22952504            case `stop`:
    22962505                return EasyCoder_Core.Stop;
     
    24992708                return null;
    25002709            }
     2710            if (token === `arg`) {
     2711                const value = compiler.getNextValue();
     2712                if (compiler.tokenIs(`of`)) {
     2713                    if (compiler.nextIsSymbol()) {
     2714                        const target = compiler.getSymbolRecord();
     2715                        compiler.next();
     2716                        return {
     2717                            domain: `core`,
     2718                            type: `arg`,
     2719                            value,
     2720                            target: target.name
     2721                        };
     2722                    }
     2723                }
     2724            }
    25012725            if (compiler.tokenIs(`the`)) {
    25022726                compiler.next();
     
    25052729            switch (type) {
    25062730                case `elements`:
    2507                 case `index`:
    25082731                    if (compiler.nextTokenIs(`of`)) {
    25092732                        if (compiler.nextIsSymbol()) {
     
    25152738                                name
    25162739                            };
     2740                        }
     2741                    }
     2742                    break;
     2743                case `index`:
     2744                    if (compiler.nextTokenIs(`of`)) {
     2745                        if (compiler.nextIsSymbol()) {
     2746                            if (compiler.peek() === `in`) {
     2747                                const value1 = compiler.getValue();
     2748                                const value2 = compiler.getNextValue();
     2749                                return {
     2750                                    domain: `core`,
     2751                                    type: `indexOf`,
     2752                                    value1,
     2753                                    value2
     2754                                };
     2755                            } else {
     2756                                const name = compiler.getToken();
     2757                                compiler.next();
     2758                                return {
     2759                                    domain: `core`,
     2760                                    type,
     2761                                    name
     2762                                };
     2763                            }
     2764                        } else {
     2765                            const value1 = compiler.getValue();
     2766                            if (compiler.tokenIs(`in`)) {
     2767                                const value2 = compiler.getNextValue();
     2768                                return {
     2769                                    domain: `core`,
     2770                                    type: `indexOf`,
     2771                                    value1,
     2772                                    value2
     2773                                };
     2774                            }
    25172775                        }
    25182776                    }
     
    28183076                        elementContent = JSON.parse(program.getValue(elementRecord.value[elementRecord.index]))[element];
    28193077                    } catch (err) {
    2820                         program.runtimeError(command.lino, `Can't parse JSON`);
     3078                        program.runtimeError(program[program.pc].lino, `Can't parse JSON`);
    28213079                        return null;
    28223080                    }
     
    28683126                        content
    28693127                    };
     3128                case `indexOf`:
     3129                    const value1 = program.getValue(value.value1);
     3130                    const value2 = program.getValue(value.value2);
     3131                    try {
     3132                        content = JSON.parse(value2).indexOf(value1);
     3133                        return {
     3134                            type: `constant`,
     3135                            numeric: true,
     3136                            content
     3137                        };
     3138                    } catch (err) {
     3139                        program.runtimeError(program[program.pc].lino, `Can't parse ${value2}`);
     3140                    }
     3141                    break;
     3142                case `arg`:
     3143                    const name = program.getValue(value.value);
     3144                    const target = program.getSymbolRecord(value.target);
     3145                    content = target[name];
     3146                    return {
     3147                        type: `constant`,
     3148                        numeric: !isNaN(content),
     3149                        content
     3150                    };
    28703151            }
    28713152            return null;
    28723153        },
     3154
    28733155        put: (symbol, value) => {
    28743156            symbol.value[symbol.index] = value;
     
    30403322    },
    30413323
    3042     setupTracer: function () {
    3043         const tracer = document.getElementById(`easycoder-tracer`);
    3044         if (tracer) {
    3045             tracer.innerHTML = `<div><input id="easycoder-run-button" type="button" value="Run" />` + `<input id="easycoder-step-button" type="button" value="Step" />` + `<div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%>` + `</div>`;
    3046             tracer.style.display = `none`;
    3047         }
    3048     },
    3049 
    30503324    runtimeError: function (lino, message) {
    30513325        this.lino = lino;
     
    30533327            message: `Line ${lino >= 0 ? lino : ``}: ${message}`
    30543328        }, EasyCoder.program);
    3055         program.aborted = true;
     3329        EasyCoder.program.aborted = true;
    30563330    },
    30573331    nonNumericValueError: function (lino) {
     
    31373411            return v.content;
    31383412        }
    3139         if (v.content.substr(0, 2) === `{"` || v.content.charAt(0) === `[`) {
    3140             return JSON.stringify(JSON.parse(v.content), null, 2);
     3413        if (v.content.substr(0, 2) === `{"` || v.content[0] === `[`) {
     3414            try {
     3415                const parsed = JSON.parse(v.content);
     3416                return JSON.stringify(parsed, null, 2);
     3417            } catch (err) {
     3418                this.reportError(err);
     3419                return `{}`;
     3420            }
    31413421        }
    31423422        return v.content;
     
    32033483        const imports = command.imports;
    32043484        const moduleRecord = command.module ? program.getSymbolRecord(command.module) : null;
    3205         EasyCoder.tokeniseScript(script.split(`\n`), imports, moduleRecord, this, command.then);
     3485        try {
     3486            EasyCoder.tokeniseScript(script.split(`\n`), imports, moduleRecord, this, command.then);
     3487        } catch (err) {
     3488            this.reportError(err, EasyCoder.program, program.source);
     3489            if (program.onError) {
     3490                program.run(program.onError);
     3491            } else if (program.parent && program.parent.onError) {
     3492                program.parent.run(program.parent.onError);
     3493            }
     3494            return;
     3495        }
    32063496        if (command.nowait) {
    32073497            this.run(program.nextPc);
     
    32813571        } catch (err) {
    32823572            if (err.message !== `stop`) {
    3283                 this.reportError(err, EasyCoder.program, source);
    3284             }
    3285         }
    3286         this.setupTracer();
     3573                const p = EasyCoder.program;
     3574                this.reportError(err, p, source);
     3575                if (p.onError) {
     3576                    p.run(p.onError);
     3577                }
     3578            }
     3579        }
    32873580        if (program) {
    32883581            program.onExit = then;
     
    34913784                            for (var n = 5; n > 0; n--) {
    34923785                                if (command.lino) {
    3493                                     trace += `<input type="text" name="${n}"` + `value="${scriptLines[command.lino - n].line.substr(minSpace)}"` + `style="width:100%;border:none;enabled:false">`;
     3786                                    const text = scriptLines[command.lino - n].line.substr(minSpace);
     3787                                    trace += `<input type="text" name="${n}"` + `value="${command.lino - n + 1}: ${text.split(`\\s`).join(` `)}"` + `style="width:100%;border:none;enabled:false">`;
    34943788                                }
    34953789                                trace += `<br>`;
  • easycoder/trunk/easycoder.php

    r2102119 r2107932  
    44  * Plugin URI: https://easycoder.software
    55  * Description: Control the appearance and behavior of your posts and pages by embedding simple English-like scripts, without the need to learn JavaScript.
    6   * Version: 2.3.1
     6  * Version: 2.4.0
    77  * Author: EasyCoder Software
    88  * Author URI: https://easycoder.software
     
    1717  function easycoder_enqueue_script() {   
    1818    wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ )
    19             . 'easycoder-min.js', array(), '2.3.1');
     19            . 'easycoder-min.js', array(), '2.4.0');
    2020  }
    2121 
  • easycoder/trunk/plugins/browser.js

    r2102119 r2107932  
    167167        compile: (compiler) => {
    168168            const lino = compiler.getLino();
    169             if (compiler.nextIsSymbol()) {
     169            if (compiler.nextTokenIs(`body`)) {
     170                compiler.next();
     171                compiler.addCommand({
     172                    domain: `browser`,
     173                    keyword: `clear`,
     174                    lino,
     175                    name: null
     176                });
     177                return true;
     178            }
     179            if (compiler.isSymbol()) {
    170180                const symbolRecord = compiler.getSymbolRecord();
    171181                if (symbolRecord.extra === `dom`) {
     
    185195        run: (program) => {
    186196            const command = program[program.pc];
    187             const targetRecord = program.getSymbolRecord(command.name);
    188             const target = targetRecord.element[targetRecord.index];
    189             target.innerHTML = ``;
     197            if (command.name) {
     198                const targetRecord = program.getSymbolRecord(command.name);
     199                const target = targetRecord.element[targetRecord.index];
     200                target.innerHTML = ``;
     201            } else {
     202                document.body.innerHTML = ``;
     203            }
    190204            return command.pc + 1;
    191205        }
     
    293307                ].includes(keyword)) {
    294308                    if (compiler.nextTokenIs(`in`)) {
    295                         if (compiler.nextIsSymbol()) {
     309                        if (compiler.nextTokenIs(`body`)) {
     310                            compiler.next();
     311                            compiler.addCommand({
     312                                domain: `browser`,
     313                                keyword: `create`,
     314                                lino,
     315                                name: symbolRecord.name,
     316                                parent: `body`
     317                            });
     318                            return true;
     319                        }
     320                        if (compiler.isSymbol()) {
    296321                            const parentRecord = compiler.getSymbolRecord();
    297322                            compiler.next();
     
    12611286                }
    12621287            }
    1263             const key = compiler.getValue();
    1264             if (compiler.tokenIs(`from`)) {
    1265                 if (compiler.nextTokenIs(`storage`)) {
    1266                     compiler.next();
    1267                     compiler.addCommand({
    1268                         domain: `browser`,
    1269                         keyword: `remove`,
    1270                         type: `removeStorage`,
    1271                         key
    1272                     });
    1273                     return true;
    1274                 }
     1288            try {
     1289                const key = compiler.getValue();
     1290                if (compiler.tokenIs(`from`)) {
     1291                    if (compiler.nextTokenIs(`storage`)) {
     1292                        compiler.next();
     1293                        compiler.addCommand({
     1294                            domain: `browser`,
     1295                            keyword: `remove`,
     1296                            type: `removeStorage`,
     1297                            key
     1298                        });
     1299                        return true;
     1300                    }
     1301                }
     1302            } catch (err) {
     1303                return false;
    12751304            }
    12761305            return false;
     
    13661395            const lino = compiler.getLino();
    13671396            if (compiler.nextIsSymbol()) {
     1397                const targetRecord = compiler.getSymbolRecord();
     1398                if (targetRecord.keyword === `select`) {
     1399                    if (compiler.nextTokenIs(`from`)) {
     1400                        if (compiler.nextIsSymbol()) {
     1401                            const sourceRecord = compiler.getSymbolRecord();
     1402                            if (sourceRecord.keyword === `variable`) {
     1403                                var display = null;
     1404                                if (compiler.nextTokenIs(`as`)) {
     1405                                    display = compiler.getNextValue();
     1406                                }
     1407                                compiler.addCommand({
     1408                                    domain: `browser`,
     1409                                    keyword: `set`,
     1410                                    lino,
     1411                                    type: `setSelect`,
     1412                                    select: targetRecord.name,
     1413                                    source: sourceRecord.name,
     1414                                    display
     1415                                });
     1416                                return true;
     1417                            }
     1418                        }
     1419                    }
     1420                    return false;
     1421                }
    13681422                const target = compiler.getToken();
    13691423                if (compiler.nextTokenIs(`from`)) {
     
    16211675            let targetId;
    16221676            let cssId;
     1677            let selectRecord;
    16231678            switch (command.type) {
    16241679            case `setContentVar`:
     
    16581713                    target.innerHTML = value;
    16591714                    break;
     1715                }
     1716                break;
     1717            case `setSelect`:
     1718                // The source is assumed to be an array
     1719                sourceRecord = program.getSymbolRecord(command.source);
     1720                const sourceData = program.getValue(sourceRecord.value[sourceRecord.index]);
     1721                var itemArray = ``;
     1722                try {
     1723                    itemArray = JSON.parse(sourceData);
     1724                } catch (err) {
     1725                    program.runtimeError(command.lino, `Can't parse JSON`);
     1726                    return 0;
     1727                }
     1728                // The target is assumed to be a SELECT
     1729                selectRecord = program.getSymbolRecord(command.select);
     1730                const select = selectRecord.element[selectRecord.index];
     1731                select.options.length = 0;
     1732                // Get the name of the display field
     1733                const display = program.getValue(command.display);
     1734                // For each item, set the title and inner HTML
     1735                itemArray.forEach(function (item) {
     1736                    const title = display ? program.decode(item[display]) : null;
     1737                    const opt = document.createElement(`option`);
     1738                    const innerHTML = title ? title : item;
     1739                    opt.innerHTML = innerHTML;
     1740                    const value = title ? JSON.stringify(item) : item;
     1741                    opt.value = value;
     1742                    select.appendChild(opt);
     1743                });
     1744                if (display) {
     1745                    select.selectedIndex = itemArray.indexOf(display);
     1746                } else {
     1747                    select.selectedIndex =  -1;
    16601748                }
    16611749                break;
     
    17531841                break;
    17541842            case `setDefault`:
    1755                 const selectRecord = program.getSymbolRecord(command.name);
     1843                selectRecord = program.getSymbolRecord(command.name);
    17561844                value = program.getValue(command.value);
    17571845                const element = selectRecord.element[selectRecord.index];
     
    18821970                    };
    18831971                }
    1884                 program.tracing = true;
     1972                if (!program.tracing) {
     1973                    const tracer = document.getElementById(`easycoder-tracer`);
     1974                    if (tracer) {
     1975                        tracer.innerHTML =
     1976                                `<div><input id="easycoder-run-button" type="button" value="Run" />` +
     1977                                `<input id="easycoder-step-button" type="button" value="Step" />` +
     1978                                `<div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%>` +
     1979                                `</div>`;
     1980                        tracer.style.display = `none`;
     1981                    }
     1982                    program.tracing = true;
     1983                }
    18851984                program.stop = false;
    18861985                break;
     
    19392038            const command = program[program.pc];
    19402039            const fileSpec = program.getSymbolRecord(command.file);
    1941             const path = program.getValue(command.path).replace(/~/g, `/`);
     2040            // const path = program.getValue(command.path).replace(/~/g, `/`);
     2041            const path = program.getValue(command.path);
    19422042            const progressSpec = program.getSymbolRecord(command.progress);
    19432043            const statusSpec = program.getSymbolRecord(command.status);
     
    19862086                    if (this.readyState === 4) {
    19872087                        const command = program.ajaxCommand;
    1988                         switch (this.status) {
     2088                        const status = this.status;
     2089                        switch (status) {
    19892090                        case 200:
    19902091                            program.run(command.pc + 1);
     
    19932094                            break;
    19942095                        default:
    1995                             let error = ``;
    19962096                            try {
    1997                                 error = JSON.parse(this.responseText ? this.responseText : `{}`);
    1998                             } catch (err) {
    1999                                 program.runtimeError(command.lino, `Can't parse JSON`);
    2000                                 return 0;
    2001                             }
    2002                             try {
    2003                                 program.runtimeError(command.lino, error.message);
     2097                                program.runtimeError(command.lino, `Error ${status}`);
    20042098                            } catch (err) {
    20052099                                program.reportError(err, program);
     
    20102104                };
    20112105                program.ajaxCommand = command;
    2012                 ajax.open(`POST`, `${window.location.origin}/wp-content/plugins/easycoder/rest.php/_upload`);
     2106                const postpath = path.startsWith(`http`) ? path : `${window.location.origin}/${EasyCoder_Plugins.rest()}/${path}`;
     2107                ajax.open(`POST`, postpath);
    20132108                ajax.send(formData);
    20142109            }
     
    20852180        case `on`:
    20862181            return EasyCoder_Browser.On;
     2182        case `option`:
     2183            return EasyCoder_Browser.Option;
    20872184        case `p`:
    20882185            return EasyCoder_Browser.P;
     
    21702267
    21712268            let type = compiler.getToken();
    2172             if ([`mobile`, `portrait`, `landscape`, `br`, `location`, `key`].includes(type)) {
     2269            if ([`mobile`, `portrait`, `landscape`, `br`, `location`, `key`, `hostname`].includes(type)) {
    21732270                compiler.next();
    21742271                return {
     
    25112608                    content: program.key
    25122609                };
     2610            case `hostname`:
     2611                return {
     2612                    type: `constant`,
     2613                    numeric: false,
     2614                    content: location.hostname
     2615                };
    25132616            }
    25142617        }
  • easycoder/trunk/plugins/json.js

    r2102119 r2107932  
    9696                break;
    9797            case `delete`:
    98                 const name = compiler.getNextValue();
    99                 if (compiler.tokenIs(`from`)) {
    100                     if (compiler.nextIsSymbol()) {
    101                         const targetRecord = compiler.getSymbolRecord();
    102                         if (targetRecord.keyword === `variable`) {
    103                             compiler.next();
    104                             compiler.addCommand({
    105                                 domain: `json`,
    106                                 keyword: `json`,
    107                                 lino,
    108                                 request,
    109                                 name,
    110                                 target: targetRecord.name
    111                             });
    112                             return true;
     98                const what = compiler.nextToken();
     99                if ([`property`, `element`].includes(what)) {
     100                    const value = compiler.getNextValue();
     101                    if ([`from`, `of`].includes(compiler.getToken())) {
     102                        if (compiler.nextIsSymbol()) {
     103                            const targetRecord = compiler.getSymbolRecord();
     104                            if (targetRecord.keyword === `variable`) {
     105                                compiler.next();
     106                                compiler.addCommand({
     107                                    domain: `json`,
     108                                    keyword: `json`,
     109                                    lino,
     110                                    request,
     111                                    what,
     112                                    value,
     113                                    target: targetRecord.name
     114                                });
     115                                return true;
     116                            }
    113117                        }
    114118                    }
     
    161165            case `split`:
    162166                item = compiler.getNextValue();
    163                 if (compiler.tokenIs(`into`)){
     167                if (compiler.tokenIs(`into`)) {
    164168                    if (compiler.nextIsSymbol()) {
    165169                        const targetRecord = compiler.getSymbolRecord();
     
    291295                break;
    292296            case `delete`:
    293                 const name = program.getValue(command.name);
    294                 targetRecord = program.getSymbolRecord(command.target);
    295                 record = JSON.parse(targetRecord.value[targetRecord.index].content);
    296                 delete record[name];
    297                 targetRecord.value[targetRecord.index].content = JSON.stringify(record);
     297                switch (command.what) {
     298                case `property`:
     299                    const name = program.getValue(command.value);
     300                    targetRecord = program.getSymbolRecord(command.target);
     301                    record = JSON.parse(targetRecord.value[targetRecord.index].content);
     302                    delete record[name];
     303                    targetRecord.value[targetRecord.index].content = JSON.stringify(record);
     304                    break;
     305                case `element`:
     306                    const element = program.getValue(command.value);
     307                    targetRecord = program.getSymbolRecord(command.target);
     308                    record = JSON.parse(targetRecord.value[targetRecord.index].content);
     309                    record.splice(element, 1);
     310                    targetRecord.value[targetRecord.index].content = JSON.stringify(record);
     311                    break;
     312                }
    298313                break;
    299314            case `rename`:
     
    414429                const item = program.getValue(value.item);
    415430                const list = JSON.parse(program.getValue(value.list));
    416                 content = list.findIndex(function(value) {
     431                content = list.findIndex(function (value) {
    417432                    return value === item;
    418433                });
  • easycoder/trunk/plugins/rest.js

    r2102119 r2107932  
    9191                var content = request.responseText;
    9292                if (content.length > 0 && ![`[`, `{`].includes(content.charAt(0))) {
    93                     content = program.decode(content);
     93                    // content = program.decode(content);
    9494                }
    9595                if (command.target) {
     
    131131                } else {
    132132                    request.setRequestHeader(`Content-Type`, `application/text; charset=UTF-8`);
    133                     // console.log(`value=${program.encode(value)}`);
    134                     request.send(program.encode(value));
     133                    request.send(value);
    135134                }
    136135                break;
  • easycoder/trunk/readme.txt

    r2102119 r2107932  
    3232*EasyCoder* scripts are embedded in your page or post, inside a special "preformatted" tag. When the page loads, *EasyCoder* looks for this element then compiles and runs the script it contains. When it interacts with HTML elements it attaches their IDs to its own variables, so your HTML and its controlling script are in the same file.
    3333
    34 The *EasyCoder* core module is currently about 51k bytes in its minimised form and it downloads its own plugin modules from a growing library. Its performance is good because it precompiles scripts - a process that takes only tens of milliseconds - and the compiled code for each command is only a thin wrapper around the corresponding JavaScript functionality.
     34The *EasyCoder* core module is currently about 56k bytes in its minimised form and it downloads its own plugin modules from a growing library. Its performance is good because it precompiles scripts - a process that takes only tens of milliseconds - and the compiled code for each command is only a thin wrapper around the corresponding JavaScript functionality.
    3535
    3636When *EasyCoder* detects an error, either in compilation or at runtime, it opens a popup window with a friendly error message that tries to tell you what went wrong and where in the script it happened.
     
    5353
    5454== Changelog ==
     55
     56= 2.4.0 18-jun-2019 =
     57* Sorting & filtering; added the script editor
    5558
    5659= 2.3.1 7-jun-2019 =
  • easycoder/trunk/rest.php

    r2102119 r2107932  
    2121       
    2222        // The properties file is best kept above the site root to prevent access by browsers.
    23         // For WordPress, that's 4 levels up from our current location, the 'plugins/easycoder' folder.
     23        // For WordPress, that's 4 levels up from our current location in the 'plugins/easycoder' folder.
    2424        $props = array();
    2525        $filename = '../../../../' . $_SERVER['HTTP_HOST'] . '.txt';
     
    3838                fclose($file);
    3939        }
     40        $resources = $props['resources'] ? $props['resources'] : 'easycoder';
     41        $scripts = $props['scripts'] ? $props['scripts'] : 'easycoder/scripts';
     42        $upload = $props['upload'] ? $props['upload'] : 'easycoder/upload';
    4043
    4144        // First, the commands that don't require a database connection.
     
    4649                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_list/[{path}]
    4750                                // List the contents of a directory
    48                                 if (count($request)) {
     51                                if (count($request) && $request[0]) {
    4952                                        $path = '/' . str_replace('~', '/', $request[0]);
    5053                                }
    51                                 // Start at the resources folder
    52                                 $path = "../../../resources$path";
     54                                // Start at the easycoder folder
     55                                $path = "../../../$resources$path";
    5356                                $files = scandir($path);
    5457                                print '[';
     
    8386                                                            switch (strtolower($ext)) {
    8487                                                                    case 'jpg':
     88                                                                    case 'jpeg':
    8589                                                                    case 'png':
    8690                                                                    case 'gif':
     
    8993                                                            }
    9094                                                    }
     95                           print "{\"name\":\"$file\",\"type\":\"$type\"}";
    9196                                            }
    92                                             print "{\"name\":\"$file\",\"type\":\"$type\"}";
    9397                                    }
    9498                                }
     
    100104                                exit;
    101105                        case '_verify':
    102                                 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_verify/{value-to-verify}
    103                                 print password_verify($request[0], $props['password']) ? 'yes' : 'no';
    104                                 exit;
    105                         case '_validate':
     106                                    // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_verify/{value-to-verify}
     107                                    print password_verify($request[0], $props['password']) ? 'yes' : 'no';
     108                                    exit;
     109                        case '_verify2':
     110                                    // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_verify/{value-to-verify}/{hash}
     111                                    print password_verify($request[0], $request[1]) ? 'yes' : 'no';
     112                                    exit;
     113                                    case '_validate':
    106114                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_validate/{value-to-validate}/{encrypted-value}
    107115                                print password_verify($request[0], str_replace('~', '/', $request[1])) ? 'yes' : 'no';
     
    109117                        case '_load':
    110118                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_load/{path}
    111                                 $path = '../../../resources/' . str_replace('~', '/', $request[0]);
     119                                $path = "../../../$resources/" . str_replace('~', '/', $request[0]);
    112120                                print file_get_contents($path);
     121                                exit;
     122            case '_loadall':
     123                                // Load all the files in the named folder
     124                                // Endpoint: {site root}/easycoder/rest.php/_loadall/{path}
     125                                $path = "../../../$resources/" . str_replace('~', '/', $request[0]);
     126                                $files = scandir($path);
     127                                print '[';
     128                                $flag = false;
     129                                foreach ($files as $file) {
     130                                        if (strpos($file, '.') !== 0) {
     131                                                if (!is_dir("$path/$file")) {
     132                                                        if ($flag) {
     133                                                                print ',';
     134                                                        } else {
     135                                                                $flag = true;
     136                                                        }
     137                                                        print file_get_contents("$path/$file");
     138                                                }
     139                                        }
     140                                }
     141                                print ']';
     142                                exit;
     143                        case '_scripted':
     144                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_scripted
     145                                print file_get_contents('scripted');
    113146                                exit;
    114147                        break;
     
    117150                        switch ($table) {
    118151                                case '_mkdir':
    119                                         // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_mkdir
    120                                         header("Content-Type: application/text");
    121                                         $path = stripslashes(file_get_contents("php://input"));
    122                                         logger("Create directory $path");
    123                                         mkdir($path);
     152                                        // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_mkdir/{path}
     153                                        $path = "../../../$resources/" . str_replace('~', '/', $request[0]);
     154                                        mkdir($path, 0777, true);
    124155                                        exit;
    125156                                case '_upload':
     
    127158                                        // Upload a file (an image) to the current directory
    128159                                        $path = $_POST['path'];
     160                                        $pathsegs = explode("/", $path);
     161                                        $path = str_replace('~', '/', $pathsegs[1]);
    129162                                        $fileName = $_FILES['source']['name'];
    130163                                        $tempName = $_FILES['source']['tmp_name'];
     
    132165                                        $fileSize = $_FILES['source']['size'];
    133166                                        $fileError = $_FILES['source']['error'];
    134                                         if (!move_uploaded_file($tempName, "$path/$fileName")) {
     167                                        if (!move_uploaded_file($tempName, "../../../$path/$fileName")) {
    135168                                                unlink($tempName);
    136169                                                http_response_code(400);
     
    147180                                        exit;
    148181                                case '_delete':
    149                                         // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_delete
    150                                         header("Content-Type: application/text");
    151                                         $path = stripslashes(file_get_contents("php://input"));
     182                                        // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_delete/{path}
     183                                        $path = "../../../$resources/" . str_replace('~', '/', $request[0]);
    152184                                        if (is_dir($path)) {
    153                                                 rmdir($path);
    154                                         } else {
    155                                                 unlink($path);
    156                                         }
     185                                                        rmdir($path);
     186                                                } else {
     187                                                        unlink($path);
     188                                                }
    157189                                        exit;
    158190                                case '_email':
     
    173205                                case '_save':
    174206                                        // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_save/{path}
    175                                         $path = '../../../resources/' . str_replace('~', '/', $request[0]);
     207                                        $path = "../../../$resources/" . str_replace('~', '/', $request[0]);
    176208                                        $p = strrpos($path, '/');
    177209                                        $dir = substr($path, 0, $p);
     
    185217                                        unlink($backup);
    186218                                        copy($path, $backup);
     219                                        file_put_contents($path, $content);
     220                                        exit;
     221                                case '_ecsave':
     222                                        // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_ecsave/{path}
     223                                        $path = str_replace('~', '/', $request[0]);
     224                                        $p = strrpos($path, '/');
     225                                        if ($p > 0) {
     226                                                $dir = substr($path, 0, $p);
     227                                                mkdir($dir, 0777, true);
     228                                        }
     229                                        header("Content-Type: application/text");
     230                                        $content = stripslashes(file_get_contents("php://input"));
    187231                                        file_put_contents($path, $content);
    188232                                        exit;
     
    398442                                                                print "{\"message\":\"Cannot set record $id of $table.\"}";
    399443                                                        }
    400                             mysqli_free_result($result);
    401                             break;
     444                                                        mysqli_free_result($result);
     445                                                        break;
    402446                                                       
    403447                                                case 'name':
     
    417461                                                                http_response_code(201);
    418462                                                        }
    419                             mysqli_free_result($result);
    420                             break;
     463                                                        mysqli_free_result($result);
     464                                                        break;
    421465                                                       
    422466                                                default:
     
    479523                                                }
    480524                                        }
    481                     mysqli_free_result($result);
    482                                 }
    483                 break;
     525                                        mysqli_free_result($result);
     526                                }
     527                                break;
    484528                               
    485529                        default:
Note: See TracChangeset for help on using the changeset viewer.