UNPKG

adder-script

Version:

Python like language to execute untrusted codes in browsers and Node.js.

1 lines 102 kB
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.AdderScript=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";var Errors=require("./../errors");var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Lexer=require("./lexer");var Parser=require("./parser");var TokenTypes=require("./tokens");var defaultFlags=require("./default_flags");var Errors=require("./../errors");var Compiler=Class({constructor:function(flags){this._flags=flags||{};for(var key in defaultFlags){if(this._flags[key]===undefined){this._flags[key]=defaultFlags[key]}}this._spacesPerTab=" ".repeat(this._flags.spacesNeededForBlockIndent);this._lexer=new Lexer(this._flags)},compile:function(code,flags){flags=flags||{};code=code.replace(/\s+$/,"");if(flags.fixLineBreaks||flags.fixLineBreaks===undefined){code=code.replace(/\r\n/g,"\n").replace(/\r/g,"")}if(code.indexOf("\r")!==-1){throw new Errors.SyntaxError("Illegal character found in code: '\\r'! Please use '\\n' only for line breaks.",0)}var tokens=this._lexer.parseExpression(code);var lastBlockIndent=0;var lineIndex=1;var ret=[];for(var i=0;i<tokens.length;++i){if(tokens[i].t===TokenTypes.cblock){var currBlockIndent=tokens[i].v;if(currBlockIndent>lastBlockIndent){for(var k=currBlockIndent;k>lastBlockIndent;--k){ret.push(["NEW_BLOCK",lineIndex])}}else if(currBlockIndent<lastBlockIndent){for(var k=currBlockIndent;k<lastBlockIndent;++k){ret.push(["END_BLOCK",lineIndex])}}lastBlockIndent=currBlockIndent;continue}var j=i;var endToken=tokens[i];while(endToken&&endToken.t!==TokenTypes.lbreak){endToken=tokens[++j]}if(endToken&&endToken.v==="\n"){lineIndex++}var currTokens=tokens.slice(i,j);while(currTokens[currTokens.length-1]&&currTokens[currTokens.length-1].t===TokenTypes.lbreak){currTokens.pop()}i=j;if(currTokens.length===0)continue;var ast=Parser.parse(currTokens,lineIndex);if(ast&&ast!==[]){ret.push([ast,lineIndex])}}return ret}});module.exports=Compiler},{"./../dependencies/jsface":24,"./../errors":28,"./default_flags":2,"./lexer":4,"./parser":5,"./tokens":6}],2:[function(require,module,exports){"use strict";module.exports={spacesNeededForBlockIndent:4}},{}],3:[function(require,module,exports){module.exports=require("./compiler")},{"./compiler":1}],4:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Console=require("./../console");var signOperators=["+=","-=","*=","/=","|=","&=","%=","**","==","!=",">=","<=",">","<","+","-","*","/","|","&","%","=","."];var wordsOperators=["not in","is not","not","in","or","and","is"];var operators=signOperators.concat(wordsOperators);var defaultFlags=require("./default_flags");var commentPrefix="#";var Utils=require("./../utils");var TokenTypes=require("./tokens");var breakingSigns=[" ","(",")","[","]",undefined,",",":",";","\n","\\"];breakingSigns=breakingSigns.concat(operators);breakingSigns=Utils.toSet(breakingSigns);var Lexer=Class({$static:{wordsOperators:wordsOperators,operators:operators},constructor:function(flags){this._flags=flags||defaultFlags},makeToken:function(type,val){return{t:type,v:val}},isBreaker:function(expression,pos){if(this.isComment(expression,pos)){return true}var c=expression[pos];return breakingSigns.has(c)},isNumber:function(c){return c>="0"&&c<="9"},isOpeningString:function(c){return c==='"'||c==="'"},isPunc:function(c){return c===","||c===":"},isComment:function(expression,start){return expression[start]===commentPrefix},readNumber:function(expression,start){var pos=start;var alreadyGotDot=false;while(expression[pos]==="."||!this.isBreaker(expression,pos)){var c=expression[pos];var isDot=c===".";if(!this.isNumber(c)&&!isDot){throw new Errors.IllegalExpression(expression,"Invalid syntax (non-digits inside a number)",this.lineIndex)}if(isDot){if(alreadyGotDot){throw new Errors.IllegalExpression(expression,"Invalid syntax (multiple decimal marks in float)",this.lineIndex)}alreadyGotDot=true}pos++}return[expression.substr(start,pos-start),pos-1]},readOperator:function(expression,start){var currSeg=expression.substr(start,10);for(var i=0;i<wordsOperators.length;++i){var currOp=wordsOperators[i];if(currSeg.indexOf(currOp+" ")===0){return[currOp,start+currOp.length-1]}}for(var i=0;i<signOperators.length;++i){var curr=signOperators[i];if(currSeg.substr(0,curr.length)===curr){return[curr,start+curr.length-1]}}return null},readString:function(expression,start){var quote=expression[start]==='"'?'"':"'";var i=start;var lastC;var c;while(c=expression[++i]){lastC=c;if(c===quote&&lastC!=="\\")break}if(c===undefined){throw new Errors.IllegalExpression(expression,"EOL while scanning string literal.",this.lineIndex)}var val=expression.substr(start,i-start+1);return[val,i]},readPunctuation:function(expression,start){return[expression[start],start]},readComment:function(expression,start){var pos=start;while(expression[pos]!==undefined&&expression[pos]!=="\n"){pos++}return["",pos]},readWord:function(expression,start){var pos=start;while(!this.isBreaker(expression,pos)){pos++}var word=expression.substr(start,pos-start);return[word,pos-1]},parseExpression:function(expression){var ret=[];var lastC;var c;this.lineIndex=1;var skipNextLineBreak=false;var lastBlockIndent=0;var wasLineBreak=false;var inlineBlocks=0;var spacesInRow=0;for(var i=0;i<expression.length;++i){if(expression[i]===" "){if(wasLineBreak)spacesInRow++;continue}if(expression[i]==="\t"){if(wasLineBreak)spacesInRow+=this._flags.spacesNeededForBlockIndent;continue}if(wasLineBreak){if(inlineBlocks>0){lastBlockIndent-=inlineBlocks;ret.push(this.makeToken(TokenTypes.cblock,lastBlockIndent));inlineBlocks=0}else if(lastC!==";"){var spacesForIndent=this._flags.spacesNeededForBlockIndent;if(expression[i]!=="\n"){if(spacesInRow%spacesForIndent!==0){throw new Errors.SyntaxError("Bad block indent (spaces not multiply of "+this._flags.spacesNeededForBlockIndent+")",this.lineIndex)}var blockIndent=spacesInRow/spacesForIndent;if(blockIndent!==lastBlockIndent){ret.push(this.makeToken(TokenTypes.cblock,blockIndent));lastBlockIndent=blockIndent}}}spacesInRow=0}if(this.isComment(expression,i)){var tokenData=this.readComment(expression,i);i=tokenData[1];if(expression[i]){this.lineIndex++;wasLineBreak=true;ret.push(this.makeToken(TokenTypes.lbreak,"\n"))}continue}lastC=c;var c=expression[i];if(c===";"||c==="\n"){this.lineIndex++;if(skipNextLineBreak){skipNextLineBreak=false;continue}lastC=c;wasLineBreak=true;ret.push(this.makeToken(TokenTypes.lbreak,c));continue}else if(c==="\\"){if(expression[i+1]!=="\n"){throw new Errors.SyntaxError("Invalid character after \\ sign.",this.lineIndex)}skipNextLineBreak=true;continue}if(lastC===":"){ret.push(this.makeToken(TokenTypes.lbreak,";"));lastBlockIndent++;ret.push(this.makeToken(TokenTypes.cblock,lastBlockIndent));inlineBlocks++}wasLineBreak=false;if(c==="("||c===")"){ret.push(this.makeToken("o",c));continue}if(this.isPunc(c)){var tokenData=this.readPunctuation(expression,i);var token=tokenData[0];i=tokenData[1];ret.push(this.makeToken(TokenTypes.punctuation,token));continue}if(this.isNumber(c)){var tokenData=this.readNumber(expression,i);var token=tokenData[0];i=tokenData[1];ret.push(this.makeToken(TokenTypes.number,token));continue}var tokenData=this.readOperator(expression,i);if(tokenData){var token=tokenData[0];i=tokenData[1];ret.push(this.makeToken(TokenTypes.operator,token));continue}if(this.isOpeningString(c)){var tokenData=this.readString(expression,i);var token=tokenData[0];i=tokenData[1];ret.push(this.makeToken(TokenTypes.string,token));continue}var tokenData=this.readWord(expression,i);var token=tokenData[0];i=tokenData[1];if(token===""){throw new Errors.IllegalExpression(expression,"Invalid or unexpected token '"+c+"'!",this.lineIndex)}ret.push(this.makeToken(TokenTypes.identifier,token))}Console.debug("Lexer parsed",ret);return ret}});module.exports=Lexer},{"./../console":7,"./../dependencies/jsface":24,"./../errors":28,"./../utils":79,"./default_flags":2,"./tokens":6}],5:[function(require,module,exports){"use strict";var Errors=require("./../errors");var symbols={};var Utils=require("./../utils");var LanguageDefs=require("./../language/defs");var wordOperators=Utils.toSet(Object.keys(LanguageDefs.keywords));var TokenTypes=require("./tokens");var gscope={i:0,tokens:[],line:undefined};var defineSymbol=function(id,nud,lbp,led){var sym=symbols[id]||{};symbols[id]={lbp:sym.lbp||lbp,nud:sym.nud||nud,led:sym.lef||led}};var defineInfix=function(id,lbp,rbp,led){rbp=rbp||lbp;defineSymbol(id,null,lbp,led||function(left){return{type:id,left:left,right:parseExpression(rbp)}})};var definePrefix=function(id,rbp){defineSymbol(id,function(){return{type:id,right:parseExpression(rbp)}})};defineSymbol(",");defineSymbol("blockopen",function(val){return val});defineSymbol("number",function(number){return number});defineSymbol("string",function(str){return str});defineSymbol("identifier",function(name){var token=currToken();if(token&&token.type==="("&&!wordOperators.has(name.value)){var args=[];if(gscope.tokens[gscope.i+1].v===")"){popToken()}else{do{popToken();if(!currToken()){throw new Errors.SyntaxError("Missing closing parenthesis ')'")}args.push(parseExpression(2))}while(currToken()&&currToken().type===",");if(!currToken()||currToken().type!==")"){throw new Errors.SyntaxError("Missing closing parenthesis ')'")}}popToken();return{type:"call",args:args,name:name.value}}return name});defineSymbol("(",function(){var value=parseExpression(2);if(currToken().type!==")")new Errors.SyntaxError("Missing closing parenthesis!");popToken();return value});defineSymbol(")");definePrefix("-",10);definePrefix("+",10);definePrefix("not",3);definePrefix("for",10);defineInfix("*",7);defineInfix("**",9,8);defineInfix("/",7);defineInfix("+",6);defineInfix("-",6);defineInfix("%",7);defineInfix("|",4,4);defineInfix("&",5,5);defineInfix("or",3);defineInfix("and",3);defineInfix("in",4);defineInfix("not in",4);defineInfix("is",4);defineInfix("is not",4);defineInfix("==",4);defineInfix("!=",4);defineInfix(">=",4);defineInfix("<=",4);defineInfix("<",4);defineInfix(">",4);defineInfix(".",13);defineInfix("=",1,2,function(left){if(left.type==="call"){for(var i=0;i<left.args.length;i++){if(left.args[i].type!=="identifier")throw new Errors.SyntaxError("Invalid argument name '"+left.args[i].value+"'!")}return{type:"function",name:left.name,args:left.args,value:parseExpression(2)}}else if(left.type==="identifier"){return{type:"assign",name:left.value,value:parseExpression(2)}}else throw new Errors.SyntaxError("Can't assign to literal!")});var assignmentWith=["+","-","*","/","|","&","%"];for(var i=0;i<assignmentWith.length;++i){(function(operator){defineInfix(operator+"=",1,2,function(left){if(left.type==="call"){for(var i=0;i<left.args.length;i++){if(left.args[i].type!=="identifier")throw new Errors.SyntaxError("Invalid argument name '"+left.args[i].value+"'!")}return{type:"function",name:left.name,args:left.args,value:parseExpression(2)}}else if(left.type==="identifier"){return{type:"assign+",op:operator,name:left.value,value:parseExpression(2)}}else throw new Errors.SyntaxError("Can't assign to literal!")})})(assignmentWith[i])}var tokenToSymbol=function(token){var type;switch(token.t){case TokenTypes.operator:case TokenTypes.punctuation:if(token.v===":"){type="blockopen"}else{type=token.v}break;case TokenTypes.number:type="number";break;case TokenTypes.identifier:type="identifier";break;case TokenTypes.string:type="string";break;default:throw new Errors.SyntaxError("Unknown token type '"+token.t+"'!")}var sym=Object.create(symbols[type]);sym.type=type;sym.value=token.v;return sym};var currToken=function(){return gscope.tokens[gscope.i]?tokenToSymbol(gscope.tokens[gscope.i]):null};var popToken=function(){var ret=currToken();gscope.i++;return ret};var parseExpression=function(rbp){if(rbp===undefined){rbp=0}var t=popToken();if(t===null){return}if(!t.nud){throw new Errors.SyntaxError("Unexpected token: "+t.type)}var left=t.nud(t);while(currToken()&&rbp<currToken().lbp){t=popToken();if(!t.led){throw new Errors.SyntaxError("Unexpected token: "+t.type)}left=t.led(left)}return left};function parse(tokens,line){gscope.tokens=tokens;gscope.i=0;gscope.line=line;try{var parseTree=[];while(currToken()){parseTree.push(parseExpression())}return parseTree}catch(e){if(e.expectedError){if(e.line===undefined){e.message+=" [at line: "+gscope.line+"]";e.line=gscope.line}throw e}throw new Errors.SyntaxError("Unknown syntax error!",gscope.line)}}module.exports={parse:parse}},{"./../errors":28,"./../language/defs":34,"./../utils":79,"./tokens":6}],6:[function(require,module,exports){module.exports={punctuation:"p",number:"n",string:"s",identifier:"v",operator:"o",lbreak:"b",cblock:"_"}},{}],7:[function(require,module,exports){"use strict";module.exports={log:function(){},debug:function(){},warn:function(){},info:function(){},bindToNativeConsole:function(){this.log=function(){console.log("AdderScript.log>",arguments)};this.debug=function(){console.debug("AdderScript.debug>",arguments)};this.warn=function(){console.warn("AdderScript.warn>",arguments)};this.info=function(){console.info("AdderScript.info>",arguments)}}}},{}],8:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Executable=require("./executable");var Block=Class(Executable,{constructor:function(context){Block.$super.call(this,context,null);this._executables=[]},execute:function(){var scope=this._context.getScope();var lastExecutable=null;for(var i=0;i<this._executables.length;++i){if(scope.calledReturn){break}else if(scope.calledContinue){break}var curr=this._executables[i];if(lastExecutable){if(lastExecutable.isBreakingBlock){return}if(lastExecutable.skipFollowingBlock&&curr.constructor===Block){continue}}this._context._interpreter.evalStatement(curr);lastExecutable=curr}},addStatement:function(statement){statement.setParentBlock(this,this._executables.length);this._executables.push(statement);this._lastStatement=statement},addBlock:function(block){var lastExecutable=this._executables[this._executables.length-1];if(lastExecutable===undefined){throw new Errors.SyntaxError("Unexpected new block indent!")}lastExecutable.setFollowingBlock(block);block.setParentBlock(this,this._executables.length);this._executables.push(block)},getChildren:function(){return this._executables},getDebugBlocksView:function(indent){indent=indent||1;var indentPrefix="";for(var i=0;i<indent;++i){indentPrefix+=" "}var ret="block:"+"\n";for(var i=0;i<this._executables.length;++i){var curr=this._executables[i];if(curr.type==="block"){ret+=indentPrefix+curr.getDebugBlocksView(indent+1)+"\n"}else{ret+=indentPrefix+curr.getRepr()+"\n"}}ret+=indentPrefix+"end_block"+"\n";return ret},type:"block"});module.exports=Block},{"./../dependencies/jsface":24,"./../errors":28,"./executable":12}],9:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Variable=require("./variable");var Utils=require("./../utils");var BuiltinFunction=Class({constructor:function(){},__imp:function(args){throw Errors.NotImplemented()},execute:function(args,obj){try{return this.__imp.apply(obj,args)}catch(e){if(e.expectedError){throw e}throw new Errors.InternalError("Exception in built-in function!",e)}},__isAdderObject:true,isFunction:true,isBuiltinFunc:true,deterministic:true,requiredArgs:0,optionalArgs:0,toString:function(){return"<"+this.identifier+">"},toRepr:function(){return this.toString()},$static:{create:function(func,mandatoryParams,optionalParams,deterministic){var type=Class(BuiltinFunction,{__imp:func,requiredArgs:mandatoryParams||null,optionalArgs:optionalParams||null,deterministic:deterministic===undefined?true:deterministic});return new type},getArgumentsOrListContent:function(context,args){if(args.length===1){if(args[0].type==="list"){return args[0]._value._list}else if(args[0].type==="set"){var ret=Utils.toArray(args[0]._value._set);return Variable.makeVariables(context,ret)}}return args}}});module.exports=BuiltinFunction},{"./../dependencies/jsface":24,"./../errors":28,"./../utils":79,"./variable":22}],10:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Scope=require("./scope");var Utils=require("./../utils");var Variable=require("./variable");var Context=Class({constructor:function(interpreter,stackLimit,maxVarsInScope){this._interpreter=interpreter;this._globals=new Scope(this,0,null,maxVarsInScope);this._currScope=this._globals;this._stackLimit=stackLimit;this._maxVarsPerScope=maxVarsInScope;this._readonly=new Set;this._stack=[];this.stackPush()},getCurrBlockType:function(){return this._currScope._type},clearStack:function(){while(this._stack.length>1){this.stackPop()}},reset:function(){this.clearStack();for(var key in this._globals._vars){if(!this._readonly.has(key)){this._globals.remove(key)}}},stackPush:function(type){var scope=this._stack.length===0?this._globals:new Scope(this,this._stack.length,type,this._maxVarsPerScope);this._stack.push({scope:scope,breakAccess:type==="function"});if(this._stack.length>this._stackLimit){throw new Errors.StackOverflow(this._stackLimit)}this._currScope=this._stack[this._stack.length-1].scope},stackPop:function(){var thisScope=this._currScope;var parentScope=this._globals;if(this._stack.length>1&&!this._stack[this._stack.length-1].breakAccess){parentScope=this._stack[this._stack.length-2].scope;for(var key in thisScope._vars){parentScope.setVar(key,thisScope._vars[key])}}parentScope.returnValue=thisScope.returnValue;for(var key in thisScope._vars){if(this._globals._vars[key]!==undefined){this._globals.setVar(key,thisScope._vars[key])}}this._stack.pop();if(this._stack.length===0){throw new Errors.RuntimeError("Invalid return statements at global block!")}this._currScope=this._stack[this._stack.length-1].scope},remove:function(varName){if(this._readonly.has(varName)){throw new Errors.RuntimeError("Cannot delete readonly variable '"+varName+"'!")}var scopes=this._getSharedScopes();for(var i=0;i<scopes.length;++i){scopes[i].remove(varName)}},_getSharedScopes:function(){var ret=[this.getScope()];for(var i=this._stack.length-2;i>0;--i){var curr=this._stack[i];ret.push(curr.scope);if(curr.breakAccess){break}}if(this._stack.length>0){ret.push(this._globals)}return ret},getScope:function(){return this._currScope},getVar:function(key,object){if(object!==undefined){if(!object.__isAdderObject){object=Variable.makeAdderObjects(this,object);if(!object.isSimple){object=object._value}}var resultObj=object&&object.api?object.api[key]:undefined;if(resultObj===undefined){throw new Errors.RuntimeError("Object '"+(object.name||object.type||object.identifier||typeof object)+"' has no attribute '"+key+"'.")}return resultObj}var val;for(var i=this._stack.length-1;i>0&&val===undefined;--i){val=this._stack[i].scope.getVar(key,object);if(this._stack[i].breakAccess){break}}if(val===undefined){val=this._globals.getVar(key,object)}if(val===undefined){throw new Errors.UndefinedVariable(key)}return val},exist:function(key,object){var val=this.getScope().getVar(key,object);if(val===undefined){val=this._globals.getVar(key,object)}return val!==undefined},setVar:function(key,val,readonly,force){if(readonly&&this._stack.length>1){throw new Errors.RuntimeError("Cannot set readonly variable outside global scope. Variable key: '"+key+"'.")}if(this._readonly.has(key)&&!force){throw new Errors.RuntimeError("Trying to override readonly variable or reserved word: '"+key+"'.")}if(readonly){this._readonly.add(key)}return this.getScope().setVar(key,val,readonly,force)},createVariable:function(val,forceNew){return Variable.makeVariables(this,val,forceNew)},getAllIdentifiers:function(){var scopes=this._getSharedScopes();var ret=[];for(var i=0;i<scopes.length;++i){ret=ret.concat(scopes[i].getAllIdentifiers())}ret=Utils.toArray(Utils.toSet(ret));return ret}});module.exports=Context},{"./../dependencies/jsface":24,"./../errors":28,"./../utils":79,"./scope":18,"./variable":22}],11:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Variable=require("./variable");var BuiltinFunc=require("./builtin_func");var Utils=require("./../utils");var _Object=require("./object");var List=require("./list");function validate_len(dict){if(Object.keys(dict._dict).length>dict._context._interpreter._flags.maxContainersLen){throw new Errors.ExceedMemoryLimit("Dictionary exceeded maximum container length ("+dict._context._interpreter._flags.maxContainersLen+")")}}var apiFuncs={clone:function(){var ret=new Dict(this._context);for(var key in this._dict){ret.set(Variable.makeVariables(this._context,key),this._dict[key])}return ret},keys:function(){return new List(this._context,Object.keys(this._dict))},values:function(){var ret=[];for(var key in this._dict){ret.push(this._dict[key])}return ret},len:function(){return Object.keys(this._dict).length},empty:function(){return this.len()===0},set:function(key,value){if(!key.isSimple){throw new Errors.RuntimeError("Invalid key type '"+key.type+"'. Dictionary keys can only be strings, numbers, booleans or none.")}this._dict[key._value]=value;validate_len(this);this._context._interpreter.updateMemoryUsage(value._estimatedSize+key.length)},get:function(key,defaultVal){return this._dict[key._value]||defaultVal},remove:function(key){delete this._dict[key._value]},clear:function(){this._dict={}},has:function(key){return this._dict[key._value]!==undefined},extend:function(other){if(other.type!=="dict"){throw new Errors.RuntimeError("Dict 'extend()' expecting another dictionary as param ('"+other.type+"' given).")}other=other._value;for(var key in other._dict){this._dict[key]=other._dict[key]}}};var Dict=Class(_Object,{constructor:function(context,startingDict){Dict.$super.call(this,context);this._dict=startingDict||{}},forEach:function(callback,obj){for(var key in this._dict){if(callback.call(obj,key)===false){return}}},api:{clone:BuiltinFunc.create(apiFuncs.clone,0,0,false),keys:BuiltinFunc.create(apiFuncs.keys,0,0,false),values:BuiltinFunc.create(apiFuncs.values,0,0,false),len:BuiltinFunc.create(apiFuncs.len,0,0,false),_set:BuiltinFunc.create(apiFuncs.set,2,0,false),_get:BuiltinFunc.create(apiFuncs.get,1,1,false),remove:BuiltinFunc.create(apiFuncs.remove,1,0,false),clear:BuiltinFunc.create(apiFuncs.clear,0,0,false),empty:BuiltinFunc.create(apiFuncs.empty,0,0,false),has:BuiltinFunc.create(apiFuncs.has,1,0,false),extend:BuiltinFunc.create(apiFuncs.extend,1,0,false)},toString:function(){var ret=[];for(var key in this._dict){ret.push('"'+key+'": '+this._dict[key].toString())}return ret.join(",")},toRepr:function(){return"dict("+this.toString()+")"},toNativeJs:function(){var ret={};for(var key in this._dict){ret[key]=this._dict[key].toNativeJs()}return ret},name:"dict",type:"dict"});_Object.initBuiltinApi(Dict);module.exports=Dict},{"./../dependencies/jsface":24,"./../errors":28,"./../utils":79,"./builtin_func":9,"./list":15,"./object":17,"./variable":22}],12:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Executable=Class({constructor:function(context){this._context=context;this._parentBlock=null;this._followingBlock=null;this._position=-1},execute:function(){throw new Errors.NotImplemented},setParentBlock:function(block,position){this._parentBlock=block;this._position=position},setFollowingBlock:function(block){this._followingBlock=block},type:"executable"});module.exports=Executable},{"./../dependencies/jsface":24}],13:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Variable=require("./variable");var Lexer=require("./../compiler/lexer");function setNodeOptimizedVal(node,val){node.type=typeof val;node.value=val;node.wasOptimized=true;delete node.left;delete node.right}var opFuncs={"*":function(exp,a,b){return a*b},"/":function(exp,a,b){return a/b},"+":function(exp,a,b){return b===undefined?+a:a+b},"-":function(exp,a,b){return b===undefined?-a:a-b},"|":function(exp,a,b){return a|b},"&":function(exp,a,b){return a&b},"%":function(exp,a,b){return a%b},or:function(exp,a,b){return a||b},and:function(exp,a,b){return a&&b},in:function(exp,a,b){a=Variable.makeVariables(exp._context,a);b=Variable.makeAdderObjects(exp._context,b);if(!b.has){throw new Errors.RuntimeError(exp._context,"Object "+(b.type||"undefined")+" does not support 'in' operator!")}return b.has(a)},"not in":function(exp,a,b){a=Variable.makeVariables(exp._context,a);b=Variable.makeAdderObjects(exp._context,b);if(!b.has){throw new Errors.RuntimeError(exp._context,"Object "+(b.type||"undefined")+" does not support 'in' operator!")}return!b.has(a)},not:function(exp,a){return!a},"**":function(exp,a,b){return Math.pow(a,b)},"<":function(exp,a,b){return a<b},">":function(exp,a,b){return a>b},"<=":function(exp,a,b){return a<=b},">=":function(exp,a,b){return a>=b},"==":function(exp,a,b){a=Variable.makeVariables(exp._context,a);b=Variable.makeVariables(exp._context,b);return Variable.equal(a,b)},is:function(exp,a,b){return a===b},"is not":function(exp,a,b){return a!==b},"!=":function(exp,a,b){a=Variable.makeVariables(exp._context,a);b=Variable.makeVariables(exp._context,b);return!Variable.equal(a,b)}};var Expression=Class({constructor:function(context,ast){this._context=context;this._ast=ast},parseNode:function(node,currObj,returnAsVar){if(node===undefined){throw new Errors.SyntaxError("Unexpected EOL or missing argument!")}switch(node.type){case".":var leftObj=this.parseNode(node.left);return this.parseNode(node.right,leftObj);break;case"number":return parseFloat(node.value);case"boolean":return node.value;case"object":return node.value;case"string":var ret=String(node.value);if(ret[0]==='"'||ret[0]==="'"){ret=ret.substr(1,ret.length-2)}return ret;case"identifier":var value=this._context.getVar(node.value,currObj);if(!returnAsVar){var readonly=true;if(value._value!==undefined){readonly=value._scopeData.readonly;value=value._value}if(readonly){setNodeOptimizedVal(node,value)}}return value;case"assign":return this._context.setVar(node.name,this.parseNode(node.value));case"assign+":var opFunc=opFuncs[node.op];if(!opFunc){throw new Errors.SyntaxError("Unknown operator '"+node.op+"='.")}var _var=this._context.getVar(node.name,currObj);var a=_var._value;var b=this.parseNode(node.value);if(b&&b._value!==undefined){b=b._value}var result=opFunc(this,a,b);return(_var._scopeData.scope||this._context).setVar(node.name,result);case"call":var func=this._context.getVar(node.name,currObj);var args=[];var isAllSimple=true;for(var i=0;i<node.args.length;i++){var arg=this.parseNode(node.args[i],undefined,true);args.push(arg);if(arg&&typeof arg==="object"&&!arg.wasOptimized){isAllSimple=false}}var ret=this._context._interpreter.callFunction(func,args,currObj);if(func.deterministic&&typeof ret!=="object"&&isAllSimple){setNodeOptimizedVal(node,ret)}return ret;default:if(opFuncs[node.type]){var opFunc=opFuncs[node.type];var ret;if(node.left){var l=this.parseNode(node.left);var r=this.parseNode(node.right);if(l&&l._value!==undefined){l=l._value}if(r&&r._value!==undefined){r=r._value}ret=opFunc(this,l,r)}else{var r=this.parseNode(node.right);if(r&&r._value!==undefined){r=r._value}return opFunc(this,r)}if(node.wasOptimized===undefined){if((!node.left||node.left.type==="string"||node.left.type==="number")&&(node.right.type==="string"||node.right.type==="number")){setNodeOptimizedVal(node,ret)}else{node.wasOptimized=false}}return ret}return node}},eval:function(){return this.parseNode(this._ast)}});module.exports=Expression},{"./../compiler/lexer":4,"./../dependencies/jsface":24,"./../errors":28,"./variable":22}],14:[function(require,module,exports){"use strict";var core={Statement:require("./statement"),Expression:require("./expression"),Scope:require("./scope"),Object:require("./object"),Context:require("./context"),Block:require("./block"),Variable:require("./variable"),BuiltinFunc:require("./builtin_func"),List:require("./list"),Set:require("./set"),Dict:require("./dict"),Module:require("./module")};for(var key in core){core[key].prototype.identifier="core."+key}module.exports=core},{"./block":8,"./builtin_func":9,"./context":10,"./dict":11,"./expression":13,"./list":15,"./module":16,"./object":17,"./scope":18,"./set":19,"./statement":20,"./variable":22}],15:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var _Object=require("./object");var Variable=require("./variable");var BuiltinFunc=require("./builtin_func");function validate_len(list){if(list._list.length>list._context._interpreter._flags.maxContainersLen){throw new Errors.ExceedMemoryLimit("List exceeded maximum container length ("+list._context._interpreter._flags.maxContainersLen+")")}}var apiFuncs={clone:function(){return new List(this._context,this._list)},empty:function(){return this._list.length===0},to_set:function(){return new _Set(this._context,this._list)},len:function(){return this._list.length},append:function(item){this._list.push(item);validate_len(this);this._context._interpreter.updateMemoryUsage(item._estimatedSize);return this},has:function(item){return this.index(item)!==-1},clear:function(){this._list=[]},count:function(item){var ret=0;for(var i=0;i<this._list.length;++i){if(Variable.equal(this._list[i],item)){ret++}}return ret},extend:function(other){if(other.type!=="list"){throw new Errors.RuntimeError("List 'extend()' expecting another list as param ('"+other.type+"' given).")}this._list=this._list.concat(other._value._list);validate_len(this);return this},index:function(item){for(var i=0;i<this._list.length;++i){if(Variable.equal(this._list[i],item)){return i}}return-1},insert:function(item,position){this._list.splice(position,0,item);validate_len(this);return item},join:function(str){var connector=(str?str._value:str)||undefined;return this._list.map(function(x){return x._value}).join(connector)},pop:function(index){var ret;if(index===undefined){ret=this._list.pop()}else{ret=this._list.splice(index,1)[0]}if(ret===undefined){return new Variable(this._context,null)}return ret},shift:function(){return this._list.shift()||new Variable(this._context,null)},remove:function(item){var index=this.index(item);if(index!==-1){this._list.splice(index,1);return true}return false},reverse:function(){this._list.reverse()},slice:function(start,end){var sub=this._list.slice(start,end);return new List(this._context,sub)},sort:function(){this._list.sort()},at:function(index){if(index.type!=="number"){throw new Errors.RuntimeError("List 'at()' must receive a number as param (got '"+index.type+"' instead).")}index=Math.round(index._value);if(index<0){index=this._list.length+index}if(index>=this._list.length){throw new Errors.RuntimeError("Index out of list range!")}return this._list[index]}};var List=Class(_Object,{constructor:function(context,args){List.$super.call(this,context);args=Variable.makeVariables(context,args);this._list=args?args.slice(0):[];validate_len(this)},forEach:function(callback,obj){for(var i=0;i<this._list.length;++i){if(callback.call(obj,this._list[i])===false){return}}},api:{clone:BuiltinFunc.create(apiFuncs.clone,0,0,false),empty:BuiltinFunc.create(apiFuncs.empty,0,0,false),to_set:BuiltinFunc.create(apiFuncs.to_set,0,0,false),len:BuiltinFunc.create(apiFuncs.len,0,0,false),shift:BuiltinFunc.create(apiFuncs.shift,0,0,false),append:BuiltinFunc.create(apiFuncs.append,1,0,false),has:BuiltinFunc.create(apiFuncs.has,1,0,false),clear:BuiltinFunc.create(apiFuncs.clear,0,0,false),count:BuiltinFunc.create(apiFuncs.count,1,0,false),extend:BuiltinFunc.create(apiFuncs.extend,1,0,false),index:BuiltinFunc.create(apiFuncs.index,1,0,false),insert:BuiltinFunc.create(apiFuncs.insert,2,0,false),pop:BuiltinFunc.create(apiFuncs.pop,0,1,false),remove:BuiltinFunc.create(apiFuncs.remove,1,0,false),reverse:BuiltinFunc.create(apiFuncs.reverse,0,0,false),slice:BuiltinFunc.create(apiFuncs.slice,1,1,false),join:BuiltinFunc.create(apiFuncs.join,0,1,false),sort:BuiltinFunc.create(apiFuncs.sort,0,0,false),at:BuiltinFunc.create(apiFuncs.at,1,0,false)},toString:function(){var params=this._list.map(function(x){return x.toString()});return params.join(",")},toRepr:function(){return"list("+this.toString()+")"},toNativeJs:function(){var ret=[];for(var i=0;i<this._list.length;++i){ret.push(this._list[i].toNativeJs())}return ret},name:"list",type:"list"});_Object.initBuiltinApi(List);module.exports=List;var _Set=require("./set")},{"./../dependencies/jsface":24,"./../errors":28,"./builtin_func":9,"./object":17,"./set":19,"./variable":22}],16:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var _Object=require("./object");var Module=Class(_Object,{constructor:function(context,identifier){this.identifier=identifier||this.identifier;Module.$super.call(this,context);if(!this.__proto__._wasInit){this.__proto__._wasInit=true;for(var key in this.api){var curr=this.api[key];if(curr&&curr.identifier){curr.identifier=this.identifier+"."+key}}}},isSafe:false,name:"module",type:"module",version:"1.0.0"});module.exports=Module},{"./../dependencies/jsface":24,"./../errors":28,"./object":17}],17:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Variable=require("./variable");var Utils=require("./../utils");var BuiltinFunc=require("./builtin_func");var _Object=Class({constructor:function(context){this._context=context},setAttr:function(key,value){if(value.constructor!==Variable){value=new Variable(this._context,value)}this.api[key]=value},toNativeJs:function(){return this.toString()},toRepr:function(){return this.toString()},getAttr:function(key){return this.api[key]},api:{},_objectApi:{str:BuiltinFunc.create(function(){return this.toString?this.toString():this.type},0,0)},name:"object",type:"object",__isAdderObject:true,toString:function(){return"<"+this.identifier+">"},$static:{initBuiltinApi:function(obj){obj=obj.prototype;for(var key in obj._objectApi){if(obj.api[key]===undefined){obj.api[key]=obj._objectApi[key]}}if(obj.api._get){obj.api.get=obj.api._get;delete obj.api._get}if(obj.api._set){obj.api.set=obj.api._set;delete obj.api._set}for(var key in obj.api){var curr=obj.api[key];if(curr.isBuiltinFunc){(function(key){obj[key]=function(){return this.api[key].execute.call(this.api[key],arguments,this)}})(key)}}}}});module.exports=_Object},{"./../dependencies/jsface":24,"./../errors":28,"./../utils":79,"./builtin_func":9,"./variable":22}],18:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Variable=require("./variable");var Console=require("./../console");var Scope=Class({constructor:function(context,depth,type,maxVars){this._context=context;this._type=type||"block";this._maxVars=maxVars||1e5;this._vars={};this._varKeys=new Set;this._readonly={};this._depth=depth;this.calledReturn=false;this.returnValue=null;this.calledContinue=false;this.calledBreak=false},setVar:function(key,val,readonly,force){val=Variable.makeAdderObjects(this._context,val,true);val.setScopeData(this,key,readonly);if(!force){this._context._interpreter.updateMemoryUsage(val._estimatedSize)}this._vars[key]=val;this._varKeys.add(key);if(!force&&this._varKeys.size>this._maxVars){throw new Errors.ExceedMemoryLimit("Exceeded scope size limit of "+this._maxVars+" variables!")}return val},remove:function(key){delete this._vars[key];this._varKeys.delete(key)},getVar:function(key,object){return this._vars[key]},getAllIdentifiers:function(){return Object.keys(this._vars)}});module.exports=Scope},{"./../console":7,"./../dependencies/jsface":24,"./../errors":28,"./variable":22}],19:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Variable=require("./variable");var BuiltinFunc=require("./builtin_func");var Utils=require("./../utils");var _Object=require("./object");function validate_len(set){if(set._set.size>set._context._interpreter._flags.maxContainersLen){throw new Errors.ExceedMemoryLimit("Set exceeded maximum container length ("+set._context._interpreter._flags.maxContainersLen+")")}}var apiFuncs={clone:function(){return new _Set(this._context,Utils.toArray(this._set))},to_list:function(){var setAsList=Utils.toArray(this._set);return new List(this._context,setAsList)},len:function(){return this._set.size},join:function(str){return this.to_list().join(str)},empty:function(){return this._set.size===0},add:function(item){item=item._value;if(item&&typeof item==="object"){throw new Errors.RuntimeError("Cannot add objects to set(), only simple types (bool, string, number, or none).")}this._context._interpreter.updateMemoryUsage(item?item.length||4:1);this._set.add(item);validate_len(this);return this},clear:function(){this._set=new Set},has:function(item){return this._set.has(item._value)},extend:function(other){if(other.type!=="set"){throw new Errors.RuntimeError("Set 'extend()' expecting another set as param ('"+other.type+"' given).")}var _this=this;other._value._set.forEach(function(x){_this._set.add(x)});validate_len(this)},index:function(item){item=item._value;var BreakException={};var i=0;var ret=-1;try{this._set.forEach(function(x){if(x===item){ret=i;throw BreakException}i++})}catch(e){if(e!==BreakException)throw e}return ret},remove:function(item){return this._set.delete(item._value)}};var _Set=Class(_Object,{constructor:function(context,args){_Set.$super.call(this,context);this._set=new Set;for(var i=0;i<args.length;++i){var curr=args[i];this.add(curr)}},forEach:function(callback,obj){this._set.forEach(function(x){callback.call(obj,x)})},api:{clone:BuiltinFunc.create(apiFuncs.clone,0,0,false),to_list:BuiltinFunc.create(apiFuncs.to_list,0,0,false),len:BuiltinFunc.create(apiFuncs.len,0,0,false),add:BuiltinFunc.create(apiFuncs.add,1,0,false),clear:BuiltinFunc.create(apiFuncs.clear,0,0,false),empty:BuiltinFunc.create(apiFuncs.empty,0,0,false),has:BuiltinFunc.create(apiFuncs.has,1,0,false),extend:BuiltinFunc.create(apiFuncs.extend,1,0,false),index:BuiltinFunc.create(apiFuncs.index,1,0,false),remove:BuiltinFunc.create(apiFuncs.remove,1,0,false),join:BuiltinFunc.create(apiFuncs.join,0,1,false)},toString:function(){var params=Utils.toArray(this._set).map(function(x){return x.toString()});return params.join(",")},toRepr:function(){return"set("+this.toString()+")"},toNativeJs:function(){var ret=new Set;this._set.forEach(function(x){ret.add(x)});return ret},name:"set",type:"set"});_Object.initBuiltinApi(_Set);module.exports=_Set;var List=require("./list")},{"./../dependencies/jsface":24,"./../errors":28,"./../utils":79,"./builtin_func":9,"./list":15,"./object":17,"./variable":22}],20:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var Executable=require("./executable");var Statement=Class(Executable,{constructor:function(context,line){Statement.$super.call(this,context);this._line=line},$static:{getKeyword:function(){return null}},setPreviousStatement:function(statement){},getRepr:function(){return this.constructor.getKeyword()},openNewBlock:false,skipFollowingBlock:false,isBreakingBlock:false,type:"statement"});module.exports=Statement},{"./../dependencies/jsface":24,"./../errors":28,"./executable":12}],21:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var BuiltinFunc=require("./builtin_func");var api={};api.len=BuiltinFunc.create(function(){return this.length},0,0,false);api.split=BuiltinFunc.create(function(delimiter){delimiter=delimiter?delimiter._value:" ";return this.split(delimiter)},0,1,false);api.replace=BuiltinFunc.create(function(find,replace){find=find._value;replace=replace?replace._value:replace;return this.split(find).join(replace)},2,0,false);api.remove=BuiltinFunc.create(function(word){word=word._value;return this.split(word).join("")},1,0,false);api.index=BuiltinFunc.create(function(find){find=find._value;return this.indexOf(find)},1,0,false);api.has=BuiltinFunc.create(function(find){find=find._value;return this.indexOf(find)!==-1},1,0,false);api.count=BuiltinFunc.create(function(word){return this.split(word).length-1},1,1,false);api.trim=BuiltinFunc.create(function(){return this.trim()},0,0,false);api.hash=BuiltinFunc.create(function(){var hash=0,i,chr,len;if(this.length===0)return hash;for(i=0,len=this.length;i<len;i++){chr=this.charCodeAt(i);hash=(hash<<5)-hash+chr;hash|=0}return hash},0,0,false);api.ends_with=BuiltinFunc.create(function(word){word=word._value;return this.indexOf(word)===this.length-word.length},1,0,false);api.starts_with=BuiltinFunc.create(function(word){word=word._value;return this.indexOf(word)===0},1,0,false);api.is_alpha=BuiltinFunc.create(function(){return/^[a-zA-Z()]+$/.test(this)},0,0,false);api.is_digit=BuiltinFunc.create(function(){return/^\d+$/.test(this)},0,0,false);api.lower=BuiltinFunc.create(function(){return this.toLowerCase()},0,0,false);api.upper=BuiltinFunc.create(function(){return this.toUpperCase()},0,0,false);api.title=BuiltinFunc.create(function(){return this.replace(/\w\S*/g,function(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase()})},0,0,false);api.slice=BuiltinFunc.create(function(start,len){start=start._value;len=len?len._value:len;return this.substr(start,len)},1,1,false);module.exports=api},{"./../dependencies/jsface":24,"./../errors":28,"./builtin_func":9}],22:[function(require,module,exports){"use strict";var jsface=require("./../dependencies/jsface"),Class=jsface.Class,extend=jsface.extend;var Errors=require("./../errors");var LanguageDefs=require("./../language/defs");var Utils=require("./../utils");var simpleTypes=Utils.toSet(["string","number","boolean","none"]);var Variable=Class({constructor:function(context,value){this._context=context;if(value===null||value===undefined){value=null;this.type="none";this.isSimple=true;this._estimatedSize=1}else{if(value.isFunction){this.type="function";this.isSimple=false;this._estimatedSize=4}else if(typeof value==="number"&&isNaN(value)){this.type="NaN";this.isSimple=false;this._estimatedSize=4}else if(value.type){this.type=value.type;this.isSimple=false;this._estimatedSize=4}else{this.type=typeof value;if(this.type==="string"){var maxLen=this._context._interpreter._flags.maxStringLen;if(maxLen&&value.length>maxLen){throw new Errors.ExceedMemoryLimit("String exceeded length limit of "+maxLen+"!")}this._estimatedSize=value.length}else{this._estimatedSize=1}this.isSimple=true}}this.api=APIs[this.type];this._scopeData={};this._value=value},setScopeData:function(scope,name,readonly){this._scopeData={scope:scope,name:name,readonly:readonly}},$static:{isVariable:function(val){return val&&val.constructor===Variable},equal:function(a,b){if(a===b){return true}var typeA=a.type;var typeB=b.type;if(typeA!==typeB){return false}a=a._value;b=b._value;switch(typeA){case"NaN":return true;case"list":if(a.len()!==b.len()){return false}for(var i=0;i<a._list.length;++i){if(!Variable.equal(a._list[i],b._list[i])){return false}}return true;case"dict":var ak=a.keys();var bk=b.keys();if(ak.len()!==bk.len()){return false}for(var i=0;i<ak._list.length;++i){var key=ak._list[i]._value;if(!Variable.equal(a._dict[key],b._dict[key])){return false}}return true;case"set":if(a.len()!==b.len()){return false}a=a.to_list();b=b.to_list();for(var i=0;i<a._list.length;++i){if(!Variable.equal(a._list[i],b._list[i])){return false}}return true;default:return a===b}},is:function(a,b){if(a===b){return true}var typeA=a.type;var typeB=b.type;if(typeA!==typeB){return false}a=a._value;b=b._value;if(typeA==="NaN"){return true}if(a&&a.api){return a===b}return a===b},makeVariables:function(context,val,forceCreateNew){if(val instanceof Array){if(val.length===0){return val}for(var i=0;i<val.length;++i){val[i]=Variable.makeVariables(context,val[i],forceCreateNew)}return val}if(val&&val.constructor===Variable){if(forceCreateNew){return new Variable(context,val._value)}return val}return new Variable(context,val)},makeAdderObjects:function(context,val,forceCreateNew){if(val&&val.constructor===Variable){if(forceCreateNew){return new Variable(context,val._value)}return val}else if(val instanceof Array){for(var i=0;i<val.length;++i){val[i]=Variable.makeAdderObjects(context,val[i],forceCreateNew)}val=new _List(context,val)}else if(val&&val.constructor===Set){val=new _Set(context,Utils.toArray(val))}else if(val instanceof Object&&!val.__isAdderObject){for(var key in val){val[key]=Variable.makeAdderObjects(context,val[key],forceCreateNew)}val=new _Dict(context,val)}return new Variable(context,val)}},getValue:function(){return this._value},getType:function(){return this.type},deleteSelf:function(){if(!this._scopeData.scope){throw new Errors.RuntimeError("Cannot delete object '"+this.toString()+"'!")}this._context.remove(this._scopeData.name);this._scopeData={}},has:function(val){if(this._value===null||this._value===undefined){return false}if(this._value.has){return this._value.has(val)}if(val&&val.getValue){val=val._value}return String(this._value).indexOf(val)!==-1},toNativeJs:function(){var val=this._value;if(!val){return val}if(val.toNativeJs){return val.toNativeJs()}if(val.isFunction){return val.func||val.__imp}return val},toRepr:function(){var val=this._value;switch(this.type){case"string":return'"'+val+'"';case"number":return String(val);case"none":return LanguageDefs.keywords["null"];case"boolean":return LanguageDefs.keywords[String(val)];case"function":return val.toRepr();default:if(val&&val.toRepr){return val.toRepr()}return String(val)}},toString:function(){switch(this.type){case"string":return this._value;case"number":return String(this._value);case"none":return"";case"boolean":return LanguageDefs.keywords[String(this._value)];case"function":return this._value.toString();default:if(this._value&&this._value.toString){return this._value.toString()}return String(this._value)}}});module.exports=Variable;var _List=require("./list");var _Set=require("./set");var _Dict=require("./dict");var APIs={string:require("./string_api")}},{"./../dependencies/jsface":24,"./../errors":28,"./../language/defs":34,"./../utils":79,"./dict":11,"./list":15,"./set":19,"./string_api":21}],23:[function(require,module,exports){"use strict";module.exports={version:"1.0.2",about:"AdderScript is a lightweight minimalistic script language, aimed to execute untrusted code in a safe way.\nDesigned and built by Ronen Ness.",author:"Ronen Ness"}},{}],24:[function(require,module,exports){"use strict";!function(t,o,r,e,n,p,i,c,u,f){function s(t){return t&&typeof t===o&&!(typeof t.length===r&&!t.propertyIsEnumerable(e))&&t||null}function l(t){return t&&typeof t===o&&typeof t.length===r&&!t.propertyIsEnumerable(e)&&t||null}function y(t){return t&&"function"==typeof t&&t||null}function a(t){return y(t)&&t.prototype&&t===t.prototype.constructor&&t||null}function $(t,o,r,e){r&&r.hasOwnProperty(t)||(e[t]=o)}function b(t,o,r){if(l(o))for(var e=o.length;--e>=0;)b(t,o[e],r);else{r=r||{constructor:1,$super:1,prototype:1,$superp:1};var n,p,i=a(t),c=a(o),u=t.prototype;if(s(o)||i)for(n in o)$(n,o[n],r,t,i,u);if(c){p=o.prototype;for(n in p)$(n,p[n],r,t,i,u)}i&&c&&b(u,o.prototype,r)}}function g(t){var o,r;Object.freeze(t);for(r in t)o=t[r],t.hasOwnProperty(r)&&"object"==typeof o&&!Object.isFrozen(o)&&g(o)}function O(t,o){o||(o=t,t=0);var r,e,n,p,i,c,u,f,s,l,y,a=0,$={constructor:1,$singleton:1,$static:1,$statics:1,prototype:1,$super:1,$superp:1,main:1,toString:0},b=O.plugins;o=("function"==typeof o?o():o)||{},e=o.hasOwnProperty("constructor")?o.constructor:null,n=o.$singleton,p=o.$statics||o.$static;for(i in b)$[i]=1;for(t=!t||t instanceof Array?t:[t],u=t&&t.length,s=t[0],r=n?function(){}:e?e:function(){s&&s.apply(this,arguments)},!n&&u&&(l=s.prototype&&s===s.prototype.constructor&&s,l?(y=function(){},y.prototype=l.prototype,y.prototype.constructor=y,r.prototype=new y,r.prototype.constructor=r,l.prototype.constructor=l):r.prototype=s),c=n?r:r.prototype;u>a;){f=t[a++];for(i in f)$[i]||(r[i]=f[i]);if(!n&&0!==a)for(i in f.prototype)$[i]||(c[i]=f.prototype[i])}for(i in o)if(!$[i]){var g=o[i];g&&(g.get||g.set)?(g.enumerable=!0,Object.defineProperty(c,i,g)):c[i]=g}for(i in p)r[i]=p[i];f=t&&s||t,r.$super=f,r.$superp=f&&f.prototype||f;for(i in b)b[i](r,t,o);return"function"==typeof o.main&&o.main.call(r,r),