@graffiticode/l0179-view 0.1.1 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring-D1FbQ_qt.js","names":["assert","Assert","message","reserveCodeRange","setLocation","clearLocation","setTimeout","checkTimeout","setCounter","checkCounter","Ast","Ast","Assert","ast.Ast","getCellValue","translatex.Core","getCellValue","baseExpanders"],"sources":["../../../node_modules/decimal.js/decimal.mjs","../../../node_modules/@graffiticode/parselatex/src/assert.js","../../../node_modules/@graffiticode/parselatex/src/ast.js","../../../node_modules/@graffiticode/parselatex/src/model.js","../../../node_modules/@graffiticode/parselatex/index.js","../../../node_modules/@graffiticode/translatex/src/assert.js","../../../node_modules/@graffiticode/translatex/src/rules.js","../../../node_modules/@graffiticode/translatex/src/core.js","../../../node_modules/@graffiticode/translatex/src/spreadsheetExpanders.js","../../../node_modules/@graffiticode/translatex/index.js","../src/scoring/translatex-rules.js","../../../node_modules/@graffiticode/translatex/src/spreadsheet.js","../src/scoring/normalize.ts","../src/scoring/translatex-extensions.ts","../src/scoring/sheets.ts","../src/scoring/score.ts"],"sourcesContent":["/*!\r\n * decimal.js v10.6.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licence\r\n */\r\n\r\n\r\n// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The maximum exponent magnitude.\r\n // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15, // 0 to 9e15\r\n\r\n // The limit on the value of `precision`, and on the value of the first argument to\r\n // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n // Base conversion alphabet.\r\n NUMERALS = '0123456789abcdef',\r\n\r\n // The natural logarithm of 10 (1025 digits).\r\n LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n // Pi (1025 digits).\r\n PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n DEFAULTS = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `Decimal.config({ precision: 20 });`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used when rounding to `precision`.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `Decimal.rounding = 4;`\r\n // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n rounding: 4, // 0 to 8\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend (JavaScript %).\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 The IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n //\r\n // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n // be used, but they may not give useful results.\r\n modulo: 1, // 0 to 9\r\n\r\n // The exponent value at and beneath which `toString` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -EXP_LIMIT\r\n\r\n // The exponent value at and above which `toString` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to EXP_LIMIT\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // JavaScript numbers: -324 (5e-324)\r\n minE: -EXP_LIMIT, // -1 to -EXP_LIMIT\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // JavaScript numbers: 308 (1.7976931348623157e+308)\r\n maxE: EXP_LIMIT, // 1 to EXP_LIMIT\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n crypto: false // true/false\r\n },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n inexact, quadrant,\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n cryptoUnavailable = decimalError + 'crypto unavailable',\r\n tag = '[object Decimal]',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n LN10_PRECISION = LN10.length - 1,\r\n PI_PRECISION = PI.length - 1,\r\n\r\n // Decimal.prototype object\r\n P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n * absoluteValue abs\r\n * ceil\r\n * clampedTo clamp\r\n * comparedTo cmp\r\n * cosine cos\r\n * cubeRoot cbrt\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy divToInt\r\n * equals eq\r\n * floor\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * hyperbolicCosine cosh\r\n * hyperbolicSine sinh\r\n * hyperbolicTangent tanh\r\n * inverseCosine acos\r\n * inverseHyperbolicCosine acosh\r\n * inverseHyperbolicSine asinh\r\n * inverseHyperbolicTangent atanh\r\n * inverseSine asin\r\n * inverseTangent atan\r\n * isFinite\r\n * isInteger isInt\r\n * isNaN\r\n * isNegative isNeg\r\n * isPositive isPos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * [maximum] [max]\r\n * [minimum] [min]\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * round\r\n * sine sin\r\n * squareRoot sqrt\r\n * tangent tan\r\n * times mul\r\n * toBinary\r\n * toDecimalPlaces toDP\r\n * toExponential\r\n * toFixed\r\n * toFraction\r\n * toHexadecimal toHex\r\n * toNearest\r\n * toNumber\r\n * toOctal\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits toSD\r\n * toString\r\n * truncated trunc\r\n * valueOf toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s < 0) x.s = 1;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n var k,\r\n x = this,\r\n Ctor = x.constructor;\r\n min = new Ctor(min);\r\n max = new Ctor(max);\r\n if (!min.s || !max.s) return new Ctor(NaN);\r\n if (min.gt(max)) throw Error(invalidArgument + max);\r\n k = x.cmp(min);\r\n return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `y`,\r\n * -1 if the value of this Decimal is less than the value of `y`,\r\n * 0 if they have the same value,\r\n * NaN if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this,\r\n xd = x.d,\r\n yd = (y = new x.constructor(y)).d,\r\n xs = x.s,\r\n ys = y.s;\r\n\r\n // Either NaN or ±Infinity?\r\n if (!xd || !yd) {\r\n return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Either zero?\r\n if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n // Signs differ?\r\n if (xs !== ys) return xs;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0) = 1\r\n * cos(-0) = 1\r\n * cos(Infinity) = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN) = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.d) return new Ctor(NaN);\r\n\r\n // cos(0) = cos(-0) = 1\r\n if (!x.d[0]) return new Ctor(1);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * cbrt(0) = 0\r\n * cbrt(-0) = -0\r\n * cbrt(1) = 1\r\n * cbrt(-1) = -1\r\n * cbrt(N) = N\r\n * cbrt(-I) = -I\r\n * cbrt(I) = I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n // Math.cbrt underflow/overflow?\r\n // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n if (!s || Math.abs(s) == 1 / 0) {\r\n n = digitsToString(x.d);\r\n e = x.e;\r\n\r\n // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n s = mathpow(n, 1 / 3);\r\n\r\n // Rarely, e may be one less than the result exponent value.\r\n e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n r.s = x.s;\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Halley's method.\r\n // TODO? Compare Newton's method.\r\n for (;;) {\r\n t = r;\r\n t3 = t.times(t).times(t);\r\n t3plusx = t3.plus(x);\r\n r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n // , i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n var w,\r\n d = this.d,\r\n n = NaN;\r\n\r\n if (d) {\r\n w = d.length - 1;\r\n n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) n--;\r\n if (n < 0) n = 0;\r\n }\r\n\r\n return n;\r\n};\r\n\r\n\r\n/*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n var k = this.cmp(y);\r\n return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0) = 1\r\n * cosh(-0) = 1\r\n * cosh(Infinity) = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN) = NaN\r\n *\r\n * x time taken (ms) result\r\n * 1000 9 9.8503555700852349694e+433\r\n * 10000 25 4.4034091128314607936e+4342\r\n * 100000 171 1.4033316802130615897e+43429\r\n * 1000000 3817 1.5166076984010437725e+434294\r\n * 10000000 abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n var k, n, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor,\r\n one = new Ctor(1);\r\n\r\n if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n if (x.isZero()) return one;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n // TODO? Estimation reused from cosine() and may not be optimal here.\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n n = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n n = '2.3283064365386962890625e-10';\r\n }\r\n\r\n x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n // Reverse argument reduction\r\n var cosh2_x,\r\n i = k,\r\n d8 = new Ctor(8);\r\n for (; i--;) {\r\n cosh2_x = x.times(x);\r\n x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n }\r\n\r\n return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0) = 0\r\n * sinh(-0) = -0\r\n * sinh(Infinity) = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN) = NaN\r\n *\r\n * x time taken (ms)\r\n * 10 2 ms\r\n * 100 5 ms\r\n * 1000 14 ms\r\n * 10000 82 ms\r\n * 100000 886 ms 1.4033316802130615897e+43429\r\n * 200000 2613 ms\r\n * 300000 5407 ms\r\n * 400000 8824 ms\r\n * 500000 13026 ms 8.7080643612718084129e+217146\r\n * 1000000 48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n var k, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n } else {\r\n\r\n // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n // 3 multiplications and 1 addition\r\n\r\n // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n // 4 multiplications and 2 additions\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n // Reverse argument reduction\r\n var sinh2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sinh2_x = x.times(x);\r\n x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n }\r\n }\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0) = 0\r\n * tanh(-0) = -0\r\n * tanh(Infinity) = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN) = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(x.s);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 7;\r\n Ctor.rounding = 1;\r\n\r\n return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0) = pi/2\r\n * acos(-0) = pi/2\r\n * acos(1) = 0\r\n * acos(-1) = pi\r\n * acos(1/2) = pi/3\r\n * acos(-1/2) = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN) = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n k = x.abs().cmp(1),\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n return k === 0\r\n // |x| is 1\r\n ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n // |x| > 1 or x is NaN\r\n : new Ctor(NaN);\r\n }\r\n\r\n if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n // See https://github.com/MikeMcl/decimal.js/pull/217\r\n x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1) = NaN\r\n * acosh(NaN) = NaN\r\n * acosh(Infinity) = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0) = NaN\r\n * acosh(-0) = NaN\r\n * acosh(1) = 0\r\n * acosh(-1) = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n if (!x.isFinite()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN) = NaN\r\n * asinh(Infinity) = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0) = 0\r\n * asinh(-0) = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1) = NaN\r\n * atanh(NaN) = NaN\r\n * atanh(Infinity) = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0) = 0\r\n * atanh(-0) = -0\r\n * atanh(1) = Infinity\r\n * atanh(-1) = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n var pr, rm, wpr, xsd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n xsd = x.sd();\r\n\r\n if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n Ctor.precision = wpr = xsd - x.e;\r\n\r\n x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n Ctor.precision = pr + 4;\r\n Ctor.rounding = 1;\r\n\r\n x = x.ln();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0) = 0\r\n * asin(-0) = -0\r\n * asin(1/2) = pi/6\r\n * asin(-1/2) = -pi/6\r\n * asin(1) = pi/2\r\n * asin(-1) = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN) = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n var halfPi, k,\r\n pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n k = x.abs().cmp(1);\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n\r\n // |x| is 1\r\n if (k === 0) {\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n halfPi.s = x.s;\r\n return halfPi;\r\n }\r\n\r\n // |x| > 1 or x is NaN\r\n return new Ctor(NaN);\r\n }\r\n\r\n // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0) = 0\r\n * atan(-0) = -0\r\n * atan(1) = pi/4\r\n * atan(-1) = -pi/4\r\n * atan(Infinity) = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN) = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n var i, j, k, n, px, t, r, wpr, x2,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (!x.isFinite()) {\r\n if (!x.s) return new Ctor(NaN);\r\n if (pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n r.s = x.s;\r\n return r;\r\n }\r\n } else if (x.isZero()) {\r\n return new Ctor(x);\r\n } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n r.s = x.s;\r\n return r;\r\n }\r\n\r\n Ctor.precision = wpr = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n // Argument reduction\r\n // Ensure |x| < 0.42\r\n // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n external = false;\r\n\r\n j = Math.ceil(wpr / LOG_BASE);\r\n n = 1;\r\n x2 = x.times(x);\r\n r = new Ctor(x);\r\n px = x;\r\n\r\n // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n for (; i !== -1;) {\r\n px = px.times(x2);\r\n t = r.minus(px.div(n += 2));\r\n\r\n px = px.times(x2);\r\n r = t.plus(px.div(n += 2));\r\n\r\n if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n }\r\n\r\n if (k) r = r.times(2 << (k - 1));\r\n\r\n external = true;\r\n\r\n return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a) = NaN\r\n * log[0](a) = NaN\r\n * log[1](a) = NaN\r\n * log[NaN](a) = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0) = -Infinity\r\n * log[b](-0) = -Infinity\r\n * log[b](-a) = NaN\r\n * log[b](1) = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN) = NaN\r\n *\r\n * [base] {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n var isBase10, d, denominator, k, inf, num, sd, r,\r\n arg = this,\r\n Ctor = arg.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding,\r\n guard = 5;\r\n\r\n // Default base is 10.\r\n if (base == null) {\r\n base = new Ctor(10);\r\n isBase10 = true;\r\n } else {\r\n base = new Ctor(base);\r\n d = base.d;\r\n\r\n // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n isBase10 = base.eq(10);\r\n }\r\n\r\n d = arg.d;\r\n\r\n // Is arg negative, non-finite, 0 or 1?\r\n if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n }\r\n\r\n // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n // integer power of 10.\r\n if (isBase10) {\r\n if (d.length > 1) {\r\n inf = true;\r\n } else {\r\n for (k = d[0]; k % 10 === 0;) k /= 10;\r\n inf = k !== 1;\r\n }\r\n }\r\n\r\n external = false;\r\n sd = pr + guard;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n // The result will have 5 rounding digits.\r\n r = divide(num, denominator, sd, 1);\r\n\r\n // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n // calculate 10 further digits.\r\n //\r\n // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n // further digits, the last 14 are nines, round up and assume the result is exact.\r\n // Also assume the result is exact if the last 14 are zero.\r\n //\r\n // Example of a result that will be incorrectly rounded:\r\n // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n // place is still 2.6.\r\n if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n do {\r\n sd += 10;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n r = divide(num, denominator, sd, 1);\r\n\r\n if (!inf) {\r\n\r\n // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n\r\n break;\r\n }\r\n } while (checkRoundingDigits(r.d, k += 10, rm));\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, -1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return y negated if x is finite and y is ±Infinity.\r\n else if (x.d) y.s = -y.s;\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with different signs.\r\n // Return NaN if both are ±Infinity with the same sign.\r\n else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.plus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return y negated if x is zero and y is non-zero.\r\n if (yd[0]) y.s = -y.s;\r\n\r\n // Return x if y is zero and x is non-zero.\r\n else if (xd[0]) y = new Ctor(x);\r\n\r\n // Return zero if both are zero.\r\n // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n e = mathfloor(y.e / LOG_BASE);\r\n xe = mathfloor(x.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of\r\n // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to `xd` if shorter.\r\n // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n // Return x if y is ±Infinity or x is ±0.\r\n if (!y.d || x.d && !x.d[0]) {\r\n return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n }\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n\r\n if (Ctor.modulo == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // result = x - q * y where 0 <= result < abs(y)\r\n q = divide(x, y.abs(), 0, 3, 1);\r\n q.s *= y.s;\r\n } else {\r\n q = divide(x, y, 0, Ctor.modulo, 1);\r\n }\r\n\r\n q = q.times(y);\r\n\r\n external = true;\r\n\r\n return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with the same sign.\r\n // Return NaN if both are ±Infinity with different signs.\r\n // Return y if x is finite and y is ±Infinity.\r\n else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.minus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!yd[0]) y = new Ctor(x);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n k = mathfloor(x.e / LOG_BASE);\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n var k,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n if (x.d) {\r\n k = getPrecision(x.d);\r\n if (z && x.e + 1 > k) k = x.e + 1;\r\n } else {\r\n k = NaN;\r\n }\r\n\r\n return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0) = 0\r\n * sin(-0) = -0\r\n * sin(Infinity) = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN) = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n var m, n, sd, r, rep, t,\r\n x = this,\r\n d = x.d,\r\n e = x.e,\r\n s = x.s,\r\n Ctor = x.constructor;\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !d || !d[0]) {\r\n return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n }\r\n\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(d);\r\n\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0) = 0\r\n * tan(-0) = -0\r\n * tan(Infinity) = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN) = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n x = x.sin();\r\n x.s = 1;\r\n x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n y.s *= x.s;\r\n\r\n // If either is NaN, ±Infinity or ±0...\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n // Return NaN if either is NaN.\r\n // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n ? NaN\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n // Return ±0 if either is ±0.\r\n : !xd || !yd ? y.s / 0 : y.s * 0);\r\n }\r\n\r\n e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = getBase10Exponent(r, e);\r\n\r\n return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), dp + 1, rm);\r\n str = finiteToString(x, true, dp + 1);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n str = finiteToString(y, false, dp + y.e + 1);\r\n }\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `x` rather than `y`.\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|bigint|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n x = this,\r\n xd = x.d,\r\n Ctor = x.constructor;\r\n\r\n if (!xd) return new Ctor(x);\r\n\r\n n1 = d0 = new Ctor(1);\r\n d1 = n0 = new Ctor(0);\r\n\r\n d = new Ctor(d1);\r\n e = d.e = getPrecision(xd) - x.e - 1;\r\n k = e % LOG_BASE;\r\n d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n if (maxD == null) {\r\n\r\n // d is 10**e, the minimum max-denominator needed.\r\n maxD = e > 0 ? d : n1;\r\n } else {\r\n n = new Ctor(maxD);\r\n if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n }\r\n\r\n external = false;\r\n n = new Ctor(digitsToString(xd));\r\n pr = Ctor.precision;\r\n Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n for (;;) {\r\n q = divide(n, d, 0, 1, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.cmp(maxD) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n d2 = n1;\r\n n1 = n0.plus(q.times(d2));\r\n n0 = d2;\r\n d2 = d;\r\n d = n.minus(q.times(d2));\r\n n = d2;\r\n }\r\n\r\n d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n ? [n1, d1] : [n0, d0];\r\n\r\n Ctor.precision = pr;\r\n external = true;\r\n\r\n return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|bigint|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n\r\n if (y == null) {\r\n\r\n // If x is not finite, return x.\r\n if (!x.d) return x;\r\n\r\n y = new Ctor(1);\r\n rm = Ctor.rounding;\r\n } else {\r\n y = new Ctor(y);\r\n if (rm === void 0) {\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(rm, 0, 8);\r\n }\r\n\r\n // If x is not finite, return x if y is not NaN, else NaN.\r\n if (!x.d) return y.s ? x : y;\r\n\r\n // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n if (!y.d) {\r\n if (y.s) y.s = x.s;\r\n return y;\r\n }\r\n }\r\n\r\n // If y is not zero, calculate the nearest multiple of y to x.\r\n if (y.d[0]) {\r\n external = false;\r\n x = divide(x, y, 0, rm, 1).times(y);\r\n external = true;\r\n finalise(x);\r\n\r\n // If y is zero, return zero with the sign of x.\r\n } else {\r\n y.s = x.s;\r\n x = y;\r\n }\r\n\r\n return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n * pow(x, NaN) = NaN\r\n * pow(x, ±0) = 1\r\n\r\n * pow(NaN, non-zero) = NaN\r\n * pow(abs(x) > 1, +Infinity) = +Infinity\r\n * pow(abs(x) > 1, -Infinity) = +0\r\n * pow(abs(x) == 1, ±Infinity) = NaN\r\n * pow(abs(x) < 1, +Infinity) = +0\r\n * pow(abs(x) < 1, -Infinity) = +Infinity\r\n * pow(+Infinity, y > 0) = +Infinity\r\n * pow(+Infinity, y < 0) = +0\r\n * pow(-Infinity, odd integer > 0) = -Infinity\r\n * pow(-Infinity, even integer > 0) = +Infinity\r\n * pow(-Infinity, odd integer < 0) = -0\r\n * pow(-Infinity, even integer < 0) = +0\r\n * pow(+0, y > 0) = +0\r\n * pow(+0, y < 0) = +Infinity\r\n * pow(-0, odd integer > 0) = -0\r\n * pow(-0, even integer > 0) = +0\r\n * pow(-0, odd integer < 0) = -Infinity\r\n * pow(-0, even integer < 0) = +Infinity\r\n * pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|bigint|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n var e, k, pr, r, rm, s,\r\n x = this,\r\n Ctor = x.constructor,\r\n yn = +(y = new Ctor(y));\r\n\r\n // Either ±Infinity, NaN or ±0?\r\n if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n x = new Ctor(x);\r\n\r\n if (x.eq(1)) return x;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n // y exponent\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = intPow(Ctor, x, k, pr);\r\n return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n }\r\n\r\n s = x.s;\r\n\r\n // if x is negative\r\n if (s < 0) {\r\n\r\n // if y is not an integer\r\n if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n // Result is positive if x is negative and the last digit of integer y is even.\r\n if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n // if x.eq(-1)\r\n if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n x.s = s;\r\n return x;\r\n }\r\n }\r\n\r\n // Estimate result exponent.\r\n // x^y = 10^e, where e = y * log10(x)\r\n // log10(x) = log10(x_significand) + x_exponent\r\n // log10(x_significand) = ln(x_significand) / ln(10)\r\n k = mathpow(+x, yn);\r\n e = k == 0 || !isFinite(k)\r\n ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n : new Ctor(k + '').e;\r\n\r\n // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n // Overflow/underflow?\r\n if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n external = false;\r\n Ctor.rounding = x.s = 1;\r\n\r\n // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n // new Decimal(2.32456).pow('2087987436534566.46411')\r\n // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n k = Math.min(12, (e + '').length);\r\n\r\n // r = x^y = exp(y*ln(x))\r\n r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n if (r.d) {\r\n\r\n // Truncate to the required precision plus five rounding digits.\r\n r = finalise(r, pr + 5, 1);\r\n\r\n // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n // the result.\r\n if (checkRoundingDigits(r.d, pr, rm)) {\r\n e = pr + 10;\r\n\r\n // Truncate to the increased precision plus five rounding digits.\r\n r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n }\r\n }\r\n\r\n r.s = s;\r\n external = true;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), sd, rm);\r\n str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n * finiteToString, naturalExponential, naturalLogarithm\r\n * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n * P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n * convertBase toStringBinary, parseOther\r\n * cos P.cos\r\n * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n * taylorSeries, atan2, parseOther\r\n * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n * P.truncated, divide, getLn10, getPi, naturalExponential,\r\n * naturalLogarithm, ceil, floor, round, trunc\r\n * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n * toStringBinary\r\n * getBase10Exponent P.minus, P.plus, P.times, parseOther\r\n * getLn10 P.logarithm, naturalLogarithm\r\n * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n * getPrecision P.precision, P.toFraction\r\n * getZeroString digitsToString, finiteToString\r\n * intPow P.toPower, parseOther\r\n * isOdd toLessThanHalfPi\r\n * maxOrMin max, min\r\n * naturalExponential P.naturalExponential, P.toPower\r\n * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n * P.toPower, naturalExponential\r\n * nonFiniteToString finiteToString, toStringBinary\r\n * parseDecimal Decimal\r\n * parseOther Decimal\r\n * sin P.sin\r\n * taylorSeries P.cosh, P.sinh, cos, sin\r\n * toLessThanHalfPi P.cos, P.sin\r\n * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal\r\n * truncate intPow\r\n *\r\n * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n * naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n var di, k, r, rd;\r\n\r\n // Get the length of the first word of the array d.\r\n for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n // Is the rounding digit in the first word of d?\r\n if (--i < 0) {\r\n i += LOG_BASE;\r\n di = 0;\r\n } else {\r\n di = Math.ceil((i + 1) / LOG_BASE);\r\n i %= LOG_BASE;\r\n }\r\n\r\n // i is the index (0 - 6) of the rounding digit.\r\n // E.g. if within the word 3487563 the first rounding digit is 5,\r\n // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n k = mathpow(10, LOG_BASE - i);\r\n rd = d[di] % k | 0;\r\n\r\n if (repeating == null) {\r\n if (i < 3) {\r\n if (i == 0) rd = rd / 100 | 0;\r\n else if (i == 1) rd = rd / 10 | 0;\r\n r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n } else {\r\n r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n }\r\n } else {\r\n if (i < 4) {\r\n if (i == 0) rd = rd / 1000 | 0;\r\n else if (i == 1) rd = rd / 100 | 0;\r\n else if (i == 2) rd = rd / 10 | 0;\r\n r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n } else {\r\n r = ((repeating || rm < 4) && rd + 1 == k ||\r\n (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n }\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n strL = str.length;\r\n\r\n for (; i < strL;) {\r\n for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n for (j = 0; j < arr.length; j++) {\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n var k, len, y;\r\n\r\n if (x.isZero()) return x;\r\n\r\n // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n len = x.d.length;\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n y = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n y = '2.3283064365386962890625e-10';\r\n }\r\n\r\n Ctor.precision += k;\r\n\r\n x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n // Reverse argument reduction\r\n for (var i = k; i--;) {\r\n var cos2x = x.times(x);\r\n x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n }\r\n\r\n Ctor.precision -= k;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k, base) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % base | 0;\r\n carry = temp / base | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, rm, dp, base) {\r\n var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n }\r\n\r\n if (base) {\r\n logBase = 1;\r\n e = x.e - y.e;\r\n } else {\r\n base = BASE;\r\n logBase = LOG_BASE;\r\n e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n }\r\n\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else if (dp) {\r\n sd = pr + (x.e - y.e) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) {\r\n qd.push(1);\r\n more = true;\r\n } else {\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / logBase + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * base + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n more = k || i < xL;\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= base/2\r\n k = base / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k, base);\r\n xd = multiplyInteger(xd, k, base);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= base / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= base) k = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL, base);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n more = rem[0] !== void 0;\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n }\r\n\r\n // logBase is 1 when divide is being used for base conversion.\r\n if (logBase == 1) {\r\n q.e = e;\r\n inexact = more;\r\n } else {\r\n\r\n // To calculate q.e, first get the number of digits of qd[0].\r\n for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n q.e = i + e * logBase - 1;\r\n\r\n finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n }\r\n\r\n return q;\r\n };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n Ctor = x.constructor;\r\n\r\n // Don't round if sd is null or undefined.\r\n out: if (sd != null) {\r\n xd = x.d;\r\n\r\n // Infinity/NaN.\r\n if (!xd) return x;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd containing rd, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // digits: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n i = sd - digits;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) {\r\n if (isTruncated) {\r\n\r\n // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n for (; k++ <= xdi;) xd.push(0);\r\n w = rd = 0;\r\n digits = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - digits.\r\n j = i - LOG_BASE + digits;\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n }\r\n }\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n isTruncated = isTruncated || sd < 0 ||\r\n xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n // will give 714.\r\n\r\n roundUp = rm < 4\r\n ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xd[0]) {\r\n xd.length = 0;\r\n if (roundUp) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xd[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (roundUp) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n\r\n // i will be the length of xd[0] before k is added.\r\n for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n j = xd[0] += k;\r\n for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xd[0] == BASE) xd[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n }\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > Ctor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < Ctor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // Ctor.underflow = true;\r\n } // else Ctor.underflow = false;\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n if (!x.isFinite()) return nonFiniteToString(x);\r\n var k,\r\n e = x.e,\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n var w = digits[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n if (sd > LN10_PRECISION) {\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(precisionLimitExceeded);\r\n }\r\n return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n var w = digits.length - 1,\r\n len = w * LOG_BASE + 1;\r\n\r\n w = digits[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) len--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = digits[0]; w >= 10; w /= 10) len++;\r\n }\r\n\r\n return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n var isTruncated,\r\n r = new Ctor(1),\r\n\r\n // Max n of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (n % 2) {\r\n r = r.times(x);\r\n if (truncate(r.d, k)) isTruncated = true;\r\n }\r\n\r\n n = mathfloor(n / 2);\r\n if (n === 0) {\r\n\r\n // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n n = r.d.length - 1;\r\n if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n break;\r\n }\r\n\r\n x = x.times(x);\r\n truncate(x.d, k);\r\n }\r\n\r\n external = true;\r\n\r\n return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n var k, y,\r\n x = new Ctor(args[0]),\r\n i = 0;\r\n\r\n for (; ++i < args.length;) {\r\n y = new Ctor(args[i]);\r\n\r\n // NaN?\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n }\r\n\r\n k = x.cmp(y);\r\n\r\n if (k === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(Infinity) = Infinity\r\n * exp(-Infinity) = 0\r\n * exp(NaN) = NaN\r\n * exp(±0) = 1\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n * The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n var denominator, guard, j, pow, sum, t, wpr,\r\n rep = 0,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // 0/NaN/Infinity?\r\n if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n return new Ctor(x.d\r\n ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n // while abs(x) >= 0.1\r\n while (x.e > -2) {\r\n\r\n // x = x / 2^5\r\n x = x.times(t);\r\n k += 5;\r\n }\r\n\r\n // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n // necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(1);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = finalise(pow.times(x), wpr, 1);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n j = k;\r\n while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n // Check to see if the first 4 rounding digits are [49]999.\r\n // If so, repeat the summation with a higher precision, otherwise\r\n // e.g. with precision: 18, rounding: 1\r\n // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n\r\n if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += 10;\r\n denominator = pow = t = new Ctor(1);\r\n i = 0;\r\n rep++;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * ln(-n) = NaN\r\n * ln(0) = -Infinity\r\n * ln(-0) = -Infinity\r\n * ln(1) = 0\r\n * ln(Infinity) = Infinity\r\n * ln(-Infinity) = NaN\r\n * ln(NaN) = NaN\r\n *\r\n * ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // Is x negative or Infinity, NaN, 0 or 1?\r\n if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n Ctor.precision = wpr += guard;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n\r\n if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = x.e;\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n Ctor.precision = pr;\r\n\r\n return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n }\r\n\r\n // x1 is x reduced to a value near 1.\r\n x1 = x;\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = finalise(numerator.times(x2), wpr, 1);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n // been repeated previously) and the first 4 rounding digits 9999?\r\n // If so, restart the summation with a higher precision, otherwise\r\n // e.g. with precision: 12, rounding: 1\r\n // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += guard;\r\n t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = rep = 1;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n // Unsigned.\r\n return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n x.e = e = e - i - 1;\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > x.constructor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < x.constructor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // x.constructor.underflow = true;\r\n } // else x.constructor.underflow = false;\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n if (str.indexOf('_') > -1) {\r\n str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n if (isDecimal.test(str)) return parseDecimal(x, str);\r\n } else if (str === 'Infinity' || str === 'NaN') {\r\n if (!+str) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return x;\r\n }\r\n\r\n if (isHex.test(str)) {\r\n base = 16;\r\n str = str.toLowerCase();\r\n } else if (isBinary.test(str)) {\r\n base = 2;\r\n } else if (isOctal.test(str)) {\r\n base = 8;\r\n } else {\r\n throw Error(invalidArgument + str);\r\n }\r\n\r\n // Is there a binary exponent part?\r\n i = str.search(/p/i);\r\n\r\n if (i > 0) {\r\n p = +str.slice(i + 1);\r\n str = str.substring(2, i);\r\n } else {\r\n str = str.slice(2);\r\n }\r\n\r\n // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n // fraction part will be restored.\r\n i = str.indexOf('.');\r\n isFloat = i >= 0;\r\n Ctor = x.constructor;\r\n\r\n if (isFloat) {\r\n str = str.replace('.', '');\r\n len = str.length;\r\n i = len - i;\r\n\r\n // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n }\r\n\r\n xd = convertBase(str, base, BASE);\r\n xe = xd.length - 1;\r\n\r\n // Remove trailing zeros.\r\n for (i = xe; xd[i] === 0; --i) xd.pop();\r\n if (i < 0) return new Ctor(x.s * 0);\r\n x.e = getBase10Exponent(xd, xe);\r\n x.d = xd;\r\n external = false;\r\n\r\n // At what precision to perform the division to ensure exact conversion?\r\n // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n // Therefore using 4 * the number of digits of str will always be enough.\r\n if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n // Multiply by the binary exponent part if present.\r\n if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n external = true;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n var k,\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n }\r\n\r\n // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x);\r\n\r\n // Reverse argument reduction\r\n var sin2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sin2_x = x.times(x);\r\n x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n var j, t, u, x2,\r\n i = 1,\r\n pr = Ctor.precision,\r\n k = Math.ceil(pr / LOG_BASE);\r\n\r\n external = false;\r\n x2 = x.times(x);\r\n u = new Ctor(y);\r\n\r\n for (;;) {\r\n t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n t = u.plus(y);\r\n\r\n if (t.d[k] !== void 0) {\r\n for (j = k; t.d[j] === u.d[j] && j--;);\r\n if (j == -1) break;\r\n }\r\n\r\n j = u;\r\n u = y;\r\n y = t;\r\n t = j;\r\n i++;\r\n }\r\n\r\n external = true;\r\n t.d.length = k + 1;\r\n\r\n return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n var n = b;\r\n while (--e) n *= b;\r\n return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n var t,\r\n isNeg = x.s < 0,\r\n pi = getPi(Ctor, Ctor.precision, 1),\r\n halfPi = pi.times(0.5);\r\n\r\n x = x.abs();\r\n\r\n if (x.lte(halfPi)) {\r\n quadrant = isNeg ? 4 : 1;\r\n return x;\r\n }\r\n\r\n t = x.divToInt(pi);\r\n\r\n if (t.isZero()) {\r\n quadrant = isNeg ? 3 : 2;\r\n } else {\r\n x = x.minus(t.times(pi));\r\n\r\n // 0 <= x < pi\r\n if (x.lte(halfPi)) {\r\n quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n return x;\r\n }\r\n\r\n quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n }\r\n\r\n return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n var base, e, i, k, len, roundUp, str, xd, y,\r\n Ctor = x.constructor,\r\n isExp = sd !== void 0;\r\n\r\n if (isExp) {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n } else {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n }\r\n\r\n if (!x.isFinite()) {\r\n str = nonFiniteToString(x);\r\n } else {\r\n str = finiteToString(x);\r\n i = str.indexOf('.');\r\n\r\n // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n if (isExp) {\r\n base = 2;\r\n if (baseOut == 16) {\r\n sd = sd * 4 - 3;\r\n } else if (baseOut == 8) {\r\n sd = sd * 3 - 2;\r\n }\r\n } else {\r\n base = baseOut;\r\n }\r\n\r\n // Convert the number as an integer then divide the result by its base raised to a power such\r\n // that the fraction part will be restored.\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n str = str.replace('.', '');\r\n y = new Ctor(1);\r\n y.e = str.length - i;\r\n y.d = convertBase(finiteToString(y), 10, base);\r\n y.e = y.d.length;\r\n }\r\n\r\n xd = convertBase(str, 10, base);\r\n e = len = xd.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] == 0;) xd.pop();\r\n\r\n if (!xd[0]) {\r\n str = isExp ? '0p+0' : '0';\r\n } else {\r\n if (i < 0) {\r\n e--;\r\n } else {\r\n x = new Ctor(x);\r\n x.d = xd;\r\n x.e = e;\r\n x = divide(x, y, sd, rm, 0, base);\r\n xd = x.d;\r\n e = x.e;\r\n roundUp = inexact;\r\n }\r\n\r\n // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n i = xd[sd];\r\n k = base / 2;\r\n roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n roundUp = rm < 4\r\n ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n rm === (x.s < 0 ? 8 : 7));\r\n\r\n xd.length = sd;\r\n\r\n if (roundUp) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (; ++xd[--sd] > base - 1;) {\r\n xd[sd] = 0;\r\n if (!sd) {\r\n ++e;\r\n xd.unshift(1);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n // Add binary exponent suffix?\r\n if (isExp) {\r\n if (len > 1) {\r\n if (baseOut == 16 || baseOut == 8) {\r\n i = baseOut == 16 ? 4 : 3;\r\n for (--len; len % i; len++) str += '0';\r\n xd = convertBase(str, base, baseOut);\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // xd[0] will always be be 1\r\n for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n } else {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n }\r\n\r\n str = str + (e < 0 ? 'p' : 'p+') + e;\r\n } else if (e < 0) {\r\n for (; ++e;) str = '0' + str;\r\n str = '0.' + str;\r\n } else {\r\n if (++e > len) for (e -= len; e-- ;) str += '0';\r\n else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n * abs\r\n * acos\r\n * acosh\r\n * add\r\n * asin\r\n * asinh\r\n * atan\r\n * atanh\r\n * atan2\r\n * cbrt\r\n * ceil\r\n * clamp\r\n * clone\r\n * config\r\n * cos\r\n * cosh\r\n * div\r\n * exp\r\n * floor\r\n * hypot\r\n * ln\r\n * log\r\n * log2\r\n * log10\r\n * max\r\n * min\r\n * mod\r\n * mul\r\n * pow\r\n * random\r\n * round\r\n * set\r\n * sign\r\n * sin\r\n * sinh\r\n * sqrt\r\n * sub\r\n * sum\r\n * tan\r\n * tanh\r\n * trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0) = ±pi\r\n * atan2(±0, +0) = ±0\r\n * atan2(±0, -x) = ±pi for x > 0\r\n * atan2(±0, x) = ±0 for x > 0\r\n * atan2(-y, ±0) = -pi/2 for y > 0\r\n * atan2(y, ±0) = pi/2 for y > 0\r\n * atan2(±y, -Infinity) = ±pi for finite y > 0\r\n * atan2(±y, +Infinity) = ±0 for finite y > 0\r\n * atan2(±Infinity, x) = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n y = new this(y);\r\n x = new this(x);\r\n var r,\r\n pr = this.precision,\r\n rm = this.rounding,\r\n wpr = pr + 4;\r\n\r\n // Either NaN\r\n if (!y.s || !x.s) {\r\n r = new this(NaN);\r\n\r\n // Both ±Infinity\r\n } else if (!y.d && !x.d) {\r\n r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n r.s = y.s;\r\n\r\n // x is ±Infinity or y is ±0\r\n } else if (!x.d || y.isZero()) {\r\n r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n r.s = y.s;\r\n\r\n // y is ±Infinity or x is ±0\r\n } else if (!y.d || x.isZero()) {\r\n r = getPi(this, wpr, 1).times(0.5);\r\n r.s = y.s;\r\n\r\n // Both non-zero and finite\r\n } else if (x.s < 0) {\r\n this.precision = wpr;\r\n this.rounding = 1;\r\n r = this.atan(divide(y, x, wpr, 1));\r\n x = getPi(this, wpr, 1);\r\n this.precision = pr;\r\n this.rounding = rm;\r\n r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n } else {\r\n r = this.atan(divide(y, x, wpr, 1));\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n * maxE {number}\r\n * minE {number}\r\n * modulo {number}\r\n * crypto {boolean|number}\r\n * defaults {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n var i, p, v,\r\n useDefaults = obj.defaults === true,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -EXP_LIMIT, 0,\r\n 'toExpPos', 0, EXP_LIMIT,\r\n 'maxE', 0, EXP_LIMIT,\r\n 'minE', -EXP_LIMIT, 0,\r\n 'modulo', 0, 9\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (v === true || v === false || v === 0 || v === 1) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n this[p] = true;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n } else {\r\n this[p] = false;\r\n }\r\n } else {\r\n throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * v {number|string|bigint|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(v) {\r\n var e, i, t,\r\n x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n if (isDecimalInstance(v)) {\r\n x.s = v.s;\r\n\r\n if (external) {\r\n if (!v.d || v.e > Decimal.maxE) {\r\n\r\n // Infinity.\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (v.e < Decimal.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d.slice();\r\n }\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d ? v.d.slice() : v.d;\r\n }\r\n\r\n return;\r\n }\r\n\r\n t = typeof v;\r\n\r\n if (t === 'number') {\r\n if (v === 0) {\r\n x.s = 1 / v < 0 ? -1 : 1;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (v === ~~v && v < 1e7) {\r\n for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n if (external) {\r\n if (e > Decimal.maxE) {\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (e < Decimal.minE) {\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Infinity or NaN?\r\n if (v * 0 !== 0) {\r\n if (!v) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n if (t === 'string') {\r\n if ((i = v.charCodeAt(0)) === 45) { // minus sign\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n if (i === 43) v = v.slice(1); // plus sign\r\n x.s = 1;\r\n }\r\n\r\n return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n }\r\n\r\n if (t === 'bigint') {\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n throw Error(invalidArgument + v);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n Decimal.EUCLID = 9;\r\n\r\n Decimal.config = Decimal.set = config;\r\n Decimal.clone = clone;\r\n Decimal.isDecimal = isDecimalInstance;\r\n\r\n Decimal.abs = abs;\r\n Decimal.acos = acos;\r\n Decimal.acosh = acosh; // ES6\r\n Decimal.add = add;\r\n Decimal.asin = asin;\r\n Decimal.asinh = asinh; // ES6\r\n Decimal.atan = atan;\r\n Decimal.atanh = atanh; // ES6\r\n Decimal.atan2 = atan2;\r\n Decimal.cbrt = cbrt; // ES6\r\n Decimal.ceil = ceil;\r\n Decimal.clamp = clamp;\r\n Decimal.cos = cos;\r\n Decimal.cosh = cosh; // ES6\r\n Decimal.div = div;\r\n Decimal.exp = exp;\r\n Decimal.floor = floor;\r\n Decimal.hypot = hypot; // ES6\r\n Decimal.ln = ln;\r\n Decimal.log = log;\r\n Decimal.log10 = log10; // ES6\r\n Decimal.log2 = log2; // ES6\r\n Decimal.max = max;\r\n Decimal.min = min;\r\n Decimal.mod = mod;\r\n Decimal.mul = mul;\r\n Decimal.pow = pow;\r\n Decimal.random = random;\r\n Decimal.round = round;\r\n Decimal.sign = sign; // ES6\r\n Decimal.sin = sin;\r\n Decimal.sinh = sinh; // ES6\r\n Decimal.sqrt = sqrt;\r\n Decimal.sub = sub;\r\n Decimal.sum = sum;\r\n Decimal.tan = tan;\r\n Decimal.tanh = tanh; // ES6\r\n Decimal.trunc = trunc; // ES6\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n if (obj.defaults !== true) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n var i, n,\r\n t = new this(0);\r\n\r\n external = false;\r\n\r\n for (i = 0; i < arguments.length;) {\r\n n = new this(arguments[i++]);\r\n if (!n.d) {\r\n if (n.s) {\r\n external = true;\r\n return new this(1 / 0);\r\n }\r\n t = n;\r\n } else if (t.d) {\r\n t = t.plus(n.times(n));\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, -1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The base.\r\n * y {number|string|bigint|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n var d, e, k, n,\r\n i = 0,\r\n r = new this(1),\r\n rd = [];\r\n\r\n if (sd === void 0) sd = this.precision;\r\n else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n k = Math.ceil(sd / LOG_BASE);\r\n\r\n if (!this.crypto) {\r\n for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n } else if (crypto.getRandomValues) {\r\n d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n for (; i < k;) {\r\n n = d[i];\r\n\r\n // 0 <= n < 4294967296\r\n // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n if (n >= 4.29e9) {\r\n d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n } else {\r\n\r\n // 0 <= n <= 4289999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd[i++] = n % 1e7;\r\n }\r\n }\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n d = crypto.randomBytes(k *= 4);\r\n\r\n for (; i < k;) {\r\n\r\n // 0 <= n < 2147483648\r\n n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n if (n >= 2.14e9) {\r\n crypto.randomBytes(4).copy(d, i);\r\n } else {\r\n\r\n // 0 <= n <= 2139999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd.push(n % 1e7);\r\n i += 4;\r\n }\r\n }\r\n\r\n i = k / 4;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n\r\n k = rd[--i];\r\n sd %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to sd.\r\n if (k && sd) {\r\n n = mathpow(10, LOG_BASE - sd);\r\n rd[i] = (k / n | 0) * n;\r\n }\r\n\r\n // Remove trailing words which are zero.\r\n for (; rd[i] === 0; i--) rd.pop();\r\n\r\n // Zero?\r\n if (i < 0) {\r\n e = 0;\r\n rd = [0];\r\n } else {\r\n e = -1;\r\n\r\n // Remove leading words which are zero and adjust exponent accordingly.\r\n for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n // Count the digits of the first word of rd to determine leading zeros.\r\n for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n // Adjust the exponent for leading zeros of the first word of rd.\r\n if (k < LOG_BASE) e -= LOG_BASE - k;\r\n }\r\n\r\n r.e = e;\r\n r.d = rd;\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if x > 0,\r\n * -1 if x < 0,\r\n * 0 if x is 0,\r\n * -0 if x is -0,\r\n * NaN otherwise\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n x = new this(x);\r\n return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n var i = 0,\r\n args = arguments,\r\n x = new this(args[i]);\r\n\r\n external = false;\r\n for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n external = true;\r\n\r\n return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","/*\n * Copyright 2013 Art Compiler LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*\n ASSERTS AND MESSAGES\n\n We use the 'assert()' function to trap invalid states of all kinds. External\n messages are distinguished from internal messages by a numeric prefix that\n indicates the error code associated with the message. For example, the\n following two asserts implement an internal and external assert, respectively.\n\n assert(false, \"This code is broken.\");\n assert(false, \"1001: Invalid user input.\");\n\n To aid in the writing of external messages, we keep them in a single global\n table named 'Assert.messages'. Each module adds to this table its own messages\n with an expression such as\n\n messages[1001] = \"Invalid user input.\";\n\n These messages are accessed with the 'message' function as such\n\n message(1001);\n\n Calling 'assert' with 'message' looks like\n\n assert(x != y, message(1001));\n\n ALLOCATING ERROR CODES\n\n In order to avoid error code conflicts, each module claims a range of values\n that is not already taken by the modules in the same system. A module claims\n a range of codes by calling the function reserveCodeRange() like this:\n\n reserveCodeRange(1000, 1999, \"mymodule\");\n\n If the requested code range has any values that are already reserved, then\n an assertion is raised.\n\n USAGE\n\n In general, only allocate message codes for external asserts. For internal\n asserts, it is sufficient to simply inline the message text in the assert\n expression.\n\n It is good to write an assert for every undefined state, regardless of whether\n it is the result of external input or not. Asserts can then be externalized if\n and when they it is clear that they are the result of external input.\n\n A client module can override the messages provided by the libraries it uses by\n simply redefining those messages after the defining library is loaded. That is,\n the client can copy and past the statements of the form\n\n messages[1001] = \"Invalid user input.\";\n\n and provide new text for the message.\n\n messages[1001] = \"Syntax error.\";\n\n In the same way different sets of messages can be overridden for the purpose\n of localization.\n\n*/\n\nconst ASSERT = true;\nexport const assert = (\n !ASSERT ? () => {} :\n (val, str, location) => {\n if (str === undefined) {\n str = 'failed!';\n }\n if (!val) {\n const err = new Error(str);\n err.location = location || Assert.location;\n throw err;\n }\n });\n\nexport const message = (errorCode, args) => {\n let str = Assert.messages[errorCode];\n if (args) {\n args.forEach((arg, i) => {\n str = str.replace(`%${i + 1}`, arg);\n });\n }\n return `${errorCode}: ${str}`;\n};\n\nexport const reserveCodeRange = (first, last, moduleName) => {\n assert(first <= last, 'Invalid code range');\n const noConflict = Assert.reservedCodes.every((range) => last < range.first || first > range.last);\n assert(noConflict, 'Conflicting request for error code range');\n Assert.reservedCodes.push({ first, last, name: moduleName });\n};\n\nexport const setLocation = (location) => {\n // assert(location, \"Empty location\");\n Assert.location = location;\n};\n\nexport const clearLocation = () => {\n Assert.location = null;\n};\n\nconst setTimeout = (timeout, message) => {\n if (timeout === undefined) {\n return undefined;\n }\n Assert.timeout = timeout ? Date.now() + timeout : 0;\n Assert.timeoutMessage = message || 'ERROR timeout exceeded';\n return undefined;\n};\n\nconst checkTimeout = () => {\n assert(!Assert.timeout || Assert.timeout > Date.now(), Assert.timeoutMessage);\n};\n\nexport const setCounter = (count, message) => {\n Assert.count = count;\n Assert.countMessage = message || 'ERROR count exceeded';\n};\n\nexport const checkCounter = () => {\n const { count } = Assert;\n if (typeof count !== 'number' || Number.isNaN(count)) {\n assert(false, 'ERROR counter not set');\n return;\n }\n assert(Assert.count--, Assert.countMessage);\n};\n\nexport const Assert = {\n assert,\n message,\n messages: {},\n reserveCodeRange,\n reservedCodes: [],\n setLocation,\n clearLocation,\n checkTimeout,\n setTimeout,\n setCounter,\n checkCounter,\n};\n","/*\n * Copyright 2013 Art Compiler LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*\n This module implements the node factory for abstract syntax trees (AST).\n\n Each node inherits an Ast instance as it prototype.\n\n All Ast instances share the same node pool and therefore intern trees of\n identical structure to the same node id.\n\n Node manipulation functions are chainable.\n\n */\n\nimport { assert } from './assert.js';\n\nexport const Ast = (() => {\n // Pool of nodes. Shared between all Ast instances.\n\n function Ast() {\n this.nodePool = ['unused'];\n this.nodeMap = {};\n }\n\n // Append node to this node's args.\n Ast.prototype.arg = function arg(node) {\n if (!isNode(this)) {\n throw new Error('Malformed node');\n }\n this.args.push(node);\n return this;\n };\n\n // Get or set the Nth arg of this node.\n Ast.prototype.argN = function argN(i, node) {\n if (!isNode(this)) {\n throw new Error('Malformed node');\n }\n if (node === undefined) {\n return this.args[i];\n }\n this.args[i] = node;\n return this;\n };\n\n // Get or set the args of this node.\n Ast.prototype.args = function args(a) {\n if (!isNode(this)) {\n throw new Error('Malformed node');\n }\n if (a === undefined) {\n return this.args;\n }\n this.args = a;\n return this;\n };\n\n // Check if obj is a value node object [private]\n Ast.prototype.isNode = isNode;\n\n function isNode(obj) {\n if (obj === undefined) {\n obj = this;\n }\n return obj.op && obj.args;\n }\n\n // Intern an AST into the node pool and return its node id.\n Ast.prototype.intern = function intern(node) {\n if (this instanceof Ast &&\n node === undefined &&\n isNode(this)) {\n // We have an Ast that look like a node\n node = this;\n }\n assert(typeof node === 'object', 'node not an object');\n const { op } = node;\n const count = node.args.length;\n let args = '';\n const argsNids = [];\n for (let i = 0; i < count; i++) {\n args += ' ';\n if (typeof node.args[i] === 'string') {\n args += argsNids[i] = node.args[i];\n } else {\n args += argsNids[i] = this.intern(node.args[i]);\n }\n }\n const TK_LEFTBRACE = 0x7B;\n const TK_LEFTBRACESET = 0x173;\n if (node.lbrk && node.lbrk !== TK_LEFTBRACE && node.lbrk !== TK_LEFTBRACESET) {\n // Make brackets part of the key.\n args += String.fromCharCode(node.lbrk);\n args += String.fromCharCode(node.rbrk);\n }\n const key = op + count + args;\n let nid = this.nodeMap[key];\n if (nid === undefined) {\n this.nodePool.push({\n op,\n args: argsNids,\n });\n nid = this.nodePool.length - 1;\n this.nodeMap[key] = nid;\n }\n return nid;\n };\n\n // Get a node from the node pool.\n Ast.prototype.node = function node(nid) {\n const n = JSON.parse(JSON.stringify(this.nodePool[nid]));\n for (let i = 0; i < n.args.length; i++) {\n // If string, then not a nid.\n if (typeof n.args[i] !== 'string') {\n n.args[i] = this.node(n.args[i]);\n }\n }\n return n;\n };\n\n // Dump the contents of the node pool.\n Ast.prototype.dumpAll = function dumpAll() {\n let s = '';\n this.nodePool.forEach((n, i) => {\n s += `\\n${i}: ${Ast.dump(n)}`;\n });\n return s;\n };\n\n // Dump the contents of a node.\n Ast.dump = Ast.prototype.dump = function dump(n) {\n let s;\n if (typeof n === 'string') {\n s = `\"${n}\"`;\n } else if (typeof n === 'number') {\n s = n;\n } else {\n s = `{ op: \"${n.op}\", args: [ `;\n for (let i = 0; i < n.args.length; i++) {\n if (i > 0) {\n s += ' , ';\n }\n s += dump(n.args[i]);\n }\n s += ' ] }';\n }\n return s;\n };\n\n // Self tests\n const RUN_SELF_TESTS = false;\n function test() {\n }\n if (RUN_SELF_TESTS) {\n test();\n }\n\n return Ast;\n})();\n","/*\n * Copyright 2013-2020 ARTCOMPILER INC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n This module defines an object model for evaluating and comparing LaTex\n strings. The primary data structure is the Model class. Instances of the\n Model class contain an AST (Ast instance) and zero or more plugins that\n provide functions for evaluating, transforming and comparing models.\n\n Basic Terms\n\n Node - a node is a raw JavaScript object that consists of an 'op' property\n that is a string indicating the node type, an 'args' property that is an array\n that holds the operands of the operation, and any other \"attribute\" properties\n used by plugins to elaborate the mean meaning of the node.\n\n AST - an AST is an a Node that is an instance of the Ast class. The Ast class\n provides methods for constructing and managing nodes.\n\n Model - a model is a Node that is an instance of the Model class, which\n inherits from the Ast class. The model class adds methods for creating nodes\n from LaTex strings and rendering them to LaTex strings. Model values are\n configured by Model plugins that implement operations for evaluating,\n transforming and comparing nodes.\n\n Overview\n\n Every model object is also a factory for other model objects that share\n the same set of plugins.\n\n Model.fn.isEquivalent; // register plugin function\n let model = new Model;\n let expected = model.create(options, \"1 + 2\");\n let actual = model.create(options, response);\n model.isEquivalent(expected, actual);\n expected.isEquivalent(actual);\n\n When all models in a particular JavaScript sandbox (global scope) use the same\n plugins, those plugins can be registered with the Model class as default\n plugins, as follows:\n\n*/\n\nimport Decimal from 'decimal.js';\nimport { Assert, assert } from './assert.js';\nimport { Ast } from './ast.js';\n\nexport const Model = (() => {\n function Model() {}\n const envStack = [];\n let env = {};\n Model.fn = {};\n Model.env = env;\n\n Model.pushEnv = (e) => {\n envStack.push(env);\n Model.env = env = e;\n };\n\n Model.popEnv = () => {\n assert(envStack.length > 0, '1000: Empty envStack');\n Model.env = env = envStack.pop();\n };\n\n Model.option = (options, key) => {\n return options[key];\n };\n\n function isChemCore() {\n // Has chem symbols so in chem mode.\n return !!Model.env.Au;\n }\n\n const Mp = Model.prototype = new Ast();\n\n // Add messages here\n Assert.reserveCodeRange(1000, 1999, 'model');\n Assert.messages[1000] = 'Internal error. %1.';\n Assert.messages[1001] = 'Invalid syntax. \"%1\" expected, \"%2\" found.';\n Assert.messages[1002] = 'Only one decimal separator can be specified.';\n Assert.messages[1003] = 'Extra characters in input at position: %1, lexeme: %2, prefix: %3.';\n Assert.messages[1004] = 'Invalid character \"%1\" (%2) in input.';\n Assert.messages[1005] = 'Misplaced thousands separator.';\n Assert.messages[1006] = 'Invalid syntax. Expression expected, %1 found.';\n Assert.messages[1007] = 'Unexpected character: \"%1\" in \"%2\".';\n Assert.messages[1008] = 'The same character \"%1\" is being used as a thousands and decimal separators.';\n Assert.messages[1009] = 'Missing argument for \"%1\" command.';\n Assert.messages[1010] = 'Expecting an operator between numbers.';\n Assert.messages[1011] = 'Invalid grouping bracket. %1';\n Assert.messages[1012] = 'Misplaced subscript in \"%1\"';\n Assert.messages[1013] = 'Mismatched thousands separators: \"%1\" and \"%2\".';\n Assert.messages[1014] = 'Missing integration variable in \"%1\".';\n const { message } = Assert;\n\n // Create a model from a node object or expression string\n Model.create = Mp.create = function create(options, node, location) {\n assert(node instanceof Array ||\n typeof node === 'object' && (node.op || node instanceof Model) ||\n typeof node === 'string', JSON.stringify(node));\n assert(node !== undefined, '1000: Internal error. Node undefined.');\n // If we already have a model, then just return it.\n if (node instanceof Model) {\n if (location) {\n node.location = location;\n }\n return node;\n }\n let model;\n if (node instanceof Array) {\n model = [];\n node.forEach((n) => {\n model.push(create(options, n, location));\n });\n return model;\n }\n if (!(this instanceof Model)) {\n return new Model().create(options, node, location);\n }\n // Create a node that inherits from Ast.\n model = create(options, this);\n model.location = location;\n if (typeof node === 'string') {\n // Got a string, so parse it into a node.\n const parser = parse(options, node, Model.env);\n node = parser.expr();\n // console.log('create() node=' + JSON.stringify(node, null, 2));\n } else {\n // Make a deep copy of the node.\n node = JSON.parse(JSON.stringify(node));\n }\n // Add missing plugin functions to the Model prototype.\n Object.keys(Model.fn).forEach((v) => {\n if (!Mp[v]) {\n Mp[v] = function (...rest) {\n const fn = Model.fn[v];\n if (rest.length > 1 &&\n rest[1] instanceof Model) {\n return fn.apply(this, rest);\n }\n const args = [this];\n for (let i = 0; i < rest.length; i++) {\n args.push(rest[i]);\n }\n return fn.apply(this, args);\n };\n }\n });\n // Now copy the node's properties into the model object.\n Object.keys(node).forEach((v) => {\n model[v] = node[v];\n });\n return model;\n };\n\n // Create a Model node from LaTex source.\n Model.fromLaTeX = Mp.fromLaTeX = function fromLaTeX(options, src) {\n assert(typeof src === 'string', '1000: Model.prototype.fromLaTex');\n if (!this) {\n return Model.create(options, src);\n }\n return this.create(options, src);\n };\n\n // Render LaTex from the model node.\n Model.toLaTeX = Mp.toLaTeX = function toLaTeX(node) {\n return render(node);\n };\n\n const OpStr = {\n ADD: '+',\n SUB: '-',\n MUL: 'mul',\n TIMES: '\\\\times', // Special case for '*' and '\\times' in literals.\n DIV: '\\\\div',\n FRAC: '\\\\frac',\n EQL: '=',\n ATAN2: 'atan2',\n SQRT: 'sqrt',\n VEC: 'vec',\n PM: 'pm',\n NOT: 'not',\n SIN: 'sin',\n COS: 'cos',\n TAN: 'tan',\n SEC: 'sec',\n COT: 'cot',\n CSC: 'csc',\n ARCSIN: 'arcsin',\n ARCCOS: 'arccos',\n ARCTAN: 'arctan',\n ARCSEC: 'arcsec',\n ARCCOT: 'arccot',\n ARCCSC: 'arccsc',\n SINH: 'sinh',\n COSH: 'cosh',\n TANH: 'tanh',\n SECH: 'sech',\n COTH: 'coth',\n CSCH: 'csch',\n ARCSINH: 'arcsinh',\n ARCCOSH: 'arccosh',\n ARCTANH: 'arctanh',\n ARCSECH: 'arcsech',\n ARCCSCH: 'arccsch',\n ARCCOTH: 'arccoth',\n LOG: 'log',\n LN: 'ln',\n LG: 'lg',\n VAR: 'var',\n TEXT: 'text',\n NUM: 'num',\n COMMA: ',',\n POW: '^',\n SUBSCRIPT: '_',\n ABS: 'abs',\n PAREN: '()',\n BRACE: '{}',\n BRACKET: '[]',\n ANGLEBRACKET: 'anglebracket',\n HIGHLIGHT: 'hi',\n LT: 'lt',\n LE: 'le',\n GT: 'gt',\n GE: 'ge',\n NE: 'ne',\n NGTR: 'ngtr',\n NLESS: 'nless',\n NI: 'ni',\n SUBSETEQ: 'subseteq',\n SUPSETEQ: 'supseteq',\n SUBSET: 'subset',\n SUPSET: 'supset',\n NNI: 'nni',\n NSUBSETEQ: 'nsubseteq',\n NSUPSETEQ: 'nsupseteq',\n NSUBSET: 'nsubset',\n NSUPSET: 'nsupset',\n APPROX: 'approx',\n IMPLIES: 'implies',\n CAPRIGHTARROW: 'caprightarrow',\n RIGHTARROW: 'rightarrow',\n LEFTARROW: 'leftarrrow',\n LONGRIGHTARROW: 'longrightarrow',\n LONGLEFTARROW: 'longleftarrow',\n OVERRIGHTARROW: 'overrightarrow',\n OVERLEFTARROW: 'overleftarrow',\n CAPLEFTRIGHTARROW: 'capleftrightarrow',\n LEFTRIGHTARROW: 'leftrightarrow',\n LONGLEFTRIGHTARROW: 'longleftrightarrow',\n OVERLEFTRIGHTARROW: 'overleftrightarrow',\n PERP: 'perp',\n PROPTO: 'propto',\n PARALLEL: 'parallel',\n NPARALLEL: 'nparallel',\n SIM: 'sim',\n CONG: 'cong',\n INTERVAL: 'interval',\n INTERVALOPEN: 'intervalopen',\n INTERVALLEFTOPEN: 'intervalleftopen',\n INTERVALRIGHTOPEN: 'intervalrightopen',\n EVALAT: 'eval-at',\n LIST: 'list',\n SET: 'set',\n EXISTS: 'exists',\n IN: 'in',\n FORALL: 'forall',\n LIM: 'lim',\n EXP: 'exp',\n TO: 'to',\n SUM: 'sum',\n DERIV: 'deriv',\n PIPE: 'pipe',\n INTEGRAL: 'integral',\n PROD: 'prod',\n CUP: 'cup',\n BIGCUP: 'bigcup',\n CAP: 'cap',\n BIGCAP: 'bigcap',\n PERCENT: '%',\n QMARK: '?',\n M: 'M',\n FACT: 'fact',\n BINOM: 'binom',\n ROW: 'row',\n COL: 'col',\n COLON: 'colon',\n MATRIX: 'matrix',\n TYPE: 'type',\n FORMAT: 'format',\n OVERSET: 'overset',\n UNDERSET: 'underset',\n OVERLINE: 'overline',\n DEGREE: 'degree',\n BACKSLASH: 'backslash',\n MATHBF: 'mathbf',\n CDOT: '\\\\cdot',\n MATHFIELD: 'mathfield',\n DELTA: 'delta',\n OPERATORNAME: 'operatorname',\n DOT: 'dot',\n NONE: 'none',\n };\n\n Object.keys(OpStr).forEach((v) => {\n Model[v] = OpStr[v];\n });\n\n const OpToLaTeX = {};\n OpToLaTeX[OpStr.ADD] = '+';\n OpToLaTeX[OpStr.SUB] = '-';\n OpToLaTeX[OpStr.MUL] = '\\\\times';\n OpToLaTeX[OpStr.TIMES] = '\\\\times';\n OpToLaTeX[OpStr.DIV] = '\\\\div';\n OpToLaTeX[OpStr.FRAC] = '\\\\frac';\n OpToLaTeX[OpStr.EQL] = '=';\n OpToLaTeX[OpStr.ATAN2] = '\\\\atan2';\n OpToLaTeX[OpStr.POW] = '^';\n OpToLaTeX[OpStr.SUBSCRIPT] = '_';\n OpToLaTeX[OpStr.PM] = '\\\\pm';\n OpToLaTeX[OpStr.NOT] = '\\\\not';\n OpToLaTeX[OpStr.SIN] = '\\\\sin';\n OpToLaTeX[OpStr.COS] = '\\\\cos';\n OpToLaTeX[OpStr.TAN] = '\\\\tan';\n OpToLaTeX[OpStr.SEC] = '\\\\sec';\n OpToLaTeX[OpStr.COT] = '\\\\cot';\n OpToLaTeX[OpStr.CSC] = '\\\\csc';\n OpToLaTeX[OpStr.ARCSIN] = '\\\\arcsin';\n OpToLaTeX[OpStr.ARCCOS] = '\\\\arccos';\n OpToLaTeX[OpStr.ARCTAN] = '\\\\arctan';\n OpToLaTeX[OpStr.ARCSEC] = '\\\\arcsec';\n OpToLaTeX[OpStr.ARCCOT] = '\\\\arccot';\n OpToLaTeX[OpStr.ARCCSC] = '\\\\arccsc';\n OpToLaTeX[OpStr.SEC] = '\\\\sec';\n OpToLaTeX[OpStr.COT] = '\\\\cot';\n OpToLaTeX[OpStr.CSC] = '\\\\csc';\n OpToLaTeX[OpStr.SINH] = '\\\\sinh';\n OpToLaTeX[OpStr.COSH] = '\\\\cosh';\n OpToLaTeX[OpStr.TANH] = '\\\\tanh';\n OpToLaTeX[OpStr.ARCSINH] = '\\\\arcsinh';\n OpToLaTeX[OpStr.ARCCOSH] = '\\\\arccosh';\n OpToLaTeX[OpStr.ARCTANH] = '\\\\arctanh';\n OpToLaTeX[OpStr.ARCSECH] = '\\\\arcsech';\n OpToLaTeX[OpStr.ARCCSCH] = '\\\\arccsch';\n OpToLaTeX[OpStr.ARCCOTH] = '\\\\arccoth';\n OpToLaTeX[OpStr.SECH] = '\\\\sech';\n OpToLaTeX[OpStr.COTH] = '\\\\coth';\n OpToLaTeX[OpStr.CSCH] = '\\\\csch';\n OpToLaTeX[OpStr.LN] = '\\\\ln';\n OpToLaTeX[OpStr.COMMA] = ',';\n OpToLaTeX[OpStr.M] = '\\\\M';\n OpToLaTeX[OpStr.BINOM] = '\\\\binom';\n OpToLaTeX[OpStr.COLON] = '\\\\colon';\n OpToLaTeX[OpStr.INT] = '\\\\int';\n\n Model.fold = function fold(node, env) {\n const args = [];\n let val;\n node.args.forEach((n) => {\n args.push(fold(n, env));\n });\n node.args = args;\n switch (node.op) {\n case OpStr.VAR:\n if ((val = env[node.args[0]])) {\n node = val; // Replace var node with its value.\n }\n break;\n default:\n // Nothing to fold.\n break;\n }\n return node;\n };\n\n function isControlCharCode(c) {\n return (\n c >= 0x0001 && c <= 0x001F && c !== 0x0009 ||\n c >= 0x007F && c <= 0x009F\n );\n }\n function isListBreakToken(tk) {\n return (\n tk === TK_RIGHTPAREN ||\n tk === TK_RIGHTBRACE ||\n tk === TK_RIGHTBRACKET ||\n tk === TK_RANGLE ||\n tk === TK_NEWROW ||\n tk === TK_NEWCOL ||\n tk === TK_END ||\n tk === TK_NONE\n );\n }\n function stripInvisible(src) {\n let out = '';\n let c; let lastCharCode;\n let curIndex = 0;\n while (curIndex < src.length) {\n while (curIndex < src.length && isInvisibleCharCode((c = src.charCodeAt(curIndex++)))) {\n if (lastCharCode === 32) {\n // Replace N invisible char with one space char.\n continue;\n }\n c = 9;\n lastCharCode = c;\n }\n if (c === 92) {\n // Backslash.\n out += String.fromCharCode(c);\n if (curIndex < src.length) {\n // Keep next character if not out of chars.\n c = src.charCodeAt(curIndex++);\n }\n }\n out += String.fromCharCode(c);\n }\n return out;\n }\n function isInvisibleCharCode(c) {\n return isControlCharCode(c);\n }\n function isWhitespaceCharCode(c) {\n return (\n c === 32 ||\n c === 9 ||\n c === 10 ||\n c === 13\n );\n }\n function isNumberCharCode(c) {\n return (\n c >= 48 && c <= 57\n );\n }\n // Render AST to LaTeX\n const render = function render(n) {\n let text = '';\n if (typeof n === 'string') {\n text = n;\n } else if (typeof n === 'number') {\n text = n;\n } else if (typeof n === 'object') {\n // Render sub-expressions.\n const args = [];\n n.args.forEach((arg) => {\n args.push(render(arg));\n });\n // Render operator.\n switch (n.op) {\n case OpStr.NUM:\n case OpStr.VAR:\n text = `${n.args[0]}`;\n break;\n case OpStr.TEXT:\n text = `\\\\text{${args[0]}}`;\n break;\n case OpStr.SUBSCRIPT:\n args.reverse().forEach((arg, index) => {\n if (index === args.length - 1) {\n text = `${arg}${text}`;\n } else {\n text = `${OpToLaTeX[n.op]}{${arg}${text}}`;\n }\n });\n break;\n case OpStr.SUB:\n if (n.args.length === 1) {\n text = `${OpToLaTeX[n.op]}${args[0]}`;\n } else {\n text = `${args[0]} ${OpToLaTeX[n.op]} ${args[1]}`;\n }\n break;\n case OpStr.DIV:\n case OpStr.PM:\n case OpStr.EQL:\n text = `${args[0]} ${OpToLaTeX[n.op]} ${args[1]}`;\n break;\n case OpStr.POW: {\n // If subexpr is lower precedence, wrap in parens.\n const lhs = n.args[0];\n const rhs = n.args[1];\n if ((lhs.args && lhs.args.length === 2) || (rhs.args && rhs.args.length === 2)) {\n if (lhs.op === OpStr.ADD || lhs.op === OpStr.SUB ||\n lhs.op === OpStr.MUL || lhs.op === OpStr.DIV ||\n lhs.op === OpStr.SQRT) {\n args[0] = ` (${args[0]}) `;\n }\n }\n text = `{${args[0]}^{${args[1]}}}`;\n break;\n }\n case OpStr.SIN:\n case OpStr.COS:\n case OpStr.TAN:\n case OpStr.ARCSIN:\n case OpStr.ARCCOS:\n case OpStr.ARCTAN:\n case OpStr.ARCSEC:\n case OpStr.ARCCSC:\n case OpStr.ARCCOT:\n case OpStr.SEC:\n case OpStr.COT:\n case OpStr.CSC:\n case OpStr.SINH:\n case OpStr.COSH:\n case OpStr.TANH:\n case OpStr.ARCSINH:\n case OpStr.ARCCOSH:\n case OpStr.ARCTANH:\n case OpStr.ARCSECH:\n case OpStr.ARCCSCH:\n case OpStr.ARCCOTH:\n case OpStr.SECH:\n case OpStr.COTH:\n case OpStr.CSCH:\n case OpStr.LN:\n case OpStr.M:\n text = `{${OpToLaTeX[n.op]}{${args[0]}}}`;\n break;\n case OpStr.FRAC:\n text = `\\\\frac{${args[0]}}{${args[1]}}`;\n break;\n case OpStr.BINOM:\n text = `\\\\binom{${args[0]}}{${args[1]}}`;\n break;\n case OpStr.SQRT:\n switch (args.length) {\n case 1:\n text = `\\\\sqrt{${args[0]}}`;\n break;\n case 2:\n text = `\\\\sqrt[${args[0]}]{${args[1]}}`;\n break;\n default:\n break;\n }\n break;\n case OpStr.INTEGRAL:\n if (args.length === 4) {\n text = `\\\\int_{${args[0]}}^{${args[1]}} ${args[2]} d${args[3]}`;\n } else {\n text = `\\\\int ${args[0]} d${args[1]}`;\n }\n break;\n case OpStr.VEC:\n text = `\\\\vec{${args[0]}}`;\n break;\n case OpStr.MUL: {\n // If subexpr is lower precedence, wrap in parens.\n let prevTerm;\n text = '';\n n.args.forEach((term, index) => {\n if (term.args && (term.args.length >= 2)) {\n if (term.op === OpStr.ADD || term.op === OpStr.SUB) {\n args[index] = `(${args[index]})`;\n }\n if (index !== 0 && typeof term === 'number') {\n text += `${OpToLaTeX[n.op]} `;\n } else if (n.isMixedNumber) {\n // Do nothing. Implicit plus.\n } else if (n.isScientific) {\n text += '\\\\times ';\n }\n text += args[index];\n } else if (term.op === OpStr.PAREN ||\n term.op === OpStr.VAR ||\n typeof prevTerm === 'number' && typeof term !== 'number') {\n // Elide the times symbol if rhs is parenthesized or a var, or lhs is a number\n // nd rhs is not a number.\n text += args[index];\n } else {\n if (index !== 0) {\n text += ` ${OpToLaTeX[n.op]} `;\n }\n text += args[index];\n }\n prevTerm = term;\n });\n break;\n }\n case OpStr.TIMES:\n case OpStr.CDOT:\n case OpStr.ADD:\n case OpStr.COMMA:\n args.forEach((value, index) => {\n if (index === 0) {\n text = value;\n } else {\n text = `${text}${OpToLaTeX[n.op]} ${value}`;\n }\n });\n break;\n case OpStr.NONE:\n text = '';\n break;\n default:\n assert(false, `1000: Unimplemented operator translating to LaTeX: ${n.op}`);\n break;\n }\n } else {\n assert(false, '1000: Invalid expression type');\n }\n return text;\n };\n\n // Character defines.\n const CC_SPACE = 0x20;\n const CC_BANG = 0x21;\n const CC_DOLLAR = 0x24;\n const CC_PERCENT = 0x25;\n const CC_LEFTPAREN = 0x28;\n const CC_MUL = 0x2A;\n const CC_ADD = 0x2B;\n const CC_COMMA = 0x2C;\n const CC_SUB = 0x2D;\n const CC_RIGHTPAREN = 0x29;\n const CC_PERIOD = 0x2E;\n const CC_SLASH = 0x2F;\n const CC_NUM = 0x30;\n const CC_COLON = 0x3A;\n const CC_SEMICOLON = 0x3B;\n const CC_EQL = 0x3D;\n const CC_QMARK = 0x3F;\n const CC_CONST = 0x41;\n const CC_LEFTBRACKET = 0x5B;\n const CC_RIGHTBRACKET = 0x5D;\n const CC_CARET = 0x5E;\n const CC_UNDERSCORE = 0x5F;\n const CC_VAR = 0x61;\n const CC_LEFTBRACE = 0x7B;\n const CC_VERTICALBAR = 0x7C;\n const CC_RIGHTBRACE = 0x7D;\n const CC_SINGLEQUOTE = 0x27;\n\n // Token defines.\n const TK_NONE = 0;\n const TK_ADD = CC_ADD;\n const TK_CARET = CC_CARET;\n const TK_UNDERSCORE = CC_UNDERSCORE;\n const TK_PERIOD = CC_PERIOD;\n const TK_COS = 0x105;\n const TK_COT = 0x108;\n const TK_CSC = 0x109;\n const TK_FRAC = 0x100;\n const TK_SLASH = CC_SLASH;\n const TK_EQL = CC_EQL;\n const TK_LN = 0x107;\n const TK_LEFTBRACE = CC_LEFTBRACE;\n const TK_VERTICALBAR = CC_VERTICALBAR;\n const TK_LEFTBRACKET = CC_LEFTBRACKET;\n const TK_LEFTPAREN = CC_LEFTPAREN;\n const TK_MUL = CC_MUL;\n const TK_NUM = CC_NUM;\n const TK_PM = 0x102;\n const TK_RIGHTBRACE = CC_RIGHTBRACE;\n const TK_RIGHTBRACKET = CC_RIGHTBRACKET;\n const TK_RIGHTPAREN = CC_RIGHTPAREN;\n const TK_SEC = 0x106;\n const TK_SIN = 0x103;\n const TK_SQRT = 0x101;\n const TK_SUB = CC_SUB;\n const TK_TAN = 0x104;\n const TK_VAR = CC_VAR;\n const TK_CONST = CC_CONST;\n const TK_COMMA = CC_COMMA;\n const TK_PERCENT = CC_PERCENT;\n const TK_QMARK = CC_QMARK;\n const TK_BANG = CC_BANG;\n const TK_COLON = CC_COLON;\n const TK_SEMICOLON = CC_SEMICOLON;\n const TK_LG = 0x10B;\n const TK_LOG = 0x10C;\n const TK_TEXT = 0x10D;\n const TK_LT = 0x10E;\n const TK_LE = 0x10F;\n const TK_GT = 0x110;\n const TK_GE = 0x111;\n const TK_EXISTS = 0x112;\n const TK_IN = 0x113;\n const TK_FORALL = 0x114;\n const TK_LIM = 0x115;\n const TK_EXP = 0x116;\n const TK_TO = 0x117;\n const TK_SUM = 0x118;\n const TK_INT = 0x119;\n const TK_PROD = 0x11A;\n const TK_M = 0x11B;\n const TK_RIGHTARROW = 0x11C;\n const TK_BINOM = 0x11D;\n const TK_NEWROW = 0x11E;\n const TK_NEWCOL = 0x11F;\n const TK_BEGIN = 0x120;\n const TK_END = 0x121;\n const TK_VEC = 0x122;\n const TK_ARCSIN = 0x123;\n const TK_ARCCOS = 0x124;\n const TK_ARCTAN = 0x125;\n const TK_DIV = 0x126;\n const TK_TYPE = 0x127;\n const TK_OVERLINE = 0x128;\n const TK_OVERSET = 0x129;\n const TK_UNDERSET = 0x12A;\n const TK_BACKSLASH = 0x12B;\n const TK_MATHBF = 0x12C;\n const TK_NE = 0x12D;\n const TK_APPROX = 0x12E;\n const TK_ABS = 0x12F;\n const TK_CDOT = 0x130;\n const TK_NGTR = 0x131;\n const TK_NLESS = 0x132;\n const TK_SINH = 0x133;\n const TK_COSH = 0x134;\n const TK_TANH = 0x135;\n const TK_SECH = 0x136;\n const TK_COTH = 0x137;\n const TK_CSCH = 0x138;\n const TK_ARCSINH = 0x139;\n const TK_ARCCOSH = 0x13A;\n const TK_ARCTANH = 0x13B;\n const TK_FORMAT = 0x14C;\n const TK_NI = 0x14D;\n const TK_ARCSECH = 0x14E;\n const TK_ARCCSCH = 0x14F;\n const TK_ARCCOTH = 0x150;\n const TK_ARCSEC = 0x151;\n const TK_ARCCSC = 0x152;\n const TK_ARCCOT = 0x153;\n const TK_MATHFIELD = 0x154;\n const TK_CUP = 0x155;\n const TK_BIGCUP = 0x156;\n const TK_CAP = 0x157;\n const TK_BIGCAP = 0x158;\n const TK_PERP = 0x159;\n const TK_PROPTO = 0x15A;\n const TK_SUBSETEQ = 0x15B;\n const TK_SUPSETEQ = 0x15C;\n const TK_SUBSET = 0x15D;\n const TK_SUPSET = 0x15E;\n const TK_NOT = 0x15F;\n const TK_PARALLEL = 0x160;\n const TK_NPARALLEL = 0x161;\n const TK_SIM = 0x162;\n const TK_CONG = 0x163;\n const TK_LEFTARROW = 0x164;\n const TK_LONGRIGHTARROW = 0x165;\n const TK_LONGLEFTARROW = 0x166;\n const TK_OVERRIGHTARROW = 0x167;\n const TK_OVERLEFTARROW = 0x168;\n const TK_LONGLEFTRIGHTARROW = 0x169;\n const TK_OVERLEFTRIGHTARROW = 0x16A;\n const TK_IMPLIES = 0x16B;\n const TK_LEFTRIGHTARROW = 0x16C;\n const TK_CAPLEFTRIGHTARROW = 0x16D;\n const TK_CAPRIGHTARROW = 0x16E;\n const TK_DELTA = 0x16F;\n const TK_OPERATORNAME = 0x170;\n const TK_LEFTCMD = 0x171;\n const TK_RIGHTCMD = 0x172;\n const TK_LEFTBRACESET = 0x173;\n const TK_RIGHTBRACESET = 0x174;\n const TK_TIMES = 0x175;\n const TK_INFTY = 0x176;\n const TK_LANGLE = 0x177;\n const TK_RANGLE = 0x178;\n const TK_DOT = 0x179;\n const TK_IINT = 0x17A;\n const TK_IIINT = 0x17B;\n\n // Define mapping from token to operator\n const tokenToOperator = {};\n tokenToOperator[TK_SLASH] = OpStr.FRAC;\n tokenToOperator[TK_FRAC] = OpStr.FRAC;\n tokenToOperator[TK_SQRT] = OpStr.SQRT;\n tokenToOperator[TK_VEC] = OpStr.VEC;\n tokenToOperator[TK_ADD] = OpStr.ADD;\n tokenToOperator[TK_SUB] = OpStr.SUB;\n tokenToOperator[TK_PM] = OpStr.PM;\n tokenToOperator[TK_NOT] = OpStr.NOT;\n tokenToOperator[TK_CARET] = OpStr.POW;\n tokenToOperator[TK_UNDERSCORE] = OpStr.SUBSCRIPT;\n tokenToOperator[TK_MUL] = OpStr.MUL;\n tokenToOperator[TK_CDOT] = OpStr.CDOT;\n tokenToOperator[TK_TIMES] = OpStr.TIMES;\n tokenToOperator[TK_DIV] = OpStr.DIV;\n tokenToOperator[TK_SIN] = OpStr.SIN;\n tokenToOperator[TK_COS] = OpStr.COS;\n tokenToOperator[TK_TAN] = OpStr.TAN;\n tokenToOperator[TK_ARCSIN] = OpStr.ARCSIN;\n tokenToOperator[TK_ARCCOS] = OpStr.ARCCOS;\n tokenToOperator[TK_ARCTAN] = OpStr.ARCTAN;\n tokenToOperator[TK_ARCSEC] = OpStr.ARCSEC;\n tokenToOperator[TK_ARCCSC] = OpStr.ARCCSC;\n tokenToOperator[TK_ARCCOT] = OpStr.ARCCOT;\n tokenToOperator[TK_SEC] = OpStr.SEC;\n tokenToOperator[TK_COT] = OpStr.COT;\n tokenToOperator[TK_CSC] = OpStr.CSC;\n tokenToOperator[TK_SINH] = OpStr.SINH;\n tokenToOperator[TK_COSH] = OpStr.COSH;\n tokenToOperator[TK_TANH] = OpStr.TANH;\n tokenToOperator[TK_ARCSINH] = OpStr.ARCSINH;\n tokenToOperator[TK_ARCCOSH] = OpStr.ARCCOSH;\n tokenToOperator[TK_ARCTANH] = OpStr.ARCTANH;\n tokenToOperator[TK_ARCSECH] = OpStr.ARCSECH;\n tokenToOperator[TK_ARCCSCH] = OpStr.ARCCSCH;\n tokenToOperator[TK_ARCCOTH] = OpStr.ARCCOTH;\n tokenToOperator[TK_SECH] = OpStr.SECH;\n tokenToOperator[TK_COTH] = OpStr.COTH;\n tokenToOperator[TK_CSCH] = OpStr.CSCH;\n tokenToOperator[TK_LN] = OpStr.LN;\n tokenToOperator[TK_LG] = OpStr.LG;\n tokenToOperator[TK_LOG] = OpStr.LOG;\n tokenToOperator[TK_EQL] = OpStr.EQL;\n tokenToOperator[TK_COMMA] = OpStr.COMMA;\n tokenToOperator[TK_TEXT] = OpStr.TEXT;\n tokenToOperator[TK_OPERATORNAME] = OpStr.OPERATORNAME;\n tokenToOperator[TK_LT] = OpStr.LT;\n tokenToOperator[TK_LE] = OpStr.LE;\n tokenToOperator[TK_GT] = OpStr.GT;\n tokenToOperator[TK_GE] = OpStr.GE;\n tokenToOperator[TK_NE] = OpStr.NE;\n tokenToOperator[TK_NGTR] = OpStr.NGTR;\n tokenToOperator[TK_NLESS] = OpStr.NLESS;\n tokenToOperator[TK_NI] = OpStr.NI;\n tokenToOperator[TK_SUBSETEQ] = OpStr.SUBSETEQ;\n tokenToOperator[TK_SUPSETEQ] = OpStr.SUPSETEQ;\n tokenToOperator[TK_SUBSET] = OpStr.SUBSET;\n tokenToOperator[TK_SUPSET] = OpStr.SUPSET;\n tokenToOperator[TK_APPROX] = OpStr.APPROX;\n tokenToOperator[TK_PERP] = OpStr.PERP;\n tokenToOperator[TK_PROPTO] = OpStr.PROPTO;\n tokenToOperator[TK_PARALLEL] = OpStr.PARALLEL;\n tokenToOperator[TK_NPARALLEL] = OpStr.NPARALLEL;\n tokenToOperator[TK_SIM] = OpStr.SIM;\n tokenToOperator[TK_CONG] = OpStr.CONG;\n tokenToOperator[TK_EXISTS] = OpStr.EXISTS;\n tokenToOperator[TK_IN] = OpStr.IN;\n tokenToOperator[TK_FORALL] = OpStr.FORALL;\n tokenToOperator[TK_LIM] = OpStr.LIM;\n tokenToOperator[TK_EXP] = OpStr.EXP;\n tokenToOperator[TK_TO] = OpStr.TO;\n tokenToOperator[TK_VERTICALBAR] = OpStr.PIPE;\n tokenToOperator[TK_SUM] = OpStr.SUM;\n tokenToOperator[TK_INT] = OpStr.INTEGRAL;\n tokenToOperator[TK_PROD] = OpStr.PROD;\n tokenToOperator[TK_CUP] = OpStr.CUP;\n tokenToOperator[TK_BIGCUP] = OpStr.BIGCUP;\n tokenToOperator[TK_CAP] = OpStr.CAP;\n tokenToOperator[TK_BIGCAP] = OpStr.BIGCAP;\n tokenToOperator[TK_M] = OpStr.M;\n tokenToOperator[TK_IMPLIES] = OpStr.IMPLIES;\n tokenToOperator[TK_CAPRIGHTARROW] = OpStr.CAPRIGHTARROW;\n tokenToOperator[TK_RIGHTARROW] = OpStr.RIGHTARROW;\n tokenToOperator[TK_LEFTARROW] = OpStr.LEFTARROW;\n tokenToOperator[TK_LONGRIGHTARROW] = OpStr.LONGRIGHTARROW;\n tokenToOperator[TK_LONGLEFTARROW] = OpStr.LONGLEFTARROW;\n tokenToOperator[TK_OVERRIGHTARROW] = OpStr.OVERRIGHTARROW;\n tokenToOperator[TK_OVERLEFTARROW] = OpStr.OVERLEFTARROW;\n tokenToOperator[TK_LEFTRIGHTARROW] = OpStr.LEFTRIGHTARROW;\n tokenToOperator[TK_CAPLEFTRIGHTARROW] = OpStr.CAPLEFTRIGHTARROW;\n tokenToOperator[TK_LONGLEFTRIGHTARROW] = OpStr.LONGLEFTRIGHTARROW;\n tokenToOperator[TK_OVERLEFTRIGHTARROW] = OpStr.OVERLEFTRIGHTARROW;\n\n tokenToOperator[TK_BANG] = OpStr.FACT;\n tokenToOperator[TK_BINOM] = OpStr.BINOM;\n tokenToOperator[TK_NEWROW] = OpStr.ROW;\n tokenToOperator[TK_NEWCOL] = OpStr.COL;\n tokenToOperator[TK_COLON] = OpStr.COLON;\n tokenToOperator[TK_SEMICOLON] = OpStr.SEMICOLON;\n tokenToOperator[TK_TYPE] = OpStr.TYPE;\n tokenToOperator[TK_OVERLINE] = OpStr.OVERLINE;\n tokenToOperator[TK_DOT] = OpStr.DOT;\n tokenToOperator[TK_OVERSET] = OpStr.OVERSET;\n tokenToOperator[TK_UNDERSET] = OpStr.UNDERSET;\n tokenToOperator[TK_BACKSLASH] = OpStr.BACKSLASH;\n tokenToOperator[TK_MATHBF] = OpStr.MATHBF;\n tokenToOperator[TK_MATHFIELD] = OpStr.MATHFIELD;\n tokenToOperator[TK_DELTA] = OpStr.DELTA;\n\n function newNode(op, args) {\n return {\n op,\n args,\n };\n }\n\n const nodeEmpty = newNode(Model.NONE, [newNode(Model.VAR, ['None'])]);\n\n const parse = function parse(options, src, env) {\n const identifiers = Object.keys(env);\n // Add keywords to the list of identifiers.\n identifiers.push('to');\n src = stripInvisible(src);\n function matchThousandsSeparator(ch, lastSeparator) {\n // Check separator and return if there is a match.\n let match = '';\n if (Model.option(options, 'allowThousandsSeparator') ||\n Model.option(options, 'setThousandsSeparator')) {\n let separators = Model.option(options, 'setThousandsSeparator');\n separators = [].concat(separators !== undefined ? separators : ',');\n // If the character matches the last separator or, if not, last is undefined\n // and character is in the provided list, return the character.\n if (separators.indexOf(ch) >= 0) {\n assert(!lastSeparator || ch === lastSeparator, message(1013, [lastSeparator, ch]));\n match = ch;\n }\n }\n return match;\n }\n\n function matchDecimalSeparator(ch) {\n // We use the thousands separator to determine the conventional decimal\n // separator. If TS is ',' then DS is '.', otherwise DS is ','.\n const decimalSeparator = Model.option(options, 'setDecimalSeparator');\n const thousandsSeparators = Model.option(options, 'setThousandsSeparator');\n if (typeof decimalSeparator === 'string') {\n // Single separator.\n assert(decimalSeparator.length === 1, message(1002));\n const separator = decimalSeparator;\n if (thousandsSeparators instanceof Array &&\n thousandsSeparators.indexOf(separator) >= 0) {\n // There is a conflict between the decimal separator and the\n // thousands separator.\n assert(false, message(1008, [separator]));\n }\n return ch === separator;\n }\n if (decimalSeparator instanceof Array) {\n // Multiple separators.\n decimalSeparator.forEach((separator) => {\n if (thousandsSeparators instanceof Array &&\n thousandsSeparators.indexOf(separator) >= 0) {\n // There is a conflict between the decimal separator and the\n // thousands separator.\n assert(false, message(1008, [separator]));\n }\n });\n return decimalSeparator.indexOf(ch) >= 0;\n }\n if (thousandsSeparators instanceof Array && thousandsSeparators.indexOf('.') >= 0 || thousandsSeparators === '.') {\n // Period is used as a thousands separator, so cannot be used as a\n // decimal separator.\n assert(decimalSeparator === undefined, message(1008, ['.']));\n return ch === ',';\n }\n // Otherwise, period is used as the decimal separator.\n return ch === '.';\n }\n\n const nodePositiveInfinity = newNode(Model.NUM, ['Infinity']);\n // Construct a number node.\n function numberNode(options, n0, doScale, roundOnly) {\n if (n0 === '\\\\infty') {\n return nodePositiveInfinity;\n }\n // doScale - scale n if true\n // roundOnly - only scale if rounding\n let n2 = '';\n let i; let\nch;\n let lastSeparatorIndex;\n let separatorCount = 0;\n let numberFormat = 'integer';\n if (n0 === '.') {\n assert(false, message(1004, [n0, n0.charCodeAt(0)]));\n }\n for (i = 0; i < n0.length; i++) {\n if (matchThousandsSeparator(ch = n0.charAt(i))) {\n if (separatorCount && lastSeparatorIndex !== i - 4 ||\n !separatorCount && i > 4) {\n assert(false, message(1005));\n }\n lastSeparatorIndex = i;\n separatorCount++;\n // We erase separators so 1,000 and 1000 are equivLiteral.\n } else {\n if (matchDecimalSeparator(ch)) {\n if (numberFormat === 'decimal') {\n assert(false, message(1007, [ch, n2 + ch]));\n }\n ch = '.'; // Convert to character the decimal agrees with.\n numberFormat = 'decimal';\n if (separatorCount && lastSeparatorIndex !== i - 4) {\n assert(false, message(1005));\n }\n lastSeparatorIndex = i; // Used for thousandths separators.\n separatorCount++;\n }\n n2 += ch;\n }\n }\n if (numberFormat !== 'decimal' && lastSeparatorIndex && lastSeparatorIndex !== i - 4) {\n // If we haven't seen a decimal separator, then make sure the last thousands\n // separator is in the right place.\n assert(false, message(1005));\n }\n if (doScale) {\n const scale = Model.option(options, 'decimalPlaces');\n if (!roundOnly || n2.scale() > scale) {\n n2 = n2.setScale(scale, Decimal.ROUND_HALF_UP);\n n2 = String(n2);\n }\n } else {\n n2 = String(n2);\n }\n const arg = Model.option(options, 'strict') && n0 || n2;\n return {\n op: Model.NUM,\n args: [arg],\n separatorCount,\n lastSeparatorIndex,\n numberFormat,\n };\n }\n function multiplyNode(args, flatten) {\n if (args.length === 0) {\n // We have simplified away all factors.\n args = [nodeOne];\n }\n return binaryNode(Model.MUL, args, flatten);\n }\n function unaryNode(op, args) {\n assert(args.length === 1, '1000: Wrong number of arguments for unary node');\n return newNode(op, args);\n }\n function binaryNode(op, args, flatten) {\n assert(args.length > 0, '1000: Too few argument for binary node');\n if (args.length < 2) {\n return args[0];\n }\n let aa = [];\n args.forEach((n) => {\n if (flatten && n.op === op && n.args.length > 1) {\n // Flatten binary nodes of the same operator, not unaries.\n aa = aa.concat(n.args);\n } else {\n aa.push(n);\n }\n });\n return newNode(op, aa);\n }\n\n const nodeOne = numberNode(options, '1');\n const nodeMinusOne = numberNode(options, '-1');\n\n //\n // PARSER\n //\n // Manage the token stream.\n let T0 = TK_NONE;\n let T1 = TK_NONE;\n let lexemeT0;\n let lexemeT1;\n const scan = scanner(src);\n\n function initParser(options) {\n // Prime the token stream.\n T0 = scan.start(options);\n lexemeT0 = scan.lexeme();\n }\n\n function hd() {\n // Get the current token.\n return T0;\n }\n\n function lexeme() {\n // Get the current lexeme.\n assert(lexemeT0 !== undefined, `1000: Lexeme for token T0=${T0} is missing.`);\n return lexemeT0;\n }\n\n // Advance the next token.\n function next(options) {\n if (T1 === TK_NONE) {\n T0 = scan.start(options);\n lexemeT0 = scan.lexeme();\n } else {\n assert(lexemeT1 !== undefined, `1000: Lexeme for token=${T1} is missing.`);\n T0 = T1;\n lexemeT0 = lexemeT1;\n T1 = TK_NONE;\n }\n }\n function lookahead(options) {\n if (T1 === TK_NONE) {\n T1 = scan.start(options);\n lexemeT1 = scan.lexeme();\n }\n return T1;\n }\n\n function eat(tc, options) {\n // Consume the current token if it matches, otherwise throw.\n const tk = hd();\n if (tk !== tc) {\n const expected = String.fromCharCode(tc);\n const found = tk ? String.fromCharCode(tk) : 'EOS';\n assert(false, message(1001, [`${expected}[${tc}]`, `${found}[${tk}]`]));\n }\n next(options);\n }\n // Begin parsing functions.\n function isSimpleFraction(node) {\n if (node.op === Model.FRAC &&\n (node.args[0].op === Model.NUM || node.args[1].op === Model.NUM)) {\n const n0 =\n (node.args[0].op === Model.SUB || node.args[0].op === Model.ADD) &&\n node.args[0].args.length === 1 && node.args[0].args[0] ||\n node.args[0];\n const n1 =\n (node.args[1].op === Model.SUB || node.args[1].op === Model.ADD) &&\n node.args[1].args.length === 1 && node.args[1].args[0] ||\n node.args[1];\n return (\n n0.op === Model.NUM && n0.numberFormat === 'integer' &&\n n1.op === Model.NUM && n1.numberFormat === 'integer' &&\n +n1.args[0] !== 0\n );\n }\n return false;\n }\n function isProperFraction(node) {\n if (node.op === Model.FRAC) {\n const n0 = node.args[0];\n const n1 = node.args[1];\n return (\n n0.op === Model.NUM && n0.numberFormat === 'integer' &&\n n1.op === Model.NUM && n1.numberFormat === 'integer' &&\n +n0.args[0] < n1.args[0]\n );\n }\n return false;\n }\n const degreeUnits = ['K', 'C', 'F'];\n const muUnits = ['g', 'L', 'm', 's'];\n function primaryExpr() {\n let t; let node; let tk; let op; let base; let args = [];\n let expr; let expr1; let expr2; let foundDX;\n switch ((tk = hd())) {\n case TK_CONST:\n case TK_VAR:\n args = [lexeme()];\n next();\n if (hd() === TK_NUM) {\n const ident = args[0].toUpperCase() + lexeme();\n // Check if is a name in the environment.\n const match = identifiers.some((u) => {\n return u.indexOf(ident) === 0;\n });\n node = newNode(Model.VAR, args);\n if (match) {\n // We have a name in the environment, so bind more tightly than the\n // context.\n node = multiplyNode([node, numberNode(options, lexeme())]);\n next();\n }\n } else {\n if (args[0] === '\\\\emptyset') {\n args[0] = '\\\\varnothing';\n } else if (args[0] === '\\\\mu' && hd() === TK_TEXT && muUnits.includes(lexeme())) {\n args[0] = `\\\\mu${lexeme()}`;\n next();\n } else if (args[0] === '\\\\degree' && hd() === TK_TEXT && degreeUnits.includes(lexeme())) {\n args[0] = `\\\\degree ${lexeme()}`;\n next();\n }\n node = newNode(Model.VAR, args);\n if (isChemCore()) {\n if (hd() === TK_LEFTBRACE && lookahead() === TK_RIGHTBRACE) {\n // C_2{}^3 -> C_2^3\n eat(TK_LEFTBRACE);\n eat(TK_RIGHTBRACE);\n }\n }\n }\n break;\n case TK_TEXT:\n args = [lexeme()];\n next();\n node = newNode(Model.TEXT, [newNode(Model.VAR, args)]);\n break;\n case TK_NUM:\n node = numberNode(options, lexeme());\n next();\n break;\n case TK_LEFTCMD: // \\left .. \\right\n if (lookahead() === TK_LEFTBRACE) {\n node = braceExpr(tk);\n } else if (lookahead() === TK_LEFTBRACESET) {\n node = braceExpr(tk);\n } else if (lookahead() === TK_VERTICALBAR) {\n node = absExpr(tk);\n } else {\n node = parenExpr(tk);\n }\n break;\n case TK_TYPE:\n node = newNode(Model.TYPE, [newNode(Model.VAR, [lexeme()])]);\n next();\n break;\n case TK_LEFTBRACKET:\n case TK_LEFTPAREN:\n case TK_LANGLE:\n node = parenExpr(tk);\n break;\n case TK_RIGHTBRACKET:\n if (!inParenExpr) {\n // French style intervals: ][, ]].\n node = parenExpr(tk);\n } else {\n node = nodeEmpty;\n }\n break;\n case TK_LEFTBRACE:\n case TK_LEFTBRACESET:\n node = braceExpr(tk);\n break;\n case TK_BEGIN: {\n next();\n const figure = braceExpr();\n if (figure.op === Model.VAR) {\n if (figure.args[0].indexOf('array') === 0) {\n if (hd() === TK_LEFTBRACE) {\n while (hd() !== TK_RIGHTBRACE) {\n next(); // Eat column alignment header.\n }\n next();\n }\n } else if (figure.args[0].indexOf('matrix') >= 0) {\n if (hd() === TK_LEFTBRACKET) {\n while (hd() !== TK_RIGHTBRACKET) {\n next(); // Eat column alignment header.\n }\n next();\n }\n }\n }\n const tbl = matrixExpr();\n eat(TK_END);\n braceExpr();\n if (figure.op === Model.VAR) {\n if (figure.args[0].indexOf('matrix') >= 0 || figure.args[0].indexOf('array') === 0) {\n node = newNode(Model.MATRIX, [tbl]);\n } else {\n assert(false, '1000: Unrecognized LaTeX name');\n }\n }\n break;\n }\n case TK_VERTICALBAR:\n node = absExpr();\n break;\n case TK_ABS:\n next();\n node = unaryNode(Model.ABS, [braceExpr()]);\n break;\n case TK_FRAC:\n next();\n expr1 = braceExpr();\n expr2 = braceExpr();\n expr1 = expr1.args.length === 0 ? newNode(Model.COMMA, [nodeEmpty]) : expr1;\n expr2 = expr1.args.length === 0 ? newNode(Model.COMMA, [nodeEmpty]) : expr2;\n node = newNode(Model.FRAC, [expr1, expr2]);\n node.isFraction = isSimpleFraction(node);\n break;\n case TK_BINOM: {\n next();\n const n = braceExpr();\n const k = braceExpr();\n node = binaryNode(Model.BINOM, [n, k]);\n break;\n }\n case TK_SQRT:\n next();\n switch (hd()) {\n case TK_LEFTBRACKET: {\n const root = bracketExpr();\n const base = braceExpr();\n node = newNode(Model.SQRT, [base, root]);\n break;\n }\n case TK_LEFTBRACE:\n base = braceExpr();\n node = newNode(Model.SQRT, [base, newNode(Model.NUM, ['2'])]);\n break;\n default:\n assert(false, message(1001, ['{ or (', String.fromCharCode(hd())]));\n break;\n }\n break;\n case TK_VEC:\n next();\n node = newNode(Model.VEC, [braceExpr()]);\n break;\n case TK_OPERATORNAME: {\n const lex = lexeme();\n next();\n node = newNode(Model.OPERATORNAME, [newNode(Model.VAR, [lex]), primaryExpr()]);\n break;\n }\n case TK_SIN:\n case TK_COS:\n case TK_TAN:\n case TK_SEC:\n case TK_COT:\n case TK_CSC:\n case TK_SINH:\n case TK_COSH:\n case TK_TANH:\n case TK_SECH:\n case TK_COTH:\n case TK_CSCH:\n next();\n // Collect exponents if there are any\n while (hd() === TK_CARET) {\n next({ oneCharToken: true });\n args.push(unaryExpr());\n }\n if (args.length === 1 && isMinusOne(args[0])) {\n // Special case for sin^{-1} and friends.\n op = `arc${tokenToOperator[tk]}`;\n args.pop(); // Erase ^{-1}.\n } else {\n op = tokenToOperator[tk];\n }\n if ((t = hd()) === TK_LEFTCMD) {\n if (lookahead() === TK_LEFTBRACE || lookahead() === TK_LEFTBRACESET) {\n node = braceExpr(t);\n } else if (lookahead() === TK_VERTICALBAR) {\n node = absExpr(t);\n } else {\n node = parenExpr(t);\n }\n args.unshift(newNode(op, [node]));\n } else if ((t = hd()) === TK_LEFTBRACE || t === TK_LEFTBRACESET) {\n args.unshift(newNode(op, [braceExpr(t)]));\n } else if ((t = hd()) === TK_LEFTPAREN || t === TK_LEFTBRACKET) {\n args.unshift(newNode(op, [parenExpr(t)]));\n } else {\n expr = flattenNestedNodes(multiplicativeExpr(true));\n foundDX = hasDX(options, expr);\n expr = foundDX && stripDX(expr) || expr;\n args.unshift(newNode(op, [expr]));\n }\n if (args.length > 1) {\n node = newNode(Model.POW, args);\n } else {\n node = args[0];\n }\n if (foundDX) {\n node = multiplyNode([node, newNode(Model.VAR, ['d']), foundDX]);\n }\n return node;\n case TK_ARCSIN:\n case TK_ARCCOS:\n case TK_ARCTAN:\n case TK_ARCSEC:\n case TK_ARCCSC:\n case TK_ARCCOT:\n case TK_ARCSINH:\n case TK_ARCCOSH:\n case TK_ARCTANH:\n case TK_ARCSECH:\n case TK_ARCCSCH:\n case TK_ARCCOTH:\n next();\n // Collect exponents if there are any\n while ((t = hd()) === TK_CARET) {\n next({ oneCharToken: true });\n args.push(unaryExpr());\n }\n if ((t = hd()) === TK_LEFTCMD) {\n if (lookahead() === TK_LEFTBRACE || lookahead() === TK_LEFTBRACESET) {\n node = braceExpr(t);\n } else if (lookahead() === TK_VERTICALBAR) {\n node = absExpr(t);\n } else {\n node = parenExpr(t);\n }\n args.unshift(newNode(tokenToOperator[tk], [node]));\n } else if ((t = hd()) === TK_LEFTBRACE || t === TK_LEFTBRACESET) {\n args.unshift(newNode(tokenToOperator[tk], [braceExpr(t)]));\n } else if ((t = hd()) === TK_LEFTPAREN || t === TK_LEFTBRACKET) {\n args.unshift(newNode(tokenToOperator[tk], [parenExpr(t)]));\n } else if ((t = hd()) === TK_VERTICALBAR) {\n args.unshift(newNode(tokenToOperator[tk], [absExpr(t)]));\n } else {\n expr = flattenNestedNodes(multiplicativeExpr(true));\n foundDX = hasDX(options, expr);\n expr = foundDX && stripDX(expr) || expr;\n args.unshift(newNode(tokenToOperator[tk], [expr]));\n }\n if (args.length > 1) {\n node = newNode(Model.POW, args);\n } else {\n node = args[0];\n }\n if (foundDX) {\n node = multiplyNode([node, newNode(Model.VAR, ['d']), foundDX]);\n }\n return node;\n case TK_LN:\n next();\n if ((t = hd()) === TK_LEFTCMD) {\n if (lookahead() === TK_LEFTBRACE || lookahead() === TK_LEFTBRACESET) {\n node = braceExpr(t);\n } else if (lookahead() === TK_VERTICALBAR) {\n node = absExpr(t);\n } else {\n node = parenExpr(t);\n }\n args.push(node);\n } else if ((t = hd()) === TK_LEFTBRACE || t === TK_LEFTBRACESET) {\n args.push(braceExpr(t));\n } else if ((t = hd()) === TK_LEFTPAREN || t === TK_LEFTBRACKET) {\n args.push(parenExpr(t));\n } else if ((t = hd()) === TK_VERTICALBAR) {\n args.push(absExpr(t));\n } else {\n expr = flattenNestedNodes(multiplicativeExpr(true));\n foundDX = hasDX(options, expr);\n expr = foundDX && stripDX(expr) || expr;\n args.push(expr);\n }\n node = newNode(Model.LOG, [newNode(Model.VAR, ['e'])].concat(args));\n if (foundDX) {\n node = multiplyNode([node, newNode(Model.VAR, ['d']), foundDX]);\n }\n return node;\n case TK_LG:\n next();\n if ((t = hd()) === TK_LEFTCMD) {\n if (lookahead() === TK_LEFTBRACE || lookahead() === TK_LEFTBRACESET) {\n node = braceExpr(t);\n } else if (lookahead() === TK_VERTICALBAR) {\n node = absExpr(t);\n } else {\n node = parenExpr(t);\n }\n args.push(node);\n } else if ((t = hd()) === TK_LEFTBRACE || t === TK_LEFTBRACESET) {\n args.push(braceExpr(t));\n } else if ((t = hd()) === TK_LEFTPAREN || t === TK_LEFTBRACKET) {\n args.push(parenExpr(t));\n } else if ((t = hd()) === TK_VERTICALBAR) {\n args.push(absExpr(t));\n } else {\n expr = flattenNestedNodes(multiplicativeExpr(true));\n foundDX = hasDX(options, expr);\n expr = foundDX && stripDX(expr) || expr;\n args.push(expr);\n }\n node = newNode(Model.LOG, [newNode(Model.NUM, ['10'])].concat(args));\n if (foundDX) {\n node = multiplyNode([node, newNode(Model.VAR, ['d']), foundDX]);\n }\n return node;\n case TK_LOG:\n next();\n // Collect the subscript if there is one\n if ((t = hd()) === TK_UNDERSCORE) {\n next({ oneCharToken: true });\n args.push(primaryExpr());\n } else {\n args.push(newNode(Model.NUM, ['10'])); // Default to base 10.\n }\n if ((t = hd()) === TK_LEFTCMD) {\n if (lookahead() === TK_LEFTBRACE || lookahead() === TK_LEFTBRACESET) {\n node = braceExpr(t);\n } else if (lookahead() === TK_VERTICALBAR) {\n node = absExpr(t);\n } else {\n node = parenExpr(t);\n }\n args.push(node);\n } else if ((t = hd()) === TK_LEFTBRACE || t === TK_LEFTBRACESET) {\n args.push(braceExpr(t));\n } else if ((t = hd()) === TK_LEFTPAREN || t === TK_LEFTBRACKET) {\n args.push(parenExpr(t));\n } else if ((t = hd()) === TK_VERTICALBAR) {\n args.push(absExpr(t));\n } else {\n expr = flattenNestedNodes(multiplicativeExpr(true));\n foundDX = hasDX(options, expr);\n expr = foundDX && stripDX(expr) || expr;\n args.push(expr);\n }\n node = newNode(Model.LOG, args);\n if (foundDX) {\n node = multiplyNode([node, newNode(Model.VAR, ['d']), foundDX]);\n }\n return node;\n case TK_LIM:\n return limitExpr();\n case TK_INT:\n case TK_IINT:\n case TK_IIINT:\n return integralExpr();\n case TK_SUM:\n case TK_PROD:\n case TK_CUP:\n case TK_BIGCUP:\n case TK_CAP:\n case TK_BIGCAP:\n next();\n // Collect the subscript and expression.\n if (hd() === TK_UNDERSCORE) {\n next({ oneCharToken: true });\n args.push(primaryExpr());\n if (hd() === TK_CARET) {\n eat(TK_CARET, { oneCharToken: true });\n args.push(primaryExpr());\n }\n }\n args.push(multiplicativeExpr());\n return newNode(tokenToOperator[tk], args);\n case TK_EXISTS:\n next();\n return newNode(Model.EXISTS, [equalExpr()]);\n case TK_FORALL:\n case TK_CAPRIGHTARROW:\n case TK_RIGHTARROW:\n case TK_LEFTARROW:\n case TK_LONGRIGHTARROW:\n case TK_LONGLEFTARROW:\n case TK_OVERRIGHTARROW:\n case TK_OVERLEFTARROW:\n case TK_CAPLEFTRIGHTARROW:\n case TK_LEFTRIGHTARROW:\n case TK_LONGLEFTRIGHTARROW:\n case TK_OVERLEFTRIGHTARROW:\n next();\n return newNode(tokenToOperator[tk], [commaExpr()]);\n case TK_EXP:\n next();\n return newNode(Model.EXP, [additiveExpr()]);\n case TK_M:\n next();\n return newNode(Model.M, [multiplicativeExpr()]);\n case TK_FORMAT:\n next();\n return newNode(Model.FORMAT, [braceExpr()]);\n case TK_OVERLINE:\n next();\n return newNode(Model.OVERLINE, [braceExpr()]);\n case TK_DOT:\n // 0.\\dot{1}234\\dot{5}\n next();\n {\n let n; let\narg = '';\n n = braceExpr();\n assert(n.op === Model.NUM);\n arg += n.args[0];\n if (hd() === TK_NUM && lookahead() === TK_DOT) {\n n = primaryExpr();\n assert(n.op === Model.NUM);\n arg += n.args[0];\n }\n if (hd() === TK_DOT) {\n next();\n n = braceExpr();\n assert(n.op === Model.NUM);\n arg += n.args[0];\n }\n expr = newNode(Model.OVERLINE, [numberNode(options, arg)]);\n }\n return expr;\n case TK_MATHFIELD:\n next();\n return newNode(tokenToOperator[tk], [braceExpr()]);\n case TK_OVERSET:\n case TK_UNDERSET:\n next();\n expr1 = braceExpr();\n expr2 = braceExpr();\n // Add the annotation to the variable.\n expr2.args.push(newNode(tokenToOperator[tk], [expr1]));\n return expr2;\n case TK_MATHBF:\n // Erase this token.\n next();\n expr1 = braceExpr();\n return newNode(Model.MATHBF, [expr1]);\n case TK_QMARK:\n next();\n return newNode(Model.VAR, ['?']);\n case TK_DELTA: {\n next();\n let name;\n if (hd() === TK_VAR) {\n name = lexeme();\n next();\n } else {\n name = '';\n }\n return newNode(Model.VAR, [`Delta_${name}`]);\n }\n case TK_PERIOD:\n next();\n return nodeEmpty;\n default:\n assert(!Model.option(options, 'strict'), message(1006, [tk]));\n node = nodeEmpty;\n break;\n }\n return node;\n }\n // Parse '1 & 2 & 3 \\\\ a & b & c'\n function matrixExpr() {\n const args = [];\n args.push(rowExpr());\n while (hd() === TK_NEWROW) {\n next();\n args.push(rowExpr());\n }\n return newNode(tokenToOperator[TK_NEWROW], args);\n }\n // Parse '1 & 2 & 3'\n function rowExpr() {\n const args = [];\n args.push(commaExpr());\n while (hd() === TK_NEWCOL) {\n next();\n args.push(equalExpr());\n }\n return newNode(tokenToOperator[TK_NEWCOL], args);\n }\n // Parse '| expr |'\n let pipeTokenCount = 0;\n function absExpr(tk) {\n tk = tk || TK_VERTICALBAR;\n pipeTokenCount++;\n eat(tk);\n let tk1; let\ntk2;\n if (tk === TK_LEFTCMD) {\n eat((tk1 = hd())); // Capture left token.\n } else {\n tk1 = tk;\n }\n const e = additiveExpr();\n eat((tk2 = tk === TK_LEFTCMD && TK_RIGHTCMD || tk1));\n if (tk2 === TK_RIGHTCMD) {\n eat((tk2 = tk1)); // Capture right token.\n }\n pipeTokenCount--;\n return unaryNode(Model.ABS, [e]);\n }\n // Parse '{ expr }'\n function braceExpr(tk) {\n tk = tk || TK_LEFTBRACE;\n eat(tk);\n let tk1; let\ntk2;\n if (tk === TK_LEFTCMD) {\n eat((tk1 = hd() === TK_LEFTBRACESET && TK_LEFTBRACESET || TK_LEFTBRACE));\n } else {\n tk1 = tk;\n }\n let e;\n if (hd() === TK_RIGHTCMD || hd() === TK_RIGHTBRACE || hd() === TK_RIGHTBRACESET) {\n eat((tk2 = hd()));\n if (tk2 === TK_RIGHTCMD) {\n eat((tk2 = hd() === TK_PERIOD && TK_PERIOD ||\n hd() === TK_RIGHTBRACESET && TK_RIGHTBRACESET ||\n TK_RIGHTBRACE));\n }\n e = newNode(Model.COMMA, []);\n } else {\n e = commaExpr();\n eat((tk2 = tk === TK_LEFTCMD && TK_RIGHTCMD ||\n tk === TK_LEFTBRACESET && TK_RIGHTBRACESET ||\n TK_RIGHTBRACE));\n if (tk2 === TK_RIGHTCMD) {\n eat((tk2 = hd() === TK_PERIOD && TK_PERIOD ||\n hd() === TK_RIGHTBRACESET && TK_RIGHTBRACESET ||\n TK_RIGHTBRACE));\n }\n if (e.op === nodeEmpty.op && e.args[0] === nodeEmpty.args[0]) {\n // We've got empty braces.\n e = newNode(Model.COMMA, []);\n }\n }\n e.lbrk = tk1;\n e.rbrk = tk2;\n return e;\n }\n // Parse '[ expr ]'\n let bracketTokenCount = 0;\n function bracketExpr(tk) {\n tk = tk || TK_LEFTBRACKET;\n assert(tk === TK_LEFTCMD || tk === TK_LEFTBRACKET, '1000: Internal error');\n bracketTokenCount++;\n eat(tk);\n let tk2;\n if (tk === TK_LEFTCMD) {\n eat(TK_LEFTBRACKET); // Capture left token.\n }\n const e = commaExpr();\n eat((tk2 = tk === TK_LEFTCMD && TK_LEFTCMD || TK_RIGHTBRACKET));\n if (tk2 === TK_RIGHTCMD) {\n eat((tk2 = TK_RIGHTBRACKET)); // Capture right token.\n }\n bracketTokenCount--;\n return e;\n }\n // Parse '( expr )' and '( expr ]' and '[ expr )' and '[ expr ]'\n // '\\left . expr \\right |_3', '\\left( expr \\right)'\n let inParenExpr;\n function parenExpr(tk) {\n // Handle grouping and intervals.\n bracketTokenCount++;\n eat(tk);\n let tk1; let tk2; let\nleftCmdFound;\n if (tk === TK_LEFTCMD) {\n eat((tk1 = hd())); // Capture left token.\n leftCmdFound = true;\n } else {\n tk1 = tk;\n }\n let e;\n if (hd() === TK_RIGHTCMD || hd() === TK_RIGHTPAREN || hd() === TK_RIGHTBRACKET) {\n eat((tk2 = leftCmdFound && TK_RIGHTCMD || hd()));\n if (tk2 === TK_RIGHTCMD) {\n eat((tk2 =\n tk1 === TK_LEFTPAREN && TK_RIGHTPAREN ||\n tk1 === TK_LEFTBRACKET && TK_RIGHTBRACKET ||\n tk1 === TK_LANGLE && TK_RANGLE));\n }\n // We have an empty list.\n e = newNode(Model.COMMA, []);\n } else {\n inParenExpr = true;\n const allowSemicolon = true; // Allow semis if in an interval.\n e = commaExpr(allowSemicolon);\n // (..], [..], [..), (..), ]..], ]..[, [..[\n eat((tk2 =\n leftCmdFound && TK_RIGHTCMD ||\n hd() === TK_RIGHTPAREN && TK_RIGHTPAREN ||\n hd() === TK_RANGLE && TK_RANGLE ||\n tk === TK_LEFTCMD && TK_RIGHTCMD ||\n hd() === TK_LEFTBRACKET && TK_LEFTBRACKET ||\n TK_RIGHTBRACKET));\n if (tk2 === TK_RIGHTCMD) {\n eat((tk2 =\n hd() === TK_RIGHTPAREN && TK_RIGHTPAREN ||\n hd() === TK_RANGLE && TK_RANGLE ||\n hd() === TK_LEFTBRACKET && TK_LEFTBRACKET ||\n TK_RIGHTBRACKET)); // Capture right token.\n }\n }\n // Save the brackets as attributes on the node for later use. Normalize\n // French style brackets.\n tk1 = tk1 === TK_RIGHTBRACKET ? TK_LEFTPAREN : tk1;\n tk2 = tk2 === TK_LEFTBRACKET ? TK_RIGHTPAREN : tk2;\n // intervals: (1, 3), [1, 3], [1, 3), (1, 3]\n if ((tk1 === TK_LEFTPAREN || tk1 === TK_LEFTBRACKET || tk1 === TK_RIGHTBRACKET) &&\n (tk2 === TK_RIGHTPAREN || tk2 === TK_RIGHTBRACKET || tk2 === TK_LEFTBRACKET)) {\n const op = (\n e.op === Model.COMMA && e.args.length === 2 && (\n tk1 === TK_LEFTPAREN && tk2 === TK_RIGHTPAREN && Model.INTERVALOPEN ||\n tk1 === TK_LEFTBRACKET && tk2 === TK_RIGHTBRACKET && Model.INTERVAL\n )) ||\n tk1 === TK_LEFTPAREN && tk2 === TK_RIGHTPAREN && Model.PAREN ||\n tk1 === TK_LEFTBRACKET && tk2 === TK_RIGHTBRACKET && Model.BRACKET ||\n tk1 === TK_LEFTPAREN && tk2 === TK_RIGHTBRACKET && Model.INTERVALLEFTOPEN ||\n tk1 === TK_LEFTBRACKET && tk2 === TK_RIGHTPAREN && Model.INTERVALRIGHTOPEN;\n e = newNode(op, [e]);\n } else if (e.lbrk === TK_PERIOD && e.rbrk === TK_VERTICALBAR) {\n e = newNode(Model.EVALAT, [e]);\n } else if (tk1 === TK_LANGLE && tk2 === TK_RANGLE) {\n e = newNode(Model.ANGLEBRACKET, [e]);\n } else if (e.op === Model.COMMA || tk1 === TK_LEFTPAREN || tk1 === TK_LEFTBRACKET) {\n assert(tk1 === TK_LEFTPAREN && tk2 === TK_RIGHTPAREN ||\n tk1 === TK_LEFTBRACKET && tk2 === TK_RIGHTBRACKET ||\n tk1 === tk2, message(1011, [`tk1=${tk1} tk2=${tk2}`]));\n const op =\n tk1 === TK_LEFTBRACKET && Model.BRACKET ||\n Model.PAREN;\n e = newNode(op, [e]);\n }\n bracketTokenCount--;\n inParenExpr = false;\n e.lbrk = tk1;\n e.rbrk = tk2;\n return e;\n }\n // Parse 'x^2'\n function exponentialExpr() {\n const args = [primaryExpr()];\n while (hd() === TK_CARET) {\n next({ oneCharToken: true });\n let t;\n if ((isMathSymbol(args[0]) || isChemCore()) &&\n ((t = hd()) === TK_ADD || t === TK_SUB)) {\n next();\n // Na^+\n args.push(unaryNode(tokenToOperator[t], [nodeOne]));\n } else {\n let n = unaryExpr();\n if (n.op === Model.VAR && n.args[0] === '\\\\circ') {\n // 90^{\\circ} -> degree 90\n if (hd() === TK_TEXT &&\n (lexeme() === 'K' || lexeme() === 'C' || lexeme() === 'F')) {\n n = multiplyNode([\n args.pop(),\n unaryNode(Model.VAR, [`\\\\degree ${lexeme()}`])]);\n next();\n } else {\n n = multiplyNode([\n args.pop(),\n unaryNode(Model.VAR, ['\\\\degree']),\n ]);\n }\n args.push(n);\n } else {\n // x^2\n args.push(n);\n }\n }\n }\n if (args.length > 1) {\n let expo = args.pop();\n args.reverse().forEach((base) => {\n expo = newNode(Model.POW, [base, expo]);\n });\n expo.isPolynomial = isPolynomial(expo);\n return expo;\n }\n const node = args[0];\n node.isPolynomial = isPolynomial(node);\n return node;\n }\n // Parse '10%', '4!'\n function postfixExpr() {\n // FIXME (2\\degree)\\text{C} => 2(\\degree\\text{C})\n let t;\n let expr = exponentialExpr();\n switch (t = hd()) {\n case TK_PERCENT:\n next();\n expr = newNode(Model.PERCENT, [expr]);\n break;\n case TK_BANG:\n next();\n expr = newNode(Model.FACT, [expr]);\n break;\n default:\n if (t === TK_VERTICALBAR && lookahead() === TK_UNDERSCORE) {\n // x|_{x=3}, x|_1^2\n next();\n const args = [expr];\n next({ oneCharToken: true });\n args.push(newNode(Model.SUBSCRIPT, [equalExpr()]));\n expr = newNode(Model.PIPE, args);\n } else if (isChemCore() && (t === TK_ADD || t === TK_SUB) && lookahead() === TK_RIGHTBRACE) {\n next();\n // 3+, ion\n expr = unaryNode(tokenToOperator[t], [expr]);\n } // Otherwise we're in the middle of a binary expr.\n break;\n }\n return expr;\n }\n function isEndOfMultiplicativeExpression(tk) {\n return tk === TK_ADD ||\n tk === TK_SUB ||\n tk === TK_COMMA ||\n tk === TK_RIGHTBRACE ||\n tk === TK_RIGHTPAREN ||\n tk === TK_RIGHTBRACKET ||\n tk === TK_RANGLE ||\n tk === TK_RIGHTCMD ||\n tk === TK_NONE;\n }\n // Parse '+x', '\\pm y'\n function unaryExpr() {\n let t; let expr; let\nop;\n switch (t = hd()) {\n case TK_ADD:\n case TK_NOT:\n case TK_SUB:\n next();\n expr = newNode(tokenToOperator[t], [unaryExpr()]);\n break;\n case TK_PM:\n next();\n expr = multiplicativeExpr(true);\n expr = newNode(tokenToOperator[t], [expr]);\n break;\n case TK_UNDERSCORE:\n // _1, _1^2, _+^-\n op = tokenToOperator[t];\n next({ oneCharToken: true });\n if ((t = hd()) === TK_ADD || t === TK_SUB) {\n next();\n // ^+, ^-\n expr = nodeOne;\n } else {\n expr = unaryExpr();\n }\n expr = newNode(op, [expr]);\n if ((t = hd()) === TK_CARET) {\n const args = [expr];\n // _1, _1^2, _+^-\n op = tokenToOperator[t];\n next({ oneCharToken: true });\n if ((t = hd()) === TK_ADD || t === TK_SUB) {\n next();\n // ^+, ^-\n expr = nodeOne;\n } else {\n expr = unaryExpr();\n }\n args.push(expr);\n expr = newNode(op, args);\n }\n break;\n case TK_CARET:\n op = tokenToOperator[t];\n next({ oneCharToken: true });\n if ((t = hd()) === TK_ADD || t === TK_SUB) {\n next();\n // ^+, ^-\n expr = nodeOne;\n } else {\n expr = unaryExpr();\n }\n expr = newNode(op, [expr]);\n break;\n default:\n if (t === TK_VAR && lexeme() === '$') {\n next();\n if (!isEndOfMultiplicativeExpression(hd())) {\n // Give $1 a higher precedence than ordinary multiplication.\n expr = multiplyNode([newNode(Model.VAR, ['$']), postfixExpr()]);\n expr.args[1].isPolynomialTerm = true;\n } else {\n // Standalone '$'. Probably not useful but we had a test case for it.\n expr = newNode(Model.VAR, ['$']);\n }\n } else {\n expr = postfixExpr();\n }\n break;\n }\n return expr;\n }\n // Parse 'x_2', where x might be a exponential.\n // x^2_1 => x_1^2\n function subscriptExpr() {\n const args = [unaryExpr()];\n while (hd() === TK_UNDERSCORE) {\n next({ oneCharToken: true });\n args.push(exponentialExpr());\n if (isChemCore()) {\n if (hd() === TK_LEFTBRACE) {\n // C_2{}^3 -> C_2^3\n eat(TK_LEFTBRACE);\n eat(TK_RIGHTBRACE);\n }\n }\n }\n let expr;\n if (args.length === 1) {\n expr = args[0];\n assert(expr.op !== Model.SUBSCRIPT || expr.args.length !== 1, message(1012, [src]));\n } else {\n expr = foldSubs(args);\n }\n return expr;\n function foldSubs(args) {\n let expo;\n let base;\n args.forEach((arg) => {\n if (arg.op === Model.SUBSCRIPT) {\n arg = foldSubs(arg.args);\n }\n let baseArgs; let\nargArgs;\n if (arg.op === Model.POW && !arg.lbrk) {\n expo = arg.args[1];\n baseArgs =\n base && base.op === Model.SUBSCRIPT && base.args ||\n base && [base] ||\n [];\n argArgs =\n arg.args[0].op === Model.SUBSCRIPT && arg.args[0].args ||\n [arg.args[0]];\n } else if (base && base.op === Model.POW) {\n expo = base.args[1];\n baseArgs =\n base.args[0].op === Model.SUBSCRIPT && base.args[0].args ||\n [base.args[0]] ||\n [];\n argArgs =\n arg.op === Model.SUBSCRIPT && arg.args ||\n [arg];\n } else {\n baseArgs =\n base && base.op === Model.SUBSCRIPT && base.args ||\n base && [base] ||\n [];\n argArgs =\n arg.op === Model.SUBSCRIPT && arg.args ||\n [arg];\n }\n const args = baseArgs.concat(argArgs);\n base = args.length > 1 && newNode(Model.SUBSCRIPT, args) || args[0];\n });\n return expo && binaryNode(Model.POW, [base, expo]) || base;\n }\n }\n // Parse '1/2/3/4', '1 1/2', '1\\frac{1}{2}'\n function fractionExpr() {\n let t; let node = subscriptExpr();\n if (isDerivative(node)) {\n return derivativeNode(node);\n }\n if (isNumber(node) &&\n (hd() === TK_FRAC || hd() === TK_NUM && lookahead() === TK_SLASH)) {\n let frac = fractionExpr();\n if (isDerivative(frac)) {\n return derivativeNode(frac);\n }\n if (isMixedNumber(node, frac)) {\n let isPercent;\n if (frac.op === Model.PERCENT) {\n frac = frac.args[0];\n isPercent = true;\n }\n let neg;\n if (isNeg(node)) {\n neg = true;\n node = negate(node);\n }\n node = binaryNode(Model.ADD, [node, frac]);\n node.isMixedNumber = true;\n if (neg) {\n node = negate(node);\n }\n if (isPercent === true) {\n node = newNode(Model.PERCENT, [node]);\n }\n } else {\n node = binaryNode(Model.MUL, [node, frac]);\n frac.isImplicit = true;\n }\n }\n while ((t === undefined || t === hd()) && (t = hd()) === TK_SLASH) {\n next();\n node = newNode(tokenToOperator[t], [node, subscriptExpr()]);\n node.isFraction = isSimpleFraction(node);\n node.isSlash = t === TK_SLASH;\n }\n if (node.op === Model.FRAC && node.args[1].op === Model.PERCENT) {\n node = newNode(Model.PERCENT, [\n newNode(Model.FRAC, [node.args[0], node.args[1].args[0]])\n ]);\n }\n return node;\n }\n function isMathSymbol(n) {\n if (n.op !== Model.VAR) {\n return false;\n }\n const sym = Model.env[n.args[0]];\n return !!(sym && sym.name); // This is somewhat ad hoc, update as needed.\n }\n function isVar(n, id) {\n // Test if is a variable, possibly to an exponent.\n assert(typeof id === 'undefined' || typeof id === 'string', '1000: Invalid id');\n if (n.op === Model.VAR) {\n return id === undefined ? true : n.args[0] === id;\n } if (n.op === Model.POW && isVar(n.args[0]) && isInteger(n.args[1])) {\n return id === undefined ? true : n.args[0].args[0] === id;\n }\n return false;\n }\n function isOne(node) {\n return node.op === Model.NUM &&\n (node.args[0] === '1' || node.args[0] === '1.');\n }\n function isMinusOne(node) {\n return node.op === Model.SUB && node.args.length === 1 && isOne(node.args[0]);\n }\n function isMultiplicative(t) {\n return t === TK_MUL ||\n t === TK_DIV ||\n t === TK_SLASH ||\n t === TK_TIMES ||\n t === TK_CDOT; // / is only multiplicative for parsing\n }\n function isFunction(t) {\n return t === TK_SIN ||\n t === TK_COS ||\n t === TK_TAN ||\n t === TK_SEC ||\n t === TK_COT ||\n t === TK_CSC ||\n t === TK_SINH ||\n t === TK_COSH ||\n t === TK_TANH ||\n t === TK_SECH ||\n t === TK_COTH ||\n t === TK_CSCH ||\n t === TK_ARCSIN ||\n t === TK_ARCCOS ||\n t === TK_ARCTAN ||\n t === TK_ARCSEC ||\n t === TK_ARCCOT ||\n t === TK_ARCCSC ||\n t === TK_ARCSINH ||\n t === TK_ARCCOSH ||\n t === TK_ARCTANH ||\n t === TK_ARCSECH ||\n t === TK_ARCCOTH ||\n t === TK_ARCCSCH ||\n t === TK_LN ||\n t === TK_LOG ||\n t === TK_LG;\n }\n function isDerivative(n) {\n if (n.op !== Model.FRAC) {\n return false;\n }\n const numer = n.args[0];\n const numerHead =\n numer.op === Model.MUL && numer.args[0].op === Model.VAR && numer.args[0].args[0] ||\n numer.op === Model.VAR && numer.args[0] ||\n numer.op === Model.POW && numer.args[0].op === Model.VAR && numer.args[0].args[0];\n const denom = n.args[1];\n const denomHead =\n denom.op === Model.MUL && denom.args[0].op === Model.VAR && denom.args[0].args[0];\n return numerHead === 'd' && denomHead === 'd' &&\n (denom.args[1] && denom.args[1].op === Model.VAR ||\n denom.args[1] && denom.args[1].op === Model.POW &&\n denom.args[1].args[0] && denom.args[1].args[0].op === Model.VAR);\n }\n function derivativeNode(node) {\n if (node.op !== Model.FRAC) {\n return null;\n }\n const numer = node.args[0];\n const denom = node.args[1];\n const operand =\n numer.op === Model.MUL && multiplyNode(numer.args.slice(1))\n || multiplicativeExpr(); // Not in numer, so get operand from next expr.\n assert(denom.args.length === 2);\n const dvar = denom.args[1];\n const sym = dvar.op === Model.POW && dvar.args[0] || dvar;\n const order = dvar.op === Model.POW && dvar.args[1] || nodeOne;\n node = newNode(Model.DERIV, [operand, sym, order]);\n return node;\n }\n function multiplicativeExpr(implicitOnly = false) {\n let t; let expr; let explicitOperator = false; let args = [];\n let n0;\n expr = fractionExpr();\n args = [expr];\n // While lookahead is not a lower precedent operator\n // FIXME need a better way to organize this condition\n let loopCount = 0;\n while ((t = hd()) && !isAdditive(t) && !isRelational(t) && !isImplies(t) &&\n t !== TK_COMMA && t !== TK_SEMICOLON && t !== TK_COLON && !isEquality(t) &&\n t !== TK_RIGHTBRACE && t !== TK_RIGHTBRACESET && t !== TK_RIGHTPAREN &&\n t !== TK_RIGHTCMD && t !== TK_RANGLE &&\n !((t === TK_LEFTBRACKET || t === TK_RIGHTBRACKET) && bracketTokenCount > 0) &&\n t !== TK_RIGHTARROW && t !== TK_CAPRIGHTARROW && t !== TK_LT &&\n !(t === TK_VERTICALBAR && pipeTokenCount > 0) &&\n t !== TK_NEWROW && t !== TK_NEWCOL && t !== TK_END) {\n if (implicitOnly &&\n (isMultiplicative(t) || isFunction(t) ||\n t === TK_LEFTPAREN || t === TK_LEFTCMD || t === TK_LEFTBRACKET ||\n t === TK_LANGLE || t === TK_MATHBF)) {\n break; // Stop parsing\n }\n if (hasDX(options, flattenNestedNodes(expr))) {\n break; // Stop parsing\n }\n explicitOperator = false;\n if (isMultiplicative(t)) {\n next();\n explicitOperator = true;\n }\n expr = fractionExpr();\n if (t === TK_CDOT || t === TK_TIMES || t === TK_DIV) {\n expr = binaryNode(tokenToOperator[t], [args.pop(), expr], true);\n }\n if (!(explicitOperator ||\n args.length === 0 ||\n expr.lbrk ||\n args[args.length - 1].op !== Model.NUM ||\n !(args[args.length - 1].numberFormat === 'decimal' && args[args.length - 1].lastSeparatorIndex === args[args.length - 1].args[0].length - 1) ||\n args[args.length - 1].lastSeparatorIndex === args[args.length - 1].args[0].length ||\n args[args.length - 1].lbrk ||\n isRepeatingDecimal([args[args.length - 1], expr]) ||\n expr.op !== Model.NUM)) {\n assert(false, 'Shouldn\\'t get here');\n }\n assert(explicitOperator ||\n args.length === 0 ||\n expr.lbrk ||\n args[args.length - 1].op !== Model.NUM ||\n args[args.length - 1].lbrk ||\n isRepeatingDecimal([args[args.length - 1], expr]) ||\n expr.op !== Model.NUM, message(1010));\n if (isChemCore() && t === TK_LEFTPAREN && isVar(args[args.length - 1], 'M')) {\n // M(x) -> \\M(x)\n args.pop();\n expr = unaryNode(Model.M, [expr]);\n } else if (!explicitOperator && args.length > 0) {\n if (args.length > 0 &&\n isMixedNumber(args[args.length - 1], expr)) {\n // 3 \\frac{1}{2} -> 3 + \\frac{1}{2}\n t = args.pop();\n if (isNeg(t)) {\n expr = binaryNode(Model.MUL, [nodeMinusOne, expr]);\n }\n expr = binaryNode(Model.ADD, [t, expr]);\n expr.isMixedNumber = true;\n } else if (args.length > 0 &&\n args[args.length - 1].op === Model.VAR &&\n expr.op === Model.VAR && expr.args[0].indexOf('\\'') === 0) {\n // Merge previous var with current '.\n expr = binaryNode(Model.POW, [args.pop(), expr]);\n expr.isImplicit = expr.args[0].isImplicit;\n } else if (args.length > 0 &&\n (args[args.length - 1].op === Model.MUL || args[args.length - 1].op === Model.DOT) && // 2x', 2*x', 2\\cdot x'\n args[args.length - 1].args[args[args.length - 1].args.length - 1].op === Model.VAR &&\n expr.op === Model.VAR && expr.args[0].indexOf('\\'') === 0) {\n t = args.pop();\n expr = multiplyNode(t.args.concat(binaryNode(Model.POW, [t.args.pop(), expr])));\n expr.isImplicit = expr.args[0].isImplicit;\n } else if (args.length > 0 &&\n args[args.length - 1].op === Model.VAR &&\n expr.op === Model.POW &&\n expr.args[0].op === Model.VAR &&\n expr.args[0].args[0].indexOf('\\'') === 0) {\n // Merge previous var with current ' and raise to the power.\n expr = newNode(Model.POW, [binaryNode(Model.POW, [args.pop(), expr.args[0]])].concat(expr.args.slice(1)));\n } else if (args.length > 0 &&\n (n0 = isRepeatingDecimal([args[args.length - 1], expr]))) {\n args.pop();\n expr = n0;\n } else if (isENotation(args, expr)) {\n // 1E2, 1E-2, 1e2\n const tmp = args.pop();\n expr = binaryNode(Model.POW, [numberNode(options, '10'), unaryExpr()]);\n expr = binaryNode(Model.TIMES, [tmp, expr]);\n if (isScientific(expr.args)) {\n expr.isScientific = true;\n }\n } else if (expr.op === Model.VAR\n && expr.args[0] === '\\\\degree'\n && args.length === 1\n && args[0].op === Model.SUB\n && args[0].args.length === 1) {\n // Make -2\\degree an alias of -2^\\circ.\n expr = unaryNode(Model.SUB, [multiplyNode([args[0].args[0], expr])]);\n args.pop();\n } else {\n expr = multiplyNode([args.pop(), expr], true);\n }\n } else if ((t === TK_TIMES || t === TK_CDOT) && isScientific(expr.args)) {\n // 1.2 \\times 10 ^ {-3}\n expr.isScientific = true;\n }\n args.push(expr);\n assert(loopCount++ < 1000, '1000: Stuck in loop in multiplicativeExpr()');\n }\n const node = args[0];\n if (node.op === Model.MUL && node.args.length > 1) {\n // Only trim braces with implicit multiplication.\n return trimEmptyBraces(node);\n }\n return node;\n }\n function trimEmptyBraces(node) {\n assert(node.op === Model.MUL, '1000: Internal error');\n let { args } = node;\n let n = args[0];\n if (n.op === Model.COMMA && n.args.length === 0) {\n args = args.slice(1, args.length);\n args[0].isImplicit = false;\n }\n n = args[args.length - 1];\n if (n.op === Model.COMMA && n.args.length === 0) {\n args = args.slice(0, args.length - 1);\n }\n return newNode(node.op, args);\n }\n function isNumber(n) {\n if ((n.op === Model.SUB || n.op === Model.ADD) &&\n n.args.length === 1) {\n n = n.args[0];\n }\n if (n.op === Model.NUM) {\n return n;\n }\n return false;\n }\n function isMixedNumber(n0, n1) {\n // 3\\frac{1}{2} but not 3(\\frac{1}{2}) or 3 1.0/2 or 3 3/2\n if ((n0.op === Model.SUB || n0.op === Model.ADD) &&\n n0.args.length === 1) {\n n0 = n0.args[0];\n }\n if (n1.op === Model.PERCENT) {\n n1 = n1.args[0];\n }\n if (n0.op === Model.NUM &&\n isProperFraction(n1)) {\n return true;\n }\n return false;\n }\n\n function isInteger(node) {\n let mv;\n if (!node) {\n return false;\n }\n if ((node.op === Model.SUB || node.op === Model.ADD) &&\n node.args.length === 1) {\n node = node.args[0];\n }\n if (node.op === Model.NUM &&\n (mv = new Decimal(node.args[0])) &&\n isInteger(mv)) {\n return true;\n } if (node instanceof Decimal) {\n return node.modulo(bigOne).cmp(bigZero) === 0;\n }\n return false;\n }\n\n const bigZero = new Decimal('0');\n const bigOne = new Decimal('1');\n\n function isPolynomial(node) {\n // This recognizes some common shapes of polynomials.\n let degree = 0;\n if (node.op === Model.POW) {\n const base = node.args[0];\n const expo = node.args[1];\n if ((base.op === Model.VAR ||\n base.isPolynomial ||\n base.op === Model.PAREN &&\n isPolynomial(base.args[0])) &&\n isInteger(expo)) {\n degree = parseInt(expo.args[0], 10);\n }\n } else if (node.op === Model.VAR) {\n degree = 1;\n } else if (node.op === Model.ADD || node.op === Model.SUB) {\n node.args.forEach((n) => {\n const d = isPolynomial(n);\n degree = d > degree && d || degree;\n });\n } else if (node.op === Model.MUL) {\n node.args.forEach((n) => {\n const d = isPolynomial(n);\n degree = d > degree && d || degree;\n });\n }\n return degree;\n }\n function isMultiplicativeNode(node) {\n return node.op === Model.MUL || node.op === Model.TIMES || node.op === Model.CDOT;\n }\n\n function isRepeatingDecimal(args) {\n // '3.' '\\overline{..}'\n // '10\\times3.' '\\overline{..}', prefix=10\n if (!isNumber(args[0])) {\n return null;\n }\n let prefix;\n let isNeg = false;\n if (args[0].op === Model.SUB && args[0].args[0].op === Model.NUM) {\n args[0] = args[0].args[0];\n isNeg = true;\n }\n if (isMultiplicativeNode(args[0]) && args[0].args[args[0].args.length - 1].numberFormat === 'decimal') {\n prefix = args[0].args.slice(0, args[0].args.length - 1);\n args = args[0].args.slice(args[0].args.length - 1).concat(args[1]);\n }\n let expr;\n let n0;\n let n1;\n if (!args[0].lbrk &&\n (args[0].op === Model.NUM && args[0].numberFormat === 'decimal' ||\n args[0].op === Model.VAR && args[0].args[0] === '?' ||\n args[0].op === Model.TYPE && args[0].args[0].op === Model.VAR && args[0].args[0].args[0] === 'decimal')) {\n // No lbrk so we are in the same number literal.\n if (!args[1].lbrk && args[1].op === Model.OVERLINE) {\n // 3.\\overline{12} --> 3.+(12, repeating)\n // 0.3\\overline{12} --> 0.3+(12, repeating)\n n0 = args[0];\n n1 = args[1].args[0];\n } else {\n return null;\n }\n n0.isRepeating = true;\n n1.isRepeating = true;\n expr = binaryNode(Model.ADD, [n0, n1]);\n expr.numberFormat = 'decimal';\n expr.isRepeating = true;\n if (prefix) {\n expr = multiplyNode(prefix.concat(expr));\n }\n } else {\n expr = null;\n }\n expr = expr !== null && isNeg && unaryNode(Model.SUB, [expr]) || expr;\n return expr;\n }\n\n function isENotation(args, expr) {\n if (args.length > 0 && isNumber(args[args.length - 1]) &&\n expr.op === Model.TEXT &&\n (expr.args[0].args[0] === 'E' || expr.args[0].args[0] === 'e') &&\n (hd() === TK_NUM || (hd() === 45 || hd() === 43) && lookahead() === TK_NUM)) {\n // 1E-2, 1E2\n return true;\n }\n return false;\n }\n\n function isScientific(args) {\n let n;\n if (args.length === 2) {\n // 1.0 \\times 10 ^ 1\n const a = args[0];\n const e = args[1];\n if ((n = isNumber(a)) &&\n (+n.args[0] >= 1 && +n.args[0] < 10) &&\n e.op === Model.POW &&\n (n = isNumber(e.args[0])) && n.args[0] === '10' &&\n isInteger(e.args[1])) {\n return true;\n }\n return false;\n }\n return false;\n }\n\n function isNeg(n) {\n if (typeof n === 'number') {\n return n < 0;\n } if (n.args.length === 1) {\n return n.op === OpStr.SUB && n.args[0].args[0] > 0 || // Is unary minus.\n n.op === Model.NUM && +n.args[0] < 0; // Is negative number.\n } if (n.args.length === 2) {\n return n.op === OpStr.MUL && isNeg(n.args[0]); // Leading term is neg.\n }\n return false;\n }\n // Return the numeric inverse of the argument.\n function negate(n) {\n if (typeof n === 'number') {\n return -n;\n } if (n.op === Model.SUB && n.args.length === 1) {\n return n.args[0];\n } if (n.op === Model.MUL) {\n const args = n.args.slice(0); // Copy.\n return multiplyNode([negate(args.shift())].concat(args));\n } if (n.op === Model.POW && isMinusOne(n.args[1])) {\n return binaryNode(Model.POW, [negate(n.args[0]), nodeMinusOne]);\n }\n return unaryNode(Model.SUB, [n]);\n }\n function isAdditive(t) {\n return (\n t === TK_ADD || t === TK_SUB || t === TK_PM ||\n t === TK_BACKSLASH || t === TK_CUP || t === TK_CAP\n );\n }\n // Parse 'a + b'\n function additiveExpr() {\n let expr = multiplicativeExpr();\n let t;\n while (isAdditive(t = hd())) {\n next();\n let expr2 = multiplicativeExpr();\n switch (t) {\n case TK_BACKSLASH:\n case TK_CUP:\n case TK_CAP:\n if (expr.lbrk === TK_LEFTBRACESET &&\n expr.rbrk === TK_RIGHTBRACESET) {\n expr = newNode(Model.SET, [expr]);\n }\n if (expr2.lbrk === TK_LEFTBRACESET &&\n expr2.rbrk === TK_RIGHTBRACESET) {\n expr2 = newNode(Model.SET, [expr2]);\n }\n expr = binaryNode(tokenToOperator[t], [expr, expr2]);\n break;\n case TK_PM:\n expr = binaryNode(Model.PM, [expr, expr2]);\n break;\n case TK_SUB:\n expr = binaryNode(Model.SUB, [expr, expr2]);\n break;\n default: {\n const flatten =\n !Model.option(options, 'compareGrouping') &&\n !(expr.isMixedNumber || expr2.isMixedNumber);\n expr = binaryNode(Model.ADD, [expr, expr2], flatten);\n break;\n }\n }\n }\n expr.isPolynomial = isPolynomial(expr);\n return expr;\n }\n function isFunctionNode(node) {\n return node.op === Model.SIN ||\n node.op === Model.COS ||\n node.op === Model.TAN ||\n node.op === Model.SEC ||\n node.op === Model.COT ||\n node.op === Model.CSC ||\n node.op === Model.SINH ||\n node.op === Model.COSH ||\n node.op === Model.TANH ||\n node.op === Model.SECH ||\n node.op === Model.COTH ||\n node.op === Model.CSCH ||\n node.op === Model.ARCSIN ||\n node.op === Model.ARCCOS ||\n node.op === Model.ARCTAN ||\n node.op === Model.ARCSEC ||\n node.op === Model.ARCCOT ||\n node.op === Model.ARCCSC ||\n node.op === Model.ARCSINH ||\n node.op === Model.ARCCOSH ||\n node.op === Model.ARCTANH ||\n node.op === Model.ARCSECH ||\n node.op === Model.ARCCOTH ||\n node.op === Model.ARCCSCH ||\n node.op === Model.LN ||\n node.op === Model.LOG ||\n node.op === Model.LG;\n }\n function flattenNestedNodes(node) {\n let args = [];\n let op = node.op;\n if (op === Model.NUM || op === Model.VAR) {\n return node;\n }\n if (op === Model.CDOT || op === Model.TIMES) {\n op = Model.MUL;\n }\n node.args.forEach((n) => {\n n = flattenNestedNodes(n);\n if (op !== Model.INTEGRAL && n.op === op &&\n n.args.length > 1) {\n args = args.concat(n.args);\n } else {\n args.push(n);\n }\n });\n const { isMixedNumber } = node;\n node = newNode(op, args);\n node.isMixedNumber = isMixedNumber;\n return node;\n }\n // Parse '\\int a + b dx'\n function hasDX(options, node) {\n if (!Model.option(options, 'parsingIntegralExpr')) {\n return null;\n }\n const len = node.args.length;\n if (node.op === Model.MUL && node.args[len - 1].op === Model.FRAC) {\n return hasDX(options, node.args[len - 1]);\n } if (isMultiplicativeNode(node) && isFunctionNode(node.args[len - 1])) {\n return hasDX(options, node.args[len - 1]);\n } if (node.op === Model.FRAC) {\n return hasDX(options, node.args[0]); // Numerator\n } if (isFunctionNode(node)) {\n return hasDX(options, node.args[len - 1]); // Function arg\n }\n const dvar = node.args[len - 2];\n const ivar = node.args[len - 1];\n return (\n node && node.op === Model.MUL &&\n dvar.op === Model.VAR && dvar.args[0] === 'd' &&\n ivar.op === Model.VAR && ivar || null\n );\n }\n function stripDX(node) {\n assert(isMultiplicativeNode(node) || node.op === Model.FRAC || isFunctionNode(node));\n // Strip off last two args ('dx')\n let nodeLast = node.args[node.args.length - 1];\n if (node.op === Model.MUL && nodeLast.op === Model.FRAC) {\n // 2\\frac{dx}{x}\n nodeLast = stripDX(nodeLast);\n node = multiplyNode(node.args.slice(0, node.args.length - 1).concat(nodeLast));\n } else if (isMultiplicativeNode(node) && isFunctionNode(nodeLast)) {\n // 2 \\ln(x dx)\n nodeLast = stripDX(nodeLast);\n node = newNode(node.op, node.args.slice(0, node.args.length - 1).concat(nodeLast));\n } else if (node.op === Model.FRAC) {\n // \\frac{dx}{x}\n node = newNode(Model.FRAC, [\n stripDX(node.args[0]),\n node.args[1],\n ]);\n } else if (isFunctionNode(node)) {\n // \\ln(x dx)\n node = newNode(node.op, [stripDX(node.args[node.args.length - 1])]);\n } else {\n node = multiplyNode(node.args.slice(0, node.args.length - 2));\n }\n return node;\n }\n function integralExpr(tk) {\n let expr; let foundDX;\n const parsingIntegralExpr = Model.option(options, 'parsingIntegralExpr', true);\n const args = [];\n if (hd() === TK_IIINT) {\n eat(TK_IIINT);\n expr = integralExpr(TK_IIINT);\n foundDX = hasDX(options, flattenNestedNodes(multiplicativeExpr()));\n } else if (hd() === TK_IINT || tk === TK_IIINT) {\n if (tk !== TK_IIINT) {\n eat(TK_IINT);\n }\n expr = integralExpr(TK_IINT);\n foundDX = hasDX(options, flattenNestedNodes(multiplicativeExpr()));\n } else {\n if (tk !== TK_IINT) {\n eat(TK_INT);\n }\n // Collect the subscript and expression\n if (hd() === TK_UNDERSCORE) {\n next({ oneCharToken: true });\n args.push(primaryExpr());\n if (hd() === TK_CARET) {\n eat(TK_CARET, { oneCharToken: true });\n args.push(primaryExpr());\n }\n }\n if (hd() === TK_INT) {\n expr = integralExpr();\n foundDX = hasDX(options, flattenNestedNodes(multiplicativeExpr()));\n } else {\n expr = flattenNestedNodes(multiplicativeExpr());\n let t;\n foundDX = hasDX(options, expr);\n expr = foundDX && stripDX(expr) || expr;\n while (isAdditive(t = hd()) && !foundDX) {\n next();\n let expr2 = flattenNestedNodes(multiplicativeExpr());\n foundDX = hasDX(options, expr2);\n expr2 = foundDX && stripDX(expr2) || expr2;\n switch (t) {\n case TK_SUB:\n expr = binaryNode(Model.SUB, [expr, expr2]);\n break;\n default:\n expr = binaryNode(Model.ADD, [expr, expr2], true /* flatten */);\n break;\n }\n }\n }\n }\n args.push(expr);\n args.push(foundDX || nodeEmpty);\n // [sub, sup, expr, var], [expr, var]\n Model.option(options, 'parsingIntegralExpr', parsingIntegralExpr);\n assert(foundDX, message(1014, [src.replace(/\\\\\\\\/g, '\\\\')]));\n return newNode(Model.INTEGRAL, args);\n }\n function limitExpr() {\n eat(TK_LIM);\n const args = [];\n // Collect the subscript and expression\n if (hd() === TK_UNDERSCORE) {\n next({ oneCharToken: true });\n args.push(primaryExpr());\n }\n args.push(multiplicativeExpr());\n return newNode(Model.LIM, args);\n }\n function ratioExpr() {\n let expr = additiveExpr();\n while (hd() === TK_COLON) {\n next();\n const expr2 = additiveExpr();\n expr = binaryNode(Model.COLON, [expr, expr2], true);\n }\n return expr;\n }\n function isRelational(t) {\n return t === TK_LT || t === TK_LE || t === TK_GT || t === TK_GE ||\n t === TK_NGTR || t === TK_NLESS ||\n t === TK_IN || t === TK_TO ||\n t === TK_PERP || t === TK_PROPTO ||\n t === TK_NI || t === TK_NOT ||\n t === TK_SUBSETEQ || t === TK_SUPSETEQ ||\n t === TK_SUBSET || t === TK_SUPSET ||\n t === TK_PARALLEL || t === TK_NPARALLEL || t === TK_SIM || t === TK_CONG;\n }\n // Parse 'x < y'\n // x + y > z ==> (x + y) > z, x + (y > z)\n function relationalExpr() {\n let t = hd();\n let expr = ratioExpr();\n const args = [];\n let isNot = false;\n while (isRelational(t = hd())) {\n // x < y < z -> [x < y, y < z]\n next();\n if (t === TK_NOT) {\n // Remember it and continue.\n isNot = true;\n continue;\n }\n const expr2 = ratioExpr();\n expr = newNode(tokenToOperator[t], [expr, expr2]);\n if (isNot) {\n // Modify with not.\n expr.op = `n${expr.op}`; // Negate the operator: subset --> nsubset.\n isNot = false;\n }\n args.push(expr);\n // Make a copy of the reused node.\n expr = Model.create(options, expr2);\n }\n if (args.length === 0) {\n return expr;\n } if (args.length === 1) {\n return args[0];\n }\n return newNode(Model.COMMA, args);\n }\n // Parse 'x = 10'\n function isEquality(t) {\n return t === TK_EQL || t === TK_NE || t === TK_APPROX;\n }\n function equalExpr() {\n let expr = relationalExpr();\n let t;\n const args = [];\n while (isEquality(t = hd()) ||\n t === TK_RIGHTARROW) {\n // x = y = z -> [x = y, y = z]\n next();\n const expr2 = ratioExpr();\n expr = newNode(tokenToOperator[t], [expr, expr2]);\n args.push(expr);\n // Make a copy of the reused node.\n expr = Model.create(options, expr2);\n }\n if (args.length === 0) {\n return expr;\n } if (args.length === 1) {\n return args[0];\n }\n return newNode(Model.COMMA, args);\n }\n function isImplies(t) {\n return t === TK_IMPLIES || t === TK_RIGHTARROW || t === TK_CAPRIGHTARROW ||\n t === TK_LEFTARROW || t === TK_LONGRIGHTARROW || t === TK_LONGLEFTARROW ||\n t === TK_OVERRIGHTARROW || t === TK_OVERLEFTARROW || t === TK_CAPLEFTRIGHTARROW ||\n t === TK_LEFTRIGHTARROW || t === TK_LONGLEFTRIGHTARROW || t === TK_OVERLEFTRIGHTARROW;\n }\n function impliesExpr() {\n let expr = equalExpr();\n let t;\n while (isImplies(t = hd())) {\n next();\n const expr2 = equalExpr();\n expr = newNode(tokenToOperator[t], [expr, expr2]);\n }\n return expr;\n }\n // Parse 'a, b, c, d'\n function commaExpr(allowSemicolon) {\n const expr = impliesExpr();\n const args = [expr];\n let t;\n while ((t = hd()) === TK_COMMA ||\n allowSemicolon && t === TK_SEMICOLON) {\n // If commas are thousands or decimal separator then they are already\n // consumed as part of the number.\n next();\n if (!isListBreakToken(hd())) {\n args.push(impliesExpr());\n }\n }\n if (args.length > 1) {\n return newNode(tokenToOperator[TK_COMMA], args);\n }\n return expr;\n }\n function expr() {\n try {\n initParser();\n if (hd()) {\n let n = commaExpr();\n assert(!hd(), message(1003, [\n scan.pos(),\n scan.lexeme(), `\"${src.substring(scan.pos() - 1)}\"`,\n ]));\n if (n.lbrk === TK_LEFTBRACESET) {\n n = newNode(Model.SET, [n]);\n }\n return n;\n }\n } catch (x) {\n console.log(`SYNTAX ERROR in: ${src}\\n${x.stack}`);\n throw x;\n }\n // No meaningful input. Return a dummy node to avoid choking.\n return nodeEmpty;\n }\n // Return a parser object.\n return {\n expr,\n };\n // SCANNER\n // Find tokens in the input stream.\n function scanner(src) {\n let curIndex = 0;\n let lexeme = '';\n const lexemeToToken = {\n '\\\\Delta': TK_DELTA,\n '\\\\cdot': TK_CDOT,\n '\\\\times': TK_TIMES,\n '\\\\div': TK_DIV,\n '\\\\dfrac': TK_FRAC,\n '\\\\frac': TK_FRAC,\n '\\\\sqrt': TK_SQRT,\n '\\\\vec': TK_VEC,\n '\\\\pm': TK_PM,\n '\\\\not': TK_NOT,\n '\\\\sin': TK_SIN,\n '\\\\cos': TK_COS,\n '\\\\tan': TK_TAN,\n '\\\\sec': TK_SEC,\n '\\\\cot': TK_COT,\n '\\\\csc': TK_CSC,\n '\\\\arcsin': TK_ARCSIN,\n '\\\\arccos': TK_ARCCOS,\n '\\\\arctan': TK_ARCTAN,\n '\\\\arcsec': TK_ARCSEC,\n '\\\\arccsc': TK_ARCCSC,\n '\\\\arccot': TK_ARCCOT,\n '\\\\asin': TK_ARCSIN, // \\operatorname{asin}\n '\\\\acos': TK_ARCCOS,\n '\\\\atan': TK_ARCTAN,\n '\\\\asec': TK_ARCSEC,\n '\\\\acsc': TK_ARCCSC,\n '\\\\acot': TK_ARCCOT,\n '\\\\sinh': TK_SINH,\n '\\\\cosh': TK_COSH,\n '\\\\tanh': TK_TANH,\n '\\\\sech': TK_SECH,\n '\\\\coth': TK_COTH,\n '\\\\csch': TK_CSCH,\n '\\\\arcsinh': TK_ARCSINH,\n '\\\\arccosh': TK_ARCCOSH,\n '\\\\arctanh': TK_ARCTANH,\n '\\\\arcsech': TK_ARCSECH,\n '\\\\arccsch': TK_ARCCSCH,\n '\\\\arccoth': TK_ARCCOTH,\n '\\\\ln': TK_LN,\n '\\\\lg': TK_LG,\n '\\\\log': TK_LOG,\n '\\\\left': TK_LEFTCMD,\n '\\\\right': TK_RIGHTCMD,\n '\\\\big': null, // whitespace\n '\\\\Big': null,\n '\\\\bigg': null,\n '\\\\Bigg': null,\n '\\\\ ': null,\n '\\\\quad': null,\n '\\\\qquad': null,\n '\\\\text': TK_TEXT,\n '\\\\textrm': TK_TEXT,\n '\\\\textit': TK_TEXT,\n '\\\\textbf': TK_TEXT,\n '\\\\operatorname': TK_OPERATORNAME,\n '\\\\lt': TK_LT,\n '\\\\le': TK_LE,\n '\\\\leq': TK_LE,\n '\\\\gt': TK_GT,\n '\\\\ge': TK_GE,\n '\\\\geq': TK_GE,\n '\\\\ne': TK_NE,\n '\\\\neq': TK_NE,\n '\\\\ngtr': TK_NGTR,\n '\\\\nless': TK_NLESS,\n '\\\\ni': TK_NI,\n '\\\\subseteq': TK_SUBSETEQ,\n '\\\\supseteq': TK_SUPSETEQ,\n '\\\\subset': TK_SUBSET,\n '\\\\supset': TK_SUPSET,\n '\\\\approx': TK_APPROX,\n '\\\\implies': TK_IMPLIES,\n '\\\\Rightarrow': TK_CAPRIGHTARROW,\n '\\\\rightarrow': TK_RIGHTARROW,\n '\\\\leftarrow': TK_LEFTARROW,\n '\\\\longrightarrow': TK_LONGRIGHTARROW,\n '\\\\longleftarrow': TK_LONGLEFTARROW,\n '\\\\overrightarrow': TK_OVERRIGHTARROW,\n '\\\\overleftarrow': TK_OVERLEFTARROW,\n '\\\\Leftrightarrow': TK_CAPLEFTRIGHTARROW,\n '\\\\leftrightarrow': TK_LEFTRIGHTARROW,\n '\\\\longleftrightarrow': TK_LONGLEFTRIGHTARROW,\n '\\\\overleftrightarrow': TK_OVERLEFTRIGHTARROW,\n '\\\\perp': TK_PERP,\n '\\\\propto': TK_PROPTO,\n '\\\\parallel': TK_PARALLEL,\n '\\\\nparallel': TK_NPARALLEL,\n '\\\\sim': TK_SIM,\n '\\\\cong': TK_CONG,\n '\\\\exists': TK_EXISTS,\n '\\\\in': TK_IN,\n '\\\\forall': TK_FORALL,\n '\\\\lim': TK_LIM,\n '\\\\exp': TK_EXP,\n '\\\\to': TK_TO,\n '\\\\sum': TK_SUM,\n '\\\\int': TK_INT,\n '\\\\iint': TK_IINT,\n '\\\\iiint': TK_IIINT,\n '\\\\prod': TK_PROD,\n '\\\\cup': TK_CUP,\n '\\\\bigcup': TK_BIGCUP,\n '\\\\cap': TK_CAP,\n '\\\\bigcap': TK_BIGCAP,\n '\\\\%': TK_PERCENT,\n '\\\\binom': TK_BINOM,\n '\\\\begin': TK_BEGIN,\n '\\\\end': TK_END,\n '\\\\colon': TK_COLON,\n '\\\\vert': TK_VERTICALBAR,\n '\\\\lvert': TK_VERTICALBAR,\n '\\\\rvert': TK_VERTICALBAR,\n '\\\\mid': TK_VERTICALBAR,\n '\\\\type': TK_TYPE,\n '\\\\format': TK_FORMAT,\n '\\\\overline': TK_OVERLINE,\n '\\\\dot': TK_DOT,\n '\\\\overset': TK_OVERSET,\n '\\\\underset': TK_UNDERSET,\n '\\\\backslash': TK_BACKSLASH,\n '\\\\mathbf': TK_MATHBF,\n '\\\\abs': TK_ABS,\n '\\\\MathQuillMathField': TK_MATHFIELD,\n '\\\\ldots': TK_VAR, // ... and var are close syntactic alternatives\n '\\\\vdots': TK_VAR,\n '\\\\ddots': TK_VAR,\n '\\\\infty': TK_INFTY,\n '\\\\langle': TK_LANGLE,\n '\\\\rangle': TK_RANGLE,\n };\n const unicodeToLaTeX = {\n 0x00A2: '\\\\cent',\n 0x00B0: '\\\\degree',\n 0x2190: \"\\\\leftarrow\",\n 0x2192: \"\\\\rightarrow\",\n 0x21CC: \"\\\\rightleftharpoons\",\n 0x2200: '\\\\forall',\n 0x2201: '\\\\complement',\n 0x2202: '\\\\partial',\n 0x2203: '\\\\exists',\n 0x2204: '\\\\nexists',\n 0x2205: '\\\\varnothing',\n 0x2206: '\\\\triangle',\n 0x2207: '\\\\nabla',\n 0x2208: '\\\\in',\n 0x2209: '\\\\notin',\n 0x220A: '\\\\in',\n 0x220B: '\\\\ni',\n 0x220C: '\\\\notni',\n 0x220D: '\\\\ni',\n 0x220E: '\\\\blacksquare',\n 0x220F: '\\\\sqcap',\n 0x2210: '\\\\amalg',\n 0x2211: '\\\\sigma',\n 0x2212: '-',\n 0x2213: '\\\\mp',\n 0x2214: '\\\\dotplus',\n 0x2215: '/',\n 0x2216: '\\\\setminus',\n 0x2217: '*',\n 0x2218: '\\\\circ',\n 0x2219: '\\\\bullet',\n 0x221A: '\\\\sqrt',\n 0x221B: null,\n 0x221C: null,\n 0x221D: '\\\\propto',\n 0x221E: '\\\\infty',\n 0x221F: '\\\\llcorner',\n 0x2220: '\\\\angle',\n 0x2221: '\\\\measuredangle',\n 0x2222: '\\\\sphericalangle',\n 0x2223: '\\\\divides',\n 0x2224: '\\\\notdivides',\n 0x2225: '\\\\parallel',\n 0x2226: '\\\\nparallel',\n 0x2227: '\\\\wedge',\n 0x2228: '\\\\vee',\n 0x2229: '\\\\cap',\n 0x222A: '\\\\cup',\n 0x222B: '\\\\int',\n 0x222C: '\\\\iint',\n 0x222D: '\\\\iiint',\n 0x222E: '\\\\oint',\n 0x222F: '\\\\oiint',\n 0x2230: '\\\\oiiint',\n 0x2231: null,\n 0x2232: null,\n 0x2233: null,\n 0x2234: '\\\\therefore',\n 0x2235: '\\\\because',\n 0x2236: '\\\\colon',\n 0x2237: null,\n 0x2238: null,\n 0x2239: null,\n 0x223A: null,\n 0x223B: null,\n 0x223C: '\\\\sim',\n 0x223D: '\\\\backsim',\n 0x223E: null,\n 0x223F: null,\n 0x2240: '\\\\wr',\n 0x2241: '\\\\nsim',\n 0x2242: '\\\\eqsim',\n 0x2243: '\\\\simeq',\n 0x2244: null,\n 0x2245: '\\\\cong',\n 0x2246: null,\n 0x2247: '\\\\ncong',\n 0x2248: '\\\\approx',\n 0x2249: null,\n 0x224A: '\\\\approxeq',\n 0x224B: null,\n 0x224C: null,\n 0x224D: '\\\\asymp',\n 0x224E: '\\\\Bumpeq',\n 0x224F: '\\\\bumpeq',\n 0x2250: '\\\\doteq',\n 0x2251: '\\\\doteqdot',\n 0x2252: '\\\\fallingdotseq',\n 0x2253: '\\\\risingdotseq',\n 0x2254: null,\n 0x2255: null,\n 0x2256: '\\\\eqcirc',\n 0x2257: '\\\\circeq',\n 0x2258: null,\n 0x2259: null,\n 0x225A: null,\n 0x225B: null,\n 0x225C: '\\\\triangleq',\n 0x225D: null,\n 0x225E: null,\n 0x225F: null,\n 0x2260: '\\\\ne',\n 0x2261: '\\\\equiv',\n 0x2262: null,\n 0x2263: null,\n 0x2264: '\\\\le',\n 0x2265: '\\\\ge',\n 0x2266: '\\\\leqq',\n 0x2267: '\\\\geqq',\n 0x2268: '\\\\lneqq',\n 0x2269: '\\\\gneqq',\n 0x226A: '\\\\ll',\n 0x226B: '\\\\gg',\n 0x226C: '\\\\between',\n 0x226D: null,\n 0x226E: '\\\\nless',\n 0x226F: '\\\\ngtr',\n 0x2270: '\\\\nleq',\n 0x2271: '\\\\ngeq',\n 0x2272: '\\\\lessim',\n 0x2273: '\\\\gtrsim',\n 0x2274: null,\n 0x2275: null,\n 0x2276: '\\\\lessgtr',\n 0x2277: '\\\\gtrless',\n 0x2278: null,\n 0x2279: null,\n 0x227A: '\\\\prec',\n 0x227B: '\\\\succ',\n 0x227C: '\\\\preccurlyeq',\n 0x227D: '\\\\succcurlyeq',\n 0x227E: '\\\\precsim',\n 0x227F: '\\\\succsim',\n 0x2280: '\\\\nprec',\n 0x2281: '\\\\nsucc',\n 0x2282: '\\\\subset',\n 0x2283: '\\\\supset',\n 0x2284: null,\n 0x2285: null,\n 0x2286: '\\\\subseteq',\n 0x2287: '\\\\supseteq',\n 0x2288: '\\\\nsubseteq',\n 0x2289: '\\\\nsupseteq',\n 0x228A: '\\\\subsetneq',\n 0x228B: '\\\\supsetneq',\n 0x228C: null,\n 0x228D: null,\n 0x228E: null,\n 0x228F: '\\\\sqsubset',\n 0x2290: '\\\\sqsupset',\n 0x2291: null,\n 0x2292: null,\n 0x2293: '\\\\sqcap',\n 0x2294: '\\\\sqcup',\n 0x2295: '\\\\oplus',\n 0x2296: '\\\\ominus',\n 0x2297: '\\\\otimes',\n 0x2298: '\\\\oslash',\n 0x2299: '\\\\odot',\n 0x229A: '\\\\circledcirc',\n 0x229B: '\\\\circledast',\n 0x229C: null,\n 0x229D: '\\\\circleddash',\n 0x229E: '\\\\boxplus',\n 0x229F: '\\\\boxminus',\n 0x22A0: '\\\\boxtimes',\n 0x22A1: '\\\\boxdot',\n 0x22A2: '\\\\vdash',\n 0x22A3: '\\\\dashv',\n 0x22A4: '\\\\top',\n 0x22A5: '\\\\bot',\n 0x22A6: null,\n 0x22A7: '\\\\models',\n 0x22A8: '\\\\vDash',\n 0x22A9: '\\\\Vdash',\n 0x22AA: '\\\\Vvdash',\n 0x22AB: '\\\\VDash*',\n 0x22AC: '\\\\nvdash',\n 0x22AD: '\\\\nvDash',\n 0x22AE: '\\\\nVdash',\n 0x22AF: '\\\\nVDash',\n 0x22B0: null,\n 0x22B1: null,\n 0x22B2: '\\\\vartriangleleft',\n 0x22B3: '\\\\vartriangleright',\n 0x22B4: '\\\\trianglelefteq',\n 0x22B5: '\\\\trianglerighteq',\n 0x22B6: null,\n 0x22B7: null,\n 0x22B8: '\\\\multimap',\n 0x22B9: null,\n 0x22BA: '\\\\intercal',\n 0x22BB: '\\\\veebar',\n 0x22BC: '\\\\barwedge',\n 0x22BD: null,\n 0x22BE: null,\n 0x22BF: null,\n 0x22C0: '\\\\wedge',\n 0x22C1: '\\\\vee',\n 0x22C2: '\\\\cap',\n 0x22C3: '\\\\cup',\n 0x22C4: '\\\\diamond',\n 0x22C5: '\\\\cdot',\n 0x22C6: '\\\\star',\n 0x22C7: null,\n 0x22C8: '\\\\bowtie',\n 0x22C9: '\\\\ltimes',\n 0x22CA: '\\\\rtimes',\n 0x22CB: '\\\\leftthreetimes',\n 0x22CC: '\\\\rightthreetimes',\n 0x22CD: '\\\\backsimeq',\n 0x22CE: '\\\\curlyvee',\n 0x22CF: '\\\\curlywedge',\n 0x22D0: '\\\\Subset',\n 0x22D1: '\\\\Supset',\n 0x22D2: '\\\\Cap',\n 0x22D3: '\\\\Cup',\n 0x22D4: '\\\\pitchfork',\n 0x22D5: '\\\\lessdot',\n 0x22D6: '\\\\gtrdot',\n 0x22D7: null,\n 0x22D8: '\\\\lll',\n 0x22D9: '\\\\ggg',\n 0x22DA: '\\\\lesseqgtr',\n 0x22DB: '\\\\gtreqless',\n 0x22DC: null,\n 0x22DD: null,\n 0x22DE: '\\\\curlyeqprec',\n 0x22DF: '\\\\curlyeqsucc',\n 0x22E0: null,\n 0x22E1: null,\n 0x22E2: null,\n 0x22E3: null,\n 0x22E4: null,\n 0x22E5: null,\n 0x22E6: '\\\\lnsim',\n 0x22E7: '\\\\gnsim',\n 0x22E8: '\\\\precnsim',\n 0x22E9: '\\\\succnsim',\n 0x22EA: '\\\\ntriangleleft',\n 0x22EB: '\\\\ntriangleright',\n 0x22EC: '\\\\ntrianglelefteq',\n 0x22ED: '\\\\ntrianglerighteq',\n 0x22EE: '\\\\vdots',\n 0x22EF: '\\\\cdots',\n 0x22F0: null,\n 0x22F1: '\\\\ddots',\n 0x22F2: null,\n 0x22F3: null,\n 0x22F4: null,\n 0x22F5: null,\n 0x22F6: null,\n 0x22F7: null,\n 0x22F8: null,\n 0x22F9: null,\n 0x22FA: null,\n 0x22FB: null,\n 0x22FC: null,\n 0x22FD: null,\n 0x22FE: null,\n 0x22FF: null,\n 0x27F7: \"\\\\longleftrightarrow\",\n 0x03B1: '\\\\alpha',\n 0x03B2: '\\\\beta',\n 0x03B3: '\\\\gamma',\n 0x03B4: '\\\\delta',\n 0x03B5: '\\\\epsilon',\n 0x03B6: '\\\\zeta',\n 0x03B7: '\\\\eta',\n 0x03B8: '\\\\theta',\n 0x03B9: '\\\\iota',\n 0x03BA: '\\\\kappa',\n 0x03BB: '\\\\lambda',\n 0x03BC: '\\\\mu',\n 0x03BD: '\\\\nu',\n 0x03BE: '\\\\xi',\n 0x03BF: 'o',\n 0x03C0: '\\\\pi',\n 0x03C1: '\\\\rho',\n 0x03C2: '\\\\varsigma',\n 0x03C3: '\\\\sigma',\n 0x03C4: '\\\\tau',\n 0x03C5: '\\\\upsilon',\n 0x03C6: '\\\\varphi',\n 0x03C7: '\\\\chi',\n 0x03C8: '\\\\psi',\n 0x03C9: '\\\\omega',\n 0x03D1: '\\\\vartheta',\n 0x03D5: '\\\\phi',\n 0x03D6: '\\\\varpi',\n 0x03F1: '\\\\varrho',\n 0x03F5: '\\\\epsilon',\n 0x0391: 'A',\n 0x0392: 'B',\n 0x0393: '\\\\Gamma',\n 0x0394: '\\\\Delta',\n 0x0395: 'E',\n 0x0396: 'Z',\n 0x0397: 'H',\n 0x0398: '\\\\Theta',\n 0x0399: 'I',\n 0x039A: 'K',\n 0x039B: '\\\\Lambda',\n 0x039C: 'M',\n 0x039D: 'N',\n 0x039E: '\\\\Xi',\n 0x039F: 'O',\n 0x03A0: '\\\\Pi',\n 0x03A1: 'P',\n 0x03A2: null,\n 0x03A3: '\\\\Sigma',\n 0x03A4: 'T',\n 0x03A5: '\\\\Upsilon',\n 0x03A6: '\\\\Phi',\n 0x03A7: 'X',\n 0x03A8: '\\\\Psi',\n 0x03A9: '\\\\Omega',\n 0x03F5: \"\\\\epsilon\",\n };\n function isAlphaCharCode(c) {\n return (\n c >= 65 && c <= 90 ||\n c >= 97 && c <= 122\n );\n }\n\n function isNumericCharCode(c) {\n return c >= 48 && c <= 57;\n }\n\n function start(options) {\n // Start scanning for one token.\n if (!options) {\n options = {};\n }\n let c;\n lexeme = '';\n let t;\n while (curIndex < src.length) {\n let tk;\n c = src.charCodeAt(curIndex++);\n if (c === 0xD835) {\n // Normalize varepsilon surrogate pair.\n if (src.charCodeAt(curIndex++) === 0xDEC6) {\n c = 0x03B5;\n } else {\n assert(false, message(1004, [String.fromCharCode(c), c]));\n }\n }\n switch (c) {\n case 32: // space\n case 9: // tab\n case 10: // new line\n case 13: // carriage return\n case 0x00A0: // non-breaking space (&nbsp;)\n case 0x200B: // zero width space\n continue;\n case 38: // ampersand (new column or entity)\n if (src.substring(curIndex).indexOf('nbsp;') === 0) {\n // Skip &nbsp;\n curIndex += 5;\n continue;\n }\n return TK_NEWCOL;\n case 92: // backslash\n lexeme += String.fromCharCode(c);\n switch (src.charCodeAt(curIndex)) {\n case 92:\n curIndex++;\n return TK_NEWROW; // double backslash = new row\n case 123: // left brace\n curIndex++;\n return TK_LEFTBRACESET;\n case 124: // vertical bar\n curIndex++;\n return TK_VERTICALBAR;\n case 125: // right brace\n curIndex++;\n return TK_RIGHTBRACESET;\n default:\n break;\n }\n tk = latex();\n if (tk !== null) {\n return tk;\n }\n lexeme = '';\n continue; // whitespace\n case 42: // asterisk\n case 0x2217:\n if (src.charCodeAt(curIndex) === 42) { // ** => ^\n curIndex++;\n return TK_CARET;\n }\n return TK_TIMES;\n case 45: // dash\n case 0x2212: // unicode minus\n if (src.charCodeAt(curIndex) === 62) {\n curIndex++;\n return TK_RIGHTARROW;\n }\n return TK_SUB;\n case 47: // slash\n case 0x2215:\n return TK_SLASH;\n case 33: // bang, exclamation point\n if (src.charCodeAt(curIndex) === 61) { // equals\n curIndex++;\n return TK_NE;\n }\n return c; // char code is the token id\n case 58: // colon\n case 0x2236:\n return TK_COLON;\n case 59: // semicolon\n return TK_SEMICOLON;\n case 37: // percent\n case 40: // left paren\n case 41: // right paren\n case 43: // plus\n case 44: // comma\n case 61: // equal\n case 63: // question mark\n case 91: // left bracket\n case 93: // right bracket\n case 94: // caret\n case 95: // underscore\n case 123: // left brace\n case 124: // vertical bar\n case 125: // right brace\n lexeme += String.fromCharCode(c);\n return c; // char code is the token id\n case 36: // dollar\n lexeme += String.fromCharCode(c);\n return TK_VAR;\n case 39: // prime (single quote)\n return prime(c);\n case 60: // left angle\n if (src.charCodeAt(curIndex) === 61) { // equals\n curIndex++;\n return TK_LE;\n }\n return TK_LT;\n case 62: // right angle\n if (src.charCodeAt(curIndex) === 61) { // equals\n curIndex++;\n return TK_GE;\n }\n return TK_GT;\n default:\n if (isAlphaCharCode(c) ||\n c === CC_SINGLEQUOTE) {\n return variable(c);\n } if ((t = unicodeToLaTeX[c])) {\n lexeme = t;\n tk = lexemeToToken[lexeme];\n if (tk === undefined) {\n tk = TK_VAR; // e.g. \\\\theta\n }\n return tk;\n } if (matchDecimalSeparator(String.fromCharCode(c)) ||\n isNumberCharCode(c)) {\n if (options.oneCharToken) {\n lexeme += String.fromCharCode(c);\n return TK_NUM;\n }\n return number(c);\n }\n assert(false, message(1004, [String.fromCharCode(c), c]));\n return 0;\n }\n }\n return 0;\n }\n // Recognize 1, 1.2, 0.3, .3, 1\\ 234.00\n let lastSeparator;\n function number(c) {\n let match;\n while (isNumberCharCode(c) ||\n matchDecimalSeparator(String.fromCharCode(c)) ||\n (match = matchThousandsSeparator(String.fromCharCode(c), lastSeparator))) {\n lastSeparator = match || lastSeparator; // Remember the last separator.\n // While the next char is a num.\n lexeme += String.fromCharCode(c);\n c = src.charCodeAt(curIndex++);\n if (c === 92 && src.charCodeAt(curIndex) === 32) {\n // We have an explicit space. Remember it in case it is a decimal separator.\n // Convert '\\ ' to ' '.\n c = 32;\n curIndex++;\n }\n if (matchDecimalSeparator(String.fromCharCode(c)) ||\n (match = matchThousandsSeparator(String.fromCharCode(c), lastSeparator))) {\n lastSeparator = match || lastSeparator; // Remember the last separator.\n // Erase whitespace after punctuation.\n lexeme += String.fromCharCode(c);\n c = src.charCodeAt(curIndex++);\n while (c === 92 && (c = src.charCodeAt(curIndex)) === 32 && curIndex++ ||\n isWhitespaceCharCode(c)) {\n // Eat all the whitespace until the next non-whitespace character.\n c = src.charCodeAt(curIndex++);\n }\n }\n if (c === 92 && src.charCodeAt(curIndex) === 32) {\n // We have an explicit space. Remember it in case it is a decimal separator.\n // Convert '\\ ' to ' '.\n c = 32;\n curIndex++;\n }\n }\n if (lexeme === '.' &&\n (src.substring(curIndex).indexOf('overline') === 0 ||\n src.substring(curIndex).indexOf('dot') === 0)) {\n // .\\overline --> 0.\\overline\n // .\\dot --> 0.\\dot\n lexeme = '0.';\n }\n curIndex--;\n return TK_NUM;\n }\n // Recognize x, cm, kg.\n function variable(c) {\n // Normal variables are a single character, but we treat units as\n // variables too so we need to scan the whole unit string as a variable\n // name.\n let ch = String.fromCharCode(c);\n lexeme += ch;\n let identifier = lexeme;\n const startIndex = curIndex + 1;\n while (isAlphaCharCode(c) || c === CC_SINGLEQUOTE) {\n // All single character names are valid variable lexemes. Now we check\n // for longer match against env names. The longest one wins.\n c = src.charCodeAt(curIndex++);\n if (!isAlphaCharCode(c)) {\n // Past end of identifier.\n break;\n }\n ch = String.fromCharCode(c);\n const match = identifiers.some((u) => {\n const ident = identifier + ch;\n // Check of not an explicit variable and has a prefix that is a unit.\n return u.indexOf(ident) === 0;\n });\n if (!match) {\n // No match, so we know it is not a unit, so bail.\n break;\n }\n identifier += ch;\n }\n if (identifiers.indexOf(identifier) >= 0) {\n // Found an identifier, so make it the lexeme.\n lexeme = identifier;\n } else {\n // Reset curIndex.\n curIndex = startIndex;\n }\n // Group primes into a single var.\n while (lexeme.lastIndexOf('\\'') === lexeme.length - 1 && c === CC_SINGLEQUOTE) {\n lexeme += String.fromCharCode(c);\n c = src.charCodeAt(curIndex++);\n }\n curIndex--;\n return TK_VAR;\n }\n function latex() {\n let c = src.charCodeAt(curIndex++);\n if (c === CC_DOLLAR) {\n // don't include \\\n lexeme = String.fromCharCode(c);\n } else if (c === CC_PERCENT) {\n lexeme += String.fromCharCode(c);\n } else if ([\n CC_SPACE,\n CC_COLON,\n CC_SEMICOLON,\n CC_COMMA,\n CC_BANG].indexOf(c) >= 0) {\n lexeme = '\\\\ ';\n } else {\n while (isAlphaCharCode(c)) {\n lexeme += String.fromCharCode(c);\n c = src.charCodeAt(curIndex++);\n }\n lexeme = lexeme === '\\\\varepsilon' && '\\\\epsilon' || lexeme;\n curIndex--;\n }\n let tk = lexemeToToken[lexeme];\n if (tk === undefined) {\n if (lexeme === '\\\\emptyset') {\n lexeme = '\\\\varnothing';\n }\n tk = TK_VAR; // e.g. \\\\theta\n } else if (tk === TK_OPERATORNAME) {\n c = src.charCodeAt(curIndex++);\n // Skip whitespace before '{'\n while (c && c !== CC_LEFTBRACE) {\n c = src.charCodeAt(curIndex++);\n }\n lexeme = '';\n c = src.charCodeAt(curIndex++);\n while (c && c !== CC_RIGHTBRACE) {\n const ch = String.fromCharCode(c);\n if (ch === '&' && src.substring(curIndex).indexOf('nbsp;') === 0) {\n // Skip &nbsp;\n curIndex += 5;\n } else if (ch === ' ' || ch === '\\t') {\n // Skip space and tab\n } else {\n lexeme += ch;\n }\n c = src.charCodeAt(curIndex++);\n }\n tk = lexemeToToken[`\\\\${lexeme}`];\n if (tk === undefined) {\n tk = TK_OPERATORNAME;\n }\n } else if (tk === TK_TEXT || tk === TK_TYPE) {\n c = src.charCodeAt(curIndex++);\n // Skip whitespace before '{'\n while (c && c !== CC_LEFTBRACE) {\n c = src.charCodeAt(curIndex++);\n }\n lexeme = '';\n c = src.charCodeAt(curIndex++);\n const keepTextWhitespace = Model.option(options, 'keepTextWhitespace');\n while (c && c !== CC_RIGHTBRACE) {\n const ch = String.fromCharCode(c);\n if (!keepTextWhitespace && ch === '&' && src.substring(curIndex).indexOf('nbsp;') === 0) {\n // Skip &nbsp;\n curIndex += 5;\n } else if (!keepTextWhitespace && (ch === ' ' || ch === '\\t')) {\n // Skip space and tab\n } else {\n lexeme += ch;\n }\n c = src.charCodeAt(curIndex++);\n }\n if (tk !== TK_TYPE) {\n if (!lexeme || Model.option(options, 'ignoreText')) {\n tk = null; // Treat as whitespace.\n } else {\n tk = TK_TEXT;\n }\n }\n } else if (tk === TK_INFTY) {\n tk = TK_NUM;\n }\n return tk;\n }\n function prime(c) {\n assert(c === 39);\n lexeme = '\\'';\n while (src.charCodeAt(curIndex) === 39) {\n curIndex++;\n lexeme += '\\'';\n }\n return TK_VAR;\n }\n // Return a scanner object.\n return {\n start,\n lexeme() {\n return lexeme;\n },\n pos() {\n return curIndex;\n },\n };\n }\n };\n return Model;\n})();\n","import {Model} from './src/model.js';\nimport * as ast from './src/ast.js';\nexport const Ast = ast.Ast;\nexport const Parser = Model;\n","/*\n * Copyright 2013 Art Compiler LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*\n ASSERTS AND MESSAGES\n\n We use the 'assert()' function to trap invalid states of all kinds. External\n messages are distinguished from internal messages by a numeric prefix that\n indicates the error code associated with the message. For example, the\n following two asserts implement an internal and external assert, respectively.\n\n assert(false, \"This code is broken.\");\n assert(false, \"1001: Invalid user input.\");\n\n To aid in the writing of external messages, we keep them in a single global\n table named 'Assert.messages'. Each module adds to this table its own messages\n with an expression such as\n\n messages[1001] = \"Invalid user input.\";\n\n These messages are accessed with the 'message' function as such\n\n message(1001);\n\n Calling 'assert' with 'message' looks like\n\n assert(x != y, message(1001));\n\n ALLOCATING ERROR CODES\n\n In order to avoid error code conflicts, each module claims a range of values\n that is not already taken by the modules in the same system. A module claims\n a range of codes by calling the function reserveCodeRange() like this:\n\n reserveCodeRange(1000, 1999, \"mymodule\");\n\n If the requested code range has any values that are already reserved, then\n an assertion is raised.\n\n USAGE\n\n In general, only allocate message codes for external asserts. For internal\n asserts, it is sufficient to simply inline the message text in the assert\n expression.\n\n It is good to write an assert for every undefined state, regardless of whether\n it is the result of external input or not. Asserts can then be externalized if\n and when they it is clear that they are the result of external input.\n\n A client module can override the messages provided by the libraries it uses by\n simply redefining those messages after the defining library is loaded. That is,\n the client can copy and past the statements of the form\n\n messages[1001] = \"Invalid user input.\";\n\n and provide new text for the message.\n\n messages[1001] = \"Syntax error.\";\n\n In the same way different sets of messages can be overridden for the purpose\n of localization.\n\n*/\n\nconst ASSERT = true;\nexport const assert = (\n !ASSERT ? () => {} :\n (val, str, location) => {\n if (str === undefined) {\n str = 'failed!';\n }\n if (!val) {\n const err = new Error(str);\n err.location = location || Assert.location;\n throw err;\n }\n });\n\nexport const message = (errorCode, args) => {\n let str = Assert.messages[errorCode];\n if (args) {\n args.forEach((arg, i) => {\n str = str.replace(`%${i + 1}`, arg);\n });\n }\n return `${errorCode}: ${str}`;\n};\n\nexport const reserveCodeRange = (first, last, moduleName) => {\n assert(first <= last, 'Invalid code range');\n const noConflict = Assert.reservedCodes.every((range) => last < range.first || first > range.last);\n assert(noConflict, 'Conflicting request for error code range');\n Assert.reservedCodes.push({ first, last, name: moduleName });\n};\n\nexport const setLocation = (location) => {\n // assert(location, \"Empty location\");\n Assert.location = location;\n};\n\nexport const clearLocation = () => {\n Assert.location = null;\n};\n\nconst setTimeout = (timeout, message) => {\n if (timeout === undefined) {\n return undefined;\n }\n Assert.timeout = timeout ? Date.now() + timeout : 0;\n Assert.timeoutMessage = message || 'ERROR timeout exceeded';\n return undefined;\n};\n\nconst checkTimeout = () => {\n assert(!Assert.timeout || Assert.timeout > Date.now(), Assert.timeoutMessage);\n};\n\nexport const setCounter = (count, message) => {\n Assert.count = count;\n Assert.countMessage = message || 'ERROR count exceeded';\n};\n\nexport const checkCounter = () => {\n const { count } = Assert;\n if (typeof count !== 'number' || Number.isNaN(count)) {\n assert(false, 'ERROR counter not set');\n return;\n }\n assert(Assert.count--, Assert.countMessage);\n};\n\nexport const Assert = {\n assert,\n message,\n messages: {},\n reserveCodeRange,\n reservedCodes: [],\n setLocation,\n clearLocation,\n checkTimeout,\n setTimeout,\n setCounter,\n checkCounter,\n};\n","// GENERATED — do not edit.\n//\n// Authored in L0014 as packages/core/spec/latex-to-latex.gc and written here by\n// its tools/emit-translatex-rules.mjs. L0014 is a port of L120, the language\n// this rule set was originally written in.\n//\n// Regenerate: cd ../l0014 && node packages/core/tools/emit-translatex-rules.mjs\n// Verify: cd ../l0014 && node packages/core/tools/emit-translatex-rules.mjs --check\nexport const rules={\"data\":{},\"words\":{\"\\\\alpha\":\"\\\\alpha\",\"\\\\beta\":\"\\\\beta\",\"\\\\gamma\":\"\\\\gamma\",\"\\\\delta\":\"\\\\delta\",\"\\\\epsilon\":\"\\\\epsilon\",\"\\\\zeta\":\"\\\\zeta\",\"\\\\eta\":\"\\\\eta\",\"\\\\theta\":\"\\\\theta\",\"\\\\iota\":\"\\\\iota\",\"\\\\kappa\":\"\\\\kappa\",\"\\\\lambda\":\"\\\\lambda\",\"\\\\mu\":\"\\\\mu\",\"\\\\nu\":\"\\\\nu\",\"\\\\xi\":\"\\\\xi\",\"\\\\omicron\":\"\\\\omicron\",\"\\\\pi\":\"\\\\pi\",\"\\\\rho\":\"\\\\rho\",\"\\\\sigma\":\"\\\\simga\",\"\\\\tau\":\"\\\\tau\",\"\\\\upsilon\":\"\\\\upsilon\",\"\\\\phi\":\"\\\\phi\",\"\\\\chi\":\"\\\\chi\",\"\\\\psi\":\"\\\\psi\",\"\\\\omega\":\"\\\\omega\",\"\\\\Alpha\":\"\\\\Alpha\",\"\\\\Beta\":\"\\\\Beta\",\"\\\\Gamma\":\"\\\\Gamma\",\"\\\\Delta\":\"\\\\Delta\",\"\\\\Epsilon\":\"\\\\Epsilon\",\"\\\\Zeta\":\"\\\\Zeta\",\"\\\\Eta\":\"\\\\Eta\",\"\\\\Theta\":\"\\\\Theta\",\"\\\\Iota\":\"\\\\Iota\",\"\\\\Kappa\":\"\\\\Kappa\",\"\\\\Lambda\":\"\\\\Lambda\",\"\\\\Mu\":\"\\\\Mu\",\"\\\\Nu\":\"\\\\Nu\",\"\\\\Xi\":\"\\\\Xi\",\"\\\\Omicron\":\"\\\\Omicron\",\"\\\\Pi\":\"\\\\Pi\",\"\\\\Rho\":\"\\\\Rho\",\"\\\\Sigma\":\"\\\\Simga\",\"\\\\Tau\":\"\\\\Tau\",\"\\\\Upsilon\":\"\\\\Upsilon\",\"\\\\Phi\":\"\\\\Phi\",\"\\\\Chi\":\"\\\\Chi\",\"\\\\Psi\":\"\\\\Psi\",\"\\\\Omega\":\"\\\\Omega\",\"\\\\emptyset\":\"\\\\emptyset\"},\"types\":{\"numberPosNeg\":[\"(\\\\type{numberPosNeg})\",\"\\\\type{number}\",\"-\\\\type{number}\"]},\"rules\":{\"\\\\left(?\\\\right]\":[\"\\\\left(%1\\\\right]\"],\"\\\\left[?\\\\right)\":[\"\\\\left[%1\\\\right)\"],\"\\\\left[?\\\\right]\":[\"\\\\left[%1\\\\right]\"],\"\\\\left\\\\{?\\\\right\\\\}\":[\"\\\\left\\\\{%1\\\\right\\\\}\"],\"?\\\\cup?\":[\"%1\\\\cup %2\"],\"?\\\\cap?\":[\"%1\\\\cap %2\"],\"?\\\\backslash?\":[\"%1\\\\backslash %2\"],\"\\\\mathbb{?}\":[\"\\\\mathbb{%2}\"],\"\\\\ln{?}\":[\"\\\\ln{%2}\"],\"\\\\log{?}\":[\"\\\\log{%2}\"],\"\\\\log_{?}{?}\":[\"\\\\log_{%1}{%2}\"],\"\\\\type{matrix}\":[{\"\\\\begin{bmatrix}%1\\\\end{bmatrix}\":{\"\\\\type{row}\":\"%*\\\\\\\\\",\"\\\\type{column}\":\"%*&\"}}],\"\\\\frac{d}{d?}?\":[\"\\\\frac{d}{d%2}{%1}\"],\"\\\\frac{d^?}{d?^?}?\":[\"\\\\frac{d^%3}{d%2^%3}{%1}\"],\"\\\\int_?^? ? d?\":[\"\\\\int_{%1}^{%2} %3 d%4\"],\"\\\\int ? d?\":[\"\\\\int %1 d%2\"],\"\\\\lim_? ?\":[{\"\\\\lim_{%1}{%2}\":{\"? \\\\rightarrow ?\":\"%1 \\\\rightarrow %2\",\"? \\\\to ?\":\"%1 \\\\to %2\",\"\\\\left(?,?\\\\right)\":\"\\\\left(%1, %2\\\\right)\"}}],\"\\\\sum_?^? ?\":[\"\\\\sum_{%1}^{%2}{%3}\"],\"\\\\sin{?}\":[\"\\\\sin{%1}\"],\"\\\\cos{?}\":[\"\\\\cos{%1}\"],\"\\\\tan{?}\":[\"\\\\tan{%1}\"],\"\\\\cot{?}\":[\"\\\\cot{%1}\"],\"\\\\sec{?}\":[\"\\\\sec{%1}\"],\"\\\\csc{?}\":[\"\\\\csc{%1}\"],\"\\\\sin^{-1}?\":[\"\\\\sin^{-1}{%1}\"],\"\\\\cos^{-1}{?}\":[\"\\\\cos^{-1}{%1}\"],\"\\\\tan^{-1}{?}\":[\"\\\\tan^{-1}{%1}\"],\"\\\\cot^{-1}{?}\":[\"\\\\cot^{-1}{%1}\"],\"\\\\sec^{-1}{?}\":[\"\\\\sec^{-1}{%1}\"],\"\\\\csc^{-1}{?}\":[\"\\\\csc^{-1}{%1}\"],\"\\\\sinh{?}\":[\"\\\\sinh{%1}\"],\"\\\\cosh{?}\":[\"\\\\cosh{%1}\"],\"\\\\tanh{?}\":[\"\\\\tanh{%1}\"],\"\\\\coth{?}\":[\"\\\\coth{%1}\"],\"\\\\sech{?}\":[\"\\\\sech{%1}\"],\"\\\\csch{?}\":[\"\\\\csch{%1}\"],\"\\\\sinh^{-1}{?}\":[\"\\\\sinh^{-1}{%1}\"],\"\\\\cosh^{-1}{?}\":[\"\\\\cosh^{-1}{%1}\"],\"\\\\tanh^{-1}{?}\":[\"\\\\tanh^{-1}{%1}\"],\"\\\\coth^{-1}{?}\":[\"\\\\coth^{-1}{%1}\"],\"\\\\sech^{-1}{?}\":[\"\\\\sech^{-1}{%1}\"],\"\\\\csch^{-1}{?}\":[\"\\\\csch^{-1}{%1}\"],\"?<?\":[\"%1<%2\"],\"?\\\\nless?\":[\"%1\\\\nless %2\"],\"?\\\\le?\":[\"%1\\\\le %2\"],\"?>?\":[\"%1>%2\"],\"?\\\\ge?\":[\"%1\\\\ge %2\"],\"?\\\\ngtr?\":[\"%1\\\\ngtr %2\"],\"?=?\":[\"%1=%2\"],\"?\\\\ne?\":[\"%1\\\\ne %2\"],\"?\\\\approx?\":[\"%1\\\\approx %2\"],\"\\\\infty\":[\"\\\\infty\"],\"\\\\type{mixedNumber}\":[\"%1%2\"],\"?%\":[\"{%1}%\"],\"?!\":[\"{%1}!\"],\"\\\\frac{?}{?}\":[\"\\\\frac{%1}{%2}\"],\"\\\\abs{?}\":[\"\\\\abs{%1}\"],\"?\\\\degree\":[\"{%1}\\\\degree\"],\"\\\\type{fraction}^?\":[\"\\\\left(%1\\\\right)^{%2}\"],\"{-?}^?\":[\"\\\\left(%1\\\\right)^{%2}\"],\"?^?\":[\"{%1}^{%2}\"],\"\\\\sqrt{?}\":[\"\\\\sqrt{%1}\"],\"\\\\sqrt[?]{?}\":[\"\\\\sqrt[%2]{%1}\"],\"-?\":[\"-%1\"],\"?+{-?}\":[\"%1+\\\\left(%2\\\\right)\"],\"?+?\":[\"%1+%2\"],\"?-{-?}\":[\"%1-\\\\left(%2\\\\right)\"],\"?-?\":[\"%1-%2\"],\"?*{-?}\":[\"%1\\\\times\\\\left(%2\\\\right)\"],\"?*?\":[\"%1\\\\times %2\"],\"?\\\\cdot{-?}\":[\"%1\\\\cdot\\\\left(%2\\\\right)\"],\"?\\\\cdot?\":[\"%1\\\\cdot %2\"],\"?\\\\div?\":[\"%1\\\\div %2\"],\"?:?\":[\"%1:%2\"],\"?_?\":[\"%1_{%2}\"],\"\\\\left(?\\\\right)\":[\"\\\\left(%1\\\\right)\"],\"{\\\\type{numberPosNeg}}{\\\\type{numberPosNeg}}\":[\"(%1)(%2)\"],\"? ?\":[\"%1 %2\"],\"?,?\":[\"%1,%2\"],\"?\":[\"%1\"]},\"allowInterval\":true,\"parsingIntegralExpr\":false,\"RHS\":false}","/*\n * Copyright 2021 ARTCOMPILER INC. All Rights Reserved.\n *\n */\nimport { Ast, Parser } from '@graffiticode/parselatex';\nimport { Assert, assert, message } from './assert.js';\nimport { rules } from './rules.js';\n\n(function (ast) {\n\n function newNode(op, args) {\n return {\n op,\n args,\n };\n }\n\n function binaryNode(op, args) {\n if (args.length > 1) {\n return { op, args };\n }\n return args[0];\n }\n\n const getExpanderBuilderConfig = (template, expanderBuilders) => {\n const configIndex = template.indexOf('{');\n const expanderName = (configIndex > 0 && template.slice(0, configIndex) || template).trim();\n assert(expanderBuilders && expanderBuilders[expanderName]);\n const expanderConfig = configIndex > 0 && template.slice(configIndex);\n // Special handling for $fmt expander - don't parse as JSON\n if (expanderName === '$fmt') {\n return { rawConfig: expanderConfig };\n }\n return expanderConfig && JSON.parse(expanderConfig) || {};\n };\n\n // The outer Visitor function provides a global scope for all visitors,\n // as well as dispatching to methods within a visitor.\n function Visitor(ast) {\n function visit(options, node, visit, resume) {\n assert(node.op && node.args, `Visitor.visit() op=${node.op} args = ${node.args}`);\n switch (node.op) {\n case Parser.NUM:\n node = visit.numeric(node, resume);\n break;\n case Parser.ADD:\n case Parser.SUB:\n case Parser.PM:\n case Parser.BACKSLASH: // set operator\n case Parser.DIV:\n case Parser.FRAC:\n case Parser.BINOM:\n case Parser.LOG:\n case Parser.COLON:\n case Parser.FUNC:\n case Parser.TYPE:\n case Parser.SUBSCRIPT:\n if (node.args.length === 1) {\n node = visit.unary(node, resume);\n } else {\n node = visit.binary(node, resume);\n }\n break;\n case Parser.MUL:\n case Parser.TIMES:\n case Parser.COEFF:\n case Parser.CDOT:\n node = visit.multiplicative(node, resume);\n break;\n case Parser.POW:\n node = visit.exponential(node, resume);\n break;\n case Parser.VAR:\n node = visit.variable(node, resume);\n break;\n case Parser.SQRT:\n case Parser.SIN:\n case Parser.COS:\n case Parser.TAN:\n case Parser.SEC:\n case Parser.CSC:\n case Parser.COT:\n case Parser.ARCSIN:\n case Parser.ARCCOS:\n case Parser.ARCTAN:\n case Parser.ARCSEC:\n case Parser.ARCCSC:\n case Parser.ARCCOT:\n case Parser.SINH:\n case Parser.COSH:\n case Parser.TANH:\n case Parser.ARCSINH:\n case Parser.ARCCOSH:\n case Parser.ARCTANH:\n case Parser.ARCSECH:\n case Parser.ARCCSCH:\n case Parser.ARCCOTH:\n case Parser.SECH:\n case Parser.CSCH:\n case Parser.COTH:\n case Parser.PERCENT:\n case Parser.M:\n case Parser.ABS:\n case Parser.FACT:\n case Parser.FORALL:\n case Parser.EXISTS:\n case Parser.IN:\n case Parser.SUM:\n case Parser.LIM:\n case Parser.EXP:\n case Parser.TO:\n case Parser.DERIV:\n case Parser.INTEGRAL:\n case Parser.PROD:\n case Parser.CUP:\n case Parser.BIGCUP:\n case Parser.CAP:\n case Parser.BIGCAP:\n case Parser.PIPE:\n case Parser.ION:\n case Parser.OVERLINE:\n case Parser.OVERSET:\n case Parser.UNDERSET:\n case Parser.MATHBF:\n case Parser.TEXT:\n case Parser.NONE:\n case Parser.DEGREE:\n case Parser.DOT:\n case Parser.MATHFIELD:\n case Parser.SET:\n case Parser.NOT:\n case Parser.OPERATORNAME:\n node = visit.unary(node, resume);\n break;\n case Parser.COMMA:\n case Parser.MATRIX:\n case Parser.VEC:\n case Parser.ROW:\n case Parser.COL:\n case Parser.LIST:\n case Parser.ANGLEBRACKET:\n node = visit.comma(node, resume);\n break;\n case Parser.EQL:\n case Parser.LT:\n case Parser.LE:\n case Parser.GT:\n case Parser.GE:\n case Parser.NE:\n case Parser.NGTR:\n case Parser.NLESS:\n case Parser.NI:\n case Parser.SUBSETEQ:\n case Parser.SUPSETEQ:\n case Parser.SUBSET:\n case Parser.SUPSET:\n case Parser.NNI:\n case Parser.NSUBSETEQ:\n case Parser.NSUPSETEQ:\n case Parser.NSUBSET:\n case Parser.NSUPSET:\n case Parser.APPROX:\n case Parser.IMPLIES:\n case Parser.PERP:\n case Parser.PROPTO:\n case Parser.PARALLEL:\n case Parser.NPARALLEL:\n case Parser.SIM:\n case Parser.CONG:\n case Parser.CAPRIGHTARROW:\n case Parser.RIGHTARROW:\n case Parser.LEFTARROW:\n case Parser.LONGRIGHTARROW:\n case Parser.LONGLEFTARROW:\n case Parser.OVERRIGHTARROW:\n case Parser.OVERLEFTARROW:\n case Parser.CAPLEFTRIGHTARROW:\n case Parser.LEFTRIGHTARROW:\n case Parser.LONGLEFTRIGHTARROW:\n case Parser.OVERLEFTRIGHTARROW:\n node = visit.equals(node, resume);\n break;\n case Parser.PAREN:\n case Parser.BRACKET:\n case Parser.BRACE:\n case Parser.INTERVAL:\n case Parser.INTERVALOPEN:\n case Parser.INTERVALLEFTOPEN:\n case Parser.INTERVALRIGHTOPEN:\n node = visit.paren(node);\n break;\n default:\n if (visit.name !== 'normalizeLiteral' &&\n visit.name !== 'sort') {\n node = newNode(Parser.VAR, [`INTERNAL ERROR Should not get here. Unhandled node operator ${node.op}`]);\n }\n break;\n }\n return node;\n }\n function lookup(options, word) {\n if (!word) {\n return '';\n }\n const words = Parser.option(options, 'words');\n let val;\n if (words) {\n val = words[word.toLowerCase()];\n }\n if (!val) {\n val = word;\n if (val.charAt(0) === '\\\\') {\n val = val.substring(1);\n }\n }\n return val;\n }\n function normalizeFormatObject(fmt) {\n // Normalize the fmt object to an array of objects\n let list = [];\n switch (fmt.op) {\n case Parser.VAR:\n list.push({\n code: fmt.args[0],\n });\n break;\n case Parser.MUL:\n {\n let code = '';\n let length; // undefined and zero have different meanings.\n fmt.args.forEach((f) => {\n if (f.op === Parser.VAR) {\n code += f.args[0];\n } else if (f.op === Parser.NUM) {\n length = +f.args[0];\n }\n });\n list.push({\n code,\n length,\n });\n }\n break;\n case Parser.COMMA:\n fmt.args.forEach((f) => {\n list = list.concat(normalizeFormatObject(f));\n });\n break;\n default:\n break;\n }\n return list;\n }\n function parseFormatPattern(pattern) {\n // Normalize the fmt object to an array of objects\n const [name, arg] = pattern.split('[');\n return {\n name,\n arg: arg && arg.substring(0, arg.indexOf(']')) || undefined,\n };\n }\n function checkNumberType(fmt, node) {\n const fmtList = normalizeFormatObject(fmt);\n return fmtList.some((f) => {\n const code = f.code;\n const length = f.length;\n switch (code) {\n case 'integer':\n if (node.numberFormat === 'integer') {\n if (length === undefined || length === node.args[0].length) {\n // If there is no size or if the size matches the value...\n return true;\n }\n }\n break;\n case 'decimal':\n if (node.numberFormat === 'decimal' &&\n node.isRepeating) {\n if (length === undefined) {\n return true;\n }\n // Repeating is infinite.\n return false;\n\n }\n if (node.numberFormat === 'decimal') {\n if (length === undefined ||\n length === 0 && node.args[0].indexOf('.') === -1 ||\n length === node.args[0].substring(node.args[0].indexOf('.') + 1).length) {\n // If there is no size or if the size matches the value...\n return true;\n }\n }\n break;\n case 'repeatingDecimal':\n if (node.numberFormat === 'decimal' &&\n node.isRepeating) {\n assert(!length, 'The repeatingDecimal pattern does not take a length');\n return true;\n }\n return false;\n case 'number':\n if (node.numberFormat === 'decimal' &&\n node.isRepeating) {\n if (length === undefined) {\n return true;\n }\n // Repeating is infinite.\n return false;\n\n }\n if (node.numberFormat === 'integer' ||\n node.numberFormat === 'decimal') {\n const brk = node.args[0].indexOf('.');\n if (length === undefined ||\n length === 0 && brk === -1 ||\n brk >= 0 && length === node.args[0].substring(brk + 1).length) {\n // If there is no size or if the size matches the value...\n return true;\n }\n }\n break;\n case 'scientific':\n if (node.isScientific) {\n const coeff = node.args[0].args[0];\n if (length === undefined ||\n length === 0 && coeff.indexOf('.') === -1 ||\n length === coeff.substring(coeff.indexOf('.') + 1).length) {\n // If there is no size or if the size matches the value...\n return true;\n }\n }\n break;\n case 'fraction':\n if (node.isFraction ||\n node.isMixedNumber) {\n return true;\n }\n break;\n case 'simpleFraction':\n case 'nonMixedFraction': // deprecated\n if (node.isFraction) {\n return true;\n }\n break;\n case 'mixedFraction': // deprecated\n case 'mixedNumber':\n if (node.isMixedNumber) {\n return true;\n }\n break;\n case 'fractionOrDecimal':\n if (node.isFraction ||\n node.isMixedNumber ||\n node.numberFormat === 'decimal') {\n return true;\n }\n break;\n default:\n assert(false, message(2015, [code]));\n break;\n }\n return false;\n });\n }\n function checkMatrixType(fmt, node) {\n const fmtList = normalizeFormatObject(fmt);\n return fmtList.some((f) => {\n const code = f.code;\n switch (code) {\n case 'simpleSmallRowMatrix':\n case 'smallRowMatrix':\n return node.op === Parser.MATRIX && node.m === 1 && node.n < 4;\n case 'simpleSmallColumnMatrix':\n case 'smallColumnMatrix':\n return node.op === Parser.MATRIX && node.m < 4 && node.n === 1;\n case 'simpleSmallMatrix':\n case 'smallMatrix':\n return node.op === Parser.MATRIX && node.m < 4 && node.n < 4;\n case 'matrix':\n return node.op === Parser.MATRIX;\n case 'row':\n return node.op === Parser.ROW;\n case 'column':\n return node.op === Parser.COL;\n default:\n return false;\n }\n });\n }\n\n function checkPolynomialType(pattern, node) {\n const fmt = parseFormatPattern(pattern);\n const name = fmt.name;\n const arg = fmt.arg;\n switch (name) {\n case 'polynomial':\n if (arg) {\n if (arg.indexOf('>') === 0) {\n const n = parseInt(arg.substring(1), 10);\n return node.isPolynomial > n;\n }\n const n = parseInt(arg, 10);\n return node.isPolynomial > n;\n }\n return node.isPolynomial;\n default:\n return false;\n }\n }\n\n function isSimpleExpression(node) {\n if (node.op === Parser.NUM ||\n node.op === Parser.VAR ||\n typeof node === 'string') {\n return true;\n }\n return false;\n }\n function hasSimpleExpressions(node) {\n assert(node.op === Parser.MATRIX || node.op === Parser.ROW || node.op === Parser.COL);\n return node.args.every((n) => {\n if (n.op === Parser.MATRIX || n.op === Parser.ROW || n.op === Parser.COL) {\n return hasSimpleExpressions(n);\n }\n return isSimpleExpression(n);\n });\n }\n function matchType(options, pattern, node) {\n if (pattern.op === Parser.TYPE &&\n pattern.args[0].op === Parser.VAR) {\n let name = pattern.args[0].args[0];\n name = name.indexOf('[') > 0 && name.slice(0, name.indexOf('[')) || name;\n switch (name) {\n case 'number':\n case 'integer':\n case 'decimal':\n case 'scientific':\n case 'fraction':\n case 'simpleFraction':\n case 'mixedFraction': // deprecated\n case 'mixedNumber':\n case 'fractionOrDecimal':\n case 'repeatingDecimal':\n return checkNumberType(pattern.args[0], node);\n case 'variable':\n return node.op === Parser.VAR;\n case 'simpleSmallRowMatrix':\n case 'simpleSmallColumnMatrix':\n case 'simpleSmallMatrix':\n return checkMatrixType(pattern.args[0], node) && hasSimpleExpressions(node);\n case 'smallRowMatrix':\n case 'smallColumnMatrix':\n case 'smallMatrix':\n case 'matrix':\n case 'row':\n case 'column':\n return checkMatrixType(pattern.args[0], node);\n case 'polynomial':\n return checkPolynomialType(pattern.args[0].args[0], node);\n default:\n {\n const types = Parser.option(options, 'types');\n const type = types[name];\n if (type) {\n assert(type instanceof Array);\n return type.some((pattern) => {\n // FIXME pre-compile types.\n const matches = match(options, [Parser.create(options, pattern)], node);\n return matches.length > 0;\n });\n }\n }\n }\n return false;\n } if (pattern.op === Parser.COLON &&\n pattern.args[0].op === Parser.VAR && pattern.args[0].args[0] === '?') {\n // This is a legacy case that can be removed when all content is updated.\n assert(pattern.args[1].op === Parser.VAR);\n switch (pattern.args[1].args[0]) {\n case 'N':\n return node.op === Parser.NUM;\n case 'V':\n return node.op === Parser.VAR;\n default:\n }\n return false;\n }\n return (\n pattern.op === Parser.VAR && pattern.args[0] === '?' ||\n pattern.op === Parser.MATRIX && node.op === Parser.MATRIX\n );\n }\n\n // [\"? + ?\", \"? - ?\"], \"1 + 2\"\n function match(options, patterns, node) {\n if (patterns.size === 0 || node === undefined) {\n return false;\n }\n const matches = patterns.filter((pattern) => {\n if (pattern.op === undefined || node.op === undefined) {\n return false;\n }\n if (ast.intern(pattern) === ast.intern(node) ||\n matchType(options, pattern, node)) {\n return true;\n }\n if (pattern.op === node.op) {\n if (pattern.args.length === node.args.length) {\n // Same number of args, so see if each matches.\n return pattern.args.every((arg, i) => {\n if (pattern.op === Parser.VAR) {\n // We've already matched ? so we are looking for literal matches.\n // Compare case-insensitively by normalizing to lowercase.\n if (arg.toLowerCase() === node.args[i].toLowerCase()) {\n return true;\n }\n return false;\n }\n const result = match(options, [arg], node.args[i]);\n return result.length === 1;\n });\n } if (pattern.args.length < node.args.length) {\n // Different number of args, then see if there is a wildcard match.\n const nargs = node.args.slice(1);\n if (pattern.args.length === 2) {\n // Binary node pattern\n const result = (\n match(options, [pattern.args[0]], node.args[0]).length > 0 &&\n match(options, [pattern.args[1]], newNode(node.op, nargs)).length > 0\n // Match rest of the node against the second pattern argument.\n );\n return result;\n }\n }\n }\n return false;\n });\n // if (matches.length > 0) {\n // console.log(\"match() node: \" + JSON.stringify(node, null, 2));\n // console.log(\"match() matches: \" + JSON.stringify(matches, null, 2));\n // }\n return matches;\n }\n function expandBinary(template, args, env) {\n const t = template;\n args.forEach((arg, i) => {\n template = template.replace(new RegExp(`%${i + 1}`, 'g'), arg.args[0]);\n });\n if (args.length > 2) {\n return expandBinary(t, [newNode(Parser.VAR, [template])].concat(args.slice(2)), env);\n }\n return template;\n }\n function expand(expansion, args, env, expanderBuilders) {\n env = env || {};\n expanderBuilders = expanderBuilders || {};\n // Use first matched expansion for now.\n let template = expansion.template;\n // console.log(\n // \"expand()\",\n // \"expansion=\" + JSON.stringify(expansion, null, 2),\n // );\n if (args.length === 0) {\n // This handles the case of empty brackets, such as () and \\{\\}.\n args.push(newNode(Parser.VAR, ['']));\n }\n if (template && template.indexOf('%OP') >= 0 && env.op) {\n template = template.replace(new RegExp('%OP', 'g'), env.op);\n }\n if (template && args) {\n if (template.indexOf('%%') >= 0) {\n template = template.replace(new RegExp('%%', 'g'), args[0].args[0]);\n }\n const configIndex = template.indexOf('{');\n const expanderName = (configIndex > 0 && template.slice(0, configIndex) || template).trim();\n if (expanderBuilders[expanderName]) {\n const expanderBuilder = expanderBuilders[expanderName].fn;\n const config = getExpanderBuilderConfig(template, expanderBuilders);\n const expander = expanderBuilder({ config, env });\n const vals = [];\n args.forEach((arg) => {\n vals.push(arg.args[0]);\n });\n template = expander(vals);\n }\n if (template.indexOf('%*') >= 0) {\n let s = '';\n args.forEach((arg, i) => {\n if (s !== '') {\n s += ' ';\n }\n // Replicate expansion for each argument.\n if (i === args.length - 1) {\n // If this is the last element in the sequence, lop off the\n // trailing separator. Times two because what comes before the\n // \"%*\", if anything, is a bracket so need to include the close\n // bracket.\n template = template.slice(0, 2 * template.indexOf('%*') + '%*'.length);\n }\n s += template.replace('%*', arg.args[0]).replace('%M', arg.m).replace('%N', arg.n);\n });\n template = s; // Overwrite template.\n }\n if (template.indexOf('%IP') >= 0) {\n template = template.replace(new RegExp('%IP', 'g'), env.ip);\n }\n if (template.indexOf('%FP0') >= 0) {\n template = template.replace(new RegExp('%FP0', 'g'), env.fp);\n }\n if (template.indexOf('%FP') >= 0) {\n template = template.replace(new RegExp('%FP', 'g'), env.fp.split('').join(' '));\n }\n if (template.indexOf('%M') >= 0) {\n assert(env.m);\n template = template.replace(new RegExp('%M', 'g'), env.m);\n }\n if (template.indexOf('%N') >= 0) {\n assert(env.n);\n template = template.replace(new RegExp('%N', 'g'), env.n);\n }\n if (expansion.isBinary && args.length > 2) {\n template = expandBinary(template, args, env);\n } else {\n args.forEach((arg, i) => {\n template = template.replace(new RegExp(`%${i + 1}`, 'g'), !arg ? '' : arg.args[0]);\n });\n }\n return {\n op: Parser.VAR,\n args: [template],\n };\n }\n return args[0];\n }\n\n function matchedExpansion(options, rules, matches) {\n let expansions = [];\n matches.forEach((m) => {\n expansions = expansions.concat(rules[JSON.stringify(m)]);\n });\n if (expansions.length === 0) {\n // Make one up.\n expansions.push({ template: '' });\n }\n // Use first match.\n return expansions[0];\n }\n\n function getNodeArgsForExpansion(node, expansion) {\n // Parse out the number of params in the expansion.\n assert(typeof expansion.template === 'string');\n const template = expansion.template;\n if (template.indexOf('%%') >= 0) {\n return [node];\n }\n // let a = template.split(\"%\"); // [\"..\", \"1..\", \"2..\"]\n // let nn = a.filter(n => {\n // // Include '%1', %M, %N\n // return !Number.isNaN(+n[0]) || n[0] === \"M\" || n[0] === \"N\";\n // });\n return node.args;\n }\n function unflattenLeftRecursive(node) {\n if (node.args.length <= 2) {\n return node;\n }\n const rnode = node.args.pop();\n return binaryNode(node.op, [\n unflattenLeftRecursive(node),\n rnode,\n ]);\n }\n function unflattenRightRecursive(node) {\n if (node.args.length <= 2) {\n return node;\n }\n const lnode = node.args.shift();\n return binaryNode(node.op, [\n lnode,\n unflattenRightRecursive(node),\n ]);\n }\n function translate(options, root, rules) {\n // Translate math from LaTeX.\n // rules = {ptrn: tmpl, ...};\n if (rules instanceof Array) {\n if (rules.length === 1) {\n rules = rules[0];\n } else {\n rules = mergeMaps(options, rules[1], rules[0]);\n }\n }\n const globalRules = rules;\n const keys = Object.keys(rules);\n const patterns = [];\n keys.forEach((k) => {\n patterns.push(JSON.parse(k));\n });\n if (!root || !root.args) {\n assert(false, 'Should not get here. Illformed node.');\n return 0;\n }\n return visit(options, root, {\n name: 'translate',\n numeric(node) {\n const args = [{\n op: Parser.VAR,\n args: [lookup(options, node.args[0])],\n }];\n const env = options.env || {};\n if (node.numberFormat === 'decimal') {\n const parts = node.args[0].split('.');\n env.ip = parts[0];\n env.fp = parts[1] || '0'; // 7.\n }\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, 1);\n return expand(expansion, args, env, options.expanderBuilders);\n },\n binary(node) {\n if (node.op === Parser.SUBSCRIPT) {\n node = unflattenRightRecursive(node);\n } else {\n node = unflattenLeftRecursive(node);\n }\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n nodeArgs.forEach((n, i) => {\n const rhs = Parser.option(options, 'RHS', i > 0);\n args = args.concat(translate(options, n, [globalRules, argRules]));\n Parser.option(options, 'RHS', rhs);\n });\n expansion.isBinary = true;\n return expand(expansion, args, { ...options.env, op: node.op }, options.expanderBuilders);\n },\n multiplicative(node) {\n node = unflattenLeftRecursive(node);\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n nodeArgs.forEach((n, i) => {\n const rhs = Parser.option(options, 'RHS', i > 0);\n args = args.concat(translate(options, n, [globalRules, argRules]));\n Parser.option(options, 'RHS', rhs);\n });\n expansion.isBinary = true;\n return expand(expansion, args, { ...options.env, op: node.op }, options.expanderBuilders);\n },\n unary(node) {\n // -10 => (-10)\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n nodeArgs.forEach((n) => {\n args = args.concat(translate(options, n, [globalRules, argRules]));\n });\n return expand(expansion, args, { ...options.env, op: node.op }, options.expanderBuilders);\n },\n exponential(node) {\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n nodeArgs.forEach((n) => {\n args = args.concat(translate(options, n, [globalRules, argRules]));\n });\n return expand(expansion, args, options.env, options.expanderBuilders);\n },\n variable(node) {\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n args.push(newNode(Parser.VAR, [lookup(options, nodeArgs.shift())]));\n nodeArgs.forEach((n) => {\n // Now translate the subscripts.\n args = args.concat(translate(options, n, [globalRules, argRules]));\n });\n return expand(expansion, args, options.env, options.expanderBuilders);\n },\n comma(node) {\n const env = options.env || {};\n if (node.op === Parser.MATRIX || node.op === Parser.ROW || node.op === Parser.COL) {\n if (node.op === Parser.MATRIX) {\n assert(node.args[0].op === Parser.ROW);\n assert(node.args[0].args[0].op === Parser.COL);\n node.m = env.m = node.args[0].args.length;\n node.n = env.n = node.args[0].args[0].args.length;\n node.args.forEach((n, i) => {\n // matrix dimensions\n n.m = i + 1;\n });\n } else if (node.op === Parser.ROW) {\n node.args.forEach((n, i) => {\n n.m = i + 1;\n n.n = undefined;\n });\n } else {\n node.args.forEach((n, i) => {\n n.m = node.m;\n n.n = i + 1;\n });\n }\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n let args = [];\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n nodeArgs.forEach((n, i) => {\n args = args.concat(translate(options, n, [globalRules, argRules]));\n args[i].m = n.m;\n args[i].n = n.n;\n });\n return expand(expansion, args, env, options.expanderBuilders);\n }\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n nodeArgs.forEach((n) => {\n args = args.concat(translate(options, n, [globalRules, argRules]));\n });\n expansion.isBinary = true;\n return expand(expansion, args, env, options.expanderBuilders);\n },\n equals(node) {\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, node.args.length);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n let args = [];\n nodeArgs.forEach((n) => {\n args = args.concat(translate(options, n, [globalRules, argRules]));\n });\n expansion.isBinary = true;\n return expand(expansion, args, options.env, options.expanderBuilders);\n },\n paren(node) {\n const matches = match(options, patterns, node);\n if (matches.length === 0) {\n return node;\n }\n // Use first match for now.\n const expansion = matchedExpansion(options, rules, matches, 1);\n const argRules = getRulesForArgs(expansion, rules);\n const nodeArgs = getNodeArgsForExpansion(node, expansion);\n const args = [];\n nodeArgs.forEach((n) => {\n args.push(translate(options, n, [globalRules, argRules]));\n });\n return expand(expansion, args, options.env, options.expanderBuilders);\n },\n });\n }\n\n this.translate = translate;\n }\n\n // function dumpRules(rules) {\n // let str = '';\n // for (const [key, val] of rules) {\n // str += `${JSON.stringify(key, null, 2)} --> ${JSON.stringify(val, null, 2)}\\n`;\n // }\n // return str;\n // }\n\n function getRulesForArgs(expansion) {\n return expansion.rules;\n }\n\n function mergeMaps(options, m1, m2) {\n const map = {};\n if (m1) {\n if (m1 instanceof Array) {\n // We have context alternates, so pick the first match.\n let match = {};\n m1.some((m) => {\n if (m.context) {\n const contexts = m.context && m.context.split(' ') || [];\n // A rule can have more than one context.\n return contexts.some((context) => {\n if (options[context]) {\n match = m.value;\n return true;\n }\n return false;\n });\n }\n // No context, so its a catchall.\n match = m;\n return true;\n\n });\n m1 = match;\n }\n const keys = Object.keys(m1);\n keys.forEach((k) => {\n map[k] = m1[k];\n });\n }\n const keys = Object.keys(m2);\n let m;\n keys.forEach((k) => {\n if (!Number.isNaN(parseInt(k, 10))) {\n // Flatten context arrays.\n m = m2[k];\n k = Object.keys(m)[0];\n } else {\n m = m2;\n }\n if (!map[k]) {\n map[k] = m[k];\n }\n });\n return map;\n }\n\n function getExpansionFromTemplate(template) {\n let context;\n const start = template.indexOf('\\\\context');\n if (start >= 0) {\n template = template.slice(start + '\\\\context'.length);\n const stop = template.indexOf('}');\n context = template.slice(1, stop);\n template = template.slice(stop + 1);\n }\n return {\n context,\n template,\n };\n }\n\n function compileExpansion(options, expansion) {\n let compiledExpansion;\n if (expansion instanceof Array) {\n // [{..}, {..}]\n assert(expansion.length === 1);\n compiledExpansion = compileExpansion(options, expansion[0]);\n } else if (typeof expansion === 'string') {\n // \"\\context{RHS}%1\"\n compiledExpansion = getExpansionFromTemplate(expansion);\n } else {\n // {\"%1\": {\"?\": \"%1\"}}\n // {\"%1\": [cntx1 {\"?\": \"%1\"}, cntx2 {?: \"%1\"}] --> [{context: \"cntx1\", expansion: \"%1\"},...]}\n let context = '';\n const templates = Object.keys(expansion);\n assert(templates.length === 1);\n const template = templates[0];\n const rules = expansion[template];\n let compiledRules;\n if (rules instanceof Array) {\n compiledRules = [];\n rules.forEach((rule) => {\n if (rule.options) {\n context += rule.options.RHS ? ' RHS' : '';\n context += rule.options.EndRoot ? ' EndRoot' : '';\n context += rule.options.NoParens ? ' NoParens' : '';\n compiledRules.push({\n context,\n value: compileRules(options, rule.value),\n });\n } else {\n compiledRules.push(compileRules(options, rule));\n }\n });\n } else {\n compiledRules = compileRules(options, rules);\n }\n compiledExpansion = {\n template,\n rules: compiledRules,\n };\n }\n return compiledExpansion;\n }\n function compileRules(options, rules) {\n // {\"?\": \"%1\"}\n // [cntx1 \"%1\", cntx2 {\"%1\": {?: \"%1\"}}] --> [{context: \"cntx1\", expansion: \"%1\"},...]}\n // { \"ast as string\": expansion, ... }\n const compiledRules = {};\n const keys = Object.keys(rules);\n keys.forEach((key) => {\n const pattern = JSON.stringify(Parser.create(options, key)); // Parse and normalize.\n const expansion = compileExpansion(options, rules[key]);\n if (!compiledRules[pattern]) {\n compiledRules[pattern] = [expansion];\n } else {\n compiledRules[pattern].push(expansion);\n }\n });\n return compiledRules;\n }\n function translate(options, node, rules) {\n const visitor = new Visitor(ast);\n const compiledRules = compileRules(options, rules);\n return visitor.translate(options, node, compiledRules);\n }\n function trim(str) {\n let i = 0;\n let out = '';\n for (; i < str.length; i++) {\n switch (str.charAt(i)) {\n case ' ':\n case '\\t':\n case '\\n':\n if (out.length === 0 || out.charAt(out.length - 1) === ' ') {\n // Erase space at beginning and after other space.\n continue;\n }\n out += ' ';\n break;\n default:\n out += str.charAt(i);\n break;\n }\n }\n while (out.charAt(out.length - 1) === ' ') {\n // Trim off trailing whitespace.\n out = out.substring(0, out.length - 1);\n }\n while (out.lastIndexOf('baseline') !== -1 && out.lastIndexOf(' baseline') === out.length - ' baseline'.length) {\n // Trim off trailing modifiers\n out = out.substring(0, out.length - ' baseline'.length);\n }\n return out;\n }\n Parser.fn.translate = function (n1, options) {\n const rules = Parser.option(options, 'rules');\n let n = translate(options, n1, rules);\n if (!n || n.op !== Parser.VAR) {\n n = newNode(Parser.VAR, ['']);\n }\n return trim(n.args[0]);\n };\n\n Parser.option = function option(options, p, v) {\n assert(options);\n let opt = options && options[p];\n if (v !== undefined) {\n // Set the option value.\n Parser.options = options = options || {};\n options[p] = v;\n }\n if (opt === undefined) {\n switch (p) {\n case 'field':\n opt = 'integer';\n break;\n case 'decimalPlaces':\n opt = 10;\n break;\n case 'toleranceAbsolute':\n case 'tolerancePercent':\n case 'toleranceRange':\n case 'setThousandsSeparator':\n case 'setDecimalSeparator':\n case 'dontExpandPowers':\n case 'dontFactorDenominators':\n case 'dontFactorTerms':\n case 'dontConvertDecimalToFraction':\n case 'strict':\n case 'antiderivative':\n opt = undefined;\n break;\n case 'types':\n opt = {};\n break;\n default:\n opt = false;\n break;\n }\n }\n // Return the original or default option.\n return opt;\n };\n\n}(new Ast()));\nexport const Core = (function () {\n Assert.reserveCodeRange(4000, 4999, 'core');\n const messages = Assert.messages;\n const message = Assert.message;\n const assert = Assert.assert;\n messages[4001] = 'No Math Core spec provided.';\n messages[4002] = 'No Math Core solution provided.';\n messages[4003] = 'No Math Core spec value provided.';\n messages[4004] = \"Invalid Math Core spec method '%1'.\";\n messages[4005] = 'Operation taking too long.';\n messages[4006] = \"Invalid option name '%1'.\";\n messages[4007] = \"Invalid option value '%2' for option '%1'.\";\n messages[4008] = 'Internal error: %1';\n\n const mu = 10 ** -6; // micro, \\\\mu\n const env = {\n ROUND: {},\n SUM: {},\n MUL: {},\n IF: {},\n matrix: {},\n pmatrix: {},\n bmatrix: {},\n Bmatrix: {},\n vmatrix: {},\n Vmatrix: {},\n array: {},\n '\\\\alpha': { type: 'var' },\n '\\\\beta': { type: 'var' },\n '\\\\gamma': { type: 'var' },\n '\\\\delta': { type: 'var' },\n '\\\\epsilon': { type: 'var' },\n '\\\\zeta': { type: 'var' },\n '\\\\eta': { type: 'var' },\n '\\\\theta': { type: 'var' },\n '\\\\iota': { type: 'var' },\n '\\\\kappa': { type: 'var' },\n '\\\\lambda': { type: 'var' },\n '\\\\mu': { type: 'const', value: mu },\n '\\\\nu': { type: 'var' },\n '\\\\xi': { type: 'var' },\n '\\\\pi': { type: 'const', value: Math.PI },\n '\\\\rho': { type: 'var' },\n '\\\\sigma': { type: 'var' },\n '\\\\tau': { type: 'var' },\n '\\\\upsilon': { type: 'var' },\n '\\\\phi': { type: 'var' },\n '\\\\chi': { type: 'var' },\n '\\\\psi': { type: 'var' },\n '\\\\omega': { type: 'var' },\n '\\\\sin': { type: 'var' },\n '\\\\cos': { type: 'var' },\n '\\\\tan': { type: 'var' },\n '\\\\sec': { type: 'var' },\n '\\\\csc': { type: 'var' },\n '\\\\cot': { type: 'var' },\n '\\\\arcsin': { type: 'var' },\n '\\\\arccos': { type: 'var' },\n '\\\\arctan': { type: 'var' },\n '\\\\arcsec': { type: 'var' },\n '\\\\arccsc': { type: 'var' },\n '\\\\arccot': { type: 'var' },\n '\\\\sinh': { type: 'var' },\n '\\\\cosh': { type: 'var' },\n '\\\\tanh': { type: 'var' },\n '\\\\sech': { type: 'var' },\n '\\\\csch': { type: 'var' },\n '\\\\coth': { type: 'var' },\n '\\\\log': { type: 'var' },\n '\\\\ln': { type: 'var' },\n '\\\\lg': { type: 'var' },\n };\n\n function validateOption(p, v) {\n switch (p) {\n case 'field':\n switch (v) {\n case undefined: // undefined means use default\n case 'integer':\n case 'real':\n case 'complex':\n break;\n default:\n assert(false, message(4007, [p, v]));\n break;\n }\n break;\n case 'decimalPlaces':\n if (v === undefined || +v >= 0 && +v <= 20) {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'toleranceAbsolute':\n if (v === undefined || +v >= 0 ||\n typeof v === 'string') {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'tolerancePercent':\n if (v === undefined || +v >= 0) {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'toleranceRange':\n if (v === undefined ||\n v instanceof Array && v.length === 2) {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'antiderivative':\n if (typeof v === 'undefined' ||\n typeof v === 'string') {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'RHS':\n case 'NoParens':\n case 'EndRoot':\n case 'allowDecimal':\n case 'allowInterval':\n case 'dontExpandPowers':\n case 'dontFactorDenominators':\n case 'dontFactorTerms':\n case 'dontConvertDecimalToFraction':\n case 'dontSimplifyImaginary':\n case 'ignoreOrder':\n case 'inverseResult':\n case 'requireThousandsSeparator':\n case 'ignoreText':\n case 'ignoreTrailingZeros':\n case 'allowThousandsSeparator':\n case 'compareSides':\n case 'ignoreCoefficientOne':\n case 'strict':\n case 'integrationConstant':\n case 'absoluteValue':\n case 'parsingIntegralExpr':\n case 'keepTextWhitespace':\n if (typeof v === 'undefined' || typeof v === 'boolean') {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'setThousandsSeparator':\n if (typeof v === 'undefined' ||\n typeof v === 'string' && v.length === 1 ||\n v instanceof Array) {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n case 'setDecimalSeparator':\n if (typeof v === 'undefined' ||\n typeof v === 'string' && v.length === 1 ||\n v instanceof Array && v.length > 0 && v[0].length === 1) {\n break;\n }\n assert(false, message(4007, [p, JSON.stringify(v)]));\n break;\n case 'words':\n case 'rules':\n case 'types':\n case 'data':\n case 'env':\n case 'expanderBuilders':\n if (typeof v === 'undefined' ||\n typeof v === 'object') {\n break;\n }\n assert(false, message(4007, [p, v]));\n break;\n default:\n assert(false, message(4006, [p]));\n break;\n }\n // If we get this far, all is well.\n\n }\n function validateOptions(options) {\n if (options) {\n Object.keys(options).forEach((option) => {\n validateOption(option, options[option]);\n });\n }\n }\n function translate(options, solution, resume) {\n // console.log(\n // \"translate()\",\n // \"options=\" + JSON.stringify(options, null, 2),\n // \"solution=\" + solution,\n // );\n if (!options) {\n options = {};\n }\n if (!options.rules) {\n // Use the default rules in rules.js.\n options.words = rules.words;\n options.rules = rules.rules;\n options.types = rules.types;\n }\n const spec = {\n method: 'translate',\n options,\n };\n\n options.allowInterval = true;\n const evaluator = makeEvaluator(spec);\n evaluator.evaluate(solution, (err, val) => {\n resume(err, val);\n });\n }\n // Diagnostics, off by default.\n //\n // This library runs inside a Learnosity scorer, server-side, where an\n // unconditional console.log of a stack trace is noise at best — and the\n // parser's own logs include the SOURCE, which for a spreadsheet is learner\n // input. Callers who want the detail opt in; everyone else gets the\n // structured error that was always being returned anyway.\n let logSink = null;\n function setLogger(fn) {\n logSink = typeof fn === 'function' ? fn : null;\n }\n function debugLog(build) {\n if (logSink) {\n logSink(build());\n }\n }\n\n function buildTranslator(options, expanderBuilders) {\n // Factory function that returns a translate function with options and expanderBuilders closed over\n if (!options) {\n options = {};\n }\n if (!options.rules) {\n // Use the default rules in rules.js.\n options.words = rules.words;\n options.rules = rules.rules;\n options.types = rules.types;\n }\n // Store expanderBuilders in options for use by expand()\n options.expanderBuilders = expanderBuilders || {};\n options.allowInterval = true;\n\n return function translate(solution, resume) {\n const spec = {\n method: 'translate',\n options,\n };\n const evaluator = makeEvaluator(spec);\n evaluator.evaluate(solution, (err, val) => {\n resume(err, val);\n });\n };\n }\n // No `resume` parameter: the caller passes its continuation to evaluate()\n // instead. It used to take one so the constructor could report a spec error\n // directly, which is exactly what made a spec error resume twice.\n function makeEvaluator(spec) {\n let valueNode;\n const method = spec.method;\n const value = spec.value;\n const options = Parser.options = spec.options;\n // Convert words keys to env format so parselatex treats them as identifiers.\n // Add both lowercase and uppercase forms for case-insensitive matching.\n const wordsAsEnv = options.words\n ? Object.fromEntries(\n Object.keys(options.words).flatMap((k) => [\n [k.toLowerCase(), { type: 'var' }],\n [k.toUpperCase(), { type: 'var' }],\n ]),\n )\n : {};\n let pendingError;\n try {\n Assert.setLocation('spec');\n validateOptions(options);\n Parser.pushEnv({\n ...env,\n ...wordsAsEnv,\n ...options.env,\n });\n valueNode = value !== undefined ? Parser.create(options, value, 'spec') : undefined;\n Parser.popEnv();\n } catch (e) {\n // Recorded, NOT reported here. evaluate() rethrows pendingError and its\n // catch delivers the error, so resuming here too called the caller's\n // continuation TWICE for one failure — a promise wrapper drops the second\n // silently, anything accumulating results double-counts it.\n pendingError = e;\n }\n const evaluate = function evaluate(solution, resume) {\n try {\n if (pendingError) {\n throw pendingError;\n }\n Assert.setLocation('user');\n assert(solution !== undefined, message(4002));\n Parser.pushEnv({\n ...env,\n ...wordsAsEnv,\n ...options.env,\n });\n const solutionNode = Parser.create(options, solution, 'user');\n assert(solutionNode, message(4008, ['invalid input']));\n Assert.setLocation('spec');\n let result;\n switch (method) {\n case 'translate':\n result = solutionNode.translate(options);\n break;\n default:\n assert(false, message(4004, [method]));\n break;\n }\n Parser.popEnv();\n resume([], result);\n } catch (e) {\n // Diagnostics are opt-in. The fully-formed error below already carries\n // `stack`, so printing it here was duplication — and this code runs\n // inside a server-side scorer, where it meant a stack trace on stdout\n // for every bad cell.\n debugLog(() => `ERROR evaluate() ${e.stack}`);\n const message = e.message;\n resume([{\n result: null,\n errorCode: errorCodeOf(e),\n message: parseMessage(message),\n stack: e.stack,\n location: e.location,\n toString() {\n return `${this.errorCode}: (${this.location}) ${this.message}\\n${this.stack}`;\n },\n }], ''); // If error, empty string.\n\n }\n };\n return {\n evaluate,\n model: valueNode,\n };\n // Prefer a code carried on the error object; fall back to scraping the\n // message. Scraping is why a raw TypeError from a missing reducer and a\n // DecimalError from a bad argument both report 0 — neither went through\n // Assert.message, so neither has the \"NNNN: \" prefix the split looks for.\n function errorCodeOf(e) {\n if (e && typeof e.errorCode === 'number') {\n return e.errorCode;\n }\n return parseErrorCode(e && e.message);\n }\n function parseErrorCode(e) {\n e = typeof e === 'string' && e || '';\n const code = +e.slice(0, e.indexOf(':'));\n if (!Number.isNaN(code)) {\n return code;\n }\n return 0;\n }\n function parseMessage(e) {\n const code = parseErrorCode(e);\n if (code) {\n return e.slice(e.indexOf(':') + 2);\n }\n return e;\n }\n }\n\n // Exports\n return {\n translate,\n buildTranslator,\n setLogger,\n };\n}());\n\nif (typeof window !== 'undefined') {\n // Make a browser hook.\n window.Core = Core;\n}\n","/*\n * Spreadsheet expanders for TransLaTeX\n * Provides cell references, ranges, formatting, and spreadsheet functions\n */\nimport Decimal from 'decimal.js';\n\nconst createLetterArray = (start, end) => (\n Array.from({ length: end.charCodeAt(0) - start.charCodeAt(0) + 1 }, (_, i) => String.fromCharCode(start.charCodeAt(0) + i))\n);\n\nconst createIntegerArray = (start, end) => {\n const startNum = +start;\n const endNum = +end;\n return Array.from({ length: endNum - startNum + 1 }, (_, i) => String(startNum + i));\n};\n\nconst isValidDecimal = (val) => {\n try {\n const d = new Decimal(val);\n return d !== null;\n } catch (error) {\n // Ignore the error\n return false;\n }\n};\n\nconst parseCellName = (name) => [name.slice(0, 1), name.slice(1)];\n\nconst isLetter = (c) => c.toUpperCase() >= 'A' && c.toUpperCase() <= 'Z';\n\nconst isIntegerString = (str) => /^-?\\d+$/.test(str);\n\nconst isValidCellName = (name) => parseCellName(name).reduce((acc, val, index) => (\n index === 0 && isLetter(val) || isIntegerString(val)\n), false);\n\n/**\n * The argument separator.\n *\n * ASCII unit separator (0x1F). Arguments used to be joined with a COMMA and\n * re-split by $fn, which cannot survive an argument that itself contains one —\n * and makes arity unknowable, since a range of three cells and three separate\n * arguments look identical by the time they arrive.\n *\n * U+001F is chosen because a formula cannot introduce one: the parser discards\n * a literal occurrence rather than carrying it through. That gives a second,\n * free property — if it survives into a RESULT, some call did not resolve,\n * which is the best available detector for the silent-wrong-answer class\n * (`=NOSUCH(A1,A2)` returning \"NOSUCHA1A2\" with no error at all). See\n * unresolvedCall at the foot of this file.\n */\nconst ARG_SEP = String.fromCharCode(31);\n\nconst rangeReducerBuilder = (sep = ',') => (acc = {}, val, index) => {\n if (index === 0) {\n return {\n start: parseCellName(val),\n };\n }\n const start = acc.start;\n const end = parseCellName(val);\n const colNames = createLetterArray(start[0], end[0]);\n const rowNames = createIntegerArray(start[1], end[1]);\n const cellValues = colNames.flatMap((colName) => (\n rowNames.map((rowName) => (\n colName.toUpperCase() + rowName\n ))\n )).filter((v) => (\n v !== undefined\n ));\n return cellValues.join(sep);\n\n};\n\nconst normalizeNode = (node) => node;\n\nconst normalizeReducerBuilder = () => (acc = [], val) => {\n return [\n ...acc,\n val.toUpperCase(),\n ];\n};\n\nconst parseFormatString = (formatStr) => {\n // Parse Excel-like format strings\n // Examples: \"$#,##0.00\", \"€#.##0,00\", \"¥#,##0\", \"#,##0.00_$\", \"($#,##0.00)\"\n const result = {\n currency: '',\n thousandsSeparator: ',',\n decimalSeparator: '.',\n decimalPlaces: 0,\n prefix: '',\n suffix: '',\n showThousands: false,\n accountingStyle: false,\n isPercent: false,\n };\n\n // Check for accounting style (parentheses format)\n if (formatStr.startsWith('(') && formatStr.endsWith(')')) {\n result.accountingStyle = true;\n formatStr = formatStr.slice(1, -1); // Remove outer parentheses\n }\n\n // Extract currency symbols and position\n const currencySymbols = ['$', '€', '¥', '£', '₹', '₽', '¢'];\n let workingStr = formatStr;\n // Check for currency at start\n currencySymbols.some((symbol) => {\n if (workingStr.startsWith(symbol)) {\n result.currency = symbol;\n result.prefix = symbol;\n workingStr = workingStr.slice(1);\n return true;\n }\n return false;\n });\n\n // Check for currency at end (after underscore)\n if (!result.currency) {\n currencySymbols.some((symbol) => {\n if (workingStr.includes(`_${symbol}`)) {\n result.currency = symbol;\n result.suffix = symbol;\n workingStr = workingStr.replace(`_${symbol}`, '');\n return true;\n }\n return false;\n });\n }\n\n // Percent. Excel scales the value by 100 and appends the sign, so \"0.0%\" renders 0.75 as\n // \"75.0%\". Strip the sign here, BEFORE the analysis below: the decimal-place match is anchored\n // to the end of the string, so a trailing '%' made it miss and every percent format parsed as\n // zero decimal places. Together with the missing scaling that rendered 0.75 as \"1\" and 0.10 as\n // \"0\" — the value silently rounded to an integer with no percent sign at all.\n if (workingStr.includes('%')) {\n result.isPercent = true;\n result.suffix += '%';\n workingStr = workingStr.replace(/%/g, '');\n }\n\n // Detect thousands separator and decimal separator\n if (workingStr.includes('#,##0') || workingStr.includes('#.##0') || workingStr.includes('# ##0')) {\n result.showThousands = true;\n if (workingStr.includes('#,##0.')) {\n // Standard format: comma thousands, dot decimal\n result.thousandsSeparator = ',';\n result.decimalSeparator = '.';\n } else if (workingStr.includes('#.##0,')) {\n // European format: dot thousands, comma decimal\n result.thousandsSeparator = '.';\n result.decimalSeparator = ',';\n } else if (workingStr.includes('# ##0,')) {\n // French/International format: space thousands, comma decimal\n result.thousandsSeparator = ' ';\n result.decimalSeparator = ',';\n } else if (workingStr.includes('# ##0.')) {\n // Canadian format: space thousands, dot decimal\n result.thousandsSeparator = ' ';\n result.decimalSeparator = '.';\n } else if (workingStr.includes('# ##0')) {\n // Space thousands, no decimals (default to dot decimal for future use)\n result.thousandsSeparator = ' ';\n result.decimalSeparator = '.';\n } else if (workingStr.includes('#.##0')) {\n // Dot thousands, no decimals (default to comma decimal for European style)\n result.thousandsSeparator = '.';\n result.decimalSeparator = ',';\n }\n // Default case for #,##0 (comma thousands) is already set in result initialization\n }\n\n // Count decimal places\n const decimalMatch = workingStr.match(/[.,]0+$/);\n if (decimalMatch) {\n result.decimalPlaces = decimalMatch[0].length - 1;\n }\n\n return result;\n};\n\nconst formatNumber = (value, formatOptions) => {\n const raw = Number(value);\n if (Number.isNaN(raw)) {\n return value;\n }\n\n const {\n thousandsSeparator,\n decimalSeparator,\n decimalPlaces,\n prefix,\n suffix,\n showThousands,\n accountingStyle,\n isPercent,\n } = formatOptions;\n\n // Scaled through Decimal rather than `raw * 100`, so 0.025 becomes exactly 2.5 instead of\n // 2.5000000000000004 — which `toFixed` would round correctly today but not at every precision.\n const num = isPercent ? Number(new Decimal(String(value)).times(100)) : raw;\n\n // Handle negative numbers for accounting style\n const isNegative = num < 0;\n const absoluteNum = Math.abs(num);\n\n // Format the absolute number with specified decimal places\n let formatted = absoluteNum.toFixed(decimalPlaces);\n\n // Replace decimal separator if needed\n if (decimalSeparator !== '.') {\n formatted = formatted.replace('.', decimalSeparator);\n }\n\n // Add thousands separator if needed\n if (showThousands) {\n const parts = formatted.split(decimalSeparator);\n const integerPart = parts[0];\n const decimalPart = parts[1] || '';\n\n // Add thousands separators to integer part\n const withThousands = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSeparator);\n\n formatted = decimalPart ? `${withThousands}${decimalSeparator}${decimalPart}` : withThousands;\n }\n\n // Add prefix and suffix\n formatted = `${prefix}${formatted}${suffix}`;\n\n // Handle accounting style for negative numbers\n if (accountingStyle && isNegative) {\n return `(${formatted})`;\n } if (isNegative) {\n return `-${formatted}`;\n }\n\n return formatted;\n};\n\nconst formatCurrency = (str, decimalPlaces = 2) => {\n // Default currency formatting for backward compatibility\n return formatNumber(str, {\n currency: '$',\n thousandsSeparator: ',',\n decimalSeparator: '.',\n decimalPlaces,\n prefix: '$',\n suffix: '',\n showThousands: true,\n });\n};\n\nconst isDateFormat = (formatStr) => {\n // Check if the format string is a date format\n const datePatterns = ['m/', 'd/', 'y', 'mmm', 'mmmm', 'ddd', 'dddd'];\n const lowerFormat = formatStr.toLowerCase();\n return datePatterns.some((pattern) => lowerFormat.includes(pattern));\n};\n\nconst parseDate = (value) => {\n // Parse various date input formats\n // Supports: Date objects, timestamps, date strings\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n\n const num = Number(value);\n if (!Number.isNaN(num)) {\n // Mac Excel serial date number (days since 1904-01-01, no leap year bug)\n if (num >= 0 && num < 2957004) { // Excel max date is Dec 31, 9999\n // Mac Excel date serial number\n // Mac Excel treats January 1, 1904 as serial number 0\n const days = Math.floor(num);\n\n // Mac Excel epoch is January 1, 1904\n // Use UTC to avoid timezone issues\n const macExcelEpoch = new Date(Date.UTC(1904, 0, 1));\n const date = new Date(macExcelEpoch.getTime() + days * 24 * 60 * 60 * 1000);\n return date;\n }\n // Unix timestamp (milliseconds) - very large numbers\n if (num > 2957004) {\n return new Date(num);\n }\n }\n\n // Try to parse as date string\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n};\n\nconst formatDate = (date, formatStr) => {\n if (!date || !(date instanceof Date) || Number.isNaN(date.getTime())) {\n return String(date || '');\n }\n\n const pad = (num, digits = 2) => String(num).padStart(digits, '0');\n\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n // Build a map of all format tokens and their values\n const tokens = {\n yyyy: String(date.getFullYear()),\n yy: pad(date.getFullYear() % 100),\n mmmm: monthsFull[date.getMonth()],\n mmm: months[date.getMonth()],\n mm: pad(date.getMonth() + 1),\n m: String(date.getMonth() + 1),\n dd: pad(date.getDate()),\n d: String(date.getDate()),\n };\n\n // Process the format string character by character\n let result = '';\n let i = 0;\n\n while (i < formatStr.length) {\n let matched = false;\n\n // Try to match tokens from longest to shortest\n const tokenKeys = Object.keys(tokens).sort((a, b) => b.length - a.length);\n\n tokenKeys.some((token) => {\n const substr = formatStr.substring(i, i + token.length).toLowerCase();\n if (substr === token) {\n result += tokens[token];\n i += token.length;\n matched = true;\n return true;\n }\n return false;\n });\n\n if (!matched) {\n result += formatStr[i];\n i++;\n }\n }\n\n return result;\n};\n\nconst formatValue = ({ env, args }) => {\n const format = args[1] || env.format || '';\n let formattedValue;\n if (format.toLowerCase() === 'currency') {\n // Backward compatibility\n formattedValue = formatCurrency(args[0]);\n } else if (format.includes('#') || format.includes('0')) {\n // Excel-like format string for numbers\n const formatOptions = parseFormatString(format);\n formattedValue = formatNumber(args[0], formatOptions);\n } else if (isDateFormat(format)) {\n // Date format string\n const date = parseDate(args[0]);\n formattedValue = date ? formatDate(date, format) : args[0];\n } else {\n formattedValue = args[0];\n }\n return formattedValue;\n};\n\nconst getCellValue = ({ env, str }) => (\n isValidCellName(str) && env[str.toUpperCase()]?.val || str\n);\n\nconst evaluateCondition = (value) => {\n // Handle boolean-like evaluations similar to Excel\n // FALSE: 0, \"0\", \"\", \"FALSE\" (case insensitive)\n // TRUE: everything else\n if (value === null || value === undefined || value === '') {\n return false;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '0' || trimmed.toUpperCase() === 'FALSE') {\n return false;\n }\n }\n if (typeof value === 'number' || value instanceof Decimal) {\n return +value !== 0;\n }\n return true;\n};\n\nconst reducerBuilders = {\n round: (env) => (acc = '', str, index) => {\n const cellValue = getCellValue({ env, str });\n if (isValidDecimal(cellValue)) {\n if (index === 0) {\n return new Decimal(cellValue);\n }\n if (index === 1) {\n return new Decimal(acc).toDecimalPlaces(+cellValue, Decimal.ROUND_HALF_UP);\n }\n }\n return acc;\n },\n sum: (env) => (acc = 0, str) => {\n const cellValue = getCellValue({ env, str });\n if (isValidDecimal(cellValue)) {\n return new Decimal(acc).plus(new Decimal(cellValue));\n }\n return acc;\n },\n minus: (env) => (acc = '', str, index) => {\n const cellValue = getCellValue({ env, str });\n if (isValidDecimal(cellValue)) {\n if (index === 0) {\n return new Decimal(cellValue);\n }\n return new Decimal(acc).minus(new Decimal(cellValue));\n }\n return acc;\n },\n multiply: (env) => (acc = 1, str) => {\n const cellValue = getCellValue({ env, str });\n if (isValidDecimal(cellValue)) {\n return new Decimal(acc).times(new Decimal(cellValue));\n }\n return acc;\n },\n mul: (env) => (acc = 1, str) => {\n const cellValue = getCellValue({ env, str });\n if (isValidDecimal(cellValue)) {\n return new Decimal(acc).times(new Decimal(cellValue));\n }\n return acc;\n },\n divide: (env) => (acc = '', str, index) => {\n const cellValue = getCellValue({ env, str });\n if (isValidDecimal(cellValue)) {\n if (index === 0) {\n return new Decimal(cellValue);\n }\n return new Decimal(acc).dividedBy(new Decimal(cellValue));\n }\n return acc;\n },\n normalize: normalizeReducerBuilder,\n range: rangeReducerBuilder,\n if: (env) => (acc = null, str, index) => {\n str = getCellValue({ env, str });\n if (index === 0) {\n // First argument is the condition\n return { condition: evaluateCondition(str), trueValue: null, falseValue: null };\n } if (index === 1) {\n // Second argument is the true value\n return { ...acc, trueValue: str };\n } if (index === 2) {\n // Third argument is the false value\n // Return the appropriate value based on the condition\n return acc.condition ? acc.trueValue : str;\n }\n // Ignore extra arguments\n return acc;\n },\n average: (env) => {\n let sum = new Decimal(0);\n let count = 0;\n return (acc, str) => {\n str = getCellValue({ env, str });\n if (isValidDecimal(str)) {\n sum = sum.plus(new Decimal(str));\n count++;\n }\n return count > 0 ? sum.dividedBy(count) : new Decimal(0);\n };\n },\n};\n\n/**\n * A comparison, as one helper over Decimal's three-way compare.\n *\n * Returns the STRING 'true' or 'false', which is what evaluateCondition above\n * already understands — 'false' hits its case-insensitive FALSE branch, so IF\n * needs no change to consume these.\n *\n * Non-numeric operands fall back to a string comparison rather than erroring,\n * matching how the surrounding reducers treat a value they cannot read as a\n * number: they carry on rather than throwing.\n */\nconst compareValues = (env, args, test) => {\n const a = getCellValue({ env, str: args[0] });\n const b = getCellValue({ env, str: args[1] });\n let order;\n if (isValidDecimal(a) && isValidDecimal(b)) {\n order = new Decimal(a).comparedTo(new Decimal(b));\n } else {\n const sa = String(a);\n const sb = String(b);\n if (sa === sb) {\n order = 0;\n } else {\n order = sa < sb ? -1 : 1;\n }\n }\n return String(test(order));\n};\n\nconst comparisonExpander = (test) => ({\n type: 'fn',\n fn: ({ env }) => ((args) => compareValues(env, args, test)),\n});\n\nconst expanderBuilders = {\n $cell: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => (\n env[args[1].toUpperCase()]?.val || '0'\n )\n ),\n },\n $fmt: {\n type: 'fn',\n fn: ({ config, env }) => (\n (args) => {\n // Handle raw config parsing for $fmt when used with parameters like $fmt{%1,format}\n if (config.rawConfig) {\n // Parse {isNegative:true} or {%1,format} -> [value, format]\n const configStr = config.rawConfig.slice(1, -1); // Remove { }\n // Check for isNegative flag\n if (configStr.includes('isNegative:true')) {\n // Apply negative to the value for accounting style processing\n const formatSpec = env.format?.formatString || env.format || '';\n args = [`-${args[0]}`, formatSpec];\n } else if (configStr.includes('isNegative:false')) {\n // Keep value positive\n const formatSpec = env.format?.formatString || env.format || '';\n args = [args[0], formatSpec];\n } else {\n // Legacy format: Split only on the first comma to separate value from format\n const firstCommaIndex = configStr.indexOf(',');\n if (firstCommaIndex >= 0) {\n let valueStr = configStr.slice(0, firstCommaIndex);\n const format = configStr.slice(firstCommaIndex + 1);\n // Replace %1 with actual value and use second part as format\n valueStr = valueStr.replace('%1', args[0]);\n args = [valueStr, format];\n }\n }\n } else if (args.length === 1) {\n // When $fmt is used without parameters, get format from environment\n const formatSpec = env.format?.formatString || env.format || '';\n args = [args[0], formatSpec];\n }\n return formatValue({ env, args });\n }\n ),\n },\n $range: {\n type: 'fn',\n // `$range{\"sep\":\"list\"}` expands a range into SEPARATE arguments; plain\n // `$range` keeps the comma-joined form. Both are needed: evalRules wants\n // the list, and normalizeRules must keep commas because score.ts splits its\n // output on them.\n fn: ({ config }) => (\n (args) => (\n args.reduce(reducerBuilders.range(config && config.sep === 'list' ? ARG_SEP : ','), undefined)\n )\n ),\n },\n $add: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => (\n `${args.reduce(reducerBuilders.sum(env), undefined)}`\n )\n ),\n },\n $minus: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => {\n if (args.length === 1) {\n args.unshift('0');\n }\n return `${args.reduce(reducerBuilders.minus(env), undefined)}`;\n }\n ),\n },\n $multiply: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => (\n `${args.reduce(reducerBuilders.multiply(env), undefined)}`\n )\n ),\n },\n $percent: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => {\n args.push('0.01');\n return `${args.reduce(reducerBuilders.multiply(env), undefined)}`;\n }\n ),\n },\n $divide: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => (\n `${args.reduce(reducerBuilders.divide(env), undefined)}`\n )\n ),\n },\n // Comparison operators. WITHOUT THESE, `=IF(A1>99,x,y)` silently drops the\n // \">99\" — there is no rule to match the `gt` node parselatex produces, so it\n // falls through the catch-all, the second operand is discarded, and\n // evaluateCondition sees the non-empty string \"A1\" and calls it true. Every\n // IF with a comparison took the true branch regardless of the comparison.\n //\n // One expander per operator rather than one that sniffs env.op: that is the\n // shape $add/$minus/$multiply/$divide already use, and env.op is only set by\n // some of the visitors.\n $gt: comparisonExpander((c) => c > 0),\n $lt: comparisonExpander((c) => c < 0),\n $ge: comparisonExpander((c) => c >= 0),\n $le: comparisonExpander((c) => c <= 0),\n $eq: comparisonExpander((c) => c === 0),\n $ne: comparisonExpander((c) => c !== 0),\n /**\n * Join a call's arguments losslessly. Replaces the rule `\"%1,%2\"`, which\n * flattened them into a string before any expander could see the boundaries.\n */\n $argsep: {\n type: 'fn',\n fn: () => ((args) => args.join(ARG_SEP)),\n },\n\n /**\n * Dispatch a function call, with a REAL argument list.\n *\n * $fn (below) is kept for rule sets that still use the comma form. The\n * difference is not cosmetic: $call knows the arity, so it can tell\n * `SUM(A1:A3)` from `SUM(A1,A2,A3)`, reject a wrong count, and pass through an\n * argument containing a comma. $fn can do none of those.\n */\n $call: {\n type: 'fn',\n fn: ({ env }) => ((args) => {\n const name = String(args[0]).toLowerCase();\n const list = String(args[1] === undefined ? '' : args[1]).split(ARG_SEP);\n const reducer = reducerBuilders[name];\n if (!reducer) {\n // Left for the caller to detect: without a function registry there is\n // nothing better to say yet, and throwing here would change behaviour\n // for every rule set that reaches this path today.\n return `${args[0]}${list.join(ARG_SEP)}`;\n }\n return `${list.reduce(reducer(env), undefined)}`;\n }),\n },\n\n $fn: {\n type: 'fn',\n fn: ({ env }) => (\n (args) => (\n `${args[1].split(',').reduce(reducerBuilders[args[0].toLowerCase()](env), undefined)}`\n )\n ),\n },\n $normalize: {\n type: 'fn',\n fn: ({ config, env }) => (\n (args) => (\n `${args.reduce(normalizeNode(reducerBuilders.normalize(env)), config?.acc)}`\n )\n ),\n },\n};\n\n/**\n * The residue check: did every call in this result actually resolve?\n *\n * U+001F in a result can only have come from $argsep, with no expander\n * consuming it — which happens exactly when a call did not resolve: an unknown\n * function name, or the parser losing the application entirely next to `*`\n * or `/`.\n *\n * On how sound that is, precisely: the parser DISCARDS a literal U+001F in the\n * formula text (verified — `=A1+<US>` evaluates to \"1\" with no error), so it\n * cannot reach a result that way. The one gap is a cell VALUE containing the\n * character, which would have to arrive by paste; it is not reachable by typing\n * and has never been observed, but it is not impossible, so this is a very good\n * detector rather than a proof.\n *\n * This is the only reliable detector for the worst failure mode in the engine.\n * `=NOSUCH(A1,A2)` returns the plausible string \"NOSUCHA1A2\" and reports NO\n * error; so does `=A1*SUM(A1,A2)`, which returns \"10A1,A2\". A scored cell takes\n * the wrong value and nothing anywhere says so.\n *\n * Returns the offending text, or null.\n */\nconst unresolvedCall = (value) => {\n const s = String(value === undefined || value === null ? '' : value);\n return s.includes(ARG_SEP) ? s.split(ARG_SEP).join(', ') : null;\n};\n\n// The pieces a custom function needs, and could not reach before: every one of\n// these was module-private, which is why adding a single function meant\n// replacing the $fn expander wholesale. See spreadsheet.js.\nexport {\n ARG_SEP,\n unresolvedCall,\n reducerBuilders,\n expanderBuilders,\n getCellValue,\n isValidDecimal,\n evaluateCondition,\n};\nexport default expanderBuilders;\n","import * as translatex from './src/core.js';\nimport spreadsheetExpanders from './src/spreadsheetExpanders.js';\nexport const TransLaTeX = translatex.Core;\nexport { spreadsheetExpanders };\n","// SPDX-License-Identifier: MIT\n/**\n * The rule sets translatex does NOT generate.\n *\n * `evalRules` used to live here too and no longer does: translatex 0.25.0\n * derives it — including `words` and `types.fn` — from the function registry, so\n * adding a function is one descriptor instead of four edits that have to agree.\n * See translatex-extensions.ts.\n *\n * `cellNameRules` is gone outright. It was for dependency extraction, which\n * stopped going through TransLaTeX when the rule set turned out to glue the\n * function name onto the first cell name (`=SUM(A1:A3)` -> [\"SUMA1\",\"A2\",\"A3\"],\n * losing A1). sheet/graph.js parses the references directly now.\n *\n * These two remain because they have no registry to be derived from: they are\n * presentation and comparison, not a vocabulary of functions.\n */\n\nexport const formatRules = {\n \"rules\": {\n \"??\": [\n \"%1%2\"\n ],\n \"-\\\\type{number}\": [\n {\n \"%1\": {\n \"\\\\type{number}\": \"$fmt{isNegative:true}\",\n },\n },\n ],\n \"\\\\type{number}\": [\n \"$fmt{isNegative:false}\"\n ],\n \"?\": [\n \"%1\"\n ]\n },\n}\n\nexport const normalizeRules = {\n \"types\": {\n \"cellName\": [\n \"\\\\type{variable}\\\\type{integer}\"\n ],\n \"cellRange\": [\n \"\\\\type{cellName}:\\\\type{cellName}\"\n ],\n \"fn\": [\n \"average\",\n \"if\",\n \"mul\",\n \"power\",\n \"round\",\n \"sum\",\n ]\n },\n \"rules\": {\n \"=\\\\type{cellName}\": [\n \"$cell\"\n ],\n \"=?\": [\n {\n \"%2\": {\n \"\\\\type{cellRange}\": \"%1:%2\",\n \"\\\\type{fn}(\\\\type{cellRange})\": \"$normalize\",\n \"?+?\": \"$normalize {\\\"acc\\\": [\\\"SUM\\\"]}\",\n \"?-?\": \"$normalize {\\\"acc\\\": [\\\"SUB\\\"]}\",\n \"?*?\": \"$normalize {\\\"acc\\\": [\\\"MUL\\\"]}\",\n \"?/?\": \"$normalize {\\\"acc\\\": [\\\"DIV\\\"]}\",\n \"?%\": \"$percent\",\n \"-?\": \"$minus\"\n }\n }\n ],\n \"\\\\type{cellRange}\": [\n \"$range\"\n ],\n \"\\\\type{cellName}\": [\n \"%1%2\"\n ],\n \"\\\\type{fn}(\\\\type{cellRange})\": [\n \"%1(%2)\"\n ],\n \"??\": [\n \"%1%2\"\n ],\n \"?\": [\n \"%1\"\n ]\n },\n}\n","// SPDX-License-Identifier: MIT\n/**\n * The spreadsheet extension API.\n *\n * WHAT THIS REPLACES. Adding one function to a spreadsheet dialect used to take\n * FOUR coordinated edits in a consumer repo — `words` (which is what makes a\n * multi-character name lex as one token rather than P·O·W·E·R), plus `types.fn`\n * in three separate rule sets — and then a fifth step that could not be done at\n * all from outside: the reducer itself. `reducerBuilders` was module-private, so\n * the only way in was to replace the `$fn` expander wholesale, which is exactly\n * what L0179 did for POWER.\n *\n * Four edits that must agree is not a chore, it is a drift generator. L0166 and\n * L0179 shipped rule sets whose only difference was the word `power`, appearing\n * in three of those four places in one repo and none in the other.\n *\n * Here a function is ONE descriptor and everything else is derived from it.\n *\n * const { expanders, rules } = createSpreadsheet({\n * functions: [{\n * name: 'POWER',\n * minArgs: 2,\n * maxArgs: 2,\n * apply: ({ args, helpers: { getCellValue, toDecimal } }) => {\n * const [b, e] = args.map((a) => getCellValue(a));\n * return `${toDecimal('POWER', 0, b).pow(toDecimal('POWER', 1, e))}`;\n * },\n * }],\n * });\n *\n * NO SHARED MUTABLE STATE. `spreadsheetExpanders` is one object instance shared\n * by every importer, so a consumer that assigned into it would change behaviour\n * process-wide. This returns fresh objects per call.\n */\nimport Decimal from 'decimal.js';\nimport baseExpanders, {\n ARG_SEP,\n reducerBuilders,\n getCellValue,\n isValidDecimal,\n evaluateCondition,\n unresolvedCall,\n} from './spreadsheetExpanders.js';\n\n/**\n * Error codes, in the 4000-4999 range this package reserves.\n *\n * The point of these is that `errorCode: 0` — which is what a raw TypeError or\n * a DecimalError collapses to — cannot distinguish \"you called a function that\n * does not exist\" from \"you passed a bad argument\" from \"the parser lost your\n * call\". All three produced a plausible wrong answer or an empty cell, and a\n * consumer had to regex the message text against implementation internals to\n * tell them apart.\n */\nexport const ERROR = {\n UNKNOWN_FUNCTION: 4100,\n WRONG_ARITY: 4101,\n BAD_ARGUMENT: 4102,\n UNRESOLVED: 4103,\n DIVIDE_BY_ZERO: 4104,\n};\n\nconst MARKERS = {\n [ERROR.UNKNOWN_FUNCTION]: '#NAME!',\n [ERROR.WRONG_ARITY]: '#N/A',\n [ERROR.BAD_ARGUMENT]: '#VALUE!',\n [ERROR.UNRESOLVED]: '#NAME!',\n [ERROR.DIVIDE_BY_ZERO]: '#DIV/0!',\n};\n\n/**\n * The spreadsheet marker for an error code, or null.\n *\n * Exported rather than applied: markers are the SPREADSHEET's vocabulary, and\n * this package is a LaTeX translator that happens to be able to evaluate one.\n * Emitting `#NAME!` from here would bake one consumer's presentation into the\n * engine. Both L0166 and L0179 hand-rolled their own `#NAME!` detection by\n * regex-scanning formulas for identifiers — L0179's scans inside string\n * literals, so `=IF(x,\"Yes\",\"No\")` reports `Undefined names: Yes, No` — and this\n * is what lets them delete that for one shared mapping.\n */\nexport function spreadsheetErrorMarker(code) {\n return MARKERS[code] || null;\n}\n\n/** An error carrying a machine-readable code, so errorCodeOf does not have to scrape. */\nexport function spreadsheetError(code, text) {\n const err = new Error(`${code}: ${text}`);\n err.errorCode = code;\n return err;\n}\n\n/**\n * `new Decimal(value)`, but failing with a code instead of a DecimalError.\n *\n * `[DecimalError] Invalid argument: ` escaping as errorCode 0 is one of the two\n * ways a consumer currently cannot tell what went wrong. Every built-in reducer\n * that reads a number should come through here.\n */\nexport function toDecimal(fnName, index, value) {\n if (!isValidDecimal(value)) {\n throw spreadsheetError(\n ERROR.BAD_ARGUMENT,\n `argument ${index + 1} of ${fnName} is not a number: ${JSON.stringify(String(value))}`,\n );\n }\n return new Decimal(value);\n}\n\n/**\n * The built-in vocabulary, as descriptors.\n *\n * These wrap the EXISTING reducers rather than reimplementing them. That is\n * deliberate and load-bearing: the characterization corpus pins current\n * behaviour to the digit, so the factory has to be a change in how functions\n * are REGISTERED, not in what they compute. Rewriting them here would make\n * every corpus diff ambiguous.\n *\n * Arity bounds are transcribed from what each reducer actually tolerates, not\n * from what would be tidy. `round` reads index 0 and 1 and ignores the rest;\n * `if` reads three and ignores extras. Declaring those honestly is what lets\n * strict mode reject a wrong count without changing loose-mode behaviour.\n */\nexport const builtins = [\n {\n name: 'SUM', minArgs: 1, maxArgs: Infinity, reduce: reducerBuilders.sum,\n},\n {\n name: 'AVERAGE', minArgs: 1, maxArgs: Infinity, reduce: reducerBuilders.average,\n},\n {\n name: 'MUL', minArgs: 1, maxArgs: Infinity, reduce: reducerBuilders.mul,\n},\n {\n name: 'ROUND', minArgs: 1, maxArgs: 2, reduce: reducerBuilders.round,\n},\n {\n name: 'IF', minArgs: 3, maxArgs: 3, reduce: reducerBuilders.if,\n},\n];\n\n/**\n * Operators dispatch through the SAME registry as named calls.\n *\n * Today `$add`, `$minus`, `$multiply`, `$percent` and `$divide` each close over\n * `reducerBuilders.<name>` directly, so overriding `$fn` extends only the\n * `NAME(...)` path and cannot touch `+ - * / %` at any price. Routing them\n * through the registry means overriding MULTIPLY changes `*` too — a property\n * the current design cannot provide.\n */\nexport const DEFAULT_OPERATORS = {\n '+': 'SUM',\n '-': 'MINUS',\n '*': 'MULTIPLY',\n '/': 'DIVIDE',\n '%': 'PERCENT',\n};\n\n/**\n * Reducers reachable only through an operator, never by name.\n *\n * `operatorOnly` keeps them out of `words` and `types.fn`. It is a separate flag\n * rather than \"is it an operator target?\" because SUM is BOTH — it is what `+`\n * dispatches to AND a function people write. Deriving callability from the\n * operator map excluded SUM from the vocabulary, which quietly stopped\n * `=SUM(A1,A2)` resolving at all.\n */\nconst OPERATOR_BUILTINS = [\n {\n name: 'MINUS', minArgs: 1, maxArgs: Infinity, operatorOnly: true, reduce: reducerBuilders.minus,\n},\n {\n name: 'MULTIPLY', minArgs: 1, maxArgs: Infinity, operatorOnly: true, reduce: reducerBuilders.multiply,\n},\n {\n name: 'DIVIDE', minArgs: 1, maxArgs: Infinity, operatorOnly: true, reduce: reducerBuilders.divide,\n},\n {\n name: 'PERCENT', minArgs: 1, maxArgs: Infinity, operatorOnly: true, reduce: reducerBuilders.multiply,\n},\n];\n\n/** Helpers handed to a custom `apply`. Everything a reducer legitimately needs. */\nconst helpers = {\n getCellValue: (str, env) => getCellValue({ env, str }),\n isValidDecimal,\n evaluateCondition,\n toDecimal,\n fail: (code, text) => { throw spreadsheetError(code, text); },\n Decimal,\n};\n\n/**\n * The rule PATTERNS, with the vocabulary left out.\n *\n * Patterns and vocabulary are separable and are owned in different places: this\n * is the grammar of a spreadsheet formula, which changes when the engine gains a\n * capability, while `words` and `types.fn` change every time anyone adds a\n * function. Generating the second from the registry is what collapses the four\n * edits to one; the first is passed through, so a consumer authoring patterns\n * elsewhere (in L0014) can supply its own.\n */\nconst DEFAULT_PATTERNS = {\n eval: {\n '=\\\\type{cellName}': ['$cell'],\n '=?': [{\n '%2': {\n '\\\\type{fn}(\\\\type{args})': '$call',\n '\\\\type{fn}(?,?)': '$call',\n '\\\\type{fn}(?)': '$call',\n '?>=?': '$ge',\n '?<=?': '$le',\n '?!=?': '$ne',\n '?>?': '$gt',\n '?<?': '$lt',\n '?=?': '$eq',\n '?+?': '$add',\n '?-?': '$minus',\n '?*?': '$multiply',\n '?/?': '$divide',\n '?%': '$percent',\n '-?': '$minus',\n },\n }],\n '-?': ['-%1'],\n '\\\\type{cellRange}': ['$range{\"sep\":\"list\"}'],\n '\\\\type{args}': ['$argsep'],\n '\\\\type{cellName}': ['%1%2'],\n '\\\\type{fn}(\\\\type{cellRange})': ['%1(%2)'],\n '??': ['%1%2'],\n '?': ['%1'],\n },\n};\n\nconst TYPE_PATTERNS = {\n args: ['\\\\type{cellName}:\\\\type{cellName}', '?,?'],\n cellName: ['\\\\type{variable}\\\\type{integer}'],\n cellRange: ['\\\\type{cellName}:\\\\type{cellName}'],\n};\n\n/** Merge descriptors by upper-cased name; later wins, so a consumer can override a built-in. */\nfunction buildRegistry(functions) {\n const registry = new Map();\n for (const d of [...builtins, ...OPERATOR_BUILTINS, ...(functions || [])]) {\n if (!d || !d.name) continue;\n registry.set(String(d.name).toUpperCase(), {\n minArgs: 1,\n maxArgs: Infinity,\n ...d,\n name: String(d.name).toUpperCase(),\n });\n }\n return registry;\n}\n\n/** Invoke one descriptor against an argument list. */\nfunction invoke(descriptor, list, env, strict) {\n if (strict && (list.length < descriptor.minArgs || list.length > descriptor.maxArgs)) {\n let want;\n if (descriptor.maxArgs === Infinity) {\n want = `at least ${descriptor.minArgs}`;\n } else if (descriptor.minArgs === descriptor.maxArgs) {\n want = `${descriptor.minArgs}`;\n } else {\n want = `${descriptor.minArgs} to ${descriptor.maxArgs}`;\n }\n throw spreadsheetError(\n ERROR.WRONG_ARITY,\n `${descriptor.name} expects ${want} arguments, got ${list.length}`,\n );\n }\n if (descriptor.apply) {\n return String(descriptor.apply({\n args: list,\n env,\n helpers: { ...helpers, getCellValue: (str) => getCellValue({ env, str }) },\n }));\n }\n return `${list.reduce(descriptor.reduce(env), undefined)}`;\n}\n\n/**\n * Build a spreadsheet vocabulary: its expanders and its rule sets.\n *\n * `strict` turns the new diagnostics on. It is OFF by default and that is not\n * timidity: an unknown function currently returns a plausible string, and a\n * deployed item whose formula has been quietly wrong for a year would start\n * erroring the moment a consumer upgraded. Consumers opt in, watch, then it\n * becomes the default in a major.\n */\nexport function createSpreadsheet(options = {}) {\n const {\n functions = [],\n operators = DEFAULT_OPERATORS,\n patterns = DEFAULT_PATTERNS,\n strict = false,\n } = options;\n\n const registry = buildRegistry(functions);\n\n // The vocabulary, derived. This is the four-edits-to-one step: `words` and\n // `types.fn` are generated from the same registry the reducers come from, so\n // they cannot disagree with it or with each other.\n const callable = [...registry.values()]\n .filter((d) => !d.operatorOnly)\n .map((d) => d.name.toLowerCase())\n .sort();\n const words = Object.fromEntries(callable.map((n) => [n, n]));\n const types = { ...TYPE_PATTERNS, fn: callable };\n\n const dispatch = (name, list, env) => {\n const descriptor = registry.get(String(name).toUpperCase());\n if (!descriptor) {\n if (strict) {\n throw spreadsheetError(ERROR.UNKNOWN_FUNCTION, `unknown function ${String(name).toUpperCase()}`);\n }\n // Loose mode leaves the separator in, so unresolvedCall() can still see it.\n return `${name}${list.join(ARG_SEP)}`;\n }\n return invoke(descriptor, list, env, strict);\n };\n\n const operatorExpander = (opName, transform) => ({\n type: 'fn',\n fn: ({ env }) => ((args) => {\n const list = transform ? transform([...args]) : [...args];\n return dispatch(operators[opName], list, env);\n }),\n });\n\n const expanders = {\n ...baseExpanders,\n $call: {\n type: 'fn',\n fn: ({ env }) => ((args) => dispatch(\n args[0],\n String(args[1] === undefined ? '' : args[1]).split(ARG_SEP),\n env,\n )),\n },\n $add: operatorExpander('+'),\n $minus: operatorExpander('-', (args) => (args.length === 1 ? ['0', ...args] : args)),\n $multiply: operatorExpander('*'),\n $divide: operatorExpander('/'),\n $percent: operatorExpander('%', (args) => [...args, '0.01']),\n };\n\n const evalRules = { words, types, rules: patterns.eval };\n\n return {\n expanders,\n rules: { evalRules },\n functions: [...registry.values()],\n helpers,\n strict,\n /** Check a result for an unresolved call. Returns an error or null. */\n checkResult(value) {\n const residue = unresolvedCall(value);\n if (!residue) return null;\n return spreadsheetError(ERROR.UNRESOLVED, `unresolved expression: ${residue}`);\n },\n };\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Value normalization, transcribed VERBATIM from L0166's TableEditor.tsx (lines 66-418).\n *\n * These are the functions that decide whether what a learner typed *means* the same thing as\n * what the author expected: \"1,234.56\", \"$1234.56\" and \"1.234,56\" are one number; \"7/4/2024\" and\n * \"2024-07-04\" are one date. Scoring is downstream of every one of them, so a difference here is\n * a difference in what gets marked right.\n *\n * Transcribed, not rewritten — the same rule that governs core's validation.ts and params.ts.\n * The quirks are load-bearing and are called out where they are not obvious:\n * - dates use the 1904 epoch, which sidesteps Excel's 1900 leap-year bug;\n * - `normalizeNumberInput` refuses text that merely STARTS with a number (\"35% of total\"),\n * because those are prose, not values;\n * - `normalizeDateInput` guards `Date.parse` with a character allowlist, because V8's parser is\n * permissive enough to read \"7-4=\" as a date.\n *\n * No DOM, no React, no ProseMirror — see ./score.ts for why that matters.\n */\n\n/** A quote character, for the string-aware upcaser below. */\nconst isQuoteChar = (c: string) => [\"\\\"\", \"'\", \"`\"].includes(c);\n\n/**\n * Upper-case a formula WITHOUT touching quoted text: `=sum(a1:a3)` becomes `=SUM(A1:A3)`, but\n * `=\"hello\"` keeps its string intact. Cell names and function names are case-insensitive; string\n * literals are not.\n */\nexport const toUpperCase = (text: any): string => {\n // Convert to string if it's not already\n if (typeof text !== \"string\") {\n text = text == null ? \"\" : String(text);\n }\n return (text && text.split(\"\").reduce((acc: any, c: string) => ({\n inString: isQuoteChar(c) ? !acc.inString : acc.inString,\n text: acc.text + ((acc.inString && c) || c.toUpperCase()),\n }), { inString: false, text: \"\" }).text) || text;\n};\n\n/**\n * Drop the `$` anchors from absolute references outside quoted text: `=$B$4*B$6+$C7` becomes\n * `=B4*B6+C7`.\n *\n * Exact, not an approximation. `$` only changes what a reference becomes when a formula is copied\n * or filled, and a sheet here is authored cell by cell and never filled, so an anchored reference\n * always means the cell it names. It has to happen before anything reads references, because\n * nothing downstream understands `$`: the undefined-name scan read `$B$6` as the name `B`\n * (#NAME!), the dependency parser found no reference in it (so no recalculation), and the formula\n * parser read `$B6` as literal text.\n */\nexport const stripAbsoluteReferences = (text: any): any => {\n if (typeof text !== \"string\" || text.indexOf(\"$\") < 0) return text;\n let out = \"\";\n let quote = \"\";\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quote) {\n if (c === quote) quote = \"\";\n } else if (isQuoteChar(c)) {\n quote = c;\n } else if (c === \"$\" && (\n /^[A-Za-z]+\\$?[0-9]/.test(text.slice(i + 1)) || // $B$4, $B4\n (/[A-Za-z]/.test(text[i - 1] || \"\") && /[0-9]/.test(text[i + 1] || \"\")) // B$4\n )) {\n continue;\n }\n out += c;\n }\n return out;\n};\n\nexport const isNumeric = (text: any): boolean => {\n if (!text || typeof text !== \"string\") return false;\n const trimmed = text.trim();\n return !isNaN(Number(trimmed)) && !isNaN(parseFloat(trimmed));\n};\n\nexport const isDateLike = (text: any): boolean => {\n if (!text || typeof text !== \"string\") return false;\n const trimmed = text.trim();\n // Check for common date patterns\n const datePatterns = [\n /^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}$/, // MM/DD/YYYY or M/D/YY\n /^\\d{1,2}-\\d{1,2}-\\d{2,4}$/, // MM-DD-YYYY or M-D-YY\n /^\\d{4}-\\d{1,2}-\\d{1,2}$/, // YYYY-MM-DD\n /^\\d{1,2}\\/\\d{1,2}$/, // MM/DD\n /^\\d{1,2}-\\d{1,2}$/, // MM-DD\n ];\n return datePatterns.some((pattern) => pattern.test(trimmed)) && !isNaN(Date.parse(trimmed));\n};\n\n/**\n * Wrap prose in `\\text{}` so the LaTeX translator treats it as a string rather than as maths.\n * Formulas, existing `\\text{}`, anything carrying a backslash, numbers and dates are left alone.\n */\nexport const wrapPlainTextInLatex = (text: any): string => {\n // Convert to string if it's not already\n if (typeof text !== \"string\") {\n text = text == null ? \"\" : String(text);\n }\n\n if (!text || text.length === 0) {\n return text;\n }\n // If it's a formula (starts with =), don't wrap\n if (text.indexOf(\"=\") === 0) {\n return text;\n }\n // If it's already wrapped in \\text{}, don't double wrap\n if (text.trim().startsWith(\"\\\\text{\") && text.trim().endsWith(\"}\")) {\n return text;\n }\n // If it contains LaTeX commands, don't wrap to avoid breaking them\n if (text.includes(\"\\\\\")) {\n return text;\n }\n\n // If it's a pure number, don't wrap\n if (isNumeric(text)) {\n return text;\n }\n // If it's a pure date, don't wrap\n if (isDateLike(text)) {\n return text;\n }\n // Wrap everything else in \\text{}\n return `\\\\text{${text}}`;\n};\n\n/**\n * Normalizes number input from various formats (e.g., \"1,234.56\", \"$1234.56\", \"1.234,56\")\n * into a standard numeric value.\n * @returns the normalized number, or null if not a valid number\n */\nexport const normalizeNumberInput = (text: any): number | null => {\n if (!text || typeof text !== \"string\") {\n return null;\n }\n let normalized = text.trim();\n if (!normalized) {\n return null;\n }\n\n // Check if this looks like text with a numeric prefix\n // e.g., \"35% of total\", \"100 items\", etc.\n // These should be treated as text, not numbers\n if (/%\\s+\\S/.test(normalized)) {\n // Has percentage followed by more text\n return null;\n }\n\n // Check for number followed by non-unit text\n const numberWithTextPattern = /^[\\d,.$€£¥₹₽-]+\\s+[a-zA-Z]{4,}/;\n if (numberWithTextPattern.test(normalized)) {\n // Has number followed by significant text (not just units)\n return null;\n }\n\n // Save original for parentheses check before removing them\n const originalNormalized = normalized;\n // Remove currency symbols\n const currencySymbols = [\"$\", \"€\", \"£\", \"¥\", \"₹\", \"₽\", \"R$\", \"C$\", \"A$\", \"NZ$\", \"HK$\", \"S$\"];\n currencySymbols.forEach((symbol) => {\n // Escape special regex characters\n const escapedSymbol = symbol.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n normalized = normalized.replace(new RegExp(escapedSymbol, \"g\"), \"\");\n });\n // Handle percentage (convert to decimal)\n const isPercentage = normalized.includes(\"%\");\n normalized = normalized.replace(/%/g, \"\");\n // Handle negative numbers in parentheses e.g., (1,234.56) or ($1,234.56)\n const isNegativeParentheses = /^\\s*\\([^)]+\\)\\s*$/.test(originalNormalized) &&\n /\\d/.test(originalNormalized);\n if (isNegativeParentheses) {\n normalized = normalized.replace(/[()]/g, \"\");\n }\n // Remove spaces\n normalized = normalized.replace(/\\s/g, \"\");\n // Handle negative sign\n const isNegative = normalized.startsWith(\"-\");\n if (isNegative) {\n normalized = normalized.substring(1);\n }\n // Determine decimal separator by analyzing the pattern\n const commaCount = (normalized.match(/,/g) || []).length;\n const periodCount = (normalized.match(/\\./g) || []).length;\n const lastComma = normalized.lastIndexOf(\",\");\n const lastPeriod = normalized.lastIndexOf(\".\");\n let cleanedNumber;\n if (commaCount === 0 && periodCount === 0) {\n // No separators, just a plain number\n cleanedNumber = normalized;\n } else if (commaCount === 0 && periodCount === 1) {\n // Only one period, it's a decimal separator\n cleanedNumber = normalized;\n } else if (commaCount === 1 && periodCount === 0) {\n // Only one comma, check if it's likely a decimal\n const afterComma = normalized.substring(lastComma + 1);\n if (afterComma.length === 3 && normalized.length > 4) {\n // Likely thousand separator (e.g., \"1,234\")\n cleanedNumber = normalized.replace(/,/g, \"\");\n } else {\n // Likely decimal separator (e.g., \"1,23\" or \"123,45\")\n cleanedNumber = normalized.replace(\",\", \".\");\n }\n } else if (lastComma > lastPeriod) {\n // Comma is after period, European format (e.g., \"1.234,56\")\n cleanedNumber = normalized.replace(/\\./g, \"\").replace(\",\", \".\");\n } else {\n // Period is after comma, US format (e.g., \"1,234.56\")\n cleanedNumber = normalized.replace(/,/g, \"\");\n }\n // Check if the result is a valid number (must parse the entire string)\n if (!isNumeric(cleanedNumber)) {\n return null;\n }\n const num = parseFloat(cleanedNumber);\n // Apply modifiers\n let result = num;\n // Apply negative\n if (isNegative || isNegativeParentheses) {\n result = -Math.abs(result);\n }\n // Apply percentage conversion\n if (isPercentage) {\n result = result / 100;\n }\n return result;\n};\n\n/**\n * Converts a Date object to an Excel serial number.\n * Uses the 1904 date system (Mac Excel) to avoid the 1900 leap year bug.\n * Excel serial dates start from January 1, 1904 as day 1.\n */\nconst dateToSerial = (date: Date): number => {\n const excelEpoch = new Date(1904, 0, 1);\n const msPerDay = 24 * 60 * 60 * 1000;\n const daysSinceEpoch = Math.floor((date.getTime() - excelEpoch.getTime()) / msPerDay);\n return daysSinceEpoch + 1;\n};\n\n/**\n * Normalizes date input from various formats into a serial number.\n * @returns the date serial number, or null if not a valid date\n */\nexport const normalizeDateInput = (text: any): number | null => {\n if (!text || typeof text !== \"string\") {\n return null;\n }\n const trimmed = text.trim();\n if (!trimmed) {\n return null;\n }\n // Handle relative dates\n const today = new Date();\n const lowerText = trimmed.toLowerCase();\n if (lowerText === \"today\") {\n return dateToSerial(new Date(today.getFullYear(), today.getMonth(), today.getDate()));\n }\n if (lowerText === \"tomorrow\") {\n const tomorrow = new Date(today);\n tomorrow.setDate(today.getDate() + 1);\n return dateToSerial(new Date(tomorrow.getFullYear(), tomorrow.getMonth(), tomorrow.getDate()));\n }\n if (lowerText === \"yesterday\") {\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n return dateToSerial(new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate()));\n }\n // Check if it's just a number (not a date)\n // This includes integers, decimals, and negative numbers\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return null;\n }\n // Check if it looks like a number with thousand separators or currency\n // e.g., \"1,234\" or \"$1,234.56\" or \"€1.234,56\"\n const currencyPattern = /^[$€£¥₹₽]?\\s*-?\\d{1,3}([,.]?\\d{3})*([,.]\\d+)?$|^-?\\d{1,3}([,.]?\\d{3})*([,.]\\d+)?\\s*[$€£¥₹₽%]?$/;\n if (currencyPattern.test(trimmed)) {\n return null;\n }\n // Try to parse various date formats\n // First, try native Date parsing for ISO and common formats.\n // V8's Date.parse is permissive (e.g. Date.parse(\"7-4=\") returns a valid\n // timestamp). Guard with an allowlist of characters that can plausibly\n // appear in a date — digits, separators, spaces, ASCII letters for month\n // names — so things like \"7-4=\" or \"2+3\" never reach the lenient parser.\n if (/^[\\dA-Za-z\\s/\\-.,:T]+$/.test(trimmed)) {\n const parsed = Date.parse(trimmed);\n if (!isNaN(parsed)) {\n return dateToSerial(new Date(parsed));\n }\n }\n // Handle MM/DD/YYYY, MM-DD-YYYY, MM.DD.YYYY\n const usDatePattern = /^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{4})$/;\n const usMatch = trimmed.match(usDatePattern);\n if (usMatch) {\n const month = parseInt(usMatch[1], 10);\n const day = parseInt(usMatch[2], 10);\n const year = parseInt(usMatch[3], 10);\n if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n return dateToSerial(new Date(year, month - 1, day));\n }\n }\n // Handle DD/MM/YYYY, DD-MM-YYYY, DD.MM.YYYY (European format)\n // Note: This could conflict with US format for ambiguous dates like 01/02/2023\n // You may want to make this configurable based on locale\n const euDatePattern = /^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{4})$/;\n const euMatch = trimmed.match(euDatePattern);\n if (euMatch) {\n const day = parseInt(euMatch[1], 10);\n const month = parseInt(euMatch[2], 10);\n const year = parseInt(euMatch[3], 10);\n if (month >= 1 && month <= 12 && day >= 1 && day <= 31 && day > 12) {\n // Only use EU format if day > 12 to avoid ambiguity\n return dateToSerial(new Date(year, month - 1, day));\n }\n }\n // Handle MM/DD or MM-DD (current year implied)\n const partialDatePattern = /^(\\d{1,2})[/-](\\d{1,2})$/;\n const partialMatch = trimmed.match(partialDatePattern);\n if (partialMatch) {\n const month = parseInt(partialMatch[1], 10);\n const day = parseInt(partialMatch[2], 10);\n if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n return dateToSerial(new Date(today.getFullYear(), month - 1, day));\n }\n }\n // Handle YYYY-MM-DD (ISO format)\n const isoPattern = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/;\n const isoMatch = trimmed.match(isoPattern);\n if (isoMatch) {\n const year = parseInt(isoMatch[1], 10);\n const month = parseInt(isoMatch[2], 10);\n const day = parseInt(isoMatch[3], 10);\n if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n return dateToSerial(new Date(year, month - 1, day));\n }\n }\n return null;\n};\n","// SPDX-License-Identifier: MIT\n/**\n * L0179's spreadsheet vocabulary.\n *\n * This file used to REPLACE translatex's `$fn` expander wholesale, because that\n * was the only way to add a function: `reducerBuilders` was module-private, and\n * the name also had to be hand-added to `words` and to `types.fn` in three\n * separate rule sets. Four edits that had to agree, which is how L0166 and\n * L0179 ended up shipping rule sets whose entire difference was the word\n * `power`.\n *\n * translatex 0.25.0 derives all of that from one descriptor. What is left here\n * is POWER itself and `prepareFormula`, which works around a defect in\n * parselatex rather than in translatex and therefore still has to live in a\n * consumer.\n *\n * No DOM, no React, no ProseMirror — this is imported by ../scoring/score.ts,\n * which Learnosity runs server-side.\n */\nimport { createSpreadsheet } from \"@graffiticode/translatex/src/spreadsheet.js\";\n\nimport { toUpperCase, stripAbsoluteReferences } from \"./normalize.js\";\n\n/**\n * POWER(base, exponent), Excel's spelling of `base ^ exponent`.\n *\n * Decimal rather than `Math.pow`, for the reason every reducer upstream uses\n * it: an integer exponent has to come out EXACT. `POWER(1.05,4)` is\n * 1.21550625, not 1.2155062500000004 — and the difference is not cosmetic,\n * because a scored cell compares the learner's typed value against this string.\n *\n * `#NUM!` covers both of Excel's rejections here — an argument that is not a\n * number, and a result that is not real — because the engine's error surface is\n * a marker string, not a code.\n */\nconst POWER = {\n name: \"POWER\",\n minArgs: 2,\n maxArgs: 2,\n apply: ({ args, helpers }: any) => {\n const [base, exponent] = args.map((a: string) => helpers.getCellValue(a));\n try {\n const result = helpers.toDecimal(\"POWER\", 0, base)\n .pow(helpers.toDecimal(\"POWER\", 1, exponent));\n return result.isFinite() ? `${result}` : \"#NUM!\";\n } catch {\n return \"#NUM!\";\n }\n },\n};\n\nconst sheet = createSpreadsheet({ functions: [POWER] });\n\n/** translatex's expanders plus L0179's functions. */\nexport const expanders = sheet.expanders;\n\n/** The generated evaluation rule set. `words` and `types.fn` come from the registry. */\nexport const evalRules = sheet.rules.evalRules;\n\n/** Detect a call that did not resolve. See prepareFormula for why one still can. */\nexport const checkResult = (value: any) => sheet.checkResult(value);\n\n/**\n * A formula's string literals, rebound as cells the parser can read.\n *\n * parselatex rejects `\"` outright (1004), so `=IF(A1>B1,A1,\"\")`, the ordinary way to leave a cell\n * blank, was #NAME!. Each literal becomes a synthetic reference (`Z900000000`, ...) bound in `env`\n * to the literal's text, which IF passes through and `=`/`<>` compare as text.\n *\n * The empty string is bound to a sentinel instead, and `decode` swaps it back: translatex resolves\n * a reference as `env[name].val || name`, so a reference whose value is \"\" evaluates to its own\n * NAME.\n *\n * A non-numeric literal used as an arithmetic operand (`=A1+\"x\"`) sets `error`. The reducers skip\n * a value that isn't a number, so it would otherwise evaluate silently to 10. Excel says #VALUE!.\n *\n * The row numbers are far past anything the compiler would author, so a synthetic name can't\n * collide with a real cell. Excel's doubled quote (`\"say \"\"hi\"\"\"`) is unescaped.\n */\nconst LITERAL_ROW = 900000000;\nconst EMPTY = `${String.fromCharCode(3)}EMPTY${String.fromCharCode(3)}`;\nconst ARITHMETIC = /[-+*/^%&]/;\n\nexport const bindStringLiterals = (text: any) => {\n const env: any = {};\n let error: string | undefined;\n let index = 0;\n if (typeof text !== \"string\" || text.indexOf(\"\\\"\") < 0) {\n return { text, env, error, decode: (val: any) => val };\n }\n const bound = text.replace(/\"((?:[^\"]|\"\")*)\"/g, (match: string, body: string, at: number) => {\n const literal = body.replace(/\"\"/g, \"\\\"\");\n const before = text.slice(0, at).trimEnd().slice(-1);\n const after = text.slice(at + match.length).trimStart().charAt(0);\n const isOperand = ARITHMETIC.test(before) || ARITHMETIC.test(after);\n if (isOperand && (literal.trim() === \"\" || isNaN(Number(literal)))) {\n error ??= `Text used as a number: ${match}`;\n }\n const name = `Z${LITERAL_ROW + index++}`;\n env[name] = { val: literal === \"\" ? EMPTY : literal, type: \"text\" };\n return name;\n });\n const decode = (val: any) => (\n typeof val === \"string\" && val.indexOf(EMPTY) >= 0 ? val.split(EMPTY).join(\"\") : val\n );\n return { text: bound, env, error, decode };\n};\n\n/** The function names the rule set knows, upper-cased as a formula is when scanned. */\nconst FN_NAMES = new Set<string>(evalRules.types.fn.map((n: string) => n.toUpperCase()));\n\nconst isQuoteChar = (c: string) => c === \"\\\"\" || c === \"'\" || c === \"`\";\n\n/** The index of the `)` closing the `(` at `open`, or -1. Parens inside a string literal don't count. */\nconst matchParen = (text: string, open: number): number => {\n let depth = 0;\n let inString = false;\n for (let i = open; i < text.length; i++) {\n const c = text[i];\n if (isQuoteChar(c)) { inString = !inString; continue; }\n if (inString) continue;\n if (c === \"(\") depth++;\n else if (c === \")\" && --depth === 0) return i;\n }\n return -1;\n};\n\n/**\n * Excel's not-equal, `<>`, spelled `!=` outside quoted text.\n *\n * The rule set has `?!=?` and nothing for `<>`, and parselatex has no `<>` token, so `A1<>A2` lexed\n * as `<` then `>` and every `IF(x<>y, …)` took its true branch, equal or not.\n */\nconst spellNotEqual = (text: string): string => {\n if (text.indexOf(\"<>\") < 0) return text;\n let out = \"\";\n let quote = \"\";\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quote) {\n if (c === quote) quote = \"\";\n } else if (isQuoteChar(c)) {\n quote = c;\n } else if (c === \"<\" && text[i + 1] === \">\") {\n out += \"!=\";\n i++;\n continue;\n }\n out += c;\n }\n return out;\n};\n\n/**\n * Excel's exponent, `a^b`, spelled `POWER(a,b)` outside quoted text.\n *\n * parselatex reads `^` as a LaTeX superscript, which is wrong for a spreadsheet in four ways:\n * `2^10` takes one digit of the exponent (20), `(1+B7)^(12*A14)` loses part of its exponent,\n * `2^3^2` groups to the right (512), and `-2^2` negates after raising (-4). Before this, `^` had no\n * rule at all and the exponent was silently dropped: `=2^3` was 2.\n *\n * Rewriting to POWER reuses its exact Decimal arithmetic and follows Excel's rules: `^` groups to\n * the left (`2^3^2` is 64) and a leading unary minus belongs to the base (`-2^2` is 4). An operand is\n * a number, reference, function call, parenthesised group or string, with any unary signs before it\n * and a postfix `%` after it.\n */\nconst OPERAND_CHAR = /[A-Z0-9_.:]/;\nconst PRECEDES_UNARY = /[=(,<>+\\-*/^&!]/;\n\nconst operandStart = (text: string, end: number): number => {\n let i = end;\n while (i >= 0 && text[i] === \" \") i--;\n while (i >= 0 && text[i] === \"%\") { i--; while (i >= 0 && text[i] === \" \") i--; }\n if (text[i] === \")\") {\n let depth = 0;\n for (; i >= 0; i--) {\n if (text[i] === \")\") depth++;\n else if (text[i] === \"(\" && --depth === 0) break;\n }\n i--;\n while (i >= 0 && OPERAND_CHAR.test(text[i])) i--; // the callee, if this is a call\n } else if (isQuoteChar(text[i])) {\n const q = text[i];\n i--;\n while (i >= 0 && text[i] !== q) i--;\n i--;\n } else {\n while (i >= 0 && OPERAND_CHAR.test(text[i])) i--;\n }\n let start = i + 1;\n // Unary signs bind tighter than `^` in Excel, so they belong to the base.\n for (;;) {\n let j = start - 1;\n while (j >= 0 && text[j] === \" \") j--;\n if (j < 1 || (text[j] !== \"-\" && text[j] !== \"+\")) break;\n let k = j - 1;\n while (k >= 0 && text[k] === \" \") k--;\n if (k >= 0 && !PRECEDES_UNARY.test(text[k])) break;\n start = j;\n }\n return start;\n};\n\nconst operandEnd = (text: string, begin: number): number => {\n let i = begin;\n while (i < text.length && (text[i] === \" \" || text[i] === \"-\" || text[i] === \"+\")) i++;\n if (isQuoteChar(text[i])) {\n const q = text[i];\n i++;\n while (i < text.length && text[i] !== q) i++;\n i++;\n } else {\n while (i < text.length && OPERAND_CHAR.test(text[i])) i++;\n let j = i;\n while (j < text.length && text[j] === \" \") j++;\n if (text[j] === \"(\") {\n const close = matchParen(text, j);\n i = close < 0 ? text.length : close + 1;\n }\n }\n let j = i;\n while (j < text.length && (text[j] === \" \" || text[j] === \"%\")) j++;\n return text[j - 1] === \"%\" ? j : i;\n};\n\n/** The index of the first `^` outside quoted text, or -1. */\nconst firstCaret = (text: string): number => {\n let quote = \"\";\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quote) { if (c === quote) quote = \"\"; }\n else if (isQuoteChar(c)) quote = c;\n else if (c === \"^\") return i;\n }\n return -1;\n};\n\nconst spellPower = (text: string): string => {\n // Leftmost first, so the result becomes the base of the next `^`: left-associative.\n for (let at = firstCaret(text); at > 0; at = firstCaret(text)) {\n const start = operandStart(text, at - 1);\n const end = operandEnd(text, at + 1);\n const base = text.slice(start, at).trim();\n const exponent = text.slice(at + 1, end).trim();\n if (!base || !exponent) break; // malformed; leave it for the parser to report\n text = `${text.slice(0, start)}POWER(${base},${exponent})${text.slice(end)}`;\n }\n return text;\n};\n\n/**\n * Upper-case a formula, drop `$` anchors (see stripAbsoluteReferences), spell `<>` as `!=` and\n * `a^b` as `POWER(a,b)`, and bracket any function call that is an operand of `*` or `/`.\n *\n * THIS IS STILL NEEDED, and it is worth being clear why, because the rest of\n * this file just got much smaller and it would be easy to assume this went too.\n * The defect is in parselatex, not translatex: application by juxtaposition is\n * assembled at the LOWEST multiplicative precedence, so every explicit\n * multiplicative operator binds tighter and closes over the bare callee.\n *\n * =A1/SUM(A1,A2) the call is lost\n * =SUM(A1,A2)/A1 the argument list becomes the numerator, and it throws\n * =SUM(A1,A2)*A1 parses correctly\n *\n * parselatex 1.8.0 fixes this properly, with a real application production —\n * but only for a caller that declares its function names as `{type:'function'}`\n * in env, and translatex 0.25.0 does not. When it does, every case below\n * becomes a test of the parser fix and this function can go.\n *\n * A redundant pair of brackets is the whole workaround: `=A1/(SUM(A1,A2))`\n * evaluates correctly. Every call that is an operand of `*` or `/` is\n * bracketed, rather than only the three of those four positions that are\n * broken — `=SUM(A1,A2)*A1` already parses, and brackets leave it alone. The\n * scan is left to right and bracketing does not skip the bracketed region, so a\n * call nested inside another call is reached on the same pass.\n */\nexport const prepareFormula = (text: any): string => {\n const upper = spellPower(spellNotEqual(toUpperCase(stripAbsoluteReferences(text))));\n if (!upper || upper.indexOf(\"=\") !== 0 || !/[*/]/.test(upper)) return upper;\n\n /** The next character that is not a space, from `i` on. */\n const significantAt = (i: number) => {\n while (i < upper.length && upper[i] === \" \") i++;\n return upper[i] || \"\";\n };\n const isMulDiv = (c: string) => c === \"*\" || c === \"/\";\n\n // index of a `)` -> how many extra `)` to emit after it.\n const extraClose = new Map<number, number>();\n let out = \"\";\n let inString = false;\n let prev = \"\"; // last significant character outside a string\n\n for (let i = 0; i < upper.length; i++) {\n const c = upper[i];\n if (isQuoteChar(c)) { inString = !inString; out += c; prev = c; continue; }\n if (inString) { out += c; continue; }\n\n if (/[A-Z]/.test(c) && (prev === \"\" || !/[A-Z0-9_]/.test(prev))) {\n let j = i;\n while (j < upper.length && /[A-Z0-9_]/.test(upper[j])) j++;\n let open = j;\n while (open < upper.length && upper[open] === \" \") open++;\n if (upper[open] === \"(\" && FN_NAMES.has(upper.slice(i, j))) {\n const end = matchParen(upper, open);\n if (end >= 0 && (isMulDiv(prev) || isMulDiv(significantAt(end + 1)))) {\n out += \"(\";\n extraClose.set(end, (extraClose.get(end) || 0) + 1);\n }\n }\n }\n\n out += c;\n if (c === \")\") out += \")\".repeat(extraClose.get(i) || 0);\n if (c !== \" \") prev = c;\n }\n return out;\n};\n","// SPDX-License-Identifier: MIT\n/**\n * Sheet-qualified cell keys: `\"s1!A1\"`.\n *\n * WHY A FLAT KEY SPACE RATHER THAN A NESTED SHAPE. The Learnosity lifecycle lives in\n * `@graffiticode/learnosity-cqt`, a published package shared with every other cell-scored\n * Graffiticode language, and it is flat-keyed in three places that cannot be changed from here:\n *\n * - `mergeResponse` folds a response back in with `interaction.cells[cellName] = ...`;\n * - the `response` reducer persists `{...interaction.cells, ...args.cells}`;\n * - `Scorer.score()` sums `scoredCells[key].score.points` over one flat map.\n *\n * Two sheets both holding `A1` would collide at all three and mis-score silently. Qualifying the\n * KEY instead of nesting the SHAPE keeps every one of them working untouched, and matches the\n * convention a spreadsheet already uses for a cell on another sheet.\n *\n * A program with one sheet keeps bare `A1` keys, exactly as before — so every response already\n * stored against an existing item still reads correctly.\n */\n\n/** `\"s1!A1\"` → `[\"s1\", \"A1\"]`; `\"A1\"` → `[undefined, \"A1\"]`. */\nexport function splitKey(key: string): [string | undefined, string] {\n const i = key.indexOf(\"!\");\n return i < 0 ? [undefined, key] : [key.slice(0, i), key.slice(i + 1)];\n}\n\nexport const qualifyKey = (sheetId: string, name: string) => `${sheetId}!${name}`;\n\n/** Re-key a bare cell map onto one sheet. Used on the way out of the grid. */\nexport function qualify(sheetId: string, cells: Record<string, any>): Record<string, any> {\n return Object.keys(cells || {}).reduce((acc: Record<string, any>, name) => {\n acc[qualifyKey(sheetId, name)] = cells[name];\n return acc;\n }, {});\n}\n\n/**\n * The saved answers belonging to one sheet, taken from the flat `interaction.cells`.\n *\n * This exists because of how the Learnosity lifecycle restores a response. `mergeResponse` folds\n * it into `interaction.cells` and nowhere else — which is right for a single sheet, since that is\n * what the grid renders from. A multi-sheet grid renders from `interaction.sheets[i].cells`,\n * which the fold never touches, so without this overlay a learner reopens a two-sheet item and\n * finds every answer they saved gone from the screen while it is still in the response.\n *\n * ONLY qualified keys are taken. An unqualified key in a multi-sheet model is the authored flat\n * mirror of the first sheet, not an answer, and treating it as one would overwrite that sheet\n * with its own pre-response state.\n */\nexport function responseOverlay(\n interactionCells: Record<string, any>,\n sheetId: string,\n): Record<string, any> {\n const out: Record<string, any> = {};\n for (const key of Object.keys(interactionCells || {})) {\n const [id, name] = splitKey(key);\n if (id === sheetId) out[name] = interactionCells[key];\n }\n return out;\n}\n\n/**\n * Split a possibly-qualified map into one bare-keyed map per sheet.\n *\n * An unqualified key belongs to the FIRST sheet. That is not a fallback for convenience — it is\n * what makes an existing single-sheet response keep its meaning when the same code path starts\n * handling several sheets.\n */\nexport function splitBySheet(\n cells: Record<string, any>,\n sheetIds: string[],\n): Record<string, Record<string, any>> {\n const out: Record<string, Record<string, any>> = {};\n for (const id of sheetIds) out[id] = {};\n for (const key of Object.keys(cells || {})) {\n const [sheetId, name] = splitKey(key);\n const id = sheetId ?? sheetIds[0];\n if (!out[id]) out[id] = {};\n out[id][name] = cells[key];\n }\n return out;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Scoring, transcribed VERBATIM from L0166's TableEditor.tsx (lines 419-548, 627-692, 829-848).\n *\n * WHY THIS IS ITS OWN MODULE, with no React and no ProseMirror anywhere in its import graph:\n * L0166 exports `scoreCells` from the same entry as its Form, and does not declare\n * `sideEffects: false`. So importing the scorer drags in React and the whole spreadsheet — about\n * 500 kB of dead weight in L0179's Learnosity scorer bundle, and the reason L0166's own deployed\n * scorer cannot be loaded in bare Node: it touches `document` at import time. Learnosity runs the\n * scorer SERVER-side as well as in the browser, so that is not a size complaint, it is a\n * correctness one. Keep this file free of the DOM.\n *\n * Transcribed rather than rewritten, the same rule that governs core's validation.ts and\n * params.ts. Two quirks are carried over deliberately and are NOT to be tidied without a\n * behaviour change of their own:\n * - `getRegionValidations` returns only the FIRST region (its own TODO says so), so a program\n * with several row regions scores only one of them today;\n * - `equivValue` compares stringified values, so `val` and `expected` must already have been\n * normalized by the caller — which is what the `method === \"value\"` branch of `scoreCell`\n * spends most of its length doing.\n *\n * `scoreCells` takes the learner's RESPONSE map, not `interaction.cells`. `interactionCells` is\n * the authored grid, passed through so an `expected` written as a formula can be evaluated\n * against it.\n */\nimport { TransLaTeX } from \"@graffiticode/translatex\";\n\nimport { normalizeRules } from \"./translatex-rules.js\";\nimport { evalRules, expanders, prepareFormula, bindStringLiterals } from \"./translatex-extensions.js\";\nimport {\n toUpperCase,\n stripAbsoluteReferences,\n wrapPlainTextInLatex,\n normalizeNumberInput,\n normalizeDateInput,\n} from \"./normalize.js\";\nimport { qualify, splitBySheet } from \"./sheets.js\";\n\n/**\n * Everything one scoring pass is allowed to remember.\n *\n * Created per `scoreCells` call and dropped when it returns. Deliberately NOT module-level: this\n * module is loaded server-side by the Learnosity scorer, where a shared map would grow without\n * bound across invocations and hold one tenant's cell values live while another is scored.\n */\ninterface ScoreContext {\n /** normalizeValue, keyed on the stringified value. */\n normalized: Map<string, any[]>;\n /** evaluateExpectedFormula, keyed on the formula text. */\n expected: Map<string, any>;\n /** The `val`-augmented authored grid, built once instead of once per assessed cell. */\n env?: any;\n}\n\nconst createScoreContext = (): ScoreContext => ({\n normalized: new Map(),\n expected: new Map(),\n});\n\n/**\n * Run a value through the LaTeX translator so two spellings of the same thing compare equal.\n * A formula comes back as its comma-separated normal form; anything else as a single-element\n * array. Errors are logged and the original text is kept — scoring never throws.\n */\nconst normalizeValue = (value: any, memo?: Map<string, any[]>): any[] => {\n // Handle non-string values (numbers, dates as serial numbers)\n if (typeof value === \"number\") {\n return [value];\n }\n\n // Handle null/undefined\n if (value == null) {\n return [value];\n }\n\n // Convert to string for processing\n const text = String(value);\n // Pure function of the stringified value, and a whole column of an assessed sheet normally\n // carries the SAME `expected` and often the same response, so this is nearly all hits. The memo\n // is supplied by the caller and dies with the call; see scoreCells.\n const hit = memo && memo.get(text);\n if (hit) return hit;\n let result: any[] = [text];\n\n try {\n const options = {\n // allowThousandsSeparator: true,\n keepTextWhitespace: true,\n ...normalizeRules,\n };\n if (text && text.length > 0) {\n const processedText = text.indexOf(\"=\") === 0 ? toUpperCase(stripAbsoluteReferences(text)) : wrapPlainTextInLatex(text);\n const translate = TransLaTeX.buildTranslator(options, expanders);\n translate(processedText, (err: any, val: any) => {\n if (err && err.length) {\n console.error(err);\n }\n result = text.indexOf(\"=\") === 0 ? val.split(\",\") : [val];\n });\n }\n } catch (x: any) {\n console.log(\"parse error: \" + x.stack);\n }\n if (memo) memo.set(text, result);\n return result;\n};\n\nconst equivFormula = (actual: any, expected: any, memo?: Map<string, any[]>): boolean => {\n const normalizedActual = normalizeValue(actual, memo);\n const normalizedExpected = normalizeValue(expected, memo);\n\n // Check if arrays have same length\n if (normalizedActual.length !== normalizedExpected.length) {\n return false;\n }\n\n // Simple string comparison for formula text\n return normalizedActual.every((val, index) => {\n const expectedVal = normalizedExpected[index];\n // Just compare as strings since we're comparing formula text\n return val === expectedVal;\n });\n};\n\nconst equivValue = (actual: any, expected: any, actualType: any, expectedType: any): boolean => {\n // First check type compatibility\n if (actualType && expectedType && actualType !== expectedType) {\n return false;\n }\n\n // Both values should be strings now, so direct comparison works\n return actual !== undefined && actual === expected;\n};\n\n/**\n * Evaluate an `expected` that was authored as a formula against the authored grid, so\n * `expected \"=A1*2\"` grades against whatever A1 actually holds this render.\n */\nexport const evaluateExpectedFormula = (formula: any, interactionCells: any, ctx?: ScoreContext): any => {\n if (!formula || !formula.startsWith(\"=\") || !interactionCells) {\n return formula;\n }\n // The same `expected` formula usually repeats down a whole column, and it resolves against a\n // grid that does not change during one scoring pass — so both the env and the answer are worth\n // keeping for the duration of the call.\n const cached = ctx && ctx.expected.get(formula);\n if (cached !== undefined) return cached;\n // Build env with val property from text, since TransLaTeX looks up env[name].val\n let env = ctx && ctx.env;\n if (!env) {\n env = {};\n for (const [name, cell] of Object.entries(interactionCells)) {\n env[name] = { ...(cell as any), val: (cell as any).val || (cell as any).text };\n }\n if (ctx) ctx.env = env;\n }\n // A literal's binding is per formula, so it goes on a copy — `env` is shared across the pass.\n const literals = bindStringLiterals(formula);\n if (literals.error) {\n if (ctx) ctx.expected.set(formula, \"#VALUE!\");\n return \"#VALUE!\";\n }\n const options = {\n keepTextWhitespace: true,\n env: literals.text === formula ? env : { ...env, ...literals.env },\n ...evalRules,\n };\n const processedText = prepareFormula(literals.text);\n const translate = TransLaTeX.buildTranslator(options, expanders);\n let result = formula;\n translate(processedText, (err: any, val: any) => {\n if (!err || !err.length) {\n result = String(literals.decode(val));\n }\n });\n if (ctx) ctx.expected.set(formula, result);\n return result;\n};\n\n/** Score one cell against one `assess` record. Returns `{points, isValid}`, never throws. */\nexport const scoreCell = (\n { method, expected, points = 1 }: any,\n { val, formula, type }: any = { val: undefined, formula: undefined, type: undefined },\n interactionCells: any = undefined,\n ctx: ScoreContext | undefined = undefined,\n): any => {\n // For assessment by value, also consider the type\n if (method === \"value\") {\n // If expected is a formula, evaluate it against the interaction cells\n let resolvedExpected = expected;\n if (typeof expected === \"string\" && expected.startsWith(\"=\")) {\n resolvedExpected = evaluateExpectedFormula(expected, interactionCells, ctx);\n }\n\n // Parse expected value to determine its type if not provided\n let expectedType = \"text\";\n let expectedVal = resolvedExpected;\n\n if (resolvedExpected != null) {\n const expectedStr = String(resolvedExpected);\n // Check if it's a date\n const normalizedDate = normalizeDateInput(expectedStr);\n if (normalizedDate) {\n expectedType = \"date\";\n // Store as string to match how we store val\n expectedVal = String(normalizedDate);\n } else {\n // Check if it's a number\n const normalizedNumber = normalizeNumberInput(expectedStr);\n if (normalizedNumber !== null) {\n expectedType = \"number\";\n // Store as string to match how we store val\n expectedVal = String(normalizedNumber);\n }\n }\n }\n\n // Compare values and types (both are strings now)\n if (equivValue(val, expectedVal, type, expectedType)) {\n return { points, isValid: true };\n }\n } else if (method === \"formula\" && equivFormula(formula, expected, ctx && ctx.normalized)) {\n // For formula assessment, just compare the formula text\n return { points, isValid: true };\n }\n\n return { points: 0, isValid: false };\n};\n\nconst getCellValue = (cell: any) => (\n cell.text || cell.val\n);\n\nconst getExpectedCellValue = (cell: any) => (\n cell?.text || cell?.attrs?.assess?.expected\n);\n\n/**\n * The order the learner's rows are actually in, read down the primary column, de-duplicated.\n * Used when a row region is authored `order \"actual\"` — the answer key is re-sorted to match\n * what the learner typed rather than the other way round.\n */\nconst getActualOrder = ({ cells, primaryColumn }: any) => {\n const primaryColumnCellNames = (\n Object.keys(cells).sort((a, b) => +a.slice(1) - +b.slice(1)).map((name) => (\n (name.slice(0, 1) === primaryColumn && name) || null\n )).filter((x) => x !== null)\n );\n const order = primaryColumnCellNames.map(\n (name: any) => getCellValue(cells[name]) || null,\n );\n const seen = new Set();\n return order.map((item: any) => {\n // Remove dups.\n if (seen.has(item)) {\n return null;\n }\n seen.add(item);\n return item;\n }).filter((x: any) => x !== null);\n};\n\nconst sortAssessRowsToMatchActual = ({ cells, region }: any) => {\n const { primaryColumn, rows } = region;\n const order = getActualOrder({ cells, primaryColumn });\n const dataMap = new Map<any, any>(\n rows.map((row: any): [any, any] => [getExpectedCellValue(row[primaryColumn]), row]),\n );\n const sortedRows = order.map((id: any) => (id !== null ? dataMap.get(id) || null : null));\n return sortedRows;\n};\n\nconst getCellsValidationFromRegionValidation = ({ cells, region }: any) => {\n const rows = (\n (region?.order === \"actual\" &&\n sortAssessRowsToMatchActual({ cells, region })) ||\n region?.rows || []\n );\n // L0166 used `assert()` from the `assert` npm package here. That package pulls in `util`,\n // which reads `process` at module scope and throws `ReferenceError: process is not defined`\n // the moment it reaches a browser. A plain throw is equivalent -- nothing catches this -- and\n // keeps a Node polyfill out of both bundles.\n if (!region) {\n throw new Error(\"getCellsValidationFromRegionValidation() missing region value\");\n }\n const cellsValidation = rows.reduce((acc: any, row: any, index: number) => (\n // TODO mark holes as errors.\n index = row?.id || index + 1,\n row && Object.keys(row).forEach((key) => (\n row[key]?.assess && (acc[key + index] = row[key])\n )),\n acc\n ), {}) || {};\n return cellsValidation;\n};\n\nconst getRegionValidations = ({ cells, validation }: any) => {\n const regions = validation.regions || validation.ranges; // ranges for backward compat\n const regionName = Object.keys(regions).find((key) => (\n key // return the first region name for now.\n ));\n // TODO Handle multiple regions. Split cells by region.\n return [{\n region: regions[regionName as string] || {},\n cells,\n }];\n};\n\n/**\n * The answer key, memoised on the identity of the `validation` it is derived from.\n *\n * It was re-derived on every call, and the renderer calls this on every transaction to paint\n * assess feedback. Two tiers, because what it depends on is not always the same: normally it is a\n * pure function of `validation`, but a region authored `order \"actual\"` re-sorts the key to match\n * the learner's own row order, so it then depends on `cells` as well.\n *\n * WeakMap so nothing is retained once the model is gone — this module runs server-side.\n */\nconst keyByValidation = new WeakMap<object, { plain?: any; byCells?: WeakMap<object, any> }>();\n\nconst ordersByActual = (validation: any): boolean => (\n Object.values((validation?.regions || validation?.ranges || {}) as any)\n .some((r: any) => r?.order === \"actual\")\n);\n\nconst cellsValidationFor = ({ cells, validation }: any): any => {\n const derive = () => {\n const regionValidations = getRegionValidations({ cells, validation });\n return regionValidations.map((regionValidation) => (\n getCellsValidationFromRegionValidation(regionValidation)\n ))[0];\n };\n if (!validation || typeof validation !== \"object\") return derive();\n\n let slot = keyByValidation.get(validation);\n if (!slot) keyByValidation.set(validation, (slot = {}));\n\n if (!ordersByActual(validation)) {\n if (slot.plain === undefined) slot.plain = derive();\n return slot.plain;\n }\n if (!cells || typeof cells !== \"object\") return derive();\n if (!slot.byCells) slot.byCells = new WeakMap();\n let keyed = slot.byCells.get(cells);\n if (keyed === undefined) slot.byCells.set(cells, (keyed = derive()));\n return keyed;\n};\n\n/**\n * The per-sheet ids a multi-sheet `validation` carries, or null for the single-sheet shape.\n *\n * The compiler emits `validation.sheets` only when a program actually has several sheets, so the\n * absence of this key IS the single-sheet path — no flag to keep in step, and an item compiled\n * before sheets existed takes exactly the code path it always did.\n */\nconst sheetIdsOf = (validation: any): string[] | null => {\n const ids = validation?.sheets ? Object.keys(validation.sheets) : null;\n return ids && ids.length ? ids : null;\n};\n\n/** Per sheet, the authored grid to evaluate an `expected` formula against. */\nconst interactionFor = (interactionCells: any, id: string, ids: string[]) => {\n if (!interactionCells) return undefined;\n const split = splitBySheet(interactionCells, ids);\n // A caller that passed one flat grid means it for whichever sheet is being scored.\n return Object.keys(split[id] || {}).length ? split[id] : interactionCells;\n};\n\n/**\n * The answer key, keyed the way the response is: bare `A2` for one sheet, `s2!A2` once there are\n * several. Callers (including Learnosity's suggested-answers list) index the response with these\n * keys, so the two must agree.\n */\nexport const getCellsValidation = ({ cells, validation }: any): any => {\n const ids = sheetIdsOf(validation);\n if (!ids) return cellsValidationFor({ cells, validation });\n const bySheet = splitBySheet(cells || {}, ids);\n return ids.reduce((acc: any, id: string) => Object.assign(\n acc,\n qualify(id, cellsValidationFor({ cells: bySheet[id], validation: validation.sheets[id] })),\n ), {});\n};\n\n/**\n * Score a response map. Returns the same map with a `score` added to each assessed cell; the\n * caller sums `score.points` and compares against `validation.points`.\n *\n * With several sheets each is scored against its OWN validation rather than a merged one. That\n * is the same separation the compiler makes, and for the same reason: the region record is keyed\n * by row and column with no sheet dimension, so one merged pass has sheet 2's `A1` overwrite\n * sheet 1's answer key — leaving a maximum that no correct response can reach.\n */\nexport const scoreCells = ({ cells, validation, interactionCells = undefined }: any): any => {\n // One context for the whole pass, dropped on return. See ScoreContext.\n const ctx = createScoreContext();\n const ids = sheetIdsOf(validation);\n if (!ids) {\n const cellsValidation = cellsValidationFor({ cells, validation });\n return scoreAgainst(cells, cellsValidation, interactionCells, ctx);\n }\n const bySheet = splitBySheet(cells || {}, ids);\n return ids.reduce((acc: any, id: string) => {\n const key = cellsValidationFor({ cells: bySheet[id], validation: validation.sheets[id] });\n // Each sheet resolves an `expected` formula against its OWN grid, so the cached env cannot be\n // shared across sheets; the normalizeValue memo is keyed on text and can be.\n const sheetCtx: ScoreContext = { normalized: ctx.normalized, expected: new Map() };\n const scored = scoreAgainst(bySheet[id], key, interactionFor(interactionCells, id, ids), sheetCtx);\n return Object.assign(acc, qualify(id, scored));\n }, {});\n};\n\n/**\n * The single-sheet scoring pass, semantically unchanged from L0166.\n *\n * The reduce this replaces seeded its accumulator with the WHOLE cells map and spread it again\n * per assessed cell — O(assessed x cells) copies, paid on every transaction because the grid\n * scores live to paint assess feedback.\n *\n * The `= undefined` is deliberate and must not become a `continue`. The original wrote the key\n * with an undefined value for an assessed cell the response does not contain, and that is\n * observable: `Object.keys` sees it, and Learnosity's `Scorer.score()` iterates these keys to sum\n * `score.points`. `toEqual` would not catch the difference, which is exactly why it is spelled\n * out here.\n */\nfunction scoreAgainst(cells: any, cellsValidation: any, interactionCells: any, ctx?: ScoreContext): any {\n const scored: any = { ...cells };\n for (const cellName of Object.keys(cellsValidation)) {\n const cell = scored[cellName];\n scored[cellName] = cell && {\n ...cell,\n score: scoreCell(cellsValidation[cellName].assess, cell, interactionCells, ctx),\n } || undefined;\n }\n return scored;\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,11],"mappings":"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R,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,OAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IACR,KAAQ;IAC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"}