@khanacademy/kas 2.0.9 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/index.js +2 -2
- package/dist/es/index.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -9,13 +9,13 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
|
|
|
9
9
|
|
|
10
10
|
var ___default = /*#__PURE__*/_interopDefaultCompat(_);
|
|
11
11
|
|
|
12
|
-
const libName="@khanacademy/kas";const libVersion="2.
|
|
12
|
+
const libName="@khanacademy/kas";const libVersion="2.1.1";perseusUtils.addLibraryVersionToPerseusDebug(libName,libVersion);
|
|
13
13
|
|
|
14
14
|
var parser$1=function(){var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,11],$V1=[1,9],$V2=[8,17],$V3=[6,11],$V4=[6,11,13,17];var parser={trace:function trace(){},yy:{},symbols_:{"error":2,"unitvalue":3,"magnitude":4,"unit":5,"EOF":6,"float":7,"POW":8,"int":9,"multatoms":10,"DIV":11,"expatom":12,"MUL":13,"atom":14,"^":15,"nat":16,"ATOM":17,"FLOAT":18,"NAT":19,"NEG":20,"$accept":0,"$end":1},terminals_:{2:"error",6:"EOF",8:"POW",11:"DIV",13:"MUL",15:"^",17:"ATOM",18:"FLOAT",19:"NAT",20:"NEG"},productions_:[0,[3,3],[3,2],[4,3],[4,1],[5,3],[5,1],[10,3],[10,2],[10,1],[12,3],[12,1],[14,1],[7,1],[7,1],[16,1],[9,2],[9,1]],performAction:function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return {type:"unitMagnitude",magnitude:$$[$0-2],unit:$$[$0-1]};case 2:return {type:"unitStandalone",unit:$$[$0-1]};case 3:this.$=$$[$0-2]+"e"+$$[$0];break;case 4:case 13:case 14:case 15:case 17:this.$=$$[$0];break;case 5:this.$={num:$$[$0-2],denom:$$[$0]};break;case 6:this.$={num:$$[$0],denom:null};break;case 7:this.$=[$$[$0-2]].concat($$[$0]);break;case 8:this.$=[$$[$0-1]].concat($$[$0]);break;case 9:this.$=[$$[$0]];break;case 10:this.$={name:$$[$0-2],pow:$$[$0]};break;case 11:this.$={name:$$[$0],pow:1};break;case 12:this.$=yytext;break;case 16:this.$="-"+$$[$0];break}},table:[{3:1,4:2,5:3,7:4,10:5,12:8,14:10,16:7,17:$V0,18:[1,6],19:$V1},{1:[3]},{5:12,10:5,12:8,14:10,17:$V0},{6:[1,13]},{8:[1,14],17:[2,4]},{6:[2,6],11:[1,15]},o($V2,[2,13]),o($V2,[2,14]),o($V3,[2,9],{12:8,14:10,10:17,13:[1,16],17:$V0}),o([6,8,11,13,17],[2,15]),o($V4,[2,11],{15:[1,18]}),o([6,11,13,15,17],[2,12]),{6:[1,19]},{1:[2,2]},{9:20,19:[1,22],20:[1,21]},{10:23,12:8,14:10,17:$V0},{10:24,12:8,14:10,17:$V0},o($V3,[2,8]),{16:25,19:$V1},{1:[2,1]},{17:[2,3]},{19:[1,26]},{17:[2,17]},{6:[2,5]},o($V3,[2,7]),o($V4,[2,10]),{17:[2,16]}],defaultActions:{13:[2,2],19:[2,1],20:[2,3],22:[2,17],23:[2,5],26:[2,16]},parseError:function parseError(str,hash){if(hash.recoverable){this.trace(str);}else {throw new Error(str)}},parse:function parse(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext="",yylineno=0,yyleng=0,TERROR=2,EOF=1;var args=lstack.slice.call(arguments,1);var lexer=Object.create(this.lexer);var sharedState={yy:{}};for(var k in this.yy){if(Object.prototype.hasOwnProperty.call(this.yy,k)){sharedState.yy[k]=this.yy[k];}}lexer.setInput(input,sharedState.yy);sharedState.yy.lexer=lexer;sharedState.yy.parser=this;if(typeof lexer.yylloc=="undefined"){lexer.yylloc={};}var yyloc=lexer.yylloc;lstack.push(yyloc);var ranges=lexer.options&&lexer.options.ranges;if(typeof sharedState.yy.parseError==="function"){this.parseError=sharedState.yy.parseError;}else {this.parseError=Object.getPrototypeOf(this).parseError;}function lex(){var token;token=lexer.lex()||EOF;if(typeof token!=="number"){token=self.symbols_[token]||token;}return token}var symbol,state,action,r,yyval={},p,len,newState,expected;while(true){state=stack[stack.length-1];if(this.defaultActions[state]){action=this.defaultActions[state];}else {if(symbol===null||typeof symbol=="undefined"){symbol=lex();}action=table[state]&&table[state][symbol];}if(typeof action==="undefined"||!action.length||!action[0]){var errStr="";expected=[];for(p in table[state]){if(this.terminals_[p]&&p>TERROR){expected.push("'"+this.terminals_[p]+"'");}}if(lexer.showPosition){errStr="Parse error on line "+(yylineno+1)+":\n"+lexer.showPosition()+"\nExpecting "+expected.join(", ")+", got '"+(this.terminals_[symbol]||symbol)+"'";}else {errStr="Parse error on line "+(yylineno+1)+": Unexpected "+(symbol==EOF?"end of input":"'"+(this.terminals_[symbol]||symbol)+"'");}this.parseError(errStr,{text:lexer.match,token:this.terminals_[symbol]||symbol,line:lexer.yylineno,loc:yyloc,expected:expected});}if(action[0]instanceof Array&&action.length>1){throw new Error("Parse Error: multiple actions possible at state: "+state+", token: "+symbol)}switch(action[0]){case 1:stack.push(symbol);vstack.push(lexer.yytext);lstack.push(lexer.yylloc);stack.push(action[1]);symbol=null;{yyleng=lexer.yyleng;yytext=lexer.yytext;yylineno=lexer.yylineno;yyloc=lexer.yylloc;}break;case 2:len=this.productions_[action[1]][1];yyval.$=vstack[vstack.length-len];yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column};if(ranges){yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]];}r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args));if(typeof r!=="undefined"){return r}if(len){stack=stack.slice(0,-1*len*2);vstack=vstack.slice(0,-1*len);lstack=lstack.slice(0,-1*len);}stack.push(this.productions_[action[1]][0]);vstack.push(yyval.$);lstack.push(yyval._$);newState=table[stack[stack.length-2]][stack[stack.length-1]];stack.push(newState);break;case 3:return true}}return true}};var lexer=function(){var lexer={EOF:1,parseError:function parseError(str,hash){if(this.yy.parser){this.yy.parser.parseError(str,hash);}else {throw new Error(str)}},setInput:function(input,yy){this.yy=yy||this.yy||{};this._input=input;this._more=this._backtrack=this.done=false;this.yylineno=this.yyleng=0;this.yytext=this.matched=this.match="";this.conditionStack=["INITIAL"];this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0};if(this.options.ranges){this.yylloc.range=[0,0];}this.offset=0;return this},input:function(){var ch=this._input[0];this.yytext+=ch;this.yyleng++;this.offset++;this.match+=ch;this.matched+=ch;var lines=ch.match(/(?:\r\n?|\n).*/g);if(lines){this.yylineno++;this.yylloc.last_line++;}else {this.yylloc.last_column++;}if(this.options.ranges){this.yylloc.range[1]++;}this._input=this._input.slice(1);return ch},unput:function(ch){var len=ch.length;var lines=ch.split(/(?:\r\n?|\n)/g);this._input=ch+this._input;this.yytext=this.yytext.substr(0,this.yytext.length-len);this.offset-=len;var oldLines=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1);this.matched=this.matched.substr(0,this.matched.length-1);if(lines.length-1){this.yylineno-=lines.length-1;}var r=this.yylloc.range;this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:lines?(lines.length===oldLines.length?this.yylloc.first_column:0)+oldLines[oldLines.length-lines.length].length-lines[0].length:this.yylloc.first_column-len};if(this.options.ranges){this.yylloc.range=[r[0],r[0]+this.yyleng-len];}this.yyleng=this.yytext.length;return this},more:function(){this._more=true;return this},reject:function(){if(this.options.backtrack_lexer){this._backtrack=true;}else {return this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}return this},less:function(n){this.unput(this.match.slice(n));},pastInput:function(){var past=this.matched.substr(0,this.matched.length-this.match.length);return (past.length>20?"...":"")+past.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var next=this.match;if(next.length<20){next+=this._input.substr(0,20-next.length);}return (next.substr(0,20)+(next.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var pre=this.pastInput();var c=new Array(pre.length+1).join("-");return pre+this.upcomingInput()+"\n"+c+"^"},test_match:function(match,indexed_rule){var token,lines,backup;if(this.options.backtrack_lexer){backup={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done};if(this.options.ranges){backup.yylloc.range=this.yylloc.range.slice(0);}}lines=match[0].match(/(?:\r\n?|\n).*/g);if(lines){this.yylineno+=lines.length;}this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lines?lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+match[0].length};this.yytext+=match[0];this.match+=match[0];this.matches=match;this.yyleng=this.yytext.length;if(this.options.ranges){this.yylloc.range=[this.offset,this.offset+=this.yyleng];}this._more=false;this._backtrack=false;this._input=this._input.slice(match[0].length);this.matched+=match[0];token=this.performAction.call(this,this.yy,this,indexed_rule,this.conditionStack[this.conditionStack.length-1]);if(this.done&&this._input){this.done=false;}if(token){return token}else if(this._backtrack){for(var k in backup){this[k]=backup[k];}return false}return false},next:function(){if(this.done){return this.EOF}if(!this._input){this.done=true;}var token,match,tempMatch,index;if(!this._more){this.yytext="";this.match="";}var rules=this._currentRules();for(var i=0;i<rules.length;i++){tempMatch=this._input.match(this.rules[rules[i]]);if(tempMatch&&(!match||tempMatch[0].length>match[0].length)){match=tempMatch;index=i;if(this.options.backtrack_lexer){token=this.test_match(tempMatch,rules[i]);if(token!==false){return token}else if(this._backtrack){match=false;continue}else {return false}}else if(!this.options.flex){break}}}if(match){token=this.test_match(match,rules[index]);if(token!==false){return token}return false}if(this._input===""){return this.EOF}else {return this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}},lex:function lex(){var r=this.next();if(r){return r}else {return this.lex()}},begin:function begin(condition){this.conditionStack.push(condition);},popState:function popState(){var n=this.conditionStack.length-1;if(n>0){return this.conditionStack.pop()}else {return this.conditionStack[0]}},_currentRules:function _currentRules(){if(this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules}else {return this.conditions["INITIAL"].rules}},topState:function topState(n){n=this.conditionStack.length-1-Math.abs(n||0);if(n>=0){return this.conditionStack[n]}else {return "INITIAL"}},pushState:function pushState(condition){this.begin(condition);},stateStackSize:function stateStackSize(){return this.conditionStack.length},options:{},performAction:function anonymous(yy,yy_,$avoiding_name_collisions,YY_START){switch($avoiding_name_collisions){case 0:return 11;case 1:return "(";case 2:return ")";case 3:return 8;case 4:return 15;case 5:return 13;case 6:return 18;case 7:return 19;case 8:return 20;case 9:return 17;case 10:return 17;case 11:return 17;case 12:break;case 13:return 6;}},rules:[/^(?:\/)/,/^(?:\()/,/^(?:\))/,/^(?:(\*|x|\u00d7|\u2219|\u22c5|\u00b7)\s*10\s*\^)/,/^(?:\^)/,/^(?:\*)/,/^(?:[0-9]+\.[0-9]+)/,/^(?:[0-9]+)/,/^(?:-)/,/^(?:\u00b0( ?)[cCfF])/,/^(?:fl\.? oz\.?)/,/^(?:[\u00b5]?([A-Za-z-]+|[\u2103\u2109\u212b]))/,/^(?:\s+)/,/^(?:$)/],conditions:{"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}};return lexer}();parser.lexer=lexer;function Parser(){this.yy={};}Parser.prototype=parser;parser.Parser=Parser;return new Parser}();const unitParser=parser$1;
|
|
15
15
|
|
|
16
16
|
var parser=function(){var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,7],$V1=[1,17],$V2=[1,13],$V3=[1,14],$V4=[1,15],$V5=[1,32],$V6=[1,22],$V7=[1,23],$V8=[1,24],$V9=[1,25],$Va=[1,26],$Vb=[1,33],$Vc=[1,27],$Vd=[1,28],$Ve=[1,29],$Vf=[1,30],$Vg=[1,20],$Vh=[1,36],$Vi=[1,37],$Vj=[5,6,8,10,33,35,41,43,45],$Vk=[1,39],$Vl=[1,40],$Vm=[5,6,8,10,12,14,16,19,21,22,28,29,30,31,32,33,34,35,37,39,41,42,43,44,45,46],$Vn=[10,16,19,21,22,28,29,30,31,32,34,37,39,42,43,44,46],$Vo=[5,6,8,10,12,14,16,18,19,21,22,28,29,30,31,32,33,34,35,37,39,41,42,43,44,45,46];var parser={trace:function trace(){},yy:{},symbols_:{"error":2,"equation":3,"expression":4,"SIGN":5,"EOF":6,"additive":7,"+":8,"multiplicative":9,"-":10,"triglog":11,"*":12,"negative":13,"/":14,"trig":15,"TRIG":16,"trigfunc":17,"^":18,"TRIGINV":19,"logbase":20,"ln":21,"log":22,"_":23,"subscriptable":24,"power":25,"primitive":26,"variable":27,"VAR":28,"CONST":29,"INT":30,"FLOAT":31,"{":32,"}":33,"(":34,")":35,"function":36,"FUNC":37,"invocation":38,"sqrt":39,"[":40,"]":41,"abs":42,"|":43,"LEFT|":44,"RIGHT|":45,"FRAC":46,"$accept":0,"$end":1},terminals_:{2:"error",5:"SIGN",6:"EOF",8:"+",10:"-",12:"*",14:"/",16:"TRIG",18:"^",19:"TRIGINV",21:"ln",22:"log",23:"_",28:"VAR",29:"CONST",30:"INT",31:"FLOAT",32:"{",33:"}",34:"(",35:")",37:"FUNC",39:"sqrt",40:"[",41:"]",42:"abs",43:"|",44:"LEFT|",45:"RIGHT|",46:"FRAC"},productions_:[0,[3,4],[3,2],[3,1],[4,1],[7,3],[7,3],[7,1],[9,2],[9,3],[9,3],[9,1],[13,2],[13,1],[15,1],[17,1],[17,3],[17,1],[20,1],[20,1],[20,3],[11,2],[11,2],[11,1],[25,3],[25,1],[27,1],[24,3],[24,1],[24,1],[24,1],[24,1],[24,3],[24,3],[36,1],[38,4],[38,4],[38,7],[38,4],[38,3],[38,3],[38,4],[26,1],[26,1],[26,7]],performAction:function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return new yy.Eq($$[$0-3],$$[$0-2],$$[$0-1]);case 2:return $$[$0-1];case 3:return new yy.Add([]);case 4:case 7:case 11:case 13:case 15:case 20:case 23:case 25:case 42:case 43:this.$=$$[$0];break;case 5:this.$=yy.Add.createOrAppend($$[$0-2],$$[$0]);break;case 6:this.$=yy.Add.createOrAppend($$[$0-2],yy.Mul.handleNegative($$[$0],"subtract"));break;case 8:this.$=yy.Mul.fold(yy.Mul.createOrAppend($$[$0-1],$$[$0]));break;case 9:this.$=yy.Mul.fold(yy.Mul.createOrAppend($$[$0-2],$$[$0]));break;case 10:this.$=yy.Mul.fold(yy.Mul.handleDivide($$[$0-2],$$[$0]));break;case 12:this.$=yy.Mul.handleNegative($$[$0]);break;case 14:case 17:this.$=[yytext];break;case 16:this.$=$$[$0-2].concat($$[$0]);break;case 18:this.$=yy.Log.natural();break;case 19:this.$=yy.Log.common();break;case 21:this.$=yy.Trig.create($$[$0-1],$$[$0]);break;case 22:this.$=yy.Log.create($$[$0-1],$$[$0]);break;case 24:this.$=new yy.Pow($$[$0-2],$$[$0]);break;case 26:case 34:this.$=yytext;break;case 27:this.$=new yy.Var($$[$0-2],$$[$0]);break;case 28:this.$=new yy.Var($$[$0]);break;case 29:this.$=new yy.Const(yytext.toLowerCase());break;case 30:this.$=yy.Int.create(Number(yytext));break;case 31:this.$=yy.Float.create(Number(yytext));break;case 32:this.$=$$[$0-1].completeParse();break;case 33:this.$=$$[$0-1].completeParse().addHint("parens");break;case 35:case 36:this.$=yy.Pow.sqrt($$[$0-1]);break;case 37:this.$=new yy.Pow.nthroot($$[$0-1],$$[$0-4]);break;case 38:case 39:case 40:this.$=new yy.Abs($$[$0-1]);break;case 41:this.$=new yy.Func($$[$0-3],$$[$0-1]);break;case 44:this.$=yy.Mul.handleDivide($$[$0-4],$$[$0-1]);break}},table:[{3:1,4:2,6:[1,3],7:4,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{1:[3]},{5:[1,34],6:[1,35]},{1:[2,3]},o([5,6],[2,4],{8:$Vh,10:$Vi}),o($Vj,[2,7],{17:9,20:10,25:11,15:12,26:16,24:18,38:19,27:21,36:31,11:38,12:$Vk,14:$Vl,16:$V1,19:$V2,21:$V3,22:$V4,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,37:$Vb,39:$Vc,42:$Vd,44:$Vf,46:$Vg}),o($Vm,[2,11]),{10:$V0,11:8,13:41,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,13]),{10:$V0,11:8,13:42,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{10:$V0,11:8,13:43,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,23]),o($Vn,[2,15],{18:[1,44]}),o($Vn,[2,17]),o($Vn,[2,18]),o($Vn,[2,19],{23:[1,45]}),o($Vm,[2,25],{18:[1,46]}),o([10,16,18,19,21,22,28,29,30,31,32,34,37,39,42,43,44,46],[2,14]),o($Vo,[2,42]),o($Vo,[2,43]),{32:[1,47]},o($Vo,[2,28],{23:[1,48]}),o($Vo,[2,29]),o($Vo,[2,30]),o($Vo,[2,31]),{7:49,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:50,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{32:[1,52],34:[1,51],40:[1,53]},{34:[1,54]},{7:55,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:56,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{34:[1,57]},o([5,6,8,10,12,14,16,18,19,21,22,23,28,29,30,31,32,33,34,35,37,39,41,42,43,44,45,46],[2,26]),{34:[2,34]},{4:58,7:4,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{1:[2,2]},{9:59,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{9:60,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,8]),{10:$V0,11:8,13:61,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{10:$V0,11:8,13:62,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,12]),o($Vm,[2,21]),o($Vm,[2,22]),{10:$V0,11:8,13:63,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{24:64,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va},{10:$V0,11:8,13:65,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:66,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{24:67,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va},{8:$Vh,10:$Vi,33:[1,68]},{8:$Vh,10:$Vi,35:[1,69]},{7:70,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:71,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:72,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:73,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{8:$Vh,10:$Vi,43:[1,74]},{8:$Vh,10:$Vi,45:[1,75]},{7:76,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{6:[1,77]},o($Vj,[2,5],{17:9,20:10,25:11,15:12,26:16,24:18,38:19,27:21,36:31,11:38,12:$Vk,14:$Vl,16:$V1,19:$V2,21:$V3,22:$V4,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,37:$Vb,39:$Vc,42:$Vd,44:$Vf,46:$Vg}),o($Vj,[2,6],{17:9,20:10,25:11,15:12,26:16,24:18,38:19,27:21,36:31,11:38,12:$Vk,14:$Vl,16:$V1,19:$V2,21:$V3,22:$V4,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,37:$Vb,39:$Vc,42:$Vd,44:$Vf,46:$Vg}),o($Vm,[2,9]),o($Vm,[2,10]),o($Vn,[2,16]),o($Vn,[2,20]),o($Vm,[2,24]),{8:$Vh,10:$Vi,33:[1,78]},o($Vo,[2,27]),o($Vo,[2,32]),o($Vo,[2,33]),{8:$Vh,10:$Vi,35:[1,79]},{8:$Vh,10:$Vi,33:[1,80]},{8:$Vh,10:$Vi,41:[1,81]},{8:$Vh,10:$Vi,35:[1,82]},o($Vo,[2,39]),o($Vo,[2,40]),{8:$Vh,10:$Vi,35:[1,83]},{1:[2,1]},{32:[1,84]},o($Vo,[2,35]),o($Vo,[2,36]),{32:[1,85]},o($Vo,[2,38]),o($Vo,[2,41]),{7:86,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:87,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{8:$Vh,10:$Vi,33:[1,88]},{8:$Vh,10:$Vi,33:[1,89]},o($Vo,[2,44]),o($Vo,[2,37])],defaultActions:{3:[2,3],33:[2,34],35:[2,2],77:[2,1]},parseError:function parseError(str,hash){if(hash.recoverable){this.trace(str);}else {throw new Error(str)}},parse:function parse(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext="",yylineno=0,yyleng=0,TERROR=2,EOF=1;var args=lstack.slice.call(arguments,1);var lexer=Object.create(this.lexer);var sharedState={yy:{}};for(var k in this.yy){if(Object.prototype.hasOwnProperty.call(this.yy,k)){sharedState.yy[k]=this.yy[k];}}lexer.setInput(input,sharedState.yy);sharedState.yy.lexer=lexer;sharedState.yy.parser=this;if(typeof lexer.yylloc=="undefined"){lexer.yylloc={};}var yyloc=lexer.yylloc;lstack.push(yyloc);var ranges=lexer.options&&lexer.options.ranges;if(typeof sharedState.yy.parseError==="function"){this.parseError=sharedState.yy.parseError;}else {this.parseError=Object.getPrototypeOf(this).parseError;}function lex(){var token;token=lexer.lex()||EOF;if(typeof token!=="number"){token=self.symbols_[token]||token;}return token}var symbol,state,action,r,yyval={},p,len,newState,expected;while(true){state=stack[stack.length-1];if(this.defaultActions[state]){action=this.defaultActions[state];}else {if(symbol===null||typeof symbol=="undefined"){symbol=lex();}action=table[state]&&table[state][symbol];}if(typeof action==="undefined"||!action.length||!action[0]){var errStr="";expected=[];for(p in table[state]){if(this.terminals_[p]&&p>TERROR){expected.push("'"+this.terminals_[p]+"'");}}if(lexer.showPosition){errStr="Parse error on line "+(yylineno+1)+":\n"+lexer.showPosition()+"\nExpecting "+expected.join(", ")+", got '"+(this.terminals_[symbol]||symbol)+"'";}else {errStr="Parse error on line "+(yylineno+1)+": Unexpected "+(symbol==EOF?"end of input":"'"+(this.terminals_[symbol]||symbol)+"'");}this.parseError(errStr,{text:lexer.match,token:this.terminals_[symbol]||symbol,line:lexer.yylineno,loc:yyloc,expected:expected});}if(action[0]instanceof Array&&action.length>1){throw new Error("Parse Error: multiple actions possible at state: "+state+", token: "+symbol)}switch(action[0]){case 1:stack.push(symbol);vstack.push(lexer.yytext);lstack.push(lexer.yylloc);stack.push(action[1]);symbol=null;{yyleng=lexer.yyleng;yytext=lexer.yytext;yylineno=lexer.yylineno;yyloc=lexer.yylloc;}break;case 2:len=this.productions_[action[1]][1];yyval.$=vstack[vstack.length-len];yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column};if(ranges){yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]];}r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args));if(typeof r!=="undefined"){return r}if(len){stack=stack.slice(0,-1*len*2);vstack=vstack.slice(0,-1*len);lstack=lstack.slice(0,-1*len);}stack.push(this.productions_[action[1]][0]);vstack.push(yyval.$);lstack.push(yyval._$);newState=table[stack[stack.length-2]][stack[stack.length-1]];stack.push(newState);break;case 3:return true}}return true}};var lexer=function(){var lexer={EOF:1,parseError:function parseError(str,hash){if(this.yy.parser){this.yy.parser.parseError(str,hash);}else {throw new Error(str)}},setInput:function(input,yy){this.yy=yy||this.yy||{};this._input=input;this._more=this._backtrack=this.done=false;this.yylineno=this.yyleng=0;this.yytext=this.matched=this.match="";this.conditionStack=["INITIAL"];this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0};if(this.options.ranges){this.yylloc.range=[0,0];}this.offset=0;return this},input:function(){var ch=this._input[0];this.yytext+=ch;this.yyleng++;this.offset++;this.match+=ch;this.matched+=ch;var lines=ch.match(/(?:\r\n?|\n).*/g);if(lines){this.yylineno++;this.yylloc.last_line++;}else {this.yylloc.last_column++;}if(this.options.ranges){this.yylloc.range[1]++;}this._input=this._input.slice(1);return ch},unput:function(ch){var len=ch.length;var lines=ch.split(/(?:\r\n?|\n)/g);this._input=ch+this._input;this.yytext=this.yytext.substr(0,this.yytext.length-len);this.offset-=len;var oldLines=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1);this.matched=this.matched.substr(0,this.matched.length-1);if(lines.length-1){this.yylineno-=lines.length-1;}var r=this.yylloc.range;this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:lines?(lines.length===oldLines.length?this.yylloc.first_column:0)+oldLines[oldLines.length-lines.length].length-lines[0].length:this.yylloc.first_column-len};if(this.options.ranges){this.yylloc.range=[r[0],r[0]+this.yyleng-len];}this.yyleng=this.yytext.length;return this},more:function(){this._more=true;return this},reject:function(){if(this.options.backtrack_lexer){this._backtrack=true;}else {return this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}return this},less:function(n){this.unput(this.match.slice(n));},pastInput:function(){var past=this.matched.substr(0,this.matched.length-this.match.length);return (past.length>20?"...":"")+past.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var next=this.match;if(next.length<20){next+=this._input.substr(0,20-next.length);}return (next.substr(0,20)+(next.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var pre=this.pastInput();var c=new Array(pre.length+1).join("-");return pre+this.upcomingInput()+"\n"+c+"^"},test_match:function(match,indexed_rule){var token,lines,backup;if(this.options.backtrack_lexer){backup={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done};if(this.options.ranges){backup.yylloc.range=this.yylloc.range.slice(0);}}lines=match[0].match(/(?:\r\n?|\n).*/g);if(lines){this.yylineno+=lines.length;}this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lines?lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+match[0].length};this.yytext+=match[0];this.match+=match[0];this.matches=match;this.yyleng=this.yytext.length;if(this.options.ranges){this.yylloc.range=[this.offset,this.offset+=this.yyleng];}this._more=false;this._backtrack=false;this._input=this._input.slice(match[0].length);this.matched+=match[0];token=this.performAction.call(this,this.yy,this,indexed_rule,this.conditionStack[this.conditionStack.length-1]);if(this.done&&this._input){this.done=false;}if(token){return token}else if(this._backtrack){for(var k in backup){this[k]=backup[k];}return false}return false},next:function(){if(this.done){return this.EOF}if(!this._input){this.done=true;}var token,match,tempMatch,index;if(!this._more){this.yytext="";this.match="";}var rules=this._currentRules();for(var i=0;i<rules.length;i++){tempMatch=this._input.match(this.rules[rules[i]]);if(tempMatch&&(!match||tempMatch[0].length>match[0].length)){match=tempMatch;index=i;if(this.options.backtrack_lexer){token=this.test_match(tempMatch,rules[i]);if(token!==false){return token}else if(this._backtrack){match=false;continue}else {return false}}else if(!this.options.flex){break}}}if(match){token=this.test_match(match,rules[index]);if(token!==false){return token}return false}if(this._input===""){return this.EOF}else {return this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}},lex:function lex(){var r=this.next();if(r){return r}else {return this.lex()}},begin:function begin(condition){this.conditionStack.push(condition);},popState:function popState(){var n=this.conditionStack.length-1;if(n>0){return this.conditionStack.pop()}else {return this.conditionStack[0]}},_currentRules:function _currentRules(){if(this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules}else {return this.conditions["INITIAL"].rules}},topState:function topState(n){n=this.conditionStack.length-1-Math.abs(n||0);if(n>=0){return this.conditionStack[n]}else {return "INITIAL"}},pushState:function pushState(condition){this.begin(condition);},stateStackSize:function stateStackSize(){return this.conditionStack.length},options:{"flex":true},performAction:function anonymous(yy,yy_,$avoiding_name_collisions,YY_START){switch($avoiding_name_collisions){case 0:break;case 1:break;case 2:break;case 3:return "INT";case 4:return "FLOAT";case 5:return "^";case 6:return "*";case 7:return "*";case 8:return "*";case 9:return "*";case 10:return "/";case 11:return "/";case 12:return "-";case 13:return "-";case 14:return "+";case 15:return "^";case 16:return "(";case 17:return ")";case 18:return "(";case 19:return ")";case 20:return "[";case 21:return "]";case 22:return "{";case 23:return "}";case 24:return "{";case 25:return "}";case 26:return "_";case 27:return "|";case 28:return "LEFT|";case 29:return "RIGHT|";case 30:return "!";case 31:return "SIGN";case 32:yy_.yytext="<=";return "SIGN";case 33:yy_.yytext=">=";return "SIGN";case 34:yy_.yytext="<=";return "SIGN";case 35:yy_.yytext=">=";return "SIGN";case 36:yy_.yytext="<>";return "SIGN";case 37:yy_.yytext="<>";return "SIGN";case 38:yy_.yytext="<>";return "SIGN";case 39:yy_.yytext="<>";return "SIGN";case 40:yy_.yytext="<=";return "SIGN";case 41:yy_.yytext=">=";return "SIGN";case 42:return "FRAC";case 43:return "FRAC";case 44:return "sqrt";case 45:return "abs";case 46:return "ln";case 47:return "log";case 48:return "TRIG";case 49:return "TRIG";case 50:return "TRIG";case 51:return "TRIG";case 52:yy_.yytext="sin";return "TRIG";case 53:yy_.yytext="cos";return "TRIG";case 54:yy_.yytext="tan";return "TRIG";case 55:yy_.yytext="csc";return "TRIG";case 56:yy_.yytext="sec";return "TRIG";case 57:yy_.yytext="cot";return "TRIG";case 58:yy_.yytext="arcsin";return "TRIG";case 59:yy_.yytext="arccos";return "TRIG";case 60:yy_.yytext="arctan";return "TRIG";case 61:yy_.yytext="arccsc";return "TRIG";case 62:yy_.yytext="arcsec";return "TRIG";case 63:yy_.yytext="arccot";return "TRIG";case 64:return "TRIGINV";case 65:return "TRIGINV";case 66:yy_.yytext="sinh";return "TRIG";case 67:yy_.yytext="cosh";return "TRIG";case 68:yy_.yytext="tanh";return "TRIG";case 69:yy_.yytext="csch";return "TRIG";case 70:yy_.yytext="sech";return "TRIG";case 71:yy_.yytext="tanh";return "TRIG";case 72:return "CONST";case 73:yy_.yytext="pi";return "CONST";case 74:yy_.yytext="pi";return "CONST";case 75:return "VAR";case 76:yy_.yytext="theta";return "VAR";case 77:yy_.yytext="theta";return "VAR";case 78:return "VAR";case 79:yy_.yytext="phi";return "VAR";case 80:yy_.yytext="phi";return "VAR";case 81:return yy.symbolLexer(yy_.yytext);case 82:return "EOF";case 83:return "INVALID";case 84:console.log(yy_.yytext);break}},rules:[/^(?:\s+)/,/^(?:\\space)/,/^(?:\\ )/,/^(?:[0-9]+\.?)/,/^(?:([0-9]+)?\.[0-9]+)/,/^(?:\*\*)/,/^(?:\*)/,/^(?:\\cdot|·)/,/^(?:\\times|×)/,/^(?:\\ast)/,/^(?:\/)/,/^(?:\\div|÷)/,/^(?:-)/,/^(?:−)/,/^(?:\+)/,/^(?:\^)/,/^(?:\()/,/^(?:\))/,/^(?:\\left\()/,/^(?:\\right\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:\\left\{)/,/^(?:\\right\})/,/^(?:_)/,/^(?:\|)/,/^(?:\\left\|)/,/^(?:\\right\|)/,/^(?:\!)/,/^(?:<=|>=|<>|<|>|=)/,/^(?:\\le)/,/^(?:\\ge)/,/^(?:\\leq)/,/^(?:\\geq)/,/^(?:=\/=)/,/^(?:\\ne)/,/^(?:\\neq)/,/^(?:≠)/,/^(?:≤)/,/^(?:≥)/,/^(?:\\frac)/,/^(?:\\dfrac)/,/^(?:sqrt|\\sqrt)/,/^(?:abs|\\abs)/,/^(?:ln|\\ln)/,/^(?:log|\\log)/,/^(?:sin|cos|tan)/,/^(?:csc|sec|cot)/,/^(?:sinh|cosh|tanh)/,/^(?:csch|sech|coth)/,/^(?:\\sin)/,/^(?:\\cos)/,/^(?:\\tan)/,/^(?:\\csc)/,/^(?:\\sec)/,/^(?:\\cot)/,/^(?:\\arcsin)/,/^(?:\\arccos)/,/^(?:\\arctan)/,/^(?:\\arccsc)/,/^(?:\\arcsec)/,/^(?:\\arccot)/,/^(?:arcsin|arccos|arctan)/,/^(?:arccsc|arcsec|arccot)/,/^(?:\\sinh)/,/^(?:\\cosh)/,/^(?:\\tanh)/,/^(?:\\csch)/,/^(?:\\sech)/,/^(?:\\coth)/,/^(?:pi)/,/^(?:π)/,/^(?:\\pi)/,/^(?:theta)/,/^(?:θ)/,/^(?:\\theta)/,/^(?:phi)/,/^(?:φ)/,/^(?:\\phi)/,/^(?:[a-zA-Z])/,/^(?:$)/,/^(?:.)/,/^(?:.)/],conditions:{"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],"inclusive":true}}};return lexer}();parser.lexer=lexer;function Parser(){this.yy={};}Parser.prototype=parser;parser.Parser=Parser;return new Parser}();
|
|
17
17
|
|
|
18
|
-
const isNaN=function(object){return object!==object};const randomFloat=function(min,max){var extent=max-min;return Math.random()*extent+min};var ITERATIONS=12;var TOLERANCE=9;function partition(list,iteratee){const a=[];const b=[];___default.default.forEach(list,(elem,key,ctx)=>{if(iteratee(elem,key,ctx)){a.push(elem);}else {b.push(elem);}});return [a,b]}function isExpr(arg){return arg instanceof Expr}const isAdd=function(term){return term instanceof Add};function isRational(arg){return arg instanceof Rational}function getFactors(expr){if(expr instanceof Mul){return expr.terms}else {return [expr]}}class Expr{construct(args){const func=this.func;const instance=new func(...args);if(typeof instance==="undefined"){throw new Error("constructor function returning undefined")}return instance}recurse(method,...passed){var args=this.args().map(function(arg){return ___default.default.isString(arg)||___default.default.isNumber(arg)?arg:arg?.[method].apply(arg,passed)});return this.construct(args)}eval(vars={},options){throw new Error("Abstract method - must override for expr: "+this.print())}codegen(){throw new Error("Abstract method - must override for expr: "+this.print())}compile(){var code=this.codegen();try{return new Function("vars","return "+code+";")}catch{throw new Error("Function did not compile: "+code)}}asTex(options){options=options||{};___default.default.defaults(options,{display:true,dynamic:true,times:false});let tex=this.tex();if(options.display){tex="\\displaystyle "+tex;}if(options.dynamic){tex=tex.replace(/\(/g,"\\left(");tex=tex.replace(/\)/g,"\\right)");}if(options.times){tex=tex.replace(/\\cdot/g,"\\times");}return tex}name(){return this.func.name}repr(){return this.name()+"("+this.args().map(function(arg){return ___default.default.isString(arg)||___default.default.isNumber(arg)?arg:arg?.repr()}).join(",")+")"}strip(){return this.recurse("strip")}normalize(){return this.recurse("normalize")}expand(){return this.recurse("expand")}factor(options){return this.recurse("factor",options)}collect(options){return this.recurse("collect",options)}equals(other){return this.normalize().print()===other.normalize().print()}simplify(options){options={once:false,...options};var step1=this.factor(options);var step2=step1.collect(options);if(step1.equals(step2)){step2=this.collect(options);}var step3=step2.expand();var step4=step3.collect(options);if(step3.equals(step4)){step4=step2.collect(options);}var simplified=step4;if(options.once||this.equals(simplified)){return simplified}else {return simplified.simplify(options)}}isSimplified(){return this.equals(this.simplify())}exprArgs(){return this.args().filter(isExpr)}getVars(excludeFunc){return ___default.default.uniq(___default.default.flatten(___default.default.invoke(this.exprArgs(),"getVars",excludeFunc))).sort()}getConsts(){return ___default.default.uniq(___default.default.flatten(___default.default.invoke(this.exprArgs(),"getConsts"))).sort()}getUnits(){return ___default.default.flatten(___default.default.invoke(this.exprArgs(),"getUnits"))}is(func){return this instanceof func}has(func){if(this instanceof func){return true}return ___default.default.any(this.exprArgs(),function(arg){return arg.has(func)})}raiseToThe(exp,options){return new Pow(this,exp)}isSubtract(){return false}isDivide(){return false}isRoot(){return false}needsExplicitMul(){return this.exprArgs()[0].needsExplicitMul()}sameVars(other){var vars1=this.getVars();var vars2=other.getVars();var same=function(array1,array2){return !___default.default.difference(array1,array2).length};var lower=function(array){return ___default.default.uniq(___default.default.invoke(array,"toLowerCase")).sort()};var equal=same(vars1,vars2);var equalIgnoringCase=same(lower(vars1),lower(vars2));return {equal:equal,equalIgnoringCase:equalIgnoringCase}}compare(other){if(other instanceof Eq){return false}var varList=___default.default.union(this.getVars(true),other.getVars(true));var getDelta=function(num1,num2){if(Math.abs(num1)<1||Math.abs(num2)<1){return Math.abs(num1-num2)}else {return Math.abs(1-num1/num2)}};var equalNumbers=function(num1,num2){var delta=getDelta(num1,num2);return num1===num2||isNaN(num1)&&isNaN(num2)||delta<Math.pow(10,-9)};const varAndFuncList=___default.default.union(this.getVars(false),other.getVars(false));if(!varAndFuncList.length&&!this.has(Unit)&&!other.has(Unit)){return equalNumbers(this.eval(),other.eval())}var expr1=this.collect();var expr2=other.collect();var unitList1=this.getUnits();var unitList2=other.getUnits();if(!___default.default.isEqual(unitList1,unitList2)){return false}for(var i=0;i<ITERATIONS;i++){var vars={};var range=Math.pow(10,1+Math.floor(3*i/ITERATIONS));var useFloats=i%2===0;___default.default.each(varList,function(v){vars[v]=useFloats?randomFloat(-range,range):___default.default.random(-range,range);});let equal;if(expr1.has(Func)||expr2.has(Func)||expr1.has(Unit)||expr2.has(Unit)){const result1=expr1.partialEval(vars);const result2=expr2.partialEval(vars);equal=result1.simplify().equals(result2.simplify());}else {const result1=expr1.eval(vars);const result2=expr2.eval(vars);equal=equalNumbers(result1,result2);}if(!equal){return false}}return true}partialEval(vars){if(this instanceof Unit){return this}else if(!this.has(Func)){return new Float(+this.eval(vars).toFixed(TOLERANCE)).collect()}else if(this instanceof Func){return new Func(this.symbol,this.arg.partialEval(vars))}else {return this.recurse("partialEval",vars)}}sameForm(other){return this.strip().equals(other.strip())}findGCD(factor){return this.equals(factor)?factor:NumOne}getDenominator(){return NumOne}asMul(){return new Mul(NumOne,this)}isPositive(){throw new Error("Abstract method - must override for expr: "+this.print())}isNegative(){return false}asPositiveFactor(){return this.isPositive()?this:NumOne}addHint(hint){if(!hint){return this}var expr=this.construct(this.args());expr.hints=___default.default.clone(this.hints);expr.hints[hint]=true;return expr}completeParse(){return this.recurse("completeParse")}abs(){throw new Error("Abstract method - must override for expr: "+this.print())}negate(){return new Mul(NumNeg,this)}constructor(){this.hints={parens:false};}}class Seq extends Expr{args(){return this.terms}normalize(){var terms=___default.default.sortBy(___default.default.invoke(this.terms,"normalize"),term=>{return term.print()});return new this.func(terms)}expand(){return this.recurse("expand").flatten()}partition(){var[numbers,others]=partition(this.terms,term=>{return term instanceof Num});return [new this.func(numbers),new this.func(others)]}flatten(){var type=this;var terms=___default.default.reject(this.terms,term=>{return term.equals(type.identity)});if(terms.length===0){return type.identity}if(terms.length===1){return terms[0]}const[same,others]=partition(terms,term=>{return term instanceof type.func});var flattened=others.concat(___default.default.flatten(___default.default.pluck(same,"terms"),true));return new type.func(flattened)}isPositive(){var terms=___default.default.invoke(this.terms,"collect");return ___default.default.all(___default.default.invoke(terms,"isPositive"))}replace(oldTerm,newTerm){const index=oldTerm instanceof Expr?___default.default.indexOf(this.terms,oldTerm):oldTerm;var newTerms=[];if(Array.isArray(newTerm)){newTerms=newTerm;}else if(newTerm){newTerms=[newTerm];}var terms=this.terms.slice(0,index).concat(newTerms).concat(this.terms.slice(index+1));return new this.func(terms)}remove(term){return this.replace(term)}getDenominator(){return new Mul(___default.default.invoke(this.terms,"getDenominator")).flatten()}constructor(...args){super();if(args.length===1){this.terms=args[0];}else {this.terms=args;}}}class Add extends Seq{eval(vars={},options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo+term.eval(vars,options)},0)}codegen(){return ___default.default.map(this.terms,term=>{return "("+term.codegen()+")"}).join(" + ")||"0"}print(){return ___default.default.invoke(this.terms,"print").join("+")}tex(){let tex="";___default.default.each(this.terms,term=>{if(!tex||term.isSubtract()){tex+=term.tex();}else {tex+="+"+term.tex();}});return tex}collect(options){var terms=___default.default.invoke(this.terms,"collect",options);var pairs=[];___default.default.each(terms,term=>{if(term instanceof Mul){var muls=term.partition();pairs.push([muls[1].flatten(),muls[0].reduce(options)]);}else if(term instanceof Num){pairs.push([NumOne,term]);}else {pairs.push([term,NumOne]);}});var grouped=___default.default.groupBy(pairs,pair=>{return pair[0].normalize().print()});var collected=___default.default.compact(___default.default.map(grouped,pairs=>{var expr=pairs[0][0];var sum=new Add(___default.default.zip.apply(___default.default,pairs)[1]);var coefficient=sum.reduce(options);return new Mul(coefficient,expr).collect(options)}));return new Add(collected).flatten()}factor(options={keepNegative:false}){const terms=this.terms.map(term=>term.collect());let factors;if(terms[0]instanceof Mul){factors=terms[0].terms;}else {factors=[terms[0]];}___default.default.each(___default.default.rest(this.terms),term=>{factors=___default.default.map(factors,factor=>{return term.findGCD(factor)});});if(!options.keepNegative&&this.isNegative()){factors.push(NumNeg);}const left=new Mul(factors).flatten().collect();const remainder=terms.map(term=>Mul.handleDivide(term,left).simplify());const right=new Add(remainder).flatten();return Mul.createOrAppend(left,right).flatten()}reduce(options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo.add(term,options)},this.identity)}needsExplicitMul(){return false}isNegative(){var terms=___default.default.invoke(this.terms,"collect");return ___default.default.all(___default.default.invoke(terms,"isNegative"))}negate(){return new Add(___default.default.invoke(this.terms,"negate"))}static createOrAppend(left,right){if(left instanceof Add){return new Add(left.terms.concat(right))}else {return new Add(left,right)}}constructor(...args){super(...args),this.identity=NumZero,this.func=Add;}}class Mul extends Seq{eval(vars={},options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo*term.eval(vars,options)},1)}codegen(){return ___default.default.map(this.terms,term=>{return "("+term.codegen()+")"}).join(" * ")||"0"}print(){return ___default.default.map(this.terms,term=>{return term instanceof Add?"("+term.print()+")":term.print()}).join("*")}getUnits(){var tmUnits=___default.default(this.terms).chain().map(term=>{return term.getUnits()}).flatten().value();tmUnits.sort((a,b)=>a.unit.localeCompare(b.unit));return tmUnits}tex(){var cdot=" \\cdot ";var terms=___default.default.groupBy(this.terms,term=>{if(term.isDivide()){return "inverse"}else if(term instanceof Num){return "number"}else {return "other"}});var inverses=terms.inverse||[];var numbers=terms.number||[];var others=terms.other||[];var negatives="";var numerator;for(var i=0;i<numbers.length;i++){var isRational=numbers[i]instanceof Rational&&!(numbers[i]instanceof Int);if(isRational&&others.length>0&&inverses.length>0){var withThisRemoved=numbers.slice();withThisRemoved.splice(i,1);var newTerms=withThisRemoved.concat(inverses).concat(others);return numbers[i].tex()+new Mul(newTerms).tex()}}numbers=___default.default.compact(___default.default.map(numbers,term=>{var shouldPushDown=!term.hints.fraction||inverses.length>0;if(term instanceof Rational&&!(term instanceof Int)&&shouldPushDown){inverses.push(new Pow(new Int(term.d),NumDiv));var number=new Int(term.n);number.hints=term.hints;return ___default.default.any(term.hints)?number:null}else {return term}}));if(numbers.length===0&&others.length===1){numerator=others[0].tex();}else {var tex="";___default.default.each(numbers,term=>{if(term.hints.subtract&&term.hints.entered){negatives+="-";tex+=(tex?cdot:"")+term.abs().tex();}else if(term instanceof Int&&term.n===-1&&(term.hints.negate||term.hints.subtract)){negatives+="-";}else {tex+=(tex?cdot:"")+term.tex();}});___default.default.each(others,term=>{if(term.needsExplicitMul()){tex+=(tex?cdot:"")+term.tex();}else if(term instanceof Add){tex+="("+term.tex()+")";}else {tex+=term.tex();}});numerator=tex?tex:"1";}if(!inverses.length){return negatives+numerator}else {var denominator=new Mul(___default.default.invoke(inverses,"asDivide")).flatten().tex();return negatives+"\\frac{"+numerator+"}{"+denominator+"}"}}strip(){var terms=___default.default.map(this.terms,term=>{return term instanceof Num?term.abs():term.strip()});return new Mul(terms).flatten()}expand(){const isInverse=function(term){return term instanceof Pow&&term.exp.isNegative()};const isInverseAdd=function(term){return isInverse(term)&&isAdd(term.base)};const mul=this.recurse("expand").flatten();const factors=getFactors(mul);const hasAdd=___default.default.any(factors,isAdd);const hasInverseAdd=___default.default.any(factors,isInverseAdd);if(!(hasAdd||hasInverseAdd)){return mul}let[inverses,normals]=partition(factors,isInverse);if(hasAdd){const[adds,others]=partition(normals,isAdd);const expanded=___default.default.reduce(adds,function(expanded,add){return ___default.default.reduce(expanded,function(temp,array){return temp.concat(___default.default.map(add.terms,term=>array.concat(term)))},[])},[[]]);const muls=___default.default.map(expanded,function(array){return new Mul(others.concat(array)).flatten()});normals=[new Add(muls)];}if(hasInverseAdd){const denominator=new Mul(___default.default.invoke(inverses,"getDenominator")).flatten();inverses=[new Pow(denominator.expand(),NumDiv)];}return new Mul(normals.concat(inverses)).flatten()}factor(options){var factored=this.recurse("factor",options).flatten();if(!(factored instanceof Mul)){return factored}var[rationals,others]=partition(factored.terms,term=>{return term instanceof Rational});const ratObj=___default.default.reduce(rationals,(memo,term)=>{return {n:memo.n*term.n,d:memo.d*term.d}},{n:1,d:1});const rational=ratObj.d===1?new Int(ratObj.n):new Rational(ratObj.n,ratObj.d);return new Mul(others.concat(rational)).flatten()}collect(options){var partitioned=this.recurse("collect",options).partition();var number=partitioned[0].reduce(options);if(number.eval()===0){return NumZero}const other=partitioned[1].flatten();if(!(other instanceof Mul)){return new Mul(number,other).flatten()}const others=other.terms;var pairs=[];___default.default.each(others,term=>{if(term instanceof Pow){pairs.push([term.base,term.exp]);}else {pairs.push([term,NumOne]);}});var grouped=___default.default.groupBy(pairs,pair=>{return pair[0].normalize().print()});var summed=___default.default.compact(___default.default.map(grouped,pairs=>{var base=pairs[0][0];var sum=new Add(___default.default.zip.apply(___default.default,pairs)[1]);var exp=sum.collect(options);if(exp instanceof Num&&exp.eval()===0){return null}else {return [base,exp]}}));const groupedPairs=___default.default.groupBy(summed,pair=>{if(pair[0]instanceof Trig&&pair[0].isBasic()){return "trig"}else if(pair[0]instanceof Log){return "log"}else {return "expr"}});let trigs=groupedPairs.trig||[];let logs=groupedPairs.log||[];const exprs=groupedPairs.expr||[];if(trigs.length>1){var byArg=___default.default.groupBy(trigs,pair=>{return pair[0].arg.normalize().print()});trigs=[];___default.default.each(byArg,pairs=>{const arg=pairs[0][0].arg;let funcs={sin:NumZero,cos:NumZero};___default.default.each(pairs,pair=>{funcs[pair[0].type]=pair[1];});if(Mul.handleNegative(funcs.sin).collect(options).equals(funcs.cos)){if(funcs.cos.isNegative()){funcs={tan:funcs.sin};}else {funcs={cot:funcs.cos};}}___default.default.each(funcs,(exp,type)=>{trigs.push([new Trig(type,arg),exp]);});});}if(logs.length>1){var byBase=___default.default.groupBy(logs,pair=>{return pair[0].base.normalize().print()});logs=[];___default.default.each(byBase,pairs=>{if(pairs.length===2&&Mul.handleNegative(pairs[0][1]).collect(options).equals(pairs[1][1])){if(pairs[0][1].isNegative()){logs.push([new Log(pairs[0][0].power,pairs[1][0].power),pairs[1][1]]);}else {logs.push([new Log(pairs[1][0].power,pairs[0][0].power),pairs[0][1]]);}}else {logs=logs.concat(pairs);}});}var collected=___default.default.map([...trigs,...logs,...exprs],pair=>{return new Pow(pair[0],pair[1]).collect(options)});return new Mul([number].concat(collected)).flatten()}isSubtract(){return ___default.default.any(this.terms,term=>{return term instanceof Num&&Boolean(term.hints.subtract)})}factorIn(hint){var partitioned=this.partition();var numbers=partitioned[0].terms;var fold=numbers.length&&___default.default.all(numbers,num=>num.n>0);if(fold){var num=numbers[0].negate();num.hints=numbers[0].hints;return this.replace(numbers[0],num.addHint(hint))}else {return new Mul([Num.negativeOne(hint)].concat(this.terms))}}factorOut(){var factored=false;var terms=___default.default.compact(___default.default.map(this.terms,term=>{if(!factored&&term instanceof Num&&term.hints.divide){factored=true;return term.n!==-1?term.negate():null}else {return term}}));if(terms.length===1){return terms[0]}else {return new Mul(terms)}}reduce(options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo.mul(term,options)},this.identity)}findGCD(factor){return new Mul(___default.default.invoke(this.terms,"findGCD",factor)).flatten()}asMul(){return this}asPositiveFactor(){if(this.isPositive()){return this}else {const terms=getFactors(this.collect()).map(factor=>factor.asPositiveFactor());return new Mul(terms).flatten()}}isNegative(){const terms=getFactors(this.collect()).map(factor=>factor.isNegative());return ___default.default.any(terms)}fold(){return Mul.fold(this)}negate(){var isNum=expr=>{return expr instanceof Num};const num=___default.default.find(this.terms,isNum);if(num){return this.replace(num,num.negate())}else {return new Mul([NumNeg].concat(this.terms))}}static handleNegative(expr,hint){if(expr instanceof Num&&expr.n>0){var negated=expr.negate();negated.hints=expr.hints;return negated.addHint(hint)}else if(expr instanceof Mul){return expr.factorIn(hint)}else {return new Mul(Num.negativeOne(hint),expr)}}static handleDivide(left,right){if(right instanceof Mul){var first=Mul.handleDivide(left,right.terms[0]);var rest=new Mul(___default.default.rest(right.terms)).flatten();return Mul.handleDivide(first,rest)}var isInt=expr=>{return expr instanceof Int};var isRational=expr=>{return expr instanceof Rational};if(isInt(right)&&left instanceof Mul&&___default.default.any(left.terms,isInt)){var reversed=left.terms.slice().reverse();var num=reversed.find(isRational);if(!isInt(num)){return new Mul(left.terms.concat([new Rational(1,right.n).addHint("fraction")]))}var rational=new Rational(num.n,right.n);rational.hints=num.hints;if(num===reversed[0]){rational=rational.addHint("fraction");}if(num.n<0&&right.n<0){rational.d=-rational.d;return left.replace(num,[NumNeg,rational])}else {return left.replace(num,rational)}}var divide=(a,b)=>{if(b instanceof Int){if(a instanceof Int){if(a.n<0&&b.n<0){return [NumNeg,new Rational(a.n,-b.n).addHint("fraction")]}else {return [new Rational(a.n,b.n).addHint("fraction")]}}else {var inverse=new Rational(1,b.eval());if(b.eval()<0){return [a,inverse.addHint("negate")]}else {return [a,inverse]}}}else {var pow;if(b instanceof Trig&&b.exp){var exp=b.exp;b.exp=undefined;b=new Pow(b,exp);}if(b instanceof Pow){pow=new Pow(b.base,Mul.handleNegative(b.exp,"divide"));}else {pow=new Pow(b,NumDiv);}if(a instanceof Int&&a.n===1){return [pow]}else {return [a,pow]}}};if(left instanceof Mul){var divided=divide(___default.default.last(left.terms),right);return new Mul(___default.default.initial(left.terms).concat(divided))}else {var divided=divide(left,right);return new Mul(divided).flatten()}}static fold(expr){if(expr instanceof Mul){var trigLog=___default.default.find(___default.default.initial(expr.terms),term=>{return (term instanceof Trig||term instanceof Log)&&Boolean(term.hints.open)});if(trigLog){const last=___default.default.last(expr.terms);if(trigLog.hints.parens||last.hints.parens||last.has(Trig)||last.has(Log)){trigLog.hints.open=false;}else {const newTrigLog=trigLog instanceof Trig?Trig.create([trigLog.type,trigLog.exp],Mul.createOrAppend(trigLog.arg,last).fold()):Log.create(trigLog.base,Mul.createOrAppend(trigLog.power,last).fold());const index=___default.default.indexOf(expr.terms,trigLog);if(index===0){return newTrigLog}else {return new Mul(expr.terms.slice(0,index).concat(newTrigLog)).fold()}}}var partitioned=expr.partition();var numbers=partitioned[0].terms;var pos=num=>{return num.n>0};var neg=num=>{return num.n===-1&&Boolean(num.hints.negate)};var posOrNeg=function(num){return pos(num)||neg(num)};const posNum=numbers.find(pos);const negNum=numbers.find(neg);if(numbers.length>1&&negNum&&posNum&&___default.default.every(numbers,posOrNeg)){var firstNeg=___default.default.indexOf(expr.terms,negNum);var firstNum=___default.default.indexOf(expr.terms,posNum);if(firstNeg<firstNum){return expr.replace(firstNum,expr.terms[firstNum].negate()).remove(firstNeg)}}}return expr}static createOrAppend(left,right){if(left instanceof Mul){return new Mul(left.terms.concat(right))}else {return new Mul(left,right)}}constructor(...args){super(...args),this.identity=NumOne,this.func=Mul;}}class Pow extends Expr{args(){return [this.base,this.exp]}eval(vars={},options){var evaledBase=this.base.eval(vars,options);var evaledExp=this.exp.eval(vars,options);if(evaledBase<0){var simplifiedExp=this.exp.simplify();if(simplifiedExp instanceof Float){var num=simplifiedExp.n;var decimals=(num-+num.toFixed()).toString().length-2;var denominator=Math.pow(10,decimals);var rationalExp=new Rational(num*denominator,denominator);simplifiedExp=rationalExp.simplify();}if(simplifiedExp instanceof Rational){var oddDenominator=Math.abs(simplifiedExp.d)%2===1;if(oddDenominator){var oddNumerator=Math.abs(simplifiedExp.n)%2===1;var sign=oddNumerator?-1:1;return sign*Math.pow(-1*evaledBase,evaledExp)}}}return Math.pow(evaledBase,evaledExp)}getUnits(){return this.base.getUnits().map(unit=>{return {unit:unit.unit,pow:unit.pow*this.exp.n}})}codegen(){return "Math.pow("+this.base.codegen()+", "+this.exp.codegen()+")"}print(){var base=this.base.print();if(this.base instanceof Seq||this.base instanceof Pow){base="("+base+")";}return base+"^("+this.exp.print()+")"}tex(){if(this.isDivide()){return "\\frac{1}{"+this.asDivide().tex()+"}"}else if(this.isRoot()&&isRational(this.exp)){if(this.exp.n!==1){throw new Error("Node marked with hint 'root' does not have exponent "+"of form 1/x.")}if(this.exp.d===2){return "\\sqrt{"+this.base.tex()+"}"}else {return "\\sqrt["+this.exp.d+"]{"+this.base.tex()+"}"}}else if(this.base instanceof Trig&&!this.base.isInverse()&&this.exp instanceof Num&&this.exp.isSimple()&&this.exp.eval()>=0){var split=this.base.texSplit();return split[0]+"^{"+this.exp.tex()+"}"+split[1]}else {var base=this.base.tex();if(this.base instanceof Seq||this.base instanceof Pow||this.base instanceof Num&&!this.base.isSimple()){base="("+base+")";}else if(this.base instanceof Trig||this.base instanceof Log){base="["+base+"]";}return base+"^{"+this.exp.tex()+"}"}}needsExplicitMul(){return this.isRoot()?false:this.base.needsExplicitMul()}expand(){var pow=this.recurse("expand");if(pow.base instanceof Mul){var terms=___default.default.map(pow.base.terms,term=>{return new Pow(term,pow.exp)});return new Mul(terms).expand()}else if(pow.base instanceof Add&&pow.exp instanceof Int&&pow.exp.abs().eval()>1){var positive=pow.exp.eval()>0;var n=pow.exp.abs().eval();var signed=function(mul){return positive?mul:new Pow(mul,NumDiv)};const cache={1:pow.base};for(var i=2;i<=n;i*=2){const mul=new Mul(cache[i/2],cache[i/2]);cache[i]=mul.expand().collect();}if(n in cache){return signed(cache[n])}let indices=___default.default.map(n.toString(2).split(""),function(str,i,list){return Number(str)*Math.pow(2,list.length-i-1)});indices=___default.default.without(indices,0);const factors=[];for(const index of indices){if(index in cache){factors.push(cache[index]);}}const mul=new Mul(factors).expand().collect();return signed(mul)}else if(pow.exp instanceof Add){const terms=___default.default.map(pow.exp.terms,term=>{return new Pow(pow.base,term).expand()});return new Mul(terms).expand()}else {return pow}}factor(){var pow=this.recurse("factor");if(pow.base instanceof Mul){var terms=___default.default.map(pow.base.terms,term=>{if(term instanceof Int&&pow.exp.equals(NumDiv)){return new Rational(1,term.n)}else {return new Pow(term,pow.exp)}});return new Mul(terms)}else {return pow}}collect(options){if(this.base instanceof Pow){const base=this.base.base;const exp=Mul.createOrAppend(this.base.exp,this.exp);return new Pow(base,exp).collect(options)}const pow=this.recurse("collect",options);const isSimilarLog=function(term){return term instanceof Log&&term.base.equals(pow.base)};if(pow.exp instanceof Num&&pow.exp.eval()===0){return NumOne}else if(pow.exp instanceof Num&&pow.exp.eval()===1){return pow.base}else if(isSimilarLog(pow.exp)){return pow.exp.power}else if(pow.exp instanceof Mul&&___default.default.any(pow.exp.terms,isSimilarLog)){const log=pow.exp.terms.find(isSimilarLog);const base=log.power;const exp=pow.exp.remove(log).flatten();return new Pow(base,exp).collect(options)}else if(pow.base instanceof Num&&pow.exp instanceof Num){if(options&&options.preciseFloats){const exp=pow.exp.asRational();const decimalsInBase=pow.base.getDecimalPlaces();const root=new Pow(pow.base,new Rational(1,exp.d));const decimalsInRoot=root.collect().getDecimalPlaces();if(decimalsInRoot>decimalsInBase){const newBase=new Pow(pow.base,new Int(exp.n)).collect();return new Pow(newBase,new Rational(1,exp.d))}}return pow.base.raiseToThe(pow.exp,options)}else {return pow}}isDivide(){var isDiv=function(arg){return arg instanceof Num&&Boolean(arg.hints.divide)};return isDiv(this.exp)||this.exp instanceof Mul&&___default.default.any(this.exp.terms,isDiv)}asDivide(){if(this.exp instanceof Num){if(this.exp.eval()===-1){return this.base}else {var negated=this.exp.negate();negated.hints=___default.default.clone(this.exp.hints);negated.hints.divide=false;return new Pow(this.base,negated)}}else if(this.exp instanceof Mul){return new Pow(this.base,this.exp.factorOut())}else {throw new Error("called asDivide() on an Expr that wasn't a Num or Mul")}}isRoot(){return this.exp instanceof Rational&&Boolean(this.exp.hints.root)}isSquaredTrig(){return this.base instanceof Trig&&!this.base.isInverse()&&this.exp instanceof Num&&this.exp.eval()===2}getDenominator(){if(this.exp instanceof Num&&this.exp.eval()===-1){return Mul.createOrAppend(this.base,this.base.getDenominator()).flatten()}else if(this.exp.isNegative()){var pow=new Pow(this.base,Mul.handleNegative(this.exp).collect());return Mul.createOrAppend(pow,pow.collect().getDenominator()).flatten()}else if(this.base instanceof Num){return new Pow(this.base.getDenominator(),this.exp).collect()}else {return NumOne}}findGCD(factor){const[base,exp]=factor instanceof Pow?[factor.base,factor.exp]:[factor,NumOne];if(this.base.equals(base)){if(this.exp.equals(exp)){return this}else if(this.exp instanceof Num&&exp instanceof Num){return new Pow(this.base,Num.min(this.exp,exp)).collect()}else if(this.exp instanceof Num||exp instanceof Num){return NumOne}var expA=this.exp.asMul().partition();var expB=exp.asMul().partition();if(expA[1].equals(expB[1])){var coefficient=Num.min(expA[0].reduce(),expB[0].reduce());var mul=new Mul(coefficient,expA[1].flatten()).flatten();return new Pow(base,mul).collect()}}return NumOne}isPositive(){if(this.base.isPositive()){return true}var exp=this.exp.simplify();return exp instanceof Int&&exp.eval()%2===0}asPositiveFactor(){if(this.isPositive()){return this}else {var exp=this.exp.simplify();if(exp instanceof Int){var n=exp.eval();if(n>2){return new Pow(this.base,new Int(n-1))}else if(n<-2){return new Pow(this.base,new Int(n+1))}}return NumOne}}static sqrt(arg){return new Pow(arg,NumSqrt)}constructor(base,exp){super(),this.func=Pow;this.base=base;this.exp=exp;}}Pow.nthroot=function(radicand,degree){var exp=Mul.fold(Mul.handleDivide(new Int(1),degree));return new Pow(radicand,exp.addHint("root"))};class Log extends Expr{args(){return [this.base,this.power]}eval(vars={},options){return Math.log(this.power.eval(vars,options))/Math.log(this.base.eval(vars,options))}codegen(){return "(Math.log("+this.power.codegen()+") / Math.log("+this.base.codegen()+"))"}print(){var power="("+this.power.print()+")";if(this.isNatural()){return "ln"+power}else {return "log_("+this.base.print()+") "+power}}tex(){var power="("+this.power.tex()+")";if(this.isNatural()){return "\\ln"+power}else {return "\\log_{"+this.base.tex()+"}"+power}}collect(options){var log=this.recurse("collect",options);if(log.power instanceof Num&&log.power.eval()===1){return NumZero}else if(log.base.equals(log.power)){return NumOne}else if(log.power instanceof Pow&&log.power.base.equals(log.base)){return log.power.exp}else {return log}}expand(){var log=this.recurse("expand");if(log.power instanceof Mul){var terms=___default.default.map(log.power.terms,term=>{return new Log(log.base,term).expand()});return new Add(terms)}else if(log.power instanceof Pow){return new Mul(log.power.exp,new Log(log.base,log.power.base).expand()).flatten()}else if(!log.isNatural()){return Mul.handleDivide(new Log(Const.e,log.power),new Log(Const.e,log.base))}else {return log}}isPositive(){var log=this.collect();if(log instanceof Log&&log.base instanceof Num&&log.power instanceof Num){return this.eval()>0}else {return false}}needsExplicitMul(){return false}isNatural(){return this.base.equals(Const.e)}static natural(){return Const.e}static common(){return NumTen}static create(base,power){var log=new Log(base,power);if(!power.hints.parens){log=log.addHint("open");}return log}constructor(base,power){super(),this.func=Log;this.base=base;this.power=power;this.hints={...this.hints,open:false};}}class Trig extends Expr{args(){return [this.type,this.arg]}isEven(){return ___default.default.contains(["cos","sec"],this.type)}isInverse(){return this.type.indexOf("arc")===0}isBasic(){return ___default.default.contains(["sin","cos"],this.type)}eval(vars={},options){var func=this.functions[this.type].eval;var arg=this.arg.eval(vars,options);return func(arg)}codegen(){var func=this.functions[this.type].codegen;if(typeof func==="function"){return func(this.arg.codegen())}else if(typeof func==="string"){return func+this.arg.codegen()+"))"}else {throw new Error("codegen not implemented for "+this.type)}}print(){return this.type+"("+this.arg.print()+")"}tex(){var func=this.functions[this.type].tex;var arg="("+this.arg.tex()+")";return func+arg}texSplit(){var func=this.functions[this.type].tex;var arg="("+this.arg.tex()+")";return [func,arg]}isPositive(){var trig=this.collect();if(trig instanceof Trig&&trig.arg instanceof Num){return this.eval()>0}else {return false}}completeParse(){if(this.exp){var pow=new Pow(this,this.exp);this.exp=undefined;return pow}else {return this}}needsExplicitMul(){return false}expand(){var trig=this.recurse("expand");if(!trig.isInverse()){var expand=trig.functions[trig.type].expand;return ___default.default.bind(expand,trig)()}else {return trig}}collect(options){var trig=this.recurse("collect",options);if(!trig.isInverse()&&trig.arg.isNegative()){const arg=trig.arg instanceof Num?trig.arg.abs():Mul.handleDivide(trig.arg,NumNeg).collect(options);if(trig.isEven()){return new Trig(trig.type,arg)}else {return new Mul(NumNeg,new Trig(trig.type,arg))}}else {return trig}}static create(pair,arg){var type=pair[0];var exp=pair[1];if(exp&&exp.equals(NumNeg)){type="arc"+type;exp=undefined;}var trig=new Trig(type,arg);if(!arg.hints.parens){trig=trig.addHint("open");}if(exp){trig.exp=exp;}return trig}static sin(arg){return new Trig("sin",arg)}static cos(arg){return new Trig("cos",arg)}static sinh(arg){return new Trig("sinh",arg)}static cosh(arg){return new Trig("cosh",arg)}constructor(type,arg){super(),this.func=Trig,this.functions={sin:{eval:Math.sin,codegen:"Math.sin((",tex:"\\sin",expand:()=>this},cos:{eval:Math.cos,codegen:"Math.cos((",tex:"\\cos",expand:()=>this},tan:{eval:Math.tan,codegen:"Math.tan((",tex:"\\tan",expand:()=>Mul.handleDivide(Trig.sin(this.arg),Trig.cos(this.arg))},csc:{eval:arg=>{return 1/Math.sin(arg)},codegen:"(1/Math.sin(",tex:"\\csc",expand:()=>Mul.handleDivide(NumOne,Trig.sin(this.arg))},sec:{eval:arg=>{return 1/Math.cos(arg)},codegen:"(1/Math.cos(",tex:"\\sec",expand:()=>Mul.handleDivide(NumOne,Trig.cos(this.arg))},cot:{eval:arg=>{return 1/Math.tan(arg)},codegen:"(1/Math.tan(",tex:"\\cot",expand:()=>Mul.handleDivide(Trig.cos(this.arg),Trig.sin(this.arg))},arcsin:{eval:Math.asin,codegen:"Math.asin((",tex:"\\arcsin"},arccos:{eval:Math.acos,codegen:"Math.acos((",tex:"\\arccos"},arctan:{eval:Math.atan,codegen:"Math.atan((",tex:"\\arctan"},arccsc:{eval:arg=>{return Math.asin(1/arg)},codegen:"Math.asin(1/(",tex:"\\operatorname{arccsc}"},arcsec:{eval:arg=>{return Math.acos(1/arg)},codegen:"Math.acos(1/(",tex:"\\operatorname{arcsec}"},arccot:{eval:arg=>{return Math.atan(1/arg)},codegen:"Math.atan(1/(",tex:"\\operatorname{arccot}"},sinh:{eval:arg=>{return (Math.exp(arg)-Math.exp(-arg))/2},codegen:argStr=>{return "((Math.exp("+argStr+") - Math.exp(-("+argStr+"))) / 2)"},tex:"\\sinh",expand:()=>this},cosh:{eval:arg=>{return (Math.exp(arg)+Math.exp(-arg))/2},codegen:argStr=>{return "((Math.exp("+argStr+") + Math.exp(-("+argStr+"))) / 2)"},tex:"\\cosh",expand:()=>this},tanh:{eval:arg=>{return (Math.exp(arg)-Math.exp(-arg))/(Math.exp(arg)+Math.exp(-arg))},codegen:argStr=>{return "("+"(Math.exp("+argStr+") - Math.exp(-("+argStr+")))"+" / "+"(Math.exp("+argStr+") + Math.exp(-("+argStr+")))"+")"},tex:"\\tanh",expand:()=>Mul.handleDivide(Trig.sinh(this.arg),Trig.cosh(this.arg))},csch:{eval:arg=>{return 2/(Math.exp(arg)-Math.exp(-arg))},codegen:argStr=>{return "(2 / (Math.exp("+argStr+") - Math.exp(-("+argStr+"))))"},tex:"\\csch",expand:()=>Mul.handleDivide(NumOne,Trig.sinh(this.arg))},sech:{eval:arg=>{return 2/(Math.exp(arg)+Math.exp(-arg))},codegen:argStr=>{return "(2 / (Math.exp("+argStr+") + Math.exp(-("+argStr+"))))"},tex:"\\sech",expand:()=>Mul.handleDivide(NumOne,Trig.cosh(this.arg))},coth:{eval:arg=>{return (Math.exp(arg)+Math.exp(-arg))/(Math.exp(arg)-Math.exp(-arg))},codegen:argStr=>{return "("+"(Math.exp("+argStr+") + Math.exp(-("+argStr+")))"+" / "+"(Math.exp("+argStr+") - Math.exp(-("+argStr+")))"+")"},tex:"\\coth",expand:()=>Mul.handleDivide(Trig.cosh(this.arg),Trig.sinh(this.arg))}};this.type=type;this.arg=arg;this.hints={...this.hints,open:false};}}class Abs extends Expr{args(){return [this.arg]}eval(vars={},options){return Math.abs(this.arg.eval(vars,options))}codegen(){return "Math.abs("+this.arg.codegen()+")"}print(){return "abs("+this.arg.print()+")"}tex(){return "\\left|"+this.arg.tex()+"\\right|"}collect(options){var abs=this.recurse("collect",options);if(abs.arg.isPositive()){return abs.arg}else if(abs.arg instanceof Num){return abs.arg.abs()}else if(abs.arg instanceof Mul){var terms=___default.default.groupBy(abs.arg.terms,term=>{if(term.isPositive()){return "positive"}else if(term instanceof Num){return "number"}else {return "other"}});var positives=terms.positive.concat(___default.default.invoke(terms.number,"abs"));if(terms.other.length){positives.push(new Abs(new Mul(terms.other).flatten()));}return new Mul(positives).flatten()}else {return abs}}expand(){var abs=this.recurse("expand");if(abs.arg instanceof Mul){var terms=___default.default.map(abs.arg.terms,term=>{return new Abs(term)});return new Mul(terms)}else {return abs}}isPositive(){return true}constructor(arg){super(),this.func=Abs;this.arg=arg;}}class Eq extends Expr{args(){return [this.left,this.type,this.right]}needsExplicitMul(){return false}print(){return this.left.print()+this.type+this.right.print()}tex(){return this.left.tex()+this.signs[this.type]+this.right.tex()}normalize(){var eq=this.recurse("normalize");if(___default.default.contains([">",">="],eq.type)){return new Eq(eq.right,eq.type.replace(">","<"),eq.left)}else {return eq}}asExpr(unfactored=false){var isZero=expr=>{return expr instanceof Num&&expr.isSimple()&&expr.eval()===0};let terms=[];if(this.left instanceof Add){terms=___default.default.clone(this.left.terms);}else if(!isZero(this.left)){terms=[this.left];}if(this.right instanceof Add){terms=terms.concat(this.right.negate().terms);}else if(!isZero(this.right)){terms.push(this.right.negate());}var isInequality=!this.isEquality();terms=___default.default.invoke(terms,"collect",{preciseFloats:true});for(var i=0;i<terms.length;i++){var denominator=terms[i].getDenominator();if(isInequality&&!denominator.isPositive()){denominator=denominator.asPositiveFactor();}if(!denominator.equals(NumOne)){terms=___default.default.map(terms,term=>{return Mul.createOrAppend(term,denominator).simplify({once:true,preciseFloats:true})});}}var add=new Add(terms).flatten();return unfactored?add:this.divideThrough(add)}divideThrough(expr){const isInequality=!this.isEquality();const simplified=expr.simplify({once:true});const factored=simplified.factor({keepNegative:isInequality});if(!(factored instanceof Mul)){return expr}const terms=factored.terms;const hasVar=term=>!!term.getVars().length;const isOne=term=>term.equals(NumOne);const[adds,others]=partition(terms,isAdd);if(adds.length&&this.isEquality()){return new Mul(adds).flatten()}let denominator=others;if(!adds.length){denominator=___default.default.reject(denominator,hasVar);}if(isInequality){denominator=___default.default.invoke(denominator,"asPositiveFactor");}denominator=___default.default.reject(denominator,isOne);denominator=___default.default.map(denominator,term=>{return new Pow(term,NumDiv)});const dividedResult=new Mul(terms.concat(denominator)).collect();if(dividedResult.equals(factored)){return simplified}else {return dividedResult}}isEquality(){return ___default.default.contains(["=","<>"],this.type)}compare(other){if(!(other instanceof Eq)){return false}var eq1=this.normalize();var eq2=other.normalize();if(eq1.type!==eq2.type){return false}var expr1=eq1.divideThrough(eq1.asExpr(true).collect());var expr2=eq2.divideThrough(eq2.asExpr(true).collect());if(eq1.isEquality()){return expr1.compare(expr2)||expr1.compare(Mul.handleNegative(expr2))}else {return expr1.compare(expr2)}}sameForm(other){var eq1=this.normalize();var eq2=other.normalize();var same=eq1.left.sameForm(eq2.left)&&eq1.right.sameForm(eq2.right);if(eq1.isEquality()){return same||eq1.left.sameForm(eq2.right)&&eq1.right.sameForm(eq2.left)}else {return same}}isSimplified(){var expr=this.asExpr(true);var simplified=this.divideThrough(expr).simplify();return expr.equals(simplified)&&this.left.isSimplified()&&this.right.isSimplified()}solveLinearEquationForVariable(variable){var expr=this.asExpr();if(!(expr instanceof Add)||expr.terms.length!==2){throw new Error("Can only handle linear equations of the form "+"a + bx (= 0)")}var hasVar=term=>{return term.has(Var)&&___default.default.contains(term.getVars(),variable.symbol)};const termHasVar=hasVar(expr.terms[0]);const a=termHasVar?Mul.handleNegative(expr.terms[1]):Mul.handleNegative(expr.terms[0]);const b=termHasVar?Mul.handleDivide(expr.terms[0],variable):Mul.handleDivide(expr.terms[1],variable);return Mul.handleDivide(a,b).simplify()}constructor(left,type,right){super(),this.func=Eq,this.signs={"=":" = ","<":" < ",">":" > ","<>":" \\ne ","<=":" \\le ",">=":" \\ge "};this.left=left;this.type=type;this.right=right;}}class Sym extends Expr{needsExplicitMul(){return false}findGCD(factor){if(factor instanceof Sym||factor instanceof Num){return this.equals(factor)?this:NumOne}else {return factor.findGCD(this)}}}class Func extends Sym{args(){return [this.symbol,this.arg]}print(){return this.symbol+"("+this.arg.print()+")"}tex(){return this.symbol+"("+this.arg.tex()+")"}eval(vars={},options){var arg=this.arg;var func=vars[this.symbol];var newVars=___default.default.extend(___default.default.clone(vars),{x:arg.eval(vars,options)});var parsedFunc=parse(func,options);if(parsedFunc.parsed){return parsedFunc.expr.eval(newVars,options)}return parsedFunc}codegen(){return 'vars["'+this.symbol+'"]('+this.arg.codegen()+")"}getUnits(){return this.arg.getUnits()}getVars(excludeFunc){if(excludeFunc){return this.arg.getVars()}else {return ___default.default.union(this.arg.getVars(),[this.symbol]).sort()}}getConsts(){return this.arg.getConsts()}constructor(symbol,arg){super(),this.func=Func;this.symbol=symbol;this.arg=arg;}}class Var extends Sym{args(){return [this.symbol,this.subscript]}exprArgs(){return []}recurse(){return this}print(){var sub="";if(this.subscript){sub="_("+this.subscript.print()+")";}return this.symbol+sub}prettyPrint(){var sub=this.subscript;if(sub&&(sub instanceof Num||sub instanceof Sym)){return this.symbol+"_"+sub.print()}else {return this.print()}}tex(){var sub="";if(this.subscript){sub="_{"+this.subscript.tex()+"}";}var prefix=this.symbol.length>1?"\\":"";return prefix+this.symbol+sub}repr(){return "Var("+this.print()+")"}eval(vars={},options){return vars[this.prettyPrint()]}codegen(){return 'vars["'+this.prettyPrint()+'"]'}getVars(){return [this.prettyPrint()]}isPositive(){return false}constructor(symbol,subscript){super(),this.func=Var;this.symbol=symbol;this.subscript=subscript;}}class Const extends Sym{args(){return [this.symbol]}recurse(){return this}eval(vars={},options){if(this.symbol==="pi"){return Math.PI}else if(this.symbol==="e"){return Math.E}else {return undefined}}codegen(){if(this.symbol==="pi"){return "Math.PI"}else if(this.symbol==="e"){return "Math.E"}else {return undefined}}print(){return this.symbol}tex(){if(this.symbol==="pi"){return "\\pi "}else if(this.symbol==="e"){return "e"}else {return undefined}}isPositive(){return this.eval()>0}abs(){if(this.eval()>0){return this}else {return Mul.handleNegative(this)}}getConsts(){return [this.print()]}constructor(symbol){super(),this.func=Const;this.symbol=symbol;}}Const.e=new Const("e");Const.pi=new Const("pi");class Num extends Expr{repr(){return this.print()}strip(){return this.abs()}recurse(){return this}codegen(){return this.print()}isSubtract(){return Boolean(this.hints.subtract)}needsExplicitMul(){return true}isPositive(){return this.eval()>0}isNegative(){return this.eval()<0}asPositiveFactor(){return this.isPositive()?this:this.abs()}getDecimalPlaces(){var match=(""+this.n).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);if(match){return Math.max(0,(match[1]?match[1].length:0)-(match[2]?+match[2]:0))}else {return 0}}static negativeOne(hint){if(hint==="subtract"){return NumSub}else if(hint==="divide"){return NumDiv}else {return NumNeg}}static findGCD(a,b){var mod;a=Math.abs(a);b=Math.abs(b);if(a!==Math.floor(a)||b!==Math.floor(b)){return 1}while(b){mod=a%b;a=b;b=mod;}return a}static min(...args){return ___default.default.min(args,num=>num.eval())}static max(...args){return ___default.default.max(args,num=>num.eval())}constructor(){super(),this.n=0;this.hints={...this.hints,negate:false,subtract:false,divide:false,root:false,fraction:false,entered:false};}}class Rational extends Num{args(){return [this.n,this.d]}eval(){return this.n/this.d}print(){return this.n.toString()+"/"+this.d.toString()}tex(){var tex="\\frac{"+Math.abs(this.n).toString()+"}{"+this.d.toString()+"}";return this.n<0?"-"+tex:tex}add(num,options){if(num instanceof Rational){return new Rational(this.n*num.d+this.d*num.n,this.d*num.d).collect()}else {return num.add(this,options)}}mul(num,options){if(num instanceof Rational){return new Rational(this.n*num.n,this.d*num.d).collect()}else {return num.mul(this,options)}}collect(){var gcd=Num.findGCD(this.n,this.d);var n=this.n/gcd;var d=this.d/gcd;if(d===1){return new Int(n)}else {return new Rational(n,d)}}negate(){return new Rational(-this.n,this.d)}abs(){return new Rational(Math.abs(this.n),this.d)}findGCD(factor){if(factor instanceof Rational){var numerator=Num.findGCD(this.n*factor.d,factor.n*this.d);var denominator=this.d*factor.d;return new Rational(numerator,denominator).collect()}else if(factor instanceof Int){return new Rational(Num.findGCD(this.n,factor.n),this.d)}else {return factor.findGCD(this)}}raiseToThe(exp){if(exp instanceof Int){var positive=exp.eval()>0;var abs=exp.abs().eval();var n=Math.pow(this.n,abs);var d=Math.pow(this.d,abs);if(positive){return new Rational(n,d).collect()}else {return new Rational(d,n).collect()}}else {return new Float(this.eval()).raiseToThe(exp)}}getDenominator(){return new Int(this.d)}isSimple(){return false}asRational(){return this}constructor(numerator,denominator){super(),this.func=Rational;var n=numerator;var d=denominator;if(d<0){n=-n;d=-d;}this.n=n;this.d=d;}}class Int extends Rational{args(){return [this.n]}print(){return this.n.toString()}tex(){return this.n.toString()}negate(){return new Int(-this.n)}abs(){return new Int(Math.abs(this.n))}isSimple(){return true}findGCD(factor){if(factor instanceof Int){return new Int(Num.findGCD(this.n,factor.n))}else {return factor.findGCD(this)}}static create(n){return new Int(n).addHint("entered")}constructor(number){super(number,1),this.func=Int;}}class Float extends Num{args(){return [this.n]}eval(){return this.n}print(){return this.n.toString()}tex(){return this.n.toString()}add(num,options){if(options&&options.preciseFloats){return Float.toDecimalPlaces(this.n+num.eval(),Math.max(this.getDecimalPlaces(),num.getDecimalPlaces()))}else {return new Float(this.n+num.eval()).collect()}}mul(num,options){if(options&&options.preciseFloats){return Float.toDecimalPlaces(this.n*num.eval(),this.getDecimalPlaces()+num.getDecimalPlaces())}else {return new Float(this.n*num.eval()).collect()}}collect(options){return this}negate(){return new Float(-this.n)}abs(){return new Float(Math.abs(this.n))}findGCD(factor){if(factor instanceof Num){return new Float(Num.findGCD(this.eval(),factor.eval())).collect()}else {return factor.findGCD(this)}}raiseToThe(exp,options){if(options&&options.preciseFloats&&exp instanceof Int&&exp.n>1){return Float.toDecimalPlaces(new Pow(this,exp).eval(),this.getDecimalPlaces()*exp.n)}else {return new Float(new Pow(this,exp).eval()).collect()}}asRational(){var parts=this.n.toString().split(".");if(parts.length===1){return new Rational(this.n,1)}else {var numerator=Number(parts.join(""));var denominator=Math.pow(10,parts[1].length);return new Rational(numerator,denominator).collect()}}getDenominator(){return this.asRational().getDenominator()}isSimple(){return true}static create(n){return new Float(n).addHint("entered")}static toDecimalPlaces(n,places){return new Float(+n.toFixed(Math.min(places,20))).collect()}constructor(number){super(),this.func=Float;this.n=number;}}const NumNeg=new Int(-1).addHint("negate");const NumSub=new Int(-1).addHint("subtract");const NumDiv=new Int(-1).addHint("divide");const NumSqrt=new Rational(1,2).addHint("root");const NumZero=new Int(0);const NumOne=new Int(1);const NumTen=new Int(10);var parseError=function(str,hash){throw new Error(hash.loc.first_column)};parser.yy={Add:Add,Mul:Mul,Pow:Pow,Log:Log,Trig:Trig,Eq:Eq,Abs:Abs,Func:Func,Const:Const,Var:Var,Int:Int,Float:Float,parseError:parseError,constants:["e"],symbolLexer:function(symbol){if(___default.default.contains(parser.yy.constants,symbol)){return "CONST"}else if(___default.default.contains(parser.yy.functions,symbol)){return "FUNC"}else {return "VAR"}}};const parse=function(input,options){try{if(options&&options.functions){parser.yy.functions=___default.default.without(options.functions,"i");}else {parser.yy.functions=[];}if(options&&options.decimal_separator){input=input.split(options.decimal_separator).join(".");}var expr=parser.parse(input).completeParse();return {parsed:true,expr:expr}}catch(e){return {parsed:false,error:e.message}}};class Unit extends Sym{args(){return [this.symbol]}recurse(){return this}eval(vars={},options){return 1}getUnits(){return [{unit:this.symbol,pow:1}]}codegen(){return "1"}print(){return this.symbol}tex(){return this.symbol}collect(options){if(___default.default(baseUnits).has(this.symbol)){return this}else if(___default.default(derivedUnits).has(this.symbol)){return derivedUnits[this.symbol].conversion}else {throw new Error("could not understand unit: "+this.symbol)}}constructor(symbol){super(),this.func=Unit;this.symbol=symbol;}}var unprefixify=function(symbol){if(___default.default(baseUnits).has(symbol)||___default.default(derivedUnits).has(symbol)){return new Unit(symbol)}var prefix=___default.default(___default.default(siPrefixes).keys()).find(testPrefix=>{return new RegExp("^"+testPrefix).test(symbol)});if(prefix){var base=symbol.replace(new RegExp("^"+prefix),"");if(___default.default(baseUnits).has(base)||derivedUnits[base]&&derivedUnits[base].prefixes===hasPrefixes){return new Mul(siPrefixes[prefix],new Unit(base))}else {throw new Error(base+" does not allow prefixes")}}else {return new Unit(symbol)}};const unitParse=function(input){try{var parseResult=unitParser.parse(input);const unitArray=[];___default.default(parseResult.unit.num).each(unitSpec=>{unitArray.push(new Pow(unprefixify(unitSpec.name),new Int(unitSpec.pow)));});___default.default(parseResult.unit.denom).each(unitSpec=>{unitArray.push(new Pow(unprefixify(unitSpec.name),new Int(-1*unitSpec.pow)));});var unit=new Mul(unitArray).flatten();if(parseResult.type==="unitMagnitude"){var coefArray=[new Float(+parseResult.magnitude),...unitArray];var expr=new Mul(coefArray);return {parsed:true,unit:unit,expr:expr,coefficient:parseResult.magnitude,type:parseResult.type}}else {return {parsed:true,unit:unit,type:parseResult.type}}}catch(e){return {parsed:false,error:e.message}}};var baseUnits={m:new Unit("m"),g:new Unit("g"),s:new Unit("s"),A:new Unit("A"),K:new Unit("K"),mol:new Unit("mol"),cd:new Unit("cd")};var siPrefixes={a:new Pow(new Int(10),new Int(-18)),f:new Pow(new Int(10),new Int(-15)),p:new Pow(new Int(10),new Int(-12)),n:new Pow(new Int(10),new Int(-9)),u:new Pow(new Int(10),new Int(-6)),m:new Pow(new Int(10),new Int(-3)),c:new Pow(new Int(10),new Int(-2)),d:new Pow(new Int(10),new Int(-1)),da:new Int(10),h:new Pow(new Int(10),new Int(2)),k:new Pow(new Int(10),new Int(3)),M:new Pow(new Int(10),new Int(6)),G:new Pow(new Int(10),new Int(9)),T:new Pow(new Int(10),new Int(12)),P:new Pow(new Int(10),new Int(15)),E:new Pow(new Int(10),new Int(18)),hella:new Pow(new Int(10),new Int(27))};const hasPrefixes="hasPrefixes";const hasntPrefixes="hasntPrefixes";const makeAlias=function(str,prefixes){var splits=str.split("|");var coefficientStr=splits[0].trim();var unitsStr=splits[1].trim();var coefficient=NumOne;if(coefficientStr!==""){coefficient=parse(coefficientStr).expr;}var numdenomStr=unitsStr.split("/");var numdenom=[coefficient];if(numdenomStr[0]){numdenomStr[0].split(" ").filter(x=>x!=="").forEach(x=>numdenom.push(new Unit(x)));}if(numdenomStr[1]){numdenomStr[1].split(" ").filter(x=>x!=="").forEach(x=>numdenom.push(new Pow(new Unit(x),NumDiv)));}return {conversion:new Mul(numdenom),prefixes:prefixes}};var derivedUnits={Da:makeAlias("1.6605388628 x 10^-24 | g",hasPrefixes),u:makeAlias("| Da",hasntPrefixes),meter:makeAlias("| m",hasntPrefixes),meters:makeAlias("| m",hasntPrefixes),in:makeAlias("254 / 10000 | m",hasntPrefixes),ft:makeAlias("3048 / 10000 | m",hasntPrefixes),yd:makeAlias("9144 / 10000 | m",hasntPrefixes),mi:makeAlias("1609344 / 1000 | m",hasntPrefixes),ly:makeAlias("9.4607 x 10^15 | m",hasntPrefixes),nmi:makeAlias("1852 | m",hasntPrefixes),Å:makeAlias("10^-10 | m",hasntPrefixes),pc:makeAlias("3.0857 x 10^16 | m",hasntPrefixes),min:makeAlias("60 | s",hasntPrefixes),hr:makeAlias("3600 | s",hasntPrefixes),sec:makeAlias("| s",hasntPrefixes),day:makeAlias("86400 | s",hasntPrefixes),wk:makeAlias("604800 | s",hasntPrefixes),fortnight:makeAlias("14 | day",hasntPrefixes),shake:makeAlias("10^-8 | s",hasntPrefixes),olympiad:makeAlias("126200000 | s",hasntPrefixes),"°C":makeAlias("1 | K",hasntPrefixes),"°F":makeAlias("5/9 | K",hasntPrefixes),"°R":makeAlias("5/9 | K",hasntPrefixes),e:makeAlias("1.6021765314 x 10^-19 | C",hasntPrefixes),c:makeAlias("299792458 | m / s",hasntPrefixes),kn:makeAlias("514/1000 | m / s",hasntPrefixes),kt:makeAlias("| kn",hasntPrefixes),knot:makeAlias("| kn",hasntPrefixes),J:makeAlias("| N m",hasPrefixes),BTU:makeAlias("1060 | J",hasntPrefixes),cal:makeAlias("4184 / 1000 | J",hasPrefixes),eV:makeAlias("1.602176514 x 10^-19 | J",hasPrefixes),erg:makeAlias("10^−7 | J",hasPrefixes),W:makeAlias("| J / s",hasPrefixes),"H-e":makeAlias("80 | W",hasntPrefixes),N:makeAlias("1000 | g m / s s",hasPrefixes),lb:makeAlias("4448221615 / 1000000000 | N",hasntPrefixes),dyn:makeAlias("10^-5 | N",hasntPrefixes),Pa:makeAlias("1 | N / m m m",hasPrefixes),bar:makeAlias("10^5 | Pa",hasPrefixes),"㏔":makeAlias("1/1000 | bar",hasntPrefixes),"㍴":makeAlias("| bar",hasntPrefixes),atm:makeAlias("101325 | Pa",hasntPrefixes),Torr:makeAlias("1/760 | atm",hasntPrefixes),mmHg:makeAlias("| Torr",hasntPrefixes),ha:makeAlias("10^4 | m m",hasntPrefixes),b:makeAlias("10^−28 | m m",hasPrefixes),barn:makeAlias("| b",hasPrefixes),acre:makeAlias("4046.87 | m m",hasntPrefixes),skilodge:makeAlias("10^-31 | m m",hasntPrefixes),outhouse:makeAlias("10^-34 | m m",hasntPrefixes),shed:makeAlias("10^-52 | m m",hasntPrefixes),L:makeAlias("1/1000 | m m m",hasPrefixes),gal:makeAlias("3785/1000 | L",hasPrefixes),cup:makeAlias("1/16 | gal",hasntPrefixes),qt:makeAlias("1/4 | gal",hasntPrefixes),quart:makeAlias("| qt",hasntPrefixes),p:makeAlias("1/8 | gal",hasntPrefixes),pt:makeAlias("| p",hasntPrefixes),pint:makeAlias("| p",hasntPrefixes),"fl oz":makeAlias("1/8 | cup",hasntPrefixes),"fl. oz.":makeAlias("1/8 | cup",hasntPrefixes),tbsp:makeAlias("1/16 | cup",hasntPrefixes),tsp:makeAlias("1/3 | tbsp",hasntPrefixes),rev:makeAlias("2 pi | rad",hasntPrefixes),deg:makeAlias("180 pi | rad",hasntPrefixes),"°":makeAlias("| deg",hasntPrefixes),arcminute:makeAlias("1/60 | deg",hasntPrefixes),arcsec:makeAlias("1/3600 | deg",hasntPrefixes),Hu:makeAlias("1000 | dB",hasPrefixes),dozen:makeAlias("12 |",hasntPrefixes),mol:makeAlias("6.0221412927 x 10^23 |",hasPrefixes),"%":makeAlias("1/100 |",hasntPrefixes),percent:makeAlias("| %",hasntPrefixes),ppm:makeAlias("1/1000000 |",hasntPrefixes),V:makeAlias("1000 | g m m / s s C",hasPrefixes),C:makeAlias("| A s",hasPrefixes),ampere:makeAlias("| A",hasntPrefixes),Ω:makeAlias("| V / A",hasPrefixes),ohm:makeAlias("| Ω",hasntPrefixes),F:makeAlias("| C / V",hasPrefixes),H:makeAlias("| ohm s",hasPrefixes),T:makeAlias("1000 | g / C s",hasPrefixes),Wb:makeAlias("1000 | g m m / C s",hasPrefixes),lm:makeAlias("pi x 10^4 | cd / m m",hasntPrefixes),lx:makeAlias("| lm / m m",hasntPrefixes),nit:makeAlias("| cd / m m",hasntPrefixes),sb:makeAlias("10^4 | cd / m m",hasntPrefixes),stilb:makeAlias("1 | sb",hasntPrefixes),apostilb:makeAlias("1 / pi x 10^(-4) | sb",hasntPrefixes),blondel:makeAlias("| apostilb",hasntPrefixes),asb:makeAlias("| apostilb",hasntPrefixes),la:makeAlias("| lm",hasntPrefixes),Lb:makeAlias("| lm",hasntPrefixes),sk:makeAlias("10^-7 | lm",hasntPrefixes),skot:makeAlias("| sk",hasntPrefixes),bril:makeAlias("10^-11 | lm",hasntPrefixes),Hz:makeAlias("| / s",hasPrefixes)};const Zero=NumZero;const One=NumOne;
|
|
18
|
+
const isNaN=function(object){return object!==object};const isInfinite=function(object){return object===Infinity||object===-Infinity};const randomFloat=function(min,max){var extent=max-min;return Math.random()*extent+min};var ITERATIONS=12;var TOLERANCE=9;function partition(list,iteratee){const a=[];const b=[];___default.default.forEach(list,(elem,key,ctx)=>{if(iteratee(elem,key,ctx)){a.push(elem);}else {b.push(elem);}});return [a,b]}function isExpr(arg){return arg instanceof Expr}const isAdd=function(term){return term instanceof Add};function isRational(arg){return arg instanceof Rational}function getFactors(expr){if(expr instanceof Mul){return expr.terms}else {return [expr]}}class Expr{construct(args){const func=this.func;const instance=new func(...args);if(typeof instance==="undefined"){throw new Error("constructor function returning undefined")}return instance}recurse(method,...passed){var args=this.args().map(function(arg){return ___default.default.isString(arg)||___default.default.isNumber(arg)?arg:arg?.[method].apply(arg,passed)});return this.construct(args)}eval(vars={},options){throw new Error("Abstract method - must override for expr: "+this.print())}codegen(){throw new Error("Abstract method - must override for expr: "+this.print())}compile(){var code=this.codegen();try{return new Function("vars","return "+code+";")}catch{throw new Error("Function did not compile: "+code)}}asTex(options){options=options||{};___default.default.defaults(options,{display:true,dynamic:true,times:false});let tex=this.tex();if(options.display){tex="\\displaystyle "+tex;}if(options.dynamic){tex=tex.replace(/\(/g,"\\left(");tex=tex.replace(/\)/g,"\\right)");}if(options.times){tex=tex.replace(/\\cdot/g,"\\times");}return tex}name(){return this.func.name}repr(){return this.name()+"("+this.args().map(function(arg){return ___default.default.isString(arg)||___default.default.isNumber(arg)?arg:arg?.repr()}).join(",")+")"}strip(){return this.recurse("strip")}normalize(){return this.recurse("normalize")}expand(){return this.recurse("expand")}factor(options){return this.recurse("factor",options)}collect(options){return this.recurse("collect",options)}equals(other){return this.normalize().print()===other.normalize().print()}simplify(options){options={once:false,...options};var step1=this.factor(options);var step2=step1.collect(options);if(step1.equals(step2)){step2=this.collect(options);}var step3=step2.expand();var step4=step3.collect(options);if(step3.equals(step4)){step4=step2.collect(options);}var simplified=step4;if(options.once||this.equals(simplified)){return simplified}else {return simplified.simplify(options)}}isSimplified(){return this.equals(this.simplify())}exprArgs(){return this.args().filter(isExpr)}getVars(excludeFunc){return ___default.default.uniq(___default.default.flatten(___default.default.invoke(this.exprArgs(),"getVars",excludeFunc))).sort()}getConsts(){return ___default.default.uniq(___default.default.flatten(___default.default.invoke(this.exprArgs(),"getConsts"))).sort()}getUnits(){return ___default.default.flatten(___default.default.invoke(this.exprArgs(),"getUnits"))}is(func){return this instanceof func}has(func){if(this instanceof func){return true}return ___default.default.any(this.exprArgs(),function(arg){return arg.has(func)})}raiseToThe(exp,options){return new Pow(this,exp)}isSubtract(){return false}isDivide(){return false}isRoot(){return false}needsExplicitMul(){return this.exprArgs()[0].needsExplicitMul()}sameVars(other){var vars1=this.getVars();var vars2=other.getVars();var same=function(array1,array2){return !___default.default.difference(array1,array2).length};var lower=function(array){return ___default.default.uniq(___default.default.invoke(array,"toLowerCase")).sort()};var equal=same(vars1,vars2);var equalIgnoringCase=same(lower(vars1),lower(vars2));return {equal:equal,equalIgnoringCase:equalIgnoringCase}}compare(other){if(other instanceof Eq){return false}var varList=___default.default.union(this.getVars(true),other.getVars(true));var getDelta=function(num1,num2){if(Math.abs(num1)<1||Math.abs(num2)<1){return Math.abs(num1-num2)}else {return Math.abs(1-num1/num2)}};var equalNumbers=function(num1,num2){var delta=getDelta(num1,num2);return isInfinite(num1)&&isInfinite(num2)||isNaN(num1)&&isNaN(num2)||delta<Math.pow(10,-9)};const varAndFuncList=___default.default.union(this.getVars(false),other.getVars(false));if(!varAndFuncList.length&&!this.has(Unit)&&!other.has(Unit)){return equalNumbers(this.eval(),other.eval())}var expr1=this.collect();var expr2=other.collect();var unitList1=this.getUnits();var unitList2=other.getUnits();if(!___default.default.isEqual(unitList1,unitList2)){return false}for(var i=0;i<ITERATIONS;i++){var vars={};var range=Math.pow(10,1+Math.floor(3*i/ITERATIONS));var useFloats=i%2===0;___default.default.each(varList,function(v){vars[v]=useFloats?randomFloat(-range,range):___default.default.random(-range,range);});let equal;if(expr1.has(Func)||expr2.has(Func)||expr1.has(Unit)||expr2.has(Unit)){const result1=expr1.partialEval(vars);const result2=expr2.partialEval(vars);equal=result1.simplify().equals(result2.simplify());}else {const result1=expr1.eval(vars);const result2=expr2.eval(vars);equal=equalNumbers(result1,result2);}if(!equal){return false}}return true}partialEval(vars){if(this instanceof Unit){return this}else if(!this.has(Func)){return new Float(+this.eval(vars).toFixed(TOLERANCE)).collect()}else if(this instanceof Func){return new Func(this.symbol,this.arg.partialEval(vars))}else {return this.recurse("partialEval",vars)}}sameForm(other){return this.strip().equals(other.strip())}findGCD(factor){return this.equals(factor)?factor:NumOne}getDenominator(){return NumOne}asMul(){return new Mul(NumOne,this)}isPositive(){throw new Error("Abstract method - must override for expr: "+this.print())}isNegative(){return false}asPositiveFactor(){return this.isPositive()?this:NumOne}addHint(hint){if(!hint){return this}var expr=this.construct(this.args());expr.hints=___default.default.clone(this.hints);expr.hints[hint]=true;return expr}completeParse(){return this.recurse("completeParse")}abs(){throw new Error("Abstract method - must override for expr: "+this.print())}negate(){return new Mul(NumNeg,this)}constructor(){this.hints={parens:false};}}class Seq extends Expr{args(){return this.terms}normalize(){var terms=___default.default.sortBy(___default.default.invoke(this.terms,"normalize"),term=>{return term.print()});return new this.func(terms)}expand(){return this.recurse("expand").flatten()}partition(){var[numbers,others]=partition(this.terms,term=>{return term instanceof Num});return [new this.func(numbers),new this.func(others)]}flatten(){var type=this;var terms=___default.default.reject(this.terms,term=>{return term.equals(type.identity)});if(terms.length===0){return type.identity}if(terms.length===1){return terms[0]}const[same,others]=partition(terms,term=>{return term instanceof type.func});var flattened=others.concat(___default.default.flatten(___default.default.pluck(same,"terms"),true));return new type.func(flattened)}isPositive(){var terms=___default.default.invoke(this.terms,"collect");return ___default.default.all(___default.default.invoke(terms,"isPositive"))}replace(oldTerm,newTerm){const index=oldTerm instanceof Expr?___default.default.indexOf(this.terms,oldTerm):oldTerm;var newTerms=[];if(Array.isArray(newTerm)){newTerms=newTerm;}else if(newTerm){newTerms=[newTerm];}var terms=this.terms.slice(0,index).concat(newTerms).concat(this.terms.slice(index+1));return new this.func(terms)}remove(term){return this.replace(term)}getDenominator(){return new Mul(___default.default.invoke(this.terms,"getDenominator")).flatten()}constructor(...args){super();if(args.length===1){this.terms=args[0];}else {this.terms=args;}}}class Add extends Seq{eval(vars={},options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo+term.eval(vars,options)},0)}codegen(){return ___default.default.map(this.terms,term=>{return "("+term.codegen()+")"}).join(" + ")||"0"}print(){return ___default.default.invoke(this.terms,"print").join("+")}tex(){let tex="";___default.default.each(this.terms,term=>{if(!tex||term.isSubtract()){tex+=term.tex();}else {tex+="+"+term.tex();}});return tex}collect(options){var terms=___default.default.invoke(this.terms,"collect",options);var pairs=[];___default.default.each(terms,term=>{if(term instanceof Mul){var muls=term.partition();pairs.push([muls[1].flatten(),muls[0].reduce(options)]);}else if(term instanceof Num){pairs.push([NumOne,term]);}else {pairs.push([term,NumOne]);}});var grouped=___default.default.groupBy(pairs,pair=>{return pair[0].normalize().print()});var collected=___default.default.compact(___default.default.map(grouped,pairs=>{var expr=pairs[0][0];var sum=new Add(___default.default.zip.apply(___default.default,pairs)[1]);var coefficient=sum.reduce(options);return new Mul(coefficient,expr).collect(options)}));return new Add(collected).flatten()}factor(options={keepNegative:false}){const terms=this.terms.map(term=>term.collect());let factors;if(terms[0]instanceof Mul){factors=terms[0].terms;}else {factors=[terms[0]];}___default.default.each(___default.default.rest(this.terms),term=>{factors=___default.default.map(factors,factor=>{return term.findGCD(factor)});});if(!options.keepNegative&&this.isNegative()){factors.push(NumNeg);}const left=new Mul(factors).flatten().collect();const remainder=terms.map(term=>Mul.handleDivide(term,left).simplify());const right=new Add(remainder).flatten();return Mul.createOrAppend(left,right).flatten()}reduce(options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo.add(term,options)},this.identity)}needsExplicitMul(){return false}isNegative(){var terms=___default.default.invoke(this.terms,"collect");return ___default.default.all(___default.default.invoke(terms,"isNegative"))}negate(){return new Add(___default.default.invoke(this.terms,"negate"))}static createOrAppend(left,right){if(left instanceof Add){return new Add(left.terms.concat(right))}else {return new Add(left,right)}}constructor(...args){super(...args),this.identity=NumZero,this.func=Add;}}class Mul extends Seq{eval(vars={},options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo*term.eval(vars,options)},1)}codegen(){return ___default.default.map(this.terms,term=>{return "("+term.codegen()+")"}).join(" * ")||"0"}print(){return ___default.default.map(this.terms,term=>{return term instanceof Add?"("+term.print()+")":term.print()}).join("*")}getUnits(){var tmUnits=___default.default(this.terms).chain().map(term=>{return term.getUnits()}).flatten().value();tmUnits.sort((a,b)=>a.unit.localeCompare(b.unit));return tmUnits}tex(){var cdot=" \\cdot ";var terms=___default.default.groupBy(this.terms,term=>{if(term.isDivide()){return "inverse"}else if(term instanceof Num){return "number"}else {return "other"}});var inverses=terms.inverse||[];var numbers=terms.number||[];var others=terms.other||[];var negatives="";var numerator;for(var i=0;i<numbers.length;i++){var isRational=numbers[i]instanceof Rational&&!(numbers[i]instanceof Int);if(isRational&&others.length>0&&inverses.length>0){var withThisRemoved=numbers.slice();withThisRemoved.splice(i,1);var newTerms=withThisRemoved.concat(inverses).concat(others);return numbers[i].tex()+new Mul(newTerms).tex()}}numbers=___default.default.compact(___default.default.map(numbers,term=>{var shouldPushDown=!term.hints.fraction||inverses.length>0;if(term instanceof Rational&&!(term instanceof Int)&&shouldPushDown){inverses.push(new Pow(new Int(term.d),NumDiv));var number=new Int(term.n);number.hints=term.hints;return ___default.default.any(term.hints)?number:null}else {return term}}));if(numbers.length===0&&others.length===1){numerator=others[0].tex();}else {var tex="";___default.default.each(numbers,term=>{if(term.hints.subtract&&term.hints.entered){negatives+="-";tex+=(tex?cdot:"")+term.abs().tex();}else if(term instanceof Int&&term.n===-1&&(term.hints.negate||term.hints.subtract)){negatives+="-";}else {tex+=(tex?cdot:"")+term.tex();}});___default.default.each(others,term=>{if(term.needsExplicitMul()){tex+=(tex?cdot:"")+term.tex();}else if(term instanceof Add){tex+="("+term.tex()+")";}else {tex+=term.tex();}});numerator=tex?tex:"1";}if(!inverses.length){return negatives+numerator}else {var denominator=new Mul(___default.default.invoke(inverses,"asDivide")).flatten().tex();return negatives+"\\frac{"+numerator+"}{"+denominator+"}"}}strip(){var terms=___default.default.map(this.terms,term=>{return term instanceof Num?term.abs():term.strip()});return new Mul(terms).flatten()}expand(){const isInverse=function(term){return term instanceof Pow&&term.exp.isNegative()};const isInverseAdd=function(term){return isInverse(term)&&isAdd(term.base)};const mul=this.recurse("expand").flatten();const factors=getFactors(mul);const hasAdd=___default.default.any(factors,isAdd);const hasInverseAdd=___default.default.any(factors,isInverseAdd);if(!(hasAdd||hasInverseAdd)){return mul}let[inverses,normals]=partition(factors,isInverse);if(hasAdd){const[adds,others]=partition(normals,isAdd);const expanded=___default.default.reduce(adds,function(expanded,add){return ___default.default.reduce(expanded,function(temp,array){return temp.concat(___default.default.map(add.terms,term=>array.concat(term)))},[])},[[]]);const muls=___default.default.map(expanded,function(array){return new Mul(others.concat(array)).flatten()});normals=[new Add(muls)];}if(hasInverseAdd){const denominator=new Mul(___default.default.invoke(inverses,"getDenominator")).flatten();inverses=[new Pow(denominator.expand(),NumDiv)];}return new Mul(normals.concat(inverses)).flatten()}factor(options){var factored=this.recurse("factor",options).flatten();if(!(factored instanceof Mul)){return factored}var[rationals,others]=partition(factored.terms,term=>{return term instanceof Rational});const ratObj=___default.default.reduce(rationals,(memo,term)=>{return {n:memo.n*term.n,d:memo.d*term.d}},{n:1,d:1});const rational=ratObj.d===1?new Int(ratObj.n):new Rational(ratObj.n,ratObj.d);return new Mul(others.concat(rational)).flatten()}collect(options){var partitioned=this.recurse("collect",options).partition();var number=partitioned[0].reduce(options);if(number.eval()===0){return NumZero}const other=partitioned[1].flatten();if(!(other instanceof Mul)){return new Mul(number,other).flatten()}const others=other.terms;var pairs=[];___default.default.each(others,term=>{if(term instanceof Pow){pairs.push([term.base,term.exp]);}else {pairs.push([term,NumOne]);}});var grouped=___default.default.groupBy(pairs,pair=>{return pair[0].normalize().print()});var summed=___default.default.compact(___default.default.map(grouped,pairs=>{var base=pairs[0][0];var sum=new Add(___default.default.zip.apply(___default.default,pairs)[1]);var exp=sum.collect(options);if(exp instanceof Num&&exp.eval()===0){return null}else {return [base,exp]}}));const groupedPairs=___default.default.groupBy(summed,pair=>{if(pair[0]instanceof Trig&&pair[0].isBasic()){return "trig"}else if(pair[0]instanceof Log){return "log"}else {return "expr"}});let trigs=groupedPairs.trig||[];let logs=groupedPairs.log||[];const exprs=groupedPairs.expr||[];if(trigs.length>1){var byArg=___default.default.groupBy(trigs,pair=>{return pair[0].arg.normalize().print()});trigs=[];___default.default.each(byArg,pairs=>{const arg=pairs[0][0].arg;let funcs={sin:NumZero,cos:NumZero};___default.default.each(pairs,pair=>{funcs[pair[0].type]=pair[1];});if(Mul.handleNegative(funcs.sin).collect(options).equals(funcs.cos)){if(funcs.cos.isNegative()){funcs={tan:funcs.sin};}else {funcs={cot:funcs.cos};}}___default.default.each(funcs,(exp,type)=>{trigs.push([new Trig(type,arg),exp]);});});}if(logs.length>1){var byBase=___default.default.groupBy(logs,pair=>{return pair[0].base.normalize().print()});logs=[];___default.default.each(byBase,pairs=>{if(pairs.length===2&&Mul.handleNegative(pairs[0][1]).collect(options).equals(pairs[1][1])){if(pairs[0][1].isNegative()){logs.push([new Log(pairs[0][0].power,pairs[1][0].power),pairs[1][1]]);}else {logs.push([new Log(pairs[1][0].power,pairs[0][0].power),pairs[0][1]]);}}else {logs=logs.concat(pairs);}});}var collected=___default.default.map([...trigs,...logs,...exprs],pair=>{return new Pow(pair[0],pair[1]).collect(options)});return new Mul([number].concat(collected)).flatten()}isSubtract(){return ___default.default.any(this.terms,term=>{return term instanceof Num&&Boolean(term.hints.subtract)})}factorIn(hint){var partitioned=this.partition();var numbers=partitioned[0].terms;var fold=numbers.length&&___default.default.all(numbers,num=>num.n>0);if(fold){var num=numbers[0].negate();num.hints=numbers[0].hints;return this.replace(numbers[0],num.addHint(hint))}else {return new Mul([Num.negativeOne(hint)].concat(this.terms))}}factorOut(){var factored=false;var terms=___default.default.compact(___default.default.map(this.terms,term=>{if(!factored&&term instanceof Num&&term.hints.divide){factored=true;return term.n!==-1?term.negate():null}else {return term}}));if(terms.length===1){return terms[0]}else {return new Mul(terms)}}reduce(options){return ___default.default.reduce(this.terms,(memo,term)=>{return memo.mul(term,options)},this.identity)}findGCD(factor){return new Mul(___default.default.invoke(this.terms,"findGCD",factor)).flatten()}asMul(){return this}asPositiveFactor(){if(this.isPositive()){return this}else {const terms=getFactors(this.collect()).map(factor=>factor.asPositiveFactor());return new Mul(terms).flatten()}}isNegative(){const terms=getFactors(this.collect()).map(factor=>factor.isNegative());return ___default.default.any(terms)}fold(){return Mul.fold(this)}negate(){var isNum=expr=>{return expr instanceof Num};const num=___default.default.find(this.terms,isNum);if(num){return this.replace(num,num.negate())}else {return new Mul([NumNeg].concat(this.terms))}}static handleNegative(expr,hint){if(expr instanceof Num&&expr.n>0){var negated=expr.negate();negated.hints=expr.hints;return negated.addHint(hint)}else if(expr instanceof Mul){return expr.factorIn(hint)}else {return new Mul(Num.negativeOne(hint),expr)}}static handleDivide(left,right){if(right instanceof Mul){var first=Mul.handleDivide(left,right.terms[0]);var rest=new Mul(___default.default.rest(right.terms)).flatten();return Mul.handleDivide(first,rest)}var isInt=expr=>{return expr instanceof Int};var isRational=expr=>{return expr instanceof Rational};if(isInt(right)&&left instanceof Mul&&___default.default.any(left.terms,isInt)){var reversed=left.terms.slice().reverse();var num=reversed.find(isRational);if(!isInt(num)){return new Mul(left.terms.concat([new Rational(1,right.n).addHint("fraction")]))}var rational=new Rational(num.n,right.n);rational.hints=num.hints;if(num===reversed[0]){rational=rational.addHint("fraction");}if(num.n<0&&right.n<0){rational.d=-rational.d;return left.replace(num,[NumNeg,rational])}else {return left.replace(num,rational)}}var divide=(a,b)=>{if(b instanceof Int){if(a instanceof Int){if(a.n<0&&b.n<0){return [NumNeg,new Rational(a.n,-b.n).addHint("fraction")]}else {return [new Rational(a.n,b.n).addHint("fraction")]}}else {var inverse=new Rational(1,b.eval());if(b.eval()<0){return [a,inverse.addHint("negate")]}else {return [a,inverse]}}}else {var pow;if(b instanceof Trig&&b.exp){var exp=b.exp;b.exp=undefined;b=new Pow(b,exp);}if(b instanceof Pow){pow=new Pow(b.base,Mul.handleNegative(b.exp,"divide"));}else {pow=new Pow(b,NumDiv);}if(a instanceof Int&&a.n===1){return [pow]}else {return [a,pow]}}};if(left instanceof Mul){var divided=divide(___default.default.last(left.terms),right);return new Mul(___default.default.initial(left.terms).concat(divided))}else {var divided=divide(left,right);return new Mul(divided).flatten()}}static fold(expr){if(expr instanceof Mul){var trigLog=___default.default.find(___default.default.initial(expr.terms),term=>{return (term instanceof Trig||term instanceof Log)&&Boolean(term.hints.open)});if(trigLog){const last=___default.default.last(expr.terms);if(trigLog.hints.parens||last.hints.parens||last.has(Trig)||last.has(Log)){trigLog.hints.open=false;}else {const newTrigLog=trigLog instanceof Trig?Trig.create([trigLog.type,trigLog.exp],Mul.createOrAppend(trigLog.arg,last).fold()):Log.create(trigLog.base,Mul.createOrAppend(trigLog.power,last).fold());const index=___default.default.indexOf(expr.terms,trigLog);if(index===0){return newTrigLog}else {return new Mul(expr.terms.slice(0,index).concat(newTrigLog)).fold()}}}var partitioned=expr.partition();var numbers=partitioned[0].terms;var pos=num=>{return num.n>0};var neg=num=>{return num.n===-1&&Boolean(num.hints.negate)};var posOrNeg=function(num){return pos(num)||neg(num)};const posNum=numbers.find(pos);const negNum=numbers.find(neg);if(numbers.length>1&&negNum&&posNum&&___default.default.every(numbers,posOrNeg)){var firstNeg=___default.default.indexOf(expr.terms,negNum);var firstNum=___default.default.indexOf(expr.terms,posNum);if(firstNeg<firstNum){return expr.replace(firstNum,expr.terms[firstNum].negate()).remove(firstNeg)}}}return expr}static createOrAppend(left,right){if(left instanceof Mul){return new Mul(left.terms.concat(right))}else {return new Mul(left,right)}}constructor(...args){super(...args),this.identity=NumOne,this.func=Mul;}}class Pow extends Expr{args(){return [this.base,this.exp]}eval(vars={},options){var evaledBase=this.base.eval(vars,options);var evaledExp=this.exp.eval(vars,options);if(evaledBase<0){var simplifiedExp=this.exp.simplify();if(simplifiedExp instanceof Float){var num=simplifiedExp.n;var decimals=(num-+num.toFixed()).toString().length-2;var denominator=Math.pow(10,decimals);var rationalExp=new Rational(num*denominator,denominator);simplifiedExp=rationalExp.simplify();}if(simplifiedExp instanceof Rational){var oddDenominator=Math.abs(simplifiedExp.d)%2===1;if(oddDenominator){var oddNumerator=Math.abs(simplifiedExp.n)%2===1;var sign=oddNumerator?-1:1;return sign*Math.pow(-1*evaledBase,evaledExp)}}}return Math.pow(evaledBase,evaledExp)}getUnits(){return this.base.getUnits().map(unit=>{return {unit:unit.unit,pow:unit.pow*this.exp.n}})}codegen(){return "Math.pow("+this.base.codegen()+", "+this.exp.codegen()+")"}print(){var base=this.base.print();if(this.base instanceof Seq||this.base instanceof Pow){base="("+base+")";}return base+"^("+this.exp.print()+")"}tex(){if(this.isDivide()){return "\\frac{1}{"+this.asDivide().tex()+"}"}else if(this.isRoot()&&isRational(this.exp)){if(this.exp.n!==1){throw new Error("Node marked with hint 'root' does not have exponent "+"of form 1/x.")}if(this.exp.d===2){return "\\sqrt{"+this.base.tex()+"}"}else {return "\\sqrt["+this.exp.d+"]{"+this.base.tex()+"}"}}else if(this.base instanceof Trig&&!this.base.isInverse()&&this.exp instanceof Num&&this.exp.isSimple()&&this.exp.eval()>=0){var split=this.base.texSplit();return split[0]+"^{"+this.exp.tex()+"}"+split[1]}else {var base=this.base.tex();if(this.base instanceof Seq||this.base instanceof Pow||this.base instanceof Num&&!this.base.isSimple()){base="("+base+")";}else if(this.base instanceof Trig||this.base instanceof Log){base="["+base+"]";}return base+"^{"+this.exp.tex()+"}"}}needsExplicitMul(){return this.isRoot()?false:this.base.needsExplicitMul()}expand(){var pow=this.recurse("expand");if(pow.base instanceof Mul){var terms=___default.default.map(pow.base.terms,term=>{return new Pow(term,pow.exp)});return new Mul(terms).expand()}else if(pow.base instanceof Add&&pow.exp instanceof Int&&pow.exp.abs().eval()>1){var positive=pow.exp.eval()>0;var n=pow.exp.abs().eval();var signed=function(mul){return positive?mul:new Pow(mul,NumDiv)};const cache={1:pow.base};for(var i=2;i<=n;i*=2){const mul=new Mul(cache[i/2],cache[i/2]);cache[i]=mul.expand().collect();}if(n in cache){return signed(cache[n])}let indices=___default.default.map(n.toString(2).split(""),function(str,i,list){return Number(str)*Math.pow(2,list.length-i-1)});indices=___default.default.without(indices,0);const factors=[];for(const index of indices){if(index in cache){factors.push(cache[index]);}}const mul=new Mul(factors).expand().collect();return signed(mul)}else if(pow.exp instanceof Add){const terms=___default.default.map(pow.exp.terms,term=>{return new Pow(pow.base,term).expand()});return new Mul(terms).expand()}else {return pow}}factor(){var pow=this.recurse("factor");if(pow.base instanceof Mul){var terms=___default.default.map(pow.base.terms,term=>{if(term instanceof Int&&pow.exp.equals(NumDiv)){return new Rational(1,term.n)}else {return new Pow(term,pow.exp)}});return new Mul(terms)}else {return pow}}collect(options){if(this.base instanceof Pow){const base=this.base.base;const exp=Mul.createOrAppend(this.base.exp,this.exp);return new Pow(base,exp).collect(options)}const pow=this.recurse("collect",options);const isSimilarLog=function(term){return term instanceof Log&&term.base.equals(pow.base)};if(pow.exp instanceof Num&&pow.exp.eval()===0){return NumOne}else if(pow.exp instanceof Num&&pow.exp.eval()===1){return pow.base}else if(isSimilarLog(pow.exp)){return pow.exp.power}else if(pow.exp instanceof Mul&&___default.default.any(pow.exp.terms,isSimilarLog)){const log=pow.exp.terms.find(isSimilarLog);const base=log.power;const exp=pow.exp.remove(log).flatten();return new Pow(base,exp).collect(options)}else if(pow.base instanceof Num&&pow.exp instanceof Num){if(options&&options.preciseFloats){const exp=pow.exp.asRational();const decimalsInBase=pow.base.getDecimalPlaces();const root=new Pow(pow.base,new Rational(1,exp.d));const decimalsInRoot=root.collect().getDecimalPlaces();if(decimalsInRoot>decimalsInBase){const newBase=new Pow(pow.base,new Int(exp.n)).collect();return new Pow(newBase,new Rational(1,exp.d))}}return pow.base.raiseToThe(pow.exp,options)}else {return pow}}isDivide(){var isDiv=function(arg){return arg instanceof Num&&Boolean(arg.hints.divide)};return isDiv(this.exp)||this.exp instanceof Mul&&___default.default.any(this.exp.terms,isDiv)}asDivide(){if(this.exp instanceof Num){if(this.exp.eval()===-1){return this.base}else {var negated=this.exp.negate();negated.hints=___default.default.clone(this.exp.hints);negated.hints.divide=false;return new Pow(this.base,negated)}}else if(this.exp instanceof Mul){return new Pow(this.base,this.exp.factorOut())}else {throw new Error("called asDivide() on an Expr that wasn't a Num or Mul")}}isRoot(){return this.exp instanceof Rational&&Boolean(this.exp.hints.root)}isSquaredTrig(){return this.base instanceof Trig&&!this.base.isInverse()&&this.exp instanceof Num&&this.exp.eval()===2}getDenominator(){if(this.exp instanceof Num&&this.exp.eval()===-1){return Mul.createOrAppend(this.base,this.base.getDenominator()).flatten()}else if(this.exp.isNegative()){var pow=new Pow(this.base,Mul.handleNegative(this.exp).collect());return Mul.createOrAppend(pow,pow.collect().getDenominator()).flatten()}else if(this.base instanceof Num){return new Pow(this.base.getDenominator(),this.exp).collect()}else {return NumOne}}findGCD(factor){const[base,exp]=factor instanceof Pow?[factor.base,factor.exp]:[factor,NumOne];if(this.base.equals(base)){if(this.exp.equals(exp)){return this}else if(this.exp instanceof Num&&exp instanceof Num){return new Pow(this.base,Num.min(this.exp,exp)).collect()}else if(this.exp instanceof Num||exp instanceof Num){return NumOne}var expA=this.exp.asMul().partition();var expB=exp.asMul().partition();if(expA[1].equals(expB[1])){var coefficient=Num.min(expA[0].reduce(),expB[0].reduce());var mul=new Mul(coefficient,expA[1].flatten()).flatten();return new Pow(base,mul).collect()}}return NumOne}isPositive(){if(this.base.isPositive()){return true}var exp=this.exp.simplify();return exp instanceof Int&&exp.eval()%2===0}asPositiveFactor(){if(this.isPositive()){return this}else {var exp=this.exp.simplify();if(exp instanceof Int){var n=exp.eval();if(n>2){return new Pow(this.base,new Int(n-1))}else if(n<-2){return new Pow(this.base,new Int(n+1))}}return NumOne}}static sqrt(arg){return new Pow(arg,NumSqrt)}constructor(base,exp){super(),this.func=Pow;this.base=base;this.exp=exp;}}Pow.nthroot=function(radicand,degree){var exp=Mul.fold(Mul.handleDivide(new Int(1),degree));return new Pow(radicand,exp.addHint("root"))};class Log extends Expr{args(){return [this.base,this.power]}eval(vars={},options){return Math.log(this.power.eval(vars,options))/Math.log(this.base.eval(vars,options))}codegen(){return "(Math.log("+this.power.codegen()+") / Math.log("+this.base.codegen()+"))"}print(){var power="("+this.power.print()+")";if(this.isNatural()){return "ln"+power}else {return "log_("+this.base.print()+") "+power}}tex(){var power="("+this.power.tex()+")";if(this.isNatural()){return "\\ln"+power}else {return "\\log_{"+this.base.tex()+"}"+power}}collect(options){var log=this.recurse("collect",options);if(log.power instanceof Num&&log.power.eval()===1){return NumZero}else if(log.base.equals(log.power)){return NumOne}else if(log.power instanceof Pow&&log.power.base.equals(log.base)){return log.power.exp}else {return log}}expand(){var log=this.recurse("expand");if(log.power instanceof Mul){var terms=___default.default.map(log.power.terms,term=>{return new Log(log.base,term).expand()});return new Add(terms)}else if(log.power instanceof Pow){return new Mul(log.power.exp,new Log(log.base,log.power.base).expand()).flatten()}else if(!log.isNatural()){return Mul.handleDivide(new Log(Const.e,log.power),new Log(Const.e,log.base))}else {return log}}isPositive(){var log=this.collect();if(log instanceof Log&&log.base instanceof Num&&log.power instanceof Num){return this.eval()>0}else {return false}}needsExplicitMul(){return false}isNatural(){return this.base.equals(Const.e)}static natural(){return Const.e}static common(){return NumTen}static create(base,power){var log=new Log(base,power);if(!power.hints.parens){log=log.addHint("open");}return log}constructor(base,power){super(),this.func=Log;this.base=base;this.power=power;this.hints={...this.hints,open:false};}}class Trig extends Expr{args(){return [this.type,this.arg]}isEven(){return ___default.default.contains(["cos","sec"],this.type)}isInverse(){return this.type.indexOf("arc")===0}isBasic(){return ___default.default.contains(["sin","cos"],this.type)}eval(vars={},options){var func=this.functions[this.type].eval;var arg=this.arg.eval(vars,options);return func(arg)}codegen(){var func=this.functions[this.type].codegen;if(typeof func==="function"){return func(this.arg.codegen())}else if(typeof func==="string"){return func+this.arg.codegen()+"))"}else {throw new Error("codegen not implemented for "+this.type)}}print(){return this.type+"("+this.arg.print()+")"}tex(){var func=this.functions[this.type].tex;var arg="("+this.arg.tex()+")";return func+arg}texSplit(){var func=this.functions[this.type].tex;var arg="("+this.arg.tex()+")";return [func,arg]}isPositive(){var trig=this.collect();if(trig instanceof Trig&&trig.arg instanceof Num){return this.eval()>0}else {return false}}completeParse(){if(this.exp){var pow=new Pow(this,this.exp);this.exp=undefined;return pow}else {return this}}needsExplicitMul(){return false}expand(){var trig=this.recurse("expand");if(!trig.isInverse()){var expand=trig.functions[trig.type].expand;return ___default.default.bind(expand,trig)()}else {return trig}}collect(options){var trig=this.recurse("collect",options);if(!trig.isInverse()&&trig.arg.isNegative()){const arg=trig.arg instanceof Num?trig.arg.abs():Mul.handleDivide(trig.arg,NumNeg).collect(options);if(trig.isEven()){return new Trig(trig.type,arg)}else {return new Mul(NumNeg,new Trig(trig.type,arg))}}else {return trig}}static create(pair,arg){var type=pair[0];var exp=pair[1];if(exp&&exp.equals(NumNeg)){type="arc"+type;exp=undefined;}var trig=new Trig(type,arg);if(!arg.hints.parens){trig=trig.addHint("open");}if(exp){trig.exp=exp;}return trig}static sin(arg){return new Trig("sin",arg)}static cos(arg){return new Trig("cos",arg)}static sinh(arg){return new Trig("sinh",arg)}static cosh(arg){return new Trig("cosh",arg)}constructor(type,arg){super(),this.func=Trig,this.functions={sin:{eval:Math.sin,codegen:"Math.sin((",tex:"\\sin",expand:()=>this},cos:{eval:Math.cos,codegen:"Math.cos((",tex:"\\cos",expand:()=>this},tan:{eval:Math.tan,codegen:"Math.tan((",tex:"\\tan",expand:()=>Mul.handleDivide(Trig.sin(this.arg),Trig.cos(this.arg))},csc:{eval:arg=>{return 1/Math.sin(arg)},codegen:"(1/Math.sin(",tex:"\\csc",expand:()=>Mul.handleDivide(NumOne,Trig.sin(this.arg))},sec:{eval:arg=>{return 1/Math.cos(arg)},codegen:"(1/Math.cos(",tex:"\\sec",expand:()=>Mul.handleDivide(NumOne,Trig.cos(this.arg))},cot:{eval:arg=>{return 1/Math.tan(arg)},codegen:"(1/Math.tan(",tex:"\\cot",expand:()=>Mul.handleDivide(Trig.cos(this.arg),Trig.sin(this.arg))},arcsin:{eval:Math.asin,codegen:"Math.asin((",tex:"\\arcsin"},arccos:{eval:Math.acos,codegen:"Math.acos((",tex:"\\arccos"},arctan:{eval:Math.atan,codegen:"Math.atan((",tex:"\\arctan"},arccsc:{eval:arg=>{return Math.asin(1/arg)},codegen:"Math.asin(1/(",tex:"\\operatorname{arccsc}"},arcsec:{eval:arg=>{return Math.acos(1/arg)},codegen:"Math.acos(1/(",tex:"\\operatorname{arcsec}"},arccot:{eval:arg=>{return Math.atan(1/arg)},codegen:"Math.atan(1/(",tex:"\\operatorname{arccot}"},sinh:{eval:arg=>{return (Math.exp(arg)-Math.exp(-arg))/2},codegen:argStr=>{return "((Math.exp("+argStr+") - Math.exp(-("+argStr+"))) / 2)"},tex:"\\sinh",expand:()=>this},cosh:{eval:arg=>{return (Math.exp(arg)+Math.exp(-arg))/2},codegen:argStr=>{return "((Math.exp("+argStr+") + Math.exp(-("+argStr+"))) / 2)"},tex:"\\cosh",expand:()=>this},tanh:{eval:arg=>{return (Math.exp(arg)-Math.exp(-arg))/(Math.exp(arg)+Math.exp(-arg))},codegen:argStr=>{return "("+"(Math.exp("+argStr+") - Math.exp(-("+argStr+")))"+" / "+"(Math.exp("+argStr+") + Math.exp(-("+argStr+")))"+")"},tex:"\\tanh",expand:()=>Mul.handleDivide(Trig.sinh(this.arg),Trig.cosh(this.arg))},csch:{eval:arg=>{return 2/(Math.exp(arg)-Math.exp(-arg))},codegen:argStr=>{return "(2 / (Math.exp("+argStr+") - Math.exp(-("+argStr+"))))"},tex:"\\csch",expand:()=>Mul.handleDivide(NumOne,Trig.sinh(this.arg))},sech:{eval:arg=>{return 2/(Math.exp(arg)+Math.exp(-arg))},codegen:argStr=>{return "(2 / (Math.exp("+argStr+") + Math.exp(-("+argStr+"))))"},tex:"\\sech",expand:()=>Mul.handleDivide(NumOne,Trig.cosh(this.arg))},coth:{eval:arg=>{return (Math.exp(arg)+Math.exp(-arg))/(Math.exp(arg)-Math.exp(-arg))},codegen:argStr=>{return "("+"(Math.exp("+argStr+") + Math.exp(-("+argStr+")))"+" / "+"(Math.exp("+argStr+") - Math.exp(-("+argStr+")))"+")"},tex:"\\coth",expand:()=>Mul.handleDivide(Trig.cosh(this.arg),Trig.sinh(this.arg))}};this.type=type;this.arg=arg;this.hints={...this.hints,open:false};}}class Abs extends Expr{args(){return [this.arg]}eval(vars={},options){return Math.abs(this.arg.eval(vars,options))}codegen(){return "Math.abs("+this.arg.codegen()+")"}print(){return "abs("+this.arg.print()+")"}tex(){return "\\left|"+this.arg.tex()+"\\right|"}collect(options){var abs=this.recurse("collect",options);if(abs.arg.isPositive()){return abs.arg}else if(abs.arg instanceof Num){return abs.arg.abs()}else if(abs.arg instanceof Mul){var terms=___default.default.groupBy(abs.arg.terms,term=>{if(term.isPositive()){return "positive"}else if(term instanceof Num){return "number"}else {return "other"}});var positives=terms.positive.concat(___default.default.invoke(terms.number,"abs"));if(terms.other.length){positives.push(new Abs(new Mul(terms.other).flatten()));}return new Mul(positives).flatten()}else {return abs}}expand(){var abs=this.recurse("expand");if(abs.arg instanceof Mul){var terms=___default.default.map(abs.arg.terms,term=>{return new Abs(term)});return new Mul(terms)}else {return abs}}isPositive(){return true}constructor(arg){super(),this.func=Abs;this.arg=arg;}}class Eq extends Expr{args(){return [this.left,this.type,this.right]}needsExplicitMul(){return false}print(){return this.left.print()+this.type+this.right.print()}tex(){return this.left.tex()+this.signs[this.type]+this.right.tex()}normalize(){var eq=this.recurse("normalize");if(___default.default.contains([">",">="],eq.type)){return new Eq(eq.right,eq.type.replace(">","<"),eq.left)}else {return eq}}asExpr(unfactored=false){var isZero=expr=>{return expr instanceof Num&&expr.isSimple()&&expr.eval()===0};let terms=[];if(this.left instanceof Add){terms=___default.default.clone(this.left.terms);}else if(!isZero(this.left)){terms=[this.left];}if(this.right instanceof Add){terms=terms.concat(this.right.negate().terms);}else if(!isZero(this.right)){terms.push(this.right.negate());}var isInequality=!this.isEquality();terms=___default.default.invoke(terms,"collect",{preciseFloats:true});for(var i=0;i<terms.length;i++){var denominator=terms[i].getDenominator();if(isInequality&&!denominator.isPositive()){denominator=denominator.asPositiveFactor();}if(!denominator.equals(NumOne)){terms=___default.default.map(terms,term=>{return Mul.createOrAppend(term,denominator).simplify({once:true,preciseFloats:true})});}}var add=new Add(terms).flatten();return unfactored?add:this.divideThrough(add)}divideThrough(expr){const isInequality=!this.isEquality();const simplified=expr.simplify({once:true});const factored=simplified.factor({keepNegative:isInequality});if(!(factored instanceof Mul)){return expr}const terms=factored.terms;const hasVar=term=>!!term.getVars().length;const isOne=term=>term.equals(NumOne);const[adds,others]=partition(terms,isAdd);if(adds.length&&this.isEquality()){return new Mul(adds).flatten()}let denominator=others;if(!adds.length){denominator=___default.default.reject(denominator,hasVar);}if(isInequality){denominator=___default.default.invoke(denominator,"asPositiveFactor");}denominator=___default.default.reject(denominator,isOne);denominator=___default.default.map(denominator,term=>{return new Pow(term,NumDiv)});const dividedResult=new Mul(terms.concat(denominator)).collect();if(dividedResult.equals(factored)){return simplified}else {return dividedResult}}isEquality(){return ___default.default.contains(["=","<>"],this.type)}compare(other){if(!(other instanceof Eq)){return false}var eq1=this.normalize();var eq2=other.normalize();if(eq1.type!==eq2.type){return false}var expr1=eq1.divideThrough(eq1.asExpr(true).collect());var expr2=eq2.divideThrough(eq2.asExpr(true).collect());if(eq1.isEquality()){return expr1.compare(expr2)||expr1.compare(Mul.handleNegative(expr2))}else {return expr1.compare(expr2)}}sameForm(other){var eq1=this.normalize();var eq2=other.normalize();var same=eq1.left.sameForm(eq2.left)&&eq1.right.sameForm(eq2.right);if(eq1.isEquality()){return same||eq1.left.sameForm(eq2.right)&&eq1.right.sameForm(eq2.left)}else {return same}}isSimplified(){var expr=this.asExpr(true);var simplified=this.divideThrough(expr).simplify();return expr.equals(simplified)&&this.left.isSimplified()&&this.right.isSimplified()}solveLinearEquationForVariable(variable){var expr=this.asExpr();if(!(expr instanceof Add)||expr.terms.length!==2){throw new Error("Can only handle linear equations of the form "+"a + bx (= 0)")}var hasVar=term=>{return term.has(Var)&&___default.default.contains(term.getVars(),variable.symbol)};const termHasVar=hasVar(expr.terms[0]);const a=termHasVar?Mul.handleNegative(expr.terms[1]):Mul.handleNegative(expr.terms[0]);const b=termHasVar?Mul.handleDivide(expr.terms[0],variable):Mul.handleDivide(expr.terms[1],variable);return Mul.handleDivide(a,b).simplify()}constructor(left,type,right){super(),this.func=Eq,this.signs={"=":" = ","<":" < ",">":" > ","<>":" \\ne ","<=":" \\le ",">=":" \\ge "};this.left=left;this.type=type;this.right=right;}}class Sym extends Expr{needsExplicitMul(){return false}findGCD(factor){if(factor instanceof Sym||factor instanceof Num){return this.equals(factor)?this:NumOne}else {return factor.findGCD(this)}}}class Func extends Sym{args(){return [this.symbol,this.arg]}print(){return this.symbol+"("+this.arg.print()+")"}tex(){return this.symbol+"("+this.arg.tex()+")"}eval(vars={},options){var arg=this.arg;var func=vars[this.symbol];var newVars=___default.default.extend(___default.default.clone(vars),{x:arg.eval(vars,options)});var parsedFunc=parse(func,options);if(parsedFunc.parsed){return parsedFunc.expr.eval(newVars,options)}return parsedFunc}codegen(){return 'vars["'+this.symbol+'"]('+this.arg.codegen()+")"}getUnits(){return this.arg.getUnits()}getVars(excludeFunc){if(excludeFunc){return this.arg.getVars()}else {return ___default.default.union(this.arg.getVars(),[this.symbol]).sort()}}getConsts(){return this.arg.getConsts()}constructor(symbol,arg){super(),this.func=Func;this.symbol=symbol;this.arg=arg;}}class Var extends Sym{args(){return [this.symbol,this.subscript]}exprArgs(){return []}recurse(){return this}print(){var sub="";if(this.subscript){sub="_("+this.subscript.print()+")";}return this.symbol+sub}prettyPrint(){var sub=this.subscript;if(sub&&(sub instanceof Num||sub instanceof Sym)){return this.symbol+"_"+sub.print()}else {return this.print()}}tex(){var sub="";if(this.subscript){sub="_{"+this.subscript.tex()+"}";}var prefix=this.symbol.length>1?"\\":"";return prefix+this.symbol+sub}repr(){return "Var("+this.print()+")"}eval(vars={},options){return vars[this.prettyPrint()]}codegen(){return 'vars["'+this.prettyPrint()+'"]'}getVars(){return [this.prettyPrint()]}isPositive(){return false}constructor(symbol,subscript){super(),this.func=Var;this.symbol=symbol;this.subscript=subscript;}}class Const extends Sym{args(){return [this.symbol]}recurse(){return this}eval(vars={},options){if(this.symbol==="pi"){return Math.PI}else if(this.symbol==="e"){return Math.E}else {return undefined}}codegen(){if(this.symbol==="pi"){return "Math.PI"}else if(this.symbol==="e"){return "Math.E"}else {return undefined}}print(){return this.symbol}tex(){if(this.symbol==="pi"){return "\\pi "}else if(this.symbol==="e"){return "e"}else {return undefined}}isPositive(){return this.eval()>0}abs(){if(this.eval()>0){return this}else {return Mul.handleNegative(this)}}getConsts(){return [this.print()]}constructor(symbol){super(),this.func=Const;this.symbol=symbol;}}Const.e=new Const("e");Const.pi=new Const("pi");class Num extends Expr{repr(){return this.print()}strip(){return this.abs()}recurse(){return this}codegen(){return this.print()}isSubtract(){return Boolean(this.hints.subtract)}needsExplicitMul(){return true}isPositive(){return this.eval()>0}isNegative(){return this.eval()<0}asPositiveFactor(){return this.isPositive()?this:this.abs()}getDecimalPlaces(){var match=(""+this.n).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);if(match){return Math.max(0,(match[1]?match[1].length:0)-(match[2]?+match[2]:0))}else {return 0}}static negativeOne(hint){if(hint==="subtract"){return NumSub}else if(hint==="divide"){return NumDiv}else {return NumNeg}}static findGCD(a,b){var mod;a=Math.abs(a);b=Math.abs(b);if(a!==Math.floor(a)||b!==Math.floor(b)){return 1}while(b){mod=a%b;a=b;b=mod;}return a}static min(...args){return ___default.default.min(args,num=>num.eval())}static max(...args){return ___default.default.max(args,num=>num.eval())}constructor(){super(),this.n=0;this.hints={...this.hints,negate:false,subtract:false,divide:false,root:false,fraction:false,entered:false};}}class Rational extends Num{args(){return [this.n,this.d]}eval(){return this.n/this.d}print(){return this.n.toString()+"/"+this.d.toString()}tex(){var tex="\\frac{"+Math.abs(this.n).toString()+"}{"+this.d.toString()+"}";return this.n<0?"-"+tex:tex}add(num,options){if(num instanceof Rational){return new Rational(this.n*num.d+this.d*num.n,this.d*num.d).collect()}else {return num.add(this,options)}}mul(num,options){if(num instanceof Rational){return new Rational(this.n*num.n,this.d*num.d).collect()}else {return num.mul(this,options)}}collect(){var gcd=Num.findGCD(this.n,this.d);var n=this.n/gcd;var d=this.d/gcd;if(d===1){return new Int(n)}else {return new Rational(n,d)}}negate(){return new Rational(-this.n,this.d)}abs(){return new Rational(Math.abs(this.n),this.d)}findGCD(factor){if(factor instanceof Rational){var numerator=Num.findGCD(this.n*factor.d,factor.n*this.d);var denominator=this.d*factor.d;return new Rational(numerator,denominator).collect()}else if(factor instanceof Int){return new Rational(Num.findGCD(this.n,factor.n),this.d)}else {return factor.findGCD(this)}}raiseToThe(exp){if(exp instanceof Int){var positive=exp.eval()>0;var abs=exp.abs().eval();var n=Math.pow(this.n,abs);var d=Math.pow(this.d,abs);if(positive){return new Rational(n,d).collect()}else {return new Rational(d,n).collect()}}else {return new Float(this.eval()).raiseToThe(exp)}}getDenominator(){return new Int(this.d)}isSimple(){return false}asRational(){return this}constructor(numerator,denominator){super(),this.func=Rational;var n=numerator;var d=denominator;if(d<0){n=-n;d=-d;}this.n=n;this.d=d;}}class Int extends Rational{args(){return [this.n]}print(){return this.n.toString()}tex(){return this.n.toString()}negate(){return new Int(-this.n)}abs(){return new Int(Math.abs(this.n))}isSimple(){return true}findGCD(factor){if(factor instanceof Int){return new Int(Num.findGCD(this.n,factor.n))}else {return factor.findGCD(this)}}static create(n){return new Int(n).addHint("entered")}constructor(number){super(number,1),this.func=Int;}}class Float extends Num{args(){return [this.n]}eval(){return this.n}print(){return this.n.toString()}tex(){return this.n.toString()}add(num,options){if(options&&options.preciseFloats){return Float.toDecimalPlaces(this.n+num.eval(),Math.max(this.getDecimalPlaces(),num.getDecimalPlaces()))}else {return new Float(this.n+num.eval()).collect()}}mul(num,options){if(options&&options.preciseFloats){return Float.toDecimalPlaces(this.n*num.eval(),this.getDecimalPlaces()+num.getDecimalPlaces())}else {return new Float(this.n*num.eval()).collect()}}collect(options){return this}negate(){return new Float(-this.n)}abs(){return new Float(Math.abs(this.n))}findGCD(factor){if(factor instanceof Num){return new Float(Num.findGCD(this.eval(),factor.eval())).collect()}else {return factor.findGCD(this)}}raiseToThe(exp,options){if(options&&options.preciseFloats&&exp instanceof Int&&exp.n>1){return Float.toDecimalPlaces(new Pow(this,exp).eval(),this.getDecimalPlaces()*exp.n)}else {return new Float(new Pow(this,exp).eval()).collect()}}asRational(){var parts=this.n.toString().split(".");if(parts.length===1){return new Rational(this.n,1)}else {var numerator=Number(parts.join(""));var denominator=Math.pow(10,parts[1].length);return new Rational(numerator,denominator).collect()}}getDenominator(){return this.asRational().getDenominator()}isSimple(){return true}static create(n){return new Float(n).addHint("entered")}static toDecimalPlaces(n,places){return new Float(+n.toFixed(Math.min(places,20))).collect()}constructor(number){super(),this.func=Float;this.n=number;}}const NumNeg=new Int(-1).addHint("negate");const NumSub=new Int(-1).addHint("subtract");const NumDiv=new Int(-1).addHint("divide");const NumSqrt=new Rational(1,2).addHint("root");const NumZero=new Int(0);const NumOne=new Int(1);const NumTen=new Int(10);var parseError=function(str,hash){throw new Error(hash.loc.first_column)};parser.yy={Add:Add,Mul:Mul,Pow:Pow,Log:Log,Trig:Trig,Eq:Eq,Abs:Abs,Func:Func,Const:Const,Var:Var,Int:Int,Float:Float,parseError:parseError,constants:["e"],symbolLexer:function(symbol){if(___default.default.contains(parser.yy.constants,symbol)){return "CONST"}else if(___default.default.contains(parser.yy.functions,symbol)){return "FUNC"}else {return "VAR"}}};const parse=function(input,options){try{if(options&&options.functions){parser.yy.functions=___default.default.without(options.functions,"i");}else {parser.yy.functions=[];}if(options&&options.decimal_separator){input=input.split(options.decimal_separator).join(".");}var expr=parser.parse(input).completeParse();return {parsed:true,expr:expr}}catch(e){return {parsed:false,error:e.message}}};class Unit extends Sym{args(){return [this.symbol]}recurse(){return this}eval(vars={},options){return 1}getUnits(){return [{unit:this.symbol,pow:1}]}codegen(){return "1"}print(){return this.symbol}tex(){return this.symbol}collect(options){if(___default.default(baseUnits).has(this.symbol)){return this}else if(___default.default(derivedUnits).has(this.symbol)){return derivedUnits[this.symbol].conversion}else {throw new Error("could not understand unit: "+this.symbol)}}constructor(symbol){super(),this.func=Unit;this.symbol=symbol;}}var unprefixify=function(symbol){if(___default.default(baseUnits).has(symbol)||___default.default(derivedUnits).has(symbol)){return new Unit(symbol)}var prefix=___default.default(___default.default(siPrefixes).keys()).find(testPrefix=>{return new RegExp("^"+testPrefix).test(symbol)});if(prefix){var base=symbol.replace(new RegExp("^"+prefix),"");if(___default.default(baseUnits).has(base)||derivedUnits[base]&&derivedUnits[base].prefixes===hasPrefixes){return new Mul(siPrefixes[prefix],new Unit(base))}else {throw new Error(base+" does not allow prefixes")}}else {return new Unit(symbol)}};const unitParse=function(input){try{var parseResult=unitParser.parse(input);const unitArray=[];___default.default(parseResult.unit.num).each(unitSpec=>{unitArray.push(new Pow(unprefixify(unitSpec.name),new Int(unitSpec.pow)));});___default.default(parseResult.unit.denom).each(unitSpec=>{unitArray.push(new Pow(unprefixify(unitSpec.name),new Int(-1*unitSpec.pow)));});var unit=new Mul(unitArray).flatten();if(parseResult.type==="unitMagnitude"){var coefArray=[new Float(+parseResult.magnitude),...unitArray];var expr=new Mul(coefArray);return {parsed:true,unit:unit,expr:expr,coefficient:parseResult.magnitude,type:parseResult.type}}else {return {parsed:true,unit:unit,type:parseResult.type}}}catch(e){return {parsed:false,error:e.message}}};var baseUnits={m:new Unit("m"),g:new Unit("g"),s:new Unit("s"),A:new Unit("A"),K:new Unit("K"),mol:new Unit("mol"),cd:new Unit("cd")};var siPrefixes={a:new Pow(new Int(10),new Int(-18)),f:new Pow(new Int(10),new Int(-15)),p:new Pow(new Int(10),new Int(-12)),n:new Pow(new Int(10),new Int(-9)),u:new Pow(new Int(10),new Int(-6)),m:new Pow(new Int(10),new Int(-3)),c:new Pow(new Int(10),new Int(-2)),d:new Pow(new Int(10),new Int(-1)),da:new Int(10),h:new Pow(new Int(10),new Int(2)),k:new Pow(new Int(10),new Int(3)),M:new Pow(new Int(10),new Int(6)),G:new Pow(new Int(10),new Int(9)),T:new Pow(new Int(10),new Int(12)),P:new Pow(new Int(10),new Int(15)),E:new Pow(new Int(10),new Int(18)),hella:new Pow(new Int(10),new Int(27))};const hasPrefixes="hasPrefixes";const hasntPrefixes="hasntPrefixes";const makeAlias=function(str,prefixes){var splits=str.split("|");var coefficientStr=splits[0].trim();var unitsStr=splits[1].trim();var coefficient=NumOne;if(coefficientStr!==""){coefficient=parse(coefficientStr).expr;}var numdenomStr=unitsStr.split("/");var numdenom=[coefficient];if(numdenomStr[0]){numdenomStr[0].split(" ").filter(x=>x!=="").forEach(x=>numdenom.push(new Unit(x)));}if(numdenomStr[1]){numdenomStr[1].split(" ").filter(x=>x!=="").forEach(x=>numdenom.push(new Pow(new Unit(x),NumDiv)));}return {conversion:new Mul(numdenom),prefixes:prefixes}};var derivedUnits={Da:makeAlias("1.6605388628 x 10^-24 | g",hasPrefixes),u:makeAlias("| Da",hasntPrefixes),meter:makeAlias("| m",hasntPrefixes),meters:makeAlias("| m",hasntPrefixes),in:makeAlias("254 / 10000 | m",hasntPrefixes),ft:makeAlias("3048 / 10000 | m",hasntPrefixes),yd:makeAlias("9144 / 10000 | m",hasntPrefixes),mi:makeAlias("1609344 / 1000 | m",hasntPrefixes),ly:makeAlias("9.4607 x 10^15 | m",hasntPrefixes),nmi:makeAlias("1852 | m",hasntPrefixes),Å:makeAlias("10^-10 | m",hasntPrefixes),pc:makeAlias("3.0857 x 10^16 | m",hasntPrefixes),min:makeAlias("60 | s",hasntPrefixes),hr:makeAlias("3600 | s",hasntPrefixes),sec:makeAlias("| s",hasntPrefixes),day:makeAlias("86400 | s",hasntPrefixes),wk:makeAlias("604800 | s",hasntPrefixes),fortnight:makeAlias("14 | day",hasntPrefixes),shake:makeAlias("10^-8 | s",hasntPrefixes),olympiad:makeAlias("126200000 | s",hasntPrefixes),"°C":makeAlias("1 | K",hasntPrefixes),"°F":makeAlias("5/9 | K",hasntPrefixes),"°R":makeAlias("5/9 | K",hasntPrefixes),e:makeAlias("1.6021765314 x 10^-19 | C",hasntPrefixes),c:makeAlias("299792458 | m / s",hasntPrefixes),kn:makeAlias("514/1000 | m / s",hasntPrefixes),kt:makeAlias("| kn",hasntPrefixes),knot:makeAlias("| kn",hasntPrefixes),J:makeAlias("| N m",hasPrefixes),BTU:makeAlias("1060 | J",hasntPrefixes),cal:makeAlias("4184 / 1000 | J",hasPrefixes),eV:makeAlias("1.602176514 x 10^-19 | J",hasPrefixes),erg:makeAlias("10^−7 | J",hasPrefixes),W:makeAlias("| J / s",hasPrefixes),"H-e":makeAlias("80 | W",hasntPrefixes),N:makeAlias("1000 | g m / s s",hasPrefixes),lb:makeAlias("4448221615 / 1000000000 | N",hasntPrefixes),dyn:makeAlias("10^-5 | N",hasntPrefixes),Pa:makeAlias("1 | N / m m m",hasPrefixes),bar:makeAlias("10^5 | Pa",hasPrefixes),"㏔":makeAlias("1/1000 | bar",hasntPrefixes),"㍴":makeAlias("| bar",hasntPrefixes),atm:makeAlias("101325 | Pa",hasntPrefixes),Torr:makeAlias("1/760 | atm",hasntPrefixes),mmHg:makeAlias("| Torr",hasntPrefixes),ha:makeAlias("10^4 | m m",hasntPrefixes),b:makeAlias("10^−28 | m m",hasPrefixes),barn:makeAlias("| b",hasPrefixes),acre:makeAlias("4046.87 | m m",hasntPrefixes),skilodge:makeAlias("10^-31 | m m",hasntPrefixes),outhouse:makeAlias("10^-34 | m m",hasntPrefixes),shed:makeAlias("10^-52 | m m",hasntPrefixes),L:makeAlias("1/1000 | m m m",hasPrefixes),gal:makeAlias("3785/1000 | L",hasPrefixes),cup:makeAlias("1/16 | gal",hasntPrefixes),qt:makeAlias("1/4 | gal",hasntPrefixes),quart:makeAlias("| qt",hasntPrefixes),p:makeAlias("1/8 | gal",hasntPrefixes),pt:makeAlias("| p",hasntPrefixes),pint:makeAlias("| p",hasntPrefixes),"fl oz":makeAlias("1/8 | cup",hasntPrefixes),"fl. oz.":makeAlias("1/8 | cup",hasntPrefixes),tbsp:makeAlias("1/16 | cup",hasntPrefixes),tsp:makeAlias("1/3 | tbsp",hasntPrefixes),rev:makeAlias("2 pi | rad",hasntPrefixes),deg:makeAlias("180 pi | rad",hasntPrefixes),"°":makeAlias("| deg",hasntPrefixes),arcminute:makeAlias("1/60 | deg",hasntPrefixes),arcsec:makeAlias("1/3600 | deg",hasntPrefixes),Hu:makeAlias("1000 | dB",hasPrefixes),dozen:makeAlias("12 |",hasntPrefixes),mol:makeAlias("6.0221412927 x 10^23 |",hasPrefixes),"%":makeAlias("1/100 |",hasntPrefixes),percent:makeAlias("| %",hasntPrefixes),ppm:makeAlias("1/1000000 |",hasntPrefixes),V:makeAlias("1000 | g m m / s s C",hasPrefixes),C:makeAlias("| A s",hasPrefixes),ampere:makeAlias("| A",hasntPrefixes),Ω:makeAlias("| V / A",hasPrefixes),ohm:makeAlias("| Ω",hasntPrefixes),F:makeAlias("| C / V",hasPrefixes),H:makeAlias("| ohm s",hasPrefixes),T:makeAlias("1000 | g / C s",hasPrefixes),Wb:makeAlias("1000 | g m m / C s",hasPrefixes),lm:makeAlias("pi x 10^4 | cd / m m",hasntPrefixes),lx:makeAlias("| lm / m m",hasntPrefixes),nit:makeAlias("| cd / m m",hasntPrefixes),sb:makeAlias("10^4 | cd / m m",hasntPrefixes),stilb:makeAlias("1 | sb",hasntPrefixes),apostilb:makeAlias("1 / pi x 10^(-4) | sb",hasntPrefixes),blondel:makeAlias("| apostilb",hasntPrefixes),asb:makeAlias("| apostilb",hasntPrefixes),la:makeAlias("| lm",hasntPrefixes),Lb:makeAlias("| lm",hasntPrefixes),sk:makeAlias("10^-7 | lm",hasntPrefixes),skot:makeAlias("| sk",hasntPrefixes),bril:makeAlias("10^-11 | lm",hasntPrefixes),Hz:makeAlias("| / s",hasPrefixes)};const Zero=NumZero;const One=NumOne;
|
|
19
19
|
|
|
20
20
|
const compare=function(expr1,expr2,options={}){const defaults={form:false,simplify:false};const optionsWithDefaults={...defaults,...options};const vars=expr1.sameVars(expr2);if(!vars.equal){let message;if(vars.equalIgnoringCase){message="Check your variables; one or more are using "+"the wrong case (upper or lower).";}else {message="Check your variables; you may have used the wrong "+"letter for one or more of them.";}return {equal:false,wrongVariableCase:vars.equalIgnoringCase,wrongVariableNames:!vars.equalIgnoringCase,message:message}}if(!expr1.compare(expr2)){return {equal:false,message:null}}if(optionsWithDefaults.form&&!expr1.sameForm(expr2)){return {equal:false,message:"Your answer is not in the correct form."}}if(optionsWithDefaults.simplify&&!expr1.isSimplified()){return {equal:false,message:"Your answer is not fully expanded and simplified."}}return {equal:true,message:null}};
|
|
21
21
|
|