@gui-chat-plugin/spreadsheet 4.1.0 → 4.2.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.
Files changed (62) hide show
  1. package/README.md +34 -4
  2. package/dist/core/contentVersion.d.ts +5 -0
  3. package/dist/core/definition.d.ts +1 -1
  4. package/dist/core/dispatch.d.ts +3 -3
  5. package/dist/core/dispatchReplies.d.ts +19 -0
  6. package/dist/core/index.d.ts +1 -1
  7. package/dist/core/rangeValues.d.ts +2 -1
  8. package/dist/core/types.d.ts +14 -1
  9. package/dist/core-CwIoDrlM.js +52 -0
  10. package/dist/core-DHWKHgsJ.cjs +1 -0
  11. package/dist/core.cjs +1 -1
  12. package/dist/core.js +3 -3
  13. package/dist/engine/calculator.d.ts +0 -14
  14. package/dist/engine/cellEmpty.d.ts +3 -0
  15. package/dist/engine/cellFormatting.d.ts +3 -2
  16. package/dist/engine/concatOperand.d.ts +3 -0
  17. package/dist/engine/concatPrecedence.d.ts +32 -0
  18. package/dist/engine/customFunctionSpecs.d.ts +30 -0
  19. package/dist/engine/customFunctions.d.ts +32 -0
  20. package/dist/engine/date-calendar.d.ts +32 -0
  21. package/dist/engine/date-utils.d.ts +4 -1
  22. package/dist/engine/dateDisplay.d.ts +20 -0
  23. package/dist/engine/escapes.d.ts +10 -0
  24. package/dist/engine/evaluator.d.ts +6 -1
  25. package/dist/engine/formatter.d.ts +4 -0
  26. package/dist/engine/functions/aliases.d.ts +6 -0
  27. package/dist/engine/functions/analysis-math.d.ts +3 -0
  28. package/dist/engine/functions/calendar.d.ts +9 -0
  29. package/dist/engine/functions/date.d.ts +1 -1
  30. package/dist/engine/functions/distribution-math.d.ts +44 -0
  31. package/dist/engine/functions/distributions.d.ts +7 -0
  32. package/dist/engine/functions/index.d.ts +5 -0
  33. package/dist/engine/functions/regression-math.d.ts +25 -0
  34. package/dist/engine/functions/regression.d.ts +5 -0
  35. package/dist/engine/functions/shape-math.d.ts +21 -0
  36. package/dist/engine/functions/shape.d.ts +5 -0
  37. package/dist/engine/functions/special-functions.d.ts +17 -0
  38. package/dist/engine/functions/statistical-analysis.d.ts +8 -1
  39. package/dist/engine/functions/statistical.d.ts +11 -1
  40. package/dist/engine/jsonCellLocator.d.ts +0 -16
  41. package/dist/engine/math-ops.d.ts +4 -2
  42. package/dist/engine/numericCoercion.d.ts +6 -0
  43. package/dist/engine/registry.d.ts +29 -1
  44. package/dist/engine/textCollation.d.ts +8 -0
  45. package/dist/engine/textComparison.d.ts +22 -0
  46. package/dist/engine/translateFormula.d.ts +16 -5
  47. package/dist/index.cjs +1 -1
  48. package/dist/index.js +3 -3
  49. package/dist/lang/messages.d.ts +5 -0
  50. package/dist/samples-DBNVoegC.js +4398 -0
  51. package/dist/samples-DyQFcwBX.cjs +2 -0
  52. package/dist/style.css +1 -1
  53. package/dist/vue/fileFollow.d.ts +7 -0
  54. package/dist/vue/sheetSession.d.ts +10 -4
  55. package/dist/vue/useCustomFunctions.d.ts +7 -0
  56. package/dist/vue.cjs +32 -32
  57. package/dist/vue.js +3099 -2921
  58. package/package.json +4 -2
  59. package/dist/core-CaJMHb3p.js +0 -44
  60. package/dist/core-PwJLsuHs.cjs +0 -1
  61. package/dist/samples-B6CgK8O-.cjs +0 -1
  62. package/dist/samples-miYeCJeQ.js +0 -2856
@@ -0,0 +1,4398 @@
1
+ import { ARTIFACTS_ROOT as e, createSerialLock as t } from "gui-chat-protocol";
2
+ import { newQuickJSWASMModuleFromVariant as n, shouldInterruptAfterDeadline as r } from "quickjs-emscripten-core";
3
+ //#region src/core/definition.ts
4
+ var i = "presentSpreadsheet", a = {
5
+ type: "function",
6
+ name: i,
7
+ description: "Display an Excel-like spreadsheet with formulas and calculations.",
8
+ parameters: {
9
+ type: "object",
10
+ properties: {
11
+ title: {
12
+ type: "string",
13
+ description: "Title for the spreadsheet"
14
+ },
15
+ sheets: {
16
+ type: "array",
17
+ description: "Sheets to render as spreadsheet tabs. Each sheet includes a name and 2D array of cells (rows x columns).",
18
+ items: {
19
+ type: "object",
20
+ properties: {
21
+ name: {
22
+ type: "string",
23
+ description: "Sheet name (e.g., 'Sales Q1', 'Summary')"
24
+ },
25
+ data: {
26
+ type: "array",
27
+ description: "Rows of cells. Each cell is an object with 'v' (value) and 'f' (format). Use Excel-style A1 notation in formulas: columns are letters (A, B, C...), rows are 1-based numbers (1, 2, 3...). Values can be text, numbers, dates, or formulas. Examples: [{\"v\": \"Product\"}, {\"v\": 2024, \"f\": \"#,##0\"}, {\"v\": \"01/15/2025\", \"f\": \"MM/DD/YYYY\"}, {\"v\": \"=B2*1.05\", \"f\": \"$#,##0.00\"}]. Format codes: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date).",
28
+ items: {
29
+ type: "array",
30
+ description: "Row of cells. Each cell is an object with value and format.",
31
+ items: {
32
+ type: "object",
33
+ description: "Cell object with value and optional format. If value is a string starting with '=', it's treated as a formula.",
34
+ properties: {
35
+ v: {
36
+ oneOf: [
37
+ { type: "string" },
38
+ { type: "number" },
39
+ { type: "boolean" }
40
+ ],
41
+ description: "Cell value. Can be text, number, date, or formula (string starting with '='). Examples: 'Revenue', 1500000, '01/15/2025', '=SUM(A1:A10)', '=B2-TODAY()'. Date strings like '01/15/2025' are automatically parsed to date serial numbers."
42
+ },
43
+ f: {
44
+ type: "string",
45
+ description: "Optional format code for displaying the value. Common formats: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date)"
46
+ }
47
+ },
48
+ required: ["v"]
49
+ }
50
+ }
51
+ },
52
+ functions: {
53
+ type: "array",
54
+ description: "Optional. Functions this workbook defines, for an analysis no built-in function does (a moving average, a custom score). A formula on any sheet calls one by name, e.g. =MOVING.AVG(B2:B100, 7), and it recalculates like any formula. Each is a JavaScript function body run in a sandbox with no network, files, DOM or timers, at most 50 ms per call. A range argument arrives as rows of cells (an array of arrays; a blank cell is null); a single cell and any other argument as its value. Whole columns (A:A) are not supported; give a range such as A2:A500. Return a number, text or true/false; anything else, a thrown error or a time-out shows as an error in the cell.",
55
+ items: {
56
+ type: "object",
57
+ properties: {
58
+ name: {
59
+ type: "string",
60
+ description: "Letters and digits, parts joined by dots (MOVING.AVG). Not the name of a built-in function."
61
+ },
62
+ params: {
63
+ type: "array",
64
+ items: { type: "string" },
65
+ description: "Parameter names, in call order, e.g. [\"values\", \"n\"]."
66
+ },
67
+ body: {
68
+ type: "string",
69
+ description: "The function body, e.g. \"const xs = values.flat().filter((v) => typeof v === 'number'); const tail = xs.slice(-n); return tail.reduce((a, b) => a + b, 0) / tail.length;\""
70
+ },
71
+ description: {
72
+ type: "string",
73
+ description: "What it computes."
74
+ }
75
+ },
76
+ required: [
77
+ "name",
78
+ "params",
79
+ "body"
80
+ ]
81
+ }
82
+ }
83
+ },
84
+ required: ["name", "data"]
85
+ }
86
+ }
87
+ },
88
+ required: ["title", "sheets"]
89
+ }
90
+ }, o = `Use ${i} whenever the user needs a spreadsheet-style table, multi-step math, or dynamic what-if analysis—do not summarize in text. Build LIVE sheets where every cell is an object {"v": value, "f": format}. For formulas, set "v" to a string starting with "=" (e.g., {"v": "=B2*1.05", "f": "$#,##0.00"}). For dates, use date strings like "01/15/2025" or date formulas like "=TODAY()" or "=DATE(2025,1,15)". The spreadsheet auto-parses common date formats (MM/DD/YYYY, YYYY-MM-DD, DD-MMM-YYYY) into date serial numbers for calculations. Date arithmetic works: "=B2-TODAY()" calculates days between dates. Never pre-calculate; let the spreadsheet compute using cell refs, functions (SUM, AVERAGE, IF, TODAY, DATE, DATEDIF, etc.), and arithmetic. Standard formats: "$#,##0.00" currency, "#,##0" integer, "0.00%" percent, "0.00" decimal, "MM/DD/YYYY" date, "DD-MMM-YYYY" date, "YYYY-MM-DD" ISO date. Format is optional for plain text/numbers. When an analysis needs a method no built-in function has, define it once in the sheet's "functions" and call it from formulas, rather than pasting a computed number: it then recalculates when the data changes.`;
91
+ //#endregion
92
+ //#region src/engine/guards.ts
93
+ function s(e) {
94
+ return typeof e == "object" && !!e && !Array.isArray(e);
95
+ }
96
+ function c(e) {
97
+ return typeof e == "object" && !!e;
98
+ }
99
+ var l = (e, t) => s(e) && typeof e[t] == "string";
100
+ function u(e, t) {
101
+ return e instanceof Error ? e.message : l(e, "details") && e.details ? e.details : l(e, "message") && e.message ? e.message : t === void 0 ? String(e) : t;
102
+ }
103
+ //#endregion
104
+ //#region src/core/paths.ts
105
+ var d = "spreadsheets", f = ".json", p = 16, ee = 2, te = (e) => `${e.getUTCFullYear()}/${String(e.getUTCMonth() + 1).padStart(ee, "0")}`, ne = () => globalThis.crypto.randomUUID().split("-").join("").slice(0, p);
106
+ function re(t = /* @__PURE__ */ new Date(), n = ne()) {
107
+ let r = `${d}/${te(t)}/${n}${f}`;
108
+ return {
109
+ relPath: r,
110
+ filePath: `${e}/${r}`
111
+ };
112
+ }
113
+ var ie = /* @__PURE__ */ new Set([
114
+ "",
115
+ ".",
116
+ ".."
117
+ ]);
118
+ function ae(t) {
119
+ return typeof t != "string" || !t.startsWith(`${e}/${d}/`) || !t.endsWith(f) || t.includes("\\") ? !1 : !t.split("/").some((e) => ie.has(e));
120
+ }
121
+ var m = (t) => t.slice(e.length + 1), oe = (e) => typeof e == "string" || typeof e == "number" || typeof e == "boolean", se = (e) => e === null || oe(e) || s(e) && (e.v === void 0 || e.v === null || oe(e.v)) && (e.f === void 0 || typeof e.f == "string"), ce = (e) => Array.isArray(e) && e.every(se), le = (e) => s(e) && typeof e.name == "string" && Array.isArray(e.data) && e.data.every(ce);
122
+ function ue(e) {
123
+ return Array.isArray(e) && e.every(le) ? e : null;
124
+ }
125
+ //#endregion
126
+ //#region src/core/contentVersion.ts
127
+ var de = "SHA-256", fe = 16, pe = 2;
128
+ async function me(e) {
129
+ let t = await crypto.subtle.digest(de, new TextEncoder().encode(e));
130
+ return Array.from(new Uint8Array(t), (e) => e.toString(fe).padStart(pe, "0")).join("");
131
+ }
132
+ var he = (e, t) => e !== void 0 && t !== null && e !== t;
133
+ //#endregion
134
+ //#region src/core/dispatch.ts
135
+ function ge(e) {
136
+ if (!s(e) || typeof e.path != "string") return !1;
137
+ if (e.kind === "loadSpreadsheet") return !0;
138
+ let t = e.baseVersion;
139
+ return e.kind === "saveSpreadsheet" && Array.isArray(e.sheets) && e.sheets.every(le) && (t === void 0 || typeof t == "string");
140
+ }
141
+ var _e = (e) => s(e) && typeof e.read == "function" && typeof e.write == "function";
142
+ function ve(e) {
143
+ if (!s(e) || !s(e.files)) return null;
144
+ let t = e.files.artifacts;
145
+ return _e(t) ? t : null;
146
+ }
147
+ function ye(e, t) {
148
+ let n = ue(JSON.parse(e));
149
+ if (!n) throw Error(`${t} does not hold an array of sheets`);
150
+ return n;
151
+ }
152
+ async function be(e, t) {
153
+ let n = await e.read(m(t));
154
+ return {
155
+ message: `Loaded spreadsheet ${t}`,
156
+ data: {
157
+ sheets: ye(n, t),
158
+ version: await me(n)
159
+ }
160
+ };
161
+ }
162
+ var xe = /* @__PURE__ */ new Map();
163
+ function Se(e) {
164
+ let n = xe.get(e);
165
+ if (n) return n;
166
+ let r = t();
167
+ return xe.set(e, r), r;
168
+ }
169
+ async function Ce(e, t) {
170
+ return await e.exists(t) ? e.read(t) : null;
171
+ }
172
+ function we(e, t, n) {
173
+ return {
174
+ message: `Did not save spreadsheet ${e}: it changed since it was read`,
175
+ data: {
176
+ sheets: ye(t, e),
177
+ version: n,
178
+ conflict: !0
179
+ }
180
+ };
181
+ }
182
+ async function Te(e, t, n, r) {
183
+ let i = m(t);
184
+ return Se(i)(async () => {
185
+ let a = r === void 0 ? null : await Ce(e, i), o = a === null ? null : await me(a);
186
+ if (a !== null && o !== null && he(r, o)) return we(t, a, o);
187
+ let s = JSON.stringify(n);
188
+ return await e.write(i, s), {
189
+ message: `Saved spreadsheet ${t}`,
190
+ data: {
191
+ sheets: t,
192
+ version: await me(s)
193
+ }
194
+ };
195
+ });
196
+ }
197
+ async function Ee(e, t) {
198
+ if (!ae(t.path)) throw Error("path must be a .json file under artifacts/spreadsheets/");
199
+ return t.kind === "loadSpreadsheet" ? be(e, t.path) : Te(e, t.path, t.sheets, t.baseVersion);
200
+ }
201
+ //#endregion
202
+ //#region src/engine/spreadsheet-errors.ts
203
+ var De = [
204
+ "#NULL!",
205
+ "#DIV/0!",
206
+ "#VALUE!",
207
+ "#REF!",
208
+ "#NAME?",
209
+ "#NUM!",
210
+ "#N/A",
211
+ "#ERROR!"
212
+ ], h = class {
213
+ code;
214
+ constructor(e) {
215
+ this.code = e;
216
+ }
217
+ toString() {
218
+ return this.code;
219
+ }
220
+ toJSON() {
221
+ return this.code;
222
+ }
223
+ }, Oe = new h("#NULL!"), g = new h("#DIV/0!"), _ = new h("#VALUE!"), ke = new h("#REF!"), Ae = new h("#NAME?"), v = new h("#NUM!"), y = new h("#N/A"), je = {
224
+ "#NULL!": Oe,
225
+ "#DIV/0!": g,
226
+ "#VALUE!": _,
227
+ "#REF!": ke,
228
+ "#NAME?": Ae,
229
+ "#NUM!": v,
230
+ "#N/A": y,
231
+ "#ERROR!": new h("#ERROR!")
232
+ }, Me = (e) => je[e], Ne = new Set(De);
233
+ function Pe(e) {
234
+ return typeof e == "string" && Ne.has(e);
235
+ }
236
+ function b(e) {
237
+ return e instanceof h;
238
+ }
239
+ function Fe(e) {
240
+ return b(e) ? e.code : Pe(e) ? e : null;
241
+ }
242
+ function Ie(e) {
243
+ return e == null ? !0 : typeof e == "number" ? Number.isNaN(e) || !Number.isFinite(e) : b(e);
244
+ }
245
+ //#endregion
246
+ //#region src/engine/numericCoercion.ts
247
+ var Le = (e) => isNaN(e) ? null : e;
248
+ function Re(e) {
249
+ if (e.includes("%")) {
250
+ let t = Le(parseFloat(e.replace("%", "").trim()));
251
+ return t === null ? null : t / 100;
252
+ }
253
+ return e.includes("$") ? Le(parseFloat(e.replace(/[$,]/g, "").trim())) : e.includes(",") ? Le(parseFloat(e.replace(/,/g, "").trim())) : Le(parseFloat(e));
254
+ }
255
+ function x(e) {
256
+ return typeof e == "number" ? !isNaN(e) : typeof e == "string" && Re(e) !== null;
257
+ }
258
+ function S(e) {
259
+ return typeof e == "number" ? e : typeof e == "boolean" ? +!!e : typeof e == "string" ? Re(e) ?? _ : e;
260
+ }
261
+ function ze(e) {
262
+ return typeof e == "number" ? !isNaN(e) : typeof e == "string" && e.trim() !== "" && !isNaN(Number(e));
263
+ }
264
+ //#endregion
265
+ //#region src/engine/date-utils.ts
266
+ var Be = 864e5, Ve = new Date(Date.UTC(1899, 11, 30)), C = (e) => (e.getTime() - Ve.getTime()) / Be, w = (e) => {
267
+ let t = Math.floor(e), n = e - t, r = new Date(Ve.getTime() + t * Be), i = Math.round(n * 24 * 60 * 60);
268
+ return r.setSeconds(r.getSeconds() + i), r;
269
+ }, He = [
270
+ "Jan",
271
+ "Feb",
272
+ "Mar",
273
+ "Apr",
274
+ "May",
275
+ "Jun",
276
+ "Jul",
277
+ "Aug",
278
+ "Sep",
279
+ "Oct",
280
+ "Nov",
281
+ "Dec"
282
+ ], Ue = [
283
+ "January",
284
+ "February",
285
+ "March",
286
+ "April",
287
+ "May",
288
+ "June",
289
+ "July",
290
+ "August",
291
+ "September",
292
+ "October",
293
+ "November",
294
+ "December"
295
+ ], We = [
296
+ "Sun",
297
+ "Mon",
298
+ "Tue",
299
+ "Wed",
300
+ "Thu",
301
+ "Fri",
302
+ "Sat"
303
+ ], Ge = [
304
+ "Sunday",
305
+ "Monday",
306
+ "Tuesday",
307
+ "Wednesday",
308
+ "Thursday",
309
+ "Friday",
310
+ "Saturday"
311
+ ];
312
+ //#endregion
313
+ //#region src/engine/date-parser.ts
314
+ function Ke(e) {
315
+ if (typeof e != "string" || e.length < 6 || e.length > 30) return !1;
316
+ let t = /\d/.test(e), n = /[/\-\s,]/.test(e);
317
+ return !t || !n ? !1 : [
318
+ /^\d{1,2}\/\d{1,2}\/\d{2,4}$/,
319
+ /^\d{4}-\d{1,2}-\d{1,2}$/,
320
+ /^\d{4}\/\d{1,2}\/\d{1,2}$/,
321
+ /^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/,
322
+ /^[A-Za-z]{3,9}\s+\d{1,2},?\s+\d{4}$/,
323
+ /^\d{1,2}\s+[A-Za-z]{3,9}\s+\d{4}$/
324
+ ].some((t) => t.test(e.trim()));
325
+ }
326
+ function qe(e, t, n) {
327
+ return it(e, t, n) ? C(new Date(Date.UTC(e, t - 1, n))) : null;
328
+ }
329
+ function Je(e, t) {
330
+ let [, n, r, i] = e.match(t) ?? [];
331
+ return n === void 0 || r === void 0 || i === void 0 ? null : [
332
+ n,
333
+ r,
334
+ i
335
+ ];
336
+ }
337
+ var Ye = /^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/, Xe = 12, Ze = (e, t, n) => e > Xe || t <= Xe && e <= Xe && n;
338
+ function Qe(e) {
339
+ let t = e.toLowerCase(), n = He.findIndex((e) => e.toLowerCase() === t);
340
+ if (n !== -1) return n + 1;
341
+ let r = Ue.findIndex((e) => e.toLowerCase() === t);
342
+ return r === -1 ? null : r + 1;
343
+ }
344
+ function $e(e, t = !1) {
345
+ if (!Ke(e)) return null;
346
+ let n = e.trim(), r = Je(n, /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);
347
+ if (r) {
348
+ let [e, t, n] = r;
349
+ return qe(parseInt(e), parseInt(t), parseInt(n));
350
+ }
351
+ let i = Je(n, /^(\d{1,2})-([A-Za-z]{3})-(\d{2,4})$/);
352
+ if (i) {
353
+ let [e, t, n] = i;
354
+ return rt(nt(parseInt(n)), t, parseInt(e));
355
+ }
356
+ let a = Je(n, /^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{4})$/);
357
+ if (a) {
358
+ let [e, t, n] = a;
359
+ return rt(parseInt(n), e, parseInt(t));
360
+ }
361
+ let o = Je(n, /^(\d{1,2})\s+([A-Za-z]{3,9})\s+(\d{4})$/);
362
+ if (o) {
363
+ let [e, t, n] = o;
364
+ return rt(parseInt(n), t, parseInt(e));
365
+ }
366
+ let s = Je(n, Ye);
367
+ if (s) {
368
+ let [e, n, r] = s, i = Ze(parseInt(e), parseInt(n), t), a = parseInt(i ? n : e), o = parseInt(i ? e : n);
369
+ return qe(nt(parseInt(r)), a, o);
370
+ }
371
+ return null;
372
+ }
373
+ var et = 100, tt = 30;
374
+ function nt(e) {
375
+ return e >= et ? e : e < tt ? 2e3 + e : 1900 + e;
376
+ }
377
+ function rt(e, t, n) {
378
+ let r = Qe(t);
379
+ return r === null ? null : qe(e, r, n);
380
+ }
381
+ function it(e, t, n) {
382
+ if (e < 1900 || e > 2100 || t < 1 || t > 12 || n < 1 || n > 31) return !1;
383
+ let r = new Date(Date.UTC(e, t - 1, n));
384
+ return r.getUTCFullYear() === e && r.getUTCMonth() === t - 1 && r.getUTCDate() === n;
385
+ }
386
+ function at(e, t = !1) {
387
+ let n = e.trim();
388
+ if (/^\d{4}-\d{1,2}-\d{1,2}$/.test(n)) return "YYYY-MM-DD";
389
+ if (/^\d{4}\/\d{1,2}\/\d{1,2}$/.test(n)) return "YYYY/MM/DD";
390
+ if (/^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/.test(n)) return "DD-MMM-YYYY";
391
+ if (/^[A-Za-z]{3}\s+\d{1,2},?\s+\d{4}$/.test(n)) return "MMM D, YYYY";
392
+ if (/^[A-Za-z]{4,9}\s+\d{1,2},?\s+\d{4}$/.test(n)) return "MMMM D, YYYY";
393
+ let r = Je(n, Ye);
394
+ if (r) {
395
+ let [e, n] = r;
396
+ return Ze(parseInt(e), parseInt(n), t) ? "DD/MM/YYYY" : "MM/DD/YYYY";
397
+ }
398
+ return t ? "DD/MM/YYYY" : "MM/DD/YYYY";
399
+ }
400
+ //#endregion
401
+ //#region src/engine/registry.ts
402
+ var ot = (e, t) => /* @__PURE__ */ Error(`${e} requires at least ${t} argument${t === 1 ? "" : "s"}`), T = (e, t, n) => {
403
+ let r = t[n];
404
+ if (r === void 0) throw ot(e.functionName, n + 1);
405
+ return r;
406
+ }, E = (e) => e.getRangeValuesRaw ?? e.getRangeValues, D = (e) => e.getRangeValuesKeepingBlanks ?? E(e), O = new class {
407
+ functions = /* @__PURE__ */ new Map();
408
+ overlay = null;
409
+ register(e) {
410
+ this.functions.set(e.name.toUpperCase(), e);
411
+ }
412
+ get(e) {
413
+ let t = e.toUpperCase();
414
+ return this.functions.get(t) ?? this.overlay?.get(t);
415
+ }
416
+ hasFunction(e) {
417
+ let t = e.toUpperCase();
418
+ return this.functions.has(t) || (this.overlay?.has(t) ?? !1);
419
+ }
420
+ isBuiltIn(e) {
421
+ return this.functions.has(e.toUpperCase());
422
+ }
423
+ withOverlay(e, t) {
424
+ let n = this.overlay;
425
+ this.overlay = e;
426
+ try {
427
+ return t();
428
+ } finally {
429
+ this.overlay = n;
430
+ }
431
+ }
432
+ getAllFunctions() {
433
+ return Array.from(this.functions.values());
434
+ }
435
+ getFunctionsByCategory() {
436
+ let e = /* @__PURE__ */ new Map();
437
+ for (let t of Array.from(this.functions.values())) {
438
+ let n = t.category || "Other";
439
+ e.has(n) || e.set(n, []), e.get(n).push(t);
440
+ }
441
+ return e;
442
+ }
443
+ }(), st = "[A-Z][A-Z0-9]*(?:\\.[A-Z0-9]+)*", ct = (e) => /^[A-Z]+(?:\.[A-Z]+)*$/i.test(e) || O.hasFunction(e);
444
+ function k(e) {
445
+ return typeof e == "number" ? e : Re(String(e)) ?? 0;
446
+ }
447
+ function A(e) {
448
+ return String(e);
449
+ }
450
+ var lt = /[.*+?^${}()|[\]\\]/, ut = (e) => lt.test(e) ? `\\${e}` : e, dt = /~([\s\S])|[\s\S]/g, ft = (e) => e.replace(dt, (e, t) => t === void 0 ? e === "*" ? ".*" : e === "?" ? "." : ut(e) : ut(t));
451
+ function pt(e) {
452
+ let t = RegExp(`^${ft(e)}$`, "iu");
453
+ return (e) => t.test(e);
454
+ }
455
+ function mt(e, t = !1) {
456
+ let n = e.trim().replace(/^["']|["']$/g, "");
457
+ if (n === "=") return (e) => String(e).trim() === "";
458
+ if (n === "<>") return (e) => String(e).trim() !== "";
459
+ let [, r, i] = n.match(/^([><=!]+)(.+)$/) ?? [];
460
+ if (r !== void 0 && i !== void 0) {
461
+ let e = ht(i, t), n = gt(i, t), a = (e) => (t) => x(t) && e(k(t));
462
+ switch (r) {
463
+ case ">": return a((t) => t > e);
464
+ case ">=": return a((t) => t >= e);
465
+ case "<": return a((t) => t < e);
466
+ case "<=": return a((t) => t <= e);
467
+ case "=":
468
+ case "==": return n;
469
+ case "!=":
470
+ case "<>": return (e) => !n(e);
471
+ default: return () => !1;
472
+ }
473
+ }
474
+ return gt(n, t);
475
+ }
476
+ function ht(e, t) {
477
+ return $e(e, t) ?? Re(e) ?? NaN;
478
+ }
479
+ function gt(e, t) {
480
+ let n = pt(e), r = ht(e, t), i = !isNaN(r);
481
+ return (e) => typeof e != "number" && n(String(e)) || i && x(e) && k(e) === r;
482
+ }
483
+ function _t(e, t, n) {
484
+ let r = e.evaluateFormula(T(e, t, n));
485
+ return b(r) ? r : typeof r == "boolean" ? (e) => e === r : mt(String(r), e.preferDDMMYYYY);
486
+ }
487
+ //#endregion
488
+ //#region src/engine/functions/statistical-math.ts
489
+ var vt = (e) => e.reduce((e, t) => e + t, 0) / e.length;
490
+ function yt(e) {
491
+ return e.length === 0 ? g : vt(e);
492
+ }
493
+ function bt(e) {
494
+ return e.length === 0 ? v : vt(xt([...e].sort((e, t) => e - t)));
495
+ }
496
+ function xt(e) {
497
+ let t = Math.floor(e.length / 2);
498
+ return e.slice(e.length % 2 == 0 ? t - 1 : t, t + 1);
499
+ }
500
+ function St(e) {
501
+ let t = /* @__PURE__ */ new Map();
502
+ for (let n of e) t.set(n, (t.get(n) ?? 0) + 1);
503
+ let n = 0, r = y;
504
+ for (let [e, i] of t.entries()) i > n && (n = i, r = e);
505
+ return n >= 2 ? r : y;
506
+ }
507
+ var Ct = 2;
508
+ function wt(e) {
509
+ if (e.length < Ct) return g;
510
+ let t = vt(e);
511
+ return e.reduce((e, n) => e + (n - t) ** 2, 0) / (e.length - 1);
512
+ }
513
+ function Tt(e) {
514
+ let t = wt(e);
515
+ return typeof t == "number" ? Math.sqrt(t) : t;
516
+ }
517
+ //#endregion
518
+ //#region src/engine/functions/statistical.ts
519
+ var j = 255, Et = /^\$?[A-Z]+\$?\d+$/i, Dt = (e) => Et.test(e), Ot = (e) => e.slice(e.lastIndexOf("!") + 1), kt = (e) => {
520
+ if (!e) return !1;
521
+ let [t, n] = Ot(e).split(":");
522
+ return !t || !n ? !1 : Dt(t) && Dt(n);
523
+ }, At = (e) => kt(e) || Dt(Ot(e)), jt = (e, t, n) => {
524
+ let r = [];
525
+ for (let i of e) {
526
+ let e = i?.trim();
527
+ e && (At(e) ? n(e).forEach((e) => r.push({
528
+ value: e,
529
+ isScalar: !1
530
+ })) : r.push({
531
+ value: t.evaluateFormula(e),
532
+ isScalar: !0
533
+ }));
534
+ }
535
+ return r;
536
+ }, M = (e, t) => jt(e, t, t.getRangeValues).map(({ value: e }) => k(e)), Mt = (e, t) => jt(e, t, D(t)).map(({ value: e }) => e), Nt = (e, t) => M(e, t).reduce((e, t) => e + t, 0), Pt = (e, t) => yt(M(e, t)), Ft = (e, t) => {
537
+ let n = M(e, t);
538
+ return n.length > 0 ? Math.max(...n) : 0;
539
+ }, It = (e, t) => {
540
+ let n = M(e, t);
541
+ return n.length > 0 ? Math.min(...n) : 0;
542
+ }, Lt = ({ value: e, isScalar: t }) => !t || x(e), Rt = (e, t) => jt(e, t, t.getRangeValues).filter(Lt).length, zt = (e, t) => bt(M(e, t)), Bt = (e, t) => St(M(e, t)), Vt = (e, t) => Tt(M(e, t)), Ht = (e, t) => wt(M(e, t)), Ut = (e) => e != null && e !== "", Wt = (e, t) => At(e) && t.countFilledCells ? t.countFilledCells(e) : Mt([e], t).filter(Ut).length, Gt = (e, t) => e.reduce((e, n) => {
543
+ let r = n?.trim();
544
+ return r ? e + Wt(r, t) : e;
545
+ }, 0), Kt = (e, t) => {
546
+ let n = D(t)(T(t, e, 0)), r = _t(t, e, 1);
547
+ return typeof r == "function" ? n.filter(r).length : r;
548
+ }, qt = (e, t) => {
549
+ let n = T(t, e, 0), r = D(t), i = e.length === 3 ? T(t, e, 2) : n;
550
+ return {
551
+ criteriaRange: r(n),
552
+ valueRange: r(i),
553
+ matches: _t(t, e, 1)
554
+ };
555
+ }, Jt = (e, t, n) => e.reduce((e, r, i) => {
556
+ if (!n(r)) return e;
557
+ let a = t[i] ?? "";
558
+ return {
559
+ sum: e.sum + k(a),
560
+ count: e.count + +!!x(a)
561
+ };
562
+ }, {
563
+ sum: 0,
564
+ count: 0
565
+ });
566
+ O.register({
567
+ name: "SUM",
568
+ handler: Nt,
569
+ minArgs: 1,
570
+ maxArgs: j,
571
+ description: "Returns the sum of all numbers in a range",
572
+ examples: ["SUM(A1:A10)", "SUM(B2:B20)"],
573
+ category: "Statistical"
574
+ }), O.register({
575
+ name: "AVERAGE",
576
+ handler: Pt,
577
+ minArgs: 1,
578
+ maxArgs: j,
579
+ description: "Returns the average (arithmetic mean) of numbers in a range",
580
+ examples: ["AVERAGE(A1:A10)", "AVERAGE(B2:B20)"],
581
+ category: "Statistical"
582
+ }), O.register({
583
+ name: "MAX",
584
+ handler: Ft,
585
+ minArgs: 1,
586
+ description: "Returns the largest value in a range",
587
+ examples: ["MAX(A1:A10)", "MAX(B2:B20)"],
588
+ category: "Statistical"
589
+ }), O.register({
590
+ name: "MIN",
591
+ handler: It,
592
+ minArgs: 1,
593
+ description: "Returns the smallest value in a range",
594
+ examples: ["MIN(A1:A10)", "MIN(B2:B20)"],
595
+ category: "Statistical"
596
+ }), O.register({
597
+ name: "COUNT",
598
+ handler: Rt,
599
+ minArgs: 1,
600
+ maxArgs: j,
601
+ description: "Counts the number of cells in a range",
602
+ examples: ["COUNT(A1:A10)", "COUNT(B2:B20)"],
603
+ category: "Statistical"
604
+ }), O.register({
605
+ name: "MEDIAN",
606
+ handler: zt,
607
+ minArgs: 1,
608
+ maxArgs: j,
609
+ description: "Returns the median (middle) value in a range",
610
+ examples: ["MEDIAN(A1:A10)", "MEDIAN(B2:B20)"],
611
+ category: "Statistical"
612
+ }), O.register({
613
+ name: "MODE",
614
+ handler: Bt,
615
+ minArgs: 1,
616
+ maxArgs: j,
617
+ description: "Returns the most frequently occurring value in a range",
618
+ examples: ["MODE(A1:A10)", "MODE(B2:B20)"],
619
+ category: "Statistical"
620
+ }), O.register({
621
+ name: "STDEV",
622
+ handler: Vt,
623
+ minArgs: 1,
624
+ maxArgs: j,
625
+ description: "Returns the standard deviation of numbers in a range",
626
+ examples: ["STDEV(A1:A10)", "STDEV(B2:B20)"],
627
+ category: "Statistical"
628
+ }), O.register({
629
+ name: "VAR",
630
+ handler: Ht,
631
+ minArgs: 1,
632
+ maxArgs: j,
633
+ description: "Returns the variance of numbers in a range",
634
+ examples: ["VAR(A1:A10)", "VAR(B2:B20)"],
635
+ category: "Statistical"
636
+ }), O.register({
637
+ name: "COUNTA",
638
+ handler: Gt,
639
+ minArgs: 1,
640
+ maxArgs: j,
641
+ description: "Counts the number of non-empty cells in a range",
642
+ examples: ["COUNTA(A1:A10)", "COUNTA(B2:B20)"],
643
+ category: "Statistical"
644
+ }), O.register({
645
+ name: "COUNTIF",
646
+ handler: Kt,
647
+ minArgs: 2,
648
+ maxArgs: 2,
649
+ description: "Counts cells in a range that match a criteria",
650
+ examples: ["COUNTIF(A1:A10, \">5\")", "COUNTIF(B1:B10, \"Yes\")"],
651
+ category: "Statistical"
652
+ }), O.register({
653
+ name: "SUMIF",
654
+ handler: (e, t) => {
655
+ let { criteriaRange: n, valueRange: r, matches: i } = qt(e, t);
656
+ return typeof i == "function" ? Jt(n, r, i).sum : i;
657
+ },
658
+ minArgs: 2,
659
+ maxArgs: 3,
660
+ description: "Sums cells in a range that match a criteria",
661
+ examples: ["SUMIF(A1:A10, \">5\")", "SUMIF(A1:A10, \">5\", B1:B10)"],
662
+ category: "Statistical"
663
+ }), O.register({
664
+ name: "AVERAGEIF",
665
+ handler: (e, t) => {
666
+ let { criteriaRange: n, valueRange: r, matches: i } = qt(e, t);
667
+ if (typeof i != "function") return i;
668
+ let { sum: a, count: o } = Jt(n, r, i);
669
+ return o > 0 ? a / o : g;
670
+ },
671
+ minArgs: 2,
672
+ maxArgs: 3,
673
+ description: "Averages cells in a range that match a criteria",
674
+ examples: ["AVERAGEIF(A1:A10, \">5\")", "AVERAGEIF(A1:A10, \">5\", B1:B10)"],
675
+ category: "Statistical"
676
+ });
677
+ //#endregion
678
+ //#region src/engine/functions/analysis-math.ts
679
+ var Yt = 2, Xt = 1, Zt = 4, N = (e) => e.reduce((e, t) => e + t, 0) / e.length, P = (e) => {
680
+ let t = N(e);
681
+ return e.reduce((e, n) => e + (n - t) ** 2, 0);
682
+ };
683
+ function Qt(e, t) {
684
+ if (e.length !== t.length) return y;
685
+ let n = e.flatMap((e, n) => {
686
+ let r = t[n];
687
+ return x(e) && r !== void 0 && x(r) ? [{
688
+ y: k(e),
689
+ x: k(r)
690
+ }] : [];
691
+ });
692
+ return {
693
+ ys: n.map((e) => e.y),
694
+ xs: n.map((e) => e.x)
695
+ };
696
+ }
697
+ var F = ({ ys: e, xs: t }) => {
698
+ let n = N(e), r = N(t);
699
+ return e.reduce((e, i, a) => e + (i - n) * ((t[a] ?? r) - r), 0);
700
+ };
701
+ function $t(e) {
702
+ if (e.ys.length < Yt) return g;
703
+ let t = Math.sqrt(P(e.ys) * P(e.xs));
704
+ return t === 0 ? g : F(e) / t;
705
+ }
706
+ function en(e) {
707
+ if (e.ys.length < Yt) return g;
708
+ let t = P(e.xs);
709
+ return t === 0 ? g : F(e) / t;
710
+ }
711
+ function tn(e) {
712
+ let t = en(e);
713
+ return typeof t == "number" ? N(e.ys) - t * N(e.xs) : t;
714
+ }
715
+ function nn(e) {
716
+ let t = $t(e);
717
+ return typeof t == "number" ? t * t : t;
718
+ }
719
+ function rn(e, t) {
720
+ if (e.length === 0 || t < 0 || t > Xt) return v;
721
+ let n = [...e].sort((e, t) => e - t), r = t * (n.length - 1), i = n[Math.floor(r)] ?? 0, a = n[Math.ceil(r)] ?? i;
722
+ return i + (r - Math.floor(r)) * (a - i);
723
+ }
724
+ function an(e, t) {
725
+ let n = Math.trunc(t);
726
+ return n < 0 || n > Zt ? v : rn(e, n / Zt);
727
+ }
728
+ function on(e, t) {
729
+ let n = Math.ceil(t);
730
+ return n < 1 || n > e.length ? v : [...e].sort((e, t) => t - e)[n - 1] ?? v;
731
+ }
732
+ function sn(e, t) {
733
+ let n = Math.ceil(t);
734
+ return n < 1 || n > e.length ? v : [...e].sort((e, t) => e - t)[n - 1] ?? v;
735
+ }
736
+ function cn(e, t, n) {
737
+ return t.includes(e) ? t.filter((t) => n ? t < e : t > e).length + 1 : y;
738
+ }
739
+ function ln(e) {
740
+ return e.length === 0 ? g : P(e) / e.length;
741
+ }
742
+ function un(e) {
743
+ let t = ln(e);
744
+ return typeof t == "number" ? Math.sqrt(t) : t;
745
+ }
746
+ function dn(e, t) {
747
+ return t.some(({ range: t }) => t.length !== e) ? _ : Array.from({ length: e }, (e, n) => t.every(({ range: e, matches: t }) => t(e[n] ?? "")));
748
+ }
749
+ //#endregion
750
+ //#region src/engine/functions/statistical-analysis.ts
751
+ var I = 255, fn = (e, t, n) => S(t.evaluateFormula(T(t, e, n))), pn = (e, t, n = 0) => {
752
+ let r = D(t);
753
+ return Qt(r(T(t, e, n)), r(T(t, e, n + 1)));
754
+ }, L = (e) => (t, n) => {
755
+ let r = pn(t, n);
756
+ return "ys" in r ? e(r) : r;
757
+ }, mn = (e) => (t, n) => {
758
+ let r = fn(t, n, 1);
759
+ return typeof r == "number" ? e(M([T(n, t, 0)], n), r) : r;
760
+ }, hn = (e, t) => {
761
+ let n = fn(e, t, 0);
762
+ if (typeof n != "number") return n;
763
+ let r = e.length > 2 ? fn(e, t, 2) : 0;
764
+ return typeof r == "number" ? cn(n, M([T(t, e, 1)], t), r !== 0) : r;
765
+ }, gn = (e, t, n) => {
766
+ let r = D(t), i = Array.from({ length: Math.ceil((e.length - n) / 2) }, (e, t) => n + t * 2).map((n) => ({
767
+ range: r(T(t, e, n)),
768
+ matches: _t(t, e, n + 1)
769
+ }));
770
+ return i.map(({ matches: e }) => e).find(b) || i.flatMap(({ range: e, matches: t }) => typeof t == "function" ? [{
771
+ range: e,
772
+ matches: t
773
+ }] : []);
774
+ }, _n = (e, t) => {
775
+ let n = D(t)(T(t, e, 0)), r = gn(e, t, 1);
776
+ if (!Array.isArray(r)) return r;
777
+ let i = dn(n.length, r);
778
+ return Array.isArray(i) ? n.filter((e, t) => i[t]) : i;
779
+ }, vn = (e, t) => {
780
+ let n = _n(e, t);
781
+ return Array.isArray(n) ? n.reduce((e, t) => e + k(t), 0) : n;
782
+ }, yn = (e, t) => {
783
+ let n = _n(e, t);
784
+ if (!Array.isArray(n)) return n;
785
+ let r = n.filter(x).map(k);
786
+ return r.length > 0 ? r.reduce((e, t) => e + t, 0) / r.length : g;
787
+ }, bn = (e) => (t, n) => {
788
+ let r = _n(t, n);
789
+ if (!Array.isArray(r)) return r;
790
+ let i = r.filter(x).map(k);
791
+ return i.length > 0 ? i.reduce((t, n) => e(t, n)) : 0;
792
+ };
793
+ [
794
+ {
795
+ name: "CORREL",
796
+ handler: L($t),
797
+ minArgs: 2,
798
+ maxArgs: 2,
799
+ description: "Returns the correlation coefficient of two ranges",
800
+ examples: ["CORREL(A2:A20, B2:B20)"]
801
+ },
802
+ {
803
+ name: "SLOPE",
804
+ handler: L(en),
805
+ minArgs: 2,
806
+ maxArgs: 2,
807
+ description: "Returns the slope of the least-squares line through known_y and known_x",
808
+ examples: ["SLOPE(B2:B20, A2:A20)"]
809
+ },
810
+ {
811
+ name: "INTERCEPT",
812
+ handler: L(tn),
813
+ minArgs: 2,
814
+ maxArgs: 2,
815
+ description: "Returns where the least-squares line crosses the y axis",
816
+ examples: ["INTERCEPT(B2:B20, A2:A20)"]
817
+ },
818
+ {
819
+ name: "RSQ",
820
+ handler: L(nn),
821
+ minArgs: 2,
822
+ maxArgs: 2,
823
+ description: "Returns the square of the correlation coefficient",
824
+ examples: ["RSQ(B2:B20, A2:A20)"]
825
+ },
826
+ {
827
+ name: "PERCENTILE",
828
+ handler: mn(rn),
829
+ minArgs: 2,
830
+ maxArgs: 2,
831
+ description: "Returns the k-th percentile (k from 0 to 1), interpolated like PERCENTILE.INC",
832
+ examples: ["PERCENTILE(A2:A100, 0.9)"]
833
+ },
834
+ {
835
+ name: "QUARTILE",
836
+ handler: mn(an),
837
+ minArgs: 2,
838
+ maxArgs: 2,
839
+ description: "Returns a quartile (0 to 4), interpolated like QUARTILE.INC",
840
+ examples: ["QUARTILE(A2:A100, 1)"]
841
+ },
842
+ {
843
+ name: "LARGE",
844
+ handler: mn(on),
845
+ minArgs: 2,
846
+ maxArgs: 2,
847
+ description: "Returns the k-th largest value",
848
+ examples: ["LARGE(A2:A100, 3)"]
849
+ },
850
+ {
851
+ name: "SMALL",
852
+ handler: mn(sn),
853
+ minArgs: 2,
854
+ maxArgs: 2,
855
+ description: "Returns the k-th smallest value",
856
+ examples: ["SMALL(A2:A100, 3)"]
857
+ },
858
+ {
859
+ name: "RANK",
860
+ handler: hn,
861
+ minArgs: 2,
862
+ maxArgs: 3,
863
+ description: "Returns the rank of a number in a range (largest first unless order is non-zero)",
864
+ examples: ["RANK(A2, A2:A100)", "RANK(A2, A2:A100, 1)"]
865
+ },
866
+ {
867
+ name: "STDEVP",
868
+ handler: (e, t) => un(M(e, t)),
869
+ minArgs: 1,
870
+ maxArgs: I,
871
+ description: "Returns the population standard deviation",
872
+ examples: ["STDEVP(A2:A100)"]
873
+ },
874
+ {
875
+ name: "VARP",
876
+ handler: (e, t) => ln(M(e, t)),
877
+ minArgs: 1,
878
+ maxArgs: I,
879
+ description: "Returns the population variance",
880
+ examples: ["VARP(A2:A100)"]
881
+ },
882
+ {
883
+ name: "SUMIFS",
884
+ handler: vn,
885
+ minArgs: 3,
886
+ maxArgs: I,
887
+ description: "Sums the cells whose rows meet every condition",
888
+ examples: ["SUMIFS(C2:C100, A2:A100, \"East\", B2:B100, \">10\")"]
889
+ },
890
+ {
891
+ name: "COUNTIFS",
892
+ handler: (e, t) => {
893
+ let n = gn(e, t, 0);
894
+ if (!Array.isArray(n)) return n;
895
+ let r = dn(n[0]?.range.length ?? 0, n);
896
+ return Array.isArray(r) ? r.filter(Boolean).length : r;
897
+ },
898
+ minArgs: 2,
899
+ maxArgs: I,
900
+ description: "Counts the rows that meet every condition",
901
+ examples: ["COUNTIFS(A2:A100, \"East\", B2:B100, \">10\")"]
902
+ },
903
+ {
904
+ name: "MAXIFS",
905
+ handler: bn(Math.max),
906
+ minArgs: 3,
907
+ maxArgs: I,
908
+ description: "Returns the largest value whose row meets every condition (0 when none does)",
909
+ examples: ["MAXIFS(C2:C100, A2:A100, \"East\")"]
910
+ },
911
+ {
912
+ name: "MINIFS",
913
+ handler: bn(Math.min),
914
+ minArgs: 3,
915
+ maxArgs: I,
916
+ description: "Returns the smallest value whose row meets every condition (0 when none does)",
917
+ examples: ["MINIFS(C2:C100, A2:A100, \"East\")"]
918
+ },
919
+ {
920
+ name: "AVERAGEIFS",
921
+ handler: yn,
922
+ minArgs: 3,
923
+ maxArgs: I,
924
+ description: "Averages the cells whose rows meet every condition",
925
+ examples: ["AVERAGEIFS(C2:C100, A2:A100, \"East\")"]
926
+ }
927
+ ].forEach((e) => O.register({
928
+ ...e,
929
+ category: "Statistical"
930
+ }));
931
+ //#endregion
932
+ //#region src/engine/functions/regression-math.ts
933
+ var xn = 3, Sn = 2;
934
+ function Cn(e, t) {
935
+ if (e.ys.length === 0) return y;
936
+ let n = en(e);
937
+ return typeof n == "number" ? N(e.ys) + n * (t - N(e.xs)) : n;
938
+ }
939
+ function wn(e) {
940
+ let t = e.ys.length;
941
+ if (t === 0) return y;
942
+ let n = P(e.xs);
943
+ if (t < xn || n === 0) return g;
944
+ let r = F(e) / n, [i, a] = [N(e.ys), N(e.xs)], o = e.ys.reduce((t, n, o) => t + (n - i - r * ((e.xs[o] ?? a) - a)) ** 2, 0);
945
+ return Math.sqrt(o / (t - 2));
946
+ }
947
+ function Tn(e) {
948
+ return e.ys.length === 0 ? g : F(e) / e.ys.length;
949
+ }
950
+ function En(e) {
951
+ return e.ys.length < Sn ? g : F(e) / (e.ys.length - 1);
952
+ }
953
+ var Dn = (e) => Array.from({ length: e }, (e, t) => t + 1);
954
+ function On(e, t, n, r) {
955
+ if (e.length !== t.length) return ke;
956
+ let i = [...e, ...t], a = i.find(b);
957
+ if (a) return a;
958
+ if (e.length === 0 || !i.every(x)) return _;
959
+ let o = {
960
+ ys: e.map(k),
961
+ xs: t.map(k)
962
+ };
963
+ return r ? kn(o, n) : An(o, n);
964
+ }
965
+ function kn(e, t) {
966
+ let n = P(e.xs), r = N(e.ys);
967
+ return n === 0 ? r : r + F(e) / n * (t - N(e.xs));
968
+ }
969
+ function An({ ys: e, xs: t }, n) {
970
+ let r = t.reduce((e, t) => e + t * t, 0), i = e.reduce((e, n, r) => e + n * (t[r] ?? 0), 0);
971
+ return r === 0 ? 0 : i / r * n;
972
+ }
973
+ //#endregion
974
+ //#region src/engine/coerce-boolean.ts
975
+ function R(e) {
976
+ if (typeof e == "boolean") return e;
977
+ if (e == null) return !1;
978
+ if (typeof e == "number") return e !== 0;
979
+ if (b(e)) return !0;
980
+ let t = e.trim();
981
+ if (t === "") return !1;
982
+ let n = t.toLowerCase();
983
+ if (n === "true") return !0;
984
+ if (n === "false") return !1;
985
+ let r = Number(t);
986
+ return Number.isNaN(r) ? !0 : r !== 0;
987
+ }
988
+ //#endregion
989
+ //#region src/engine/functions/regression.ts
990
+ var jn = (e, t) => {
991
+ let n = fn(e, t, 0);
992
+ if (typeof n != "number") return n;
993
+ let r = pn(e, t, 1);
994
+ return "ys" in r ? Cn(r, n) : r;
995
+ };
996
+ function Mn(e, t) {
997
+ let [n, ...r] = jt([e], t, D(t));
998
+ return n === void 0 || r.length > 0 ? _ : n.isScalar ? S(n.value) : b(n.value) ? n.value : x(n.value) ? k(n.value) : _;
999
+ }
1000
+ function Nn(e, t) {
1001
+ let n = e[3]?.trim();
1002
+ if (!n) return !0;
1003
+ let r = t.evaluateFormula(n);
1004
+ return b(r) ? r : R(r);
1005
+ }
1006
+ [
1007
+ {
1008
+ name: "FORECAST.LINEAR",
1009
+ handler: jn,
1010
+ minArgs: 3,
1011
+ maxArgs: 3,
1012
+ description: "Returns the value of the least-squares line through known_y and known_x at x",
1013
+ examples: ["FORECAST.LINEAR(30, B2:B20, A2:A20)"]
1014
+ },
1015
+ {
1016
+ name: "TREND",
1017
+ handler: (e, t) => {
1018
+ let n = D(t), r = n(T(t, e, 0)), i = e[1]?.trim(), a = i ? n(i) : Dn(r.length), o = Mn(T(t, e, 2), t);
1019
+ if (typeof o != "number") return o;
1020
+ let s = Nn(e, t);
1021
+ return typeof s == "boolean" ? On(r, a, o, s) : s;
1022
+ },
1023
+ minArgs: 3,
1024
+ maxArgs: 4,
1025
+ description: "Returns the least-squares line's value at one new x (known_x defaults to 1, 2, 3, …; const FALSE fits through the origin)",
1026
+ examples: ["TREND(B2:B20, A2:A20, 30)", "TREND(B2:B20, , 21)"]
1027
+ },
1028
+ {
1029
+ name: "STEYX",
1030
+ handler: L(wn),
1031
+ minArgs: 2,
1032
+ maxArgs: 2,
1033
+ description: "Returns the standard error of the y predicted by the least-squares line",
1034
+ examples: ["STEYX(B2:B20, A2:A20)"]
1035
+ },
1036
+ {
1037
+ name: "COVARIANCE.P",
1038
+ handler: L(Tn),
1039
+ minArgs: 2,
1040
+ maxArgs: 2,
1041
+ description: "Returns the population covariance of two ranges",
1042
+ examples: ["COVARIANCE.P(A2:A20, B2:B20)"]
1043
+ },
1044
+ {
1045
+ name: "COVARIANCE.S",
1046
+ handler: L(En),
1047
+ minArgs: 2,
1048
+ maxArgs: 2,
1049
+ description: "Returns the sample covariance of two ranges",
1050
+ examples: ["COVARIANCE.S(A2:A20, B2:B20)"]
1051
+ }
1052
+ ].forEach((e) => O.register({
1053
+ ...e,
1054
+ category: "Statistical"
1055
+ }));
1056
+ //#endregion
1057
+ //#region src/engine/functions/special-functions.ts
1058
+ var Pn = .5 * Math.log(2 * Math.PI), Fn = 1e-16, In = 1e-300, Ln = 2e3, z = (e) => Math.abs(e) < In ? In : e, Rn = 10, zn = 7, Bn = [
1059
+ .9999999999998099,
1060
+ 676.5203681218851,
1061
+ -1259.1392167224028,
1062
+ 771.3234287776531,
1063
+ -176.6150291621406,
1064
+ 12.507343278686905,
1065
+ -.13857109526572012,
1066
+ 9984369578019572e-21,
1067
+ 1.5056327351493116e-7
1068
+ ], Vn = [
1069
+ 1 / 12,
1070
+ -1 / 360,
1071
+ 1 / 1260,
1072
+ -1 / 1680,
1073
+ 1 / 1188,
1074
+ -691 / 360360,
1075
+ 1 / 156,
1076
+ -3617 / 122400
1077
+ ];
1078
+ function Hn(e) {
1079
+ let t = 1 / (e * e);
1080
+ return Vn.reduceRight((e, n) => e * t + n, 0) / e;
1081
+ }
1082
+ function Un(e) {
1083
+ let t = e - 1, n = Bn.slice(1).reduce((e, n, r) => e + n / (t + r + 1), Bn[0] ?? 1), r = t + zn + .5;
1084
+ return Pn + (t + .5) * Math.log(r) - r + Math.log(n);
1085
+ }
1086
+ function B(e) {
1087
+ return e >= Rn ? Pn + (e - .5) * Math.log(e) - e + Hn(e) : Un(e);
1088
+ }
1089
+ function Wn(e, t) {
1090
+ let n = Math.min(e, t), r = Math.max(e, t);
1091
+ if (r >= Rn) {
1092
+ let e = Hn(r) - Hn(n + r);
1093
+ return B(n) + e + n - n * Math.log(n + r) + (r - .5) * Math.log1p(-n / (n + r));
1094
+ }
1095
+ return B(n) + B(r) - B(n + r);
1096
+ }
1097
+ function Gn(e, t, n) {
1098
+ let r = {
1099
+ c: 1,
1100
+ d: 1 / z(1 - (t + n) * e / (t + 1)),
1101
+ result: 0
1102
+ };
1103
+ r.result = r.d;
1104
+ for (let i = 1; i <= Ln; i += 1) {
1105
+ let a = i * (n - i) * e / ((t + 2 * i - 1) * (t + 2 * i));
1106
+ r.d = 1 / z(1 + a * r.d), r.c = z(1 + a / r.c), r.result *= r.d * r.c;
1107
+ let o = -(t + i) * (t + n + i) * e / ((t + 2 * i) * (t + 2 * i + 1));
1108
+ r.d = 1 / z(1 + o * r.d), r.c = z(1 + o / r.c);
1109
+ let s = r.d * r.c;
1110
+ if (r.result *= s, Math.abs(s - 1) < Fn) return r.result;
1111
+ }
1112
+ return r.result;
1113
+ }
1114
+ var Kn = 1e4, qn = 8;
1115
+ function Jn(e, t, n, r, i) {
1116
+ let a = {
1117
+ term: 1,
1118
+ sum: 1
1119
+ };
1120
+ for (let t = 0; t < Ln && a.term > a.sum * Fn; t += 1) a.term *= (r + i + t) / (r + 1 + t) * e, a.sum += a.term;
1121
+ return Math.exp(r * t + i * n - Wn(r, i)) / r * a.sum;
1122
+ }
1123
+ function Yn(e, t, n, r) {
1124
+ if (e === -Infinity) return 0;
1125
+ if (t === -Infinity) return 1;
1126
+ let i = Math.exp(e), a = Math.exp(t);
1127
+ if (Math.max(n, r) >= Kn && a * (n + r) <= qn) return 1 - Jn(a, t, e, r, n);
1128
+ let o = Math.exp(n * e + r * t - Wn(n, r));
1129
+ return i < (n + 1) / (n + r + 2) ? o * Gn(i, n, r) / n : 1 - o * Gn(a, r, n) / r;
1130
+ }
1131
+ function Xn(e, t) {
1132
+ let n = {
1133
+ term: 1 / e,
1134
+ sum: 1 / e
1135
+ };
1136
+ for (let r = 1; r <= Ln && Math.abs(n.term) >= Math.abs(n.sum) * Fn; r += 1) n.term *= t / (e + r), n.sum += n.term;
1137
+ return n.sum * Math.exp(-t + e * Math.log(t) - B(e));
1138
+ }
1139
+ function Zn(e, t) {
1140
+ let n = {
1141
+ b: t + 1 - e,
1142
+ c: 1 / In,
1143
+ d: 0,
1144
+ result: 0
1145
+ };
1146
+ n.d = 1 / z(n.b), n.result = n.d;
1147
+ for (let t = 1; t <= Ln; t += 1) {
1148
+ let r = -t * (t - e);
1149
+ n.b += 2, n.d = 1 / z(r * n.d + n.b), n.c = z(n.b + r / n.c);
1150
+ let i = n.d * n.c;
1151
+ if (n.result *= i, Math.abs(i - 1) < Fn) break;
1152
+ }
1153
+ return Math.exp(-t + e * Math.log(t) - B(e)) * n.result;
1154
+ }
1155
+ function Qn(e, t) {
1156
+ return t <= 0 ? 1 : t < e + 1 ? 1 - Xn(e, t) : Zn(e, t);
1157
+ }
1158
+ //#endregion
1159
+ //#region src/engine/functions/distribution-math.ts
1160
+ var $n = Math.sqrt(2 * Math.PI), er = (e) => e === 0 ? 0 : -e, tr = 1e-15, nr = 200, rr = (e) => Math.exp(-.5 * e * e) / $n;
1161
+ function ir(e) {
1162
+ let t = .5 * Qn(.5, .5 * e * e);
1163
+ return e >= 0 ? t : 1 - t;
1164
+ }
1165
+ var ar = (e) => ir(-e), or = [
1166
+ -39.69683028665376,
1167
+ 220.9460984245205,
1168
+ -275.9285104469687,
1169
+ 138.357751867269,
1170
+ -30.66479806614716,
1171
+ 2.506628277459239
1172
+ ], sr = [
1173
+ -54.47609879822406,
1174
+ 161.5858368580409,
1175
+ -155.6989798598866,
1176
+ 66.80131188771972,
1177
+ -13.28068155288572
1178
+ ], cr = [
1179
+ -.007784894002430293,
1180
+ -.3223964580411365,
1181
+ -2.400758277161838,
1182
+ -2.549732539343734,
1183
+ 4.374664141464968,
1184
+ 2.938163982698783
1185
+ ], lr = [
1186
+ .007784695709041462,
1187
+ .3224671290700398,
1188
+ 2.445134137142996,
1189
+ 3.754408661907416
1190
+ ], ur = .02425, dr = (e, t) => e.reduce((e, n) => e * t + n, 0);
1191
+ function fr(e) {
1192
+ if (e < ur) {
1193
+ let t = Math.sqrt(-2 * Math.log(e));
1194
+ return dr(cr, t) / (dr(lr, t) * t + 1);
1195
+ }
1196
+ let t = e - .5, n = t * t;
1197
+ return dr(or, n) * t / (dr(sr, n) * n + 1);
1198
+ }
1199
+ function pr(e) {
1200
+ if (e > .5) return er(pr(1 - e));
1201
+ let t = { z: fr(e) };
1202
+ for (let n = 0; n < 3; n += 1) {
1203
+ let n = (ar(t.z) - e) / rr(t.z);
1204
+ t.z -= n / (1 + t.z * n / 2);
1205
+ }
1206
+ return t.z;
1207
+ }
1208
+ var mr = (e) => er(pr(e));
1209
+ function hr(e, t) {
1210
+ return Math.exp(-Wn(t / 2, .5) - .5 * Math.log(t) - (t + 1) / 2 * Math.log1p(e * e / t));
1211
+ }
1212
+ function gr(e) {
1213
+ if (e > 0) {
1214
+ let t = Math.log1p(Math.exp(-e));
1215
+ return {
1216
+ logX: -t,
1217
+ logComplement: -e - t
1218
+ };
1219
+ }
1220
+ let t = Math.log1p(Math.exp(e));
1221
+ return {
1222
+ logX: e - t,
1223
+ logComplement: -t
1224
+ };
1225
+ }
1226
+ function V(e, t) {
1227
+ if (e === 0) return .5;
1228
+ let { logX: n, logComplement: r } = gr(Math.log(t) - 2 * Math.log(Math.abs(e))), i = .5 * Yn(n, r, t / 2, .5);
1229
+ return e >= 0 ? i : 1 - i;
1230
+ }
1231
+ var _r = (e, t) => V(-e, t);
1232
+ function vr(e, t) {
1233
+ let n = { high: 1 };
1234
+ for (; V(n.high, t) > e && n.high < Number.MAX_VALUE / 2;) n.high *= 2;
1235
+ return n.high;
1236
+ }
1237
+ function yr(e, t, n, r) {
1238
+ let i = V(e, n);
1239
+ i > t ? r.low = e : r.high = e;
1240
+ let a = e + (Math.log(i) - Math.log(t)) * i / hr(e, n);
1241
+ return a > r.low && a < r.high && Number.isFinite(a) ? a : (r.low + r.high) / 2;
1242
+ }
1243
+ function br(e, t) {
1244
+ if (e === .5) return 0;
1245
+ let n = {
1246
+ low: 0,
1247
+ high: vr(e, t)
1248
+ }, r = { t: Math.min(Math.max(mr(e), 0), n.high) };
1249
+ for (let i = 0; i < nr; i += 1) {
1250
+ let i = yr(r.t, e, t, n), a = Math.abs(i - r.t) <= tr * Math.abs(i);
1251
+ if (r.t = i, a) break;
1252
+ }
1253
+ return r.t;
1254
+ }
1255
+ function xr(e, t) {
1256
+ return e > .5 ? er(br(1 - e, t)) : br(e, t);
1257
+ }
1258
+ var Sr = (e, t) => er(xr(e, t));
1259
+ function Cr(e) {
1260
+ let t = e.length, n = e.reduce((e, t) => e + t, 0) / t;
1261
+ return {
1262
+ count: t,
1263
+ mean: n,
1264
+ variance: e.reduce((e, t) => e + (t - n) ** 2, 0) / (t - 1)
1265
+ };
1266
+ }
1267
+ function wr(e) {
1268
+ let { count: t, mean: n, variance: r } = Cr(e);
1269
+ return {
1270
+ t: n / Math.sqrt(r / t),
1271
+ df: t - 1
1272
+ };
1273
+ }
1274
+ function Tr(e, t) {
1275
+ let n = e.count + t.count - 2, r = ((e.count - 1) * e.variance + (t.count - 1) * t.variance) / n;
1276
+ return {
1277
+ t: (e.mean - t.mean) / Math.sqrt(r * (1 / e.count + 1 / t.count)),
1278
+ df: n
1279
+ };
1280
+ }
1281
+ function Er(e, t) {
1282
+ let n = e.variance / e.count, r = t.variance / t.count, i = (n + r) ** 2 / (n ** 2 / (e.count - 1) + r ** 2 / (t.count - 1));
1283
+ return {
1284
+ t: (e.mean - t.mean) / Math.sqrt(n + r),
1285
+ df: i
1286
+ };
1287
+ }
1288
+ var Dr = ({ t: e, df: t }, n) => n * V(Math.abs(e), t), Or = (e, t, n) => S(t.evaluateFormula(T(t, e, n)));
1289
+ function kr(e, t, n) {
1290
+ let r = t.evaluateFormula(T(t, e, n));
1291
+ return b(r) ? r : R(r);
1292
+ }
1293
+ function Ar(e, t, n) {
1294
+ let r = Array.from({ length: n }, (n, r) => Or(e, t, r));
1295
+ return r.find((e) => typeof e != "number") ?? r.filter((e) => typeof e == "number");
1296
+ }
1297
+ var H = (e, t) => (n, r) => {
1298
+ let i = Ar(n, r, e);
1299
+ return Array.isArray(i) ? t(i) : i;
1300
+ }, jr = (e) => {
1301
+ let t = Math.trunc(e);
1302
+ return t >= 1 ? t : null;
1303
+ }, Mr = (e) => e > 0 && e < 1, Nr = (e, t) => {
1304
+ let n = Ar(e, t, 2);
1305
+ if (!Array.isArray(n)) return n;
1306
+ let [r = 0, i = 0] = n, a = kr(e, t, 2);
1307
+ if (typeof a != "boolean") return a;
1308
+ let o = jr(i);
1309
+ return o === null ? v : a ? _r(r, o) : hr(r, o);
1310
+ }, Pr = ([e = 0, t = 0]) => {
1311
+ let n = jr(t);
1312
+ return n === null || e < 0 ? v : 2 * V(e, n);
1313
+ }, Fr = ([e = 0, t = 0]) => {
1314
+ let n = jr(t);
1315
+ return n === null ? v : V(e, n);
1316
+ }, Ir = ([e = 0, t = 0]) => {
1317
+ let n = jr(t);
1318
+ return n === null || !Mr(e) ? v : Sr(e, n);
1319
+ }, Lr = ([e = 0, t = 0]) => {
1320
+ let n = jr(t);
1321
+ return n === null || e <= 0 || e > 1 ? v : xr(e / 2, n);
1322
+ }, Rr = 1, zr = 2, Br = 3;
1323
+ function Vr(e, t) {
1324
+ let n = D(t), r = Qt(n(T(t, e, 0)), n(T(t, e, 1)));
1325
+ return "ys" in r ? wr(r.ys.map((e, t) => e - (r.xs[t] ?? 0))) : r;
1326
+ }
1327
+ function Hr(e, t, n) {
1328
+ let r = M([T(t, e, 0)], t), i = M([T(t, e, 1)], t);
1329
+ return n === zr ? Tr(Cr(r), Cr(i)) : Er(Cr(r), Cr(i));
1330
+ }
1331
+ var Ur = (e) => "t" in e && !(Number.isFinite(e.t) && Number.isFinite(e.df)) ? g : e;
1332
+ function Wr(e, t) {
1333
+ let n = E(t);
1334
+ return [0, 1].flatMap((r) => n(T(t, e, r))).find(b);
1335
+ }
1336
+ var Gr = (e, t) => {
1337
+ let n = Wr(e, t);
1338
+ if (n) return n;
1339
+ let r = [Or(e, t, 2), Or(e, t, 3)], i = r.find((e) => typeof e != "number");
1340
+ if (i) return i;
1341
+ let [a, o] = r.map((e) => Math.trunc(Number(e)));
1342
+ if (a !== 1 && a !== 2 || o === void 0 || o < Rr || o > Br) return v;
1343
+ let s = Ur(o === Rr ? Vr(e, t) : Hr(e, t, o));
1344
+ return "t" in s ? Dr(s, a === 1 ? 1 : 2) : s;
1345
+ }, Kr = (e, t) => {
1346
+ let n = Ar(e, t, 3);
1347
+ if (!Array.isArray(n)) return n;
1348
+ let [r = 0, i = 0, a = 0] = n, o = kr(e, t, 3);
1349
+ if (typeof o != "boolean") return o;
1350
+ if (a <= 0) return v;
1351
+ let s = (r - i) / a;
1352
+ return o ? ar(s) : rr(s) / a;
1353
+ }, qr = (e, t) => {
1354
+ let n = Or(e, t, 0);
1355
+ if (typeof n != "number") return n;
1356
+ let r = kr(e, t, 1);
1357
+ return typeof r == "boolean" ? r ? ar(n) : rr(n) : r;
1358
+ }, Jr = ([e = 0, t = 0, n = 0]) => !Mr(e) || n <= 0 ? v : t + n * pr(e), Yr = ([e = 0]) => Mr(e) ? pr(e) : v;
1359
+ function Xr([e = 0, t = 0, n = 0]) {
1360
+ let r = Math.trunc(n);
1361
+ return !Mr(e) || t <= 0 || r < 1 ? v : {
1362
+ alpha: e,
1363
+ sd: t,
1364
+ size: r
1365
+ };
1366
+ }
1367
+ [
1368
+ {
1369
+ name: "T.TEST",
1370
+ handler: Gr,
1371
+ minArgs: 4,
1372
+ maxArgs: 4,
1373
+ description: "Returns the p-value of a t-test: tails 1 or 2; type 1 paired, 2 equal variance, 3 unequal variance (Welch)",
1374
+ examples: ["T.TEST(A2:A20, B2:B20, 2, 3)"]
1375
+ },
1376
+ {
1377
+ name: "T.DIST",
1378
+ handler: Nr,
1379
+ minArgs: 3,
1380
+ maxArgs: 3,
1381
+ description: "Returns the left-tailed Student's t distribution (cumulative TRUE) or its density",
1382
+ examples: ["T.DIST(1.96, 30, TRUE)"]
1383
+ },
1384
+ {
1385
+ name: "T.DIST.2T",
1386
+ handler: H(2, Pr),
1387
+ minArgs: 2,
1388
+ maxArgs: 2,
1389
+ description: "Returns the two-tailed Student's t distribution for x >= 0",
1390
+ examples: ["T.DIST.2T(1.96, 30)"]
1391
+ },
1392
+ {
1393
+ name: "T.DIST.RT",
1394
+ handler: H(2, Fr),
1395
+ minArgs: 2,
1396
+ maxArgs: 2,
1397
+ description: "Returns the right-tailed Student's t distribution",
1398
+ examples: ["T.DIST.RT(1.96, 30)"]
1399
+ },
1400
+ {
1401
+ name: "T.INV",
1402
+ handler: H(2, Ir),
1403
+ minArgs: 2,
1404
+ maxArgs: 2,
1405
+ description: "Returns the t value with the given left-tailed probability",
1406
+ examples: ["T.INV(0.975, 30)"]
1407
+ },
1408
+ {
1409
+ name: "T.INV.2T",
1410
+ handler: H(2, Lr),
1411
+ minArgs: 2,
1412
+ maxArgs: 2,
1413
+ description: "Returns the t value whose two tails hold the given probability",
1414
+ examples: ["T.INV.2T(0.05, 30)"]
1415
+ },
1416
+ {
1417
+ name: "NORM.DIST",
1418
+ handler: Kr,
1419
+ minArgs: 4,
1420
+ maxArgs: 4,
1421
+ description: "Returns the normal distribution (cumulative TRUE) or its density",
1422
+ examples: ["NORM.DIST(42, 40, 1.5, TRUE)"]
1423
+ },
1424
+ {
1425
+ name: "NORM.S.DIST",
1426
+ handler: qr,
1427
+ minArgs: 2,
1428
+ maxArgs: 2,
1429
+ description: "Returns the standard normal distribution (cumulative TRUE) or its density",
1430
+ examples: ["NORM.S.DIST(1.96, TRUE)"]
1431
+ },
1432
+ {
1433
+ name: "NORM.INV",
1434
+ handler: H(3, Jr),
1435
+ minArgs: 3,
1436
+ maxArgs: 3,
1437
+ description: "Returns the value with the given cumulative normal probability",
1438
+ examples: ["NORM.INV(0.9, 40, 1.5)"]
1439
+ },
1440
+ {
1441
+ name: "NORM.S.INV",
1442
+ handler: H(1, Yr),
1443
+ minArgs: 1,
1444
+ maxArgs: 1,
1445
+ description: "Returns the z with the given cumulative standard normal probability",
1446
+ examples: ["NORM.S.INV(0.975)"]
1447
+ },
1448
+ {
1449
+ name: "CONFIDENCE.NORM",
1450
+ handler: H(3, (e) => {
1451
+ let t = Xr(e);
1452
+ return "size" in t ? mr(t.alpha / 2) * t.sd / Math.sqrt(t.size) : t;
1453
+ }),
1454
+ minArgs: 3,
1455
+ maxArgs: 3,
1456
+ description: "Returns the half-width of a confidence interval for a mean, using the normal distribution",
1457
+ examples: ["CONFIDENCE.NORM(0.05, 2.5, 50)"]
1458
+ },
1459
+ {
1460
+ name: "CONFIDENCE.T",
1461
+ handler: H(3, (e) => {
1462
+ let t = Xr(e);
1463
+ return "size" in t ? t.size === 1 ? g : xr(t.alpha / 2, t.size - 1) * t.sd / Math.sqrt(t.size) : t;
1464
+ }),
1465
+ minArgs: 3,
1466
+ maxArgs: 3,
1467
+ description: "Returns the half-width of a confidence interval for a mean, using Student's t distribution",
1468
+ examples: ["CONFIDENCE.T(0.05, 1, 50)"]
1469
+ }
1470
+ ].forEach((e) => O.register({
1471
+ ...e,
1472
+ category: "Statistical"
1473
+ }));
1474
+ //#endregion
1475
+ //#region src/engine/functions/shape-math.ts
1476
+ var Zr = 3, Qr = 4, $r = (e) => e.reduce((e, t) => e + t, 0) / e.length;
1477
+ function ei(e, t) {
1478
+ let n = $r(e), r = e.map((e) => e - n), i = Math.sqrt(r.reduce((e, t) => e + t * t, 0) / (e.length - 1));
1479
+ return i === 0 ? null : r.reduce((e, n) => e + (n / i) ** t, 0);
1480
+ }
1481
+ function ti(e) {
1482
+ let t = e.length, n = t < Zr ? null : ei(e, 3);
1483
+ return n === null ? g : t / ((t - 1) * (t - 2)) * n;
1484
+ }
1485
+ function ni(e) {
1486
+ let t = e.length, n = t < Qr ? null : ei(e, 4);
1487
+ return n === null ? g : t * (t + 1) / ((t - 1) * (t - 2) * (t - 3)) * n - 3 * (t - 1) ** 2 / ((t - 2) * (t - 3));
1488
+ }
1489
+ var ri = (e, t, n) => n > 0 ? (e - t) / n : v;
1490
+ function ii(e) {
1491
+ return e.length === 0 || e.some((e) => e <= 0) ? v : Math.exp($r(e.map(Math.log)));
1492
+ }
1493
+ function ai(e) {
1494
+ return e.length === 0 || e.some((e) => e <= 0) ? v : e.length / e.reduce((e, t) => e + 1 / t, 0);
1495
+ }
1496
+ function oi(e, t) {
1497
+ let n = e.length - 1, r = e.filter((e) => e < t).length;
1498
+ if (e[r] === t) return r / n;
1499
+ let i = e[r - 1] ?? t, a = e[r] ?? t;
1500
+ return (r - 1 + (t - i) / (a - i)) / n;
1501
+ }
1502
+ function si(e, t, n) {
1503
+ let r = Math.trunc(n);
1504
+ if (r < 1 || e.length === 0) return v;
1505
+ let i = Array.from(Float64Array.from(e).sort()), [a, o] = [i[0], i.at(-1)];
1506
+ if (a === void 0 || o === void 0 || t < a || t > o) return y;
1507
+ if (i.length === 1) return 1;
1508
+ let s = 10 ** r;
1509
+ return Math.floor(oi(i, t) * s * (1 + 2 ** -52 * 4)) / s;
1510
+ }
1511
+ //#endregion
1512
+ //#region src/engine/functions/shape.ts
1513
+ var ci = 255, li = 3, ui = (e, t, n) => S(t.evaluateFormula(T(t, e, n)));
1514
+ function di(e, t) {
1515
+ return jt(e, t, E(t)).map(({ value: e }) => e).find(b) ?? M(e, t);
1516
+ }
1517
+ var fi = (e) => (t, n) => {
1518
+ let r = di(t, n);
1519
+ return Array.isArray(r) ? e(r) : r;
1520
+ };
1521
+ [
1522
+ {
1523
+ name: "SKEW",
1524
+ handler: fi(ti),
1525
+ minArgs: 1,
1526
+ maxArgs: ci,
1527
+ description: "Returns the skewness of a sample",
1528
+ examples: ["SKEW(A2:A100)"]
1529
+ },
1530
+ {
1531
+ name: "KURT",
1532
+ handler: fi(ni),
1533
+ minArgs: 1,
1534
+ maxArgs: ci,
1535
+ description: "Returns the excess kurtosis of a sample",
1536
+ examples: ["KURT(A2:A100)"]
1537
+ },
1538
+ {
1539
+ name: "STANDARDIZE",
1540
+ handler: (e, t) => {
1541
+ let n = [
1542
+ 0,
1543
+ 1,
1544
+ 2
1545
+ ].map((n) => ui(e, t, n)), r = n.find((e) => typeof e != "number");
1546
+ if (r) return r;
1547
+ let [i = 0, a = 0, o = 0] = n.map(Number);
1548
+ return ri(i, a, o);
1549
+ },
1550
+ minArgs: 3,
1551
+ maxArgs: 3,
1552
+ description: "Returns (x - mean) / standard deviation",
1553
+ examples: ["STANDARDIZE(A2, AVERAGE(A2:A100), STDEV(A2:A100))"]
1554
+ },
1555
+ {
1556
+ name: "PERCENTRANK.INC",
1557
+ handler: (e, t) => {
1558
+ let n = ui(e, t, 1);
1559
+ if (typeof n != "number") return n;
1560
+ let r = e.length > 2 ? ui(e, t, 2) : li;
1561
+ if (typeof r != "number") return r;
1562
+ let i = di([T(t, e, 0)], t);
1563
+ return Array.isArray(i) ? si(i, n, r) : i;
1564
+ },
1565
+ minArgs: 2,
1566
+ maxArgs: 3,
1567
+ description: "Returns the rank of x in a range as a fraction from 0 to 1, to significance digits (3 by default)",
1568
+ examples: ["PERCENTRANK.INC(A2:A100, A2)"]
1569
+ },
1570
+ {
1571
+ name: "GEOMEAN",
1572
+ handler: fi(ii),
1573
+ minArgs: 1,
1574
+ maxArgs: ci,
1575
+ description: "Returns the geometric mean of positive numbers",
1576
+ examples: ["GEOMEAN(A2:A20)"]
1577
+ },
1578
+ {
1579
+ name: "HARMEAN",
1580
+ handler: fi(ai),
1581
+ minArgs: 1,
1582
+ maxArgs: ci,
1583
+ description: "Returns the harmonic mean of positive numbers",
1584
+ examples: ["HARMEAN(A2:A20)"]
1585
+ }
1586
+ ].forEach((e) => O.register({
1587
+ ...e,
1588
+ category: "Statistical"
1589
+ }));
1590
+ //#endregion
1591
+ //#region src/engine/math-ops.ts
1592
+ var pi = 10, mi = (e) => pi ** +e, hi = 15, gi = (e) => Number(e.toPrecision(hi)), _i = (e, t, n) => {
1593
+ if (mi(t) === 0) return 0;
1594
+ let r = Math.abs(e) * mi(t);
1595
+ return !Number.isFinite(r) || Number.isInteger(r) && r !== 0 ? e : Math.sign(e) * n(gi(r)) / mi(t);
1596
+ }, vi = (e, t, n) => {
1597
+ let r = e / t;
1598
+ return !Number.isFinite(r) || Number.isInteger(r) ? e : gi(n(gi(r)) * t);
1599
+ };
1600
+ function yi(e, t) {
1601
+ return _i(e, t, Math.round);
1602
+ }
1603
+ function bi(e, t) {
1604
+ return mi(t) === 0 && e !== 0 ? v : _i(e, t, Math.ceil);
1605
+ }
1606
+ function xi(e, t) {
1607
+ return _i(e, t, Math.floor);
1608
+ }
1609
+ var Si = (e, t) => e === 0 || Math.sign(e) === Math.sign(t);
1610
+ function Ci(e, t) {
1611
+ return t === 0 ? g : Si(e, t) ? vi(e, t, Math.floor) : v;
1612
+ }
1613
+ function wi(e, t) {
1614
+ return t === 0 ? 0 : Si(e, t) ? vi(e, t, Math.ceil) : v;
1615
+ }
1616
+ function Ti(e, t) {
1617
+ return t === 0 ? g : e - t * Math.floor(e / t);
1618
+ }
1619
+ function Ei(e, t) {
1620
+ if (e < 0 && !Number.isInteger(t)) return v;
1621
+ if (e === 0 && t < 0) return g;
1622
+ if (e === 0 && t === 0) return v;
1623
+ let n = e ** +t;
1624
+ return Number.isFinite(n) ? n : v;
1625
+ }
1626
+ function Di(e) {
1627
+ return e <= 0 ? v : Math.log(e);
1628
+ }
1629
+ function Oi(e, t) {
1630
+ let n = Di(e);
1631
+ return b(n) ? n : t <= 0 || t === 1 ? v : n / Math.log(t);
1632
+ }
1633
+ function ki(e) {
1634
+ return e <= 0 ? v : Math.log10(e);
1635
+ }
1636
+ function Ai(e) {
1637
+ return e < 0 ? v : Math.sqrt(e);
1638
+ }
1639
+ O.register({
1640
+ name: "ROUND",
1641
+ handler: (e, t) => yi(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1642
+ minArgs: 2,
1643
+ maxArgs: 2,
1644
+ description: "Rounds a number to a specified number of digits",
1645
+ examples: ["ROUND(3.14159, 2)", "ROUND(A1, 0)"],
1646
+ category: "Mathematical"
1647
+ }), O.register({
1648
+ name: "ROUNDUP",
1649
+ handler: (e, t) => bi(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1650
+ minArgs: 2,
1651
+ maxArgs: 2,
1652
+ description: "Rounds a number up, away from zero",
1653
+ examples: ["ROUNDUP(3.14159, 2)", "ROUNDUP(A1, 0)"],
1654
+ category: "Mathematical"
1655
+ }), O.register({
1656
+ name: "ROUNDDOWN",
1657
+ handler: (e, t) => xi(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1658
+ minArgs: 2,
1659
+ maxArgs: 2,
1660
+ description: "Rounds a number down, toward zero",
1661
+ examples: ["ROUNDDOWN(3.14159, 2)", "ROUNDDOWN(A1, 0)"],
1662
+ category: "Mathematical"
1663
+ }), O.register({
1664
+ name: "FLOOR",
1665
+ handler: (e, t) => Ci(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1666
+ minArgs: 2,
1667
+ maxArgs: 2,
1668
+ description: "Rounds a number down to the nearest multiple of significance",
1669
+ examples: ["FLOOR(3.7, 1)", "FLOOR(24, 5)"],
1670
+ category: "Mathematical"
1671
+ }), O.register({
1672
+ name: "CEILING",
1673
+ handler: (e, t) => wi(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1674
+ minArgs: 2,
1675
+ maxArgs: 2,
1676
+ description: "Rounds a number up to the nearest multiple of significance",
1677
+ examples: ["CEILING(3.2, 1)", "CEILING(24, 5)"],
1678
+ category: "Mathematical"
1679
+ }), O.register({
1680
+ name: "ABS",
1681
+ handler: (e, t) => {
1682
+ let n = S(t.evaluateFormula(T(t, e, 0)));
1683
+ return b(n) ? n : Math.abs(n);
1684
+ },
1685
+ minArgs: 1,
1686
+ maxArgs: 1,
1687
+ description: "Returns the absolute value of a number",
1688
+ examples: ["ABS(-5)", "ABS(A1)"],
1689
+ category: "Mathematical"
1690
+ }), O.register({
1691
+ name: "POWER",
1692
+ handler: (e, t) => Ei(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1693
+ minArgs: 2,
1694
+ maxArgs: 2,
1695
+ description: "Returns the result of a number raised to a power",
1696
+ examples: ["POWER(2, 3)", "POWER(A1, 2)"],
1697
+ category: "Mathematical"
1698
+ }), O.register({
1699
+ name: "SQRT",
1700
+ handler: (e, t) => Ai(k(t.evaluateFormula(T(t, e, 0)))),
1701
+ minArgs: 1,
1702
+ maxArgs: 1,
1703
+ description: "Returns the square root of a number",
1704
+ examples: ["SQRT(16)", "SQRT(A1)"],
1705
+ category: "Mathematical"
1706
+ }), O.register({
1707
+ name: "MOD",
1708
+ handler: (e, t) => Ti(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1)))),
1709
+ minArgs: 2,
1710
+ maxArgs: 2,
1711
+ description: "Returns the remainder after division",
1712
+ examples: ["MOD(10, 3)", "MOD(A1, 2)"],
1713
+ category: "Mathematical"
1714
+ }), O.register({
1715
+ name: "INT",
1716
+ handler: (e, t) => {
1717
+ let n = k(t.evaluateFormula(T(t, e, 0)));
1718
+ return Math.floor(n);
1719
+ },
1720
+ minArgs: 1,
1721
+ maxArgs: 1,
1722
+ description: "Rounds a number down to the nearest integer",
1723
+ examples: ["INT(3.7)", "INT(A1)"],
1724
+ category: "Mathematical"
1725
+ }), O.register({
1726
+ name: "TRUNC",
1727
+ handler: (e, t) => xi(k(t.evaluateFormula(T(t, e, 0))), e.length === 2 ? k(t.evaluateFormula(T(t, e, 1))) : 0),
1728
+ minArgs: 1,
1729
+ maxArgs: 2,
1730
+ description: "Truncates a number to a specified number of decimal places",
1731
+ examples: ["TRUNC(3.14159, 2)", "TRUNC(A1)"],
1732
+ category: "Mathematical"
1733
+ }), O.register({
1734
+ name: "SIGN",
1735
+ handler: (e, t) => {
1736
+ let n = S(t.evaluateFormula(T(t, e, 0)));
1737
+ return b(n) ? n : Math.sign(n);
1738
+ },
1739
+ minArgs: 1,
1740
+ maxArgs: 1,
1741
+ description: "Returns the sign of a number (1, 0, or -1)",
1742
+ examples: ["SIGN(-5)", "SIGN(A1)"],
1743
+ category: "Mathematical"
1744
+ }), O.register({
1745
+ name: "PI",
1746
+ handler: () => Math.PI,
1747
+ minArgs: 0,
1748
+ maxArgs: 0,
1749
+ description: "Returns the value of pi (3.14159...)",
1750
+ examples: ["PI()", "PI()*2"],
1751
+ category: "Mathematical"
1752
+ }), O.register({
1753
+ name: "EXP",
1754
+ handler: (e, t) => {
1755
+ let n = k(t.evaluateFormula(T(t, e, 0)));
1756
+ return Math.exp(n);
1757
+ },
1758
+ minArgs: 1,
1759
+ maxArgs: 1,
1760
+ description: "Returns e raised to the power of a number",
1761
+ examples: ["EXP(1)", "EXP(A1)"],
1762
+ category: "Mathematical"
1763
+ }), O.register({
1764
+ name: "LN",
1765
+ handler: (e, t) => Di(k(t.evaluateFormula(T(t, e, 0)))),
1766
+ minArgs: 1,
1767
+ maxArgs: 1,
1768
+ description: "Returns the natural logarithm of a number",
1769
+ examples: ["LN(10)", "LN(A1)"],
1770
+ category: "Mathematical"
1771
+ }), O.register({
1772
+ name: "LOG",
1773
+ handler: (e, t) => Oi(k(t.evaluateFormula(T(t, e, 0))), e.length === 2 ? k(t.evaluateFormula(T(t, e, 1))) : 10),
1774
+ minArgs: 1,
1775
+ maxArgs: 2,
1776
+ description: "Returns the logarithm of a number to a specified base",
1777
+ examples: ["LOG(100)", "LOG(8, 2)"],
1778
+ category: "Mathematical"
1779
+ }), O.register({
1780
+ name: "LOG10",
1781
+ handler: (e, t) => ki(k(t.evaluateFormula(T(t, e, 0)))),
1782
+ minArgs: 1,
1783
+ maxArgs: 1,
1784
+ description: "Returns the base-10 logarithm of a number",
1785
+ examples: ["LOG10(100)", "LOG10(A1)"],
1786
+ category: "Mathematical"
1787
+ });
1788
+ //#endregion
1789
+ //#region src/engine/escapes.ts
1790
+ function U(e, t) {
1791
+ let n = { position: t };
1792
+ for (; n.position > 0 && e[n.position - 1] === "\\";) --n.position;
1793
+ return (t - n.position) % 2 == 1;
1794
+ }
1795
+ //#endregion
1796
+ //#region src/engine/translateFormula.ts
1797
+ function ji(e) {
1798
+ return ta(Gi(e));
1799
+ }
1800
+ function Mi(e, t) {
1801
+ return e === "" ? t : t === e ? "" : e;
1802
+ }
1803
+ function Ni(e) {
1804
+ let t = e.split(""), n = [], r = "";
1805
+ return t.forEach((t, i) => {
1806
+ (t === "\"" || t === "'") && !U(e, i) && (r = Mi(r, t)), n.push(t === "&" && r === "" ? "+" : t);
1807
+ }), n.join("");
1808
+ }
1809
+ function Pi(e) {
1810
+ let t = [], n = { openQuote: "" };
1811
+ return e.split("").forEach((r, i) => {
1812
+ (r === "\"" || r === "'") && !U(e, i) && (n.openQuote = Mi(n.openQuote, r));
1813
+ let a = t.at(-1);
1814
+ n.openQuote === "" && (r === "-" || r === "+") && a === r && t.push(" "), t.push(r);
1815
+ }), t.join("");
1816
+ }
1817
+ function Fi(e) {
1818
+ return e.replace(/([^<>!])=([^=])/g, "$1==$2");
1819
+ }
1820
+ function Ii(e) {
1821
+ return /^[\d+\-*/(). ]+$/.test(e);
1822
+ }
1823
+ function Li(e) {
1824
+ return /^[\d+\-*/(). <>!=]+$/.test(e);
1825
+ }
1826
+ var Ri = /^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/, zi = /^[A-Za-z_$][\w$]*/, Bi = /^\s+/;
1827
+ function Vi(e, t) {
1828
+ let n = e[t], r = Array.from(e.slice(t + 1)).findIndex((r, i) => r === n && !U(e, t + 1 + i));
1829
+ return r === -1 ? e.length : t + r + 2;
1830
+ }
1831
+ var Hi = {
1832
+ "(": "open",
1833
+ ")": "close",
1834
+ "^": "caret"
1835
+ }, Ui = [
1836
+ {
1837
+ kind: "number",
1838
+ pattern: Ri
1839
+ },
1840
+ {
1841
+ kind: "word",
1842
+ pattern: zi
1843
+ },
1844
+ {
1845
+ kind: "space",
1846
+ pattern: Bi
1847
+ }
1848
+ ];
1849
+ function Wi(e, t) {
1850
+ let n = e[t];
1851
+ if (n === "\"" || n === "'") return {
1852
+ kind: "literal",
1853
+ text: e.slice(t, Vi(e, t))
1854
+ };
1855
+ let r = e.slice(t), i = Ui.map(({ kind: e, pattern: t }) => ({
1856
+ kind: e,
1857
+ text: t.exec(r)?.[0]
1858
+ })).find((e) => e.text !== void 0);
1859
+ return i?.text === void 0 ? {
1860
+ kind: Hi[n] ?? "symbol",
1861
+ text: n
1862
+ } : {
1863
+ kind: i.kind,
1864
+ text: i.text
1865
+ };
1866
+ }
1867
+ function Gi(e) {
1868
+ let t = [], n = { position: 0 };
1869
+ for (; n.position < e.length;) {
1870
+ let r = Wi(e, n.position);
1871
+ t.push(r), n.position += r.text.length;
1872
+ }
1873
+ return t;
1874
+ }
1875
+ var Ki = (e) => e?.kind === "symbol" && (e.text === "-" || e.text === "+");
1876
+ function qi(e, t) {
1877
+ let n = { depth: 0 };
1878
+ return e.findIndex((e, r) => r < t ? !1 : (e.kind === "open" && (n.depth += 1), e.kind === "close" && --n.depth, n.depth === 0));
1879
+ }
1880
+ function Ji(e, t) {
1881
+ let n = e[t];
1882
+ if (n === void 0) return null;
1883
+ if (n.kind === "number" || n.kind === "literal" || n.kind === "word") return {
1884
+ text: n.text,
1885
+ end: t + 1
1886
+ };
1887
+ if (n.kind !== "open") return null;
1888
+ let r = qi(e, t);
1889
+ return r === -1 ? null : {
1890
+ text: `(${ta(e.slice(t + 1, r))})`,
1891
+ end: r + 1
1892
+ };
1893
+ }
1894
+ function Yi(e, t) {
1895
+ let n = { index: t };
1896
+ for (; Ki(e[n.index]) || e[n.index]?.kind === "space";) n.index += 1;
1897
+ let r = Ji(e, n.index);
1898
+ if (r === null) return null;
1899
+ let i = e.slice(t, n.index), a = i.filter((e) => e.kind === "symbol").map((e) => e.text), o = i.map((e) => e.text).join("");
1900
+ return {
1901
+ text: a.join(" ") + r.text,
1902
+ source: o + r.text,
1903
+ signed: a.length > 0,
1904
+ end: r.end
1905
+ };
1906
+ }
1907
+ function Xi(e, t) {
1908
+ let n = { index: t };
1909
+ for (; e[n.index]?.kind === "space";) n.index += 1;
1910
+ return e[n.index]?.kind === "caret" ? n.index : -1;
1911
+ }
1912
+ var Zi = (e) => e.signed ? `(${e.text})` : e.text;
1913
+ function Qi(e, t) {
1914
+ let n = {
1915
+ text: Zi(t),
1916
+ end: t.end,
1917
+ links: 0
1918
+ };
1919
+ for (let t = Xi(e, n.end); t !== -1; t = Xi(e, n.end)) {
1920
+ let r = Yi(e, t + 1);
1921
+ if (r === null) break;
1922
+ let i = n.links === 0 ? n.text : `(${n.text})`;
1923
+ Object.assign(n, {
1924
+ text: `${i}**${Zi(r)}`,
1925
+ end: r.end,
1926
+ links: n.links + 1
1927
+ });
1928
+ }
1929
+ return n.links === 0 ? {
1930
+ text: t.source,
1931
+ end: t.end
1932
+ } : n;
1933
+ }
1934
+ var $i = (e) => e === void 0 || e.kind === "open" || e.kind === "symbol" || e.kind === "caret", ea = (e, t) => e.kind !== "space" && (!Ki(e) || $i(t));
1935
+ function ta(e) {
1936
+ let t = [], n = {
1937
+ index: 0,
1938
+ previous: void 0
1939
+ };
1940
+ for (; n.index < e.length;) {
1941
+ let r = e[n.index], i = ea(r, n.previous) ? Yi(e, n.index) : null, a = i === null ? null : Qi(e, i);
1942
+ t.push(a === null ? r.kind === "caret" ? "**" : r.text : a.text);
1943
+ let o = a === null ? n.index + 1 : a.end;
1944
+ r.kind !== "space" && (n.previous = e[o - 1]), n.index = o;
1945
+ }
1946
+ return t.join("");
1947
+ }
1948
+ //#endregion
1949
+ //#region src/engine/concatPrecedence.ts
1950
+ var na = (e) => e === "\"" || e === "'";
1951
+ function ra(e) {
1952
+ let t = {
1953
+ quote: "",
1954
+ depth: 0
1955
+ };
1956
+ return e.split("").map((n, r) => {
1957
+ let i = na(n) && !U(e, r) && (t.quote === "" || t.quote === n), a = t.quote !== "" || i;
1958
+ i && (t.quote = t.quote === "" ? n : ""), !a && n === ")" && --t.depth;
1959
+ let o = {
1960
+ char: n,
1961
+ inLiteral: a,
1962
+ depth: t.depth
1963
+ };
1964
+ return !a && n === "(" && (t.depth += 1), o;
1965
+ });
1966
+ }
1967
+ var ia = (e, t) => !e.inLiteral && t.includes(e.char);
1968
+ function aa(e) {
1969
+ let t = ra(e).flatMap((e, t) => e.depth === 0 && ia(e, "&") ? [t] : []);
1970
+ return [-1, ...t].map((n, r) => e.slice(n + 1, t[r] ?? e.length));
1971
+ }
1972
+ function oa(e) {
1973
+ let t = ra(e), n = t.flatMap((e, t) => e.depth === 0 && ia(e, "(") ? [t] : []), r = (e) => t.findIndex((t, n) => n > e && t.depth === 0 && ia(t, ")"));
1974
+ return n.map((e) => ({
1975
+ open: e,
1976
+ close: r(e)
1977
+ })).filter(({ close: e }) => e > 0);
1978
+ }
1979
+ function sa(e) {
1980
+ let { pieces: t, cursor: n } = oa(e).reduce((t, { open: n, close: r }) => ({
1981
+ pieces: [
1982
+ ...t.pieces,
1983
+ e.slice(t.cursor, n + 1),
1984
+ da(e.slice(n + 1, r))
1985
+ ],
1986
+ cursor: r
1987
+ }), {
1988
+ pieces: [],
1989
+ cursor: 0
1990
+ });
1991
+ return [...t, e.slice(n)].join("");
1992
+ }
1993
+ var ca = {
1994
+ true: "\"TRUE\"",
1995
+ false: "\"FALSE\""
1996
+ };
1997
+ function la(e) {
1998
+ let t = e.trim(), n = ra(t);
1999
+ return t.startsWith("(") && n.findIndex((e, t) => t > 0 && e.depth === 0 && ia(e, ")")) === t.length - 1 ? la(t.slice(1, -1)) : t;
2000
+ }
2001
+ var ua = (e) => ca[la(e)] ?? e;
2002
+ function da(e) {
2003
+ let t = aa(e).map(sa);
2004
+ return t.length === 1 ? t[0] ?? "" : `(""+${t.map((e) => `(${ua(e)})`).join("+")})`;
2005
+ }
2006
+ function fa(e) {
2007
+ if (ra(e).some((e) => ia(e, "=<>"))) return Ni(e);
2008
+ let t = aa(e);
2009
+ return t.length > 1 && t.some((e) => e.trim() === "") ? Ni(e) : da(e);
2010
+ }
2011
+ function pa(e) {
2012
+ let t = aa(e), n = t.flatMap((e) => oa(e).flatMap(({ open: t, close: n }) => pa(e.slice(t + 1, n))));
2013
+ return t.length > 1 ? [...t, ...n] : n;
2014
+ }
2015
+ //#endregion
2016
+ //#region src/engine/textCollation.ts
2017
+ var ma = " \n\v\f\r _-,;:!?.'\"()[]{}@*/\\&#%`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz", ha = 74, ga = 8, _a = 14, va = 31, ya = 127;
2018
+ function ba(e) {
2019
+ let t = e.codePointAt(0) ?? 0;
2020
+ return t <= ga || t >= _a && t <= va || t === ya;
2021
+ }
2022
+ var xa = /^[\u0300-\u036f]$/u, Sa = /* @__PURE__ */ "34f.332.313 343.314.301 341.300 340.306.302.30c.30a.342.308.344.30b.303.307.338.327.328.304.30d 30e 312 315 31a 33d 33e 33f 346 34a 34b 34c 350 351 352 357 35b 35d 35e.316 317 318 319 31c 31d 31e 31f 320 329 32a 32b 32c 32f 333 33a 33b 33c 347 348 349 34d 34e 353 354 355 356 359 35a 35c 35f 362.336 337.335.305.309.30f.310.311.31b.321.322.323.324.325.326.32d.32e.330.331.334.339.345.358.360.361".split("."), Ca = 0, wa = "aeioucdhmrtvx", Ta = 867, Ea = (e) => wa.charAt((e.codePointAt(0) ?? 0) - Ta) || e, Da = new Map(Sa.flatMap((e, t) => e.split(" ").map((e) => [String.fromCodePoint(Number.parseInt(e, 16)), t])));
2023
+ function Oa(e) {
2024
+ let t = ma.indexOf(e);
2025
+ return t >= 0 ? t : ha + (e.codePointAt(0) ?? 0);
2026
+ }
2027
+ function ka(e) {
2028
+ let t = {
2029
+ primary: [],
2030
+ accents: []
2031
+ };
2032
+ return Array.from(e.normalize("NFD")).filter((e) => !ba(e)).map(Ea).forEach((e) => {
2033
+ let n = t.accents.at(-1);
2034
+ if (xa.test(e) && n !== void 0) {
2035
+ let t = Da.get(e) ?? Ca;
2036
+ t !== Ca && n.push(t);
2037
+ } else t.primary.push(Oa(e.toLowerCase())), t.accents.push([]);
2038
+ }), t;
2039
+ }
2040
+ function Aa(e, t) {
2041
+ let n = Math.min(e.length, t.length);
2042
+ for (let r = 0; r < n; r += 1) {
2043
+ let [n, i] = [e[r], t[r]];
2044
+ if (n !== void 0 && i !== void 0 && n !== i) return n < i ? -1 : 1;
2045
+ }
2046
+ return e.length - t.length;
2047
+ }
2048
+ function ja(e, t) {
2049
+ return e.reduce((e, n, r) => e || Aa(n, t[r] ?? []), 0);
2050
+ }
2051
+ function Ma(e, t) {
2052
+ let [n, r] = [ka(e), ka(t)];
2053
+ return Aa(n.primary, r.primary) || ja(n.accents, r.accents);
2054
+ }
2055
+ //#endregion
2056
+ //#region src/engine/textComparison.ts
2057
+ var Na = [
2058
+ "<>",
2059
+ "<=",
2060
+ ">=",
2061
+ "=",
2062
+ "<",
2063
+ ">"
2064
+ ], Pa = "=<>!";
2065
+ function Fa(e) {
2066
+ let t = [];
2067
+ return ra(e).forEach((e, n) => {
2068
+ if (e.inLiteral || e.depth !== 0 || !Pa.includes(e.char)) return;
2069
+ let r = t.at(-1);
2070
+ r !== void 0 && r.start + r.text.length === n ? r.text += e.char : t.push({
2071
+ start: n,
2072
+ text: e.char
2073
+ });
2074
+ }), t;
2075
+ }
2076
+ var Ia = (e) => Na.some((t) => t === e);
2077
+ function La(e) {
2078
+ let t = Fa(e);
2079
+ if (t.length === 0) return null;
2080
+ let n = t.map((e) => e.text);
2081
+ if (!n.every(Ia)) return null;
2082
+ let r = [{
2083
+ start: 0,
2084
+ text: ""
2085
+ }, ...t].map((n, r) => ({
2086
+ from: n.start + n.text.length,
2087
+ to: t[r]?.start ?? e.length
2088
+ })).map(({ from: t, to: n }) => e.slice(t, n).trim());
2089
+ return r.some((e) => e === "") ? null : {
2090
+ operands: r,
2091
+ operators: n.filter(Ia)
2092
+ };
2093
+ }
2094
+ var Ra = 0, za = 1, Ba = 2, Va = (e) => typeof e == "number" ? Ra : typeof e == "boolean" ? Ba : za;
2095
+ function Ha(e, t) {
2096
+ let n = Va(e) - Va(t);
2097
+ return n === 0 ? typeof e == "number" && typeof t == "number" ? e - t : typeof e == "boolean" && typeof t == "boolean" ? Number(e) - Number(t) : Ma(String(e), String(t)) : n;
2098
+ }
2099
+ var Ua = {
2100
+ "=": (e) => e === 0,
2101
+ "<>": (e) => e !== 0,
2102
+ "<": (e) => e < 0,
2103
+ ">": (e) => e > 0,
2104
+ "<=": (e) => e <= 0,
2105
+ ">=": (e) => e >= 0
2106
+ };
2107
+ function Wa(e, t, n) {
2108
+ return Ua[e](Ha(t, n));
2109
+ }
2110
+ function Ga(e, t) {
2111
+ return t.reduce((t, n, r) => Wa(n, t, e[r + 1] ?? ""), e[0] ?? "");
2112
+ }
2113
+ //#endregion
2114
+ //#region src/engine/condition.ts
2115
+ var Ka = [
2116
+ ">=",
2117
+ "<=",
2118
+ "<>",
2119
+ "!=",
2120
+ "==",
2121
+ "=",
2122
+ ">",
2123
+ "<"
2124
+ ];
2125
+ function* qa(e) {
2126
+ let t = null;
2127
+ for (let n = 0; n < e.length; n++) {
2128
+ let r = e[n];
2129
+ t === null ? r === "\"" || r === "'" ? t = r : yield n : r === "\\" ? n++ : r === t && (t = null);
2130
+ }
2131
+ }
2132
+ function Ja(e) {
2133
+ let t = e.trim();
2134
+ for (; t.startsWith("(") && t.endsWith(")");) {
2135
+ let e = 0, n = !0;
2136
+ for (let r of qa(t)) {
2137
+ let i = t[r];
2138
+ if (i === "(") e++;
2139
+ else if (i === ")") {
2140
+ if (e--, e === 0 && r < t.length - 1) {
2141
+ n = !1;
2142
+ break;
2143
+ }
2144
+ if (e < 0) return t;
2145
+ }
2146
+ }
2147
+ if (!n || e !== 0) return t;
2148
+ t = t.slice(1, -1).trim();
2149
+ }
2150
+ return t;
2151
+ }
2152
+ function Ya(e) {
2153
+ let t = Ja(e);
2154
+ for (let e of qa(t)) for (let n of Ka) if (t.startsWith(n, e)) return {
2155
+ left: t.slice(0, e).trim(),
2156
+ operator: n,
2157
+ right: t.slice(e + n.length).trim()
2158
+ };
2159
+ return null;
2160
+ }
2161
+ function Xa(e) {
2162
+ return e.length >= 2 && (e.startsWith("\"") && e.endsWith("\"") || e.startsWith("'") && e.endsWith("'")) ? {
2163
+ value: e.slice(1, -1).replace(/\\(["'\\])/g, "$1"),
2164
+ quoted: !0
2165
+ } : {
2166
+ value: e,
2167
+ quoted: !1
2168
+ };
2169
+ }
2170
+ function Za(e) {
2171
+ let { value: t, quoted: n } = Xa(e.trim());
2172
+ if (n) return t;
2173
+ if (t === "") return "";
2174
+ let r = t.toUpperCase();
2175
+ if (r === "TRUE") return !0;
2176
+ if (r === "FALSE") return !1;
2177
+ let i = Number(t);
2178
+ return Number.isNaN(i) ? t : i;
2179
+ }
2180
+ var Qa = {
2181
+ ">=": ">=",
2182
+ "<=": "<=",
2183
+ "<>": "<>",
2184
+ "!=": "<>",
2185
+ "==": "=",
2186
+ "=": "=",
2187
+ ">": ">",
2188
+ "<": "<"
2189
+ }, $a = (e) => typeof e == "number" ? 0 : typeof e != "boolean" && "";
2190
+ function eo(e, t) {
2191
+ let [n, r] = [t(e.left), t(e.right)], i = e.left === "" ? $a(r) : n, a = e.right === "" ? $a(n) : r;
2192
+ return Wa(Qa[e.operator], i, a);
2193
+ }
2194
+ function to(e) {
2195
+ return typeof e == "boolean" ? e : typeof e == "number" ? e !== 0 : e !== "";
2196
+ }
2197
+ function no(e, t) {
2198
+ let n = Ya(e);
2199
+ return n ? eo(n, t) : to(t(Ja(e)));
2200
+ }
2201
+ function ro(e) {
2202
+ if (e == null) return "\"\"";
2203
+ let t = b(e) ? e.code : e;
2204
+ return typeof t == "string" ? `"${t.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"` : t.toString();
2205
+ }
2206
+ //#endregion
2207
+ //#region src/engine/concatOperand.ts
2208
+ var io = (e) => e.trim() === "";
2209
+ function ao(e, t) {
2210
+ let n = { at: t - 1 };
2211
+ for (; n.at >= 0 && (io(e[n.at] ?? "") || e[n.at] === "(");) --n.at;
2212
+ return n.at < 0 ? "" : e[n.at] ?? "";
2213
+ }
2214
+ function oo(e, t) {
2215
+ let n = { at: t };
2216
+ for (; n.at < e.length && (io(e[n.at] ?? "") || e[n.at] === ")");) n.at += 1;
2217
+ return n.at >= e.length ? "" : e[n.at] ?? "";
2218
+ }
2219
+ var so = (e) => e === "" || e === "&";
2220
+ function co(e, t, n) {
2221
+ let r = ao(e, t), i = oo(e, n);
2222
+ return so(r) && so(i) && (r === "&" || i === "&");
2223
+ }
2224
+ //#endregion
2225
+ //#region src/engine/formulaError.ts
2226
+ var W = {
2227
+ div_zero: "#DIV/0!",
2228
+ invalid_ref: "#REF!",
2229
+ syntax: "#NAME?",
2230
+ unknown: "#ERROR!"
2231
+ }, lo = {
2232
+ [W.div_zero]: "div_zero",
2233
+ [W.invalid_ref]: "invalid_ref",
2234
+ [W.syntax]: "syntax"
2235
+ }, G = class extends Error {
2236
+ errorType;
2237
+ display;
2238
+ constructor(e, t, n) {
2239
+ super(n ?? t), this.errorType = e, this.display = t, this.name = "FormulaError";
2240
+ }
2241
+ }, uo = (e) => e instanceof G, fo = () => new G("div_zero", W.div_zero, "Division by zero"), po = (e) => new G("invalid_ref", W.invalid_ref, `Invalid reference: ${e}`), mo = (e) => new G("syntax", W.syntax, `Unknown function: ${e}`), ho = (e) => new G("unknown", W.unknown, e), go = (e) => new G(lo[e] ?? "unknown", e, `Propagated error: ${e}`), _o = (e) => uo(e) ? {
2242
+ type: e.errorType,
2243
+ display: e.display
2244
+ } : {
2245
+ type: "unknown",
2246
+ display: W.unknown
2247
+ }, vo = RegExp(`^(${st})\\((.*)\\)$`, "i"), yo = RegExp(`^(${st})\\(`, "i");
2248
+ function bo(e) {
2249
+ if (e == null) return "0";
2250
+ let t = b(e) ? e.code : e;
2251
+ return typeof t == "string" ? `"${t.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"` : t.toString();
2252
+ }
2253
+ function xo(e) {
2254
+ let t = "", n = null;
2255
+ for (let r = 0; r < e.length; r++) {
2256
+ let i = e[r];
2257
+ if (n !== null) {
2258
+ if (i === "\\") {
2259
+ r++;
2260
+ continue;
2261
+ }
2262
+ i === n && (n = null, t += i);
2263
+ } else (i === "\"" || i === "'") && (n = i), t += i;
2264
+ }
2265
+ return t;
2266
+ }
2267
+ function So(e) {
2268
+ let t = xo(e).replace(/\b(?:true|false)\b/g, "");
2269
+ return /^[\d+\-*/(). "']*$/.test(t);
2270
+ }
2271
+ function Co(e, t) {
2272
+ let n = e[t], r = t + 1;
2273
+ for (; r < e.length;) if (e[r] === "\\") r += 2;
2274
+ else {
2275
+ if (e[r] === n) return r + 1;
2276
+ r++;
2277
+ }
2278
+ return e.length;
2279
+ }
2280
+ function wo(e, t) {
2281
+ let n = e.indexOf("'", t + 1);
2282
+ if (n === -1 || e[n + 1] !== "!") return null;
2283
+ let r = e.substring(n + 2).match(/^(\$?[A-Z]+\$?\d+)/);
2284
+ return r ? e.substring(t, n + 2 + r[0].length) : null;
2285
+ }
2286
+ function To(e, t) {
2287
+ let n = e.substring(t), r = n.match(/^([A-Z][A-Z0-9]*)!/i);
2288
+ if (r) {
2289
+ let e = n.substring(r[0].length).match(/^(\$?[A-Z]+\$?\d+)/);
2290
+ if (e) return r[0] + e[0];
2291
+ }
2292
+ let i = n.match(/^(\$?[A-Z]+\$?\d+)/);
2293
+ return i ? i[0] : null;
2294
+ }
2295
+ function Eo(e) {
2296
+ let t = [], n = 0;
2297
+ for (; n < e.length;) {
2298
+ let r = e[n];
2299
+ if (r === "\"") {
2300
+ n = Co(e, n);
2301
+ continue;
2302
+ }
2303
+ if (r === "'") {
2304
+ let r = wo(e, n);
2305
+ r ? (t.push({
2306
+ ref: r,
2307
+ start: n
2308
+ }), n += r.length) : n = Co(e, n);
2309
+ continue;
2310
+ }
2311
+ let i = To(e, n);
2312
+ i ? (t.push({
2313
+ ref: i,
2314
+ start: n
2315
+ }), n += i.length) : n++;
2316
+ }
2317
+ return t;
2318
+ }
2319
+ function Do(e, t, n) {
2320
+ return [...t].reverse().reduce((e, { ref: t, start: r }) => e.slice(0, r) + n(t, r) + e.slice(r + t.length), e);
2321
+ }
2322
+ function Oo(e) {
2323
+ let t = [], n = "", r = 0, i = !1, a = "";
2324
+ for (let o = 0; o < e.length; o++) {
2325
+ let s = e[o];
2326
+ (s === "\"" || s === "'") && !U(e, o) ? (i ? s === a && (i = !1, a = "") : (i = !0, a = s), n += s) : !i && (s === "(" && r++, s === ")" && r--, s === "," && r === 0) ? (t.push(n.trim()), n = "") : n += s;
2327
+ }
2328
+ return n.trim() && t.push(n.trim()), t;
2329
+ }
2330
+ function ko(e) {
2331
+ let t;
2332
+ try {
2333
+ t = Function(`return (${Pi(e)})`)();
2334
+ } catch {
2335
+ throw ho();
2336
+ }
2337
+ if (typeof t == "number") {
2338
+ if (!Number.isFinite(t)) throw fo();
2339
+ return t;
2340
+ }
2341
+ if (typeof t == "string" || typeof t == "boolean") return t;
2342
+ throw ho();
2343
+ }
2344
+ function Ao(e) {
2345
+ if (!e.includes("&")) return null;
2346
+ let t = fa(e);
2347
+ return So(t) ? (pa(e).filter(Ii).forEach(ko), ko(t)) : null;
2348
+ }
2349
+ var jo = /^\(*\s*(true|false)\s*\)*$/i, Mo = (e) => (e.startsWith("\"") || e.startsWith("'")) && e.endsWith(e[0] ?? "") && Co(e, 0) === e.length;
2350
+ function No(e) {
2351
+ let t = jo.exec(e)?.[1];
2352
+ if (t !== void 0) return t.toLowerCase() === "true";
2353
+ let n = Ao(e);
2354
+ return n === null ? Ii(e) || Mo(Ja(e)) ? ko(e) : null : n;
2355
+ }
2356
+ var Po = (e) => e !== null;
2357
+ function Fo(e, t) {
2358
+ let n = e.trim();
2359
+ if (Mo(n)) {
2360
+ let e = n.slice(1, -1), r = $e(e, t.preferDDMMYYYY);
2361
+ return r === null ? e : r;
2362
+ }
2363
+ let [, r, i] = e.match(vo) ?? [];
2364
+ if (r !== void 0 && i !== void 0 && ct(r)) {
2365
+ let e = 0, n = !0;
2366
+ for (let t of i) if (t === "(") e++;
2367
+ else if (t === ")" && (e--, e < 0)) {
2368
+ n = !1;
2369
+ break;
2370
+ }
2371
+ let a = r.toUpperCase(), o = O.get(a);
2372
+ if (o && n) {
2373
+ let e = Oo(i);
2374
+ if (o.minArgs !== void 0 && e.length < o.minArgs) throw ot(a, o.minArgs);
2375
+ if (o.maxArgs !== void 0 && e.length > o.maxArgs) throw Error(`${a} accepts at most ${o.maxArgs} argument${o.maxArgs === 1 ? "" : "s"}`);
2376
+ return o.handler(e, {
2377
+ functionName: a,
2378
+ getCellValue: t.getCellValue,
2379
+ getRangeValues: t.getRangeValues,
2380
+ getRangeValuesRaw: t.getRangeValuesRaw,
2381
+ getRangeValuesKeepingBlanks: t.getRangeValuesKeepingBlanks,
2382
+ countFilledCells: t.countFilledCells,
2383
+ evaluateFormula: t.evaluateFormula,
2384
+ preferDDMMYYYY: t.preferDDMMYYYY
2385
+ });
2386
+ }
2387
+ if (n && !o) throw mo(a);
2388
+ }
2389
+ let a = e, o = 0, s = 0;
2390
+ for (; o < a.length && s < 100;) {
2391
+ if (s++, a[o] === "\"" || a[o] === "'") {
2392
+ o = Co(a, o);
2393
+ continue;
2394
+ }
2395
+ let [, e] = a.substring(o).match(yo) ?? [];
2396
+ if (e === void 0 || !ct(e)) {
2397
+ if (o++, o >= a.length) break;
2398
+ continue;
2399
+ }
2400
+ let n = o, r = o + e.length + 1, i = 1, c = r, l = !1, u = "";
2401
+ for (; c < a.length && i > 0;) {
2402
+ let e = a[c];
2403
+ (e === "\"" || e === "'") && !U(a, c) && (l ? e === u && (l = !1, u = "") : (l = !0, u = e)), l || (e === "(" ? i++ : e === ")" && i--), c++;
2404
+ }
2405
+ if (i === 0) {
2406
+ let e = a.substring(n, c), r = t.evaluateFormula(e);
2407
+ if (b(r)) throw go(r.code);
2408
+ let i = typeof r == "string" ? bo(r) : `(${r})`;
2409
+ a = a.substring(0, n) + i + a.substring(c), o = n + i.length;
2410
+ } else o++;
2411
+ }
2412
+ let c = Eo(a), l = c.length === 1 ? c[0] : void 0;
2413
+ if (l) {
2414
+ let e = a.slice(0, l.start), n = a.slice(l.start + l.ref.length);
2415
+ if (e.trim() === "" && n.trim() === "") return t.getCellValue(l.ref);
2416
+ }
2417
+ let u = a;
2418
+ a = Do(a, c, (e, n) => {
2419
+ if (co(u, n, n + e.length) && t.isCellEmpty?.(e)) return "\"\"";
2420
+ let r = t.getCellValue(e), i = Fe(r);
2421
+ if (i !== null) throw go(i);
2422
+ return bo(r);
2423
+ }), a = a.replace(/"([^"]+)"/g, (e, n) => {
2424
+ let r = $e(n, t.preferDDMMYYYY);
2425
+ return r === null ? e : r.toString();
2426
+ }), a = ji(a);
2427
+ let d = La(a);
2428
+ if (d) {
2429
+ let e = d.operands.map(No);
2430
+ if (e.every(Po)) return Ga(e, d.operators);
2431
+ }
2432
+ let f = Ao(a);
2433
+ if (f !== null) return f;
2434
+ if (Li(a)) return ko(Fi(a));
2435
+ if (Ii(a)) return ko(a);
2436
+ let p = a.trim();
2437
+ return p.startsWith("\"") && p.endsWith("\"") || p.startsWith("'") && p.endsWith("'") ? p.slice(1, -1) : a;
2438
+ }
2439
+ O.register({
2440
+ name: "IF",
2441
+ handler: (e, t) => {
2442
+ let n = T(t, e, 0), r = T(t, e, 1), i = T(t, e, 2), a = R(t.evaluateFormula(n)) ? r : i;
2443
+ return /^["'](.*)["']$/.test(a) ? a.slice(1, -1) : t.evaluateFormula(a);
2444
+ },
2445
+ minArgs: 3,
2446
+ maxArgs: 3,
2447
+ description: "Returns one value if a condition is true and another if false",
2448
+ examples: ["IF(A1>10, \"High\", \"Low\")", "IF(B2>=5, SUM(C1:C10), 0)"],
2449
+ category: "Logical"
2450
+ }), O.register({
2451
+ name: "AND",
2452
+ handler: (e, t) => {
2453
+ for (let n of e) if (!R(t.evaluateFormula(n.trim()))) return !1;
2454
+ return !0;
2455
+ },
2456
+ minArgs: 1,
2457
+ description: "Returns TRUE if all arguments are true",
2458
+ examples: ["AND(A1>5, B1<10)", "AND(A1>0, B1>0, C1>0)"],
2459
+ category: "Logical"
2460
+ }), O.register({
2461
+ name: "OR",
2462
+ handler: (e, t) => {
2463
+ for (let n of e) if (R(t.evaluateFormula(n.trim()))) return !0;
2464
+ return !1;
2465
+ },
2466
+ minArgs: 1,
2467
+ description: "Returns TRUE if any argument is true",
2468
+ examples: ["OR(A1>5, B1<10)", "OR(A1>0, B1>0)"],
2469
+ category: "Logical"
2470
+ }), O.register({
2471
+ name: "NOT",
2472
+ handler: (e, t) => !R(t.evaluateFormula(T(t, e, 0))),
2473
+ minArgs: 1,
2474
+ maxArgs: 1,
2475
+ description: "Reverses the logical value of its argument",
2476
+ examples: ["NOT(A1>5)", "NOT(B1)"],
2477
+ category: "Logical"
2478
+ }), O.register({
2479
+ name: "IFERROR",
2480
+ handler: (e, t) => {
2481
+ try {
2482
+ let n = t.evaluateFormula(T(t, e, 0));
2483
+ return Ie(n) ? t.evaluateFormula(T(t, e, 1)) : n;
2484
+ } catch {
2485
+ return t.evaluateFormula(T(t, e, 1));
2486
+ }
2487
+ },
2488
+ minArgs: 2,
2489
+ maxArgs: 2,
2490
+ description: "Returns a value if expression is an error, otherwise returns the expression",
2491
+ examples: ["IFERROR(A1/B1, 0)", "IFERROR(VLOOKUP(A1, B1:C10, 2), \"Not found\")"],
2492
+ category: "Logical"
2493
+ }), O.register({
2494
+ name: "IFNA",
2495
+ handler: (e, t) => {
2496
+ let n = t.evaluateFormula(T(t, e, 0)), r = b(n) && n.code === y.code;
2497
+ return n == null || r ? t.evaluateFormula(T(t, e, 1)) : n;
2498
+ },
2499
+ minArgs: 2,
2500
+ maxArgs: 2,
2501
+ description: "Returns a value if expression is #N/A, otherwise returns the expression",
2502
+ examples: ["IFNA(A1, \"N/A\")", "IFNA(MATCH(A1, B1:B10), 0)"],
2503
+ category: "Logical"
2504
+ }), O.register({
2505
+ name: "IFS",
2506
+ handler: (e, t) => {
2507
+ if (e.length < 2 || e.length % 2 != 0) throw Error("IFS requires an even number of arguments (condition-value pairs)");
2508
+ for (let n = 0; n < e.length; n += 2) {
2509
+ let r = T(t, e, n), i = T(t, e, n + 1);
2510
+ if (no(Do(r, Eo(r), (e) => ro(t.getCellValue(e))), (e) => {
2511
+ let n = Za(e);
2512
+ return typeof n == "string" && n === e.trim() ? t.evaluateFormula(e) : n;
2513
+ })) return /^["'](.*)["']$/.test(i) ? i.slice(1, -1) : t.evaluateFormula(i);
2514
+ }
2515
+ return y;
2516
+ },
2517
+ minArgs: 2,
2518
+ description: "Checks multiple conditions and returns the first true result",
2519
+ examples: ["IFS(A1>90, \"A\", A1>80, \"B\", A1>70, \"C\")", "IFS(B1=\"Yes\", 1, B1=\"No\", 0)"],
2520
+ category: "Logical"
2521
+ }), O.register({
2522
+ name: "TRUE",
2523
+ handler: () => !0,
2524
+ minArgs: 0,
2525
+ maxArgs: 0,
2526
+ description: "Returns the logical value TRUE",
2527
+ examples: ["TRUE()", "IF(A1>0, TRUE(), FALSE())"],
2528
+ category: "Logical"
2529
+ }), O.register({
2530
+ name: "FALSE",
2531
+ handler: () => !1,
2532
+ minArgs: 0,
2533
+ maxArgs: 0,
2534
+ description: "Returns the logical value FALSE",
2535
+ examples: ["FALSE()", "IF(A1>0, TRUE(), FALSE())"],
2536
+ category: "Logical"
2537
+ });
2538
+ //#endregion
2539
+ //#region src/engine/formatter.ts
2540
+ function Io(e) {
2541
+ return /[YMD]|MMM|DD|YYYY|h:mm|AM\/PM/i.test(e);
2542
+ }
2543
+ var Lo = /YYYY|YY|MMMM|MMM|MM|M|dddd|ddd|DD|D|AM\/PM|am\/pm|HH|H|hh|h|mm|ss/g;
2544
+ function Ro(e, t) {
2545
+ let n = w(e), r = n.getUTCFullYear(), i = n.getUTCMonth(), a = n.getUTCDate(), o = n.getUTCHours(), s = n.getUTCMinutes(), c = n.getUTCSeconds(), l = n.getUTCDay(), u = /AM\/PM|am\/pm/.test(t), d = o % 12 || 12, f = o >= 12, p = {
2546
+ YYYY: r.toString(),
2547
+ YY: (r % 100).toString().padStart(2, "0"),
2548
+ MMMM: Ue[i] ?? Ue[0],
2549
+ MMM: He[i] ?? He[0],
2550
+ MM: (i + 1).toString().padStart(2, "0"),
2551
+ M: (i + 1).toString(),
2552
+ dddd: Ge[l] ?? Ge[0],
2553
+ ddd: We[l] ?? We[0],
2554
+ DD: a.toString().padStart(2, "0"),
2555
+ D: a.toString(),
2556
+ "AM/PM": f ? "PM" : "AM",
2557
+ "am/pm": f ? "pm" : "am",
2558
+ HH: o.toString().padStart(2, "0"),
2559
+ H: o.toString(),
2560
+ hh: (u ? d : o).toString().padStart(2, "0"),
2561
+ h: (u ? d : o).toString(),
2562
+ mm: s.toString().padStart(2, "0"),
2563
+ ss: c.toString().padStart(2, "0")
2564
+ };
2565
+ return t.replace(Lo, (e) => p[e] ?? e);
2566
+ }
2567
+ var zo = 3, Bo = (e) => Array.from(e).reduce((t, n, r) => r > 0 && (e.length - r) % zo === 0 ? `${t},${n}` : `${t}${n}`, ""), Vo = (e) => {
2568
+ let [t, ...n] = e.split(".");
2569
+ return t === void 0 ? e : [Bo(t), ...n].join(".");
2570
+ };
2571
+ function Ho(e, t) {
2572
+ if (!t) return e.toString();
2573
+ try {
2574
+ if (Io(t)) return Ro(e, t);
2575
+ if (t.includes("$")) {
2576
+ let n = (t.match(/\.0+/) || [""])[0].length - 1, r = Math.abs(e).toFixed(n >= 0 ? n : 0), i = "$" + (t.includes(",") ? Vo(r) : r);
2577
+ return e < 0 ? "-" + i : i;
2578
+ }
2579
+ if (t.includes("%")) {
2580
+ let n = (t.match(/\.0+/) || [""])[0].length - 1;
2581
+ return (e * 100).toFixed(n >= 0 ? n : 2) + "%";
2582
+ }
2583
+ if (t.includes(",")) {
2584
+ let n = (t.match(/\.0+/) || [""])[0].length - 1, r = Vo(Math.abs(e).toFixed(n >= 0 ? n : 0));
2585
+ return e < 0 ? "-" + r : r;
2586
+ }
2587
+ let n = (t.match(/\.0+/) || [""])[0].length - 1;
2588
+ return n >= 0 ? e.toFixed(n) : e.toString();
2589
+ } catch (t) {
2590
+ return console.error("Format error:", t), e.toString();
2591
+ }
2592
+ }
2593
+ //#endregion
2594
+ //#region src/engine/textFormat.ts
2595
+ var Uo = 100, Wo = "?\\*_[]\"@;/", Go = /[#0][#0,.]*/, Ko = /[#0]/, qo = /0+$/, Jo = (e, t) => Array.from(e).filter((e) => t.includes(e)).length, Yo = (e) => Array.from(e).some((e) => Wo.includes(e)), Xo = (e) => {
2596
+ let t = Go.exec(e);
2597
+ if (!t || t[0].endsWith(",")) return null;
2598
+ let n = e.slice(0, t.index), r = e.slice(t.index + t[0].length);
2599
+ if (Ko.test(r) || Yo(n) || Yo(r)) return null;
2600
+ let [i, a = "", ...o] = t[0].split(".");
2601
+ return i === void 0 || o.length > 0 ? null : {
2602
+ prefix: n,
2603
+ suffix: r,
2604
+ useGrouping: i.includes(","),
2605
+ integerMinDigits: Jo(i, "0"),
2606
+ minDecimals: Jo(a, "0"),
2607
+ maxDecimals: Jo(a, "#0"),
2608
+ isPercent: n.includes("%") || r.includes("%")
2609
+ };
2610
+ }, Zo = (e, t) => {
2611
+ let n = e.replace(qo, "");
2612
+ return n.length >= t ? n : e.slice(0, t);
2613
+ }, Qo = (e, t) => {
2614
+ let n = e.toFixed(t.maxDecimals), r = n.indexOf("."), i = r === -1 ? n : n.slice(0, r), a = r === -1 ? "" : n.slice(r + 1), o = i.padStart(t.integerMinDigits, "0"), s = t.useGrouping ? Bo(o) : o, c = Zo(a, t.minDecimals);
2615
+ return c ? `${s}.${c}` : s;
2616
+ }, $o = (e) => Array.from(e).every((e) => e === "0" || e === "," || e === "."), es = (e, t) => {
2617
+ if (!Number.isFinite(e)) return null;
2618
+ let n = Xo(t);
2619
+ if (!n) return null;
2620
+ let r = n.isPercent ? e * Uo : e, i = Qo(Math.abs(r), n);
2621
+ return `${r < 0 && !$o(i) ? "-" : ""}${n.prefix}${i}${n.suffix}`;
2622
+ }, ts = (e) => /[\p{L}\p{M}]/u.test(e), ns = (e) => {
2623
+ let t = Array.from(e);
2624
+ return t.map((e, n) => {
2625
+ let r = t[n - 1];
2626
+ return r === void 0 || !ts(r) ? e.toUpperCase() : e.toLowerCase();
2627
+ }).join("");
2628
+ }, rs = (e) => !Number.isFinite(e) || e < 0 ? _ : Math.trunc(e), is = (e, t) => {
2629
+ let n = rs(t);
2630
+ return b(n) ? n : e.substring(0, n);
2631
+ }, as = (e, t) => {
2632
+ let n = rs(t);
2633
+ return b(n) ? n : e.substring(e.length - n);
2634
+ }, os = (e, t, n, r) => {
2635
+ let i = e.split(t);
2636
+ return r > i.length - 1 ? e : i.slice(0, r).join(t) + n + i.slice(r).join(t);
2637
+ }, ss = (e, t, n, r) => {
2638
+ if (t === "") return e;
2639
+ if (r === void 0) return e.split(t).join(n);
2640
+ let i = Math.trunc(r);
2641
+ return !Number.isFinite(i) || i <= 0 ? _ : os(e, t, n, i);
2642
+ }, cs = (e, t) => e.map((e) => A(t.evaluateFormula(e.trim()))).join(""), ls = cs, us = (e, t) => is(A(t.evaluateFormula(T(t, e, 0))), e.length === 2 ? Number(t.evaluateFormula(T(t, e, 1))) : 1), ds = (e, t) => as(A(t.evaluateFormula(T(t, e, 0))), e.length === 2 ? Number(t.evaluateFormula(T(t, e, 1))) : 1), fs = (e, t, n) => {
2643
+ let r = rs(n);
2644
+ if (b(r)) return r;
2645
+ if (!Number.isFinite(t) || t < 1) return _;
2646
+ let i = Math.trunc(t) - 1;
2647
+ return e.substring(i, i + r);
2648
+ }, ps = (e, t) => fs(A(t.evaluateFormula(T(t, e, 0))), Number(t.evaluateFormula(T(t, e, 1))), Number(t.evaluateFormula(T(t, e, 2)))), ms = (e, t) => A(t.evaluateFormula(T(t, e, 0))).length, hs = (e, t) => A(t.evaluateFormula(T(t, e, 0))).toUpperCase(), gs = (e, t) => A(t.evaluateFormula(T(t, e, 0))).toLowerCase(), _s = (e, t) => ns(A(t.evaluateFormula(T(t, e, 0)))), vs = (e, t) => A(t.evaluateFormula(T(t, e, 0))).trim().replace(/\s+/g, " "), ys = (e, t) => ss(A(t.evaluateFormula(T(t, e, 0))), A(t.evaluateFormula(T(t, e, 1))), A(t.evaluateFormula(T(t, e, 2))), e.length === 4 ? Number(t.evaluateFormula(T(t, e, 3))) : void 0), bs = (e, t) => {
2649
+ let n = A(t.evaluateFormula(T(t, e, 0))), r = Number(t.evaluateFormula(T(t, e, 1))) - 1, i = Number(t.evaluateFormula(T(t, e, 2))), a = A(t.evaluateFormula(T(t, e, 3)));
2650
+ return n.substring(0, r) + a + n.substring(r + i);
2651
+ }, xs = (e, t, n, r) => {
2652
+ let i = r.caseInsensitive ? e.toLowerCase() : e, a = (r.caseInsensitive ? t.toLowerCase() : t).indexOf(i, n);
2653
+ return a === -1 ? _ : a + 1;
2654
+ }, Ss = (e) => (t, n) => xs(A(n.evaluateFormula(T(n, t, 0))), A(n.evaluateFormula(T(n, t, 1))), t.length === 3 ? Number(n.evaluateFormula(T(n, t, 2))) - 1 : 0, { caseInsensitive: e }), Cs = Ss(!1), ws = Ss(!0), Ts = (e) => e.replace(/^["']/, "").replace(/["']$/, ""), Es = (e, t) => {
2655
+ let n = t.evaluateFormula(T(t, e, 0)), r = Ts(A(t.evaluateFormula(T(t, e, 1))));
2656
+ return typeof n == "number" ? es(n, r) ?? A(n) : A(n);
2657
+ }, Ds = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/, Os = (e) => {
2658
+ if (!Ds.test(e)) return null;
2659
+ let t = Number(e);
2660
+ return Number.isFinite(t) ? t : null;
2661
+ }, ks = (e) => {
2662
+ let t = e.replace(/[$,]/g, "").trim();
2663
+ if (t.endsWith("%")) {
2664
+ let e = Os(t.slice(0, -1).trim());
2665
+ return e === null ? _ : e / 100;
2666
+ }
2667
+ let n = Os(t);
2668
+ return n === null ? _ : n;
2669
+ };
2670
+ O.register({
2671
+ name: "CONCATENATE",
2672
+ handler: cs,
2673
+ minArgs: 1,
2674
+ description: "Joins several text strings into one string",
2675
+ examples: ["CONCATENATE(\"Hello\", \" \", \"World\")", "CONCATENATE(A1, B1)"],
2676
+ category: "Text"
2677
+ }), O.register({
2678
+ name: "CONCAT",
2679
+ handler: ls,
2680
+ minArgs: 1,
2681
+ description: "Joins several text strings into one string (same as CONCATENATE)",
2682
+ examples: ["CONCAT(\"Hello\", \" \", \"World\")", "CONCAT(A1, B1)"],
2683
+ category: "Text"
2684
+ }), O.register({
2685
+ name: "LEFT",
2686
+ handler: us,
2687
+ minArgs: 1,
2688
+ maxArgs: 2,
2689
+ description: "Returns the leftmost characters from a text string",
2690
+ examples: ["LEFT(\"Hello\", 2)", "LEFT(A1, 3)"],
2691
+ category: "Text"
2692
+ }), O.register({
2693
+ name: "RIGHT",
2694
+ handler: ds,
2695
+ minArgs: 1,
2696
+ maxArgs: 2,
2697
+ description: "Returns the rightmost characters from a text string",
2698
+ examples: ["RIGHT(\"Hello\", 2)", "RIGHT(A1, 3)"],
2699
+ category: "Text"
2700
+ }), O.register({
2701
+ name: "MID",
2702
+ handler: ps,
2703
+ minArgs: 3,
2704
+ maxArgs: 3,
2705
+ description: "Returns characters from the middle of a text string",
2706
+ examples: ["MID(\"Hello\", 2, 3)", "MID(A1, 1, 5)"],
2707
+ category: "Text"
2708
+ }), O.register({
2709
+ name: "LEN",
2710
+ handler: ms,
2711
+ minArgs: 1,
2712
+ maxArgs: 1,
2713
+ description: "Returns the number of characters in a text string",
2714
+ examples: ["LEN(\"Hello\")", "LEN(A1)"],
2715
+ category: "Text"
2716
+ }), O.register({
2717
+ name: "UPPER",
2718
+ handler: hs,
2719
+ minArgs: 1,
2720
+ maxArgs: 1,
2721
+ description: "Converts text to uppercase",
2722
+ examples: ["UPPER(\"hello\")", "UPPER(A1)"],
2723
+ category: "Text"
2724
+ }), O.register({
2725
+ name: "LOWER",
2726
+ handler: gs,
2727
+ minArgs: 1,
2728
+ maxArgs: 1,
2729
+ description: "Converts text to lowercase",
2730
+ examples: ["LOWER(\"HELLO\")", "LOWER(A1)"],
2731
+ category: "Text"
2732
+ }), O.register({
2733
+ name: "PROPER",
2734
+ handler: _s,
2735
+ minArgs: 1,
2736
+ maxArgs: 1,
2737
+ description: "Capitalizes the first letter of each word",
2738
+ examples: ["PROPER(\"hello world\")", "PROPER(A1)"],
2739
+ category: "Text"
2740
+ }), O.register({
2741
+ name: "TRIM",
2742
+ handler: vs,
2743
+ minArgs: 1,
2744
+ maxArgs: 1,
2745
+ description: "Removes extra spaces from text",
2746
+ examples: ["TRIM(\" hello world \")", "TRIM(A1)"],
2747
+ category: "Text"
2748
+ }), O.register({
2749
+ name: "SUBSTITUTE",
2750
+ handler: ys,
2751
+ minArgs: 3,
2752
+ maxArgs: 4,
2753
+ description: "Replaces old text with new text in a string",
2754
+ examples: ["SUBSTITUTE(\"Hello World\", \"World\", \"Earth\")", "SUBSTITUTE(A1, \"old\", \"new\", 1)"],
2755
+ category: "Text"
2756
+ }), O.register({
2757
+ name: "REPLACE",
2758
+ handler: bs,
2759
+ minArgs: 4,
2760
+ maxArgs: 4,
2761
+ description: "Replaces part of a text string with a different text string",
2762
+ examples: ["REPLACE(\"Hello World\", 7, 5, \"Earth\")", "REPLACE(A1, 1, 3, \"New\")"],
2763
+ category: "Text"
2764
+ }), O.register({
2765
+ name: "FIND",
2766
+ handler: Cs,
2767
+ minArgs: 2,
2768
+ maxArgs: 3,
2769
+ description: "Finds one text string within another (case-sensitive)",
2770
+ examples: ["FIND(\"o\", \"Hello\")", "FIND(\"World\", A1)"],
2771
+ category: "Text"
2772
+ }), O.register({
2773
+ name: "SEARCH",
2774
+ handler: ws,
2775
+ minArgs: 2,
2776
+ maxArgs: 3,
2777
+ description: "Finds one text string within another (case-insensitive)",
2778
+ examples: ["SEARCH(\"O\", \"Hello\")", "SEARCH(\"world\", A1)"],
2779
+ category: "Text"
2780
+ }), O.register({
2781
+ name: "TEXT",
2782
+ handler: Es,
2783
+ minArgs: 2,
2784
+ maxArgs: 2,
2785
+ description: "Formats a number and converts it to text",
2786
+ examples: ["TEXT(1234.5, \"$#,##0.00\")", "TEXT(0.5, \"0%\")"],
2787
+ category: "Text"
2788
+ }), O.register({
2789
+ name: "VALUE",
2790
+ handler: (e, t) => ks(A(t.evaluateFormula(T(t, e, 0)))),
2791
+ minArgs: 1,
2792
+ maxArgs: 1,
2793
+ description: "Converts a text string to a number",
2794
+ examples: ["VALUE(\"123\")", "VALUE(\"$1,234.56\")"],
2795
+ category: "Text"
2796
+ }), O.register({
2797
+ name: "EXACT",
2798
+ handler: (e, t) => A(t.evaluateFormula(T(t, e, 0))) === A(t.evaluateFormula(T(t, e, 1))),
2799
+ minArgs: 2,
2800
+ maxArgs: 2,
2801
+ description: "Checks if two text strings are exactly the same",
2802
+ examples: ["EXACT(\"Hello\", \"hello\")", "EXACT(A1, B1)"],
2803
+ category: "Text"
2804
+ });
2805
+ //#endregion
2806
+ //#region src/engine/financial-math.ts
2807
+ function As(e, t, n, r, i) {
2808
+ if (e === 0) return -(r + n * t);
2809
+ let a = (1 + e) ** +t;
2810
+ return -r * a - n * (a - 1) * (1 + e * i) / e;
2811
+ }
2812
+ function js(e, t, n, r, i) {
2813
+ if (e === 0) return -(r + n) / t;
2814
+ let a = (1 + e) ** +t;
2815
+ return -e * (r + n * a) / ((a - 1) * (1 + e * i));
2816
+ }
2817
+ function Ms(e, t, n, r, i, a) {
2818
+ let o = js(e, n, r, i, a);
2819
+ if (t === 1 && a === 1) return 0;
2820
+ let s = As(e, a === 1 ? t - 2 : t - 1, o, r, a) * e;
2821
+ return a === 1 ? s / (1 + e) : s;
2822
+ }
2823
+ function Ns(e, t, n, r, i, a) {
2824
+ return js(e, n, r, i, a) - Ms(e, t, n, r, i, a);
2825
+ }
2826
+ function Ps(e, t, n, r, i) {
2827
+ if (e === 0) return -(r + n * t);
2828
+ let a = (1 + e) ** +t;
2829
+ return (-r - n * (a - 1) * (1 + e * i) / e) / a;
2830
+ }
2831
+ function Fs(e, t, n, r, i) {
2832
+ if (e === 0) return -(r + n) / t;
2833
+ let a = t * (1 + e * i);
2834
+ return Math.log((a - r * e) / (a + n * e)) / Math.log(1 + e);
2835
+ }
2836
+ var Is = 100, K = 1e-7;
2837
+ function Ls(e, t, n, r, i, a) {
2838
+ let o = a;
2839
+ for (let a = 0; a < Is; a++) {
2840
+ Math.abs(o) < K && (o = K);
2841
+ let a = (1 + o) ** +e, s = n * a + t * ((a - 1) / o) * (1 + o * i) + r, c = e * n * (1 + o) ** (e - 1) + t * (1 + o * i) * (e * (1 + o) ** (e - 1) * o - (a - 1)) / (o * o) + t * i * ((a - 1) / o), l = o - s / c;
2842
+ if (Math.abs(l - o) < K) return Number.isFinite(l) ? l : v;
2843
+ o = l;
2844
+ }
2845
+ return v;
2846
+ }
2847
+ function Rs(e, t) {
2848
+ return t.reduce((t, n, r) => t + n / (1 + e) ** +(r + 1), 0);
2849
+ }
2850
+ function zs(e, t) {
2851
+ return e.reduce((e, n, r) => {
2852
+ let i = (1 + t) ** +r;
2853
+ return {
2854
+ npv: e.npv + n / i,
2855
+ dnpv: e.dnpv - r * n / (i * (1 + t))
2856
+ };
2857
+ }, {
2858
+ npv: 0,
2859
+ dnpv: 0
2860
+ });
2861
+ }
2862
+ function Bs(e, t) {
2863
+ let n = t;
2864
+ for (let t = 0; t < Is; t++) {
2865
+ let { npv: t, dnpv: r } = zs(e, n);
2866
+ if (Math.abs(t) < K) return n;
2867
+ if (Math.abs(r) < K) return v;
2868
+ let i = n - t / r;
2869
+ if (Math.abs(i - n) < K) return Number.isFinite(i) ? i : v;
2870
+ n = i;
2871
+ }
2872
+ return v;
2873
+ }
2874
+ //#endregion
2875
+ //#region src/engine/functions/financial.ts
2876
+ var q = (e, t, n, r) => {
2877
+ let i = (n) => k(t.evaluateFormula(T(t, e, n))), a = Array.from({ length: n }, (e, t) => i(t)), o = r.map((t, r) => e.length > n + r ? i(n + r) : t);
2878
+ return [...a, ...o];
2879
+ }, Vs = (e, t) => {
2880
+ let [n, r, i, a, o] = q(e, t, 3, [0, 0]);
2881
+ return As(n, r, i, a, o);
2882
+ }, Hs = (e, t) => {
2883
+ let [n, r, i, a, o] = q(e, t, 3, [0, 0]);
2884
+ return Ps(n, r, i, a, o);
2885
+ }, Us = (e, t) => {
2886
+ let [n, r, i, a, o] = q(e, t, 3, [0, 0]);
2887
+ return js(n, r, i, a, o);
2888
+ }, Ws = (e, t) => {
2889
+ let [n, r, i, a, o] = q(e, t, 3, [0, 0]);
2890
+ return Fs(n, r, i, a, o);
2891
+ }, Gs = (e, t) => {
2892
+ let [n, r, i, a, o, s] = q(e, t, 3, [
2893
+ 0,
2894
+ 0,
2895
+ .1
2896
+ ]);
2897
+ return Ls(n, r, i, a, o, s);
2898
+ }, Ks = (e) => (t, n) => {
2899
+ let [r, i, a, o, s, c] = q(t, n, 4, [0, 0]);
2900
+ return e(r, i, a, o, s, c);
2901
+ }, qs = Ks(Ms), Js = Ks(Ns), Ys = (e, t) => e.flatMap((e) => (e.includes(":") ? t.getRangeValues(e) : [t.evaluateFormula(e)]).map(k));
2902
+ O.register({
2903
+ name: "FV",
2904
+ handler: Vs,
2905
+ minArgs: 3,
2906
+ maxArgs: 5,
2907
+ description: "Calculates the future value of an investment based on periodic, constant payments and a constant interest rate",
2908
+ examples: ["FV(0.06/12, 12, -100, -1000, 1)", "FV(A1, A2, A3)"],
2909
+ category: "Financial"
2910
+ }), O.register({
2911
+ name: "PV",
2912
+ handler: Hs,
2913
+ minArgs: 3,
2914
+ maxArgs: 5,
2915
+ description: "Calculates the present value of an investment based on periodic, constant payments and a constant interest rate",
2916
+ examples: ["PV(0.08/12, 12*20, 500, 0, 0)", "PV(A1, A2, A3)"],
2917
+ category: "Financial"
2918
+ }), O.register({
2919
+ name: "PMT",
2920
+ handler: Us,
2921
+ minArgs: 3,
2922
+ maxArgs: 5,
2923
+ description: "Calculates the payment for a loan based on constant payments and a constant interest rate",
2924
+ examples: ["PMT(0.06/12, 30*12, 250000)", "PMT(A1, A2, A3)"],
2925
+ category: "Financial"
2926
+ }), O.register({
2927
+ name: "NPER",
2928
+ handler: Ws,
2929
+ minArgs: 3,
2930
+ maxArgs: 5,
2931
+ description: "Calculates the number of periods for an investment based on periodic, constant payments and a constant interest rate",
2932
+ examples: ["NPER(0.06/12, -1000, 50000, 0, 0)", "NPER(A1, A2, A3)"],
2933
+ category: "Financial"
2934
+ }), O.register({
2935
+ name: "RATE",
2936
+ handler: Gs,
2937
+ minArgs: 3,
2938
+ maxArgs: 6,
2939
+ description: "Calculates the interest rate per period of an annuity using iteration",
2940
+ examples: ["RATE(12, -100, 1000, 0, 0, 0.1)", "RATE(A1, A2, A3)"],
2941
+ category: "Financial"
2942
+ }), O.register({
2943
+ name: "IPMT",
2944
+ handler: qs,
2945
+ minArgs: 4,
2946
+ maxArgs: 6,
2947
+ description: "Calculates the interest payment for a given period for an investment",
2948
+ examples: ["IPMT(0.06/12, 1, 30*12, 250000)", "IPMT(A1, A2, A3, A4)"],
2949
+ category: "Financial"
2950
+ }), O.register({
2951
+ name: "PPMT",
2952
+ handler: Js,
2953
+ minArgs: 4,
2954
+ maxArgs: 6,
2955
+ description: "Calculates the payment on the principal for a given period for an investment",
2956
+ examples: ["PPMT(0.06/12, 1, 30*12, 250000)", "PPMT(A1, A2, A3, A4)"],
2957
+ category: "Financial"
2958
+ }), O.register({
2959
+ name: "NPV",
2960
+ handler: (e, t) => Rs(k(t.evaluateFormula(T(t, e, 0))), Ys(e.slice(1), t)),
2961
+ minArgs: 2,
2962
+ description: "Calculates the net present value of an investment based on a discount rate and a series of future cash flows",
2963
+ examples: ["NPV(0.1, -10000, 3000, 4200, 6800)", "NPV(A1, B1:B10)"],
2964
+ category: "Financial"
2965
+ }), O.register({
2966
+ name: "IRR",
2967
+ handler: (e, t) => {
2968
+ let n = t.getRangeValues(T(t, e, 0)).map(k), r = e.length === 2 ? k(t.evaluateFormula(T(t, e, 1))) : .1;
2969
+ if (n.length === 0) throw Error("IRR requires at least one value");
2970
+ return Bs(n, r);
2971
+ },
2972
+ minArgs: 1,
2973
+ maxArgs: 2,
2974
+ description: "Calculates the internal rate of return for a series of cash flows",
2975
+ examples: ["IRR(A1:A5, 0.1)", "IRR(B1:B10)"],
2976
+ category: "Financial"
2977
+ });
2978
+ //#endregion
2979
+ //#region src/engine/parser.ts
2980
+ function Xs(e) {
2981
+ let t = 0;
2982
+ for (let n = 0; n < e.length; n++) t = t * 26 + (e.charCodeAt(n) - 64);
2983
+ return t - 1;
2984
+ }
2985
+ function J(e) {
2986
+ let t = "", n = e + 1;
2987
+ for (; n > 0;) {
2988
+ let e = (n - 1) % 26;
2989
+ t = String.fromCharCode(65 + e) + t, n = Math.floor((n - 1) / 26);
2990
+ }
2991
+ return t;
2992
+ }
2993
+ //#endregion
2994
+ //#region src/engine/formulaRefs.ts
2995
+ var Zs = /\$?[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+/g, Qs = /\$?[A-Z]+\$?\d+/g;
2996
+ function $s(e) {
2997
+ return e.startsWith("=") ? e.slice(1) : e;
2998
+ }
2999
+ var ec = /^([A-Z]+)(\d+)$/;
3000
+ function tc(e) {
3001
+ let [, t, n] = e.match(ec) ?? [];
3002
+ return t === void 0 || n === void 0 ? null : {
3003
+ col: Xs(t),
3004
+ rowNumber: parseInt(n, 10)
3005
+ };
3006
+ }
3007
+ function nc(e) {
3008
+ let [t, n, ...r] = e.split(":");
3009
+ if (t === void 0 || n === void 0 || r.length > 0) return null;
3010
+ let i = tc(t), a = tc(n);
3011
+ return i && a ? {
3012
+ start: i,
3013
+ end: a
3014
+ } : null;
3015
+ }
3016
+ function rc(e) {
3017
+ let t = nc(e.replace(/\$/g, ""));
3018
+ if (!t) return [];
3019
+ let { start: n, end: r } = t, i = [];
3020
+ for (let e = n.rowNumber - 1; e <= r.rowNumber - 1; e++) for (let t = n.col; t <= r.col; t++) i.push({
3021
+ row: e,
3022
+ col: t
3023
+ });
3024
+ return i;
3025
+ }
3026
+ function ic(e) {
3027
+ let t = e.trim().toUpperCase();
3028
+ if (t.includes(":")) {
3029
+ let e = rc(t);
3030
+ return e.length > 0 ? e : null;
3031
+ }
3032
+ let n = ac(t);
3033
+ return n ? [n] : null;
3034
+ }
3035
+ function ac(e) {
3036
+ let t = tc(e.replace(/\$/g, ""));
3037
+ return t ? {
3038
+ col: t.col,
3039
+ row: t.rowNumber - 1
3040
+ } : null;
3041
+ }
3042
+ function oc(e) {
3043
+ let t = e.lastIndexOf("!"), n = t >= 0 ? e.slice(0, t + 1) : "", r = nc(t >= 0 ? e.slice(t + 1) : e);
3044
+ if (!r) return null;
3045
+ let { start: i, end: a } = r;
3046
+ return {
3047
+ sheetPrefix: n,
3048
+ startCol: i.col,
3049
+ startRow: i.rowNumber,
3050
+ endCol: a.col,
3051
+ endRow: a.rowNumber
3052
+ };
3053
+ }
3054
+ var sc = 0, cc = 1;
3055
+ function lc(e, t) {
3056
+ let n = Math.trunc(e);
3057
+ return Number.isFinite(n) ? n === sc ? t === 1 ? 0 : null : n < cc || n > t ? null : n - cc : null;
3058
+ }
3059
+ function uc(e, t, n) {
3060
+ let r = lc(t, e.endRow - e.startRow + 1), i = lc(n, e.endCol - e.startCol + 1);
3061
+ return r === null || i === null ? null : {
3062
+ colIndex: e.startCol + i,
3063
+ row: e.startRow + r
3064
+ };
3065
+ }
3066
+ function dc(e, t) {
3067
+ let n = Math.trunc(e);
3068
+ return !Number.isFinite(n) || n < cc || n > t ? null : n - cc;
3069
+ }
3070
+ function fc(e) {
3071
+ let t = $s(e), n = [], r = /* @__PURE__ */ new Set(), i = (e) => {
3072
+ let t = `${e.row},${e.col}`;
3073
+ r.has(t) || (r.add(t), n.push(e));
3074
+ };
3075
+ for (let e of t.match(Zs) ?? []) for (let t of rc(e)) i(t);
3076
+ let a = t.replace(Zs, "");
3077
+ for (let e of a.match(Qs) ?? []) {
3078
+ let t = ac(e);
3079
+ t && i(t);
3080
+ }
3081
+ return n;
3082
+ }
3083
+ //#endregion
3084
+ //#region src/engine/functions/lookup-math.ts
3085
+ function pc(e) {
3086
+ if (typeof e == "boolean") return e;
3087
+ if (typeof e == "number") return e !== 0;
3088
+ if (b(e)) return !1;
3089
+ let t = e.trim().toUpperCase();
3090
+ return t === "TRUE" || t === "1";
3091
+ }
3092
+ //#endregion
3093
+ //#region src/engine/functions/lookup.ts
3094
+ var mc = (e, t) => Array.from({ length: Math.max(0, t - e + 1) }, (t, n) => e + n), hc = (e, t, n, r, i) => mc(r, i).map((r) => e.getCellValue(`${t}${n}${r}`)), gc = (e, t, n, r, i) => mc(r, i).map((r) => e.getCellValue(`${t}${J(r)}${n}`)), _c = (e, t) => e.reduce((e, n, r) => t(n) ? r : e, -1), vc = (e, t) => {
3095
+ let n = e.findIndex((e) => !t(e));
3096
+ return (n === -1 ? e.length : n) - 1;
3097
+ }, yc = (e, t) => typeof e == "number" && typeof t == "number" ? e - t : String(e).localeCompare(String(t)), bc = (e, t, n = 1, r = 1) => {
3098
+ if (n === 0) {
3099
+ let n = typeof e == "string" && (e.includes("*") || e.includes("?")) ? mt(e) : (t) => t == e;
3100
+ return r === 1 ? t.findIndex(n) : _c(t, n);
3101
+ }
3102
+ return n === 1 ? vc(t, (t) => yc(t, e) <= 0) : n === -1 ? vc(t, (t) => yc(t, e) >= 0) : -1;
3103
+ };
3104
+ O.register({
3105
+ name: "VLOOKUP",
3106
+ handler: (e, t) => {
3107
+ let n = t.evaluateFormula(T(t, e, 0)), r = oc(T(t, e, 1));
3108
+ if (!r) throw Error("Invalid table array range");
3109
+ let i = k(t.evaluateFormula(T(t, e, 2))), a = +!!pc(e.length !== 4 || t.evaluateFormula(T(t, e, 3))), o = dc(i, r.endCol - r.startCol + 1);
3110
+ if (o === null) return ke;
3111
+ let s = J(r.startCol), c = bc(n, hc(t, r.sheetPrefix, s, r.startRow, r.endRow), a);
3112
+ if (c === -1) return y;
3113
+ let l = J(r.startCol + o), u = r.startRow + c;
3114
+ return t.getCellValue(`${r.sheetPrefix}${l}${u}`);
3115
+ },
3116
+ minArgs: 3,
3117
+ maxArgs: 4,
3118
+ description: "Looks for a value in the leftmost column of a table, and then returns a value in the same row from a column you specify",
3119
+ examples: ["VLOOKUP(105, A2:C10, 2)", "VLOOKUP(\"Smith\", A2:E10, 5, FALSE)"],
3120
+ category: "Lookup & Reference"
3121
+ }), O.register({
3122
+ name: "HLOOKUP",
3123
+ handler: (e, t) => {
3124
+ let n = t.evaluateFormula(T(t, e, 0)), r = oc(T(t, e, 1));
3125
+ if (!r) throw Error("Invalid range format");
3126
+ let i = k(t.evaluateFormula(T(t, e, 2))), a = +!!pc(e.length !== 4 || t.evaluateFormula(T(t, e, 3))), o = dc(i, r.endRow - r.startRow + 1);
3127
+ if (o === null) return ke;
3128
+ let s = bc(n, gc(t, r.sheetPrefix, r.startRow, r.startCol, r.endCol), a);
3129
+ if (s === -1) return y;
3130
+ let c = J(r.startCol + s), l = r.startRow + o;
3131
+ return t.getCellValue(`${r.sheetPrefix}${c}${l}`);
3132
+ },
3133
+ minArgs: 3,
3134
+ maxArgs: 4,
3135
+ description: "Looks for a value in the top row of a table, and then returns a value in the same column from a row you specify",
3136
+ examples: ["HLOOKUP(\"Axles\", A1:C10, 2, TRUE)"],
3137
+ category: "Lookup & Reference"
3138
+ }), O.register({
3139
+ name: "MATCH",
3140
+ handler: (e, t) => {
3141
+ let n = t.evaluateFormula(T(t, e, 0)), r = T(t, e, 1), i = e.length === 3 ? k(t.evaluateFormula(T(t, e, 2))) : 1, a = bc(n, E(t)(r), i);
3142
+ return a === -1 ? y : a + 1;
3143
+ },
3144
+ minArgs: 2,
3145
+ maxArgs: 3,
3146
+ description: "Returns the relative position of an item in an array that matches a specified value",
3147
+ examples: ["MATCH(25, A1:A10, 0)", "MATCH(\"b\", A1:A5, 0)"],
3148
+ category: "Lookup & Reference"
3149
+ }), O.register({
3150
+ name: "INDEX",
3151
+ handler: (e, t) => {
3152
+ let n = oc(T(t, e, 0));
3153
+ if (!n) throw Error("Invalid range format");
3154
+ let r = uc(n, k(t.evaluateFormula(T(t, e, 1))), e.length >= 3 ? k(t.evaluateFormula(T(t, e, 2))) : 1);
3155
+ return r ? t.getCellValue(`${n.sheetPrefix}${J(r.colIndex)}${r.row}`) : ke;
3156
+ },
3157
+ minArgs: 2,
3158
+ maxArgs: 4,
3159
+ description: "Returns the value of an element in a table or an array, selected by the row and column number indexes",
3160
+ examples: ["INDEX(A1:B5, 2, 2)", "INDEX(A1:A10, 5)"],
3161
+ category: "Lookup & Reference"
3162
+ }), O.register({
3163
+ name: "XLOOKUP",
3164
+ handler: (e, t) => {
3165
+ let n = t.evaluateFormula(T(t, e, 0)), r = T(t, e, 1), i = T(t, e, 2), a = e.length >= 4 ? t.evaluateFormula(T(t, e, 3)) : y, o = e.length >= 5 ? k(t.evaluateFormula(T(t, e, 4))) : 0, s = e.length >= 6 ? k(t.evaluateFormula(T(t, e, 5))) : 1, c = E(t), l = c(r), u = c(i), d = -1;
3166
+ if (o === 0 || o === 2) d = bc(n, l, 0, s);
3167
+ else {
3168
+ let e = Infinity;
3169
+ for (let t = 0; t < l.length; t++) {
3170
+ let r = s === 1 ? t : l.length - 1 - t, i = l[r];
3171
+ if (i == n) {
3172
+ d = r;
3173
+ break;
3174
+ }
3175
+ if (typeof i == "number" && typeof n == "number") {
3176
+ let t = i - n;
3177
+ o === -1 && t < 0 && Math.abs(t) < e ? (e = Math.abs(t), d = r) : o === 1 && t > 0 && t < e && (e = t, d = r);
3178
+ }
3179
+ }
3180
+ }
3181
+ if (d === -1) return a;
3182
+ let f = u[d];
3183
+ return f === void 0 ? y : f;
3184
+ },
3185
+ minArgs: 3,
3186
+ maxArgs: 6,
3187
+ description: "Searches a range or an array, and returns an item corresponding to the first match it finds",
3188
+ examples: ["XLOOKUP(A1, B1:B10, C1:C10)", "XLOOKUP(\"USA\", Countries, Populations)"],
3189
+ category: "Lookup & Reference"
3190
+ });
3191
+ //#endregion
3192
+ //#region src/engine/datedif.ts
3193
+ var xc = 864e5, Y = 12;
3194
+ function Sc(e, t) {
3195
+ let n = e.getUTCMonth() + t, r = e.getUTCFullYear() + Math.floor(n / Y), i = (n % Y + Y) % Y, a = new Date(Date.UTC(r, i + 1, 0)).getUTCDate(), o = Math.min(e.getUTCDate(), a);
3196
+ return new Date(Date.UTC(r, i, o));
3197
+ }
3198
+ function Cc(e, t, n) {
3199
+ if (e > t) return v;
3200
+ let r = w(e), i = w(t), a = i.getUTCFullYear() - r.getUTCFullYear(), o = i.getUTCMonth() - r.getUTCMonth(), s = i.getUTCDate() - r.getUTCDate();
3201
+ switch (n.toUpperCase()) {
3202
+ case "Y": {
3203
+ let e = a;
3204
+ return o < 0 || o === 0 && s < 0 ? e - 1 : e;
3205
+ }
3206
+ case "M": {
3207
+ let e = a * Y + o;
3208
+ return s < 0 ? e - 1 : e;
3209
+ }
3210
+ case "D": return Math.floor(t - e);
3211
+ case "MD": {
3212
+ let e = Sc(r, a * Y + o - +(s < 0)), t = Date.UTC(i.getUTCFullYear(), i.getUTCMonth(), i.getUTCDate());
3213
+ return Math.round((t - e.getTime()) / xc);
3214
+ }
3215
+ case "YM": {
3216
+ let e = s < 0 ? o - 1 : o;
3217
+ return e < 0 ? e + Y : e;
3218
+ }
3219
+ case "YD": {
3220
+ let e = new Date(r);
3221
+ return e.setUTCFullYear(i.getUTCFullYear()), e.getTime() - i.getTime() > 0 && e.setUTCFullYear(i.getUTCFullYear() - 1), Math.floor((i.getTime() - e.getTime()) / xc);
3222
+ }
3223
+ default: return v;
3224
+ }
3225
+ }
3226
+ O.register({
3227
+ name: "NOW",
3228
+ handler: () => {
3229
+ let e = /* @__PURE__ */ new Date();
3230
+ return C(new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds())));
3231
+ },
3232
+ minArgs: 0,
3233
+ maxArgs: 0,
3234
+ description: "Returns the serial number of the current date and time",
3235
+ examples: ["NOW()"],
3236
+ category: "Date & Time"
3237
+ }), O.register({
3238
+ name: "TODAY",
3239
+ handler: () => {
3240
+ let e = /* @__PURE__ */ new Date();
3241
+ return C(new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate())));
3242
+ },
3243
+ minArgs: 0,
3244
+ maxArgs: 0,
3245
+ description: "Returns the serial number of today's date",
3246
+ examples: ["TODAY()"],
3247
+ category: "Date & Time"
3248
+ }), O.register({
3249
+ name: "DATE",
3250
+ handler: (e, t) => {
3251
+ let n = k(t.evaluateFormula(T(t, e, 0))), r = k(t.evaluateFormula(T(t, e, 1))), i = k(t.evaluateFormula(T(t, e, 2)));
3252
+ return C(new Date(Date.UTC(n, r - 1, i)));
3253
+ },
3254
+ minArgs: 3,
3255
+ maxArgs: 3,
3256
+ description: "Returns the serial number that represents a particular date",
3257
+ examples: ["DATE(2023, 11, 25)"],
3258
+ category: "Date & Time"
3259
+ }), O.register({
3260
+ name: "TIME",
3261
+ handler: (e, t) => {
3262
+ let n = k(t.evaluateFormula(T(t, e, 0))), r = k(t.evaluateFormula(T(t, e, 1))), i = k(t.evaluateFormula(T(t, e, 2))), a = n * 3600 + r * 60 + i, o = 86400;
3263
+ return a % o / o;
3264
+ },
3265
+ minArgs: 3,
3266
+ maxArgs: 3,
3267
+ description: "Returns the serial number of a particular time",
3268
+ examples: ["TIME(14, 30, 0)"],
3269
+ category: "Date & Time"
3270
+ }), O.register({
3271
+ name: "YEAR",
3272
+ handler: (e, t) => w(k(t.evaluateFormula(T(t, e, 0)))).getUTCFullYear(),
3273
+ minArgs: 1,
3274
+ maxArgs: 1,
3275
+ description: "Converts a serial number to a year",
3276
+ examples: ["YEAR(TODAY())", "YEAR(A1)"],
3277
+ category: "Date & Time"
3278
+ }), O.register({
3279
+ name: "MONTH",
3280
+ handler: (e, t) => w(k(t.evaluateFormula(T(t, e, 0)))).getUTCMonth() + 1,
3281
+ minArgs: 1,
3282
+ maxArgs: 1,
3283
+ description: "Converts a serial number to a month",
3284
+ examples: ["MONTH(TODAY())", "MONTH(A1)"],
3285
+ category: "Date & Time"
3286
+ }), O.register({
3287
+ name: "DAY",
3288
+ handler: (e, t) => w(k(t.evaluateFormula(T(t, e, 0)))).getUTCDate(),
3289
+ minArgs: 1,
3290
+ maxArgs: 1,
3291
+ description: "Converts a serial number to a day of the month",
3292
+ examples: ["DAY(TODAY())", "DAY(A1)"],
3293
+ category: "Date & Time"
3294
+ }), O.register({
3295
+ name: "HOUR",
3296
+ handler: (e, t) => {
3297
+ let n = k(t.evaluateFormula(T(t, e, 0))), r = n - Math.floor(n), i = Math.round(r * 86400);
3298
+ return Math.floor(i / 3600);
3299
+ },
3300
+ minArgs: 1,
3301
+ maxArgs: 1,
3302
+ description: "Converts a serial number to an hour",
3303
+ examples: ["HOUR(NOW())", "HOUR(A1)"],
3304
+ category: "Date & Time"
3305
+ }), O.register({
3306
+ name: "MINUTE",
3307
+ handler: (e, t) => {
3308
+ let n = k(t.evaluateFormula(T(t, e, 0))), r = n - Math.floor(n), i = Math.round(r * 86400);
3309
+ return Math.floor(i % 3600 / 60);
3310
+ },
3311
+ minArgs: 1,
3312
+ maxArgs: 1,
3313
+ description: "Converts a serial number to a minute",
3314
+ examples: ["MINUTE(NOW())", "MINUTE(A1)"],
3315
+ category: "Date & Time"
3316
+ }), O.register({
3317
+ name: "SECOND",
3318
+ handler: (e, t) => {
3319
+ let n = k(t.evaluateFormula(T(t, e, 0))), r = n - Math.floor(n);
3320
+ return Math.round(r * 86400) % 60;
3321
+ },
3322
+ minArgs: 1,
3323
+ maxArgs: 1,
3324
+ description: "Converts a serial number to a second",
3325
+ examples: ["SECOND(NOW())", "SECOND(A1)"],
3326
+ category: "Date & Time"
3327
+ }), O.register({
3328
+ name: "DATEDIF",
3329
+ handler: (e, t) => Cc(k(t.evaluateFormula(T(t, e, 0))), k(t.evaluateFormula(T(t, e, 1))), A(t.evaluateFormula(T(t, e, 2)))),
3330
+ minArgs: 3,
3331
+ maxArgs: 3,
3332
+ description: "Calculates the number of days, months, or years between two dates",
3333
+ examples: ["DATEDIF(A1, B1, \"Y\")", "DATEDIF(DATE(2020,1,1), TODAY(), \"D\")"],
3334
+ category: "Date & Time"
3335
+ });
3336
+ //#endregion
3337
+ //#region src/engine/date-calendar.ts
3338
+ var X = 7, wc = 5, Tc = 0, Ec = 6, Dc = Ec, Z = (e) => Math.floor(e), Q = (e) => Number.isFinite(e) && e >= 0 && e <= 2958465, Oc = (e) => ((Z(e) + Dc) % X + X) % X, kc = {
3339
+ 1: 0,
3340
+ 2: 1,
3341
+ 11: 1,
3342
+ 12: 2,
3343
+ 13: 3,
3344
+ 14: 4,
3345
+ 15: 5,
3346
+ 16: 6,
3347
+ 17: 0
3348
+ }, Ac = 3;
3349
+ function jc(e, t = 1) {
3350
+ if (!Q(e)) return v;
3351
+ let n = Oc(e);
3352
+ if (t === Ac) return (n + X - 1) % X;
3353
+ let r = kc[t];
3354
+ return r === void 0 ? v : (n - r + X) % X + 1;
3355
+ }
3356
+ function Mc(e, t) {
3357
+ return !Q(e) || !Q(t) ? v : Z(e) - Z(t);
3358
+ }
3359
+ var Nc = (e, t) => new Date(Date.UTC(e, t + 1, 0)).getUTCDate(), Pc = (e) => Q(e) ? e : v;
3360
+ function Fc(e, t) {
3361
+ if (!Q(e) || !Number.isFinite(t)) return v;
3362
+ let n = w(Z(e)), r = n.getUTCFullYear(), i = n.getUTCMonth() + Math.trunc(t), a = Math.min(n.getUTCDate(), Nc(r, i));
3363
+ return Pc(C(new Date(Date.UTC(r, i, a))));
3364
+ }
3365
+ function Ic(e, t) {
3366
+ if (!Q(e) || !Number.isFinite(t)) return v;
3367
+ let n = w(Z(e));
3368
+ return Pc(C(new Date(Date.UTC(n.getUTCFullYear(), n.getUTCMonth() + Math.trunc(t) + 1, 0))));
3369
+ }
3370
+ var Lc = (e) => {
3371
+ let t = Oc(e);
3372
+ return t !== Tc && t !== Ec;
3373
+ }, Rc = (e) => new Set(e.map(Z));
3374
+ function zc(e, t, n = []) {
3375
+ if (!Q(e) || !Number.isFinite(t)) return v;
3376
+ let r = Rc(n), i = Math.sign(t), a = {
3377
+ date: Z(e),
3378
+ left: Math.abs(Math.trunc(t))
3379
+ };
3380
+ for (; a.left > 0;) {
3381
+ if (a.date += i, !Q(a.date)) return v;
3382
+ Lc(a.date) && !r.has(a.date) && --a.left;
3383
+ }
3384
+ return a.date;
3385
+ }
3386
+ function Bc(e, t) {
3387
+ let n = t - e + 1, r = Math.floor(n / X), i = Array.from({ length: n % X }, (t, n) => e + r * X + n);
3388
+ return r * wc + i.filter(Lc).length;
3389
+ }
3390
+ function Vc(e, t, n = []) {
3391
+ if (!Q(e) || !Q(t)) return v;
3392
+ let [r, i] = [Z(e), Z(t)], [a, o] = r <= i ? [r, i] : [i, r], s = [...Rc(n)].filter((e) => e >= a && e <= o && Lc(e)).length, c = Bc(a, o) - s;
3393
+ return r <= i ? c : -c;
3394
+ }
3395
+ //#endregion
3396
+ //#region src/engine/functions/calendar.ts
3397
+ var $ = (e, t, n) => S(t.evaluateFormula(T(t, e, n))), Hc = (e) => e.find(b) ?? e.filter((e) => typeof e == "number");
3398
+ function Uc(e, t, n) {
3399
+ if (e.length <= n) return [];
3400
+ let r = E(t)(T(t, e, n));
3401
+ return r.length === 0 ? Hc([$(e, t, n)]) : r.find(b) ?? r.filter(x).map(k);
3402
+ }
3403
+ var Wc = (e, t) => {
3404
+ let n = Hc([$(e, t, 0), e.length > 1 ? $(e, t, 1) : 1]);
3405
+ if (b(n)) return n;
3406
+ let [r = 0, i = 1] = n;
3407
+ return jc(r, i);
3408
+ }, Gc = (e) => (t, n) => {
3409
+ let r = Hc([$(t, n, 0), $(t, n, 1)]);
3410
+ if (b(r)) return r;
3411
+ let [i = 0, a = 0] = r;
3412
+ return e(i, a);
3413
+ }, Kc = (e) => (t, n) => {
3414
+ let r = Hc([$(t, n, 0), $(t, n, 1)]);
3415
+ if (b(r)) return r;
3416
+ let i = Uc(t, n, 2);
3417
+ if (b(i)) return i;
3418
+ let [a = 0, o = 0] = r;
3419
+ return e(a, o, i);
3420
+ };
3421
+ //#endregion
3422
+ //#region src/engine/functions/aliases.ts
3423
+ [
3424
+ {
3425
+ name: "WEEKDAY",
3426
+ handler: Wc,
3427
+ minArgs: 1,
3428
+ maxArgs: 2,
3429
+ description: "Returns the day of the week (1 = Sunday by default)",
3430
+ examples: ["WEEKDAY(A2)", "WEEKDAY(A2, 2)"]
3431
+ },
3432
+ {
3433
+ name: "DAYS",
3434
+ handler: Gc(Mc),
3435
+ minArgs: 2,
3436
+ maxArgs: 2,
3437
+ description: "Returns the number of days between two dates",
3438
+ examples: ["DAYS(B2, A2)"]
3439
+ },
3440
+ {
3441
+ name: "EDATE",
3442
+ handler: Gc(Fc),
3443
+ minArgs: 2,
3444
+ maxArgs: 2,
3445
+ description: "Returns the date a number of months before or after a date",
3446
+ examples: ["EDATE(A2, 1)"]
3447
+ },
3448
+ {
3449
+ name: "EOMONTH",
3450
+ handler: Gc(Ic),
3451
+ minArgs: 2,
3452
+ maxArgs: 2,
3453
+ description: "Returns the last day of the month a number of months away",
3454
+ examples: ["EOMONTH(A2, 0)"]
3455
+ },
3456
+ {
3457
+ name: "WORKDAY",
3458
+ handler: Kc(zc),
3459
+ minArgs: 2,
3460
+ maxArgs: 3,
3461
+ description: "Returns the date a number of working days away, skipping weekends and holidays",
3462
+ examples: ["WORKDAY(A2, 10)", "WORKDAY(A2, 10, H2:H5)"]
3463
+ },
3464
+ {
3465
+ name: "NETWORKDAYS",
3466
+ handler: Kc(Vc),
3467
+ minArgs: 2,
3468
+ maxArgs: 3,
3469
+ description: "Returns the number of working days between two dates, both included",
3470
+ examples: ["NETWORKDAYS(A2, B2)", "NETWORKDAYS(A2, B2, H2:H5)"]
3471
+ }
3472
+ ].forEach((e) => O.register({
3473
+ ...e,
3474
+ category: "Date & Time"
3475
+ })), Object.entries({
3476
+ "PERCENTILE.INC": "PERCENTILE",
3477
+ "QUARTILE.INC": "QUARTILE",
3478
+ "STDEV.S": "STDEV",
3479
+ "STDEV.P": "STDEVP",
3480
+ "VAR.S": "VAR",
3481
+ "VAR.P": "VARP",
3482
+ "RANK.EQ": "RANK",
3483
+ TTEST: "T.TEST",
3484
+ PERCENTRANK: "PERCENTRANK.INC",
3485
+ FORECAST: "FORECAST.LINEAR",
3486
+ PEARSON: "CORREL"
3487
+ }).forEach(([e, t]) => {
3488
+ let n = O.get(t);
3489
+ if (!n) throw Error(`alias ${e} names ${t}, which is not registered`);
3490
+ O.register({
3491
+ ...n,
3492
+ name: e,
3493
+ description: `Same as ${t}`,
3494
+ examples: []
3495
+ });
3496
+ });
3497
+ //#endregion
3498
+ //#region src/engine/customFunctionSpecs.ts
3499
+ var qc = RegExp(`^${st}$`, "i"), Jc = /^[A-Za-z_$][\w$]*$/, Yc = 32, Xc = (e) => typeof e == "object" && !!e && !Array.isArray(e), Zc = (e) => Array.isArray(e) && e.every((e) => typeof e == "string"), Qc = (e) => Xc(e) && typeof e.name == "string" && typeof e.body == "string" && Zc(e.params) && (e.description === void 0 || typeof e.description == "string");
3500
+ function $c(e) {
3501
+ return Array.isArray(e) ? e.filter(Qc) : [];
3502
+ }
3503
+ function el(e, t) {
3504
+ if (!qc.test(e.name)) return "a name is letters and digits, parts joined by dots (MOVING.AVG)";
3505
+ if (t(e.name)) return `${e.name.toUpperCase()} is a built-in function`;
3506
+ if (e.params.length > Yc) return `at most ${Yc} parameters`;
3507
+ let n = e.params.find((e) => !Jc.test(e));
3508
+ return n === void 0 ? new Set(e.params).size === e.params.length ? null : "a parameter is named twice" : `"${n}" is not a parameter name`;
3509
+ }
3510
+ function tl(e, t) {
3511
+ let n = /* @__PURE__ */ new Map(), r = [];
3512
+ return e.forEach((e) => {
3513
+ let i = e.name.toUpperCase(), a = n.has(i) ? `${i} is defined twice` : el(e, t);
3514
+ a ? r.push({
3515
+ name: e.name,
3516
+ reason: a
3517
+ }) : n.set(i, e);
3518
+ }), {
3519
+ usable: n,
3520
+ problems: r
3521
+ };
3522
+ }
3523
+ var nl = (e) => `Function(${[...e.params, `"use strict";\n${e.body}`].map((e) => JSON.stringify(e)).join(", ")})`, rl = 50, il = 2e3, al = 16777216, ol = 1048576, sl = 1e5, cl = "(fn, args) => fn(...JSON.parse(args))", ll = "(?:(?:'[^']+'|[^!'\"(),]+)!)?", ul = RegExp(`^${ll}\\$?[A-Z]+\\$?\\d+:\\$?[A-Z]+\\$?\\d+$`, "i"), dl = RegExp(`^${ll}\\$?[A-Z]+\\$?\\d+$`, "i"), fl = RegExp(`^${ll}(?:\\$?[A-Z]+:\\$?[A-Z]+|\\$?\\d+:\\$?\\d+)$`, "i"), pl = null, ml = () => pl ??= import("@jitl/quickjs-singlefile-mjs-release-sync").then((e) => n(e.default)), hl = () => void 0, gl = {
3524
+ definitions: /* @__PURE__ */ new Map(),
3525
+ problems: [],
3526
+ startCalculation: hl,
3527
+ dispose: hl
3528
+ };
3529
+ function _l(e, t) {
3530
+ return e.startCalculation(), O.withOverlay(e.definitions, t);
3531
+ }
3532
+ async function vl(e) {
3533
+ let { usable: t, problems: n } = tl(e.flatMap((e) => $c(e.functions)), (e) => O.isBuiltIn(e));
3534
+ return t.size === 0 ? {
3535
+ ...gl,
3536
+ problems: n
3537
+ } : yl(await ml(), t, n);
3538
+ }
3539
+ function yl(e, t, n) {
3540
+ let r = e.newRuntime();
3541
+ r.setMemoryLimit(al), r.setMaxStackSize(ol);
3542
+ let i = { calculationStart: Date.now() }, a = [], o = /* @__PURE__ */ new Map();
3543
+ return t.forEach((e, t) => {
3544
+ let s = r.newContext(), c = [];
3545
+ a.push({
3546
+ vm: s,
3547
+ handles: c
3548
+ });
3549
+ let l = Cl(r, Date.now() + rl, () => {
3550
+ let t = s.evalCode(nl(e));
3551
+ return t.error ? { error: bl(s, t.error) || "it stopped while loading" } : { fn: t.value };
3552
+ });
3553
+ if ("error" in l) {
3554
+ n.push({
3555
+ name: e.name,
3556
+ reason: `does not compile: ${l.error}`
3557
+ });
3558
+ return;
3559
+ }
3560
+ let u = s.unwrapResult(s.evalCode(cl));
3561
+ c.push(l.fn, u);
3562
+ let d = {
3563
+ vm: s,
3564
+ runtime: r,
3565
+ caller: u,
3566
+ fn: l.fn
3567
+ };
3568
+ o.set(t, El(e, (e) => xl(d, e, i.calculationStart)));
3569
+ }), {
3570
+ definitions: o,
3571
+ problems: n,
3572
+ startCalculation: () => i.calculationStart = Date.now(),
3573
+ dispose: () => {
3574
+ a.forEach(({ vm: e, handles: t }) => {
3575
+ t.forEach((e) => e.dispose()), e.dispose();
3576
+ }), r.dispose();
3577
+ }
3578
+ };
3579
+ }
3580
+ function bl(e, t) {
3581
+ try {
3582
+ let n = e.getProp(t, "message"), r = e.typeof(n) === "string" ? e.getString(n) : "";
3583
+ return n.dispose(), r;
3584
+ } catch {
3585
+ return "";
3586
+ } finally {
3587
+ t.dispose();
3588
+ }
3589
+ }
3590
+ function xl({ vm: e, runtime: t, caller: n, fn: r }, i, a) {
3591
+ let o = Math.min(Date.now() + rl, a + il);
3592
+ return Date.now() >= o ? v : Cl(t, o, () => {
3593
+ let t = e.newString(i), a = e.callFunction(n, e.undefined, r, t);
3594
+ if (t.dispose(), a.error) return bl(e, a.error) === Sl ? v : _;
3595
+ let o = wl(e, a.value);
3596
+ return a.value.dispose(), o;
3597
+ });
3598
+ }
3599
+ var Sl = "interrupted";
3600
+ function Cl(e, t, n) {
3601
+ e.setInterruptHandler(r(t));
3602
+ try {
3603
+ return n();
3604
+ } finally {
3605
+ e.removeInterruptHandler();
3606
+ }
3607
+ }
3608
+ function wl(e, t) {
3609
+ let n = e.typeof(t);
3610
+ return n === "number" ? Tl(e.getNumber(t)) : n === "string" ? e.getString(t) : n === "boolean" ? Tl(e.dump(t)) : _;
3611
+ }
3612
+ function Tl(e) {
3613
+ return typeof e == "number" ? Number.isFinite(e) ? e : v : typeof e == "string" || typeof e == "boolean" ? e : _;
3614
+ }
3615
+ function El(e, t) {
3616
+ let n = e.description ?? `Defined in this workbook (${e.params.join(", ")})`;
3617
+ return {
3618
+ name: e.name.toUpperCase(),
3619
+ minArgs: e.params.length,
3620
+ maxArgs: e.params.length,
3621
+ description: n,
3622
+ category: "Workbook",
3623
+ handler: (e, n) => {
3624
+ let r = e.map((e) => Ol(e.trim(), n));
3625
+ return r.find(b) ?? t(JSON.stringify(r));
3626
+ }
3627
+ };
3628
+ }
3629
+ var Dl = (e) => b(e) ? e : e === "" ? null : e;
3630
+ function Ol(e, t) {
3631
+ return fl.test(e) ? _ : ul.test(e) ? Al(e, t) : dl.test(e) ? Dl(kl(t)(e)[0] ?? "") : Dl(t.evaluateFormula(e));
3632
+ }
3633
+ var kl = (e) => e.getRangeValuesKeepingBlanks ?? e.getRangeValuesRaw ?? e.getRangeValues;
3634
+ function Al(e, t) {
3635
+ let n = e.lastIndexOf("!"), r = n >= 0 ? e.slice(0, n + 1) : "", i = ic(e.slice(n + 1)) ?? [];
3636
+ if (i.length > sl) return _;
3637
+ let a = kl(t), o = /* @__PURE__ */ new Map();
3638
+ for (let { row: e, col: t } of i) {
3639
+ let n = Dl(a(`${r}${J(t)}${e + 1}`)[0] ?? "");
3640
+ if (b(n)) return n;
3641
+ o.set(e, [...o.get(e) ?? [], n]);
3642
+ }
3643
+ return Array.from(o.values());
3644
+ }
3645
+ //#endregion
3646
+ //#region src/core/plugin.ts
3647
+ function jl(e) {
3648
+ if (typeof e != "string") return e;
3649
+ try {
3650
+ let t = JSON.parse(e);
3651
+ return console.warn("Sheets was provided as a string and has been parsed to an array"), t;
3652
+ } catch (e) {
3653
+ throw Error(`Invalid sheets format: sheets must be an array, not a string. Parse error: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
3654
+ }
3655
+ }
3656
+ function Ml(e) {
3657
+ if (!Array.isArray(e) || e.length === 0) throw Error("At least one sheet is required. Sheets must be an array of sheet objects.");
3658
+ e.forEach((e) => {
3659
+ if (!e.name || !e.data || e.data.length === 0) throw Error(`Invalid sheet: ${e.name || "unnamed"}. Each sheet must have a name and data array.`);
3660
+ });
3661
+ }
3662
+ async function Nl(e) {
3663
+ let t = await vl(e);
3664
+ return t.dispose(), t.problems.length === 0 ? "" : ` These functions could not be used and calls to them show #NAME?: ${t.problems.map(({ name: e, reason: t }) => `${e} (${t})`).join("; ")}.`;
3665
+ }
3666
+ var Pl = async (e, t) => {
3667
+ let { title: n } = t, r = jl(t.sheets);
3668
+ Ml(r);
3669
+ let i = "Acknowledge that the spreadsheet has been created and is displayed to the user.", a = await Nl(r), o = ve(e);
3670
+ if (!o) return {
3671
+ message: `Created spreadsheet: ${n}${a}`,
3672
+ title: n,
3673
+ data: { sheets: r },
3674
+ instructions: i
3675
+ };
3676
+ let { relPath: s, filePath: c } = re();
3677
+ return await o.write(s, JSON.stringify(r)), {
3678
+ message: `Created spreadsheet: ${n}. Saved to ${c}; the user can edit cells there, so read that file for the current values.${a}`,
3679
+ title: n,
3680
+ data: { sheets: c },
3681
+ instructions: i
3682
+ };
3683
+ };
3684
+ async function Fl(e, t) {
3685
+ if (!("kind" in t)) return Pl(e, t);
3686
+ let n = ve(e);
3687
+ if (!n) throw Error("This host does not provide files.artifacts, so spreadsheets cannot be loaded or saved");
3688
+ if (!ge(t)) throw Error("Invalid spreadsheet dispatch");
3689
+ return Ee(n, t);
3690
+ }
3691
+ var Il = {
3692
+ toolDefinition: a,
3693
+ execute: Fl,
3694
+ generatingMessage: "Creating spreadsheet...",
3695
+ waitingMessage: "Tell the user that the spreadsheet was created and will be presented shortly.",
3696
+ isEnabled: () => !0,
3697
+ systemPrompt: o
3698
+ };
3699
+ //#endregion
3700
+ //#region src/engine/cellEmpty.ts
3701
+ function Ll(e) {
3702
+ if (e == null) return !0;
3703
+ if (typeof e == "string") return e.trim() === "";
3704
+ if (c(e)) {
3705
+ if (!("v" in e)) return !0;
3706
+ let t = e.v;
3707
+ return t == null || typeof t == "string" && t.trim() === "";
3708
+ }
3709
+ return !1;
3710
+ }
3711
+ function Rl(e) {
3712
+ return !b(e) && Ll(e);
3713
+ }
3714
+ //#endregion
3715
+ //#region src/engine/cellFormatting.ts
3716
+ var zl = 36e3, Bl = 63499, Vl = (e) => s(e) && "v" in e, Hl = (e) => typeof e == "number" && Number.isInteger(e) && e >= zl && e <= Bl, Ul = (e, t, n, r) => {
3717
+ if (b(t)) return t.code;
3718
+ if (!Vl(e) || typeof t != "number") return t;
3719
+ let i = typeof e.f == "string" ? e.f : "";
3720
+ return i ? Ho(t, i) : typeof e.v == "string" && e.v.startsWith("=") && r && Hl(t) ? Ho(t, n ? "DD/MM/YYYY" : "MM/DD/YYYY") : t;
3721
+ }, Wl = /* @__PURE__ */ new Set([
3722
+ "DATE",
3723
+ "TODAY",
3724
+ "EDATE",
3725
+ "EOMONTH",
3726
+ "WORKDAY"
3727
+ ]), Gl = /^[\s(+-]*([A-Z][A-Z0-9]*(?:\.[A-Z0-9]+)*)\s*\(/i;
3728
+ function Kl(e) {
3729
+ let t = Gl.exec(e)?.[1];
3730
+ return t === void 0 ? null : t.toUpperCase();
3731
+ }
3732
+ function ql(e, t, n, r = /* @__PURE__ */ new Set()) {
3733
+ let i = e.replace(/^=/, ""), a = Kl(i);
3734
+ if (a !== null && Wl.has(a)) return !0;
3735
+ let o = Eo(i)[0]?.ref, s = o === void 0 ? null : n(o, t);
3736
+ if (s === null || o === void 0) return !1;
3737
+ if (Io(s.format)) return !0;
3738
+ let c = `${s.sheet}!${o.replace(/^.*!/, "").replace(/\$/g, "").toUpperCase()}`;
3739
+ return s.formula === null || r.has(c) ? !1 : ql(s.formula, s.sheet, n, /* @__PURE__ */ new Set([...r, c]));
3740
+ }
3741
+ //#endregion
3742
+ //#region src/engine/calculator.ts
3743
+ function Jl(e) {
3744
+ return (t, n) => {
3745
+ let [, r, i, a] = /^(?:'([^']+)'|([^!]+))!(.+)$/.exec(t) ?? [
3746
+ void 0,
3747
+ void 0,
3748
+ void 0,
3749
+ t
3750
+ ], o = r ?? i ?? n, s = a === void 0 ? null : ac(a), l = s ? e.find((e) => e.name === o)?.data[s.row]?.[s.col] : void 0;
3751
+ if (!c(l)) return null;
3752
+ let u = typeof l.v == "string" && l.v.startsWith("=") ? l.v : null;
3753
+ return {
3754
+ format: typeof l.f == "string" ? l.f : "",
3755
+ formula: u,
3756
+ sheet: o
3757
+ };
3758
+ };
3759
+ }
3760
+ function Yl(e) {
3761
+ if (!e || !Array.isArray(e) || e.length === 0) return [];
3762
+ if (Array.isArray(e[0])) return e;
3763
+ if (c(e[0])) {
3764
+ let t = [];
3765
+ for (let n = 0; n < e.length; n += 2) {
3766
+ let r = [e[n]];
3767
+ n + 1 < e.length && r.push(e[n + 1]), t.push(r);
3768
+ }
3769
+ return t;
3770
+ }
3771
+ return console.warn("Unknown data structure in spreadsheet, returning empty:", e), [];
3772
+ }
3773
+ function Xl(e, t) {
3774
+ return e.map((e) => e.map((e) => {
3775
+ if (!c(e) || !("v" in e)) return e;
3776
+ let n = e.v;
3777
+ if (typeof n == "string" && !n.startsWith("=")) {
3778
+ let r = $e(n, t);
3779
+ if (r !== null) return {
3780
+ v: r,
3781
+ f: e.f || at(n, t)
3782
+ };
3783
+ }
3784
+ return e;
3785
+ }));
3786
+ }
3787
+ var Zl = /^(?:'([^']+)'|([^!]+))!(.+)$/;
3788
+ function Ql(e, t, n = {}) {
3789
+ let r = n.preferDDMMYYYY ?? !1, i = n.skipFormatting ?? !1, a = Xl(Yl(e.data), r), o = t?.map((e) => ({
3790
+ ...e,
3791
+ data: Xl(Yl(e.data), r)
3792
+ })), l = a, d = e.name, f = /* @__PURE__ */ new Map(), p = [], ee = [], te = l.map((e) => [...e]);
3793
+ f.set(d, te);
3794
+ let ne = /* @__PURE__ */ new Set(), re = /* @__PURE__ */ new Set(), ie = (e, { cells: t, row: n, col: r }) => {
3795
+ let i = `${n},${r}`;
3796
+ if (ne.has(i)) return p.push({
3797
+ cell: {
3798
+ row: n,
3799
+ col: r
3800
+ },
3801
+ formula: e,
3802
+ error: "Circular reference detected",
3803
+ type: "circular"
3804
+ }), 0;
3805
+ if (re.has(i)) return t[r];
3806
+ ne.add(i);
3807
+ try {
3808
+ let n = me(e.substring(1));
3809
+ return t[r] = n, n;
3810
+ } catch (i) {
3811
+ let { type: a, display: o } = _o(i);
3812
+ p.push({
3813
+ cell: {
3814
+ row: n,
3815
+ col: r
3816
+ },
3817
+ formula: e,
3818
+ error: u(i),
3819
+ type: a
3820
+ });
3821
+ let s = Me(o);
3822
+ return t[r] = s, s;
3823
+ } finally {
3824
+ ne.delete(i), re.add(i);
3825
+ }
3826
+ }, ae = (e, t) => {
3827
+ if (e == null) return 0;
3828
+ if (b(e) || typeof e == "number") return e;
3829
+ if (typeof e == "string") {
3830
+ if (e.trim() === "") return 0;
3831
+ if (e.includes("%")) {
3832
+ let t = e.replace("%", "").trim(), n = parseFloat(t);
3833
+ return isNaN(n) ? 0 : n / 100;
3834
+ }
3835
+ if (e.includes("$")) {
3836
+ let t = e.replace(/[$,]/g, "").trim(), n = parseFloat(t);
3837
+ return isNaN(n) ? 0 : n;
3838
+ }
3839
+ if (e.includes(",")) {
3840
+ let t = e.replace(/,/g, "").trim(), n = parseFloat(t);
3841
+ return isNaN(n) ? 0 : n;
3842
+ }
3843
+ let t = parseFloat(e);
3844
+ return isNaN(t) ? e : t;
3845
+ }
3846
+ if (c(e) && "v" in e) {
3847
+ let n = e.v;
3848
+ if (typeof n == "string" && n.startsWith("=")) return t ? ie(n, t) : 0;
3849
+ if (typeof n == "number" || typeof n == "boolean") return n;
3850
+ if (typeof n == "string") {
3851
+ let e = parseFloat(n);
3852
+ return isNaN(e) ? n : e;
3853
+ }
3854
+ return String(n);
3855
+ }
3856
+ let n = parseFloat(e);
3857
+ return isNaN(n) ? e : n;
3858
+ }, m = (e) => {
3859
+ let t = e.match(Zl);
3860
+ if (!t) return {
3861
+ sheetData: te,
3862
+ ref: e,
3863
+ isCurrentSheet: !0
3864
+ };
3865
+ let [, n, i, a] = t, s = n ?? i;
3866
+ if (s === void 0 || a === void 0) return null;
3867
+ let c = f.get(s);
3868
+ if (c) return {
3869
+ sheetData: c,
3870
+ ref: a,
3871
+ isCurrentSheet: !1
3872
+ };
3873
+ let l = o?.find((e) => e.name === s);
3874
+ if (!l || !l.data) return null;
3875
+ let u = l.data.map((e) => [...e]);
3876
+ f.set(s, u);
3877
+ let d = Ql(l, o, {
3878
+ preferDDMMYYYY: r,
3879
+ skipFormatting: !0
3880
+ });
3881
+ return f.set(s, d.data), {
3882
+ sheetData: d.data,
3883
+ ref: a,
3884
+ isCurrentSheet: !1
3885
+ };
3886
+ }, oe = (e) => {
3887
+ let t = m(e);
3888
+ if (!t) throw po(e);
3889
+ let { sheetData: n, ref: r, isCurrentSheet: i } = t, a = ac(r);
3890
+ if (!a) return null;
3891
+ let { row: o, col: s } = a, c = o >= 0 ? n[o] : void 0;
3892
+ return !c || s < 0 || s >= c.length ? null : {
3893
+ cell: c[s],
3894
+ position: i ? {
3895
+ cells: c,
3896
+ row: o,
3897
+ col: s
3898
+ } : void 0
3899
+ };
3900
+ }, se = (e) => {
3901
+ let t = oe(e);
3902
+ return t ? ae(t.cell, t.position) : 0;
3903
+ }, ce = (e) => {
3904
+ let t = oe(e);
3905
+ if (t === null) return !0;
3906
+ let { cell: n, position: r } = t, i = s(n) ? n.v : void 0;
3907
+ return Rl(typeof i == "string" && i.startsWith("=") ? ae(n, r) : n);
3908
+ }, le = (e, t) => {
3909
+ let n = m(e);
3910
+ if (!n) return [];
3911
+ let { sheetData: r, ref: i, isCurrentSheet: a } = n, o = ic(i);
3912
+ if (!o) return [];
3913
+ let s = [];
3914
+ for (let { row: e, col: n } of o) {
3915
+ let i = e >= 0 ? r[e] : void 0;
3916
+ if (i && n >= 0 && n < i.length) {
3917
+ let r = i[n], o = ae(r, a ? {
3918
+ cells: i,
3919
+ row: e,
3920
+ col: n
3921
+ } : void 0);
3922
+ if (t.numericOnly) !Ll(r) && ze(o) && s.push(o);
3923
+ else {
3924
+ let e = Ll(r) && !b(r);
3925
+ s.push(t.keepBlanks && e ? "" : o);
3926
+ }
3927
+ }
3928
+ }
3929
+ return s;
3930
+ }, ue = (e) => le(e, { numericOnly: !0 }), de = (e) => le(e, { numericOnly: !1 }), fe = (e) => le(e, {
3931
+ numericOnly: !1,
3932
+ keepBlanks: !0
3933
+ }), pe = (e) => {
3934
+ let t = m(e), n = t ? ic(t.ref) : null;
3935
+ if (!t || !n) return 0;
3936
+ let r = e.match(Zl), i = r ? r[1] ?? r[2] : d, a = i === d ? l : o?.find((e) => e.name === i)?.data;
3937
+ return a ? n.filter(({ row: e, col: t }) => {
3938
+ let n = a[e]?.[t];
3939
+ return n !== void 0 && !Ll(n);
3940
+ }).length : 0;
3941
+ }, me = (e) => Fo(e, {
3942
+ getCellValue: se,
3943
+ getRangeValues: ue,
3944
+ getRangeValuesRaw: de,
3945
+ getRangeValuesKeepingBlanks: fe,
3946
+ countFilledCells: pe,
3947
+ evaluateFormula: me,
3948
+ preferDDMMYYYY: r,
3949
+ isCellEmpty: ce
3950
+ }), he = (e, t) => {
3951
+ if (!c(e) || !("v" in e)) return;
3952
+ let n = e.v;
3953
+ if (typeof n != "string" || !n.startsWith("=")) {
3954
+ t.cells[t.col] = n;
3955
+ return;
3956
+ }
3957
+ let r = {
3958
+ cell: {
3959
+ row: t.row,
3960
+ col: t.col
3961
+ },
3962
+ formula: n,
3963
+ dependencies: [],
3964
+ result: 0
3965
+ };
3966
+ ee.push(r), r.result = ie(n, t), t.cells[t.col] = r.result;
3967
+ }, ge = (e) => {
3968
+ l.forEach((t, n) => {
3969
+ let r = te[n];
3970
+ r && t.forEach((t, i) => e(t, {
3971
+ cells: r,
3972
+ row: n,
3973
+ col: i
3974
+ }));
3975
+ });
3976
+ };
3977
+ if (ge((e, t) => {
3978
+ typeof t.cells[t.col] == "number" && c(e) && "f" in e || he(e, t);
3979
+ }), !i) {
3980
+ let e = Jl([{
3981
+ name: d,
3982
+ data: l
3983
+ }, ...(o ?? []).filter((e) => e.name !== d)]);
3984
+ ge((t, { cells: n, col: i }) => {
3985
+ let a = c(t) && typeof t.v == "string" ? t.v : "", o = a.startsWith("=") && ql(a, d, e);
3986
+ n[i] = Ul(t, n[i], r, o);
3987
+ });
3988
+ }
3989
+ return {
3990
+ name: d,
3991
+ data: te,
3992
+ formulas: ee,
3993
+ errors: p
3994
+ };
3995
+ }
3996
+ function $l(e, t = {}) {
3997
+ return e.map((n) => Ql(n, e, t));
3998
+ }
3999
+ //#endregion
4000
+ //#region src/engine/cellBuilder.ts
4001
+ var eu = RegExp(`^[-+]?\\s*(${st})\\s*\\(`, "i"), tu = (e) => {
4002
+ let t = e.match(eu)?.[1];
4003
+ return t !== void 0 && ct(t);
4004
+ }, nu = /[A-Z]+\d+\s*[+\-*/^]/, ru = /\d+\s*[+\-*/^]\s*\d+/, iu = /^[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
4005
+ function au(e) {
4006
+ return tu(e) || nu.test(e) || ru.test(e);
4007
+ }
4008
+ function ou(e) {
4009
+ let t = e.trim();
4010
+ return t === "" ? "" : au(t) ? `=${t}` : iu.test(t) ? Number(t) : t;
4011
+ }
4012
+ function su(e) {
4013
+ if (e.type === "string") return { v: String(e.value) };
4014
+ let t = { v: ou(e.formula ?? "") };
4015
+ return e.format && e.format.length > 0 && (t.f = e.format), t;
4016
+ }
4017
+ //#endregion
4018
+ //#region src/engine/engine.ts
4019
+ var cu = class {
4020
+ options;
4021
+ constructor(e = {}) {
4022
+ this.options = {
4023
+ maxIterations: e.maxIterations ?? 100,
4024
+ enableCrossSheetRefs: e.enableCrossSheetRefs ?? !0,
4025
+ strictMode: e.strictMode ?? !1,
4026
+ preferDDMMYYYY: e.preferDDMMYYYY ?? !1
4027
+ };
4028
+ }
4029
+ calculate(e, t) {
4030
+ return Ql(e, t, { preferDDMMYYYY: this.options.preferDDMMYYYY });
4031
+ }
4032
+ calculateWorkbook(e) {
4033
+ return $l(e, { preferDDMMYYYY: this.options.preferDDMMYYYY });
4034
+ }
4035
+ getOptions() {
4036
+ return { ...this.options };
4037
+ }
4038
+ setOptions(e) {
4039
+ this.options = {
4040
+ ...this.options,
4041
+ ...e
4042
+ };
4043
+ }
4044
+ createSheet(e, t) {
4045
+ return {
4046
+ name: e,
4047
+ data: t.map((e) => e.map((e) => c(e) && "v" in e ? e : { v: e }))
4048
+ };
4049
+ }
4050
+ toStringArray(e) {
4051
+ return e.data.map((e) => e.map((e) => String(e ?? "")));
4052
+ }
4053
+ }, lu = [
4054
+ {
4055
+ name: "Simple Budget",
4056
+ args: {
4057
+ title: "Monthly Budget",
4058
+ sheets: [{
4059
+ name: "Budget",
4060
+ data: [
4061
+ [{ v: "Category" }, { v: "Amount" }],
4062
+ [{ v: "Income" }, {
4063
+ v: 5e3,
4064
+ f: "$#,##0.00"
4065
+ }],
4066
+ [{ v: "Rent" }, {
4067
+ v: -1500,
4068
+ f: "$#,##0.00"
4069
+ }],
4070
+ [{ v: "Utilities" }, {
4071
+ v: -200,
4072
+ f: "$#,##0.00"
4073
+ }],
4074
+ [{ v: "Food" }, {
4075
+ v: -600,
4076
+ f: "$#,##0.00"
4077
+ }],
4078
+ [{ v: "Transport" }, {
4079
+ v: -300,
4080
+ f: "$#,##0.00"
4081
+ }],
4082
+ [{ v: "Total" }, {
4083
+ v: "=SUM(B2:B6)",
4084
+ f: "$#,##0.00"
4085
+ }]
4086
+ ]
4087
+ }]
4088
+ }
4089
+ },
4090
+ {
4091
+ name: "Sales Report",
4092
+ args: {
4093
+ title: "Q1 Sales Report",
4094
+ sheets: [{
4095
+ name: "Sales",
4096
+ data: [
4097
+ [
4098
+ { v: "Product" },
4099
+ { v: "Jan" },
4100
+ { v: "Feb" },
4101
+ { v: "Mar" },
4102
+ { v: "Total" }
4103
+ ],
4104
+ [
4105
+ { v: "Widget A" },
4106
+ { v: 1200 },
4107
+ { v: 1350 },
4108
+ { v: 1500 },
4109
+ { v: "=SUM(B2:D2)" }
4110
+ ],
4111
+ [
4112
+ { v: "Widget B" },
4113
+ { v: 800 },
4114
+ { v: 920 },
4115
+ { v: 1100 },
4116
+ { v: "=SUM(B3:D3)" }
4117
+ ],
4118
+ [
4119
+ { v: "Widget C" },
4120
+ { v: 450 },
4121
+ { v: 480 },
4122
+ { v: 520 },
4123
+ { v: "=SUM(B4:D4)" }
4124
+ ],
4125
+ [
4126
+ { v: "Total" },
4127
+ { v: "=SUM(B2:B4)" },
4128
+ { v: "=SUM(C2:C4)" },
4129
+ { v: "=SUM(D2:D4)" },
4130
+ { v: "=SUM(E2:E4)" }
4131
+ ]
4132
+ ]
4133
+ }]
4134
+ }
4135
+ },
4136
+ {
4137
+ name: "Loan Calculator",
4138
+ args: {
4139
+ title: "Loan Calculator",
4140
+ sheets: [{
4141
+ name: "Calculator",
4142
+ data: [
4143
+ [{ v: "Loan Amount" }, {
4144
+ v: 25e4,
4145
+ f: "$#,##0"
4146
+ }],
4147
+ [{ v: "Interest Rate" }, {
4148
+ v: .065,
4149
+ f: "0.00%"
4150
+ }],
4151
+ [{ v: "Term (Years)" }, { v: 30 }],
4152
+ [{ v: "" }, { v: "" }],
4153
+ [{ v: "Monthly Payment" }, {
4154
+ v: "=PMT(B2/12, B3*12, -B1)",
4155
+ f: "$#,##0.00"
4156
+ }],
4157
+ [{ v: "Total Interest" }, {
4158
+ v: "=B5*B3*12-B1",
4159
+ f: "$#,##0.00"
4160
+ }]
4161
+ ]
4162
+ }]
4163
+ }
4164
+ },
4165
+ {
4166
+ name: "World Population",
4167
+ args: {
4168
+ title: "世界人口(上位10)",
4169
+ sheets: [{
4170
+ name: "世界人口(上位10)",
4171
+ data: [
4172
+ [
4173
+ { v: "順位" },
4174
+ { v: "国・地域" },
4175
+ {
4176
+ v: "人口(概数)",
4177
+ f: "#,##0"
4178
+ },
4179
+ { v: "上位10合計に占める割合" },
4180
+ { v: "世界人口に占める割合" }
4181
+ ],
4182
+ [
4183
+ {
4184
+ v: 1,
4185
+ f: "#,##0"
4186
+ },
4187
+ { v: "インド" },
4188
+ {
4189
+ v: 1428627e3,
4190
+ f: "#,##0"
4191
+ },
4192
+ {
4193
+ v: "=C2/$C$12",
4194
+ f: "0.00%"
4195
+ },
4196
+ {
4197
+ v: "=C2/$C$13",
4198
+ f: "0.00%"
4199
+ }
4200
+ ],
4201
+ [
4202
+ {
4203
+ v: 2,
4204
+ f: "#,##0"
4205
+ },
4206
+ { v: "中国" },
4207
+ {
4208
+ v: 1425671e3,
4209
+ f: "#,##0"
4210
+ },
4211
+ {
4212
+ v: "=C3/$C$12",
4213
+ f: "0.00%"
4214
+ },
4215
+ {
4216
+ v: "=C3/$C$13",
4217
+ f: "0.00%"
4218
+ }
4219
+ ],
4220
+ [
4221
+ {
4222
+ v: 3,
4223
+ f: "#,##0"
4224
+ },
4225
+ { v: "アメリカ合衆国" },
4226
+ {
4227
+ v: 334e6,
4228
+ f: "#,##0"
4229
+ },
4230
+ {
4231
+ v: "=C4/$C$12",
4232
+ f: "0.00%"
4233
+ },
4234
+ {
4235
+ v: "=C4/$C$13",
4236
+ f: "0.00%"
4237
+ }
4238
+ ],
4239
+ [
4240
+ {
4241
+ v: 4,
4242
+ f: "#,##0"
4243
+ },
4244
+ { v: "インドネシア" },
4245
+ {
4246
+ v: 277e6,
4247
+ f: "#,##0"
4248
+ },
4249
+ {
4250
+ v: "=C5/$C$12",
4251
+ f: "0.00%"
4252
+ },
4253
+ {
4254
+ v: "=C5/$C$13",
4255
+ f: "0.00%"
4256
+ }
4257
+ ],
4258
+ [
4259
+ {
4260
+ v: 5,
4261
+ f: "#,##0"
4262
+ },
4263
+ { v: "パキスタン" },
4264
+ {
4265
+ v: 24e7,
4266
+ f: "#,##0"
4267
+ },
4268
+ {
4269
+ v: "=C6/$C$12",
4270
+ f: "0.00%"
4271
+ },
4272
+ {
4273
+ v: "=C6/$C$13",
4274
+ f: "0.00%"
4275
+ }
4276
+ ],
4277
+ [
4278
+ {
4279
+ v: 6,
4280
+ f: "#,##0"
4281
+ },
4282
+ { v: "ナイジェリア" },
4283
+ {
4284
+ v: 219e6,
4285
+ f: "#,##0"
4286
+ },
4287
+ {
4288
+ v: "=C7/$C$12",
4289
+ f: "0.00%"
4290
+ },
4291
+ {
4292
+ v: "=C7/$C$13",
4293
+ f: "0.00%"
4294
+ }
4295
+ ],
4296
+ [
4297
+ {
4298
+ v: 7,
4299
+ f: "#,##0"
4300
+ },
4301
+ { v: "ブラジル" },
4302
+ {
4303
+ v: 216e6,
4304
+ f: "#,##0"
4305
+ },
4306
+ {
4307
+ v: "=C8/$C$12",
4308
+ f: "0.00%"
4309
+ },
4310
+ {
4311
+ v: "=C8/$C$13",
4312
+ f: "0.00%"
4313
+ }
4314
+ ],
4315
+ [
4316
+ {
4317
+ v: 8,
4318
+ f: "#,##0"
4319
+ },
4320
+ { v: "バングラデシュ" },
4321
+ {
4322
+ v: 172e6,
4323
+ f: "#,##0"
4324
+ },
4325
+ {
4326
+ v: "=C9/$C$12",
4327
+ f: "0.00%"
4328
+ },
4329
+ {
4330
+ v: "=C9/$C$13",
4331
+ f: "0.00%"
4332
+ }
4333
+ ],
4334
+ [
4335
+ {
4336
+ v: 9,
4337
+ f: "#,##0"
4338
+ },
4339
+ { v: "ロシア" },
4340
+ {
4341
+ v: 146e6,
4342
+ f: "#,##0"
4343
+ },
4344
+ {
4345
+ v: "=C10/$C$12",
4346
+ f: "0.00%"
4347
+ },
4348
+ {
4349
+ v: "=C10/$C$13",
4350
+ f: "0.00%"
4351
+ }
4352
+ ],
4353
+ [
4354
+ {
4355
+ v: 10,
4356
+ f: "#,##0"
4357
+ },
4358
+ { v: "メキシコ" },
4359
+ {
4360
+ v: 13e7,
4361
+ f: "#,##0"
4362
+ },
4363
+ {
4364
+ v: "=C11/$C$12",
4365
+ f: "0.00%"
4366
+ },
4367
+ {
4368
+ v: "=C11/$C$13",
4369
+ f: "0.00%"
4370
+ }
4371
+ ],
4372
+ [
4373
+ { v: "" },
4374
+ { v: "合計(上位10)" },
4375
+ {
4376
+ v: "=SUM(C2:C11)",
4377
+ f: "#,##0"
4378
+ },
4379
+ { v: "" },
4380
+ { v: "" }
4381
+ ],
4382
+ [
4383
+ { v: "" },
4384
+ { v: "世界推定人口(例)" },
4385
+ {
4386
+ v: 805e7,
4387
+ f: "#,##0"
4388
+ },
4389
+ { v: "" },
4390
+ { v: "" }
4391
+ ]
4392
+ ]
4393
+ }]
4394
+ }
4395
+ }
4396
+ ];
4397
+ //#endregion
4398
+ export { s as C, i as E, c as S, a as T, ge as _, Yl as a, m as b, gl as c, fc as d, oc as f, Ee as g, U as h, Ql as i, _l as l, J as m, cu as n, Pl as o, ac as p, su as r, Il as s, lu as t, vl as u, ue as v, o as w, u as x, ae as y };