@graffiticode/l0179-view 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +17101 -20503
- package/dist/index.js.map +1 -1
- package/dist/scoring-DrRPACjZ.js +4538 -0
- package/dist/scoring-DrRPACjZ.js.map +1 -0
- package/dist/scoring.d.ts +31 -2
- package/dist/scoring.js +2 -19
- package/dist/style.css +2 -1
- package/package.json +9 -7
- package/dist/index-3_WJgYM5.js +0 -4501
- package/dist/index-3_WJgYM5.js.map +0 -1
- package/dist/scoring.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-3_WJgYM5.js","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","../src/scoring/normalize.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 ( )\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 \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 \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 \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","export 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, resume);\n evaluator.evaluate(solution, (err, val) => {\n resume(err, val);\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, resume);\n evaluator.evaluate(solution, (err, val) => {\n resume(err, val);\n });\n };\n }\n function makeEvaluator(spec, resume) {\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 pendingError = e;\n resume([{\n result: null,\n errorCode: parseErrorCode(e.message),\n message: parseMessage(e.message),\n stack: e.stack,\n location: e.location,\n model: null, // Unused, for now.\n toString() {\n return `${this.errorCode}: (${this.location}) ${this.message}\\n${this.stack}`;\n },\n }], ''); // If error, empty string.\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 console.log(`ERROR evaluate() ${e.stack}`);\n const message = e.message;\n resume([{\n result: null,\n errorCode: parseErrorCode(message),\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 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 };\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\nconst rangeReducerBuilder = () => (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(',');\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 };\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 // 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 num = Number(value);\n if (Number.isNaN(num)) {\n return value;\n }\n\n const {\n thousandsSeparator,\n decimalSeparator,\n decimalPlaces,\n prefix,\n suffix,\n showThousands,\n accountingStyle,\n } = formatOptions;\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\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 fn: () => (\n (args) => (\n args.reduce(reducerBuilders.range(), 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 $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\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\nexport const evalRules = {\n \"words\": {\n \"average\": \"average\",\n \"if\": \"if\",\n \"mul\": \"mul\",\n \"round\": \"round\",\n \"sum\": \"sum\",\n },\n \"types\": {\n \"args\": [\n \"\\\\type{cellName}:\\\\type{cellName}\",\n \"?,?\"\n ],\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 \"round\",\n \"sum\",\n ]\n },\n \"rules\": {\n \"=\\\\type{cellName}\": [\n \"$cell\"\n ],\n \"=?\": [\n {\n \"%2\": {\n \"\\\\type{fn}(\\\\type{args})\": \"$fn\",\n \"\\\\type{fn}(?,?)\": \"$fn\",\n \"\\\\type{fn}(?)\": \"$fn\",\n \"?+?\": \"$add\",\n \"?-?\": \"$minus\",\n \"?*?\": \"$multiply\",\n \"?/?\": \"$divide\",\n \"?%\": \"$percent\",\n \"-?\": \"$minus\"\n }\n }\n ],\n \"-?\": [\n \"-%1\"\n ],\n \"\\\\type{cellRange}\": [\n \"$range\"\n ],\n \"\\\\type{args}\": [\n \"%1,%2\"\n ],\n \"\\\\type{cellName}\": [\n \"%1%2\"\n ],\n \"\\\\type{fn}(\\\\type{cellRange})\": [\n \"%1(%2)\"\n ],\n \"??\": [\n \"%1%2\"\n ],\n \"{{var:\\\\type{cellName}}}\": [\n \"{{var:%2}}\"\n ],\n \"?\": [\n \"%1\"\n ]\n }\n};\n\nexport const cellNameRules = {\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 \"round\",\n \"sum\",\n ]\n },\n \"rules\": {\n \"\\\\type{cellName}\": [\n \"%1%2\"\n ],\n \"=?\": [\n {\n \"%2\": {\n \"\\\\type{fn}(\\\\type{cellRange})\": \"%2\",\n \"?+?\": \"%1,%2\",\n \"?-?\": \"%1,%2\",\n \"?*?\": \"%1,%2\",\n \"?/?\": \"%1,%2\",\n \"\\\\type{cellName}\": \"%1%2\"\n }\n }\n ],\n \"\\\\type{cellRange}\": [\n \"$range\"\n ],\n \"??\": [\n \"%1%2\"\n ],\n \"?\": [\n \"%1\"\n ]\n },\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 \"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 * 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\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 * 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, spreadsheetExpanders } from \"@graffiticode/translatex\";\n\nimport { evalRules, normalizeRules } from \"./translatex-rules.js\";\nimport {\n toUpperCase,\n wrapPlainTextInLatex,\n normalizeNumberInput,\n normalizeDateInput,\n} from \"./normalize.js\";\nimport { qualify, splitBySheet } from \"./sheets.js\";\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): 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 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(text) : wrapPlainTextInLatex(text);\n const translate = TransLaTeX.buildTranslator(options, spreadsheetExpanders);\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 return result;\n};\n\nconst equivFormula = (actual: any, expected: any): boolean => {\n const normalizedActual = normalizeValue(actual);\n const normalizedExpected = normalizeValue(expected);\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): any => {\n if (!formula || !formula.startsWith(\"=\") || !interactionCells) {\n return formula;\n }\n // Build env with val property from text, since TransLaTeX looks up env[name].val\n const env: any = {};\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 const options = {\n keepTextWhitespace: true,\n env,\n ...evalRules,\n };\n const processedText = toUpperCase(formula);\n const translate = TransLaTeX.buildTranslator(options, spreadsheetExpanders);\n let result = formula;\n translate(processedText, (err: any, val: any) => {\n if (!err || !err.length) {\n result = String(val);\n }\n });\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): 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);\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)) {\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/** One sheet's answer key, flattened to a cell-name-keyed map: `{A2: {assess: {...}}, ...}`. */\nconst cellsValidationFor = ({ cells, validation }: any): any => {\n const regionValidations = getRegionValidations({ cells, validation });\n const cellsValidations = regionValidations.map((regionValidation) => (\n getCellsValidationFromRegionValidation(regionValidation)\n ));\n return cellsValidations[0];\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 const ids = sheetIdsOf(validation);\n if (!ids) {\n const cellsValidation = cellsValidationFor({ cells, validation });\n return scoreAgainst(cells, cellsValidation, interactionCells);\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 const scored = scoreAgainst(bySheet[id], key, interactionFor(interactionCells, id, ids));\n return Object.assign(acc, qualify(id, scored));\n }, {});\n};\n\n/** The single-sheet scoring pass, unchanged from L0166. */\nfunction scoreAgainst(cells: any, cellsValidation: any, interactionCells: any): any {\n return Object.keys(cellsValidation).reduce((acc: any, cellName: string) => (\n {\n ...acc,\n [cellName]: (acc[cellName] && {\n ...acc[cellName],\n score: scoreCell(cellsValidation[cellName].assess, acc[cellName], interactionCells),\n }) || undefined,\n }\n ), cells);\n}\n"],"names":["EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","i","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","m","n","r","rep","s","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","d8","sinh2_x","d5","d16","d20","getPi","wpr","xsd","halfPi","px","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","e","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","p","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","assert","val","location","err","Assert","message","errorCode","reserveCodeRange","first","last","moduleName","noConflict","range","setLocation","clearLocation","setTimeout","timeout","checkTimeout","setCounter","count","checkCounter","Ast","node","isNode","op","argsNids","key","nid","dump","Model","envStack","env","options","isChemCore","Mp","create","model","parse","rest","fn","src","render","OpStr","OpToLaTeX","fold","isControlCharCode","isListBreakToken","tk","TK_RIGHTPAREN","TK_RIGHTBRACE","TK_RIGHTBRACKET","TK_RANGLE","TK_NEWROW","TK_NEWCOL","TK_END","TK_NONE","stripInvisible","lastCharCode","curIndex","isInvisibleCharCode","isWhitespaceCharCode","isNumberCharCode","text","index","lhs","rhs","prevTerm","term","value","CC_SPACE","CC_BANG","CC_DOLLAR","CC_PERCENT","CC_LEFTPAREN","CC_MUL","CC_ADD","CC_COMMA","CC_SUB","CC_RIGHTPAREN","CC_PERIOD","CC_SLASH","CC_NUM","CC_COLON","CC_SEMICOLON","CC_EQL","CC_QMARK","CC_CONST","CC_LEFTBRACKET","CC_RIGHTBRACKET","CC_CARET","CC_UNDERSCORE","CC_VAR","CC_LEFTBRACE","CC_VERTICALBAR","CC_RIGHTBRACE","CC_SINGLEQUOTE","TK_ADD","TK_CARET","TK_UNDERSCORE","TK_PERIOD","TK_COS","TK_COT","TK_CSC","TK_FRAC","TK_SLASH","TK_EQL","TK_LN","TK_LEFTBRACE","TK_VERTICALBAR","TK_LEFTBRACKET","TK_LEFTPAREN","TK_MUL","TK_NUM","TK_PM","TK_SEC","TK_SIN","TK_SQRT","TK_SUB","TK_TAN","TK_VAR","TK_CONST","TK_COMMA","TK_PERCENT","TK_QMARK","TK_BANG","TK_COLON","TK_SEMICOLON","TK_LG","TK_LOG","TK_TEXT","TK_LT","TK_LE","TK_GT","TK_GE","TK_EXISTS","TK_IN","TK_FORALL","TK_LIM","TK_EXP","TK_TO","TK_SUM","TK_INT","TK_PROD","TK_M","TK_RIGHTARROW","TK_BINOM","TK_BEGIN","TK_VEC","TK_ARCSIN","TK_ARCCOS","TK_ARCTAN","TK_DIV","TK_TYPE","TK_OVERLINE","TK_OVERSET","TK_UNDERSET","TK_BACKSLASH","TK_MATHBF","TK_NE","TK_APPROX","TK_ABS","TK_CDOT","TK_NGTR","TK_NLESS","TK_SINH","TK_COSH","TK_TANH","TK_SECH","TK_COTH","TK_CSCH","TK_ARCSINH","TK_ARCCOSH","TK_ARCTANH","TK_FORMAT","TK_NI","TK_ARCSECH","TK_ARCCSCH","TK_ARCCOTH","TK_ARCSEC","TK_ARCCSC","TK_ARCCOT","TK_MATHFIELD","TK_CUP","TK_BIGCUP","TK_CAP","TK_BIGCAP","TK_PERP","TK_PROPTO","TK_SUBSETEQ","TK_SUPSETEQ","TK_SUBSET","TK_SUPSET","TK_NOT","TK_PARALLEL","TK_NPARALLEL","TK_SIM","TK_CONG","TK_LEFTARROW","TK_LONGRIGHTARROW","TK_LONGLEFTARROW","TK_OVERRIGHTARROW","TK_OVERLEFTARROW","TK_LONGLEFTRIGHTARROW","TK_OVERLEFTRIGHTARROW","TK_IMPLIES","TK_LEFTRIGHTARROW","TK_CAPLEFTRIGHTARROW","TK_CAPRIGHTARROW","TK_DELTA","TK_OPERATORNAME","TK_LEFTCMD","TK_RIGHTCMD","TK_LEFTBRACESET","TK_RIGHTBRACESET","TK_TIMES","TK_INFTY","TK_LANGLE","TK_DOT","TK_IINT","TK_IIINT","tokenToOperator","newNode","nodeEmpty","identifiers","matchThousandsSeparator","ch","lastSeparator","match","separators","matchDecimalSeparator","decimalSeparator","thousandsSeparators","separator","nodePositiveInfinity","numberNode","doScale","roundOnly","n2","lastSeparatorIndex","separatorCount","numberFormat","multiplyNode","flatten","nodeOne","binaryNode","unaryNode","aa","nodeMinusOne","T0","T1","lexemeT0","lexemeT1","scan","scanner","initParser","hd","lexeme","next","lookahead","eat","tc","expected","found","isSimpleFraction","isProperFraction","degreeUnits","muUnits","primaryExpr","expr","expr1","expr2","foundDX","ident","braceExpr","absExpr","parenExpr","inParenExpr","figure","tbl","matrixExpr","root","bracketExpr","lex","unaryExpr","isMinusOne","flattenNestedNodes","multiplicativeExpr","hasDX","stripDX","limitExpr","integralExpr","equalExpr","commaExpr","additiveExpr","name","rowExpr","pipeTokenCount","tk1","tk2","bracketTokenCount","leftCmdFound","exponentialExpr","isMathSymbol","expo","isPolynomial","postfixExpr","isEndOfMultiplicativeExpression","subscriptExpr","foldSubs","baseArgs","argArgs","fractionExpr","isDerivative","derivativeNode","isNumber","frac","isMixedNumber","isPercent","neg","negate","sym","isVar","id","isInteger","isOne","isMultiplicative","isFunction","numer","numerHead","denom","denomHead","operand","dvar","order","implicitOnly","explicitOperator","loopCount","isAdditive","isRelational","isImplies","isEquality","isRepeatingDecimal","isENotation","tmp","isScientific","trimEmptyBraces","mv","bigOne","bigZero","degree","isMultiplicativeNode","prefix","isFunctionNode","ivar","nodeLast","parsingIntegralExpr","ratioExpr","relationalExpr","isNot","impliesExpr","allowSemicolon","lexemeToToken","unicodeToLaTeX","isAlphaCharCode","start","latex","prime","variable","number","identifier","startIndex","keepTextWhitespace","ast.Ast","Parser","rules","ast","getExpanderBuilderConfig","template","expanderBuilders","configIndex","expanderName","expanderConfig","Visitor","visit","resume","lookup","word","words","normalizeFormatObject","fmt","list","code","length","f","parseFormatPattern","pattern","checkNumberType","brk","coeff","checkMatrixType","checkPolynomialType","isSimpleExpression","hasSimpleExpressions","matchType","type","patterns","nargs","expandBinary","expand","expansion","expanderBuilder","expander","vals","matchedExpansion","matches","expansions","getNodeArgsForExpansion","unflattenLeftRecursive","rnode","unflattenRightRecursive","lnode","translate","mergeMaps","globalRules","keys","parts","argRules","getRulesForArgs","nodeArgs","m1","m2","map","context","getExpansionFromTemplate","stop","compileExpansion","compiledExpansion","templates","compiledRules","rule","compileRules","visitor","trim","opt","Core","messages","mu","validateOption","validateOptions","option","solution","spec","makeEvaluator","buildTranslator","valueNode","method","wordsAsEnv","pendingError","parseErrorCode","parseMessage","solutionNode","result","createLetterArray","end","_","createIntegerArray","startNum","endNum","isValidDecimal","parseCellName","isLetter","isIntegerString","isValidCellName","acc","rangeReducerBuilder","colNames","rowNames","colName","rowName","normalizeNode","normalizeReducerBuilder","parseFormatString","formatStr","currencySymbols","workingStr","symbol","decimalMatch","formatNumber","formatOptions","thousandsSeparator","decimalPlaces","suffix","showThousands","accountingStyle","isNegative","formatted","integerPart","decimalPart","withThousands","formatCurrency","isDateFormat","datePatterns","lowerFormat","parseDate","days","macExcelEpoch","parsed","formatDate","date","pad","months","monthsFull","tokens","matched","token","formatValue","format","formattedValue","getCellValue","_a","evaluateCondition","trimmed","reducerBuilders","cellValue","_b","_c","configStr","formatSpec","firstCommaIndex","valueStr","TransLaTeX","translatex.Core","evalRules","formatRules","normalizeRules","isQuoteChar","toUpperCase","isNumeric","isDateLike","wrapPlainTextInLatex","normalizeNumberInput","normalized","originalNormalized","escapedSymbol","isPercentage","isNegativeParentheses","commaCount","periodCount","lastComma","lastPeriod","cleanedNumber","dateToSerial","excelEpoch","msPerDay","normalizeDateInput","today","lowerText","tomorrow","yesterday","usDatePattern","usMatch","month","day","year","euDatePattern","euMatch","partialDatePattern","partialMatch","isoPattern","isoMatch","splitKey","qualifyKey","sheetId","qualify","cells","responseOverlay","interactionCells","splitBySheet","sheetIds","normalizeValue","processedText","spreadsheetExpanders","equivFormula","actual","normalizedActual","normalizedExpected","expectedVal","equivValue","actualType","expectedType","evaluateExpectedFormula","formula","cell","scoreCell","points","resolvedExpected","expectedStr","normalizedDate","normalizedNumber","getExpectedCellValue","getActualOrder","primaryColumn","seen","item","sortAssessRowsToMatchActual","region","rows","dataMap","row","getCellsValidationFromRegionValidation","getRegionValidations","validation","regions","regionName","cellsValidationFor","regionValidation","sheetIdsOf","ids","interactionFor","split","getCellsValidation","bySheet","scoreCells","cellsValidation","scoreAgainst","scored","cellName"],"mappings":"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ACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,OAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,KAAQ;AAAA,QACR,MAAQ;AAAA,QACR,MAAQ;AAAA,Q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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
|