overtake 1.3.2 → 2.0.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 (56) hide show
  1. package/README.md +12 -15
  2. package/bin/overtake.js +1 -1
  3. package/build/executor.d.ts +8 -3
  4. package/build/index.d.ts +10 -11
  5. package/build/reporter.d.ts +10 -2
  6. package/build/runner.d.ts +1 -1
  7. package/build/types.d.ts +7 -7
  8. package/build/utils.d.ts +3 -17
  9. package/package.json +8 -26
  10. package/src/__tests__/assert-no-closure.ts +135 -0
  11. package/src/__tests__/benchmark-execute.ts +48 -0
  12. package/src/cli.ts +139 -144
  13. package/src/executor.ts +59 -24
  14. package/src/index.ts +135 -68
  15. package/src/reporter.ts +77 -125
  16. package/src/runner.ts +28 -25
  17. package/src/types.ts +9 -9
  18. package/src/utils.ts +62 -46
  19. package/src/worker.ts +13 -12
  20. package/tsconfig.json +3 -1
  21. package/build/cli.cjs +0 -179
  22. package/build/cli.cjs.map +0 -1
  23. package/build/cli.js +0 -134
  24. package/build/cli.js.map +0 -1
  25. package/build/executor.cjs +0 -116
  26. package/build/executor.cjs.map +0 -1
  27. package/build/executor.js +0 -106
  28. package/build/executor.js.map +0 -1
  29. package/build/gc-watcher.cjs +0 -30
  30. package/build/gc-watcher.cjs.map +0 -1
  31. package/build/gc-watcher.js +0 -20
  32. package/build/gc-watcher.js.map +0 -1
  33. package/build/index.cjs +0 -400
  34. package/build/index.cjs.map +0 -1
  35. package/build/index.js +0 -335
  36. package/build/index.js.map +0 -1
  37. package/build/reporter.cjs +0 -364
  38. package/build/reporter.cjs.map +0 -1
  39. package/build/reporter.js +0 -346
  40. package/build/reporter.js.map +0 -1
  41. package/build/runner.cjs +0 -528
  42. package/build/runner.cjs.map +0 -1
  43. package/build/runner.js +0 -518
  44. package/build/runner.js.map +0 -1
  45. package/build/types.cjs +0 -66
  46. package/build/types.cjs.map +0 -1
  47. package/build/types.js +0 -33
  48. package/build/types.js.map +0 -1
  49. package/build/utils.cjs +0 -121
  50. package/build/utils.cjs.map +0 -1
  51. package/build/utils.js +0 -85
  52. package/build/utils.js.map +0 -1
  53. package/build/worker.cjs +0 -158
  54. package/build/worker.cjs.map +0 -1
  55. package/build/worker.js +0 -113
  56. package/build/worker.js.map +0 -1
@@ -1,364 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get Report () {
13
- return Report;
14
- },
15
- get createReport () {
16
- return createReport;
17
- }
18
- });
19
- const _utilscjs = require("./utils.cjs");
20
- const _typescjs = require("./types.cjs");
21
- const units = [
22
- {
23
- unit: 'ns',
24
- factor: 1
25
- },
26
- {
27
- unit: 'µs',
28
- factor: 1e3
29
- },
30
- {
31
- unit: 'ms',
32
- factor: 1e6
33
- },
34
- {
35
- unit: 's',
36
- factor: 1e9
37
- },
38
- {
39
- unit: 'm',
40
- factor: 60 * 1e9
41
- },
42
- {
43
- unit: 'h',
44
- factor: 3600 * 1e9
45
- }
46
- ];
47
- function smartFixed(n) {
48
- return n.toLocaleString(undefined, {
49
- minimumFractionDigits: 0,
50
- maximumFractionDigits: 2,
51
- useGrouping: true
52
- });
53
- }
54
- class Report {
55
- type;
56
- value;
57
- uncertainty;
58
- scale;
59
- constructor(type, value, uncertainty = 0, scale = 1n){
60
- this.type = type;
61
- this.value = value;
62
- this.uncertainty = uncertainty;
63
- this.scale = scale;
64
- }
65
- valueOf() {
66
- return Number((0, _utilscjs.div)(this.value, this.scale));
67
- }
68
- toString() {
69
- const uncertainty = this.uncertainty ? ` ± ${smartFixed(this.uncertainty)}%` : '';
70
- const value = this.valueOf();
71
- if (this.type === 'ops') {
72
- return `${smartFixed(value)} ops/s${uncertainty}`;
73
- }
74
- if (this.type === 'rme') {
75
- return `${smartFixed(value)}%`;
76
- }
77
- if (this.type === 'variance') {
78
- let display = value;
79
- let unit = 'ns²';
80
- const varianceUnits = [
81
- {
82
- unit: 'ns²',
83
- factor: 1
84
- },
85
- {
86
- unit: 'µs²',
87
- factor: 1e6
88
- },
89
- {
90
- unit: 'ms²',
91
- factor: 1e12
92
- }
93
- ];
94
- for (const { unit: u, factor } of varianceUnits){
95
- const candidate = value / factor;
96
- if (candidate < 1000) {
97
- display = candidate;
98
- unit = u;
99
- break;
100
- }
101
- }
102
- return `${smartFixed(display)} ${unit}`;
103
- }
104
- let display = value;
105
- let unit = 'ns';
106
- for (const { unit: u, factor } of units){
107
- const candidate = value / factor;
108
- if (candidate < 1000) {
109
- display = candidate;
110
- unit = u;
111
- break;
112
- }
113
- }
114
- return `${smartFixed(display)} ${unit}${uncertainty}`;
115
- }
116
- }
117
- const createReport = (durations, type)=>{
118
- const n = durations.length;
119
- if (n === 0) {
120
- return new Report(type, 0n);
121
- }
122
- switch(type){
123
- case 'min':
124
- {
125
- return new Report(type, durations[0], 0, _typescjs.DURATION_SCALE);
126
- }
127
- case 'max':
128
- {
129
- return new Report(type, durations[n - 1], 0, _typescjs.DURATION_SCALE);
130
- }
131
- case 'median':
132
- {
133
- const mid = Math.floor(n / 2);
134
- const med = n % 2 === 0 ? (durations[mid - 1] + durations[mid]) / 2n : durations[mid];
135
- return new Report(type, med, 0, _typescjs.DURATION_SCALE);
136
- }
137
- case 'mode':
138
- {
139
- const freq = new Map();
140
- let maxCount = 0n;
141
- let modeVal = durations[0];
142
- for (const d of durations){
143
- const count = (freq.get(d) || 0n) + 1n;
144
- freq.set(d, count);
145
- if (count > maxCount) {
146
- maxCount = count;
147
- modeVal = d;
148
- }
149
- }
150
- let lower = modeVal;
151
- let upper = modeVal;
152
- const firstIdx = durations.indexOf(modeVal);
153
- const lastIdx = durations.lastIndexOf(modeVal);
154
- if (firstIdx > 0) lower = durations[firstIdx - 1];
155
- if (lastIdx < n - 1) upper = durations[lastIdx + 1];
156
- const gap = (0, _utilscjs.max)(modeVal - lower, upper - modeVal);
157
- const uncertainty = modeVal > 0 ? Number(gap / 2n * 100n / modeVal) : 0;
158
- return new Report(type, modeVal, uncertainty, _typescjs.DURATION_SCALE);
159
- }
160
- case 'ops':
161
- {
162
- let sum = 0n;
163
- for (const duration of durations){
164
- sum += duration;
165
- }
166
- const avgScaled = sum / BigInt(n);
167
- const nsPerSecScaled = 1_000_000_000n * _typescjs.DURATION_SCALE;
168
- const raw = Number(nsPerSecScaled) / Number(avgScaled);
169
- const extra = raw < 1 ? Math.ceil(-Math.log10(raw)) : 0;
170
- const exp = raw > 100 ? 0 : 2 + extra;
171
- const scale = 10n ** BigInt(exp);
172
- const value = avgScaled > 0n ? nsPerSecScaled * scale / avgScaled : 0n;
173
- const deviation = durations[n - 1] - durations[0];
174
- const uncertainty = avgScaled > 0 ? Number((0, _utilscjs.div)(deviation * scale, 2n * avgScaled)) : 0;
175
- return new Report(type, value, uncertainty, scale);
176
- }
177
- case 'mean':
178
- {
179
- let sum = 0n;
180
- for (const duration of durations){
181
- sum += duration;
182
- }
183
- const value = (0, _utilscjs.divs)(sum, BigInt(n), 1n);
184
- return new Report(type, value, 0, _typescjs.DURATION_SCALE);
185
- }
186
- case 'variance':
187
- {
188
- if (n < 2) return new Report(type, 0n, 0, _typescjs.DURATION_SCALE * _typescjs.DURATION_SCALE);
189
- let sum = 0n;
190
- for (const duration of durations){
191
- sum += duration;
192
- }
193
- const mean = sum / BigInt(n);
194
- let sumSquaredDiff = 0n;
195
- for (const duration of durations){
196
- const diff = duration - mean;
197
- sumSquaredDiff += diff * diff;
198
- }
199
- const variance = sumSquaredDiff / BigInt(n - 1);
200
- return new Report(type, variance, 0, _typescjs.DURATION_SCALE * _typescjs.DURATION_SCALE);
201
- }
202
- case 'sd':
203
- {
204
- if (n < 2) return new Report(type, 0n, 0, _typescjs.DURATION_SCALE);
205
- let sum = 0n;
206
- for (const duration of durations){
207
- sum += duration;
208
- }
209
- const mean = sum / BigInt(n);
210
- let sumSquaredDiff = 0n;
211
- for (const duration of durations){
212
- const diff = duration - mean;
213
- sumSquaredDiff += diff * diff;
214
- }
215
- const variance = Number(sumSquaredDiff) / (n - 1);
216
- const sd = Math.sqrt(variance);
217
- const sdScaled = BigInt(Math.round(sd));
218
- return new Report(type, sdScaled, 0, _typescjs.DURATION_SCALE);
219
- }
220
- case 'sem':
221
- {
222
- if (n < 2) return new Report(type, 0n, 0, _typescjs.DURATION_SCALE);
223
- let sum = 0n;
224
- for (const duration of durations){
225
- sum += duration;
226
- }
227
- const mean = sum / BigInt(n);
228
- let sumSquaredDiff = 0n;
229
- for (const duration of durations){
230
- const diff = duration - mean;
231
- sumSquaredDiff += diff * diff;
232
- }
233
- const variance = Number(sumSquaredDiff) / (n - 1);
234
- const sd = Math.sqrt(variance);
235
- const sem = sd / Math.sqrt(n);
236
- const semScaled = BigInt(Math.round(sem));
237
- return new Report(type, semScaled, 0, _typescjs.DURATION_SCALE);
238
- }
239
- case 'moe':
240
- {
241
- if (n < 2) return new Report(type, 0n, 0, _typescjs.DURATION_SCALE);
242
- let sum = 0n;
243
- for (const duration of durations){
244
- sum += duration;
245
- }
246
- const mean = sum / BigInt(n);
247
- let sumSquaredDiff = 0n;
248
- for (const duration of durations){
249
- const diff = duration - mean;
250
- sumSquaredDiff += diff * diff;
251
- }
252
- const variance = Number(sumSquaredDiff) / (n - 1);
253
- const sd = Math.sqrt(variance);
254
- const sem = sd / Math.sqrt(n);
255
- const moe = _typescjs.Z95 * sem;
256
- const moeScaled = BigInt(Math.round(moe));
257
- return new Report(type, moeScaled, 0, _typescjs.DURATION_SCALE);
258
- }
259
- case 'rme':
260
- {
261
- if (n < 2) return new Report(type, 0n);
262
- let sum = 0n;
263
- for (const duration of durations){
264
- sum += duration;
265
- }
266
- const mean = Number(sum) / n;
267
- if (mean === 0) return new Report(type, 0n);
268
- let sumSquaredDiff = 0;
269
- for (const duration of durations){
270
- const diff = Number(duration) - mean;
271
- sumSquaredDiff += diff * diff;
272
- }
273
- const variance = sumSquaredDiff / (n - 1);
274
- const sd = Math.sqrt(variance);
275
- const sem = sd / Math.sqrt(n);
276
- const moe = _typescjs.Z95 * sem;
277
- const rme = moe / mean * 100;
278
- const rmeScaled = BigInt(Math.round(rme * 100));
279
- return new Report(type, rmeScaled, 0, 100n);
280
- }
281
- case 'mad':
282
- {
283
- const medianIdx = Math.floor(n / 2);
284
- const median = n % 2 === 1 ? durations[medianIdx] : (durations[medianIdx - 1] + durations[medianIdx]) / 2n;
285
- const deviations = new BigUint64Array(n);
286
- for(let i = 0; i < n; i++){
287
- const diff = durations[i] > median ? durations[i] - median : median - durations[i];
288
- deviations[i] = diff;
289
- }
290
- deviations.sort();
291
- const madIdx = Math.floor(n / 2);
292
- const mad = n % 2 === 1 ? deviations[madIdx] : (deviations[madIdx - 1] + deviations[madIdx]) / 2n;
293
- return new Report(type, mad, 0, _typescjs.DURATION_SCALE);
294
- }
295
- case 'iqr':
296
- {
297
- const q1Idx = Math.floor(n * 0.25);
298
- const q3Idx = Math.floor(n * 0.75);
299
- const q1 = durations[q1Idx];
300
- const q3 = durations[q3Idx];
301
- const iqr = q3 - q1;
302
- return new Report(type, iqr, 0, _typescjs.DURATION_SCALE);
303
- }
304
- case 'ci_lower':
305
- {
306
- if (n < 2) return new Report(type, 0n, 0, _typescjs.DURATION_SCALE);
307
- let sum = 0n;
308
- for (const duration of durations){
309
- sum += duration;
310
- }
311
- const mean = Number(sum) / n;
312
- let sumSquaredDiff = 0;
313
- for (const duration of durations){
314
- const diff = Number(duration) - mean;
315
- sumSquaredDiff += diff * diff;
316
- }
317
- const variance = sumSquaredDiff / (n - 1);
318
- const sd = Math.sqrt(variance);
319
- const sem = sd / Math.sqrt(n);
320
- const moe = _typescjs.Z95 * sem;
321
- const ciLower = Math.max(0, mean - moe);
322
- return new Report(type, BigInt(Math.round(ciLower)), 0, _typescjs.DURATION_SCALE);
323
- }
324
- case 'ci_upper':
325
- {
326
- if (n < 2) return new Report(type, 0n, 0, _typescjs.DURATION_SCALE);
327
- let sum = 0n;
328
- for (const duration of durations){
329
- sum += duration;
330
- }
331
- const mean = Number(sum) / n;
332
- let sumSquaredDiff = 0;
333
- for (const duration of durations){
334
- const diff = Number(duration) - mean;
335
- sumSquaredDiff += diff * diff;
336
- }
337
- const variance = sumSquaredDiff / (n - 1);
338
- const sd = Math.sqrt(variance);
339
- const sem = sd / Math.sqrt(n);
340
- const moe = _typescjs.Z95 * sem;
341
- const ciUpper = mean + moe;
342
- return new Report(type, BigInt(Math.round(ciUpper)), 0, _typescjs.DURATION_SCALE);
343
- }
344
- default:
345
- {
346
- const p = Number(type.slice(1));
347
- if (p === 0) {
348
- return new Report(type, durations[0], 0, _typescjs.DURATION_SCALE);
349
- }
350
- if (p === 100) {
351
- return new Report(type, durations[n - 1], 0, _typescjs.DURATION_SCALE);
352
- }
353
- const idx = Math.ceil(p / 100 * n) - 1;
354
- const value = durations[Math.min(Math.max(idx, 0), n - 1)];
355
- const prev = idx > 0 ? durations[idx - 1] : value;
356
- const next = idx < n - 1 ? durations[idx + 1] : value;
357
- const gap = (0, _utilscjs.max)(value - prev, next - value);
358
- const uncertainty = value > 0 ? Number((0, _utilscjs.div)((0, _utilscjs.divs)(gap, 2n, 100_00n), value)) / 100 : 0;
359
- return new Report(type, value, uncertainty, _typescjs.DURATION_SCALE);
360
- }
361
- }
362
- };
363
-
364
- //# sourceMappingURL=reporter.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/reporter.ts"],"sourcesContent":["import { div, max, divs } from './utils.js';\nimport { ReportType, DURATION_SCALE, Z95 } from './types.js';\n\nconst units = [\n { unit: 'ns', factor: 1 },\n { unit: 'µs', factor: 1e3 },\n { unit: 'ms', factor: 1e6 },\n { unit: 's', factor: 1e9 },\n { unit: 'm', factor: 60 * 1e9 },\n { unit: 'h', factor: 3600 * 1e9 },\n] as const;\n\nfunction smartFixed(n: number): string {\n return n.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n useGrouping: true,\n });\n}\nexport class Report {\n constructor(\n public readonly type: ReportType,\n public readonly value: bigint,\n public readonly uncertainty: number = 0,\n public readonly scale: bigint = 1n,\n ) {}\n valueOf() {\n return Number(div(this.value, this.scale));\n }\n toString() {\n const uncertainty = this.uncertainty ? ` ± ${smartFixed(this.uncertainty)}%` : '';\n\n const value = this.valueOf();\n if (this.type === 'ops') {\n return `${smartFixed(value)} ops/s${uncertainty}`;\n }\n if (this.type === 'rme') {\n return `${smartFixed(value)}%`;\n }\n if (this.type === 'variance') {\n let display = value;\n let unit = 'ns²';\n const varianceUnits = [\n { unit: 'ns²', factor: 1 },\n { unit: 'µs²', factor: 1e6 },\n { unit: 'ms²', factor: 1e12 },\n ];\n for (const { unit: u, factor } of varianceUnits) {\n const candidate = value / factor;\n if (candidate < 1000) {\n display = candidate;\n unit = u;\n break;\n }\n }\n return `${smartFixed(display)} ${unit}`;\n }\n let display = value;\n let unit = 'ns';\n\n for (const { unit: u, factor } of units) {\n const candidate = value / factor;\n if (candidate < 1000) {\n display = candidate;\n unit = u;\n break;\n }\n }\n return `${smartFixed(display)} ${unit}${uncertainty}`;\n }\n}\n\nexport const createReport = (durations: BigUint64Array, type: ReportType): Report => {\n const n = durations.length;\n if (n === 0) {\n return new Report(type, 0n);\n }\n switch (type) {\n case 'min': {\n return new Report(type, durations[0], 0, DURATION_SCALE);\n }\n case 'max': {\n return new Report(type, durations[n - 1], 0, DURATION_SCALE);\n }\n case 'median': {\n const mid = Math.floor(n / 2);\n const med = n % 2 === 0 ? (durations[mid - 1] + durations[mid]) / 2n : durations[mid];\n return new Report(type, med, 0, DURATION_SCALE);\n }\n\n case 'mode': {\n const freq = new Map<bigint, bigint>();\n let maxCount = 0n;\n let modeVal = durations[0];\n for (const d of durations) {\n const count = (freq.get(d) || 0n) + 1n;\n freq.set(d, count);\n if (count > maxCount) {\n maxCount = count;\n modeVal = d;\n }\n }\n let lower = modeVal;\n let upper = modeVal;\n const firstIdx = durations.indexOf(modeVal);\n const lastIdx = durations.lastIndexOf(modeVal);\n if (firstIdx > 0) lower = durations[firstIdx - 1];\n if (lastIdx < n - 1) upper = durations[lastIdx + 1];\n const gap = max(modeVal - lower, upper - modeVal);\n const uncertainty = modeVal > 0 ? Number(((gap / 2n) * 100n) / modeVal) : 0;\n return new Report(type, modeVal, uncertainty, DURATION_SCALE);\n }\n\n case 'ops': {\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const avgScaled = sum / BigInt(n);\n const nsPerSecScaled = 1_000_000_000n * DURATION_SCALE;\n const raw = Number(nsPerSecScaled) / Number(avgScaled);\n const extra = raw < 1 ? Math.ceil(-Math.log10(raw)) : 0;\n\n const exp = raw > 100 ? 0 : 2 + extra;\n\n const scale = 10n ** BigInt(exp);\n\n const value = avgScaled > 0n ? (nsPerSecScaled * scale) / avgScaled : 0n;\n const deviation = durations[n - 1] - durations[0];\n const uncertainty = avgScaled > 0 ? Number(div(deviation * scale, 2n * avgScaled)) : 0;\n return new Report(type, value, uncertainty, scale);\n }\n case 'mean': {\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const value = divs(sum, BigInt(n), 1n);\n return new Report(type, value, 0, DURATION_SCALE);\n }\n\n case 'variance': {\n if (n < 2) return new Report(type, 0n, 0, DURATION_SCALE * DURATION_SCALE);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = sum / BigInt(n);\n let sumSquaredDiff = 0n;\n for (const duration of durations) {\n const diff = duration - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = sumSquaredDiff / BigInt(n - 1);\n return new Report(type, variance, 0, DURATION_SCALE * DURATION_SCALE);\n }\n\n case 'sd': {\n if (n < 2) return new Report(type, 0n, 0, DURATION_SCALE);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = sum / BigInt(n);\n let sumSquaredDiff = 0n;\n for (const duration of durations) {\n const diff = duration - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = Number(sumSquaredDiff) / (n - 1);\n const sd = Math.sqrt(variance);\n const sdScaled = BigInt(Math.round(sd));\n return new Report(type, sdScaled, 0, DURATION_SCALE);\n }\n\n case 'sem': {\n if (n < 2) return new Report(type, 0n, 0, DURATION_SCALE);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = sum / BigInt(n);\n let sumSquaredDiff = 0n;\n for (const duration of durations) {\n const diff = duration - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = Number(sumSquaredDiff) / (n - 1);\n const sd = Math.sqrt(variance);\n const sem = sd / Math.sqrt(n);\n const semScaled = BigInt(Math.round(sem));\n return new Report(type, semScaled, 0, DURATION_SCALE);\n }\n\n case 'moe': {\n if (n < 2) return new Report(type, 0n, 0, DURATION_SCALE);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = sum / BigInt(n);\n let sumSquaredDiff = 0n;\n for (const duration of durations) {\n const diff = duration - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = Number(sumSquaredDiff) / (n - 1);\n const sd = Math.sqrt(variance);\n const sem = sd / Math.sqrt(n);\n const moe = Z95 * sem;\n const moeScaled = BigInt(Math.round(moe));\n return new Report(type, moeScaled, 0, DURATION_SCALE);\n }\n\n case 'rme': {\n if (n < 2) return new Report(type, 0n);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = Number(sum) / n;\n if (mean === 0) return new Report(type, 0n);\n let sumSquaredDiff = 0;\n for (const duration of durations) {\n const diff = Number(duration) - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = sumSquaredDiff / (n - 1);\n const sd = Math.sqrt(variance);\n const sem = sd / Math.sqrt(n);\n const moe = Z95 * sem;\n const rme = (moe / mean) * 100;\n const rmeScaled = BigInt(Math.round(rme * 100));\n return new Report(type, rmeScaled, 0, 100n);\n }\n\n case 'mad': {\n const medianIdx = Math.floor(n / 2);\n const median = n % 2 === 1 ? durations[medianIdx] : (durations[medianIdx - 1] + durations[medianIdx]) / 2n;\n const deviations = new BigUint64Array(n);\n for (let i = 0; i < n; i++) {\n const diff = durations[i] > median ? durations[i] - median : median - durations[i];\n deviations[i] = diff;\n }\n deviations.sort();\n const madIdx = Math.floor(n / 2);\n const mad = n % 2 === 1 ? deviations[madIdx] : (deviations[madIdx - 1] + deviations[madIdx]) / 2n;\n return new Report(type, mad, 0, DURATION_SCALE);\n }\n\n case 'iqr': {\n const q1Idx = Math.floor(n * 0.25);\n const q3Idx = Math.floor(n * 0.75);\n const q1 = durations[q1Idx];\n const q3 = durations[q3Idx];\n const iqr = q3 - q1;\n return new Report(type, iqr, 0, DURATION_SCALE);\n }\n\n case 'ci_lower': {\n if (n < 2) return new Report(type, 0n, 0, DURATION_SCALE);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = Number(sum) / n;\n let sumSquaredDiff = 0;\n for (const duration of durations) {\n const diff = Number(duration) - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = sumSquaredDiff / (n - 1);\n const sd = Math.sqrt(variance);\n const sem = sd / Math.sqrt(n);\n const moe = Z95 * sem;\n const ciLower = Math.max(0, mean - moe);\n return new Report(type, BigInt(Math.round(ciLower)), 0, DURATION_SCALE);\n }\n\n case 'ci_upper': {\n if (n < 2) return new Report(type, 0n, 0, DURATION_SCALE);\n let sum = 0n;\n for (const duration of durations) {\n sum += duration;\n }\n const mean = Number(sum) / n;\n let sumSquaredDiff = 0;\n for (const duration of durations) {\n const diff = Number(duration) - mean;\n sumSquaredDiff += diff * diff;\n }\n const variance = sumSquaredDiff / (n - 1);\n const sd = Math.sqrt(variance);\n const sem = sd / Math.sqrt(n);\n const moe = Z95 * sem;\n const ciUpper = mean + moe;\n return new Report(type, BigInt(Math.round(ciUpper)), 0, DURATION_SCALE);\n }\n\n default: {\n const p = Number(type.slice(1));\n if (p === 0) {\n return new Report(type, durations[0], 0, DURATION_SCALE);\n }\n if (p === 100) {\n return new Report(type, durations[n - 1], 0, DURATION_SCALE);\n }\n const idx = Math.ceil((p / 100) * n) - 1;\n const value = durations[Math.min(Math.max(idx, 0), n - 1)];\n const prev = idx > 0 ? durations[idx - 1] : value;\n const next = idx < n - 1 ? durations[idx + 1] : value;\n const gap = max(value - prev, next - value);\n const uncertainty = value > 0 ? Number(div(divs(gap, 2n, 100_00n), value)) / 100 : 0;\n\n return new Report(type, value, uncertainty, DURATION_SCALE);\n }\n }\n};\n"],"names":["Report","createReport","units","unit","factor","smartFixed","n","toLocaleString","undefined","minimumFractionDigits","maximumFractionDigits","useGrouping","type","value","uncertainty","scale","valueOf","Number","div","toString","display","varianceUnits","u","candidate","durations","length","DURATION_SCALE","mid","Math","floor","med","freq","Map","maxCount","modeVal","d","count","get","set","lower","upper","firstIdx","indexOf","lastIdx","lastIndexOf","gap","max","sum","duration","avgScaled","BigInt","nsPerSecScaled","raw","extra","ceil","log10","exp","deviation","divs","mean","sumSquaredDiff","diff","variance","sd","sqrt","sdScaled","round","sem","semScaled","moe","Z95","moeScaled","rme","rmeScaled","medianIdx","median","deviations","BigUint64Array","i","sort","madIdx","mad","q1Idx","q3Idx","q1","q3","iqr","ciLower","ciUpper","p","slice","idx","min","prev","next"],"mappings":";;;;;;;;;;;QAmBaA;eAAAA;;QAqDAC;eAAAA;;;0BAxEkB;0BACiB;AAEhD,MAAMC,QAAQ;IACZ;QAAEC,MAAM;QAAMC,QAAQ;IAAE;IACxB;QAAED,MAAM;QAAMC,QAAQ;IAAI;IAC1B;QAAED,MAAM;QAAMC,QAAQ;IAAI;IAC1B;QAAED,MAAM;QAAKC,QAAQ;IAAI;IACzB;QAAED,MAAM;QAAKC,QAAQ,KAAK;IAAI;IAC9B;QAAED,MAAM;QAAKC,QAAQ,OAAO;IAAI;CACjC;AAED,SAASC,WAAWC,CAAS;IAC3B,OAAOA,EAAEC,cAAc,CAACC,WAAW;QACjCC,uBAAuB;QACvBC,uBAAuB;QACvBC,aAAa;IACf;AACF;AACO,MAAMX;;;;;IACX,YACE,AAAgBY,IAAgB,EAChC,AAAgBC,KAAa,EAC7B,AAAgBC,cAAsB,CAAC,EACvC,AAAgBC,QAAgB,EAAE,CAClC;aAJgBH,OAAAA;aACAC,QAAAA;aACAC,cAAAA;aACAC,QAAAA;IACf;IACHC,UAAU;QACR,OAAOC,OAAOC,IAAAA,aAAG,EAAC,IAAI,CAACL,KAAK,EAAE,IAAI,CAACE,KAAK;IAC1C;IACAI,WAAW;QACT,MAAML,cAAc,IAAI,CAACA,WAAW,GAAG,CAAC,GAAG,EAAET,WAAW,IAAI,CAACS,WAAW,EAAE,CAAC,CAAC,GAAG;QAE/E,MAAMD,QAAQ,IAAI,CAACG,OAAO;QAC1B,IAAI,IAAI,CAACJ,IAAI,KAAK,OAAO;YACvB,OAAO,GAAGP,WAAWQ,OAAO,MAAM,EAAEC,aAAa;QACnD;QACA,IAAI,IAAI,CAACF,IAAI,KAAK,OAAO;YACvB,OAAO,GAAGP,WAAWQ,OAAO,CAAC,CAAC;QAChC;QACA,IAAI,IAAI,CAACD,IAAI,KAAK,YAAY;YAC5B,IAAIQ,UAAUP;YACd,IAAIV,OAAO;YACX,MAAMkB,gBAAgB;gBACpB;oBAAElB,MAAM;oBAAOC,QAAQ;gBAAE;gBACzB;oBAAED,MAAM;oBAAOC,QAAQ;gBAAI;gBAC3B;oBAAED,MAAM;oBAAOC,QAAQ;gBAAK;aAC7B;YACD,KAAK,MAAM,EAAED,MAAMmB,CAAC,EAAElB,MAAM,EAAE,IAAIiB,cAAe;gBAC/C,MAAME,YAAYV,QAAQT;gBAC1B,IAAImB,YAAY,MAAM;oBACpBH,UAAUG;oBACVpB,OAAOmB;oBACP;gBACF;YACF;YACA,OAAO,GAAGjB,WAAWe,SAAS,CAAC,EAAEjB,MAAM;QACzC;QACA,IAAIiB,UAAUP;QACd,IAAIV,OAAO;QAEX,KAAK,MAAM,EAAEA,MAAMmB,CAAC,EAAElB,MAAM,EAAE,IAAIF,MAAO;YACvC,MAAMqB,YAAYV,QAAQT;YAC1B,IAAImB,YAAY,MAAM;gBACpBH,UAAUG;gBACVpB,OAAOmB;gBACP;YACF;QACF;QACA,OAAO,GAAGjB,WAAWe,SAAS,CAAC,EAAEjB,OAAOW,aAAa;IACvD;AACF;AAEO,MAAMb,eAAe,CAACuB,WAA2BZ;IACtD,MAAMN,IAAIkB,UAAUC,MAAM;IAC1B,IAAInB,MAAM,GAAG;QACX,OAAO,IAAIN,OAAOY,MAAM,EAAE;IAC5B;IACA,OAAQA;QACN,KAAK;YAAO;gBACV,OAAO,IAAIZ,OAAOY,MAAMY,SAAS,CAAC,EAAE,EAAE,GAAGE,wBAAc;YACzD;QACA,KAAK;YAAO;gBACV,OAAO,IAAI1B,OAAOY,MAAMY,SAAS,CAAClB,IAAI,EAAE,EAAE,GAAGoB,wBAAc;YAC7D;QACA,KAAK;YAAU;gBACb,MAAMC,MAAMC,KAAKC,KAAK,CAACvB,IAAI;gBAC3B,MAAMwB,MAAMxB,IAAI,MAAM,IAAI,AAACkB,CAAAA,SAAS,CAACG,MAAM,EAAE,GAAGH,SAAS,CAACG,IAAI,AAAD,IAAK,EAAE,GAAGH,SAAS,CAACG,IAAI;gBACrF,OAAO,IAAI3B,OAAOY,MAAMkB,KAAK,GAAGJ,wBAAc;YAChD;QAEA,KAAK;YAAQ;gBACX,MAAMK,OAAO,IAAIC;gBACjB,IAAIC,WAAW,EAAE;gBACjB,IAAIC,UAAUV,SAAS,CAAC,EAAE;gBAC1B,KAAK,MAAMW,KAAKX,UAAW;oBACzB,MAAMY,QAAQ,AAACL,CAAAA,KAAKM,GAAG,CAACF,MAAM,EAAE,AAAD,IAAK,EAAE;oBACtCJ,KAAKO,GAAG,CAACH,GAAGC;oBACZ,IAAIA,QAAQH,UAAU;wBACpBA,WAAWG;wBACXF,UAAUC;oBACZ;gBACF;gBACA,IAAII,QAAQL;gBACZ,IAAIM,QAAQN;gBACZ,MAAMO,WAAWjB,UAAUkB,OAAO,CAACR;gBACnC,MAAMS,UAAUnB,UAAUoB,WAAW,CAACV;gBACtC,IAAIO,WAAW,GAAGF,QAAQf,SAAS,CAACiB,WAAW,EAAE;gBACjD,IAAIE,UAAUrC,IAAI,GAAGkC,QAAQhB,SAAS,CAACmB,UAAU,EAAE;gBACnD,MAAME,MAAMC,IAAAA,aAAG,EAACZ,UAAUK,OAAOC,QAAQN;gBACzC,MAAMpB,cAAcoB,UAAU,IAAIjB,OAAO,AAAE4B,MAAM,EAAE,GAAI,IAAI,GAAIX,WAAW;gBAC1E,OAAO,IAAIlC,OAAOY,MAAMsB,SAASpB,aAAaY,wBAAc;YAC9D;QAEA,KAAK;YAAO;gBACV,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMC,YAAYF,MAAMG,OAAO5C;gBAC/B,MAAM6C,iBAAiB,cAAc,GAAGzB,wBAAc;gBACtD,MAAM0B,MAAMnC,OAAOkC,kBAAkBlC,OAAOgC;gBAC5C,MAAMI,QAAQD,MAAM,IAAIxB,KAAK0B,IAAI,CAAC,CAAC1B,KAAK2B,KAAK,CAACH,QAAQ;gBAEtD,MAAMI,MAAMJ,MAAM,MAAM,IAAI,IAAIC;gBAEhC,MAAMtC,QAAQ,GAAG,IAAImC,OAAOM;gBAE5B,MAAM3C,QAAQoC,YAAY,EAAE,GAAG,AAACE,iBAAiBpC,QAASkC,YAAY,EAAE;gBACxE,MAAMQ,YAAYjC,SAAS,CAAClB,IAAI,EAAE,GAAGkB,SAAS,CAAC,EAAE;gBACjD,MAAMV,cAAcmC,YAAY,IAAIhC,OAAOC,IAAAA,aAAG,EAACuC,YAAY1C,OAAO,EAAE,GAAGkC,cAAc;gBACrF,OAAO,IAAIjD,OAAOY,MAAMC,OAAOC,aAAaC;YAC9C;QACA,KAAK;YAAQ;gBACX,IAAIgC,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMnC,QAAQ6C,IAAAA,cAAI,EAACX,KAAKG,OAAO5C,IAAI,EAAE;gBACrC,OAAO,IAAIN,OAAOY,MAAMC,OAAO,GAAGa,wBAAc;YAClD;QAEA,KAAK;YAAY;gBACf,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE,EAAE,GAAGc,wBAAc,GAAGA,wBAAc;gBACzE,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAOZ,MAAMG,OAAO5C;gBAC1B,IAAIsD,iBAAiB,EAAE;gBACvB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAOb,WAAWW;oBACxBC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAWF,iBAAiBV,OAAO5C,IAAI;gBAC7C,OAAO,IAAIN,OAAOY,MAAMkD,UAAU,GAAGpC,wBAAc,GAAGA,wBAAc;YACtE;QAEA,KAAK;YAAM;gBACT,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE,EAAE,GAAGc,wBAAc;gBACxD,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAOZ,MAAMG,OAAO5C;gBAC1B,IAAIsD,iBAAiB,EAAE;gBACvB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAOb,WAAWW;oBACxBC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAW7C,OAAO2C,kBAAmBtD,CAAAA,IAAI,CAAA;gBAC/C,MAAMyD,KAAKnC,KAAKoC,IAAI,CAACF;gBACrB,MAAMG,WAAWf,OAAOtB,KAAKsC,KAAK,CAACH;gBACnC,OAAO,IAAI/D,OAAOY,MAAMqD,UAAU,GAAGvC,wBAAc;YACrD;QAEA,KAAK;YAAO;gBACV,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE,EAAE,GAAGc,wBAAc;gBACxD,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAOZ,MAAMG,OAAO5C;gBAC1B,IAAIsD,iBAAiB,EAAE;gBACvB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAOb,WAAWW;oBACxBC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAW7C,OAAO2C,kBAAmBtD,CAAAA,IAAI,CAAA;gBAC/C,MAAMyD,KAAKnC,KAAKoC,IAAI,CAACF;gBACrB,MAAMK,MAAMJ,KAAKnC,KAAKoC,IAAI,CAAC1D;gBAC3B,MAAM8D,YAAYlB,OAAOtB,KAAKsC,KAAK,CAACC;gBACpC,OAAO,IAAInE,OAAOY,MAAMwD,WAAW,GAAG1C,wBAAc;YACtD;QAEA,KAAK;YAAO;gBACV,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE,EAAE,GAAGc,wBAAc;gBACxD,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAOZ,MAAMG,OAAO5C;gBAC1B,IAAIsD,iBAAiB,EAAE;gBACvB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAOb,WAAWW;oBACxBC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAW7C,OAAO2C,kBAAmBtD,CAAAA,IAAI,CAAA;gBAC/C,MAAMyD,KAAKnC,KAAKoC,IAAI,CAACF;gBACrB,MAAMK,MAAMJ,KAAKnC,KAAKoC,IAAI,CAAC1D;gBAC3B,MAAM+D,MAAMC,aAAG,GAAGH;gBAClB,MAAMI,YAAYrB,OAAOtB,KAAKsC,KAAK,CAACG;gBACpC,OAAO,IAAIrE,OAAOY,MAAM2D,WAAW,GAAG7C,wBAAc;YACtD;QAEA,KAAK;YAAO;gBACV,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE;gBACrC,IAAImC,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAO1C,OAAO8B,OAAOzC;gBAC3B,IAAIqD,SAAS,GAAG,OAAO,IAAI3D,OAAOY,MAAM,EAAE;gBAC1C,IAAIgD,iBAAiB;gBACrB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAO5C,OAAO+B,YAAYW;oBAChCC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAWF,iBAAkBtD,CAAAA,IAAI,CAAA;gBACvC,MAAMyD,KAAKnC,KAAKoC,IAAI,CAACF;gBACrB,MAAMK,MAAMJ,KAAKnC,KAAKoC,IAAI,CAAC1D;gBAC3B,MAAM+D,MAAMC,aAAG,GAAGH;gBAClB,MAAMK,MAAM,AAACH,MAAMV,OAAQ;gBAC3B,MAAMc,YAAYvB,OAAOtB,KAAKsC,KAAK,CAACM,MAAM;gBAC1C,OAAO,IAAIxE,OAAOY,MAAM6D,WAAW,GAAG,IAAI;YAC5C;QAEA,KAAK;YAAO;gBACV,MAAMC,YAAY9C,KAAKC,KAAK,CAACvB,IAAI;gBACjC,MAAMqE,SAASrE,IAAI,MAAM,IAAIkB,SAAS,CAACkD,UAAU,GAAG,AAAClD,CAAAA,SAAS,CAACkD,YAAY,EAAE,GAAGlD,SAAS,CAACkD,UAAU,AAAD,IAAK,EAAE;gBAC1G,MAAME,aAAa,IAAIC,eAAevE;gBACtC,IAAK,IAAIwE,IAAI,GAAGA,IAAIxE,GAAGwE,IAAK;oBAC1B,MAAMjB,OAAOrC,SAAS,CAACsD,EAAE,GAAGH,SAASnD,SAAS,CAACsD,EAAE,GAAGH,SAASA,SAASnD,SAAS,CAACsD,EAAE;oBAClFF,UAAU,CAACE,EAAE,GAAGjB;gBAClB;gBACAe,WAAWG,IAAI;gBACf,MAAMC,SAASpD,KAAKC,KAAK,CAACvB,IAAI;gBAC9B,MAAM2E,MAAM3E,IAAI,MAAM,IAAIsE,UAAU,CAACI,OAAO,GAAG,AAACJ,CAAAA,UAAU,CAACI,SAAS,EAAE,GAAGJ,UAAU,CAACI,OAAO,AAAD,IAAK,EAAE;gBACjG,OAAO,IAAIhF,OAAOY,MAAMqE,KAAK,GAAGvD,wBAAc;YAChD;QAEA,KAAK;YAAO;gBACV,MAAMwD,QAAQtD,KAAKC,KAAK,CAACvB,IAAI;gBAC7B,MAAM6E,QAAQvD,KAAKC,KAAK,CAACvB,IAAI;gBAC7B,MAAM8E,KAAK5D,SAAS,CAAC0D,MAAM;gBAC3B,MAAMG,KAAK7D,SAAS,CAAC2D,MAAM;gBAC3B,MAAMG,MAAMD,KAAKD;gBACjB,OAAO,IAAIpF,OAAOY,MAAM0E,KAAK,GAAG5D,wBAAc;YAChD;QAEA,KAAK;YAAY;gBACf,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE,EAAE,GAAGc,wBAAc;gBACxD,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAO1C,OAAO8B,OAAOzC;gBAC3B,IAAIsD,iBAAiB;gBACrB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAO5C,OAAO+B,YAAYW;oBAChCC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAWF,iBAAkBtD,CAAAA,IAAI,CAAA;gBACvC,MAAMyD,KAAKnC,KAAKoC,IAAI,CAACF;gBACrB,MAAMK,MAAMJ,KAAKnC,KAAKoC,IAAI,CAAC1D;gBAC3B,MAAM+D,MAAMC,aAAG,GAAGH;gBAClB,MAAMoB,UAAU3D,KAAKkB,GAAG,CAAC,GAAGa,OAAOU;gBACnC,OAAO,IAAIrE,OAAOY,MAAMsC,OAAOtB,KAAKsC,KAAK,CAACqB,WAAW,GAAG7D,wBAAc;YACxE;QAEA,KAAK;YAAY;gBACf,IAAIpB,IAAI,GAAG,OAAO,IAAIN,OAAOY,MAAM,EAAE,EAAE,GAAGc,wBAAc;gBACxD,IAAIqB,MAAM,EAAE;gBACZ,KAAK,MAAMC,YAAYxB,UAAW;oBAChCuB,OAAOC;gBACT;gBACA,MAAMW,OAAO1C,OAAO8B,OAAOzC;gBAC3B,IAAIsD,iBAAiB;gBACrB,KAAK,MAAMZ,YAAYxB,UAAW;oBAChC,MAAMqC,OAAO5C,OAAO+B,YAAYW;oBAChCC,kBAAkBC,OAAOA;gBAC3B;gBACA,MAAMC,WAAWF,iBAAkBtD,CAAAA,IAAI,CAAA;gBACvC,MAAMyD,KAAKnC,KAAKoC,IAAI,CAACF;gBACrB,MAAMK,MAAMJ,KAAKnC,KAAKoC,IAAI,CAAC1D;gBAC3B,MAAM+D,MAAMC,aAAG,GAAGH;gBAClB,MAAMqB,UAAU7B,OAAOU;gBACvB,OAAO,IAAIrE,OAAOY,MAAMsC,OAAOtB,KAAKsC,KAAK,CAACsB,WAAW,GAAG9D,wBAAc;YACxE;QAEA;YAAS;gBACP,MAAM+D,IAAIxE,OAAOL,KAAK8E,KAAK,CAAC;gBAC5B,IAAID,MAAM,GAAG;oBACX,OAAO,IAAIzF,OAAOY,MAAMY,SAAS,CAAC,EAAE,EAAE,GAAGE,wBAAc;gBACzD;gBACA,IAAI+D,MAAM,KAAK;oBACb,OAAO,IAAIzF,OAAOY,MAAMY,SAAS,CAAClB,IAAI,EAAE,EAAE,GAAGoB,wBAAc;gBAC7D;gBACA,MAAMiE,MAAM/D,KAAK0B,IAAI,CAAC,AAACmC,IAAI,MAAOnF,KAAK;gBACvC,MAAMO,QAAQW,SAAS,CAACI,KAAKgE,GAAG,CAAChE,KAAKkB,GAAG,CAAC6C,KAAK,IAAIrF,IAAI,GAAG;gBAC1D,MAAMuF,OAAOF,MAAM,IAAInE,SAAS,CAACmE,MAAM,EAAE,GAAG9E;gBAC5C,MAAMiF,OAAOH,MAAMrF,IAAI,IAAIkB,SAAS,CAACmE,MAAM,EAAE,GAAG9E;gBAChD,MAAMgC,MAAMC,IAAAA,aAAG,EAACjC,QAAQgF,MAAMC,OAAOjF;gBACrC,MAAMC,cAAcD,QAAQ,IAAII,OAAOC,IAAAA,aAAG,EAACwC,IAAAA,cAAI,EAACb,KAAK,EAAE,EAAE,OAAO,GAAGhC,UAAU,MAAM;gBAEnF,OAAO,IAAIb,OAAOY,MAAMC,OAAOC,aAAaY,wBAAc;YAC5D;IACF;AACF"}