@pie-lib/math-evaluator 2.1.23 → 2.3.0-beta.0

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/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [2.3.0-beta.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/math-evaluator@2.1.23...@pie-lib/math-evaluator@2.3.0-beta.0) (2025-07-15)
7
+
8
+ **Note:** Version bump only for package @pie-lib/math-evaluator
9
+
10
+
11
+
12
+
13
+
14
+ # [2.2.0-beta.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/math-evaluator@2.1.23...@pie-lib/math-evaluator@2.2.0-beta.0) (2025-07-15)
15
+
16
+ **Note:** Version bump only for package @pie-lib/math-evaluator
17
+
18
+
19
+
20
+
21
+
6
22
  ## [2.1.23](https://github.com/pie-framework/pie-lib/compare/@pie-lib/math-evaluator@2.1.22...@pie-lib/math-evaluator@2.1.23) (2023-06-24)
7
23
 
8
24
  **Note:** Version bump only for package @pie-lib/math-evaluator
@@ -0,0 +1 @@
1
+ []
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
8
+
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+
11
+ var _index = _interopRequireWildcard(require("../index"));
12
+
13
+ var _lodash = _interopRequireDefault(require("lodash"));
14
+
15
+ var _templateObject, _templateObject2, _templateObject3;
16
+
17
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+
19
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
20
+
21
+ describe('math-evaluator', function () {
22
+ describe('latexToText', function () {
23
+ var assertLatexToText = function assertLatexToText(input, expected) {
24
+ it("".concat(input, " => ").concat(expected), function () {
25
+ var result = (0, _index.latexToText)(input);
26
+ expect(result).toEqual(expected);
27
+ });
28
+ };
29
+
30
+ assertLatexToText('\\frac{ \\frac{1}{3}}{3}', '(1/3)/3');
31
+ assertLatexToText('\\neq', '0 != 0');
32
+ assertLatexToText('10 \\neq 20', '10 != 20');
33
+ assertLatexToText('10 \\neq', '10 != 0');
34
+ assertLatexToText('\\neq 10', '0 != 10');
35
+ assertLatexToText('40%', 'percent(40)');
36
+ assertLatexToText('%', 'percent(0)');
37
+ assertLatexToText('12%', 'percent(12)');
38
+ assertLatexToText('12\\%', 'percent(12)');
39
+ assertLatexToText('-12.5%', '- percent(12.5)');
40
+ assertLatexToText('-12.5\\%', '- percent(12.5)');
41
+ });
42
+
43
+ var assert = function assert(isEqual, opts) {
44
+ return function (label) {
45
+ return function () {
46
+ var args = Array.from(arguments);
47
+
48
+ var pairs = _lodash["default"].chunk(args, 2);
49
+
50
+ describe(label, function () {
51
+ pairs.forEach(function (_ref) {
52
+ var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
53
+ a = _ref2[0],
54
+ b = _ref2[1];
55
+
56
+ it("".concat(a, " === ").concat(b, " ? ").concat(isEqual), function () {
57
+ expect((0, _index["default"])(a, b, opts)).toBe(isEqual);
58
+ });
59
+ });
60
+ });
61
+ };
62
+ };
63
+ };
64
+
65
+ var assertEqual = assert(true);
66
+ var assertNotEqual = assert(false);
67
+ var assertLatexEqual = assert(true, {
68
+ isLatex: true
69
+ });
70
+ var assertLatexNotEqual = assert(false, {
71
+ isLatex: true
72
+ });
73
+
74
+ var _amjs = function _amjs(only) {
75
+ return function (a, b, equal) {
76
+ var fn = only ? it.only : it;
77
+ fn("".concat(a, " === ").concat(b, " => ").concat(equal), function () {
78
+ var as = (0, _index.latexToText)(a);
79
+ var bs = (0, _index.latexToText)(b);
80
+ expect((0, _index.ave)(as, bs)).toEqual(equal);
81
+ });
82
+ };
83
+ };
84
+
85
+ var assertThroughMathJs = _amjs(false);
86
+
87
+ assertThroughMathJs.only = _amjs(true);
88
+
89
+ var _als = function _als(only) {
90
+ return function (input, expected) {
91
+ var fn = only ? it.only : it;
92
+ fn("".concat(input, " => ").concat(expected), function () {
93
+ expect((0, _index.latexToText)(input)).toEqual(expected);
94
+ });
95
+ };
96
+ };
97
+
98
+ var assertLatexFromString = _als(false);
99
+
100
+ assertLatexFromString.only = _als(true);
101
+ describe('ch6456', function () {
102
+ assertEqual('percent')('-12.5%', '-12.5%');
103
+ assertEqual('percent')('-12.5\\%', '-12.5%');
104
+ assertNotEqual('percent')('-11.5%', '-12.5%');
105
+ });
106
+ describe('ch6456 - latex', function () {
107
+ assertLatexEqual('percent')('\\frac{1}{2} -12.5%', '\\frac{2}{4} -12.5%');
108
+ assertLatexEqual('percent')('\\frac{1}{2} -12.5%', '\\frac{2}{4} -12.5\\%');
109
+ assertLatexNotEqual('percent')('\\frac{4}{2} -12.5%', '\\frac{2}{4} -12.5\\%');
110
+ assertLatexNotEqual('percent')('\\frac{2}{2} -12.5%', '\\frac{2}{4} -12.5\\%');
111
+ });
112
+ describe('PIE-188-math-expressions', function () {
113
+ // it('parses expressions correctly', async () => {
114
+ // geometry
115
+ // MULTIPLY WITH VARIABLE BASED
116
+ assertThroughMathJs('\\parallel x', '\\parallel x', true);
117
+ assertThroughMathJs('\\parallel x', '\\parallel x', true);
118
+ assertThroughMathJs('\\parallel x', '\\parallel 0', false);
119
+ assertThroughMathJs('\\overrightarrow{x + 4}', '\\overrightarrow {4 + x}', true);
120
+ assertThroughMathJs('\\overrightarrow{4x^2 + 4}', '\\overrightarrow {4x^2 + 8 - 4}', true);
121
+ assertThroughMathJs('\\overrightarrow{21*2*x}', '\\overrightarrow {42x}', true);
122
+ assertLatexFromString('\\nparallel x', 'nparallel x');
123
+ assertLatexFromString('\\overrightarrow{x}', 'overrightarrow x');
124
+ assertLatexFromString('\\overleftrightarrow{x}', 'overleftrightarrow x');
125
+ assertLatexFromString('\\perp x', 'perp x');
126
+ assertLatexFromString('\\angle x', 'angle x');
127
+ assertLatexFromString('\\overarc x', 'overarc x');
128
+ assertLatexFromString('\\measuredangle x', 'measuredangle x');
129
+ assertLatexFromString('\\triangle x', 'triangle x');
130
+ assertLatexFromString('\\parallelogram x', 'parallelogram x');
131
+ assertLatexFromString('\\odot x', 'odot x');
132
+ assertLatexFromString('\\degree x', 'degree x');
133
+ assertLatexFromString('\\sim x', 'sim x');
134
+ assertLatexFromString('\\cong x', 'cong x');
135
+ assertLatexFromString('\\ncong x', 'ncong x');
136
+ assertLatexFromString('\\napprox x', 'napprox x'); // UNRECOGNIZED BY LEARNOSITY
137
+
138
+ assertLatexFromString('\\nim x', 'nim x'); // UNRECOGNIZED BY LEARNOSITY
139
+
140
+ assertLatexFromString('\\sim x', 'sim x');
141
+ expect(function () {
142
+ return (0, _index.latexToText)('\\sim 4', {
143
+ unknownCommandBehavior: 'error'
144
+ });
145
+ }).toThrow(); // comparisons
146
+
147
+ assertLatexFromString('1 \\lt 2', '1 < 2');
148
+ assertLatexFromString('1 \\gt 2', '1 > 2');
149
+ assertLatexFromString('1 \\le 2', '1 ≤ 2');
150
+ assertLatexFromString('1 \\ge 2', '1 ≥ 2'); // exponents
151
+
152
+ assertLatexFromString('2^2', '2^2');
153
+ assertLatexFromString('2^{3}', '2^3'); // roots
154
+
155
+ assertLatexFromString('\\sqrt{2}', 'sqrt(2)');
156
+ assertLatexFromString('\\sqrt[{3}]{3}', '3^(1/3)'); // fractions
157
+
158
+ assertLatexFromString('\\frac{3}{3}', '3/3');
159
+ assertLatexFromString('\\frac{x}{3}', 'x/3');
160
+ assertLatexFromString('x\\frac{5}{3}', 'x (5/3)'); // ACTUAL OPERATOR BASED
161
+
162
+ assertLatexFromString('\\overline{x}', 'overline x');
163
+ assertLatexFromString('\\pm', 'pm');
164
+ assertLatexFromString('\\approx x', 'approx x'); // logarithms
165
+
166
+ assertLatexFromString("4'", "4'");
167
+ assertLatexFromString('\\log 4', 'log(4)');
168
+ assertLatexFromString('\\log(4x)', 'log(4 x)');
169
+ assertLatexFromString('\\ln 4', 'ln(4)');
170
+ assertLatexFromString('|4|', '|4|');
171
+ assertLatexFromString('(4)', '4');
172
+ assertLatexFromString('(4 + x) * 5', '(4 + x) * 5');
173
+ assertLatexFromString('[4]', '4');
174
+ assertLatexFromString('\\mu', 'μ');
175
+ assertLatexFromString('\\Sigma', 'Σ');
176
+ assertLatexFromString('x^{15}', 'x^15');
177
+ assertLatexFromString('x_{15}', 'x_15'); // Trigo
178
+
179
+ assertLatexFromString('\\sin(x)', 'sin(x)');
180
+ assertLatexFromString('\\cos(x)', 'cos(x)');
181
+ assertLatexFromString('\\tan(x)', 'tan(x)');
182
+ assertLatexFromString('\\sec(x)', 'sec(x)');
183
+ assertLatexFromString('\\csc(x)', 'csc(x)');
184
+ assertLatexFromString('\\cot(x)', 'cot(x)');
185
+ }); // assertNotEqual('custom latex')('1530', `\\odot`);
186
+
187
+ assertNotEqual('evaluates simple expressions correctly')('0', 'x', '3x', '4x');
188
+ assertEqual('evaluates simple expressions correctly')('x', 'x', '2x', '2x');
189
+ describe('bad frac throws error', function () {
190
+ it('throws an error', function () {
191
+ expect(function () {
192
+ return (0, _index["default"])('\\frac12', '\\frac34', {
193
+ isLatex: true
194
+ });
195
+ }).toThrow('Expecting {');
196
+ });
197
+ });
198
+ describe('7119', function () {
199
+ it.each(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n v | isEqual\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), '4.5', true, '3.2 + 1.3', true, '(4 - \\frac{4}{5}) + 1.3', true, '\\frac{9}{2}', true, '4 \\frac{1}{2}', true, '\\frac{10}{2} - 0.5', true, '4.55', false)('$a == $isEqual', function (_ref3) {
200
+ var v = _ref3.v,
201
+ isEqual = _ref3.isEqual;
202
+ var result = (0, _index["default"])('4 \\frac{1}{2}', v, {
203
+ isLatex: true
204
+ });
205
+ expect(result).toEqual(isEqual);
206
+ });
207
+ it('?', function () {
208
+ expect((0, _index.latexToText)('4\\frac{1}{2}')).toEqual('4 + 1/2');
209
+ });
210
+ });
211
+ assertEqual('evaluates simple expressions correctly 2')('100', '100', '50 + 50', '25 * 4', '200 / 2', '20 * 5', '2.5 * 40', '10 * 10');
212
+ assertNotEqual('evaluates simple expressions correctly 2')('100', '0', '0', '50 * 2', '44 + 57', '100', '44 + 57', '50 * 3');
213
+ assertEqual('evaluates simple expressions correctly 3')('50 + 50', '100', '100 / 2 + 50', '100', '2 + 2', '4', '1/2 + .5', '1');
214
+ assertNotEqual('evaluates simple expressions correctly 3')('50 + 51', '100', '25 * 2 + 51', '100', '1/2 + .5', '1.9', '1/2 + .5', '1.1');
215
+ assertEqual('evaluates simple expressions correctly 4')('50 + 50', '100', '100 / 2 + 50', '100', '2 + 2', '4', '1/2 + .5', '1', '13/2', '13/2', '26/4', '13/2', '6 + 1/2', '13/2', '6.5', '13/2');
216
+ assertNotEqual('evaluates simple expressions correctly 4')('50 + 51', '100', '25 * 2 + 51', '100', '1/2 + .5', '1.9', '1/2 + .5', '1.1', '14/2', '13/2', '6.6', '13/2');
217
+ it.each(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n a | b\n ", " | ", "\n "])), '((x^2 + x) / x) - 1', 'x')('$a == $b', function (_ref4) {
218
+ var a = _ref4.a,
219
+ b = _ref4.b;
220
+ expect((0, _index["default"])(a, b)).toBe(true);
221
+ });
222
+ assertEqual('evaluates simple variable expressions correctly')('x', 'x', 'x + 0', 'x', '(x-2) + 2', 'x', '((x^2 + x) / x) - 1', 'x', '2x/2', 'x', '(x + 2)^2', '(x + 2)^2', 'x^2 + 4x + 4', '(x + 2)^2', 'x^2 + 4(x+1)', '(x + 2)^2', 'x^2 + 8 ((x+1) / 2)', '(x + 2)^2');
223
+ assertNotEqual('evaluates simple variable expressions correctly')('y', 'x', 'x + 1', 'x', 'x^3 + 4x + 4', '(x + 2)^2', 'x^2 + 4(x+2)', '(x + 2)^2');
224
+ assertEqual('evaluates simple variable expressions correctly 2')('(2 + x)^2', '(x + 2)^2', 'x^2 + 4x + 4', '(x + 2)^2', 'x^2 + 4(x+1)', '(x + 2)^2', 'x^2 + 8 ((x+1) / 2)', '(x + 2)^2');
225
+ assertEqual('evaluates expressions correctly with variable exponents')('(2 + x)^2x', '(x + 2)^2x', 'y^(2 x)', 'y^(x+x)');
226
+ assertEqual('evaluates function expressions correctly with variable parameters')('sqrt(4x)', 'sqrt(2x+2x)', 'sqrt(x^2)', 'sqrt(((x+1)^2) - ((x+1)^2) + x^2)');
227
+ assertNotEqual('evaluates simple variable expressions correctly 2')('x^3 + 4x + 4', '(x + 2)^2', 'x^2 + 4(x+2)', '(x + 2)^2');
228
+ it('correctly consumes allowDecimals option', function () {
229
+ expect((0, _index["default"])('123', '123', {
230
+ allowDecimals: true
231
+ })).toEqual(true);
232
+ expect((0, _index["default"])('123', '123.0', {
233
+ allowDecimals: true
234
+ })).toEqual(true);
235
+ expect((0, _index["default"])('123,0', '123.0', {
236
+ allowDecimals: true
237
+ })).toEqual(true);
238
+ expect((0, _index["default"])('123,0', '123.0', {
239
+ allowDecimals: false
240
+ })).toEqual(false);
241
+ expect((0, _index["default"])('123', '123.0', {
242
+ allowDecimals: false
243
+ })).toEqual(false);
244
+ expect((0, _index["default"])('123', '123,0', {
245
+ allowDecimals: false
246
+ })).toEqual(false);
247
+ });
248
+ it('correctly consumes allowDecimals option for complex examples too', function () {
249
+ expect((0, _index["default"])('1500000', '1500000', {
250
+ allowDecimals: true
251
+ })).toEqual(true);
252
+ expect((0, _index["default"])('1,500,000', '1,500,000', {
253
+ allowDecimals: true
254
+ })).toEqual(true);
255
+ expect((0, _index["default"])('1500000', '1,500,000', {
256
+ allowDecimals: true
257
+ })).toEqual(true);
258
+ expect((0, _index["default"])('1500000', '1,500,000.00', {
259
+ allowDecimals: true
260
+ })).toEqual(true);
261
+ expect((0, _index["default"])('1500000', '1,500,000.0', {
262
+ allowDecimals: true
263
+ })).toEqual(true);
264
+ expect((0, _index["default"])('1,500,000.0', '1,500,000.00', {
265
+ allowDecimals: true
266
+ })).toEqual(true);
267
+ expect((0, _index["default"])('1500000', '1,500000', {
268
+ allowDecimals: true
269
+ })).toEqual(false);
270
+ expect((0, _index["default"])('1500000', '1500,000', {
271
+ allowDecimals: true
272
+ })).toEqual(false);
273
+ expect((0, _index["default"])('1500000', '1,500,000.01', {
274
+ allowDecimals: true
275
+ })).toEqual(false);
276
+ expect((0, _index["default"])('1500000', '1,500,00,0', {
277
+ allowDecimals: true
278
+ })).toEqual(false);
279
+ expect((0, _index["default"])('1500000', '1500,000', {
280
+ allowDecimals: true
281
+ })).toEqual(false);
282
+ expect((0, _index["default"])('1500000', ',1500,000', {
283
+ allowDecimals: true
284
+ })).toEqual(false);
285
+ });
286
+ it('evaluates simple trigo expressions correctly', function () {
287
+ expect((0, _index["default"])('sin(x)', 'sin(x)')).toEqual(true);
288
+ expect((0, _index["default"])('tan(x)', 'tan(x)')).toEqual(true);
289
+ });
290
+ it('correctly creates math expressions 1', function () {
291
+ expect((0, _index["default"])('f^{-1}\\left(x\\right)=\\sqrt{x-1}+3', 'f^{-1}\\left(x\\right)=\\sqrt{x-1}+3', {
292
+ allowDecimals: true,
293
+ isLatex: true
294
+ })).toEqual(true);
295
+ });
296
+ it('correctly creates math expressions 2', function () {
297
+ expect((0, _index["default"])('72\\div12=6\\text{eggs}', '72\\div12=6\\text{eggs}', {
298
+ allowDecimals: true,
299
+ isLatex: true
300
+ })).toEqual(true);
301
+ });
302
+ describe('PD-3', function () {
303
+ it.each(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n a | b\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", "\n ", "\n "])), '\\left(x\\right)^{ \\frac{1}{\\left(y + 3\\right)}}', '\\sqrt[\\left(y + 3\\right)]{x}', '\\left(x\\right)^{\\frac{1}{3}}', '\\sqrt[3]{x}', '\\left(x\\right)^{\\frac{1}{n}}', '\\sqrt[n]{x}', '\\left(x\\right)^{\\frac{1}{2}}', '\\sqrt{x}', '\\left(x-1\\right)^{\\frac{1}{2}}+3', '\\sqrt{x-1}+3', 'f^{-1}\\left(x\\right)=\\left(x-1\\right)^{\\frac{1}{2}}+3', 'f^{-1}\\left(x\\right)=\\sqrt{x-1}+3')('$a == $b', function (_ref5) {
304
+ var a = _ref5.a,
305
+ b = _ref5.b;
306
+ var opts = {
307
+ allowDecimals: true,
308
+ isLatex: true
309
+ };
310
+ expect((0, _index["default"])(a, b, opts)).toBeTruthy();
311
+ });
312
+ });
313
+ });
314
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImFzc2VydExhdGV4VG9UZXh0IiwiaW5wdXQiLCJleHBlY3RlZCIsIml0IiwicmVzdWx0IiwiZXhwZWN0IiwidG9FcXVhbCIsImFzc2VydCIsImlzRXF1YWwiLCJvcHRzIiwibGFiZWwiLCJhcmdzIiwiQXJyYXkiLCJmcm9tIiwiYXJndW1lbnRzIiwicGFpcnMiLCJfIiwiY2h1bmsiLCJmb3JFYWNoIiwiYSIsImIiLCJ0b0JlIiwiYXNzZXJ0RXF1YWwiLCJhc3NlcnROb3RFcXVhbCIsImFzc2VydExhdGV4RXF1YWwiLCJpc0xhdGV4IiwiYXNzZXJ0TGF0ZXhOb3RFcXVhbCIsIl9hbWpzIiwib25seSIsImVxdWFsIiwiZm4iLCJhcyIsImJzIiwiYXNzZXJ0VGhyb3VnaE1hdGhKcyIsIl9hbHMiLCJhc3NlcnRMYXRleEZyb21TdHJpbmciLCJ1bmtub3duQ29tbWFuZEJlaGF2aW9yIiwidG9UaHJvdyIsImVhY2giLCJ2IiwiYWxsb3dEZWNpbWFscyIsInRvQmVUcnV0aHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7Ozs7Ozs7QUFFQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLFlBQU07QUFDL0JBLEVBQUFBLFFBQVEsQ0FBQyxhQUFELEVBQWdCLFlBQU07QUFDNUIsUUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFDQyxLQUFELEVBQVFDLFFBQVIsRUFBcUI7QUFDN0NDLE1BQUFBLEVBQUUsV0FBSUYsS0FBSixpQkFBZ0JDLFFBQWhCLEdBQTRCLFlBQU07QUFDbEMsWUFBTUUsTUFBTSxHQUFHLHdCQUFZSCxLQUFaLENBQWY7QUFDQUksUUFBQUEsTUFBTSxDQUFDRCxNQUFELENBQU4sQ0FBZUUsT0FBZixDQUF1QkosUUFBdkI7QUFDRCxPQUhDLENBQUY7QUFJRCxLQUxEOztBQU1BRixJQUFBQSxpQkFBaUIsQ0FBQywwQkFBRCxF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QjtBQUF1QmYsUUFBQUEsT0FBTyxFQUFFO0FBQWhDLE9BQWI7QUFDQXBCLE1BQUFBLE1BQU0sQ0FBQyx1QkFBZWMsQ0FBZixFQUFrQkMsQ0FBbEIsRUFBcUJYLElBQXJCLENBQUQsQ0FBTixDQUFtQ2dDLFVBQW5DO0FBQ0QsS0FaRDtBQWFELEdBZE8sQ0FBUjtBQWVELENBelpPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXJlVmFsdWVzRXF1YWwsIHsgYXZlLCBsYXRleFRvVGV4dCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmRlc2NyaWJlKCdtYXRoLWV2YWx1YXRvcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2xhdGV4VG9UZXh0JywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydExhdGV4VG9UZXh0ID0gKGlucHV0LCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCR7aW5wdXR9ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBsYXRleFRvVGV4dChpbnB1dCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBhc3NlcnRMYXRleFRvVGV4dCgnXFxcXGZyYWN7IFxcXFxmcmFjezF9ezN9fXszfScsICcoMS8zKS8zJyk7XG4gICAgYXNzZXJ0TGF0ZXhUb1RleHQoJ1xcXFxuZXEnLCAnMCAhPSAwJyk7XG4gICAgYXNzZXJ0TGF0ZXhUb1RleHQoJzEwIFxcXFxuZXEgMjAnLCAnMTAgIT0gMjAnKTtcbiAgICBhc3NlcnRMYXRleFRvVGV4dCgnMTAgXFxcXG5lcScsICcxMCAhPSAwJyk7XG4gICAgYXNzZXJ0TGF0ZXhUb1RleHQoJ1xcXFxuZXEgMTAnLCAnMCAhPSAxMCcpO1xuICAgIGFzc2VydExhdGV4VG9UZXh0KCc0MCUnLCAncGVyY2VudCg0MCknKTtcbiAgICBhc3NlcnRMYXRleFRvVGV4dCgnJScsICdwZXJjZW50KDApJyk7XG4gICAgYXNzZXJ0TGF0ZXhUb1RleHQoJzEyJScsICdwZXJjZW50KDEyKScpO1xuICAgIGFzc2VydExhdGV4VG9UZXh0KCcxMlxcXFwlJywgJ3BlcmNlbnQoMTIpJyk7XG4gICAgYXNzZXJ0TGF0ZXhUb1RleHQoJy0xMi41JScsICctIHBlcmNlbnQoMTIuNSknKTtcbiAgICBhc3NlcnRMYXRleFRvVGV4dCgnLTEyLjVcXFxcJScsICctIHBlcmNlbnQoMTIuNSknKTtcbiAgfSk7XG5cbiAgY29uc3QgYXNzZXJ0ID0gKGlzRXF1YWwsIG9wdHMpID0+IChsYWJlbCkgPT5cbiAgICBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5mcm9tKGFyZ3VtZW50cyk7XG4gICAgICBjb25zdCBwYWlycyA9IF8uY2h1bmsoYXJncywgMik7XG5cbiAgICAgIGRlc2NyaWJlKGxhYmVsLCAoKSA9PiB7XG4gICAgICAgIHBhaXJzLmZvckVhY2goKFthLCBiXSkgPT4ge1xuICAgICAgICAgIGl0KGAke2F9ID09PSAke2J9ID8gJHtpc0VxdWFsfWAsICgpID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbChhLCBiLCBvcHRzKSkudG9CZShpc0VxdWFsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gIGNvbnN0IGFzc2VydEVxdWFsID0gYXNzZXJ0KHRydWUpO1xuICBjb25zdCBhc3NlcnROb3RFcXVhbCA9IGFzc2VydChmYWxzZSk7XG5cbiAgY29uc3QgYXNzZXJ0TGF0ZXhFcXVhbCA9IGFzc2VydCh0cnVlLCB7IGlzTGF0ZXg6IHRydWUgfSk7XG4gIGNvbnN0IGFzc2VydExhdGV4Tm90RXF1YWwgPSBhc3NlcnQoZmFsc2UsIHsgaXNMYXRleDogdHJ1ZSB9KTtcblxuICBjb25zdCBfYW1qcyA9IChvbmx5KSA9PiAoYSwgYiwgZXF1YWwpID0+IHtcbiAgICBjb25zdCBmbiA9IG9ubHkgPyBpdC5vbmx5IDogaXQ7XG4gICAgZm4oYCR7YX0gPT09ICR7Yn0gPT4gJHtlcXVhbH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcyA9IGxhdGV4VG9UZXh0KGEpO1xuICAgICAgY29uc3QgYnMgPSBsYXRleFRvVGV4dChiKTtcbiAgICAgIGV4cGVjdChhdmUoYXMsIGJzKSkudG9FcXVhbChlcXVhbCk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0VGhyb3VnaE1hdGhKcyA9IF9hbWpzKGZhbHNlKTtcbiAgYXNzZXJ0VGhyb3VnaE1hdGhKcy5vbmx5ID0gX2FtanModHJ1ZSk7XG5cbiAgY29uc3QgX2FscyA9IChvbmx5KSA9PiAoaW5wdXQsIGV4cGVjdGVkKSA9PiB7XG4gICAgY29uc3QgZm4gPSBvbmx5ID8gaXQub25seSA6IGl0O1xuICAgIGZuKGAke2lucHV0fSA9PiAke2V4cGVjdGVkfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChsYXRleFRvVGV4dChpbnB1dCkpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGFzc2VydExhdGV4RnJvbVN0cmluZyA9IF9hbHMoZmFsc2UpO1xuICBhc3NlcnRMYXRleEZyb21TdHJpbmcub25seSA9IF9hbHModHJ1ZSk7XG5cbiAgZGVzY3JpYmUoJ2NoNjQ1NicsICgpID0+IHtcbiAgICBhc3NlcnRFcXVhbCgncGVyY2VudCcpKCctMTIuNSUnLCAnLTEyLjUlJyk7XG4gICAgYXNzZXJ0RXF1YWwoJ3BlcmNlbnQnKSgnLTEyLjVcXFxcJScsICctMTIuNSUnKTtcbiAgICBhc3NlcnROb3RFcXVhbCgncGVyY2VudCcpKCctMTEuNSUnLCAnLTEyLjUlJyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaDY0NTYgLSBsYXRleCcsICgpID0+IHtcbiAgICBhc3NlcnRMYXRleEVxdWFsKCdwZXJjZW50JykoJ1xcXFxmcmFjezF9ezJ9IC0xMi41JScsICdcXFxcZnJhY3syfXs0fSAtMTIuNSUnKTtcbiAgICBhc3NlcnRMYXRleEVxdWFsKCdwZXJjZW50JykoJ1xcXFxmcmFjezF9ezJ9IC0xMi41JScsICdcXFxcZnJhY3syfXs0fSAtMTIuNVxcXFwlJyk7XG4gICAgYXNzZXJ0TGF0ZXhOb3RFcXVhbCgncGVyY2VudCcpKCdcXFxcZnJhY3s0fXsyfSAtMTIuNSUnLCAnXFxcXGZyYWN7Mn17NH0gLTEyLjVcXFxcJScpO1xuICAgIGFzc2VydExhdGV4Tm90RXF1YWwoJ3BlcmNlbnQnKSgnXFxcXGZyYWN7Mn17Mn0gLTEyLjUlJywgJ1xcXFxmcmFjezJ9ezR9IC0xMi41XFxcXCUnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BJRS0xODgtbWF0aC1leHByZXNzaW9ucycsICgpID0+IHtcbiAgICAvLyBpdCgncGFyc2VzIGV4cHJlc3Npb25zIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHtcblxuICAgIC8vIGdlb21ldHJ5XG5cbiAgICAvLyBNVUxUSVBMWSBXSVRIIFZBUklBQkxFIEJBU0VEXG4gICAgYXNzZXJ0VGhyb3VnaE1hdGhKcygnXFxcXHBhcmFsbGVsIHgnLCAnXFxcXHBhcmFsbGVsIHgnLCB0cnVlKTtcbiAgICBhc3NlcnRUaHJvdWdoTWF0aEpzKCdcXFxccGFyYWxsZWwgeCcsICdcXFxccGFyYWxsZWwgICB4JywgdHJ1ZSk7XG4gICAgYXNzZXJ0VGhyb3VnaE1hdGhKcygnXFxcXHBhcmFsbGVsIHgnLCAnXFxcXHBhcmFsbGVsICAgMCcsIGZhbHNlKTtcbiAgICBhc3NlcnRUaHJvdWdoTWF0aEpzKCdcXFxcb3ZlcnJpZ2h0YXJyb3d7eCArIDR9JywgJ1xcXFxvdmVycmlnaHRhcnJvdyB7NCArIHh9JywgdHJ1ZSk7XG4gICAgYXNzZXJ0VGhyb3VnaE1hdGhKcygnXFxcXG92ZXJyaWdodGFycm93ezR4XjIgKyA0fScsICdcXFxcb3ZlcnJpZ2h0YXJyb3cgezR4XjIgKyA4IC0gNH0nLCB0cnVlKTtcbiAgICBhc3NlcnRUaHJvdWdoTWF0aEpzKCdcXFxcb3ZlcnJpZ2h0YXJyb3d7MjEqMip4fScsICdcXFxcb3ZlcnJpZ2h0YXJyb3cgezQyeH0nLCB0cnVlKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxucGFyYWxsZWwgeCcsICducGFyYWxsZWwgeCcpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXG92ZXJyaWdodGFycm93e3h9JywgJ292ZXJyaWdodGFycm93IHgnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxvdmVybGVmdHJpZ2h0YXJyb3d7eH0nLCAnb3ZlcmxlZnRyaWdodGFycm93IHgnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxwZXJwIHgnLCAncGVycCB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcYW5nbGUgeCcsICdhbmdsZSB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcb3ZlcmFyYyB4JywgJ292ZXJhcmMgeCcpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXG1lYXN1cmVkYW5nbGUgeCcsICdtZWFzdXJlZGFuZ2xlIHgnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFx0cmlhbmdsZSB4JywgJ3RyaWFuZ2xlIHgnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxwYXJhbGxlbG9ncmFtIHgnLCAncGFyYWxsZWxvZ3JhbSB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcb2RvdCB4JywgJ29kb3QgeCcpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXGRlZ3JlZSB4JywgJ2RlZ3JlZSB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcc2ltIHgnLCAnc2ltIHgnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxjb25nIHgnLCAnY29uZyB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcbmNvbmcgeCcsICduY29uZyB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcbmFwcHJveCB4JywgJ25hcHByb3ggeCcpOyAvLyBVTlJFQ09HTklaRUQgQlkgTEVBUk5PU0lUWVxuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXG5pbSB4JywgJ25pbSB4Jyk7IC8vIFVOUkVDT0dOSVpFRCBCWSBMRUFSTk9TSVRZXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcc2ltIHgnLCAnc2ltIHgnKTtcbiAgICBleHBlY3QoKCkgPT4gbGF0ZXhUb1RleHQoJ1xcXFxzaW0gNCcsIHsgdW5rbm93bkNvbW1hbmRCZWhhdmlvcjogJ2Vycm9yJyB9KSkudG9UaHJvdygpO1xuXG4gICAgLy8gY29tcGFyaXNvbnNcblxuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnMSBcXFxcbHQgMicsICcxIDwgMicpO1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCcxIFxcXFxndCAyJywgJzEgPiAyJyk7XG5cbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJzEgXFxcXGxlIDInLCAnMSDiiaQgMicpO1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCcxIFxcXFxnZSAyJywgJzEg4omlIDInKTtcblxuICAgIC8vIGV4cG9uZW50c1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCcyXjInLCAnMl4yJyk7XG5cbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJzJeezN9JywgJzJeMycpO1xuXG4gICAgLy8gcm9vdHNcblxuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXHNxcnR7Mn0nLCAnc3FydCgyKScpO1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcc3FydFt7M31dezN9JywgJzNeKDEvMyknKTtcblxuICAgIC8vIGZyYWN0aW9uc1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcZnJhY3szfXszfScsICczLzMnKTtcblxuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXGZyYWN7eH17M30nLCAneC8zJyk7XG5cbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ3hcXFxcZnJhY3s1fXszfScsICd4ICg1LzMpJyk7XG5cbiAgICAvLyBBQ1RVQUwgT1BFUkFUT1IgQkFTRURcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxvdmVybGluZXt4fScsICdvdmVybGluZSB4Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxccG0nLCAncG0nKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxhcHByb3ggeCcsICdhcHByb3ggeCcpO1xuXG4gICAgLy8gbG9nYXJpdGhtc1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKFwiNCdcIiwgXCI0J1wiKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxsb2cgNCcsICdsb2coNCknKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxsb2coNHgpJywgJ2xvZyg0IHgpJyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcbG4gNCcsICdsbig0KScpO1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCd8NHwnLCAnfDR8Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCcoNCknLCAnNCcpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnKDQgKyB4KSAqIDUnLCAnKDQgKyB4KSAqIDUnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1s0XScsICc0Jyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcbXUnLCAnzrwnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxTaWdtYScsICfOoycpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygneF57MTV9JywgJ3heMTUnKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ3hfezE1fScsICd4XzE1Jyk7XG5cbiAgICAvLyBUcmlnb1xuXG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcc2luKHgpJywgJ3Npbih4KScpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXGNvcyh4KScsICdjb3MoeCknKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFx0YW4oeCknLCAndGFuKHgpJyk7XG4gICAgYXNzZXJ0TGF0ZXhGcm9tU3RyaW5nKCdcXFxcc2VjKHgpJywgJ3NlYyh4KScpO1xuICAgIGFzc2VydExhdGV4RnJvbVN0cmluZygnXFxcXGNzYyh4KScsICdjc2MoeCknKTtcbiAgICBhc3NlcnRMYXRleEZyb21TdHJpbmcoJ1xcXFxjb3QoeCknLCAnY290KHgpJyk7XG4gIH0pO1xuXG4gIC8vIGFzc2VydE5vdEVxdWFsKCdjdXN0b20gbGF0ZXgnKSgnMTUzMCcsIGBcXFxcb2RvdGApO1xuICBhc3NlcnROb3RFcXVhbCgnZXZhbHVhdGVzIHNpbXBsZSBleHByZXNzaW9ucyBjb3JyZWN0bHknKSgnMCcsICd4JywgJzN4JywgJzR4Jyk7XG5cbiAgYXNzZXJ0RXF1YWwoJ2V2YWx1YXRlcyBzaW1wbGUgZXhwcmVzc2lvbnMgY29ycmVjdGx5JykoJ3gnLCAneCcsICcyeCcsICcyeCcpO1xuXG4gIGRlc2NyaWJlKCdiYWQgZnJhYyB0aHJvd3MgZXJyb3InLCAoKSA9PiB7XG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvcicsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiBhcmVWYWx1ZXNFcXVhbCgnXFxcXGZyYWMxMicsICdcXFxcZnJhYzM0JywgeyBpc0xhdGV4OiB0cnVlIH0pKS50b1Rocm93KCdFeHBlY3RpbmcgeycpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJzcxMTknLCAoKSA9PiB7XG4gICAgaXQuZWFjaGBcbiAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXNFcXVhbFxuICAgICAgJHsnNC41J30gICAgICAgICAgICAgICAgICAgICAgfCAke3RydWV9XG4gICAgICAkeyczLjIgKyAxLjMnfSAgICAgICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAgICR7Jyg0IC0gXFxcXGZyYWN7NH17NX0pICsgMS4zJ30gfCAke3RydWV9XG4gICAgICAkeydcXFxcZnJhY3s5fXsyfSd9ICAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICAgJHsnNCBcXFxcZnJhY3sxfXsyfSd9ICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAgICR7J1xcXFxmcmFjezEwfXsyfSAtIDAuNSd9ICAgICAgfCAke3RydWV9XG4gICAgICAkeyc0LjU1J30gICAgICAgICAgICAgICAgICAgICB8ICR7ZmFsc2V9XG4gICAgYCgnJGEgPT0gJGlzRXF1YWwnLCAoeyB2LCBpc0VxdWFsIH0pID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFyZVZhbHVlc0VxdWFsKCc0IFxcXFxmcmFjezF9ezJ9JywgdiwgeyBpc0xhdGV4OiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChpc0VxdWFsKTtcbiAgICB9KTtcblxuICAgIGl0KCc/JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGxhdGV4VG9UZXh0KCc0XFxcXGZyYWN7MX17Mn0nKSkudG9FcXVhbCgnNCArIDEvMicpO1xuICAgIH0pO1xuICB9KTtcblxuICBhc3NlcnRFcXVhbCgnZXZhbHVhdGVzIHNpbXBsZSBleHByZXNzaW9ucyBjb3JyZWN0bHkgMicpKFxuICAgICcxMDAnLFxuICAgICcxMDAnLFxuICAgICc1MCArIDUwJyxcbiAgICAnMjUgKiA0JyxcbiAgICAnMjAwIC8gMicsXG4gICAgJzIwICogNScsXG4gICAgJzIuNSAqIDQwJyxcbiAgICAnMTAgKiAxMCcsXG4gICk7XG5cbiAgYXNzZXJ0Tm90RXF1YWwoJ2V2YWx1YXRlcyBzaW1wbGUgZXhwcmVzc2lvbnMgY29ycmVjdGx5IDInKShcbiAgICAnMTAwJyxcbiAgICAnMCcsXG4gICAgJzAnLFxuICAgICc1MCAqIDInLFxuICAgICc0NCArIDU3JyxcbiAgICAnMTAwJyxcbiAgICAnNDQgKyA1NycsXG4gICAgJzUwICogMycsXG4gICk7XG5cbiAgYXNzZXJ0RXF1YWwoJ2V2YWx1YXRlcyBzaW1wbGUgZXhwcmVzc2lvbnMgY29ycmVjdGx5IDMnKShcbiAgICAnNTAgKyA1MCcsXG4gICAgJzEwMCcsXG4gICAgJzEwMCAvIDIgKyA1MCcsXG4gICAgJzEwMCcsXG4gICAgJzIgKyAyJyxcbiAgICAnNCcsXG4gICAgJzEvMiArIC41JyxcbiAgICAnMScsXG4gICk7XG5cbiAgYXNzZXJ0Tm90RXF1YWwoJ2V2YWx1YXRlcyBzaW1wbGUgZXhwcmVzc2lvbnMgY29ycmVjdGx5IDMnKShcbiAgICAnNTAgKyA1MScsXG4gICAgJzEwMCcsXG4gICAgJzI1ICogMiArIDUxJyxcbiAgICAnMTAwJyxcbiAgICAnMS8yICsgLjUnLFxuICAgICcxLjknLFxuICAgICcxLzIgKyAuNScsXG4gICAgJzEuMScsXG4gICk7XG5cbiAgYXNzZXJ0RXF1YWwoJ2V2YWx1YXRlcyBzaW1wbGUgZXhwcmVzc2lvbnMgY29ycmVjdGx5IDQnKShcbiAgICAnNTAgKyA1MCcsXG4gICAgJzEwMCcsXG4gICAgJzEwMCAvIDIgKyA1MCcsXG4gICAgJzEwMCcsXG4gICAgJzIgKyAyJyxcbiAgICAnNCcsXG4gICAgJzEvMiArIC41JyxcbiAgICAnMScsXG4gICAgJzEzLzInLFxuICAgICcxMy8yJyxcbiAgICAnMjYvNCcsXG4gICAgJzEzLzInLFxuICAgICc2ICsgMS8yJyxcbiAgICAnMTMvMicsXG4gICAgJzYuNScsXG4gICAgJzEzLzInLFxuICApO1xuXG4gIGFzc2VydE5vdEVxdWFsKCdldmFsdWF0ZXMgc2ltcGxlIGV4cHJlc3Npb25zIGNvcnJlY3RseSA0JykoXG4gICAgJzUwICsgNTEnLFxuICAgICcxMDAnLFxuICAgICcyNSAqIDIgKyA1MScsXG4gICAgJzEwMCcsXG4gICAgJzEvMiArIC41JyxcbiAgICAnMS45JyxcbiAgICAnMS8yICsgLjUnLFxuICAgICcxLjEnLFxuICAgICcxNC8yJyxcbiAgICAnMTMvMicsXG4gICAgJzYuNicsXG4gICAgJzEzLzInLFxuICApO1xuXG4gIGl0LmVhY2hgXG4gICAgYSAgICAgICAgICAgICAgICAgICAgICAgIHwgYlxuICAgICR7JygoeF4yICsgeCkgLyB4KSAtIDEnfSB8ICR7J3gnfVxuICBgKCckYSA9PSAkYicsICh7IGEsIGIgfSkgPT4ge1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbChhLCBiKSkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgYXNzZXJ0RXF1YWwoJ2V2YWx1YXRlcyBzaW1wbGUgdmFyaWFibGUgZXhwcmVzc2lvbnMgY29ycmVjdGx5JykoXG4gICAgJ3gnLFxuICAgICd4JyxcbiAgICAneCArIDAnLFxuICAgICd4JyxcbiAgICAnKHgtMikgKyAyJyxcbiAgICAneCcsXG4gICAgJygoeF4yICsgeCkgLyB4KSAtIDEnLFxuICAgICd4JyxcbiAgICAnMngvMicsXG4gICAgJ3gnLFxuICAgICcoeCArIDIpXjInLFxuICAgICcoeCArIDIpXjInLFxuICAgICd4XjIgKyA0eCArIDQnLFxuICAgICcoeCArIDIpXjInLFxuICAgICd4XjIgKyA0KHgrMSknLFxuICAgICcoeCArIDIpXjInLFxuICAgICd4XjIgKyA4ICgoeCsxKSAvIDIpJyxcbiAgICAnKHggKyAyKV4yJyxcbiAgKTtcblxuICBhc3NlcnROb3RFcXVhbCgnZXZhbHVhdGVzIHNpbXBsZSB2YXJpYWJsZSBleHByZXNzaW9ucyBjb3JyZWN0bHknKShcbiAgICAneScsXG4gICAgJ3gnLFxuICAgICd4ICsgMScsXG4gICAgJ3gnLFxuICAgICd4XjMgKyA0eCArIDQnLFxuICAgICcoeCArIDIpXjInLFxuICAgICd4XjIgKyA0KHgrMiknLFxuICAgICcoeCArIDIpXjInLFxuICApO1xuXG4gIGFzc2VydEVxdWFsKCdldmFsdWF0ZXMgc2ltcGxlIHZhcmlhYmxlIGV4cHJlc3Npb25zIGNvcnJlY3RseSAyJykoXG4gICAgJygyICsgeCleMicsXG4gICAgJyh4ICsgMileMicsXG4gICAgJ3heMiArIDR4ICsgNCcsXG4gICAgJyh4ICsgMileMicsXG4gICAgJ3heMiArIDQoeCsxKScsXG4gICAgJyh4ICsgMileMicsXG4gICAgJ3heMiArIDggKCh4KzEpIC8gMiknLFxuICAgICcoeCArIDIpXjInLFxuICApO1xuXG4gIGFzc2VydEVxdWFsKCdldmFsdWF0ZXMgZXhwcmVzc2lvbnMgY29ycmVjdGx5IHdpdGggdmFyaWFibGUgZXhwb25lbnRzJykoXG4gICAgJygyICsgeCleMngnLFxuICAgICcoeCArIDIpXjJ4JyxcbiAgICAneV4oMiB4KScsXG4gICAgJ3leKHgreCknLFxuICApO1xuXG4gIGFzc2VydEVxdWFsKCdldmFsdWF0ZXMgZnVuY3Rpb24gZXhwcmVzc2lvbnMgY29ycmVjdGx5IHdpdGggdmFyaWFibGUgcGFyYW1ldGVycycpKFxuICAgICdzcXJ0KDR4KScsXG4gICAgJ3NxcnQoMngrMngpJyxcbiAgICAnc3FydCh4XjIpJyxcbiAgICAnc3FydCgoKHgrMSleMikgLSAoKHgrMSleMikgKyB4XjIpJyxcbiAgKTtcblxuICBhc3NlcnROb3RFcXVhbCgnZXZhbHVhdGVzIHNpbXBsZSB2YXJpYWJsZSBleHByZXNzaW9ucyBjb3JyZWN0bHkgMicpKFxuICAgICd4XjMgKyA0eCArIDQnLFxuICAgICcoeCArIDIpXjInLFxuICAgICd4XjIgKyA0KHgrMiknLFxuICAgICcoeCArIDIpXjInLFxuICApO1xuXG4gIGl0KCdjb3JyZWN0bHkgY29uc3VtZXMgYWxsb3dEZWNpbWFscyBvcHRpb24nLCAoKSA9PiB7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxMjMnLCAnMTIzJywgeyBhbGxvd0RlY2ltYWxzOiB0cnVlIH0pKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTIzJywgJzEyMy4wJywgeyBhbGxvd0RlY2ltYWxzOiB0cnVlIH0pKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTIzLDAnLCAnMTIzLjAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxMjMsMCcsICcxMjMuMCcsIHsgYWxsb3dEZWNpbWFsczogZmFsc2UgfSkpLnRvRXF1YWwoZmFsc2UpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTIzJywgJzEyMy4wJywgeyBhbGxvd0RlY2ltYWxzOiBmYWxzZSB9KSkudG9FcXVhbChmYWxzZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxMjMnLCAnMTIzLDAnLCB7IGFsbG93RGVjaW1hbHM6IGZhbHNlIH0pKS50b0VxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ2NvcnJlY3RseSBjb25zdW1lcyBhbGxvd0RlY2ltYWxzIG9wdGlvbiBmb3IgY29tcGxleCBleGFtcGxlcyB0b28nLCAoKSA9PiB7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxNTAwMDAwJywgJzE1MDAwMDAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxLDUwMCwwMDAnLCAnMSw1MDAsMDAwJywgeyBhbGxvd0RlY2ltYWxzOiB0cnVlIH0pKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTUwMDAwMCcsICcxLDUwMCwwMDAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxNTAwMDAwJywgJzEsNTAwLDAwMC4wMCcsIHsgYWxsb3dEZWNpbWFsczogdHJ1ZSB9KSkudG9FcXVhbCh0cnVlKTtcbiAgICBleHBlY3QoYXJlVmFsdWVzRXF1YWwoJzE1MDAwMDAnLCAnMSw1MDAsMDAwLjAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxLDUwMCwwMDAuMCcsICcxLDUwMCwwMDAuMDAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCcxNTAwMDAwJywgJzEsNTAwMDAwJywgeyBhbGxvd0RlY2ltYWxzOiB0cnVlIH0pKS50b0VxdWFsKGZhbHNlKTtcbiAgICBleHBlY3QoYXJlVmFsdWVzRXF1YWwoJzE1MDAwMDAnLCAnMTUwMCwwMDAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwoZmFsc2UpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTUwMDAwMCcsICcxLDUwMCwwMDAuMDEnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwoZmFsc2UpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTUwMDAwMCcsICcxLDUwMCwwMCwwJywgeyBhbGxvd0RlY2ltYWxzOiB0cnVlIH0pKS50b0VxdWFsKGZhbHNlKTtcbiAgICBleHBlY3QoYXJlVmFsdWVzRXF1YWwoJzE1MDAwMDAnLCAnMTUwMCwwMDAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwoZmFsc2UpO1xuICAgIGV4cGVjdChhcmVWYWx1ZXNFcXVhbCgnMTUwMDAwMCcsICcsMTUwMCwwMDAnLCB7IGFsbG93RGVjaW1hbHM6IHRydWUgfSkpLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnZXZhbHVhdGVzIHNpbXBsZSB0cmlnbyBleHByZXNzaW9ucyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCdzaW4oeCknLCAnc2luKHgpJykpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKCd0YW4oeCknLCAndGFuKHgpJykpLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdjb3JyZWN0bHkgY3JlYXRlcyBtYXRoIGV4cHJlc3Npb25zIDEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXJlVmFsdWVzRXF1YWwoJ2Zeey0xfVxcXFxsZWZ0KHhcXFxccmlnaHQpPVxcXFxzcXJ0e3gtMX0rMycsICdmXnstMX1cXFxcbGVmdCh4XFxcXHJpZ2h0KT1cXFxcc3FydHt4LTF9KzMnLCB7XG4gICAgICAgIGFsbG93RGVjaW1hbHM6IHRydWUsXG4gICAgICAgIGlzTGF0ZXg6IHRydWUsXG4gICAgICB9KSxcbiAgICApLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdjb3JyZWN0bHkgY3JlYXRlcyBtYXRoIGV4cHJlc3Npb25zIDInLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXJlVmFsdWVzRXF1YWwoJzcyXFxcXGRpdjEyPTZcXFxcdGV4dHtlZ2dzfScsICc3MlxcXFxkaXYxMj02XFxcXHRleHR7ZWdnc30nLCB7XG4gICAgICAgIGFsbG93RGVjaW1hbHM6IHRydWUsXG4gICAgICAgIGlzTGF0ZXg6IHRydWUsXG4gICAgICB9KSxcbiAgICApLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQRC0zJywgKCkgPT4ge1xuICAgIGl0LmVhY2hgXG4gICAgICBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiXG4gICAgICAkeydcXFxcbGVmdCh4XFxcXHJpZ2h0KV57IFxcXFxmcmFjezF9e1xcXFxsZWZ0KHkgKyAzXFxcXHJpZ2h0KX19J30gICAgICAgIHwgJHsnXFxcXHNxcnRbXFxcXGxlZnQoeSArIDNcXFxccmlnaHQpXXt4fSd9XG4gICAgICAkeydcXFxcbGVmdCh4XFxcXHJpZ2h0KV57XFxcXGZyYWN7MX17M319J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkeydcXFxcc3FydFszXXt4fSd9XG4gICAgICAkeydcXFxcbGVmdCh4XFxcXHJpZ2h0KV57XFxcXGZyYWN7MX17bn19J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkeydcXFxcc3FydFtuXXt4fSd9XG4gICAgICAkeydcXFxcbGVmdCh4XFxcXHJpZ2h0KV57XFxcXGZyYWN7MX17Mn19J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkeydcXFxcc3FydHt4fSd9XG4gICAgICAkeydcXFxcbGVmdCh4LTFcXFxccmlnaHQpXntcXFxcZnJhY3sxfXsyfX0rMyd9ICAgICAgICAgICAgICAgICAgICAgICAgfCAkeydcXFxcc3FydHt4LTF9KzMnfVxuICAgICAgJHsnZl57LTF9XFxcXGxlZnQoeFxcXFxyaWdodCk9XFxcXGxlZnQoeC0xXFxcXHJpZ2h0KV57XFxcXGZyYWN7MX17Mn19KzMnfVxuICAgICAgJHsnZl57LTF9XFxcXGxlZnQoeFxcXFxyaWdodCk9XFxcXHNxcnR7eC0xfSszJ31cbiAgICBgKCckYSA9PSAkYicsICh7IGEsIGIgfSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9IHsgYWxsb3dEZWNpbWFsczogdHJ1ZSwgaXNMYXRleDogdHJ1ZSB9O1xuICAgICAgZXhwZWN0KGFyZVZhbHVlc0VxdWFsKGEsIGIsIG9wdHMpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
package/lib/index.js CHANGED
@@ -186,4 +186,4 @@ var ave = function ave(a, b) {
186
186
  exports.ave = ave;
187
187
  var _default = areValuesEqual;
188
188
  exports["default"] = _default;
189
- //# sourceMappingURL=index.js.map
189
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWNpbWFsQ29tbWFSZWdleCIsImRlY2ltYWxSZWdleCIsImRlY2ltYWxXaXRoVGhvdXNhbmRTZXBhcmF0b3JOdW1iZXJSZWdleCIsInJhdGlvbmFsaXplQWxsUG9zc2libGVTdWJOb2RlcyIsImV4cHJlc3Npb24iLCJyYXRpb25hbGl6ZSIsIm1hdGhqcyIsInBhcnNlIiwidHJlZSIsInRyYW5zZm9ybWVkVHJlZSIsInRyYW5zZm9ybSIsIm5vZGUiLCJyYXRpb25hbGl6ZWROb2RlIiwicHJlcGFyZUV4cHJlc3Npb24iLCJzdHJpbmciLCJpc0xhdGV4IiwicmV0dXJuVmFsdWUiLCJ0cmltIiwicmVwbGFjZSIsImxhdGV4VG9UZXh0IiwidGV4dFRvTWF0aFRleHQiLCJ1bmtub3duQ29tbWFuZHMiLCJ0b1N0cmluZyIsImxhdGV4VG9Bc3RPcHRzIiwibWlzc2luZ0ZhY3RvciIsInRva2VuIiwiZSIsImNvbnNvbGUiLCJ3YXJuIiwidG9rZW5fdHlwZSIsInVua25vd25Db21tYW5kQmVoYXZpb3IiLCJhc3RUb1RleHRPcHRzIiwidW5pY29kZV9vcGVyYXRvcnMiLCJuZSIsIm9wZXJhbmRzIiwiam9pbiIsImxhdGV4IiwiZXh0cmFPdHBzIiwibGEiLCJtZSIsImNvbnZlcnRlcnMiLCJsYXRleFRvQXN0T2JqIiwiYXQiLCJhc3RUb1RleHRPYmoiLCJhc3QiLCJjb252ZXJ0IiwidGV4dFRvQXN0T2JqIiwic2hvdWxkUmF0aW9uYWxpemVFbnRpcmVUcmVlIiwic2hvdWxkRG9JdCIsInRyYXZlcnNlIiwidHlwZSIsImZuIiwiZXhwb25lbnQiLCJhcmdzIiwiY29tcGlsZSIsImV2YWwiLCJmdW5jdGlvblBhcmFtZXRlciIsImNvbnRhaW5zRGVjaW1hbCIsIm1hdGNoIiwiU0lNUExJRllfUlVMRVMiLCJsIiwiciIsInNpbXBsaWZ5IiwidiIsImNvbmNhdCIsInJ1bGVzIiwiYXJlVmFsdWVzRXF1YWwiLCJ2YWx1ZU9uZSIsInZhbHVlVHdvIiwib3B0aW9ucyIsImFsbG93RGVjaW1hbHMiLCJpbnZlcnNlIiwidmFsdWVPbmVUb1VzZSIsInZhbHVlVHdvVG9Vc2UiLCJ0ZXN0IiwicHJlcGFyZWRWYWx1ZU9uZSIsInByZXBhcmVkVmFsdWVUd28iLCJvbmUiLCJ0d28iLCJlcXVhbHMiLCJhdmUiLCJhIiwiYiIsImFtIiwiYm0iLCJhcm0iLCJicm0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBLElBQU1BLGlCQUFpQixHQUFHLElBQTFCO0FBQ0EsSUFBTUMsWUFBWSxHQUFHLE9BQXJCO0FBQ0EsSUFBTUMsdUNBQXVDLEdBQUcsaUVBQWhEOztBQUVBLElBQU1DLDhCQUE4QixHQUFHLFNBQWpDQSw4QkFBaUMsQ0FBQ0MsVUFBRDtBQUFBLFNBQWdCQyxXQUFXLENBQUNDLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhSCxVQUFiLENBQUQsQ0FBM0I7QUFBQSxDQUF2Qzs7QUFDQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDRyxJQUFELEVBQVU7QUFDNUIsTUFBTUMsZUFBZSxHQUFHRCxJQUFJLENBQUNFLFNBQUwsQ0FBZSxVQUFDQyxJQUFELEVBQVU7QUFDL0MsUUFBSTtBQUNGLFVBQU1DLGdCQUFnQixHQUFHTixNQUFNLENBQUNELFdBQVAsQ0FBbUJNLElBQW5CLENBQXpCO0FBQ0EsYUFBT0MsZ0JBQVA7QUFDRCxLQUhELENBR0UsZ0JBQU07QUFDTixhQUFPRCxJQUFQO0FBQ0Q7QUFDRixHQVB1QixDQUF4QjtBQVFBLFNBQU9GLGVBQVA7QUFDRCxDQVZEOztBQVlBLFNBQVNJLGlCQUFULENBQTJCQyxNQUEzQixFQUFtQ0MsT0FBbkMsRUFBNEM7QUFDMUMsTUFBSUMsV0FBVyxHQUFHRixNQUFNLEdBQUdBLE1BQU0sQ0FBQ0csSUFBUCxFQUFILEdBQW1CLEVBQTNDO0FBRUFELEVBQUFBLFdBQVcsR0FBR0EsV0FBVyxDQUFDRSxPQUFaLENBQW9CbEIsaUJBQXBCLEVBQXVDLEdBQXZDLENB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RCxHQUF1RkEsZ0JBQWpHO0FBQ0EsTUFBSUcsR0FBRyxHQUFHL0IsMkJBQTJCLENBQUM2QixnQkFBRCxDQUEzQixHQUFnRHRFLE1BQU0sQ0FBQ0QsV0FBUCxDQUFtQnVFLGdCQUFuQixDQUFoRCxHQUF1RkEsZ0JBQWpHO0FBRUFDLEVBQUFBLEdBQUcsR0FBR2YsUUFBUSxDQUFDZSxHQUFELENBQWQ7QUFDQUMsRUFBQUEsR0FBRyxHQUFHaEIsUUFBUSxDQUFDZ0IsR0FBRCxDQUFkO0FBRUEsTUFBTUMsTUFBTSxHQUFHRixHQUFHLENBQUNFLE1BQUosQ0FBV0QsR0FBWCxDQUFmO0FBRUEsU0FBT1AsT0FBTyxHQUFHLENBQUNRLE1BQUosR0FBYUEsTUFBM0I7QUFDRCxDQXRDRDs7QUF3Q08sSUFBTUMsR0FBRyxHQUFHLFNBQU5BLEdBQU0sQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQVU7QUFDM0IsTUFBTUMsRUFBRSxHQUFHN0UsTUFBTSxDQUFDQyxLQUFQLENBQWEwRSxDQUFiLENBQVg7QUFDQSxNQUFNRyxFQUFFLEdBQUc5RSxNQUFNLENBQUNDLEtBQVAsQ0FBYTJFLENBQWIsQ0FBWDtBQUVBLE1BQU1HLEdBQUcsR0FBR3ZCLFFBQVEsQ0FBQ3FCLEVBQUQsQ0FBcEI7QUFDQSxNQUFNRyxHQUFHLEdBQUd4QixRQUFRLENBQUNzQixFQUFELENBQXBCO0FBQ0EsU0FBT0MsR0FBRyxDQUFDTixNQUFKLENBQVdPLEdBQVgsQ0FBUDtBQUNELENBUE07OztlQVNRcEIsYyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIG1hdGhqcyBmcm9tICdtYXRoanMnO1xuaW1wb3J0IG1lIGZyb20gJ0BwaWUtZnJhbWV3b3JrL21hdGgtZXhwcmVzc2lvbnMnO1xuXG5jb25zdCBkZWNpbWFsQ29tbWFSZWdleCA9IC8sL2c7XG5jb25zdCBkZWNpbWFsUmVnZXggPSAvXFwufCwvZztcbmNvbnN0IGRlY2ltYWxXaXRoVGhvdXNhbmRTZXBhcmF0b3JOdW1iZXJSZWdleCA9IC9eKD8hMCtcXC4wMCkoPz0uezEsOX0oXFwufCQpKSg/ITAoPyFcXC4pKVxcZHsxLDN9KCxcXGR7M30pKihcXC5cXGQrKT8kLztcblxuY29uc3QgcmF0aW9uYWxpemVBbGxQb3NzaWJsZVN1Yk5vZGVzID0gKGV4cHJlc3Npb24pID0+IHJhdGlvbmFsaXplKG1hdGhqcy5wYXJzZShleHByZXNzaW9uKSk7XG5jb25zdCByYXRpb25hbGl6ZSA9ICh0cmVlKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybWVkVHJlZSA9IHRyZWUudHJhbnNmb3JtKChub2RlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdGlvbmFsaXplZE5vZGUgPSBtYXRoanMucmF0aW9uYWxpemUobm9kZSk7XG4gICAgICByZXR1cm4gcmF0aW9uYWxpemVkTm9kZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0cmFuc2Zvcm1lZFRyZWU7XG59O1xuXG5mdW5jdGlvbiBwcmVwYXJlRXhwcmVzc2lvbihzdHJpbmcsIGlzTGF0ZXgpIHtcbiAgbGV0IHJldHVyblZhbHVlID0gc3RyaW5nID8gc3RyaW5nLnRyaW0oKSA6ICcnO1xuXG4gIHJldHVyblZhbHVlID0gcmV0dXJuVmFsdWUucmVwbGFjZShkZWNpbWFsQ29tbWFSZWdleCwgJy4nKTtcblxuICByZXR1cm5WYWx1ZSA9IGlzTGF0ZXhcbiAgICA/IGxhdGV4VG9UZXh0KGAke3JldHVyblZhbHVlfWApXG4gICAgOiB0ZXh0VG9NYXRoVGV4dChgJHtyZXR1cm5WYWx1ZX1gLCB7IHVua25vd25Db21tYW5kczogJ3Bhc3N0aHJvdWdoJyB9KS50b1N0cmluZygpO1xuXG4gIHJldHVyblZhbHVlID0gcmV0dXJuVmFsdWUucmVwbGFjZSgnPScsICc9PScpO1xuICByZXR1cm4gcmF0aW9uYWxpemVBbGxQb3NzaWJsZVN1Yk5vZGVzKHJldHVyblZhbHVlKTtcbn1cblxuY29uc3QgbGF0ZXhUb0FzdE9wdHMgPSB7XG4gIG1pc3NpbmdGYWN0b3I6ICh0b2tlbiwgZSkgPT4ge1xuICAgIGNvbnNvbGUud2FybignbWlzc2luZyBmYWN0b3IgZm9yOiAnLCB0b2tlbi50b2tlbl90eXBlKTtcbiAgICBpZiAodG9rZW4udG9rZW5fdHlwZSA9PT0gJ05VTUJFUicpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuICB1bmtub3duQ29tbWFuZEJlaGF2aW9yOiAncGFzc3Rocm91Z2gnLFxufTtcblxuY29uc3QgYXN0VG9UZXh0T3B0cyA9IHtcbiAgdW5pY29kZV9vcGVyYXRvcnM6IHtcbiAgICBuZTogZnVuY3Rpb24ob3BlcmFuZHMpIHtcbiAgICAgIHJldHVybiBvcGVyYW5kcy5qb2luKCcgIT0gJyk7XG4gICAgfSxcbiAgICAnJSc6IGZ1bmN0aW9uKG9wZXJhbmRzKSB7XG4gICAgICByZXR1cm4gYHBlcmNlbnQoJHtvcGVyYW5kc1swXX0pYDtcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxhdGV4VG9UZXh0ID0gKGxhdGV4LCBleHRyYU90cHMgPSB7fSkgPT4ge1xuICBjb25zdCBsYSA9IG5ldyBtZS5jb252ZXJ0ZXJzLmxhdGV4VG9Bc3RPYmooeyAuLi5sYXRleFRvQXN0T3B0cywgLi4uZXh0cmFPdHBzIH0pO1xuXG4gIGNvbnN0IGF0ID0gbmV3IG1lLmNvbnZlcnRlcnMuYXN0VG9UZXh0T2JqKHsgLi4uYXN0VG9UZXh0T3B0cywgLi4uZXh0cmFPdHBzIH0pO1xuXG4gIGNvbnN0IGFzdCA9IGxhLmNvbnZlcnQobGF0ZXgpO1xuXG4gIHJldHVybiBhdC5jb252ZXJ0KGFzdCk7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFRvTWF0aFRleHQgPSAobGF0ZXgsIGV4dHJhT3RwcyA9IHt9KSA9PiB7XG4gIGNvbnN0IGxhID0gbmV3IG1lLmNvbnZlcnRlcnMudGV4dFRvQXN0T2JqKHsgLi4ubGF0ZXhUb0FzdE9wdHMsIC4uLmV4dHJhT3RwcyB9KTtcblxuICBjb25zdCBhdCA9IG5ldyBtZS5jb252ZXJ0ZXJzLmFzdFRvVGV4dE9iaih7IC4uLmFzdFRvVGV4dE9wdHMsIC4uLmV4dHJhT3RwcyB9KTtcblxuICBjb25zdCBhc3QgPSBsYS5jb252ZXJ0KGxhdGV4KTtcblxuICByZXR1cm4gYXQuY29udmVydChhc3QpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkUmF0aW9uYWxpemVFbnRpcmVUcmVlKHRyZWUpIHtcbiAgbGV0IHNob3VsZERvSXQgPSB0cnVlO1xuXG4gIC8vIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aGUgZW50aXJlIHRyZWUgdG8gY2hlY2sgZm9yIHNvbWUgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IG1ha2UgcmF0aW9uYWxpemF0aW9uIGltcG9zc2libGVcbiAgdHJ5IHtcbiAgICB0cmVlLnRyYXZlcnNlKChub2RlKSA9PiB7XG4gICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFyaWFibGUgYXMgYW4gZXhwb25lbnQgZm9yIHBvd2VyIG9wZXJhdGlvbiwgd2Ugc2hvdWxkIG5vdCByYXRpb25hbGl6ZVxuICAgICAgLy8gdHJ5IHRvIHNlZSBpZiB0aGVyZSBhcmUgcG93ZXIgb3BlcmF0aW9ucyB3aXRoIHZhcmlhYmxlIGV4cG9uZW50c1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ09wZXJhdG9yTm9kZScgJiYgbm9kZS5mbiA9PT0gJ3BvdycpIHtcbiAgICAgICAgY29uc3QgZXhwb25lbnQgPSBub2RlLmFyZ3NbMV07XG5cbiAgICAgICAgLy8gdHJ5IHRvIHNlZSBpZiBpdCBjYW4gYmUgY29tcGlsZWQgYW5kIGV2YWx1YXRlZCAtIGlmIGl0J3MgYSBub24tbnVtZXJpY2FsIHZhbHVlLCBpdCdsbCB0aHJvdyBhbiBlcnJvclxuICAgICAgICBleHBvbmVudC5jb21waWxlKCkuZXZhbCgpO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSBjYW5ub3QgaGF2ZSB2YXJpYWJsZXMgZm9yIHVucmVzb2x2ZWQgZnVuY3Rpb24gY2FsbHMgZWl0aGVyXG4gICAgICBpZiAobm9kZS50eXBlID09PSAnRnVuY3Rpb25Ob2RlJykge1xuICAgICAgICAvL3RyeSB0byBzZWUgaWYgdGhlIGFyZ3VtZW50IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGNhbiBiZSByZXNvbHZlZCBhcyBub24tdmFyaWFibGVcbiAgICAgICAgY29uc3QgZnVuY3Rpb25QYXJhbWV0ZXIgPSBub2RlLmFyZ3NbMF07XG5cbiAgICAgICAgLy8gaWYgaXQgaG9sZHMgdmFyaWFibGVzLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgZnVuY3Rpb25QYXJhbWV0ZXIuY29tcGlsZSgpLmV2YWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1hdGhqcy5yYXRpb25hbGl6ZSh0cmVlKTtcbiAgfSBjYXRjaCB7XG4gICAgc2hvdWxkRG9JdCA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHNob3VsZERvSXQ7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zRGVjaW1hbChleHByZXNzaW9uID0gJycpIHtcbiAgcmV0dXJuIGV4cHJlc3Npb24ubWF0Y2goZGVjaW1hbFJlZ2V4KTtcbn1cbmNvbnN0IFNJTVBMSUZZX1JVTEVTID0gW1xuICB7IGw6ICduMV4oMS9uMiknLCByOiAnbnRoUm9vdChuMSwgbjIpJyB9LFxuICB7IGw6ICdzcXJ0KG4xKScsIHI6ICdudGhSb290KG4xLCAyKScgfSxcbl07XG5cbmNvbnN0IHNpbXBsaWZ5ID0gKHYpID0+IG1hdGhqcy5zaW1wbGlmeSh2LCBTSU1QTElGWV9SVUxFUy5jb25jYXQobWF0aGpzLnNpbXBsaWZ5LnJ1bGVzKSk7IC8vLmNvbmNhdChTSU1QTElGWV9SVUxFUykpO1xuXG5jb25zdCBhcmVWYWx1ZXNFcXVhbCA9ICh2YWx1ZU9uZSwgdmFsdWVUd28sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgLy8gaWYgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UsIGhhdmluZyBhIGRlY2ltYWwgdmFsdWUgaW4gZWl0aGVyIHNpZGUgd2lsbCByZXN1bHQgaW4gYSBmYWxzZSBlcXVhbGl0eVxuICAgIC8vIHJlZ2FyZGxlc3Mgb2YgbWF0aGVtYXRpY2FsIGNvcnJlY3RuZXNzXG4gICAgYWxsb3dEZWNpbWFscyxcbiAgICBpc0xhdGV4LCAvLyBpZiB0aGUgcGFzc2VkIGluIHZhbHVlcyBhcmUgbGF0ZXgsIHRoZXkgbmVlZCB0byBiZSBlc2NhcGVkXG4gICAgaW52ZXJzZSwgLy8gcmV0dXJucyBpbnZlcnNlIGZvciB0aGUgY29tcGFyaXNvbiByZXN1bHRcbiAgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IHZhbHVlT25lVG9Vc2UgPSB2YWx1ZU9uZTtcbiAgbGV0IHZhbHVlVHdvVG9Vc2UgPSB2YWx1ZVR3bztcblxuICBpZiAoYWxsb3dEZWNpbWFscyA9PT0gZmFsc2UpIHtcbiAgICBpZiAoY29udGFpbnNEZWNpbWFsKHZhbHVlT25lKSB8fCBjb250YWluc0RlY2ltYWwodmFsdWVUd28pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFsbG93RGVjaW1hbHMgPT09IHRydWUpIHtcbiAgICBpZiAoY29udGFpbnNEZWNpbWFsKHZhbHVlT25lKSAmJiBkZWNpbWFsV2l0aFRob3VzYW5kU2VwYXJhdG9yTnVtYmVyUmVnZXgudGVzdCh2YWx1ZU9uZSkpIHtcbiAgICAgIHZhbHVlT25lVG9Vc2UgPSB2YWx1ZU9uZS5yZXBsYWNlKGRlY2ltYWxDb21tYVJlZ2V4LCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zRGVjaW1hbCh2YWx1ZVR3bykgJiYgZGVjaW1hbFdpdGhUaG91c2FuZFNlcGFyYXRvck51bWJlclJlZ2V4LnRlc3QodmFsdWVUd28pKSB7XG4gICAgICB2YWx1ZVR3b1RvVXNlID0gdmFsdWVUd28ucmVwbGFjZShkZWNpbWFsQ29tbWFSZWdleCwgJycpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByZXBhcmVkVmFsdWVPbmUgPSBwcmVwYXJlRXhwcmVzc2lvbih2YWx1ZU9uZVRvVXNlLCBpc0xhdGV4LCBhbGxvd0RlY2ltYWxzKTtcbiAgY29uc3QgcHJlcGFyZWRWYWx1ZVR3byA9IHByZXBhcmVFeHByZXNzaW9uKHZhbHVlVHdvVG9Vc2UsIGlzTGF0ZXgsIGFsbG93RGVjaW1hbHMpO1xuXG4gIGxldCBvbmUgPSBzaG91bGRSYXRpb25hbGl6ZUVudGlyZVRyZWUocHJlcGFyZWRWYWx1ZU9uZSkgPyBtYXRoanMucmF0aW9uYWxpemUocHJlcGFyZWRWYWx1ZU9uZSkgOiBwcmVwYXJlZFZhbHVlT25lO1xuICBsZXQgdHdvID0gc2hvdWxkUmF0aW9uYWxpemVFbnRpcmVUcmVlKHByZXBhcmVkVmFsdWVUd28pID8gbWF0aGpzLnJhdGlvbmFsaXplKHByZXBhcmVkVmFsdWVUd28pIDogcHJlcGFyZWRWYWx1ZVR3bztcblxuICBvbmUgPSBzaW1wbGlmeShvbmUpO1xuICB0d28gPSBzaW1wbGlmeSh0d28pO1xuXG4gIGNvbnN0IGVxdWFscyA9IG9uZS5lcXVhbHModHdvKTtcblxuICByZXR1cm4gaW52ZXJzZSA/ICFlcXVhbHMgOiBlcXVhbHM7XG59O1xuXG5leHBvcnQgY29uc3QgYXZlID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW0gPSBtYXRoanMucGFyc2UoYSk7XG4gIGNvbnN0IGJtID0gbWF0aGpzLnBhcnNlKGIpO1xuXG4gIGNvbnN0IGFybSA9IHNpbXBsaWZ5KGFtKTtcbiAgY29uc3QgYnJtID0gc2ltcGxpZnkoYm0pO1xuICByZXR1cm4gYXJtLmVxdWFscyhicm0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYXJlVmFsdWVzRXF1YWw7XG4iXX0=
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "2.1.23",
6
+ "version": "2.3.0-beta.0",
7
7
  "description": "Math evaluator tool for comparing expressions for equality",
8
8
  "keywords": [
9
9
  "math",
@@ -22,8 +22,8 @@
22
22
  "mathjs": "^7.0.1"
23
23
  },
24
24
  "devDependencies": {
25
- "@pie-lib/test-utils": "^0.2.33"
25
+ "@pie-lib/test-utils": "^0.4.0-beta.0"
26
26
  },
27
27
  "scripts": {},
28
- "gitHead": "4043c98430c000ce3a25357d92845175b076ea21"
28
+ "gitHead": "3818c24530f62b5bb9be7a2c6aa5428f13a17e0a"
29
29
  }
@@ -0,0 +1,413 @@
1
+ import areValuesEqual, { ave, latexToText } from '../index';
2
+ import _ from 'lodash';
3
+
4
+ describe('math-evaluator', () => {
5
+ describe('latexToText', () => {
6
+ const assertLatexToText = (input, expected) => {
7
+ it(`${input} => ${expected}`, () => {
8
+ const result = latexToText(input);
9
+ expect(result).toEqual(expected);
10
+ });
11
+ };
12
+ assertLatexToText('\\frac{ \\frac{1}{3}}{3}', '(1/3)/3');
13
+ assertLatexToText('\\neq', '0 != 0');
14
+ assertLatexToText('10 \\neq 20', '10 != 20');
15
+ assertLatexToText('10 \\neq', '10 != 0');
16
+ assertLatexToText('\\neq 10', '0 != 10');
17
+ assertLatexToText('40%', 'percent(40)');
18
+ assertLatexToText('%', 'percent(0)');
19
+ assertLatexToText('12%', 'percent(12)');
20
+ assertLatexToText('12\\%', 'percent(12)');
21
+ assertLatexToText('-12.5%', '- percent(12.5)');
22
+ assertLatexToText('-12.5\\%', '- percent(12.5)');
23
+ });
24
+
25
+ const assert = (isEqual, opts) => (label) =>
26
+ function() {
27
+ const args = Array.from(arguments);
28
+ const pairs = _.chunk(args, 2);
29
+
30
+ describe(label, () => {
31
+ pairs.forEach(([a, b]) => {
32
+ it(`${a} === ${b} ? ${isEqual}`, () => {
33
+ expect(areValuesEqual(a, b, opts)).toBe(isEqual);
34
+ });
35
+ });
36
+ });
37
+ };
38
+
39
+ const assertEqual = assert(true);
40
+ const assertNotEqual = assert(false);
41
+
42
+ const assertLatexEqual = assert(true, { isLatex: true });
43
+ const assertLatexNotEqual = assert(false, { isLatex: true });
44
+
45
+ const _amjs = (only) => (a, b, equal) => {
46
+ const fn = only ? it.only : it;
47
+ fn(`${a} === ${b} => ${equal}`, () => {
48
+ const as = latexToText(a);
49
+ const bs = latexToText(b);
50
+ expect(ave(as, bs)).toEqual(equal);
51
+ });
52
+ };
53
+
54
+ const assertThroughMathJs = _amjs(false);
55
+ assertThroughMathJs.only = _amjs(true);
56
+
57
+ const _als = (only) => (input, expected) => {
58
+ const fn = only ? it.only : it;
59
+ fn(`${input} => ${expected}`, () => {
60
+ expect(latexToText(input)).toEqual(expected);
61
+ });
62
+ };
63
+
64
+ const assertLatexFromString = _als(false);
65
+ assertLatexFromString.only = _als(true);
66
+
67
+ describe('ch6456', () => {
68
+ assertEqual('percent')('-12.5%', '-12.5%');
69
+ assertEqual('percent')('-12.5\\%', '-12.5%');
70
+ assertNotEqual('percent')('-11.5%', '-12.5%');
71
+ });
72
+
73
+ describe('ch6456 - latex', () => {
74
+ assertLatexEqual('percent')('\\frac{1}{2} -12.5%', '\\frac{2}{4} -12.5%');
75
+ assertLatexEqual('percent')('\\frac{1}{2} -12.5%', '\\frac{2}{4} -12.5\\%');
76
+ assertLatexNotEqual('percent')('\\frac{4}{2} -12.5%', '\\frac{2}{4} -12.5\\%');
77
+ assertLatexNotEqual('percent')('\\frac{2}{2} -12.5%', '\\frac{2}{4} -12.5\\%');
78
+ });
79
+
80
+ describe('PIE-188-math-expressions', () => {
81
+ // it('parses expressions correctly', async () => {
82
+
83
+ // geometry
84
+
85
+ // MULTIPLY WITH VARIABLE BASED
86
+ assertThroughMathJs('\\parallel x', '\\parallel x', true);
87
+ assertThroughMathJs('\\parallel x', '\\parallel x', true);
88
+ assertThroughMathJs('\\parallel x', '\\parallel 0', false);
89
+ assertThroughMathJs('\\overrightarrow{x + 4}', '\\overrightarrow {4 + x}', true);
90
+ assertThroughMathJs('\\overrightarrow{4x^2 + 4}', '\\overrightarrow {4x^2 + 8 - 4}', true);
91
+ assertThroughMathJs('\\overrightarrow{21*2*x}', '\\overrightarrow {42x}', true);
92
+ assertLatexFromString('\\nparallel x', 'nparallel x');
93
+ assertLatexFromString('\\overrightarrow{x}', 'overrightarrow x');
94
+ assertLatexFromString('\\overleftrightarrow{x}', 'overleftrightarrow x');
95
+ assertLatexFromString('\\perp x', 'perp x');
96
+ assertLatexFromString('\\angle x', 'angle x');
97
+ assertLatexFromString('\\overarc x', 'overarc x');
98
+ assertLatexFromString('\\measuredangle x', 'measuredangle x');
99
+ assertLatexFromString('\\triangle x', 'triangle x');
100
+ assertLatexFromString('\\parallelogram x', 'parallelogram x');
101
+ assertLatexFromString('\\odot x', 'odot x');
102
+ assertLatexFromString('\\degree x', 'degree x');
103
+ assertLatexFromString('\\sim x', 'sim x');
104
+ assertLatexFromString('\\cong x', 'cong x');
105
+ assertLatexFromString('\\ncong x', 'ncong x');
106
+ assertLatexFromString('\\napprox x', 'napprox x'); // UNRECOGNIZED BY LEARNOSITY
107
+ assertLatexFromString('\\nim x', 'nim x'); // UNRECOGNIZED BY LEARNOSITY
108
+ assertLatexFromString('\\sim x', 'sim x');
109
+ expect(() => latexToText('\\sim 4', { unknownCommandBehavior: 'error' })).toThrow();
110
+
111
+ // comparisons
112
+
113
+ assertLatexFromString('1 \\lt 2', '1 < 2');
114
+
115
+ assertLatexFromString('1 \\gt 2', '1 > 2');
116
+
117
+ assertLatexFromString('1 \\le 2', '1 ≤ 2');
118
+
119
+ assertLatexFromString('1 \\ge 2', '1 ≥ 2');
120
+
121
+ // exponents
122
+
123
+ assertLatexFromString('2^2', '2^2');
124
+
125
+ assertLatexFromString('2^{3}', '2^3');
126
+
127
+ // roots
128
+
129
+ assertLatexFromString('\\sqrt{2}', 'sqrt(2)');
130
+
131
+ assertLatexFromString('\\sqrt[{3}]{3}', '3^(1/3)');
132
+
133
+ // fractions
134
+
135
+ assertLatexFromString('\\frac{3}{3}', '3/3');
136
+
137
+ assertLatexFromString('\\frac{x}{3}', 'x/3');
138
+
139
+ assertLatexFromString('x\\frac{5}{3}', 'x (5/3)');
140
+
141
+ // ACTUAL OPERATOR BASED
142
+ assertLatexFromString('\\overline{x}', 'overline x');
143
+ assertLatexFromString('\\pm', 'pm');
144
+ assertLatexFromString('\\approx x', 'approx x');
145
+
146
+ // logarithms
147
+
148
+ assertLatexFromString("4'", "4'");
149
+ assertLatexFromString('\\log 4', 'log(4)');
150
+ assertLatexFromString('\\log(4x)', 'log(4 x)');
151
+ assertLatexFromString('\\ln 4', 'ln(4)');
152
+
153
+ assertLatexFromString('|4|', '|4|');
154
+ assertLatexFromString('(4)', '4');
155
+ assertLatexFromString('(4 + x) * 5', '(4 + x) * 5');
156
+ assertLatexFromString('[4]', '4');
157
+ assertLatexFromString('\\mu', 'μ');
158
+ assertLatexFromString('\\Sigma', 'Σ');
159
+ assertLatexFromString('x^{15}', 'x^15');
160
+ assertLatexFromString('x_{15}', 'x_15');
161
+
162
+ // Trigo
163
+
164
+ assertLatexFromString('\\sin(x)', 'sin(x)');
165
+ assertLatexFromString('\\cos(x)', 'cos(x)');
166
+ assertLatexFromString('\\tan(x)', 'tan(x)');
167
+ assertLatexFromString('\\sec(x)', 'sec(x)');
168
+ assertLatexFromString('\\csc(x)', 'csc(x)');
169
+ assertLatexFromString('\\cot(x)', 'cot(x)');
170
+ });
171
+
172
+ // assertNotEqual('custom latex')('1530', `\\odot`);
173
+ assertNotEqual('evaluates simple expressions correctly')('0', 'x', '3x', '4x');
174
+
175
+ assertEqual('evaluates simple expressions correctly')('x', 'x', '2x', '2x');
176
+
177
+ describe('bad frac throws error', () => {
178
+ it('throws an error', () => {
179
+ expect(() => areValuesEqual('\\frac12', '\\frac34', { isLatex: true })).toThrow('Expecting {');
180
+ });
181
+ });
182
+ describe('7119', () => {
183
+ it.each`
184
+ v | isEqual
185
+ ${'4.5'} | ${true}
186
+ ${'3.2 + 1.3'} | ${true}
187
+ ${'(4 - \\frac{4}{5}) + 1.3'} | ${true}
188
+ ${'\\frac{9}{2}'} | ${true}
189
+ ${'4 \\frac{1}{2}'} | ${true}
190
+ ${'\\frac{10}{2} - 0.5'} | ${true}
191
+ ${'4.55'} | ${false}
192
+ `('$a == $isEqual', ({ v, isEqual }) => {
193
+ const result = areValuesEqual('4 \\frac{1}{2}', v, { isLatex: true });
194
+ expect(result).toEqual(isEqual);
195
+ });
196
+
197
+ it('?', () => {
198
+ expect(latexToText('4\\frac{1}{2}')).toEqual('4 + 1/2');
199
+ });
200
+ });
201
+
202
+ assertEqual('evaluates simple expressions correctly 2')(
203
+ '100',
204
+ '100',
205
+ '50 + 50',
206
+ '25 * 4',
207
+ '200 / 2',
208
+ '20 * 5',
209
+ '2.5 * 40',
210
+ '10 * 10',
211
+ );
212
+
213
+ assertNotEqual('evaluates simple expressions correctly 2')(
214
+ '100',
215
+ '0',
216
+ '0',
217
+ '50 * 2',
218
+ '44 + 57',
219
+ '100',
220
+ '44 + 57',
221
+ '50 * 3',
222
+ );
223
+
224
+ assertEqual('evaluates simple expressions correctly 3')(
225
+ '50 + 50',
226
+ '100',
227
+ '100 / 2 + 50',
228
+ '100',
229
+ '2 + 2',
230
+ '4',
231
+ '1/2 + .5',
232
+ '1',
233
+ );
234
+
235
+ assertNotEqual('evaluates simple expressions correctly 3')(
236
+ '50 + 51',
237
+ '100',
238
+ '25 * 2 + 51',
239
+ '100',
240
+ '1/2 + .5',
241
+ '1.9',
242
+ '1/2 + .5',
243
+ '1.1',
244
+ );
245
+
246
+ assertEqual('evaluates simple expressions correctly 4')(
247
+ '50 + 50',
248
+ '100',
249
+ '100 / 2 + 50',
250
+ '100',
251
+ '2 + 2',
252
+ '4',
253
+ '1/2 + .5',
254
+ '1',
255
+ '13/2',
256
+ '13/2',
257
+ '26/4',
258
+ '13/2',
259
+ '6 + 1/2',
260
+ '13/2',
261
+ '6.5',
262
+ '13/2',
263
+ );
264
+
265
+ assertNotEqual('evaluates simple expressions correctly 4')(
266
+ '50 + 51',
267
+ '100',
268
+ '25 * 2 + 51',
269
+ '100',
270
+ '1/2 + .5',
271
+ '1.9',
272
+ '1/2 + .5',
273
+ '1.1',
274
+ '14/2',
275
+ '13/2',
276
+ '6.6',
277
+ '13/2',
278
+ );
279
+
280
+ it.each`
281
+ a | b
282
+ ${'((x^2 + x) / x) - 1'} | ${'x'}
283
+ `('$a == $b', ({ a, b }) => {
284
+ expect(areValuesEqual(a, b)).toBe(true);
285
+ });
286
+
287
+ assertEqual('evaluates simple variable expressions correctly')(
288
+ 'x',
289
+ 'x',
290
+ 'x + 0',
291
+ 'x',
292
+ '(x-2) + 2',
293
+ 'x',
294
+ '((x^2 + x) / x) - 1',
295
+ 'x',
296
+ '2x/2',
297
+ 'x',
298
+ '(x + 2)^2',
299
+ '(x + 2)^2',
300
+ 'x^2 + 4x + 4',
301
+ '(x + 2)^2',
302
+ 'x^2 + 4(x+1)',
303
+ '(x + 2)^2',
304
+ 'x^2 + 8 ((x+1) / 2)',
305
+ '(x + 2)^2',
306
+ );
307
+
308
+ assertNotEqual('evaluates simple variable expressions correctly')(
309
+ 'y',
310
+ 'x',
311
+ 'x + 1',
312
+ 'x',
313
+ 'x^3 + 4x + 4',
314
+ '(x + 2)^2',
315
+ 'x^2 + 4(x+2)',
316
+ '(x + 2)^2',
317
+ );
318
+
319
+ assertEqual('evaluates simple variable expressions correctly 2')(
320
+ '(2 + x)^2',
321
+ '(x + 2)^2',
322
+ 'x^2 + 4x + 4',
323
+ '(x + 2)^2',
324
+ 'x^2 + 4(x+1)',
325
+ '(x + 2)^2',
326
+ 'x^2 + 8 ((x+1) / 2)',
327
+ '(x + 2)^2',
328
+ );
329
+
330
+ assertEqual('evaluates expressions correctly with variable exponents')(
331
+ '(2 + x)^2x',
332
+ '(x + 2)^2x',
333
+ 'y^(2 x)',
334
+ 'y^(x+x)',
335
+ );
336
+
337
+ assertEqual('evaluates function expressions correctly with variable parameters')(
338
+ 'sqrt(4x)',
339
+ 'sqrt(2x+2x)',
340
+ 'sqrt(x^2)',
341
+ 'sqrt(((x+1)^2) - ((x+1)^2) + x^2)',
342
+ );
343
+
344
+ assertNotEqual('evaluates simple variable expressions correctly 2')(
345
+ 'x^3 + 4x + 4',
346
+ '(x + 2)^2',
347
+ 'x^2 + 4(x+2)',
348
+ '(x + 2)^2',
349
+ );
350
+
351
+ it('correctly consumes allowDecimals option', () => {
352
+ expect(areValuesEqual('123', '123', { allowDecimals: true })).toEqual(true);
353
+ expect(areValuesEqual('123', '123.0', { allowDecimals: true })).toEqual(true);
354
+ expect(areValuesEqual('123,0', '123.0', { allowDecimals: true })).toEqual(true);
355
+ expect(areValuesEqual('123,0', '123.0', { allowDecimals: false })).toEqual(false);
356
+ expect(areValuesEqual('123', '123.0', { allowDecimals: false })).toEqual(false);
357
+ expect(areValuesEqual('123', '123,0', { allowDecimals: false })).toEqual(false);
358
+ });
359
+
360
+ it('correctly consumes allowDecimals option for complex examples too', () => {
361
+ expect(areValuesEqual('1500000', '1500000', { allowDecimals: true })).toEqual(true);
362
+ expect(areValuesEqual('1,500,000', '1,500,000', { allowDecimals: true })).toEqual(true);
363
+ expect(areValuesEqual('1500000', '1,500,000', { allowDecimals: true })).toEqual(true);
364
+ expect(areValuesEqual('1500000', '1,500,000.00', { allowDecimals: true })).toEqual(true);
365
+ expect(areValuesEqual('1500000', '1,500,000.0', { allowDecimals: true })).toEqual(true);
366
+ expect(areValuesEqual('1,500,000.0', '1,500,000.00', { allowDecimals: true })).toEqual(true);
367
+ expect(areValuesEqual('1500000', '1,500000', { allowDecimals: true })).toEqual(false);
368
+ expect(areValuesEqual('1500000', '1500,000', { allowDecimals: true })).toEqual(false);
369
+ expect(areValuesEqual('1500000', '1,500,000.01', { allowDecimals: true })).toEqual(false);
370
+ expect(areValuesEqual('1500000', '1,500,00,0', { allowDecimals: true })).toEqual(false);
371
+ expect(areValuesEqual('1500000', '1500,000', { allowDecimals: true })).toEqual(false);
372
+ expect(areValuesEqual('1500000', ',1500,000', { allowDecimals: true })).toEqual(false);
373
+ });
374
+
375
+ it('evaluates simple trigo expressions correctly', () => {
376
+ expect(areValuesEqual('sin(x)', 'sin(x)')).toEqual(true);
377
+ expect(areValuesEqual('tan(x)', 'tan(x)')).toEqual(true);
378
+ });
379
+
380
+ it('correctly creates math expressions 1', () => {
381
+ expect(
382
+ areValuesEqual('f^{-1}\\left(x\\right)=\\sqrt{x-1}+3', 'f^{-1}\\left(x\\right)=\\sqrt{x-1}+3', {
383
+ allowDecimals: true,
384
+ isLatex: true,
385
+ }),
386
+ ).toEqual(true);
387
+ });
388
+
389
+ it('correctly creates math expressions 2', () => {
390
+ expect(
391
+ areValuesEqual('72\\div12=6\\text{eggs}', '72\\div12=6\\text{eggs}', {
392
+ allowDecimals: true,
393
+ isLatex: true,
394
+ }),
395
+ ).toEqual(true);
396
+ });
397
+
398
+ describe('PD-3', () => {
399
+ it.each`
400
+ a | b
401
+ ${'\\left(x\\right)^{ \\frac{1}{\\left(y + 3\\right)}}'} | ${'\\sqrt[\\left(y + 3\\right)]{x}'}
402
+ ${'\\left(x\\right)^{\\frac{1}{3}}'} | ${'\\sqrt[3]{x}'}
403
+ ${'\\left(x\\right)^{\\frac{1}{n}}'} | ${'\\sqrt[n]{x}'}
404
+ ${'\\left(x\\right)^{\\frac{1}{2}}'} | ${'\\sqrt{x}'}
405
+ ${'\\left(x-1\\right)^{\\frac{1}{2}}+3'} | ${'\\sqrt{x-1}+3'}
406
+ ${'f^{-1}\\left(x\\right)=\\left(x-1\\right)^{\\frac{1}{2}}+3'}
407
+ ${'f^{-1}\\left(x\\right)=\\sqrt{x-1}+3'}
408
+ `('$a == $b', ({ a, b }) => {
409
+ const opts = { allowDecimals: true, isLatex: true };
410
+ expect(areValuesEqual(a, b, opts)).toBeTruthy();
411
+ });
412
+ });
413
+ });
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["decimalCommaRegex","decimalRegex","decimalWithThousandSeparatorNumberRegex","rationalizeAllPossibleSubNodes","expression","rationalize","mathjs","parse","tree","transformedTree","transform","node","rationalizedNode","prepareExpression","string","isLatex","returnValue","trim","replace","latexToText","textToMathText","unknownCommands","toString","latexToAstOpts","missingFactor","token","e","console","warn","token_type","unknownCommandBehavior","astToTextOpts","unicode_operators","ne","operands","join","latex","extraOtps","la","me","converters","latexToAstObj","at","astToTextObj","ast","convert","textToAstObj","shouldRationalizeEntireTree","shouldDoIt","traverse","type","fn","exponent","args","compile","eval","functionParameter","containsDecimal","match","SIMPLIFY_RULES","l","r","simplify","v","concat","rules","areValuesEqual","valueOne","valueTwo","options","allowDecimals","inverse","valueOneToUse","valueTwoToUse","test","preparedValueOne","preparedValueTwo","one","two","equals","ave","a","b","am","bm","arm","brm"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport * as mathjs from 'mathjs';\nimport me from '@pie-framework/math-expressions';\n\nconst decimalCommaRegex = /,/g;\nconst decimalRegex = /\\.|,/g;\nconst decimalWithThousandSeparatorNumberRegex = /^(?!0+\\.00)(?=.{1,9}(\\.|$))(?!0(?!\\.))\\d{1,3}(,\\d{3})*(\\.\\d+)?$/;\n\nconst rationalizeAllPossibleSubNodes = (expression) => rationalize(mathjs.parse(expression));\nconst rationalize = (tree) => {\n const transformedTree = tree.transform((node) => {\n try {\n const rationalizedNode = mathjs.rationalize(node);\n return rationalizedNode;\n } catch {\n return node;\n }\n });\n return transformedTree;\n};\n\nfunction prepareExpression(string, isLatex) {\n let returnValue = string ? string.trim() : '';\n\n returnValue = returnValue.replace(decimalCommaRegex, '.');\n\n returnValue = isLatex\n ? latexToText(`${returnValue}`)\n : textToMathText(`${returnValue}`, { unknownCommands: 'passthrough' }).toString();\n\n returnValue = returnValue.replace('=', '==');\n return rationalizeAllPossibleSubNodes(returnValue);\n}\n\nconst latexToAstOpts = {\n missingFactor: (token, e) => {\n console.warn('missing factor for: ', token.token_type);\n if (token.token_type === 'NUMBER') {\n throw e;\n }\n return 0;\n },\n unknownCommandBehavior: 'passthrough',\n};\n\nconst astToTextOpts = {\n unicode_operators: {\n ne: function(operands) {\n return operands.join(' != ');\n },\n '%': function(operands) {\n return `percent(${operands[0]})`;\n },\n },\n};\n\nexport const latexToText = (latex, extraOtps = {}) => {\n const la = new me.converters.latexToAstObj({ ...latexToAstOpts, ...extraOtps });\n\n const at = new me.converters.astToTextObj({ ...astToTextOpts, ...extraOtps });\n\n const ast = la.convert(latex);\n\n return at.convert(ast);\n};\n\nexport const textToMathText = (latex, extraOtps = {}) => {\n const la = new me.converters.textToAstObj({ ...latexToAstOpts, ...extraOtps });\n\n const at = new me.converters.astToTextObj({ ...astToTextOpts, ...extraOtps });\n\n const ast = la.convert(latex);\n\n return at.convert(ast);\n};\n\nfunction shouldRationalizeEntireTree(tree) {\n let shouldDoIt = true;\n\n // we need to iterate the entire tree to check for some conditions that might make rationalization impossible\n try {\n tree.traverse((node) => {\n // if we have a variable as an exponent for power operation, we should not rationalize\n // try to see if there are power operations with variable exponents\n if (node.type === 'OperatorNode' && node.fn === 'pow') {\n const exponent = node.args[1];\n\n // try to see if it can be compiled and evaluated - if it's a non-numerical value, it'll throw an error\n exponent.compile().eval();\n }\n\n // we cannot have variables for unresolved function calls either\n if (node.type === 'FunctionNode') {\n //try to see if the argument that the function is called with can be resolved as non-variable\n const functionParameter = node.args[0];\n\n // if it holds variables, this will throw an error\n functionParameter.compile().eval();\n }\n });\n\n mathjs.rationalize(tree);\n } catch {\n shouldDoIt = false;\n }\n\n return shouldDoIt;\n}\n\nfunction containsDecimal(expression = '') {\n return expression.match(decimalRegex);\n}\nconst SIMPLIFY_RULES = [\n { l: 'n1^(1/n2)', r: 'nthRoot(n1, n2)' },\n { l: 'sqrt(n1)', r: 'nthRoot(n1, 2)' },\n];\n\nconst simplify = (v) => mathjs.simplify(v, SIMPLIFY_RULES.concat(mathjs.simplify.rules)); //.concat(SIMPLIFY_RULES));\n\nconst areValuesEqual = (valueOne, valueTwo, options = {}) => {\n const {\n // if explicitly set to false, having a decimal value in either side will result in a false equality\n // regardless of mathematical correctness\n allowDecimals,\n isLatex, // if the passed in values are latex, they need to be escaped\n inverse, // returns inverse for the comparison result\n } = options;\n\n let valueOneToUse = valueOne;\n let valueTwoToUse = valueTwo;\n\n if (allowDecimals === false) {\n if (containsDecimal(valueOne) || containsDecimal(valueTwo)) {\n return false;\n }\n } else if (allowDecimals === true) {\n if (containsDecimal(valueOne) && decimalWithThousandSeparatorNumberRegex.test(valueOne)) {\n valueOneToUse = valueOne.replace(decimalCommaRegex, '');\n }\n\n if (containsDecimal(valueTwo) && decimalWithThousandSeparatorNumberRegex.test(valueTwo)) {\n valueTwoToUse = valueTwo.replace(decimalCommaRegex, '');\n }\n }\n\n const preparedValueOne = prepareExpression(valueOneToUse, isLatex, allowDecimals);\n const preparedValueTwo = prepareExpression(valueTwoToUse, isLatex, allowDecimals);\n\n let one = shouldRationalizeEntireTree(preparedValueOne) ? mathjs.rationalize(preparedValueOne) : preparedValueOne;\n let two = shouldRationalizeEntireTree(preparedValueTwo) ? mathjs.rationalize(preparedValueTwo) : preparedValueTwo;\n\n one = simplify(one);\n two = simplify(two);\n\n const equals = one.equals(two);\n\n return inverse ? !equals : equals;\n};\n\nexport const ave = (a, b) => {\n const am = mathjs.parse(a);\n const bm = mathjs.parse(b);\n\n const arm = simplify(am);\n const brm = simplify(bm);\n return arm.equals(brm);\n};\n\nexport default areValuesEqual;\n"],"file":"index.js"}