slopmeter 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/cli.js +170 -39
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ slopmeter
|
|
|
24
24
|
## Usage
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
|
|
27
|
+
slopmeter [--all] [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
By default, the CLI:
|
|
@@ -38,6 +38,7 @@ By default, the CLI:
|
|
|
38
38
|
- `--claude`: include only Claude Code data
|
|
39
39
|
- `--codex`: include only Codex data
|
|
40
40
|
- `--opencode`: include only Open Code data
|
|
41
|
+
- `--all`: merge all providers into one combined graph
|
|
41
42
|
- `--dark`: render the image with the dark theme
|
|
42
43
|
- `-f, --format <png|svg|json>`: choose the output format
|
|
43
44
|
- `-o, --output <path>`: write output to a custom path
|
|
@@ -69,6 +70,12 @@ Render only Codex usage:
|
|
|
69
70
|
npx slopmeter --codex
|
|
70
71
|
```
|
|
71
72
|
|
|
73
|
+
Render one merged graph across all providers:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npx slopmeter --all
|
|
77
|
+
```
|
|
78
|
+
|
|
72
79
|
When provider flags are present, `slopmeter` only loads those providers and only prints availability for those providers.
|
|
73
80
|
|
|
74
81
|
Render a dark-theme SVG:
|
|
@@ -97,6 +104,7 @@ When Claude Code falls back to `history.jsonl`, those days are rendered as activ
|
|
|
97
104
|
## Exit behavior
|
|
98
105
|
|
|
99
106
|
- If no provider flags are passed, `slopmeter` renders every provider with available data.
|
|
107
|
+
- If `--all` is passed, `slopmeter` loads all providers and renders one combined graph with merged totals, streaks, and model rankings.
|
|
100
108
|
- If provider flags are passed and a requested provider has no data, the command exits with an error.
|
|
101
109
|
- If no provider has data, the command exits with an error.
|
|
102
110
|
|
package/dist/cli.js
CHANGED
|
@@ -5578,7 +5578,9 @@ function computeCurrentStreak(daily, end) {
|
|
|
5578
5578
|
function getProviderInsights(modelTotals, recentModelTotals, daily, end) {
|
|
5579
5579
|
const mostUsedModel = getTopModel(modelTotals);
|
|
5580
5580
|
const recentMostUsedModel = getTopModel(recentModelTotals);
|
|
5581
|
-
const measuredDaily = daily.filter(
|
|
5581
|
+
const measuredDaily = daily.filter(
|
|
5582
|
+
(row) => (row.displayValue ?? row.total) > 0
|
|
5583
|
+
);
|
|
5582
5584
|
return {
|
|
5583
5585
|
mostUsedModel,
|
|
5584
5586
|
recentMostUsedModel,
|
|
@@ -5601,6 +5603,57 @@ function hasUsage(summary) {
|
|
|
5601
5603
|
(row) => row.total > 0 || (row.displayValue ?? 0) > 0
|
|
5602
5604
|
);
|
|
5603
5605
|
}
|
|
5606
|
+
function mergeUsageSummaries(provider, summaries, end) {
|
|
5607
|
+
const totals = /* @__PURE__ */ new Map();
|
|
5608
|
+
const modelTotals = /* @__PURE__ */ new Map();
|
|
5609
|
+
const recentModelTotals = /* @__PURE__ */ new Map();
|
|
5610
|
+
const displayValuesByDate = /* @__PURE__ */ new Map();
|
|
5611
|
+
const recentStart = getRecentWindowStart(end, 30);
|
|
5612
|
+
for (const summary of summaries) {
|
|
5613
|
+
for (const row of summary.daily) {
|
|
5614
|
+
addDailyTokenTotals(totals, row.date, {
|
|
5615
|
+
input: row.input,
|
|
5616
|
+
output: row.output,
|
|
5617
|
+
cache: { input: row.cache.input, output: row.cache.output },
|
|
5618
|
+
total: row.total
|
|
5619
|
+
});
|
|
5620
|
+
const dateKey = formatLocalDate(row.date);
|
|
5621
|
+
const displayValue = row.displayValue ?? row.total;
|
|
5622
|
+
if (displayValue > 0) {
|
|
5623
|
+
displayValuesByDate.set(
|
|
5624
|
+
dateKey,
|
|
5625
|
+
(displayValuesByDate.get(dateKey) ?? 0) + displayValue
|
|
5626
|
+
);
|
|
5627
|
+
}
|
|
5628
|
+
const totalsForDate = totals.get(dateKey);
|
|
5629
|
+
if (totalsForDate) {
|
|
5630
|
+
for (const breakdown of row.breakdown) {
|
|
5631
|
+
addModelTokenTotals(
|
|
5632
|
+
totalsForDate.models,
|
|
5633
|
+
breakdown.name,
|
|
5634
|
+
breakdown.tokens
|
|
5635
|
+
);
|
|
5636
|
+
addModelTokenTotals(modelTotals, breakdown.name, breakdown.tokens);
|
|
5637
|
+
if (row.date >= recentStart) {
|
|
5638
|
+
addModelTokenTotals(
|
|
5639
|
+
recentModelTotals,
|
|
5640
|
+
breakdown.name,
|
|
5641
|
+
breakdown.tokens
|
|
5642
|
+
);
|
|
5643
|
+
}
|
|
5644
|
+
}
|
|
5645
|
+
}
|
|
5646
|
+
}
|
|
5647
|
+
}
|
|
5648
|
+
return createUsageSummary(
|
|
5649
|
+
provider,
|
|
5650
|
+
totals,
|
|
5651
|
+
modelTotals,
|
|
5652
|
+
recentModelTotals,
|
|
5653
|
+
end,
|
|
5654
|
+
displayValuesByDate
|
|
5655
|
+
);
|
|
5656
|
+
}
|
|
5604
5657
|
|
|
5605
5658
|
// src/graph.ts
|
|
5606
5659
|
var heatmapThemes = {
|
|
@@ -5690,6 +5743,36 @@ var heatmapThemes = {
|
|
|
5690
5743
|
// neutral-50
|
|
5691
5744
|
]
|
|
5692
5745
|
}
|
|
5746
|
+
},
|
|
5747
|
+
all: {
|
|
5748
|
+
title: "Codex / Claude Code / Open Code",
|
|
5749
|
+
titleCaption: "Total usage from",
|
|
5750
|
+
colors: {
|
|
5751
|
+
light: [
|
|
5752
|
+
"#f0fdf4",
|
|
5753
|
+
// green-50
|
|
5754
|
+
"#bbf7d0",
|
|
5755
|
+
// green-200
|
|
5756
|
+
"#4ade80",
|
|
5757
|
+
// green-400
|
|
5758
|
+
"#16a34a",
|
|
5759
|
+
// green-600
|
|
5760
|
+
"#14532d"
|
|
5761
|
+
// green-900
|
|
5762
|
+
],
|
|
5763
|
+
dark: [
|
|
5764
|
+
"#052e16",
|
|
5765
|
+
// green-950
|
|
5766
|
+
"#15803d",
|
|
5767
|
+
// green-700
|
|
5768
|
+
"#16a34a",
|
|
5769
|
+
// green-600
|
|
5770
|
+
"#4ade80",
|
|
5771
|
+
// green-400
|
|
5772
|
+
"#bbf7d0"
|
|
5773
|
+
// green-200
|
|
5774
|
+
]
|
|
5775
|
+
}
|
|
5693
5776
|
}
|
|
5694
5777
|
};
|
|
5695
5778
|
var daysOfWeekMonday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
|
|
@@ -5699,6 +5782,7 @@ var providerTitleFontSize = 20;
|
|
|
5699
5782
|
var metricCaptionFontSize = 9;
|
|
5700
5783
|
var metricValueFontSize = 14;
|
|
5701
5784
|
var captionValueGap = 4;
|
|
5785
|
+
var heatmapGamma = 0.7;
|
|
5702
5786
|
var surfacePalettes = {
|
|
5703
5787
|
light: {
|
|
5704
5788
|
background: "#ffffff",
|
|
@@ -5711,6 +5795,12 @@ var surfacePalettes = {
|
|
|
5711
5795
|
muted: "#a3a3a3"
|
|
5712
5796
|
}
|
|
5713
5797
|
};
|
|
5798
|
+
var emptyCellFill = {
|
|
5799
|
+
light: "#f5f5f5",
|
|
5800
|
+
// neutral-100
|
|
5801
|
+
dark: "#262626"
|
|
5802
|
+
// neutral-800
|
|
5803
|
+
};
|
|
5714
5804
|
function formatTokenTotal(value) {
|
|
5715
5805
|
const units = [
|
|
5716
5806
|
{ size: 1e12, suffix: "T" },
|
|
@@ -5778,7 +5868,7 @@ function defaultColourMap(value, max, colorCount) {
|
|
|
5778
5868
|
if (max <= 0 || value <= 0) {
|
|
5779
5869
|
return 0;
|
|
5780
5870
|
}
|
|
5781
|
-
const scaled = Math.
|
|
5871
|
+
const scaled = Math.pow(value / max, heatmapGamma);
|
|
5782
5872
|
const index = Math.ceil(scaled * (colorCount - 1));
|
|
5783
5873
|
return Math.min(Math.max(index, 0), colorCount - 1);
|
|
5784
5874
|
}
|
|
@@ -5848,11 +5938,13 @@ function drawHeatmapSection(svg, {
|
|
|
5848
5938
|
daily,
|
|
5849
5939
|
insights,
|
|
5850
5940
|
title,
|
|
5941
|
+
titleCaption,
|
|
5851
5942
|
colors,
|
|
5852
5943
|
colorMode,
|
|
5853
5944
|
palette
|
|
5854
5945
|
}) {
|
|
5855
5946
|
const colorsForMode = colors[colorMode];
|
|
5947
|
+
const legendColors = [emptyCellFill[colorMode], ...colorsForMode.slice(1)];
|
|
5856
5948
|
const valueByDate = /* @__PURE__ */ new Map();
|
|
5857
5949
|
const rightEdge = x + layout.width - 8;
|
|
5858
5950
|
const leftColumnX = x + 8;
|
|
@@ -5887,18 +5979,45 @@ function drawHeatmapSection(svg, {
|
|
|
5887
5979
|
const totalOutputLabel = formatTokenTotal(totalOutputTokens);
|
|
5888
5980
|
const longestStreak = insights?.streaks.longest ?? 0;
|
|
5889
5981
|
const currentStreak = insights?.streaks.current ?? 0;
|
|
5890
|
-
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
|
|
5894
|
-
|
|
5895
|
-
|
|
5896
|
-
|
|
5897
|
-
|
|
5898
|
-
|
|
5899
|
-
|
|
5900
|
-
|
|
5901
|
-
|
|
5982
|
+
if (titleCaption) {
|
|
5983
|
+
svg = svg.text(
|
|
5984
|
+
{
|
|
5985
|
+
x: leftColumnX,
|
|
5986
|
+
y: y + layout.headerCaptionY,
|
|
5987
|
+
fill: palette.muted,
|
|
5988
|
+
"font-size": metricCaptionFontSize,
|
|
5989
|
+
"font-weight": 600,
|
|
5990
|
+
"dominant-baseline": "hanging",
|
|
5991
|
+
"font-family": fontFamily
|
|
5992
|
+
},
|
|
5993
|
+
caption(titleCaption)
|
|
5994
|
+
);
|
|
5995
|
+
svg = svg.text(
|
|
5996
|
+
{
|
|
5997
|
+
x: leftColumnX,
|
|
5998
|
+
y: y + layout.headerValueY,
|
|
5999
|
+
fill: palette.text,
|
|
6000
|
+
"font-size": metricValueFontSize,
|
|
6001
|
+
"font-weight": 600,
|
|
6002
|
+
"dominant-baseline": "hanging",
|
|
6003
|
+
"font-family": fontFamily
|
|
6004
|
+
},
|
|
6005
|
+
title
|
|
6006
|
+
);
|
|
6007
|
+
} else {
|
|
6008
|
+
svg = svg.text(
|
|
6009
|
+
{
|
|
6010
|
+
x: leftColumnX,
|
|
6011
|
+
y: y + layout.titleY,
|
|
6012
|
+
fill: palette.text,
|
|
6013
|
+
"font-size": providerTitleFontSize,
|
|
6014
|
+
"font-weight": 600,
|
|
6015
|
+
"dominant-baseline": "hanging",
|
|
6016
|
+
"font-family": fontFamily
|
|
6017
|
+
},
|
|
6018
|
+
title
|
|
6019
|
+
);
|
|
6020
|
+
}
|
|
5902
6021
|
svg = svg.text(
|
|
5903
6022
|
{
|
|
5904
6023
|
x: headerInputX,
|
|
@@ -6020,7 +6139,7 @@ function drawHeatmapSection(svg, {
|
|
|
6020
6139
|
maxValue,
|
|
6021
6140
|
colorsForMode.length
|
|
6022
6141
|
);
|
|
6023
|
-
const fill = colorsForMode[colorIndex];
|
|
6142
|
+
const fill = value <= 0 ? emptyCellFill[colorMode] : colorsForMode[colorIndex];
|
|
6024
6143
|
const dayX = x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);
|
|
6025
6144
|
const dayY = y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);
|
|
6026
6145
|
const rectAttributes = {
|
|
@@ -6035,22 +6154,6 @@ function drawHeatmapSection(svg, {
|
|
|
6035
6154
|
svg = svg.rect(rectAttributes);
|
|
6036
6155
|
}
|
|
6037
6156
|
}
|
|
6038
|
-
const transitionWeekIndex = firstActivityOnlyDate && firstMeasuredDate ? grid.weeks.findIndex((week) => week.includes(firstMeasuredDate)) : -1;
|
|
6039
|
-
if (transitionWeekIndex > 0) {
|
|
6040
|
-
const lineX = x + layout.leftLabelWidth + transitionWeekIndex * (layout.cellSize + layout.gap) - Math.max(layout.gap, 2);
|
|
6041
|
-
const lineTop = y + layout.monthLabelY - 2;
|
|
6042
|
-
const lineBottom = y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 2;
|
|
6043
|
-
svg = svg.line({
|
|
6044
|
-
x1: lineX,
|
|
6045
|
-
y1: lineTop,
|
|
6046
|
-
x2: lineX,
|
|
6047
|
-
y2: lineBottom,
|
|
6048
|
-
stroke: palette.muted,
|
|
6049
|
-
"stroke-width": 1,
|
|
6050
|
-
"stroke-dasharray": "4 4",
|
|
6051
|
-
"stroke-opacity": 0.65
|
|
6052
|
-
});
|
|
6053
|
-
}
|
|
6054
6157
|
const legendStartX = x + layout.leftLabelWidth;
|
|
6055
6158
|
const legendY = y + layout.legendY;
|
|
6056
6159
|
svg = svg.text(
|
|
@@ -6064,7 +6167,7 @@ function drawHeatmapSection(svg, {
|
|
|
6064
6167
|
},
|
|
6065
6168
|
caption("Less")
|
|
6066
6169
|
);
|
|
6067
|
-
for (let i = 0; i <
|
|
6170
|
+
for (let i = 0; i < legendColors.length; i += 1) {
|
|
6068
6171
|
const legendX = legendStartX + 28 + i * (layout.cellSize + 3);
|
|
6069
6172
|
svg = svg.rect({
|
|
6070
6173
|
x: legendX,
|
|
@@ -6073,12 +6176,12 @@ function drawHeatmapSection(svg, {
|
|
|
6073
6176
|
height: layout.cellSize,
|
|
6074
6177
|
rx: 3,
|
|
6075
6178
|
ry: 3,
|
|
6076
|
-
fill:
|
|
6179
|
+
fill: legendColors[i]
|
|
6077
6180
|
});
|
|
6078
6181
|
}
|
|
6079
6182
|
svg = svg.text(
|
|
6080
6183
|
{
|
|
6081
|
-
x: legendStartX + 28 +
|
|
6184
|
+
x: legendStartX + 28 + legendColors.length * (layout.cellSize + 3) + 6,
|
|
6082
6185
|
y: legendY + 10,
|
|
6083
6186
|
fill: palette.muted,
|
|
6084
6187
|
"font-size": 10,
|
|
@@ -6230,6 +6333,7 @@ function renderUsageHeatmapsSvg({
|
|
|
6230
6333
|
daily: section.daily,
|
|
6231
6334
|
insights: section.insights,
|
|
6232
6335
|
title: section.title,
|
|
6336
|
+
titleCaption: section.titleCaption,
|
|
6233
6337
|
colors: section.colors,
|
|
6234
6338
|
colorMode,
|
|
6235
6339
|
palette
|
|
@@ -7099,6 +7203,13 @@ async function loadOpenCodeRows(start, end) {
|
|
|
7099
7203
|
}
|
|
7100
7204
|
|
|
7101
7205
|
// src/providers.ts
|
|
7206
|
+
function mergeProviderUsage(rowsByProvider, end) {
|
|
7207
|
+
const summaries = providerIds.map((provider) => rowsByProvider[provider]).filter((summary) => summary !== null);
|
|
7208
|
+
if (summaries.length === 0) {
|
|
7209
|
+
return null;
|
|
7210
|
+
}
|
|
7211
|
+
return mergeUsageSummaries("all", summaries, end);
|
|
7212
|
+
}
|
|
7102
7213
|
async function aggregateUsage({
|
|
7103
7214
|
start,
|
|
7104
7215
|
end,
|
|
@@ -7128,9 +7239,10 @@ var HELP_TEXT = `slopmeter
|
|
|
7128
7239
|
Generate rolling 1-year usage heatmap image(s) (today is the latest day).
|
|
7129
7240
|
|
|
7130
7241
|
Usage:
|
|
7131
|
-
slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
|
|
7242
|
+
slopmeter [--all] [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
|
|
7132
7243
|
|
|
7133
7244
|
Options:
|
|
7245
|
+
--all Render one merged graph for all providers
|
|
7134
7246
|
--claude Render Claude Code graph
|
|
7135
7247
|
--codex Render Codex graph
|
|
7136
7248
|
--opencode Render Open Code graph
|
|
@@ -7150,6 +7262,7 @@ function validateArgs(values) {
|
|
|
7150
7262
|
format: ow.optional.string.nonEmpty,
|
|
7151
7263
|
help: ow.boolean,
|
|
7152
7264
|
dark: ow.boolean,
|
|
7265
|
+
all: ow.boolean,
|
|
7153
7266
|
claude: ow.boolean,
|
|
7154
7267
|
codex: ow.boolean,
|
|
7155
7268
|
opencode: ow.boolean
|
|
@@ -7217,6 +7330,21 @@ function printProviderAvailability(rowsByProvider, providers) {
|
|
|
7217
7330
|
function getRequestedProviders(values) {
|
|
7218
7331
|
return providerIds.filter((id) => values[id]);
|
|
7219
7332
|
}
|
|
7333
|
+
function getOutputProviders(values, rowsByProvider, end) {
|
|
7334
|
+
if (!values.all) {
|
|
7335
|
+
return selectProvidersToRender(rowsByProvider, getRequestedProviders(values));
|
|
7336
|
+
}
|
|
7337
|
+
const merged = mergeProviderUsage(rowsByProvider, end);
|
|
7338
|
+
if (!merged) {
|
|
7339
|
+
throw new Error(
|
|
7340
|
+
"No usage data found for Claude code, Codex, or Open code."
|
|
7341
|
+
);
|
|
7342
|
+
}
|
|
7343
|
+
return [merged];
|
|
7344
|
+
}
|
|
7345
|
+
function getMergedProviderTitle(rowsByProvider) {
|
|
7346
|
+
return providerIds.filter((provider) => rowsByProvider[provider] !== null).map((provider) => heatmapThemes[provider].title).join(" / ");
|
|
7347
|
+
}
|
|
7220
7348
|
function selectProvidersToRender(rowsByProvider, requested) {
|
|
7221
7349
|
const providersToRender = requested.length > 0 ? requested.filter((provider) => rowsByProvider[provider]) : providerIds.filter((provider) => rowsByProvider[provider]);
|
|
7222
7350
|
if (requested.length > 0 && providersToRender.length < requested.length) {
|
|
@@ -7257,6 +7385,7 @@ async function main() {
|
|
|
7257
7385
|
format: { type: "string", short: "f" },
|
|
7258
7386
|
help: { type: "boolean", short: "h", default: false },
|
|
7259
7387
|
dark: { type: "boolean", default: false },
|
|
7388
|
+
all: { type: "boolean", default: false },
|
|
7260
7389
|
claude: { type: "boolean", default: false },
|
|
7261
7390
|
codex: { type: "boolean", default: false },
|
|
7262
7391
|
opencode: { type: "boolean", default: false }
|
|
@@ -7277,7 +7406,7 @@ async function main() {
|
|
|
7277
7406
|
const { start, end } = getDateWindow();
|
|
7278
7407
|
const colorMode = values.dark ? "dark" : "light";
|
|
7279
7408
|
const format = inferFormat(values.format, values.output);
|
|
7280
|
-
const requestedProviders = getRequestedProviders(values);
|
|
7409
|
+
const requestedProviders = values.all ? providerIds : getRequestedProviders(values);
|
|
7281
7410
|
const inspectedProviders = requestedProviders.length > 0 ? requestedProviders : providerIds;
|
|
7282
7411
|
const { rowsByProvider, warnings } = await aggregateUsage({
|
|
7283
7412
|
start,
|
|
@@ -7290,9 +7419,10 @@ async function main() {
|
|
|
7290
7419
|
`);
|
|
7291
7420
|
}
|
|
7292
7421
|
printProviderAvailability(rowsByProvider, inspectedProviders);
|
|
7293
|
-
const exportProviders =
|
|
7422
|
+
const exportProviders = getOutputProviders(
|
|
7423
|
+
values,
|
|
7294
7424
|
rowsByProvider,
|
|
7295
|
-
|
|
7425
|
+
end
|
|
7296
7426
|
);
|
|
7297
7427
|
const outputPath = resolve4(
|
|
7298
7428
|
values.output ?? `./heatmap-last-year.${format}`
|
|
@@ -7319,7 +7449,8 @@ async function main() {
|
|
|
7319
7449
|
sections: exportProviders.map(({ provider, daily, insights }) => ({
|
|
7320
7450
|
daily,
|
|
7321
7451
|
insights,
|
|
7322
|
-
title: heatmapThemes[provider].title,
|
|
7452
|
+
title: provider === "all" ? getMergedProviderTitle(rowsByProvider) : heatmapThemes[provider].title,
|
|
7453
|
+
titleCaption: heatmapThemes[provider].titleCaption,
|
|
7323
7454
|
colors: heatmapThemes[provider].colors
|
|
7324
7455
|
}))
|
|
7325
7456
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n displayValue: row.displayValue,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const requestedProviders = getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\n const { rowsByProvider, warnings } = await aggregateUsage({\n start,\n end,\n requestedProviders,\n });\n\n spinner.stop();\n\n for (const warning of warnings) {\n process.stderr.write(`${warning}\\n`);\n }\n\n printProviderAvailability(rowsByProvider, inspectedProviders);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n requestedProviders,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const DEFAULT_FILE_PROCESS_CONCURRENCY = 4;\nexport const FILE_PROCESS_CONCURRENCY_ENV =\n \"SLOPMETER_FILE_PROCESS_CONCURRENCY\";\nexport const MAX_JSONL_RECORD_BYTES_ENV = \"SLOPMETER_MAX_JSONL_RECORD_BYTES\";\nexport const DEFAULT_MAX_JSONL_RECORD_BYTES = 64 * 1024 * 1024;\n\nexport interface JsonlRecord<TClassification = void> {\n lineNumber: number;\n rawLine: string;\n byteLength: number;\n classification: TClassification;\n}\n\nexport type JsonlRecordDecision<TClassification> =\n | { kind: \"keep\"; classification: TClassification }\n | { kind: \"skip\" }\n | { kind: \"unknown\" };\n\ninterface ReadJsonlRecordsOptions<TClassification> {\n classificationPrefixBytes?: number;\n classify?: (prefix: string) => JsonlRecordDecision<TClassification>;\n maxRecordBytes?: number;\n onSkippedOversizedRecord?: (record: {\n lineNumber: number;\n byteLength: number;\n }) => void;\n oversizedErrorMessage?: (record: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ReadJsonDocumentOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ParseJsonTextOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function mergeDailyTotalsByDate(\n target: DailyTotalsByDate,\n source: DailyTotalsByDate,\n) {\n for (const [dateKey, sourceTotals] of source.entries()) {\n const existing = target.get(dateKey);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n models.set(modelName, cloneTokenTotals(totals));\n }\n\n target.set(dateKey, {\n tokens: cloneTokenTotals(sourceTotals.tokens),\n models,\n });\n continue;\n }\n\n mergeTokenTotals(existing.tokens, sourceTotals.tokens);\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n addModelTokenTotals(existing.models, modelName, totals);\n }\n }\n}\n\nexport function mergeModelTotals(\n target: Map<string, ModelTokenTotals>,\n source: Map<string, ModelTokenTotals>,\n) {\n for (const [modelName, totals] of source.entries()) {\n addModelTokenTotals(target, modelName, totals);\n }\n}\n\nexport function totalsToRows(\n totals: DailyTotalsByDate,\n displayValuesByDate = new Map<string, number>(),\n): DailyUsage[] {\n const allDates = new Set<string>([\n ...totals.keys(),\n ...displayValuesByDate.keys(),\n ]);\n\n return [...allDates]\n .sort((a, b) => a.localeCompare(b))\n .map((date) => {\n const entry = totals.get(date);\n const tokens = entry?.tokens ?? {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n const models = entry?.models ?? new Map<string, ModelTokenTotals>();\n const displayValue =\n tokens.total > 0 ? tokens.total : (displayValuesByDate.get(date) ?? 0);\n\n return {\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n displayValue: displayValue > 0 ? displayValue : undefined,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n };\n });\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files.sort((left, right) => left.localeCompare(right));\n}\n\nfunction defaultOversizedJsonlRecordMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName,\n}: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n}) {\n return `JSONL record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonDocumentMessage({\n filePath,\n maxBytes,\n envVarName,\n}: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON document exceeds ${maxBytes} bytes in ${filePath}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonTextMessage({\n sourceLabel,\n maxBytes,\n envVarName,\n}: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON payload exceeds ${maxBytes} bytes in ${sourceLabel}. Increase ${envVarName} to process this payload.`;\n}\n\nfunction keepAllJsonlRecords<TClassification>(): JsonlRecordDecision<TClassification> {\n return { kind: \"keep\", classification: undefined as TClassification };\n}\n\nexport async function* readJsonlRecords<TClassification = void>(\n filePath: string,\n options: ReadJsonlRecordsOptions<TClassification> = {},\n): AsyncGenerator<JsonlRecord<TClassification>> {\n const maxRecordBytes =\n options.maxRecordBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const classificationPrefixBytes =\n options.classificationPrefixBytes ?? maxRecordBytes;\n const classify = options.classify ?? keepAllJsonlRecords<TClassification>;\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonlRecordMessage;\n const stream = createReadStream(filePath);\n let lineNumber = 0;\n let lineBytesSeen = 0;\n let retainedBytes = 0;\n let prefixBytes = 0;\n let exceededLimit = false;\n let decision: JsonlRecordDecision<TClassification> = { kind: \"unknown\" };\n let prefixChunks: Buffer[] = [];\n let retainedChunks: Buffer[] = [];\n\n const resetRecord = () => {\n lineBytesSeen = 0;\n retainedBytes = 0;\n prefixBytes = 0;\n exceededLimit = false;\n decision = { kind: \"unknown\" };\n prefixChunks = [];\n retainedChunks = [];\n };\n\n const maybeClassify = () => {\n if (decision.kind !== \"unknown\" || prefixBytes === 0) {\n return;\n }\n\n decision = classify(Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\"));\n\n if (decision.kind === \"skip\") {\n retainedChunks = [];\n retainedBytes = 0;\n }\n };\n\n const appendSegment = (segment: Buffer) => {\n if (segment.length === 0) {\n return;\n }\n\n lineBytesSeen += segment.length;\n\n if (prefixBytes < classificationPrefixBytes) {\n const prefixSegment = segment.subarray(\n 0,\n Math.min(segment.length, classificationPrefixBytes - prefixBytes),\n );\n\n prefixChunks.push(prefixSegment);\n prefixBytes += prefixSegment.length;\n maybeClassify();\n }\n\n if (decision.kind === \"skip\") {\n return;\n }\n\n const remainingBytes = maxRecordBytes - retainedBytes;\n\n if (remainingBytes > 0) {\n const retainedSegment = segment.subarray(\n 0,\n Math.min(segment.length, remainingBytes),\n );\n\n if (retainedSegment.length > 0) {\n retainedChunks.push(retainedSegment);\n retainedBytes += retainedSegment.length;\n }\n }\n\n if (segment.length > remainingBytes) {\n exceededLimit = true;\n }\n };\n\n const resolveDecision = () => {\n if (decision.kind !== \"unknown\") {\n return decision;\n }\n\n const candidate =\n exceededLimit || retainedBytes === 0\n ? Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\")\n : Buffer.concat(retainedChunks, retainedBytes).toString(\"utf8\");\n\n return classify(candidate);\n };\n\n const finalizeRecord = () => {\n lineNumber += 1;\n\n if (lineBytesSeen === 0 && !exceededLimit) {\n resetRecord();\n\n return null;\n }\n\n const resolvedDecision = resolveDecision();\n\n if (resolvedDecision.kind === \"skip\") {\n if (lineBytesSeen > maxRecordBytes) {\n options.onSkippedOversizedRecord?.({\n lineNumber,\n byteLength: lineBytesSeen,\n });\n }\n\n resetRecord();\n\n return null;\n }\n\n if (resolvedDecision.kind === \"unknown\") {\n resetRecord();\n\n return null;\n }\n\n if (lineBytesSeen > maxRecordBytes || exceededLimit) {\n throw new Error(\n oversizedErrorMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n const rawLine = Buffer.concat(retainedChunks, retainedBytes)\n .toString(\"utf8\")\n .trim();\n\n if (rawLine === \"\") {\n resetRecord();\n\n return null;\n }\n\n const record: JsonlRecord<TClassification> = {\n lineNumber,\n rawLine,\n byteLength: lineBytesSeen,\n classification: resolvedDecision.classification,\n };\n\n resetRecord();\n\n return record;\n };\n\n for await (const chunk of stream) {\n let start = 0;\n\n for (let index = 0; index < chunk.length; index += 1) {\n if (chunk[index] !== 0x0a) {\n continue;\n }\n\n appendSegment(chunk.subarray(start, index));\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n\n start = index + 1;\n }\n\n appendSegment(chunk.subarray(start));\n }\n\n if (lineBytesSeen > 0) {\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n }\n}\n\nexport async function* readJsonLines<T>(filePath: string): AsyncGenerator<T> {\n for await (const record of readJsonlRecords(filePath)) {\n try {\n yield JSON.parse(record.rawLine) as T;\n } catch {\n // Preserve existing behavior for malformed JSONL records.\n }\n }\n}\n\nexport async function readJsonDocument<T>(\n filePath: string,\n options: ReadJsonDocumentOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonDocumentMessage;\n const stream = createReadStream(filePath);\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n\n for await (const chunk of stream) {\n totalBytes += chunk.length;\n\n if (totalBytes > maxBytes) {\n stream.destroy();\n\n throw new Error(\n oversizedErrorMessage({\n filePath,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n chunks.push(chunk);\n }\n\n return parseJsonTextWithLimit<T>(\n Buffer.concat(chunks, totalBytes).toString(\"utf8\"),\n filePath,\n {\n maxBytes,\n oversizedErrorMessage: ({ sourceLabel, maxBytes, envVarName }) =>\n oversizedErrorMessage({\n filePath: sourceLabel,\n maxBytes,\n envVarName,\n }),\n },\n );\n}\n\nexport function parseJsonTextWithLimit<T>(\n content: string,\n sourceLabel: string,\n options: ParseJsonTextOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonTextMessage;\n\n if (Buffer.byteLength(content, \"utf8\") > maxBytes) {\n throw new Error(\n oversizedErrorMessage({\n sourceLabel,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n return JSON.parse(content) as T;\n}\n\nexport function getPositiveIntegerEnv(name: string, fallback: number) {\n const raw = process.env[name]?.trim();\n\n if (!raw) {\n return fallback;\n }\n\n const parsed = Number.parseInt(raw, 10);\n\n if (!Number.isFinite(parsed) || parsed < 1) {\n return fallback;\n }\n\n return parsed;\n}\n\nexport async function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n) {\n if (items.length === 0) {\n return;\n }\n\n const limit = Math.max(1, Math.min(concurrency, items.length));\n let nextIndex = 0;\n\n await Promise.all(\n Array.from({ length: limit }, async () => {\n for (;;) {\n const currentIndex = nextIndex;\n\n nextIndex += 1;\n\n if (currentIndex >= items.length) {\n return;\n }\n\n await worker(items[currentIndex], currentIndex);\n }\n }),\n );\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n const measuredDaily = daily.filter((row) => row.total > 0);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(measuredDaily),\n current: computeCurrentStreak(measuredDaily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n displayValuesByDate?: Map<string, number>,\n): UsageSummary {\n const daily = totalsToRows(totals, displayValuesByDate);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some(\n (row) => row.total > 0 || (row.displayValue ?? 0) > 0,\n );\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n noteY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const scaled = Math.log1p(value) / Math.log1p(max);\n const index = Math.ceil(scaled * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction formatShortDate(dateIso: string) {\n return new Date(`${dateIso}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const noteY = legendBottomY + 14;\n const footerTopPadding = 48;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n noteY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n let firstActivityOnlyDate: string | null = null;\n let firstMeasuredDate: string | null = null;\n\n for (const row of daily) {\n const dateKey = formatLocalDate(row.date);\n const displayValue = row.displayValue ?? row.total;\n\n valueByDate.set(dateKey, displayValue);\n maxValue = Math.max(maxValue, displayValue);\n if (row.total <= 0 && displayValue > 0) {\n if (!firstActivityOnlyDate || dateKey < firstActivityOnlyDate) {\n firstActivityOnlyDate = dateKey;\n }\n } else if (row.total > 0 && (!firstMeasuredDate || dateKey < firstMeasuredDate)) {\n firstMeasuredDate = dateKey;\n }\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n const rectAttributes: Record<string, string | number> = {\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n };\n\n svg = svg.rect(rectAttributes);\n }\n }\n\n const transitionWeekIndex =\n firstActivityOnlyDate && firstMeasuredDate\n ? grid.weeks.findIndex((week) => week.includes(firstMeasuredDate))\n : -1;\n\n if (transitionWeekIndex > 0) {\n const lineX =\n x +\n layout.leftLabelWidth +\n transitionWeekIndex * (layout.cellSize + layout.gap) -\n Math.max(layout.gap, 2);\n const lineTop = y + layout.monthLabelY - 2;\n const lineBottom =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 2;\n\n svg = svg.line({\n x1: lineX,\n y1: lineTop,\n x2: lineX,\n y2: lineBottom,\n stroke: palette.muted,\n \"stroke-width\": 1,\n \"stroke-dasharray\": \"4 4\",\n \"stroke-opacity\": 0.65,\n });\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n if (firstActivityOnlyDate && firstMeasuredDate) {\n const noteX = x + layout.width / 2;\n const noteY =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 8;\n\n svg = svg.text(\n {\n x: noteX,\n y: noteY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `Claude started logging full token telemetry on ${formatShortDate(firstMeasuredDate)}; earlier activity may be undercounted.`,\n );\n }\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n formatLocalDate,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonDocument,\n readJsonLines,\n runWithConcurrency,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\nconst CLAUDE_STATS_CACHE_FILE_NAME = \"stats-cache.json\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\ninterface ClaudeStatsCacheModelUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface ClaudeStatsCacheEntry {\n date?: string;\n tokensByModel?: Record<string, number>;\n}\n\ninterface ClaudeStatsCache {\n dailyModelTokens?: ClaudeStatsCacheEntry[];\n modelUsage?: Record<string, ClaudeStatsCacheModelUsage>;\n}\n\ninterface ClaudeHistoryEntry {\n timestamp?: number | string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction getClaudeStatsCacheFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const statsCacheFile = join(basePath, CLAUDE_STATS_CACHE_FILE_NAME);\n\n if (existsSync(statsCacheFile) && !unique.has(statsCacheFile)) {\n unique.add(statsCacheFile);\n files.push(statsCacheFile);\n }\n }\n\n return files;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nfunction distributeTokenComponents(total: number, weights: number[]) {\n const weightSum = weights.reduce((sum, value) => sum + value, 0);\n\n if (total <= 0 || weightSum <= 0) {\n return weights.map(() => 0);\n }\n\n const exact = weights.map((weight) => (weight / weightSum) * total);\n const allocated = exact.map((value) => Math.floor(value));\n let remainder = total - allocated.reduce((sum, value) => sum + value, 0);\n const order = exact\n .map((value, index) => ({\n index,\n fraction: value - allocated[index],\n weight: weights[index],\n }))\n .sort((left, right) => {\n if (right.fraction !== left.fraction) {\n return right.fraction - left.fraction;\n }\n\n return right.weight - left.weight;\n });\n\n for (const { index } of order) {\n if (remainder <= 0) {\n break;\n }\n\n allocated[index] += 1;\n remainder -= 1;\n }\n\n return allocated;\n}\n\nfunction createStatsCacheTokenTotals(\n totalTokens: number,\n usage?: ClaudeStatsCacheModelUsage,\n): DailyTokenTotals {\n if (totalTokens <= 0) {\n return {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n }\n\n const inputTokens = usage?.inputTokens ?? 0;\n const outputTokens = usage?.outputTokens ?? 0;\n const cacheReadInputTokens = usage?.cacheReadInputTokens ?? 0;\n const cacheCreationInputTokens = usage?.cacheCreationInputTokens ?? 0;\n const [scaledInput, scaledOutput, scaledCacheRead, scaledCacheCreation] =\n distributeTokenComponents(totalTokens, [\n inputTokens,\n outputTokens,\n cacheReadInputTokens,\n cacheCreationInputTokens,\n ]);\n\n // Older Claude installs only keep daily totals in stats-cache.json, so\n // reconstruct the input/output/cache split from the cached model totals.\n if (\n scaledInput === 0 &&\n scaledOutput === 0 &&\n scaledCacheRead === 0 &&\n scaledCacheCreation === 0\n ) {\n return {\n input: totalTokens,\n output: 0,\n cache: { input: 0, output: 0 },\n total: totalTokens,\n };\n }\n\n return {\n input: scaledInput + scaledCacheRead,\n output: scaledOutput + scaledCacheCreation,\n cache: { input: scaledCacheRead, output: scaledCacheCreation },\n total: totalTokens,\n };\n}\n\nasync function getClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return files;\n}\n\nfunction getClaudeHistoryFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const historyFile = join(basePath, \"history.jsonl\");\n\n if (existsSync(historyFile) && !unique.has(historyFile)) {\n unique.add(historyFile);\n files.push(historyFile);\n }\n }\n\n return files;\n}\n\nasync function loadClaudeStatsCacheRows(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n recentStart: Date,\n) {\n const statsCacheFiles = getClaudeStatsCacheFiles();\n\n for (const file of statsCacheFiles) {\n let statsCache: ClaudeStatsCache;\n\n try {\n statsCache = await readJsonDocument<ClaudeStatsCache>(file);\n } catch {\n continue;\n }\n\n for (const row of statsCache.dailyModelTokens ?? []) {\n if (!row.date || coveredDates.has(row.date)) {\n continue;\n }\n\n const timestamp = new Date(`${row.date}T00:00:00`);\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp < startDate ||\n timestamp > endDate\n ) {\n continue;\n }\n\n for (const [rawModelName, totalTokens] of Object.entries(\n row.tokensByModel ?? {},\n )) {\n if (!Number.isFinite(totalTokens) || totalTokens <= 0) {\n continue;\n }\n\n const modelName = normalizeModelName(rawModelName);\n const tokenTotals = createStatsCacheTokenTotals(\n totalTokens,\n statsCache.modelUsage?.[rawModelName],\n );\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n }\n}\n\nasync function loadClaudeHistoryDisplayValues(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n displayValuesByDate: Map<string, number>,\n) {\n const historyFiles = getClaudeHistoryFiles();\n\n for (const file of historyFiles) {\n for await (const line of readJsonLines<ClaudeHistoryEntry>(file)) {\n const rawTimestamp = line.timestamp;\n const timestamp =\n typeof rawTimestamp === \"number\"\n ? new Date(rawTimestamp)\n : typeof rawTimestamp === \"string\"\n ? new Date(rawTimestamp)\n : null;\n\n if (!timestamp || Number.isNaN(timestamp.getTime())) {\n continue;\n }\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const dateKey = formatLocalDate(timestamp);\n\n if (coveredDates.has(dateKey)) {\n continue;\n }\n\n displayValuesByDate.set(dateKey, (displayValuesByDate.get(dateKey) ?? 0) + 1);\n }\n }\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const files = await getClaudeFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const displayValuesByDate = new Map<string, number>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n\n await runWithConcurrency(files, fileConcurrency, async (file) => {\n for await (const line of readJsonLines<ClaudeRawLogEntry>(file)) {\n const entry = parseClaudeLogEntry(line);\n\n if (!entry) {\n continue;\n }\n\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n });\n\n await loadClaudeStatsCacheRows(\n startDate,\n endDate,\n new Set(totals.keys()),\n totals,\n modelTotals,\n recentModelTotals,\n recentStart,\n );\n\n await loadClaudeHistoryDisplayValues(\n startDate,\n endDate,\n new Set(totals.keys()),\n displayValuesByDate,\n );\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n displayValuesByDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n MAX_JSONL_RECORD_BYTES_ENV,\n type JsonlRecordDecision,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n mergeDailyTotalsByDate,\n mergeModelTotals,\n normalizeModelName,\n readJsonlRecords,\n runWithConcurrency,\n} from \"./utils\";\nconst CLASSIFICATION_PREFIX_BYTES = 32 * 1024;\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\ninterface CodexFileProcessingResult {\n totals: DailyTotalsByDate;\n modelTotals: Map<string, ModelTokenTotals>;\n recentModelTotals: Map<string, ModelTokenTotals>;\n skippedOversizedIrrelevantRecords: number;\n}\n\ntype JsonContext =\n | {\n kind: \"array\";\n expecting: \"valueOrEnd\" | \"commaOrEnd\";\n }\n | {\n kind: \"object\";\n expecting: \"keyOrEnd\" | \"colon\" | \"value\" | \"commaOrEnd\";\n key?: string;\n isPayloadObject: boolean;\n };\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n return listFilesRecursive(join(codexHome, \"sessions\"), \".jsonl\");\n}\n\nfunction readJsonString(source: string, start: number) {\n if (source[start] !== '\"') {\n return null;\n }\n\n let value = \"\";\n let escaped = false;\n\n for (let index = start + 1; index < source.length; index += 1) {\n const char = source[index];\n\n if (escaped) {\n value += char;\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n return { value, nextIndex: index + 1 };\n }\n\n value += char;\n }\n\n return null;\n}\n\nfunction skipWhitespace(source: string, start: number) {\n let index = start;\n\n while (index < source.length && /\\s/.test(source[index])) {\n index += 1;\n }\n\n return index;\n}\n\nfunction skipPrimitive(source: string, start: number) {\n let index = start;\n\n while (index < source.length) {\n const char = source[index];\n\n if (char === \",\" || char === \"}\" || char === \"]\" || /\\s/.test(char)) {\n return index;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction classifyCodexRecord(\n source: string,\n): JsonlRecordDecision<\"turn_context\" | \"token_count\"> {\n const stack: JsonContext[] = [];\n let topLevelType: string | undefined;\n\n for (let index = 0; index < source.length; ) {\n index = skipWhitespace(source, index);\n\n if (index >= source.length) {\n break;\n }\n\n const char = source[index];\n\n if (stack.length === 0) {\n if (char !== \"{\") {\n return { kind: \"unknown\" };\n }\n\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n index += 1;\n continue;\n }\n\n const context = stack[stack.length - 1]!;\n\n if (context.kind === \"object\") {\n if (context.expecting === \"keyOrEnd\") {\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n const key = readJsonString(source, index);\n\n if (!key) {\n return { kind: \"unknown\" };\n }\n\n context.key = key.value;\n context.expecting = \"colon\";\n index = key.nextIndex;\n continue;\n }\n\n if (context.expecting === \"colon\") {\n if (char !== \":\") {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"value\";\n index += 1;\n continue;\n }\n\n if (context.expecting === \"value\") {\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: stack.length === 1 && context.key === \"payload\",\n });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n if (stack.length === 1 && context.key === \"type\") {\n topLevelType = value.value;\n\n if (value.value === \"turn_context\") {\n return { kind: \"keep\", classification: \"turn_context\" };\n }\n\n if (value.value !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n }\n\n if (context.isPayloadObject && context.key === \"type\") {\n if (value.value === \"token_count\") {\n return topLevelType === \"event_msg\"\n ? { kind: \"keep\", classification: \"token_count\" }\n : { kind: \"unknown\" };\n }\n\n return topLevelType === \"event_msg\"\n ? { kind: \"skip\" }\n : { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = skipPrimitive(source, index);\n continue;\n }\n\n {\n if (char === \",\") {\n context.expecting = \"keyOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n continue;\n }\n\n if (context.expecting === \"valueOrEnd\") {\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n index = skipPrimitive(source, index);\n continue;\n }\n\n if (char === \",\") {\n context.expecting = \"valueOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n if (topLevelType && topLevelType !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n\n return { kind: \"unknown\" };\n}\n\nasync function processCodexFile(\n filePath: string,\n start: Date,\n end: Date,\n maxRecordBytes: number,\n): Promise<CodexFileProcessingResult> {\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n let skippedOversizedIrrelevantRecords = 0;\n\n for await (const record of readJsonlRecords<\"turn_context\" | \"token_count\">(\n filePath,\n {\n classificationPrefixBytes: CLASSIFICATION_PREFIX_BYTES,\n classify: classifyCodexRecord,\n maxRecordBytes,\n onSkippedOversizedRecord: () => {\n skippedOversizedIrrelevantRecords += 1;\n },\n oversizedErrorMessage: ({ filePath, lineNumber, maxRecordBytes }) =>\n `Relevant Codex record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${MAX_JSONL_RECORD_BYTES_ENV} to process this file.`,\n },\n )) {\n let entry: CodexEventEntry;\n\n try {\n entry = JSON.parse(record.rawLine) as CodexEventEntry;\n } catch {\n continue;\n }\n\n const extractedModel = extractCodexModel(entry.payload);\n\n if (record.classification === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n const info = entry.payload?.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (!normalizedModelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n\n return {\n totals,\n modelTotals,\n recentModelTotals,\n skippedOversizedIrrelevantRecords,\n };\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n warnings: string[] = [],\n): Promise<UsageSummary> {\n const files = await getCodexFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const maxRecordBytes = getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n const results = new Array<CodexFileProcessingResult>(files.length);\n\n await runWithConcurrency(files, fileConcurrency, async (file, index) => {\n results[index] = await processCodexFile(file, start, end, maxRecordBytes);\n });\n\n let skippedOversizedIrrelevantRecords = 0;\n let skippedFiles = 0;\n\n for (const result of results) {\n mergeDailyTotalsByDate(totals, result.totals);\n mergeModelTotals(modelTotals, result.modelTotals);\n mergeModelTotals(recentModelTotals, result.recentModelTotals);\n\n if (result.skippedOversizedIrrelevantRecords > 0) {\n skippedOversizedIrrelevantRecords += result.skippedOversizedIrrelevantRecords;\n skippedFiles += 1;\n }\n }\n\n if (skippedOversizedIrrelevantRecords > 0) {\n warnings.push(\n `Skipped ${skippedOversizedIrrelevantRecords} oversized irrelevant Codex record(s) across ${skippedFiles} file(s); usage totals exclude those records. Relevant oversized records fail the file. Override ${MAX_JSONL_RECORD_BYTES_ENV} to raise the cap.`,\n );\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { existsSync } from \"node:fs\";\nimport { copyFile, mkdtemp, rm } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n parseJsonTextWithLimit,\n readJsonDocument,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n role?: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\ninterface OpenCodeMessageRow {\n id: string;\n data: string;\n}\n\ninterface OpenCodeDatabaseSource {\n kind: \"database\";\n path: string;\n}\n\ninterface OpenCodeLegacySource {\n kind: \"legacy\";\n files: string[];\n}\n\ntype OpenCodeSource = OpenCodeDatabaseSource | OpenCodeLegacySource;\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n return readJsonDocument<OpenCodeMessage>(filePath);\n}\n\nfunction getOpenCodeBaseDir() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n return baseDir;\n}\n\nasync function getOpenCodeSource(): Promise<OpenCodeSource> {\n const baseDir = getOpenCodeBaseDir();\n const databasePath = join(baseDir, \"opencode.db\");\n\n if (existsSync(databasePath)) {\n return { kind: \"database\", path: databasePath };\n }\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n return { kind: \"legacy\", files: await listFilesRecursive(messagesDir, \".json\") };\n}\n\nasync function loadSqliteModule() {\n try {\n const moduleName = \"node:sqlite\";\n\n return await import(moduleName);\n } catch {\n throw new Error(\n \"OpenCode SQLite support requires a Node.js runtime that provides node:sqlite.\",\n );\n }\n}\n\nasync function withoutSqliteExperimentalWarning<T>(callback: () => Promise<T>) {\n const originalEmitWarning = process.emitWarning.bind(process);\n\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const warningText =\n typeof warning === \"string\" ? warning : warning.message;\n const warningType =\n warning instanceof Error ? warning.name : String(args[0] ?? \"\");\n\n if (\n warningType === \"ExperimentalWarning\" &&\n /sqlite/i.test(warningText)\n ) {\n return;\n }\n\n return Reflect.apply(originalEmitWarning, process, [\n warning,\n ...args,\n ] as Parameters<typeof process.emitWarning>);\n }) as typeof process.emitWarning;\n\n try {\n return await callback();\n } finally {\n process.emitWarning = originalEmitWarning;\n }\n}\n\nfunction parseOpenCodeMessageData(\n rowId: string,\n sourceLabel: string,\n content: string,\n) {\n const message = parseJsonTextWithLimit<OpenCodeMessage>(content, sourceLabel);\n\n return {\n ...message,\n id: message.id || rowId,\n };\n}\n\nfunction isSqliteLockedError(error: unknown) {\n return error instanceof Error && /database is locked/i.test(error.message);\n}\n\nasync function withDatabaseSnapshot<T>(\n databasePath: string,\n callback: (snapshotPath: string) => Promise<T>,\n) {\n const snapshotDir = await mkdtemp(join(tmpdir(), \"slopmeter-opencode-\"));\n const snapshotPath = join(snapshotDir, \"opencode.db\");\n\n await copyFile(databasePath, snapshotPath);\n\n for (const suffix of [\"-shm\", \"-wal\"]) {\n const companionPath = `${databasePath}${suffix}`;\n\n if (!existsSync(companionPath)) {\n continue;\n }\n\n await copyFile(companionPath, `${snapshotPath}${suffix}`);\n }\n\n try {\n return await callback(snapshotPath);\n } finally {\n await rm(snapshotDir, { recursive: true, force: true });\n }\n}\n\nasync function iterateOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n await withoutSqliteExperimentalWarning(async () => {\n const { DatabaseSync } = await loadSqliteModule();\n const database = new DatabaseSync(databasePath, { readOnly: true });\n\n try {\n const statement = database.prepare(\n \"SELECT id, data FROM message ORDER BY time_created ASC\",\n );\n\n for (const row of statement.iterate() as Iterable<OpenCodeMessageRow>) {\n onMessage(\n parseOpenCodeMessageData(\n row.id,\n `${databasePath}:message:${row.id}`,\n row.data,\n ),\n );\n }\n } finally {\n database.close();\n }\n });\n}\n\nasync function loadOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n try {\n await iterateOpenCodeDatabaseMessages(databasePath, onMessage);\n } catch (error) {\n if (!isSqliteLockedError(error)) {\n throw error;\n }\n\n await withDatabaseSnapshot(databasePath, async (snapshotPath) => {\n await iterateOpenCodeDatabaseMessages(snapshotPath, onMessage);\n });\n }\n}\n\nfunction addOpenCodeMessage(\n message: OpenCodeMessage,\n start: Date,\n end: Date,\n recentStart: Date,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n dedupe: Set<string>,\n) {\n if (dedupe.has(message.id)) {\n return;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n return;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const source = await getOpenCodeSource();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n if (source.kind === \"database\") {\n await loadOpenCodeDatabaseMessages(source.path, (message) => {\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n });\n } else {\n for (const file of source.files) {\n const message = await parseOpenCodeFile(file);\n\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n requestedProviders?: ProviderId[];\n}\n\nexport interface AggregateUsageResult {\n rowsByProvider: Record<ProviderId, UsageSummary | null>;\n warnings: string[];\n}\n\nexport async function aggregateUsage({\n start,\n end,\n requestedProviders,\n}: AggregateUsageOptions): Promise<AggregateUsageResult> {\n const providersToLoad =\n requestedProviders?.length ? requestedProviders : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n const warnings: string[] = [];\n\n for (const provider of providersToLoad) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end, warnings)\n : await loadOpenCodeRows(start, end);\n\n rowsByProvider[provider] = hasUsage(summary) ? summary : null;\n }\n\n return { rowsByProvider, warnings };\n}\n"],"mappings":";;;AAAA,SAAS,WAAW,qBAAqB;AACzC,SAAS,SAAS,SAAS,WAAAA,gBAAe;AAC1C,SAAS,iBAAiB;AAC1B,OAAO,SAAuB;AAC9B,OAAO,QAAQ;AACf,OAAO,WAAW;;;ACLlB,IAAA,kBAAe;EACb,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;;EAEF,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,aAAa;IACX;IACA;IACA;;EAEF,OAAO;IACL;IACA;IACA;;EAEF,YAAY;IACV;IACA;IACA;IACA;IACA;;EAEF,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,kBAAkB;IAChB;IACA;IACA;IACA;;;;;AC/DJ,IAAA,qBAAe;EACb,gBAAgB;IACd;IACA;IACA;IACA;;EAEF,0BAA0B;IACxB;IACA;;EAEF,iBAAiB;IACf;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,gBAAgB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,mBAAmB;IACjB;IACA;;EAEF,MAAM;IACJ;IAAyB;IAAe;IAAqB;IAAa;IAAgB;IAAiB;IAAiB;IAAgB;IAAiB;IAAgB;IAAoB;IAAgB;IAAiB;IAAmB;IAAqB;IAAiB;IAAe;IAAgB;IAAiB;IAAe;IAAgB;IAAqB;IAAc;IAAmB;IAAc;IAAa;IAAc;IAAkB;IAAwB;IAAoB;IAAa;IAAoB;IAAiB;IAAgB;IAAiB;IAAiB;IAAiB;IAAwB;IAAiB;IAAiB;IAAgB;IAAiB;IAAgB;IAAa;IAAiB;IAAiB;IAAiB;IAAkB;;EAE3zB,uBAAuB;IACrB;IACA;IACA;;EAEF,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,eAAe;IACb;IACA;IACA;IACA;IACA;IACA;;EAEF,iBAAiB;IACf;IACA;IACA;IACA;IACA;;EAEF,gBAAgB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,cAAc;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,kBAAkB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,OAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA;;;;;AC7IJ,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B,oBAAI,IAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,CAAC;AAE1E,IAAM,kBAAN,MAAqB;;AAIrB,IAAM,iBACJ,OAAO,eAAe,cAClB,kBACC;AAEP,IAAM,UAAN,cAAsB,eAAc;EAUlC,YAAa,OAAsC,SAAwB;AACzE,UAAK;AACL,SAAK,mBAAmB;MACtB;MACA;;AAEF,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,sBAAsB;EAC7B;EAEU,iBAAc;AACtB,SAAK,iBAAgB;AACrB,SAAK,cAAa;AAClB,SAAK,sBAAsB,wBAAwB,IAAI,KAAK,IAAI;AAChE,SAAK,gBAAe;AACpB,SAAK,aAAY;AACjB,SAAK,KAAK,KAAK,KAAK;EACtB;EAEQ,MAAO,MAAqB;AAClC,WAAO,SAAS;EAClB;EAEQ,cAAe,QAA0BC,WAAkC;AACjF,UAAM,WAAqB,CAAA;AAC3B,WAAO,QAAQ,CAAC,UAAS;AACvB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAS,KAAK,GAAG,KAAK;AACtB;MACF;AACA,YAAM,SAASA,UAAS,KAAK;AAC7B,UAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,iBAAS,KAAK,GAAG,MAAM;AACvB;MACF;AACA,eAAS,KAAK,KAAK;IACrB,CAAC;AACD,WAAO;EACT;EAEA,gBAAa;AACX,QAAI,KAAK,MAAM,KAAK,gBAAgB,GAAG;AACrC;IACF;AACA,SAAK,mBAAmB,KAAK,cAAc,KAAK,kBAAkB,eAAe;EACnF;EAEA,mBAAgB;AACd,QAAI,KAAK,MAAM,KAAK,mBAAmB,GAAG;AACxC;IACF;AACA,UAAM,UAAU,IAAI,IAAY,KAAK,gBAAgB;AACrD,SAAK,cAAc,KAAK,qBAAqB,iBAAiB,EAAE,QAAQ,CAAC,cAAa;AACpF,cAAQ,IAAI,SAAS;IACvB,CAAC;AACD,SAAK,sBAAsB,MAAM,KAAK,OAAO;EAC/C;EAEA,eAAgB,SAAe;AAC7B,WAAO,QAAQ,MAAM,OAAO,EAAE,CAAC;EACjC;EAEA,kBAAe;AACb,QAAI,CAAC,KAAK,OAAO;AACf;IACF;AACA,QAAI,KAAK,MAAM,KAAK,mBAAmB,GAAG;AACxC;IACF;AACA,UAAM,gBAAgB,KAAK;AAE3B,UAAM,UAAU,oBAAI,IAAG;AAEvB,SAAK,iBAAiB,QAAQ,CAAC,UAAS;AACtC,WAAK,cAAc,CAAC,KAAK,GAAG,iBAAiB,EAAE,QAAQ,CAAC,cAAa;AACnE,gBAAQ,IAAI,SAAS;MACvB,CAAC;IACH,CAAC;AAED,SAAK,cAAc,eAAe,iBAAiB,EAAE,QAAQ,CAAC,cAAa;AACzE,cAAQ,IAAI,SAAS;IACvB,CAAC;AACD,YAAQ,IAAI,WAAW;AAEvB,WAAO,KAAK,KAAK,KAAK,EAAE,QAAQ,CAAC,cAAa;AAC5C,UAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3B,cAAM,IAAI,MAAM,KAAK,OAAO,uBAAuB,YAAY,aAAa;MAC9E;IACF,CAAC;EACH;EAEA,eAAY;AACV,QAAI,CAAC,KAAK,SAAS;AACjB;IACF;AACA,QAAI,OAAO,KAAK,YAAY,YAAY,CAAC,KAAK,qBAAqB;AACjE,YAAM,IAAI,MAAM,kCAAkC,KAAK,IAAI,YAAY;IACzE;AACA,QAAI,KAAK,MAAM,KAAK,gBAAgB,GAAG;AACrC;IACF;AACA,QAAI,OAAO,KAAK,YAAY,UAAU;AACpC;IACF;AACA,UAAM,kBAAkB,KAAK,QAAQ;AACrC,QAAI,CAAC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","maxBytes","join","join","homedir","join","resolve","resolve","join","homedir","filePath","maxRecordBytes","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n UsageProviderId,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport {\n aggregateUsage,\n mergeProviderUsage,\n providerIds,\n providerStatusLabel,\n} from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n all: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--all] [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --all Render one merged graph for all providers\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n all: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n displayValue: row.displayValue,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction getOutputProviders(\n values: CliArgValues,\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n end: Date,\n) {\n if (!values.all) {\n return selectProvidersToRender(rowsByProvider, getRequestedProviders(values));\n }\n\n const merged = mergeProviderUsage(rowsByProvider, end);\n\n if (!merged) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return [merged];\n}\n\nfunction getMergedProviderTitle(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n) {\n return providerIds\n .filter((provider) => rowsByProvider[provider] !== null)\n .map((provider) => heatmapThemes[provider].title)\n .join(\" / \");\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: UsageProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n all: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const requestedProviders = values.all ? providerIds : getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\n const { rowsByProvider, warnings } = await aggregateUsage({\n start,\n end,\n requestedProviders,\n });\n\n spinner.stop();\n\n for (const warning of warnings) {\n process.stderr.write(`${warning}\\n`);\n }\n\n printProviderAvailability(rowsByProvider, inspectedProviders);\n\n const exportProviders = getOutputProviders(\n values,\n rowsByProvider,\n end,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title:\n provider === \"all\"\n ? getMergedProviderTitle(rowsByProvider)\n : heatmapThemes[provider].title,\n titleCaption: heatmapThemes[provider].titleCaption,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const DEFAULT_FILE_PROCESS_CONCURRENCY = 4;\nexport const FILE_PROCESS_CONCURRENCY_ENV =\n \"SLOPMETER_FILE_PROCESS_CONCURRENCY\";\nexport const MAX_JSONL_RECORD_BYTES_ENV = \"SLOPMETER_MAX_JSONL_RECORD_BYTES\";\nexport const DEFAULT_MAX_JSONL_RECORD_BYTES = 64 * 1024 * 1024;\n\nexport interface JsonlRecord<TClassification = void> {\n lineNumber: number;\n rawLine: string;\n byteLength: number;\n classification: TClassification;\n}\n\nexport type JsonlRecordDecision<TClassification> =\n | { kind: \"keep\"; classification: TClassification }\n | { kind: \"skip\" }\n | { kind: \"unknown\" };\n\ninterface ReadJsonlRecordsOptions<TClassification> {\n classificationPrefixBytes?: number;\n classify?: (prefix: string) => JsonlRecordDecision<TClassification>;\n maxRecordBytes?: number;\n onSkippedOversizedRecord?: (record: {\n lineNumber: number;\n byteLength: number;\n }) => void;\n oversizedErrorMessage?: (record: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ReadJsonDocumentOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ParseJsonTextOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function mergeDailyTotalsByDate(\n target: DailyTotalsByDate,\n source: DailyTotalsByDate,\n) {\n for (const [dateKey, sourceTotals] of source.entries()) {\n const existing = target.get(dateKey);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n models.set(modelName, cloneTokenTotals(totals));\n }\n\n target.set(dateKey, {\n tokens: cloneTokenTotals(sourceTotals.tokens),\n models,\n });\n continue;\n }\n\n mergeTokenTotals(existing.tokens, sourceTotals.tokens);\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n addModelTokenTotals(existing.models, modelName, totals);\n }\n }\n}\n\nexport function mergeModelTotals(\n target: Map<string, ModelTokenTotals>,\n source: Map<string, ModelTokenTotals>,\n) {\n for (const [modelName, totals] of source.entries()) {\n addModelTokenTotals(target, modelName, totals);\n }\n}\n\nexport function totalsToRows(\n totals: DailyTotalsByDate,\n displayValuesByDate = new Map<string, number>(),\n): DailyUsage[] {\n const allDates = new Set<string>([\n ...totals.keys(),\n ...displayValuesByDate.keys(),\n ]);\n\n return [...allDates]\n .sort((a, b) => a.localeCompare(b))\n .map((date) => {\n const entry = totals.get(date);\n const tokens = entry?.tokens ?? {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n const models = entry?.models ?? new Map<string, ModelTokenTotals>();\n const displayValue =\n tokens.total > 0 ? tokens.total : (displayValuesByDate.get(date) ?? 0);\n\n return {\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n displayValue: displayValue > 0 ? displayValue : undefined,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n };\n });\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files.sort((left, right) => left.localeCompare(right));\n}\n\nfunction defaultOversizedJsonlRecordMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName,\n}: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n}) {\n return `JSONL record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonDocumentMessage({\n filePath,\n maxBytes,\n envVarName,\n}: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON document exceeds ${maxBytes} bytes in ${filePath}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonTextMessage({\n sourceLabel,\n maxBytes,\n envVarName,\n}: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON payload exceeds ${maxBytes} bytes in ${sourceLabel}. Increase ${envVarName} to process this payload.`;\n}\n\nfunction keepAllJsonlRecords<TClassification>(): JsonlRecordDecision<TClassification> {\n return { kind: \"keep\", classification: undefined as TClassification };\n}\n\nexport async function* readJsonlRecords<TClassification = void>(\n filePath: string,\n options: ReadJsonlRecordsOptions<TClassification> = {},\n): AsyncGenerator<JsonlRecord<TClassification>> {\n const maxRecordBytes =\n options.maxRecordBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const classificationPrefixBytes =\n options.classificationPrefixBytes ?? maxRecordBytes;\n const classify = options.classify ?? keepAllJsonlRecords<TClassification>;\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonlRecordMessage;\n const stream = createReadStream(filePath);\n let lineNumber = 0;\n let lineBytesSeen = 0;\n let retainedBytes = 0;\n let prefixBytes = 0;\n let exceededLimit = false;\n let decision: JsonlRecordDecision<TClassification> = { kind: \"unknown\" };\n let prefixChunks: Buffer[] = [];\n let retainedChunks: Buffer[] = [];\n\n const resetRecord = () => {\n lineBytesSeen = 0;\n retainedBytes = 0;\n prefixBytes = 0;\n exceededLimit = false;\n decision = { kind: \"unknown\" };\n prefixChunks = [];\n retainedChunks = [];\n };\n\n const maybeClassify = () => {\n if (decision.kind !== \"unknown\" || prefixBytes === 0) {\n return;\n }\n\n decision = classify(Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\"));\n\n if (decision.kind === \"skip\") {\n retainedChunks = [];\n retainedBytes = 0;\n }\n };\n\n const appendSegment = (segment: Buffer) => {\n if (segment.length === 0) {\n return;\n }\n\n lineBytesSeen += segment.length;\n\n if (prefixBytes < classificationPrefixBytes) {\n const prefixSegment = segment.subarray(\n 0,\n Math.min(segment.length, classificationPrefixBytes - prefixBytes),\n );\n\n prefixChunks.push(prefixSegment);\n prefixBytes += prefixSegment.length;\n maybeClassify();\n }\n\n if (decision.kind === \"skip\") {\n return;\n }\n\n const remainingBytes = maxRecordBytes - retainedBytes;\n\n if (remainingBytes > 0) {\n const retainedSegment = segment.subarray(\n 0,\n Math.min(segment.length, remainingBytes),\n );\n\n if (retainedSegment.length > 0) {\n retainedChunks.push(retainedSegment);\n retainedBytes += retainedSegment.length;\n }\n }\n\n if (segment.length > remainingBytes) {\n exceededLimit = true;\n }\n };\n\n const resolveDecision = () => {\n if (decision.kind !== \"unknown\") {\n return decision;\n }\n\n const candidate =\n exceededLimit || retainedBytes === 0\n ? Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\")\n : Buffer.concat(retainedChunks, retainedBytes).toString(\"utf8\");\n\n return classify(candidate);\n };\n\n const finalizeRecord = () => {\n lineNumber += 1;\n\n if (lineBytesSeen === 0 && !exceededLimit) {\n resetRecord();\n\n return null;\n }\n\n const resolvedDecision = resolveDecision();\n\n if (resolvedDecision.kind === \"skip\") {\n if (lineBytesSeen > maxRecordBytes) {\n options.onSkippedOversizedRecord?.({\n lineNumber,\n byteLength: lineBytesSeen,\n });\n }\n\n resetRecord();\n\n return null;\n }\n\n if (resolvedDecision.kind === \"unknown\") {\n resetRecord();\n\n return null;\n }\n\n if (lineBytesSeen > maxRecordBytes || exceededLimit) {\n throw new Error(\n oversizedErrorMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n const rawLine = Buffer.concat(retainedChunks, retainedBytes)\n .toString(\"utf8\")\n .trim();\n\n if (rawLine === \"\") {\n resetRecord();\n\n return null;\n }\n\n const record: JsonlRecord<TClassification> = {\n lineNumber,\n rawLine,\n byteLength: lineBytesSeen,\n classification: resolvedDecision.classification,\n };\n\n resetRecord();\n\n return record;\n };\n\n for await (const chunk of stream) {\n let start = 0;\n\n for (let index = 0; index < chunk.length; index += 1) {\n if (chunk[index] !== 0x0a) {\n continue;\n }\n\n appendSegment(chunk.subarray(start, index));\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n\n start = index + 1;\n }\n\n appendSegment(chunk.subarray(start));\n }\n\n if (lineBytesSeen > 0) {\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n }\n}\n\nexport async function* readJsonLines<T>(filePath: string): AsyncGenerator<T> {\n for await (const record of readJsonlRecords(filePath)) {\n try {\n yield JSON.parse(record.rawLine) as T;\n } catch {\n // Preserve existing behavior for malformed JSONL records.\n }\n }\n}\n\nexport async function readJsonDocument<T>(\n filePath: string,\n options: ReadJsonDocumentOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonDocumentMessage;\n const stream = createReadStream(filePath);\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n\n for await (const chunk of stream) {\n totalBytes += chunk.length;\n\n if (totalBytes > maxBytes) {\n stream.destroy();\n\n throw new Error(\n oversizedErrorMessage({\n filePath,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n chunks.push(chunk);\n }\n\n return parseJsonTextWithLimit<T>(\n Buffer.concat(chunks, totalBytes).toString(\"utf8\"),\n filePath,\n {\n maxBytes,\n oversizedErrorMessage: ({ sourceLabel, maxBytes, envVarName }) =>\n oversizedErrorMessage({\n filePath: sourceLabel,\n maxBytes,\n envVarName,\n }),\n },\n );\n}\n\nexport function parseJsonTextWithLimit<T>(\n content: string,\n sourceLabel: string,\n options: ParseJsonTextOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonTextMessage;\n\n if (Buffer.byteLength(content, \"utf8\") > maxBytes) {\n throw new Error(\n oversizedErrorMessage({\n sourceLabel,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n return JSON.parse(content) as T;\n}\n\nexport function getPositiveIntegerEnv(name: string, fallback: number) {\n const raw = process.env[name]?.trim();\n\n if (!raw) {\n return fallback;\n }\n\n const parsed = Number.parseInt(raw, 10);\n\n if (!Number.isFinite(parsed) || parsed < 1) {\n return fallback;\n }\n\n return parsed;\n}\n\nexport async function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n) {\n if (items.length === 0) {\n return;\n }\n\n const limit = Math.max(1, Math.min(concurrency, items.length));\n let nextIndex = 0;\n\n await Promise.all(\n Array.from({ length: limit }, async () => {\n for (;;) {\n const currentIndex = nextIndex;\n\n nextIndex += 1;\n\n if (currentIndex >= items.length) {\n return;\n }\n\n await worker(items[currentIndex], currentIndex);\n }\n }),\n );\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n const measuredDaily = daily.filter(\n (row) => (row.displayValue ?? row.total) > 0,\n );\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(measuredDaily),\n current: computeCurrentStreak(measuredDaily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n displayValuesByDate?: Map<string, number>,\n): UsageSummary {\n const daily = totalsToRows(totals, displayValuesByDate);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some(\n (row) => row.total > 0 || (row.displayValue ?? 0) > 0,\n );\n}\n\nexport function mergeUsageSummaries(\n provider: UsageSummary[\"provider\"],\n summaries: UsageSummary[],\n end: Date,\n): UsageSummary {\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const displayValuesByDate = new Map<string, number>();\n const recentStart = getRecentWindowStart(end, 30);\n\n for (const summary of summaries) {\n for (const row of summary.daily) {\n addDailyTokenTotals(totals, row.date, {\n input: row.input,\n output: row.output,\n cache: { input: row.cache.input, output: row.cache.output },\n total: row.total,\n });\n\n const dateKey = formatLocalDate(row.date);\n const displayValue = row.displayValue ?? row.total;\n\n if (displayValue > 0) {\n displayValuesByDate.set(\n dateKey,\n (displayValuesByDate.get(dateKey) ?? 0) + displayValue,\n );\n }\n\n const totalsForDate = totals.get(dateKey);\n\n if (totalsForDate) {\n for (const breakdown of row.breakdown) {\n addModelTokenTotals(\n totalsForDate.models,\n breakdown.name,\n breakdown.tokens,\n );\n addModelTokenTotals(modelTotals, breakdown.name, breakdown.tokens);\n\n if (row.date >= recentStart) {\n addModelTokenTotals(\n recentModelTotals,\n breakdown.name,\n breakdown.tokens,\n );\n }\n }\n }\n }\n }\n\n return createUsageSummary(\n provider,\n totals,\n modelTotals,\n recentModelTotals,\n end,\n displayValuesByDate,\n );\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ntype HeatmapThemeId = ProviderId | \"all\";\n\ninterface HeatmapTheme {\n title: string;\n titleCaption?: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n noteY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n titleCaption?: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n titleCaption?: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<HeatmapThemeId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n all: {\n title: \"Codex / Claude Code / Open Code\",\n titleCaption: \"Total usage from\",\n colors: {\n light: [\n \"#f0fdf4\", // green-50\n \"#bbf7d0\", // green-200\n \"#4ade80\", // green-400\n \"#16a34a\", // green-600\n \"#14532d\", // green-900\n ],\n dark: [\n \"#052e16\", // green-950\n \"#15803d\", // green-700\n \"#16a34a\", // green-600\n \"#4ade80\", // green-400\n \"#bbf7d0\", // green-200\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\nconst heatmapGamma = 0.7;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nconst emptyCellFill: Record<ColorMode, string> = {\n light: \"#f5f5f5\", // neutral-100\n dark: \"#262626\", // neutral-800\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const scaled = Math.pow(value / max, heatmapGamma);\n const index = Math.ceil(scaled * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction formatShortDate(dateIso: string) {\n return new Date(`${dateIso}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const noteY = legendBottomY + 14;\n const footerTopPadding = 48;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n noteY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n titleCaption,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const legendColors = [emptyCellFill[colorMode], ...colorsForMode.slice(1)];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n let firstActivityOnlyDate: string | null = null;\n let firstMeasuredDate: string | null = null;\n\n for (const row of daily) {\n const dateKey = formatLocalDate(row.date);\n const displayValue = row.displayValue ?? row.total;\n\n valueByDate.set(dateKey, displayValue);\n maxValue = Math.max(maxValue, displayValue);\n if (row.total <= 0 && displayValue > 0) {\n if (!firstActivityOnlyDate || dateKey < firstActivityOnlyDate) {\n firstActivityOnlyDate = dateKey;\n }\n } else if (row.total > 0 && (!firstMeasuredDate || dateKey < firstMeasuredDate)) {\n firstMeasuredDate = dateKey;\n }\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n if (titleCaption) {\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(titleCaption),\n );\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n } else {\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n }\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = value <= 0 ? emptyCellFill[colorMode] : colorsForMode[colorIndex];\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n const rectAttributes: Record<string, string | number> = {\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n };\n\n svg = svg.rect(rectAttributes);\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < legendColors.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: legendColors[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + legendColors.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n if (firstActivityOnlyDate && firstMeasuredDate) {\n const noteX = x + layout.width / 2;\n const noteY =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 8;\n\n svg = svg.text(\n {\n x: noteX,\n y: noteY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `Claude started logging full token telemetry on ${formatShortDate(firstMeasuredDate)}; earlier activity may be undercounted.`,\n );\n }\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n titleCaption: section.titleCaption,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n formatLocalDate,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonDocument,\n readJsonLines,\n runWithConcurrency,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\nconst CLAUDE_STATS_CACHE_FILE_NAME = \"stats-cache.json\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\ninterface ClaudeStatsCacheModelUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface ClaudeStatsCacheEntry {\n date?: string;\n tokensByModel?: Record<string, number>;\n}\n\ninterface ClaudeStatsCache {\n dailyModelTokens?: ClaudeStatsCacheEntry[];\n modelUsage?: Record<string, ClaudeStatsCacheModelUsage>;\n}\n\ninterface ClaudeHistoryEntry {\n timestamp?: number | string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction getClaudeStatsCacheFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const statsCacheFile = join(basePath, CLAUDE_STATS_CACHE_FILE_NAME);\n\n if (existsSync(statsCacheFile) && !unique.has(statsCacheFile)) {\n unique.add(statsCacheFile);\n files.push(statsCacheFile);\n }\n }\n\n return files;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nfunction distributeTokenComponents(total: number, weights: number[]) {\n const weightSum = weights.reduce((sum, value) => sum + value, 0);\n\n if (total <= 0 || weightSum <= 0) {\n return weights.map(() => 0);\n }\n\n const exact = weights.map((weight) => (weight / weightSum) * total);\n const allocated = exact.map((value) => Math.floor(value));\n let remainder = total - allocated.reduce((sum, value) => sum + value, 0);\n const order = exact\n .map((value, index) => ({\n index,\n fraction: value - allocated[index],\n weight: weights[index],\n }))\n .sort((left, right) => {\n if (right.fraction !== left.fraction) {\n return right.fraction - left.fraction;\n }\n\n return right.weight - left.weight;\n });\n\n for (const { index } of order) {\n if (remainder <= 0) {\n break;\n }\n\n allocated[index] += 1;\n remainder -= 1;\n }\n\n return allocated;\n}\n\nfunction createStatsCacheTokenTotals(\n totalTokens: number,\n usage?: ClaudeStatsCacheModelUsage,\n): DailyTokenTotals {\n if (totalTokens <= 0) {\n return {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n }\n\n const inputTokens = usage?.inputTokens ?? 0;\n const outputTokens = usage?.outputTokens ?? 0;\n const cacheReadInputTokens = usage?.cacheReadInputTokens ?? 0;\n const cacheCreationInputTokens = usage?.cacheCreationInputTokens ?? 0;\n const [scaledInput, scaledOutput, scaledCacheRead, scaledCacheCreation] =\n distributeTokenComponents(totalTokens, [\n inputTokens,\n outputTokens,\n cacheReadInputTokens,\n cacheCreationInputTokens,\n ]);\n\n // Older Claude installs only keep daily totals in stats-cache.json, so\n // reconstruct the input/output/cache split from the cached model totals.\n if (\n scaledInput === 0 &&\n scaledOutput === 0 &&\n scaledCacheRead === 0 &&\n scaledCacheCreation === 0\n ) {\n return {\n input: totalTokens,\n output: 0,\n cache: { input: 0, output: 0 },\n total: totalTokens,\n };\n }\n\n return {\n input: scaledInput + scaledCacheRead,\n output: scaledOutput + scaledCacheCreation,\n cache: { input: scaledCacheRead, output: scaledCacheCreation },\n total: totalTokens,\n };\n}\n\nasync function getClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return files;\n}\n\nfunction getClaudeHistoryFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const historyFile = join(basePath, \"history.jsonl\");\n\n if (existsSync(historyFile) && !unique.has(historyFile)) {\n unique.add(historyFile);\n files.push(historyFile);\n }\n }\n\n return files;\n}\n\nasync function loadClaudeStatsCacheRows(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n recentStart: Date,\n) {\n const statsCacheFiles = getClaudeStatsCacheFiles();\n\n for (const file of statsCacheFiles) {\n let statsCache: ClaudeStatsCache;\n\n try {\n statsCache = await readJsonDocument<ClaudeStatsCache>(file);\n } catch {\n continue;\n }\n\n for (const row of statsCache.dailyModelTokens ?? []) {\n if (!row.date || coveredDates.has(row.date)) {\n continue;\n }\n\n const timestamp = new Date(`${row.date}T00:00:00`);\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp < startDate ||\n timestamp > endDate\n ) {\n continue;\n }\n\n for (const [rawModelName, totalTokens] of Object.entries(\n row.tokensByModel ?? {},\n )) {\n if (!Number.isFinite(totalTokens) || totalTokens <= 0) {\n continue;\n }\n\n const modelName = normalizeModelName(rawModelName);\n const tokenTotals = createStatsCacheTokenTotals(\n totalTokens,\n statsCache.modelUsage?.[rawModelName],\n );\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n }\n}\n\nasync function loadClaudeHistoryDisplayValues(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n displayValuesByDate: Map<string, number>,\n) {\n const historyFiles = getClaudeHistoryFiles();\n\n for (const file of historyFiles) {\n for await (const line of readJsonLines<ClaudeHistoryEntry>(file)) {\n const rawTimestamp = line.timestamp;\n const timestamp =\n typeof rawTimestamp === \"number\"\n ? new Date(rawTimestamp)\n : typeof rawTimestamp === \"string\"\n ? new Date(rawTimestamp)\n : null;\n\n if (!timestamp || Number.isNaN(timestamp.getTime())) {\n continue;\n }\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const dateKey = formatLocalDate(timestamp);\n\n if (coveredDates.has(dateKey)) {\n continue;\n }\n\n displayValuesByDate.set(dateKey, (displayValuesByDate.get(dateKey) ?? 0) + 1);\n }\n }\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const files = await getClaudeFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const displayValuesByDate = new Map<string, number>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n\n await runWithConcurrency(files, fileConcurrency, async (file) => {\n for await (const line of readJsonLines<ClaudeRawLogEntry>(file)) {\n const entry = parseClaudeLogEntry(line);\n\n if (!entry) {\n continue;\n }\n\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n });\n\n await loadClaudeStatsCacheRows(\n startDate,\n endDate,\n new Set(totals.keys()),\n totals,\n modelTotals,\n recentModelTotals,\n recentStart,\n );\n\n await loadClaudeHistoryDisplayValues(\n startDate,\n endDate,\n new Set(totals.keys()),\n displayValuesByDate,\n );\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n displayValuesByDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n MAX_JSONL_RECORD_BYTES_ENV,\n type JsonlRecordDecision,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n mergeDailyTotalsByDate,\n mergeModelTotals,\n normalizeModelName,\n readJsonlRecords,\n runWithConcurrency,\n} from \"./utils\";\nconst CLASSIFICATION_PREFIX_BYTES = 32 * 1024;\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\ninterface CodexFileProcessingResult {\n totals: DailyTotalsByDate;\n modelTotals: Map<string, ModelTokenTotals>;\n recentModelTotals: Map<string, ModelTokenTotals>;\n skippedOversizedIrrelevantRecords: number;\n}\n\ntype JsonContext =\n | {\n kind: \"array\";\n expecting: \"valueOrEnd\" | \"commaOrEnd\";\n }\n | {\n kind: \"object\";\n expecting: \"keyOrEnd\" | \"colon\" | \"value\" | \"commaOrEnd\";\n key?: string;\n isPayloadObject: boolean;\n };\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n return listFilesRecursive(join(codexHome, \"sessions\"), \".jsonl\");\n}\n\nfunction readJsonString(source: string, start: number) {\n if (source[start] !== '\"') {\n return null;\n }\n\n let value = \"\";\n let escaped = false;\n\n for (let index = start + 1; index < source.length; index += 1) {\n const char = source[index];\n\n if (escaped) {\n value += char;\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n return { value, nextIndex: index + 1 };\n }\n\n value += char;\n }\n\n return null;\n}\n\nfunction skipWhitespace(source: string, start: number) {\n let index = start;\n\n while (index < source.length && /\\s/.test(source[index])) {\n index += 1;\n }\n\n return index;\n}\n\nfunction skipPrimitive(source: string, start: number) {\n let index = start;\n\n while (index < source.length) {\n const char = source[index];\n\n if (char === \",\" || char === \"}\" || char === \"]\" || /\\s/.test(char)) {\n return index;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction classifyCodexRecord(\n source: string,\n): JsonlRecordDecision<\"turn_context\" | \"token_count\"> {\n const stack: JsonContext[] = [];\n let topLevelType: string | undefined;\n\n for (let index = 0; index < source.length; ) {\n index = skipWhitespace(source, index);\n\n if (index >= source.length) {\n break;\n }\n\n const char = source[index];\n\n if (stack.length === 0) {\n if (char !== \"{\") {\n return { kind: \"unknown\" };\n }\n\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n index += 1;\n continue;\n }\n\n const context = stack[stack.length - 1]!;\n\n if (context.kind === \"object\") {\n if (context.expecting === \"keyOrEnd\") {\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n const key = readJsonString(source, index);\n\n if (!key) {\n return { kind: \"unknown\" };\n }\n\n context.key = key.value;\n context.expecting = \"colon\";\n index = key.nextIndex;\n continue;\n }\n\n if (context.expecting === \"colon\") {\n if (char !== \":\") {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"value\";\n index += 1;\n continue;\n }\n\n if (context.expecting === \"value\") {\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: stack.length === 1 && context.key === \"payload\",\n });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n if (stack.length === 1 && context.key === \"type\") {\n topLevelType = value.value;\n\n if (value.value === \"turn_context\") {\n return { kind: \"keep\", classification: \"turn_context\" };\n }\n\n if (value.value !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n }\n\n if (context.isPayloadObject && context.key === \"type\") {\n if (value.value === \"token_count\") {\n return topLevelType === \"event_msg\"\n ? { kind: \"keep\", classification: \"token_count\" }\n : { kind: \"unknown\" };\n }\n\n return topLevelType === \"event_msg\"\n ? { kind: \"skip\" }\n : { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = skipPrimitive(source, index);\n continue;\n }\n\n {\n if (char === \",\") {\n context.expecting = \"keyOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n continue;\n }\n\n if (context.expecting === \"valueOrEnd\") {\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n index = skipPrimitive(source, index);\n continue;\n }\n\n if (char === \",\") {\n context.expecting = \"valueOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n if (topLevelType && topLevelType !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n\n return { kind: \"unknown\" };\n}\n\nasync function processCodexFile(\n filePath: string,\n start: Date,\n end: Date,\n maxRecordBytes: number,\n): Promise<CodexFileProcessingResult> {\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n let skippedOversizedIrrelevantRecords = 0;\n\n for await (const record of readJsonlRecords<\"turn_context\" | \"token_count\">(\n filePath,\n {\n classificationPrefixBytes: CLASSIFICATION_PREFIX_BYTES,\n classify: classifyCodexRecord,\n maxRecordBytes,\n onSkippedOversizedRecord: () => {\n skippedOversizedIrrelevantRecords += 1;\n },\n oversizedErrorMessage: ({ filePath, lineNumber, maxRecordBytes }) =>\n `Relevant Codex record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${MAX_JSONL_RECORD_BYTES_ENV} to process this file.`,\n },\n )) {\n let entry: CodexEventEntry;\n\n try {\n entry = JSON.parse(record.rawLine) as CodexEventEntry;\n } catch {\n continue;\n }\n\n const extractedModel = extractCodexModel(entry.payload);\n\n if (record.classification === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n const info = entry.payload?.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (!normalizedModelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n\n return {\n totals,\n modelTotals,\n recentModelTotals,\n skippedOversizedIrrelevantRecords,\n };\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n warnings: string[] = [],\n): Promise<UsageSummary> {\n const files = await getCodexFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const maxRecordBytes = getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n const results = new Array<CodexFileProcessingResult>(files.length);\n\n await runWithConcurrency(files, fileConcurrency, async (file, index) => {\n results[index] = await processCodexFile(file, start, end, maxRecordBytes);\n });\n\n let skippedOversizedIrrelevantRecords = 0;\n let skippedFiles = 0;\n\n for (const result of results) {\n mergeDailyTotalsByDate(totals, result.totals);\n mergeModelTotals(modelTotals, result.modelTotals);\n mergeModelTotals(recentModelTotals, result.recentModelTotals);\n\n if (result.skippedOversizedIrrelevantRecords > 0) {\n skippedOversizedIrrelevantRecords += result.skippedOversizedIrrelevantRecords;\n skippedFiles += 1;\n }\n }\n\n if (skippedOversizedIrrelevantRecords > 0) {\n warnings.push(\n `Skipped ${skippedOversizedIrrelevantRecords} oversized irrelevant Codex record(s) across ${skippedFiles} file(s); usage totals exclude those records. Relevant oversized records fail the file. Override ${MAX_JSONL_RECORD_BYTES_ENV} to raise the cap.`,\n );\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","export type ProviderId = \"claude\" | \"codex\" | \"opencode\";\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { existsSync } from \"node:fs\";\nimport { copyFile, mkdtemp, rm } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n parseJsonTextWithLimit,\n readJsonDocument,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n role?: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\ninterface OpenCodeMessageRow {\n id: string;\n data: string;\n}\n\ninterface OpenCodeDatabaseSource {\n kind: \"database\";\n path: string;\n}\n\ninterface OpenCodeLegacySource {\n kind: \"legacy\";\n files: string[];\n}\n\ntype OpenCodeSource = OpenCodeDatabaseSource | OpenCodeLegacySource;\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n return readJsonDocument<OpenCodeMessage>(filePath);\n}\n\nfunction getOpenCodeBaseDir() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n return baseDir;\n}\n\nasync function getOpenCodeSource(): Promise<OpenCodeSource> {\n const baseDir = getOpenCodeBaseDir();\n const databasePath = join(baseDir, \"opencode.db\");\n\n if (existsSync(databasePath)) {\n return { kind: \"database\", path: databasePath };\n }\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n return { kind: \"legacy\", files: await listFilesRecursive(messagesDir, \".json\") };\n}\n\nasync function loadSqliteModule() {\n try {\n const moduleName = \"node:sqlite\";\n\n return await import(moduleName);\n } catch {\n throw new Error(\n \"OpenCode SQLite support requires a Node.js runtime that provides node:sqlite.\",\n );\n }\n}\n\nasync function withoutSqliteExperimentalWarning<T>(callback: () => Promise<T>) {\n const originalEmitWarning = process.emitWarning.bind(process);\n\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const warningText =\n typeof warning === \"string\" ? warning : warning.message;\n const warningType =\n warning instanceof Error ? warning.name : String(args[0] ?? \"\");\n\n if (\n warningType === \"ExperimentalWarning\" &&\n /sqlite/i.test(warningText)\n ) {\n return;\n }\n\n return Reflect.apply(originalEmitWarning, process, [\n warning,\n ...args,\n ] as Parameters<typeof process.emitWarning>);\n }) as typeof process.emitWarning;\n\n try {\n return await callback();\n } finally {\n process.emitWarning = originalEmitWarning;\n }\n}\n\nfunction parseOpenCodeMessageData(\n rowId: string,\n sourceLabel: string,\n content: string,\n) {\n const message = parseJsonTextWithLimit<OpenCodeMessage>(content, sourceLabel);\n\n return {\n ...message,\n id: message.id || rowId,\n };\n}\n\nfunction isSqliteLockedError(error: unknown) {\n return error instanceof Error && /database is locked/i.test(error.message);\n}\n\nasync function withDatabaseSnapshot<T>(\n databasePath: string,\n callback: (snapshotPath: string) => Promise<T>,\n) {\n const snapshotDir = await mkdtemp(join(tmpdir(), \"slopmeter-opencode-\"));\n const snapshotPath = join(snapshotDir, \"opencode.db\");\n\n await copyFile(databasePath, snapshotPath);\n\n for (const suffix of [\"-shm\", \"-wal\"]) {\n const companionPath = `${databasePath}${suffix}`;\n\n if (!existsSync(companionPath)) {\n continue;\n }\n\n await copyFile(companionPath, `${snapshotPath}${suffix}`);\n }\n\n try {\n return await callback(snapshotPath);\n } finally {\n await rm(snapshotDir, { recursive: true, force: true });\n }\n}\n\nasync function iterateOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n await withoutSqliteExperimentalWarning(async () => {\n const { DatabaseSync } = await loadSqliteModule();\n const database = new DatabaseSync(databasePath, { readOnly: true });\n\n try {\n const statement = database.prepare(\n \"SELECT id, data FROM message ORDER BY time_created ASC\",\n );\n\n for (const row of statement.iterate() as Iterable<OpenCodeMessageRow>) {\n onMessage(\n parseOpenCodeMessageData(\n row.id,\n `${databasePath}:message:${row.id}`,\n row.data,\n ),\n );\n }\n } finally {\n database.close();\n }\n });\n}\n\nasync function loadOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n try {\n await iterateOpenCodeDatabaseMessages(databasePath, onMessage);\n } catch (error) {\n if (!isSqliteLockedError(error)) {\n throw error;\n }\n\n await withDatabaseSnapshot(databasePath, async (snapshotPath) => {\n await iterateOpenCodeDatabaseMessages(snapshotPath, onMessage);\n });\n }\n}\n\nfunction addOpenCodeMessage(\n message: OpenCodeMessage,\n start: Date,\n end: Date,\n recentStart: Date,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n dedupe: Set<string>,\n) {\n if (dedupe.has(message.id)) {\n return;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n return;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const source = await getOpenCodeSource();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n if (source.kind === \"database\") {\n await loadOpenCodeDatabaseMessages(source.path, (message) => {\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n });\n } else {\n for (const file of source.files) {\n const message = await parseOpenCodeFile(file);\n\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage, mergeUsageSummaries } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n requestedProviders?: ProviderId[];\n}\n\nexport interface AggregateUsageResult {\n rowsByProvider: Record<ProviderId, UsageSummary | null>;\n warnings: string[];\n}\n\nexport function mergeProviderUsage(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n end: Date,\n): UsageSummary | null {\n const summaries = providerIds\n .map((provider) => rowsByProvider[provider])\n .filter((summary): summary is UsageSummary => summary !== null);\n\n if (summaries.length === 0) {\n return null;\n }\n\n return mergeUsageSummaries(\"all\", summaries, end);\n}\n\nexport async function aggregateUsage({\n start,\n end,\n requestedProviders,\n}: AggregateUsageOptions): Promise<AggregateUsageResult> {\n const providersToLoad =\n requestedProviders?.length ? requestedProviders : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n const warnings: string[] = [];\n\n for (const provider of providersToLoad) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end, warnings)\n : await loadOpenCodeRows(start, end);\n\n rowsByProvider[provider] = hasUsage(summary) ? summary : null;\n }\n\n return { rowsByProvider, warnings };\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AAIC,IAAM,6BAA8E;EACzF,UAAU;IACN;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;;EAEJ,WAAW;IACP;;EAEJ,YAAY;IACR;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;;EAEJ,OAAO;IACH;IACA;IACA;;;;;ACz4IN,IAAM,oBAAuC,CAAC,cAAc;AAC5D,IAAM,iBAAiB,oBAAI,IAAG;AAE9B,IAAM,qBAAqB,CAAC,SAAwC;AAClE,QAAM,SAAS,eAAe,IAAI,IAAI;AACtC,MAAI,QAAQ;AACV,WAAO;EACT;AACA,QAAM,UAAU,0BAA0B,IAAI;AAE9C,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,mBAAe,IAAI,MAAM,iBAAiB;AAC1C,WAAO;EACT;AACA,QAAM,SAAmB,CAAC,cAAc;AACxC,UAAQ,QAAQ,CAAC,UAAS;AACxB,UAAM,YAAY,gBAAgB,KAAK;AACvC,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;IACvB;EACF,CAAC;AAED,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,UAAU,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1C,mBAAe,IAAI,MAAM,OAAO;AAChC,WAAO;EACT;AACA,iBAAe,IAAI,MAAM,iBAAiB;AAC1C,SAAO;AACT;AAEA,IAAM,2BAA2B,CAAC,SAAyC;AACzE,SAAO,MAAM,yBAAyB,QAAO;IAC3C,YAAY,OAA2B,SAAwB;AAC7D,YAAM,OAAO,OAAO;AACpB,WAAK,OAAO;AACZ,YAAM,kBAAkB,mBAAmB,IAAI;AAC/C,YAAM,kBAAkB,2BAA2B,IAAI,KAAK,CAAA;AAC5D,YAAM,qBAAqB,gBACxB,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,EACrC,OAAO,CAAC,SAAiC,QAAQ,IAAI,CAAC;AAEzD,WAAK,sBAAsB,MAAM,KAAK,oBAAI,IAAI;QAC5C,GAAG;QACH,GAAG;OACJ,CAAC;AACF,WAAK,mBAAmB;AACxB,WAAK,eAAc;IACrB;;AAEJ;AAEA,IAAM,WAAW,cAAc,OAAwB,CAAC,aAAa,SAAQ;AAC3E,cAAY,IAAI,IAAI,yBAAyB,IAAI;AACjD,SAAO;AACT,GAAG,CAAA,CAAqB;AAexB,IAAA,mBAAe;;;AC/Cf,IAAM,aAAa,CAAC,UAA8B,MAAc,UAAkC;AAChG,QAAM,SAAS,IAAI,OAAO,OAAO,2BAA2B;AAC5D,SAAO,SAAS,KAAK,QAAQ,QAAQ,OAAO,OAAO,QAAQ,GAAG;AAChE;AAQA,IAAM,oBAAoB,CAAC,QAAqB,eAA4C;AAC1F,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,cAAe,MAA6C;AAClE,SAAO,eAAe,OAAO,YAAY,SAAS,aAAa,cAAc;AAC/E;AAIA,IAAM,gBAAgB,CAAC,QAAqB,eAAkC;AAC5E,MAAI,OAAO,gBAAgB,aAAa;AACtC,WAAO,IAAI,YAAW;EACxB;AACA,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,gBAAiB,MAAmD;AAC1E,MAAI,eAAe;AACjB,WAAO,IAAI,cAAa;EAC1B;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,UAA6B;AACnD,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,IAAI,WAAW,MAAM;AACpC,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAClC,WAAO,CAAC,IAAI,MAAM,WAAW,CAAC,IAAI;EACpC;AACA,SAAO;AACT;AAEA,IAAM,aAAa,kBAAiB;AACpC,IAAM,cAAc,aAAa,OAAO,cAAa;AAErD,SAAS,aAAU;AACjB,OAAK,OAAO;AACZ,OAAK,WAAW,CAAA;AAEhB,OAAK,WAAW,CAAC,SAAwB;AACvC,WAAO,OAAO,OAAO;EACvB;AAEA,OAAK,QAAQ,CAAC,UAA8C;AAC1D,SAAK,OAAO,WAAW,MAAM,SAAS,KAAK;AAC3C,WAAO;EACT;AAEA,OAAK,SAAS,CAAC,UAA8C;AAC3D,SAAK,OAAO,WAAW,MAAM,UAAU,KAAK;AAC5C,WAAO;EACT;AAEA,OAAK,UAAU,CAAC,UAAqC;AACnD,SAAK,OAAO,KAAK,KAAK,QAAQ,SAAS,iBAAiB,KAAK,IAAI;AACjE,WAAO;EACT;AAEA,OAAK,aAAa,CAAC,YAAwB;AACzC,QAAI,CAAC,QAAQ,SAAS;AACpB,cAAQ,QAAQ,KAAK,SAAS,QAAQ,IAAI;AAC1C,WAAK,SAAS,KAAK,QAAQ,IAAI;IACjC,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC9C,UAAI,QAAQ,qBAAqB;AAC/B,gBAAQ,QAAQ,QAAQ,UAAU,KAAK,SAAS,QAAQ,IAAI;AAC5D,aAAK,SAAS,KAAK,QAAQ,IAAI;MACjC,OAAO;AACL,gBAAQ,QAAQ,KAAK,SAAS,QAAQ,IAAI;AAC1C,aAAK,SAAS,KAAK,QAAQ,IAAI;MACjC;IACF,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC9C,YAAM,cAAc,QAAQ;AAC5B,YAAM,cAAc,MAAM,QAAQ,YAAY,QAAQ,IAClD,YAAY,SAAS,KAAK,EAAE,IAC5B;AACJ,cAAQ,QAAQ,cAAc,KAAK,SAAS,QAAQ,IAAI;AACxD,WAAK,SAAS,KAAK,QAAQ,IAAI;IACjC;EACF;AACF;AAEA,IAAM,iBAAiB;AAEvB,eAAe,UAAU,cAAc,SAAS,cAAW;AACzD,SAAO,IAAI,eAAc;AAC3B;AAEA,eAAe,UAAU,QAAQ,SAAS,QAAK;AAC7C,OAAK,WAAW,CAAA;AAChB,SAAO;AACT;AAEA,eAAe,UAAU,SAAS,SAAS,SAAM;AAC/C,SAAO,KAAK,OAAO,KAAK,SAAS,KAAK,EAAE,IAAI,KAAK,SAAS,KAAK;AACjE;AAEA,eAAe,UAAU,SAAS,SAAS,SAAM;AAC/C,QAAM,SAAS,KAAK,OAAM;AAC1B,MAAI,YAAY;AACd,WAAO,WAAW,KAAK,MAAM;EAC/B;AACA,MAAI,aAAa;AACf,WAAO,YAAY,OAAO,MAAM;EAClC;AACA,SAAO,eAAe,MAAM;AAC9B;AAEA,cAAc,QAAQ,CAAC,SAAqB;AAC1C,QAAM,cAAkC,iBAAgB,IAAI;AAC5D,iBAAe,UAAU,IAAI,IAAI,SAAS,cAExC,OACA,SAAwB;AAExB,SAAK,WAAW,IAAI,YAAY,OAAO,OAAO,CAAC;AAC/C,WAAO;EACT;AACF,CAAC;AAED,IAAM,kBAAkB,IAAI,eAAc;AAC1C,IAAM,cAAc,gBAAgB;AACpC,IAAI,iBAA4C;AAEhD,IAAM,SAAS,MAAyB;AACtC,mBAAiB,IAAI,eAAc;AACnC,SAAO;AACT;AAEA,IAAM,gBAAgB,MAAyB;AAC7C,MAAI,gBAAgB;AAClB,WAAO;EACT;AACA,mBAAiB,IAAI,eAAc;AACnC,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,YAA+B;AACnD,UAAQ,MAAK;AACb,UAAQ,OAAO;AACjB;AAEA,IAAM,aAAa;EACjB;EACA,aAAa,MAAyB;AACpC,UAAM,UAAU,cAAa;AAC7B,iBAAa,OAAO;AACpB,WAAO;EACT;;AAGF,IAAA,cAAe;;;ACxMf,SAAS,wBAAwB;AACjC,SAAS,eAAe;AACxB,SAAS,YAAY;AAGd,SAAS,gBAAgB,MAAY;AAC1C,QAAM,IAAI,KAAK,YAAY;AAC3B,QAAM,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAEhD,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB;AAuBA,IAAM,aAAa,KAAK,KAAK,KAAK;AAE3B,IAAM,mCAAmC;AACzC,IAAM,+BACX;AACK,IAAM,6BAA6B;AACnC,IAAM,iCAAiC,KAAK,OAAO;AAgD1D,SAAS,iBACP,QACkB;AAClB,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,OAAO,EAAE,OAAO,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO;AAAA,IAChE,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,SAAS,iBACP,QACA,QACA;AACA,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AACxB,SAAO,MAAM,SAAS,OAAO,MAAM;AACnC,SAAO,MAAM,UAAU,OAAO,MAAM;AACpC,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,oBACd,aACA,WACA,aACA;AACA,QAAM,WAAW,YAAY,IAAI,SAAS;AAE1C,MAAI,CAAC,UAAU;AACb,gBAAY,IAAI,WAAW,iBAAiB,WAAW,CAAC;AAExD;AAAA,EACF;AAEA,mBAAiB,UAAU,WAAW;AACxC;AAEO,SAAS,oBACd,QACA,MACA,aACA,WACA;AACA,QAAM,MAAM,gBAAgB,IAAI;AAChC,QAAM,WAAW,OAAO,IAAI,GAAG;AAE/B,MAAI,CAAC,UAAU;AACb,UAAM,SAAS,oBAAI,IAA8B;AAEjD,QAAI,WAAW;AACb,aAAO,IAAI,WAAW,iBAAiB,WAAW,CAAC;AAAA,IACrD;AACA,WAAO,IAAI,KAAK,EAAE,QAAQ,iBAAiB,WAAW,GAAG,OAAO,CAAC;AAEjE;AAAA,EACF;AAEA,mBAAiB,SAAS,QAAQ,WAAW;AAE7C,MAAI,WAAW;AACb,wBAAoB,SAAS,QAAQ,WAAW,WAAW;AAAA,EAC7D;AACF;AAEO,SAAS,uBACd,QACA,QACA;AACA,aAAW,CAAC,SAAS,YAAY,KAAK,OAAO,QAAQ,GAAG;AACtD,UAAM,WAAW,OAAO,IAAI,OAAO;AAEnC,QAAI,CAAC,UAAU;AACb,YAAM,SAAS,oBAAI,IAA8B;AAEjD,iBAAW,CAAC,WAAW,MAAM,KAAK,aAAa,OAAO,QAAQ,GAAG;AAC/D,eAAO,IAAI,WAAW,iBAAiB,MAAM,CAAC;AAAA,MAChD;AAEA,aAAO,IAAI,SAAS;AAAA,QAClB,QAAQ,iBAAiB,aAAa,MAAM;AAAA,QAC5C;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,qBAAiB,SAAS,QAAQ,aAAa,MAAM;AAErD,eAAW,CAAC,WAAW,MAAM,KAAK,aAAa,OAAO,QAAQ,GAAG;AAC/D,0BAAoB,SAAS,QAAQ,WAAW,MAAM;AAAA,IACxD;AAAA,EACF;AACF;AAEO,SAAS,iBACd,QACA,QACA;AACA,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,GAAG;AAClD,wBAAoB,QAAQ,WAAW,MAAM;AAAA,EAC/C;AACF;AAEO,SAAS,aACd,QACA,sBAAsB,oBAAI,IAAoB,GAChC;AACd,QAAM,WAAW,oBAAI,IAAY;AAAA,IAC/B,GAAG,OAAO,KAAK;AAAA,IACf,GAAG,oBAAoB,KAAK;AAAA,EAC9B,CAAC;AAED,SAAO,CAAC,GAAG,QAAQ,EAChB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EACjC,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,UAAM,SAAS,OAAO,UAAU;AAAA,MAC9B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC7B,OAAO;AAAA,IACT;AACA,UAAM,SAAS,OAAO,UAAU,oBAAI,IAA8B;AAClE,UAAM,eACJ,OAAO,QAAQ,IAAI,OAAO,QAAS,oBAAoB,IAAI,IAAI,KAAK;AAEtE,WAAO;AAAA,MACL,MAAM,oBAAI,KAAK,GAAG,IAAI,WAAW;AAAA,MACjC,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,OAAO,EAAE,OAAO,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO;AAAA,MAChE,OAAO,OAAO;AAAA,MACd,cAAc,eAAe,IAAI,eAAe;AAAA,MAChD,WAAW,CAAC,GAAG,OAAO,QAAQ,CAAC,EAC5B,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EACxC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,QACnB;AAAA,QACA,QAAQ;AAAA,UACN,OAAO,EAAE;AAAA,UACT,QAAQ,EAAE;AAAA,UACV,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,QAAQ,EAAE,MAAM,OAAO;AAAA,UACtD,OAAO,EAAE;AAAA,QACX;AAAA,MACF,EAAE;AAAA,IACN;AAAA,EACF,CAAC;AACL;AAEA,eAAsB,mBAAmB,SAAiB,WAAmB;AAC3E,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAO;AAEtB,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,aAAa,MAAM,IAAI;AAE7B,QAAI;AAEJ,QAAI;AACF,gBAAU,MAAM,QAAQ,YAAY;AAAA,QAClC,eAAe;AAAA,QACf,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAE5C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,QAAQ;AACnB;AAAA,MACF;AAEA,UAAI,MAAM,OAAO,KAAK,SAAS,SAAS,SAAS,GAAG;AAClD,cAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAC9D;AAEA,SAAS,mCAAmC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SAAO,wBAAwB,cAAc,aAAa,QAAQ,IAAI,UAAU,cAAc,UAAU;AAC1G;AAEA,SAAS,oCAAoC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO,yBAAyB,QAAQ,aAAa,QAAQ,cAAc,UAAU;AACvF;AAEA,SAAS,gCAAgC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO,wBAAwB,QAAQ,aAAa,WAAW,cAAc,UAAU;AACzF;AAEA,SAAS,sBAA6E;AACpF,SAAO,EAAE,MAAM,QAAQ,gBAAgB,OAA6B;AACtE;AAEA,gBAAuB,iBACrB,UACA,UAAoD,CAAC,GACP;AAC9C,QAAM,iBACJ,QAAQ,kBACR;AAAA,IACE;AAAA,IACA;AAAA,EACF;AACF,QAAM,4BACJ,QAAQ,6BAA6B;AACvC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,wBACJ,QAAQ,yBAAyB;AACnC,QAAM,SAAS,iBAAiB,QAAQ;AACxC,MAAI,aAAa;AACjB,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,MAAI,WAAiD,EAAE,MAAM,UAAU;AACvE,MAAI,eAAyB,CAAC;AAC9B,MAAI,iBAA2B,CAAC;AAEhC,QAAM,cAAc,MAAM;AACxB,oBAAgB;AAChB,oBAAgB;AAChB,kBAAc;AACd,oBAAgB;AAChB,eAAW,EAAE,MAAM,UAAU;AAC7B,mBAAe,CAAC;AAChB,qBAAiB,CAAC;AAAA,EACpB;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,SAAS,SAAS,aAAa,gBAAgB,GAAG;AACpD;AAAA,IACF;AAEA,eAAW,SAAS,OAAO,OAAO,cAAc,WAAW,EAAE,SAAS,MAAM,CAAC;AAE7E,QAAI,SAAS,SAAS,QAAQ;AAC5B,uBAAiB,CAAC;AAClB,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,YAAoB;AACzC,QAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,IACF;AAEA,qBAAiB,QAAQ;AAEzB,QAAI,cAAc,2BAA2B;AAC3C,YAAM,gBAAgB,QAAQ;AAAA,QAC5B;AAAA,QACA,KAAK,IAAI,QAAQ,QAAQ,4BAA4B,WAAW;AAAA,MAClE;AAEA,mBAAa,KAAK,aAAa;AAC/B,qBAAe,cAAc;AAC7B,oBAAc;AAAA,IAChB;AAEA,QAAI,SAAS,SAAS,QAAQ;AAC5B;AAAA,IACF;AAEA,UAAM,iBAAiB,iBAAiB;AAExC,QAAI,iBAAiB,GAAG;AACtB,YAAM,kBAAkB,QAAQ;AAAA,QAC9B;AAAA,QACA,KAAK,IAAI,QAAQ,QAAQ,cAAc;AAAA,MACzC;AAEA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,uBAAe,KAAK,eAAe;AACnC,yBAAiB,gBAAgB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,gBAAgB;AACnC,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,SAAS,SAAS,WAAW;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,YACJ,iBAAiB,kBAAkB,IAC/B,OAAO,OAAO,cAAc,WAAW,EAAE,SAAS,MAAM,IACxD,OAAO,OAAO,gBAAgB,aAAa,EAAE,SAAS,MAAM;AAElE,WAAO,SAAS,SAAS;AAAA,EAC3B;AAEA,QAAM,iBAAiB,MAAM;AAC3B,kBAAc;AAEd,QAAI,kBAAkB,KAAK,CAAC,eAAe;AACzC,kBAAY;AAEZ,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,gBAAgB;AAEzC,QAAI,iBAAiB,SAAS,QAAQ;AACpC,UAAI,gBAAgB,gBAAgB;AAClC,gBAAQ,2BAA2B;AAAA,UACjC;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAEA,kBAAY;AAEZ,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,SAAS,WAAW;AACvC,kBAAY;AAEZ,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,kBAAkB,eAAe;AACnD,YAAM,IAAI;AAAA,QACR,sBAAsB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,OAAO,gBAAgB,aAAa,EACxD,SAAS,MAAM,EACf,KAAK;AAER,QAAI,YAAY,IAAI;AAClB,kBAAY;AAEZ,aAAO;AAAA,IACT;AAEA,UAAM,SAAuC;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,gBAAgB,iBAAiB;AAAA,IACnC;AAEA,gBAAY;AAEZ,WAAO;AAAA,EACT;AAEA,mBAAiB,SAAS,QAAQ;AAChC,QAAI,QAAQ;AAEZ,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAI,MAAM,KAAK,MAAM,IAAM;AACzB;AAAA,MACF;AAEA,oBAAc,MAAM,SAAS,OAAO,KAAK,CAAC;AAC1C,YAAM,SAAS,eAAe;AAE9B,UAAI,QAAQ;AACV,cAAM;AAAA,MACR;AAEA,cAAQ,QAAQ;AAAA,IAClB;AAEA,kBAAc,MAAM,SAAS,KAAK,CAAC;AAAA,EACrC;AAEA,MAAI,gBAAgB,GAAG;AACrB,UAAM,SAAS,eAAe;AAE9B,QAAI,QAAQ;AACV,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,gBAAuB,cAAiB,UAAqC;AAC3E,mBAAiB,UAAU,iBAAiB,QAAQ,GAAG;AACrD,QAAI;AACF,YAAM,KAAK,MAAM,OAAO,OAAO;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,eAAsB,iBACpB,UACA,UAAmC,CAAC,GACpC;AACA,QAAM,WACJ,QAAQ,YACR;AAAA,IACE;AAAA,IACA;AAAA,EACF;AACF,QAAM,wBACJ,QAAQ,yBAAyB;AACnC,QAAM,SAAS,iBAAiB,QAAQ;AACxC,QAAM,SAAmB,CAAC;AAC1B,MAAI,aAAa;AAEjB,mBAAiB,SAAS,QAAQ;AAChC,kBAAc,MAAM;AAEpB,QAAI,aAAa,UAAU;AACzB,aAAO,QAAQ;AAEf,YAAM,IAAI;AAAA,QACR,sBAAsB;AAAA,UACpB;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,QAAQ,UAAU,EAAE,SAAS,MAAM;AAAA,IACjD;AAAA,IACA;AAAA,MACE;AAAA,MACA,uBAAuB,CAAC,EAAE,aAAa,UAAAC,WAAU,WAAW,MAC1D,sBAAsB;AAAA,QACpB,UAAU;AAAA,QACV,UAAAA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF;AACF;AAEO,SAAS,uBACd,SACA,aACA,UAAgC,CAAC,GACjC;AACA,QAAM,WACJ,QAAQ,YACR;AAAA,IACE;AAAA,IACA;AAAA,EACF;AACF,QAAM,wBACJ,QAAQ,yBAAyB;AAEnC,MAAI,OAAO,WAAW,SAAS,MAAM,IAAI,UAAU;AACjD,UAAM,IAAI;AAAA,MACR,sBAAsB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEO,SAAS,sBAAsB,MAAc,UAAkB;AACpE,QAAM,MAAM,QAAQ,IAAI,IAAI,GAAG,KAAK;AAEpC,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,KAAK,EAAE;AAEtC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,mBACpB,OACA,aACA,QACA;AACA,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,MAAM,MAAM,CAAC;AAC7D,MAAI,YAAY;AAEhB,QAAM,QAAQ;AAAA,IACZ,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,YAAY;AACxC,iBAAS;AACP,cAAM,eAAe;AAErB,qBAAa;AAEb,YAAI,gBAAgB,MAAM,QAAQ;AAChC;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,YAAY,GAAG,YAAY;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,qBAAqB,SAAe,OAAO,IAAI;AAC7D,QAAM,QAAQ,IAAI,KAAK,OAAO;AAE9B,QAAM,QAAQ,MAAM,QAAQ,KAAK,OAAO,EAAE;AAC1C,QAAM,SAAS,GAAG,GAAG,GAAG,CAAC;AAEzB,SAAO;AACT;AAEO,SAAS,mBAAmB,WAAmB;AACpD,SAAO,UAAU,QAAQ,WAAW,EAAE;AACxC;AAEO,SAAS,YACd,aACwB;AACxB,MAAI;AACJ,MAAI;AAEJ,aAAW,CAAC,WAAW,MAAM,KAAK,aAAa;AAC7C,QAAI,CAAC,cAAc,OAAO,QAAQ,WAAW,OAAO;AAClD,kBAAY;AACZ,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,WAAW,SAAS,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,OAAO,WAAW;AAAA,MAClB,QAAQ,WAAW;AAAA,MACnB,OAAO,EAAE,OAAO,WAAW,MAAM,OAAO,QAAQ,WAAW,MAAM,OAAO;AAAA,MACxE,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAY;AAC9B,QAAM,MAAM,IAAI,KAAK,IAAI;AAEzB,MAAI,SAAS,GAAG,GAAG,GAAG,CAAC;AAEvB,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAgB,UAAyB;AACjE,QAAM,OAAO,WAAW,QAAQ;AAChC,QAAM,OAAO,WAAW,QAAQ;AAChC,QAAM,OAAO,KAAK,QAAQ,IAAI,KAAK,QAAQ;AAE3C,SAAO,SAAS;AAClB;AAEO,SAAS,qBAAqB,OAA6B;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,QAAI,iBAAiB,MAAM,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI,GAAG;AACtD,iBAAW;AACX,UAAI,UAAU,SAAS;AACrB,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAqB,KAAmB;AAC3E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,GAAG;AAC7B,QAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,QAAM,eAAe,WAAW,UAAU,IAAI;AAG9C,MACE,aAAa,QAAQ,MAAM,OAAO,QAAQ,KAC1C,CAAC,iBAAiB,cAAc,MAAM,GACtC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AAEd,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,QAAI,CAAC,iBAAiB,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,GAAG;AACvD;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,aACA,mBACA,OACA,KACU;AACV,QAAM,gBAAgB,YAAY,WAAW;AAC7C,QAAM,sBAAsB,YAAY,iBAAiB;AACzD,QAAM,gBAAgB,MAAM;AAAA,IAC1B,CAAC,SAAS,IAAI,gBAAgB,IAAI,SAAS;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,SAAS,qBAAqB,aAAa;AAAA,MAC3C,SAAS,qBAAqB,eAAe,GAAG;AAAA,IAClD;AAAA,EACF;AACF;AAEO,SAAS,mBACd,UACA,QACA,aACA,mBACA,KACA,qBACc;AACd,QAAM,QAAQ,aAAa,QAAQ,mBAAmB;AAEtD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,oBAAoB,aAAa,mBAAmB,OAAO,GAAG;AAAA,EAC1E;AACF;AAEO,SAAS,SAAS,SAAuB;AAC9C,SAAO,QAAQ,MAAM;AAAA,IACnB,CAAC,QAAQ,IAAI,QAAQ,MAAM,IAAI,gBAAgB,KAAK;AAAA,EACtD;AACF;AAEO,SAAS,oBACd,UACA,WACA,KACc;AACd,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,cAAc,qBAAqB,KAAK,EAAE;AAEhD,aAAW,WAAW,WAAW;AAC/B,eAAW,OAAO,QAAQ,OAAO;AAC/B,0BAAoB,QAAQ,IAAI,MAAM;AAAA,QACpC,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,OAAO,EAAE,OAAO,IAAI,MAAM,OAAO,QAAQ,IAAI,MAAM,OAAO;AAAA,QAC1D,OAAO,IAAI;AAAA,MACb,CAAC;AAED,YAAM,UAAU,gBAAgB,IAAI,IAAI;AACxC,YAAM,eAAe,IAAI,gBAAgB,IAAI;AAE7C,UAAI,eAAe,GAAG;AACpB,4BAAoB;AAAA,UAClB;AAAA,WACC,oBAAoB,IAAI,OAAO,KAAK,KAAK;AAAA,QAC5C;AAAA,MACF;AAEA,YAAM,gBAAgB,OAAO,IAAI,OAAO;AAExC,UAAI,eAAe;AACjB,mBAAW,aAAa,IAAI,WAAW;AACrC;AAAA,YACE,cAAc;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,UACZ;AACA,8BAAoB,aAAa,UAAU,MAAM,UAAU,MAAM;AAEjE,cAAI,IAAI,QAAQ,aAAa;AAC3B;AAAA,cACE;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrwBO,IAAM,gBAAsD;AAAA,EACjE,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,cAAc;AAAA,IACd,QAAQ;AAAA,MACN,OAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACzE,IAAM,kBAAkB,IAAI,KAAK,aAAa,OAAO;AACrD,IAAM,aACJ;AACF,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AACxB,IAAM,eAAe;AAErB,IAAM,kBAAqD;AAAA,EACzD,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,IAAM,gBAA2C;AAAA,EAC/C,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AACR;AAEA,SAAS,iBAAiB,OAAe;AACvC,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAM,MAAmB,QAAQ,IAAI;AAAA,IACvC,EAAE,MAAM,KAAe,QAAQ,IAAI;AAAA,IACnC,EAAE,MAAM,KAAW,QAAQ,IAAI;AAAA,IAC/B,EAAE,MAAM,KAAO,QAAQ,IAAI;AAAA,EAC7B;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,KAAK,MAAM;AACtB,YAAM,SAAS,QAAQ,KAAK;AAC5B,YAAM,YAAY,UAAU,MAAM,IAAI,UAAU,KAAK,IAAI;AACzD,YAAM,UAAU,OACb,QAAQ,SAAS,EACjB,QAAQ,SAAS,EAAE,EACnB,QAAQ,mBAAmB,IAAI;AAElC,aAAO,GAAG,OAAO,GAAG,KAAK,MAAM;AAAA,IACjC;AAAA,EACF;AAEA,SAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,SAAS,aAAa,OAAe,WAAmB;AACtD,MAAI,MAAM,UAAU,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;AACtD;AAEA,SAAS,UAAU,OAAe;AAChC,SAAO,MACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM;AAC3B;AAEA,SAAS,QAAQ,OAAe;AAC9B,SAAO,MAAM,YAAY;AAC3B;AAEA,SAAS,WAAW,OAAa,KAAW;AAC1C,QAAM,OAAiB,CAAC;AACxB,QAAM,OAAO,IAAI,KAAK,KAAK;AAE3B,SAAO,QAAQ,KAAK;AAClB,SAAK,KAAK,gBAAgB,IAAI,CAAC;AAC/B,SAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAiB;AAC9C,QAAM,eAAc,oBAAI,KAAK,GAAG,OAAO,WAAW,GAAE,OAAO;AAE3D,UAAQ,cAAc,KAAK;AAC7B;AAEA,SAAS,qBAAqB,MAAgB;AAC5C,QAAM,WAAW,sBAAsB,KAAK,CAAC,CAAC;AAC9C,QAAM,UAAU,IAAI,MAAM,QAAQ,EAAE,KAAK,IAAI;AAE7C,SAAO,CAAC,GAAG,SAAS,GAAG,IAAI;AAC7B;AAEA,SAAS,YAAY,MAA8C;AACjE,QAAM,QAA6B,CAAC;AAEpC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAyB;AAC9C,QAAM,UAAU,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO;AAEhD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,UAAO,oBAAI,KAAK,GAAG,OAAO,WAAW,GAAE,eAAe,SAAS;AAAA,IAC7D,OAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAe,KAAa,YAAoB;AACxE,MAAI,OAAO,KAAK,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,IAAI,QAAQ,KAAK,YAAY;AACjD,QAAM,QAAQ,KAAK,KAAK,UAAU,aAAa,EAAE;AAEjD,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,aAAa,CAAC;AACpD;AAEA,SAAS,gBAAgB,SAAiB;AACxC,UAAO,oBAAI,KAAK,GAAG,OAAO,WAAW,GAAE,eAAe,SAAS;AAAA,IAC7D,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AACH;AAEA,SAAS,gBAAgB,WAAiB,SAAe;AACvD,QAAM,UAAU,WAAW,WAAW,OAAO;AAC7C,QAAM,aAAa,qBAAqB,OAAO;AAC/C,QAAM,QAAQ,YAAY,UAAU;AAEpC,QAAM,cAAc,MAAM,IAAI,CAAC,MAAM,MAAM;AACzC,UAAM,QAAQ,cAAc,IAAI;AAChC,UAAM,YAAY,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,CAAC,IAAI;AAExD,WAAO,UAAU,YAAY,QAAQ;AAAA,EACvC,CAAC;AAED,SAAO,EAAE,OAAO,YAAY;AAC9B;AAEA,SAAS,iBAAiB,WAAmB;AAC3C,QAAM,WAAW;AACjB,QAAM,MAAM;AACZ,QAAM,iBAAiB;AACvB,QAAM,eAAe;AACrB,QAAM,iBAAiB;AACvB,QAAM,eACJ,iBAAiB,wBAAwB;AAC3C,QAAM,kBAAkB,eAAe;AACvC,QAAM,aAAa,KAAK,IAAI,uBAAuB,eAAe,IAAI;AACtE,QAAM,oBAAoB;AAC1B,QAAM,SAAS;AACf,QAAM,cAAc,aAAa;AACjC,QAAM,UAAU,aAAa;AAC7B,QAAM,aAAa,IAAI,WAAW,IAAI;AACtC,QAAM,YAAY,YAAY,WAAW,KAAK,IAAI,YAAY,GAAG,CAAC,IAAI;AACtE,QAAM,UAAU,UAAU,aAAa;AACvC,QAAM,gBAAgB,UAAU;AAChC,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,mBAAmB;AACzB,QAAM,iBAAiB,gBAAgB;AACvC,QAAM,eACJ,iBAAiB,wBAAwB;AAC3C,QAAM,qBAAqB;AAC3B,QAAM,QAAQ,iBAAiB,YAAY;AAC3C,QAAM,SAAS,eAAe,sBAAsB;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBACP,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA;AACA,QAAM,gBAAgB,OAAO,SAAS;AACtC,QAAM,eAAe,CAAC,cAAc,SAAS,GAAG,GAAG,cAAc,MAAM,CAAC,CAAC;AACzE,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,YAAY,IAAI,OAAO,QAAQ;AACrC,QAAM,cAAc,IAAI;AACxB,MAAI,WAAW;AACf,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AACxB,MAAI,cAAc;AAClB,MAAI,wBAAuC;AAC3C,MAAI,oBAAmC;AAEvC,aAAW,OAAO,OAAO;AACvB,UAAM,UAAU,gBAAgB,IAAI,IAAI;AACxC,UAAM,eAAe,IAAI,gBAAgB,IAAI;AAE7C,gBAAY,IAAI,SAAS,YAAY;AACrC,eAAW,KAAK,IAAI,UAAU,YAAY;AAC1C,QAAI,IAAI,SAAS,KAAK,eAAe,GAAG;AACtC,UAAI,CAAC,yBAAyB,UAAU,uBAAuB;AAC7D,gCAAwB;AAAA,MAC1B;AAAA,IACF,WAAW,IAAI,QAAQ,MAAM,CAAC,qBAAqB,UAAU,oBAAoB;AAC/E,0BAAoB;AAAA,IACtB;AACA,wBAAoB,IAAI;AACxB,yBAAqB,IAAI;AACzB,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,eAAe;AACrB,QAAM,oBAAoB,YAAY,eAAe;AACrD,QAAM,eAAe,YAAY,eAAe;AAChD,QAAM,gBAAgB,YAAY;AAClC,QAAM,mBAAmB,iBAAiB,WAAW;AACrD,QAAM,kBAAkB,iBAAiB,gBAAgB;AACzD,QAAM,mBAAmB,iBAAiB,iBAAiB;AAC3D,QAAM,gBAAgB,UAAU,QAAQ,WAAW;AACnD,QAAM,gBAAgB,UAAU,QAAQ,WAAW;AAEnD,MAAI,cAAc;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI,OAAO;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA,QAAQ,YAAY;AAAA,IACtB;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI,OAAO;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI,OAAO;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,cAAc;AAAA,EACxB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,eAAe;AAAA,EACzB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,cAAc;AAAA,EACxB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,UAAM,OACJ,IACA,OAAO,UACP,KAAK,OAAO,WAAW,OAAO,OAC9B,OAAO,WAAW;AAEpB,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,iBAAiB,CAAC,IAAI;AAE5D,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG,IAAI,OAAO,iBAAiB;AAAA,QAC/B,GAAG;AAAA,QACH,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YAAY,GAAG,YAAY,KAAK,MAAM,QAAQ,aAAa,GAAG;AACrE,UAAM,aAAa,KAAK,YAAY,SAAS;AAE7C,QAAI,YAAY;AACd,YAAM,SACJ,IAAI,OAAO,iBAAiB,aAAa,OAAO,WAAW,OAAO;AAEpE,YAAM,IAAI;AAAA,QACR;AAAA,UACE,GAAG;AAAA,UACH,GAAG,IAAI,OAAO;AAAA,UACd,MAAM,QAAQ;AAAA,UACd,aAAa;AAAA,UACb,eAAe;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,MAAM,SAAS;AAEjC,aAAS,WAAW,GAAG,WAAW,KAAK,QAAQ,YAAY,GAAG;AAC5D,YAAM,MAAM,KAAK,QAAQ;AAEzB,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,YAAM,QAAQ,YAAY,IAAI,GAAG,KAAK;AACtC,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA,cAAc;AAAA,MAChB;AACA,YAAM,OAAO,SAAS,IAAI,cAAc,SAAS,IAAI,cAAc,UAAU;AAC7E,YAAM,OACJ,IAAI,OAAO,iBAAiB,aAAa,OAAO,WAAW,OAAO;AACpE,YAAM,OACJ,IAAI,OAAO,UAAU,YAAY,OAAO,WAAW,OAAO;AAC5D,YAAM,iBAAkD;AAAA,QACtD,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,MACF;AAEA,YAAM,IAAI,KAAK,cAAc;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,eAAe,IAAI,OAAO;AAChC,QAAM,UAAU,IAAI,OAAO;AAE3B,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,UAAU;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,MAAM;AAAA,EAChB;AAEA,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,UAAM,UAAU,eAAe,KAAK,KAAK,OAAO,WAAW;AAE3D,UAAM,IAAI,KAAK;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM,aAAa,CAAC;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG,eAAe,KAAK,aAAa,UAAU,OAAO,WAAW,KAAK;AAAA,MACrE,GAAG,UAAU;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,MAAM;AAAA,EAChB;AAEA,MAAI,yBAAyB,mBAAmB;AAC9C,UAAM,QAAQ,IAAI,OAAO,QAAQ;AACjC,UAAM,QACJ,IAAI,OAAO,UAAU,IAAI,OAAO,WAAW,IAAI,OAAO,MAAM;AAE9D,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA,kDAAkD,gBAAgB,iBAAiB,CAAC;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,eAAe;AACrB,QAAM,iBAAiB,cAAc;AACrC,QAAM,gBAAgB,eAAe;AAErC,QAAM,WAA4B,CAAC;AAEnC,MAAI,UAAU,eAAe;AAC3B,aAAS,KAAK,EAAE,SAAS,mBAAmB,MAAM,SAAS,cAAc,CAAC;AAAA,EAC5E;AAEA,MAAI,UAAU,qBAAqB;AACjC,aAAS,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,aAAW,CAAC,OAAO,GAAG,KAAK,SAAS,QAAQ,GAAG;AAC7C,UAAM,WAAW,OAAO;AACxB,UAAM,SAAS,OAAO;AACtB,UAAM,YAAY,aAAa,IAAI,KAAK,MAAM,EAAE;AAChD,UAAM,SAAS,UAAU,IAAI,cAAc;AAC3C,UAAM,aAAa,IAAI,iBAAiB,IAAI,KAAK,OAAO,KAAK,CAAC;AAE9D,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI;AAAA,QACP,MAAM,QAAQ;AAAA,QACd,aAAa;AAAA,QACb,eAAe;AAAA,QACf,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA,QAAQ,IAAI,OAAO;AAAA,IACrB;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,QACE,GAAG;AAAA,QACH,GAAG,IAAI;AAAA,QACP,qBAAqB;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,MACA,gBAAgB,QAAQ,IAAI,gBAAgB,mBAAmB,uBAAuB,UAAU,SAAS,CAAC,+BAA+B,QAAQ,KAAK,gBAAgB,mBAAmB,uBAAuB,UAAU;AAAA,IAC5N;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,gBAAgB;AAAA,EAC1B;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,GAAG,gBAAgB,OAAO,aAAa,CAAC;AAAA,EAC1C;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,gBAAgB;AAAA,EAC1B;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,GAAG;AAAA,MACH,GAAG,IAAI,OAAO;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,IACjB;AAAA,IACA,GAAG,gBAAgB,OAAO,aAAa,CAAC;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,OAAO,gBAAgB,WAAW,OAAO;AAC/C,QAAM,SAAS,iBAAiB,KAAK,MAAM,MAAM;AACjD,QAAM,UAAU,gBAAgB,SAAS;AACzC,QAAM,oBAAoB;AAC1B,QAAM,aAAa;AACnB,QAAM,gBAAgB;AACtB,QAAM,aAAa;AAEnB,QAAM,QAAQ,oBAAoB,IAAI,OAAO;AAC7C,QAAM,SACJ,aACA,gBACA,SAAS,SAAS,OAAO,SACzB,KAAK,IAAI,SAAS,SAAS,GAAG,CAAC,IAAI;AAErC,MAAI,MAAM,YACP,OAAO,EACP,MAAM,KAAK,EACX,OAAO,MAAM,EACb,QAAQ,OAAO,KAAK,IAAI,MAAM,EAAE,EAChC,KAAK;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO,QAAQ;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB,MAAM,QAAQ;AAAA,EAChB,CAAC;AAEH,WAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,UAAM,WAAW,aAAa,SAAS,OAAO,SAAS;AAEvD,UAAM,mBAAmB,KAAK;AAAA,MAC5B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf,cAAc,QAAQ;AAAA,MACtB,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,IAAI,OAAO;AACpB;;;ACj0BA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,QAAAC,OAAM,eAAe;AAqB9B,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AACjC,IAAM,+BAA+B;AAgDrC,SAAS,uBAAuB;AAC9B,QAAM,YAAY,QAAQ,IAAI,qBAAqB,KAAK,IAAI,KAAK;AAEjE,MAAI,aAAa,IAAI;AACnB,WAAO,SACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,SAAS,EAAE,EAC5B,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC;AAAA,EAChC;AAEA,QAAM,gBACJ,QAAQ,IAAI,iBAAiB,KAAK,KAAKC,MAAK,QAAQ,GAAG,SAAS;AAElE,SAAO,CAACA,MAAK,eAAe,QAAQ,GAAGA,MAAK,QAAQ,GAAG,SAAS,CAAC;AACnE;AAEA,SAAS,uBAAuB;AAC9B,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,OAAiB,CAAC;AAExB,aAAW,YAAY,qBAAqB,GAAG;AAC7C,UAAM,cAAcA,MAAK,UAAU,wBAAwB;AAE3D,QAAI,WAAW,WAAW,KAAK,CAAC,OAAO,IAAI,WAAW,GAAG;AACvD,aAAO,IAAI,WAAW;AACtB,WAAK,KAAK,WAAW;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B;AAClC,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,QAAkB,CAAC;AAEzB,aAAW,YAAY,qBAAqB,GAAG;AAC7C,UAAM,iBAAiBA,MAAK,UAAU,4BAA4B;AAElE,QAAI,WAAW,cAAc,KAAK,CAAC,OAAO,IAAI,cAAc,GAAG;AAC7D,aAAO,IAAI,cAAc;AACzB,YAAM,KAAK,cAAc;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAiD;AAC5E,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,SAAS,OAAO;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM,QAAQ;AAAA,IACrB,OAAO,MAAM,QAAQ;AAAA,IACrB,WAAW,MAAM,QAAQ;AAAA,IACzB,WAAW,MAAM;AAAA,EACnB;AACF;AAEA,SAAS,wBAAwB,OAA6C;AAC5E,QAAM,iBAAiB,MAAM,2BAA2B;AACxD,QAAM,qBAAqB,MAAM,+BAA+B;AAChE,QAAM,SAAS,MAAM,gBAAgB,KAAK;AAC1C,QAAM,UAAU,MAAM,iBAAiB,KAAK;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,gBAAgB,QAAQ,mBAAmB;AAAA,IAC3D,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,0BAA0B,OAAe,SAAmB;AACnE,QAAM,YAAY,QAAQ,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAE/D,MAAI,SAAS,KAAK,aAAa,GAAG;AAChC,WAAO,QAAQ,IAAI,MAAM,CAAC;AAAA,EAC5B;AAEA,QAAM,QAAQ,QAAQ,IAAI,CAAC,WAAY,SAAS,YAAa,KAAK;AAClE,QAAM,YAAY,MAAM,IAAI,CAAC,UAAU,KAAK,MAAM,KAAK,CAAC;AACxD,MAAI,YAAY,QAAQ,UAAU,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACvE,QAAM,QAAQ,MACX,IAAI,CAAC,OAAO,WAAW;AAAA,IACtB;AAAA,IACA,UAAU,QAAQ,UAAU,KAAK;AAAA,IACjC,QAAQ,QAAQ,KAAK;AAAA,EACvB,EAAE,EACD,KAAK,CAAC,MAAM,UAAU;AACrB,QAAI,MAAM,aAAa,KAAK,UAAU;AACpC,aAAO,MAAM,WAAW,KAAK;AAAA,IAC/B;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,CAAC;AAEH,aAAW,EAAE,MAAM,KAAK,OAAO;AAC7B,QAAI,aAAa,GAAG;AAClB;AAAA,IACF;AAEA,cAAU,KAAK,KAAK;AACpB,iBAAa;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,aACA,OACkB;AAClB,MAAI,eAAe,GAAG;AACpB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,eAAe;AAC1C,QAAM,eAAe,OAAO,gBAAgB;AAC5C,QAAM,uBAAuB,OAAO,wBAAwB;AAC5D,QAAM,2BAA2B,OAAO,4BAA4B;AACpE,QAAM,CAAC,aAAa,cAAc,iBAAiB,mBAAmB,IACpE,0BAA0B,aAAa;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAIH,MACE,gBAAgB,KAChB,iBAAiB,KACjB,oBAAoB,KACpB,wBAAwB,GACxB;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,cAAc;AAAA,IACrB,QAAQ,eAAe;AAAA,IACvB,OAAO,EAAE,OAAO,iBAAiB,QAAQ,oBAAoB;AAAA,IAC7D,OAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAiB;AAC9B,QAAM,cAAc,qBAAqB;AACzC,QAAM,SACJ,MAAM,QAAQ;AAAA,IACZ,YAAY,IAAI,CAAC,eAAe,mBAAmB,YAAY,QAAQ,CAAC;AAAA,EAC1E,GACA,KAAK;AAEP,SAAO;AACT;AAEA,SAAS,wBAAwB;AAC/B,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,QAAkB,CAAC;AAEzB,aAAW,YAAY,qBAAqB,GAAG;AAC7C,UAAM,cAAcA,MAAK,UAAU,eAAe;AAElD,QAAI,WAAW,WAAW,KAAK,CAAC,OAAO,IAAI,WAAW,GAAG;AACvD,aAAO,IAAI,WAAW;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,yBACb,WACA,SACA,cACA,QACA,aACA,mBACA,aACA;AACA,QAAM,kBAAkB,yBAAyB;AAEjD,aAAW,QAAQ,iBAAiB;AAClC,QAAI;AAEJ,QAAI;AACF,mBAAa,MAAM,iBAAmC,IAAI;AAAA,IAC5D,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,OAAO,WAAW,oBAAoB,CAAC,GAAG;AACnD,UAAI,CAAC,IAAI,QAAQ,aAAa,IAAI,IAAI,IAAI,GAAG;AAC3C;AAAA,MACF;AAEA,YAAM,YAAY,oBAAI,KAAK,GAAG,IAAI,IAAI,WAAW;AAEjD,UACE,OAAO,MAAM,UAAU,QAAQ,CAAC,KAChC,YAAY,aACZ,YAAY,SACZ;AACA;AAAA,MACF;AAEA,iBAAW,CAAC,cAAc,WAAW,KAAK,OAAO;AAAA,QAC/C,IAAI,iBAAiB,CAAC;AAAA,MACxB,GAAG;AACD,YAAI,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,GAAG;AACrD;AAAA,QACF;AAEA,cAAM,YAAY,mBAAmB,YAAY;AACjD,cAAM,cAAc;AAAA,UAClB;AAAA,UACA,WAAW,aAAa,YAAY;AAAA,QACtC;AAEA,4BAAoB,QAAQ,WAAW,aAAa,SAAS;AAC7D,4BAAoB,aAAa,WAAW,WAAW;AAEvD,YAAI,aAAa,aAAa;AAC5B,8BAAoB,mBAAmB,WAAW,WAAW;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,+BACb,WACA,SACA,cACA,qBACA;AACA,QAAM,eAAe,sBAAsB;AAE3C,aAAW,QAAQ,cAAc;AAC/B,qBAAiB,QAAQ,cAAkC,IAAI,GAAG;AAChE,YAAM,eAAe,KAAK;AAC1B,YAAM,YACJ,OAAO,iBAAiB,WACpB,IAAI,KAAK,YAAY,IACrB,OAAO,iBAAiB,WACtB,IAAI,KAAK,YAAY,IACrB;AAER,UAAI,CAAC,aAAa,OAAO,MAAM,UAAU,QAAQ,CAAC,GAAG;AACnD;AAAA,MACF;AAEA,UAAI,YAAY,aAAa,YAAY,SAAS;AAChD;AAAA,MACF;AAEA,YAAM,UAAU,gBAAgB,SAAS;AAEzC,UAAI,aAAa,IAAI,OAAO,GAAG;AAC7B;AAAA,MACF;AAEA,0BAAoB,IAAI,UAAU,oBAAoB,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,WAAoB,WAAoB;AAChE,MAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,SAAS,IAAI,SAAS;AAClC;AAEA,eAAsB,eACpB,WACA,SACuB;AACvB,QAAM,QAAQ,MAAM,eAAe;AACnC,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,cAAc,qBAAqB,SAAS,EAAE;AACpD,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,iBAAiB,OAAO,SAAS;AAC/D,qBAAiB,QAAQ,cAAiC,IAAI,GAAG;AAC/D,YAAM,QAAQ,oBAAoB,IAAI;AAEtC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,aAAa,iBAAiB,MAAM,WAAW,MAAM,SAAS;AAEpE,UAAI,cAAc,gBAAgB,IAAI,UAAU,GAAG;AACjD;AAAA,MACF;AAEA,UAAI,YAAY;AACd,wBAAgB,IAAI,UAAU;AAAA,MAChC;AAEA,YAAM,YAAY,IAAI,KAAK,MAAM,SAAS;AAE1C,UAAI,YAAY,aAAa,YAAY,SAAS;AAChD;AAAA,MACF;AAEA,YAAM,cAAc,wBAAwB,MAAM,KAAK;AAEvD,UAAI,YAAY,SAAS,GAAG;AAC1B;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,MAAM,UAAU,gBAC3B,mBAAmB,MAAM,KAAK,IAC9B;AAEN,0BAAoB,QAAQ,WAAW,aAAa,SAAS;AAE7D,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,0BAAoB,aAAa,WAAW,WAAW;AAEvD,UAAI,aAAa,aAAa;AAC5B,4BAAoB,mBAAmB,WAAW,WAAW;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,IAAI,IAAI,OAAO,KAAK,CAAC;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,IAAI,IAAI,OAAO,KAAK,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxcA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAuB9B,IAAM,8BAA8B,KAAK;AA4DzC,SAAS,oBAAoB,OAAuB;AAClD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,gBAAgB;AACpC,QAAM,SACJ,MAAM,uBAAuB,MAAM,2BAA2B;AAChE,QAAM,SAAS,MAAM,iBAAiB;AACtC,QAAM,YAAY,MAAM,2BAA2B;AACnD,QAAM,QAAQ,MAAM,gBAAgB;AAEpC,SAAO;AAAA,IACL,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,yBAAyB;AAAA,IACzB,cAAc,QAAQ,IAAI,QAAQ,QAAQ;AAAA,EAC5C;AACF;AAEA,SAAS,mBACP,SACA,UACA;AACA,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,MACjB,QAAQ,gBAAgB,UAAU,gBAAgB;AAAA,MAClD;AAAA,IACF;AAAA,IACA,qBAAqB,KAAK;AAAA,MACxB,QAAQ,uBAAuB,UAAU,uBAAuB;AAAA,MAChE;AAAA,IACF;AAAA,IACA,eAAe,KAAK;AAAA,MAClB,QAAQ,iBAAiB,UAAU,iBAAiB;AAAA,MACpD;AAAA,IACF;AAAA,IACA,yBAAyB,KAAK;AAAA,MAC5B,QAAQ,2BACL,UAAU,2BAA2B;AAAA,MACxC;AAAA,IACF;AAAA,IACA,cAAc,KAAK;AAAA,MACjB,QAAQ,gBAAgB,UAAU,gBAAgB;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAgB;AACxC,QAAM,UAAU,OAAO,KAAK;AAE5B,SAAO,YAAY,KAAK,SAAY;AACtC;AAEA,SAAS,kBAAkB,SAA6B;AACtD,QAAM,cACJ,iBAAiB,SAAS,KAAK,KAAK,iBAAiB,SAAS,UAAU;AAE1E,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM;AACjB,UAAM,YACJ,iBAAiB,QAAQ,KAAK,KAAK,KACnC,iBAAiB,QAAQ,KAAK,UAAU;AAE1C,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,KAAK,UAAU;AACzB,YAAM,QAAQ,iBAAiB,QAAQ,KAAK,SAAS,KAAK;AAE1D,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,iBAAiB,QAAQ,SAAS,KAAK;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,eAAe,gBAAgB;AAC7B,QAAM,YAAY,QAAQ,IAAI,YAAY,KAAK,IAC3CC,SAAQ,QAAQ,IAAI,UAAU,IAC9BC,MAAKC,SAAQ,GAAG,QAAQ;AAE5B,SAAO,mBAAmBD,MAAK,WAAW,UAAU,GAAG,QAAQ;AACjE;AAEA,SAAS,eAAe,QAAgB,OAAe;AACrD,MAAI,OAAO,KAAK,MAAM,KAAK;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,UAAU;AAEd,WAAS,QAAQ,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AAC7D,UAAM,OAAO,OAAO,KAAK;AAEzB,QAAI,SAAS;AACX,eAAS;AACT,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,MAAM;AACjB,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE;AAAA,IACvC;AAEA,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,QAAgB,OAAe;AACrD,MAAI,QAAQ;AAEZ,SAAO,QAAQ,OAAO,UAAU,KAAK,KAAK,OAAO,KAAK,CAAC,GAAG;AACxD,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,QAAgB,OAAe;AACpD,MAAI,QAAQ;AAEZ,SAAO,QAAQ,OAAO,QAAQ;AAC5B,UAAM,OAAO,OAAO,KAAK;AAEzB,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,OAAO,KAAK,KAAK,IAAI,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,aAAS;AAAA,EACX;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,oBACP,QACqD;AACrD,QAAM,QAAuB,CAAC;AAC9B,MAAI;AAEJ,WAAS,QAAQ,GAAG,QAAQ,OAAO,UAAU;AAC3C,YAAQ,eAAe,QAAQ,KAAK;AAEpC,QAAI,SAAS,OAAO,QAAQ;AAC1B;AAAA,IACF;AAEA,UAAM,OAAO,OAAO,KAAK;AAEzB,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,SAAS,KAAK;AAChB,eAAO,EAAE,MAAM,UAAU;AAAA,MAC3B;AAEA,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,WAAW;AAAA,QACX,iBAAiB;AAAA,MACnB,CAAC;AACD,eAAS;AACT;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,MAAM,SAAS,CAAC;AAEtC,QAAI,QAAQ,SAAS,UAAU;AAC7B,UAAI,QAAQ,cAAc,YAAY;AACpC,YAAI,SAAS,KAAK;AAChB,gBAAM,IAAI;AACV,mBAAS;AACT;AAAA,QACF;AAEA,cAAM,MAAM,eAAe,QAAQ,KAAK;AAExC,YAAI,CAAC,KAAK;AACR,iBAAO,EAAE,MAAM,UAAU;AAAA,QAC3B;AAEA,gBAAQ,MAAM,IAAI;AAClB,gBAAQ,YAAY;AACpB,gBAAQ,IAAI;AACZ;AAAA,MACF;AAEA,UAAI,QAAQ,cAAc,SAAS;AACjC,YAAI,SAAS,KAAK;AAChB,iBAAO,EAAE,MAAM,UAAU;AAAA,QAC3B;AAEA,gBAAQ,YAAY;AACpB,iBAAS;AACT;AAAA,MACF;AAEA,UAAI,QAAQ,cAAc,SAAS;AACjC,YAAI,SAAS,KAAK;AAChB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,WAAW;AAAA,YACX,iBAAiB,MAAM,WAAW,KAAK,QAAQ,QAAQ;AAAA,UACzD,CAAC;AACD,kBAAQ,YAAY;AACpB,kBAAQ,MAAM;AACd,mBAAS;AACT;AAAA,QACF;AAEA,YAAI,SAAS,KAAK;AAChB,gBAAM,KAAK,EAAE,MAAM,SAAS,WAAW,aAAa,CAAC;AACrD,kBAAQ,YAAY;AACpB,kBAAQ,MAAM;AACd,mBAAS;AACT;AAAA,QACF;AAEA,YAAI,SAAS,KAAK;AAChB,gBAAM,QAAQ,eAAe,QAAQ,KAAK;AAE1C,cAAI,CAAC,OAAO;AACV,mBAAO,EAAE,MAAM,UAAU;AAAA,UAC3B;AAEA,cAAI,MAAM,WAAW,KAAK,QAAQ,QAAQ,QAAQ;AAChD,2BAAe,MAAM;AAErB,gBAAI,MAAM,UAAU,gBAAgB;AAClC,qBAAO,EAAE,MAAM,QAAQ,gBAAgB,eAAe;AAAA,YACxD;AAEA,gBAAI,MAAM,UAAU,aAAa;AAC/B,qBAAO,EAAE,MAAM,OAAO;AAAA,YACxB;AAAA,UACF;AAEA,cAAI,QAAQ,mBAAmB,QAAQ,QAAQ,QAAQ;AACrD,gBAAI,MAAM,UAAU,eAAe;AACjC,qBAAO,iBAAiB,cACpB,EAAE,MAAM,QAAQ,gBAAgB,cAAc,IAC9C,EAAE,MAAM,UAAU;AAAA,YACxB;AAEA,mBAAO,iBAAiB,cACpB,EAAE,MAAM,OAAO,IACf,EAAE,MAAM,UAAU;AAAA,UACxB;AAEA,kBAAQ,YAAY;AACpB,kBAAQ,MAAM;AACd,kBAAQ,MAAM;AACd;AAAA,QACF;AAEA,gBAAQ,YAAY;AACpB,gBAAQ,MAAM;AACd,gBAAQ,cAAc,QAAQ,KAAK;AACnC;AAAA,MACF;AAEA;AACE,YAAI,SAAS,KAAK;AAChB,kBAAQ,YAAY;AACpB,mBAAS;AACT;AAAA,QACF;AAEA,YAAI,SAAS,KAAK;AAChB,gBAAM,IAAI;AACV,mBAAS;AACT;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,UAAU;AAAA,MAC3B;AAEA;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc,cAAc;AACtC,UAAI,SAAS,KAAK;AAChB,cAAM,IAAI;AACV,iBAAS;AACT;AAAA,MACF;AAEA,UAAI,SAAS,KAAK;AAChB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,WAAW;AAAA,UACX,iBAAiB;AAAA,QACnB,CAAC;AACD,gBAAQ,YAAY;AACpB,iBAAS;AACT;AAAA,MACF;AAEA,UAAI,SAAS,KAAK;AAChB,cAAM,KAAK,EAAE,MAAM,SAAS,WAAW,aAAa,CAAC;AACrD,gBAAQ,YAAY;AACpB,iBAAS;AACT;AAAA,MACF;AAEA,UAAI,SAAS,KAAK;AAChB,cAAM,QAAQ,eAAe,QAAQ,KAAK;AAE1C,YAAI,CAAC,OAAO;AACV,iBAAO,EAAE,MAAM,UAAU;AAAA,QAC3B;AAEA,gBAAQ,YAAY;AACpB,gBAAQ,MAAM;AACd;AAAA,MACF;AAEA,cAAQ,YAAY;AACpB,cAAQ,cAAc,QAAQ,KAAK;AACnC;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,cAAQ,YAAY;AACpB,eAAS;AACT;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,YAAM,IAAI;AACV,eAAS;AACT;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,MAAI,gBAAgB,iBAAiB,aAAa;AAChD,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAEA,eAAe,iBACb,UACA,OACA,KACA,gBACoC;AACpC,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,cAAc,qBAAqB,KAAK,EAAE;AAChD,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,MAAI,iBAA8C;AAClD,MAAI;AAEJ,MAAI,oCAAoC;AAExC,mBAAiB,UAAU;AAAA,IACzB;AAAA,IACA;AAAA,MACE,2BAA2B;AAAA,MAC3B,UAAU;AAAA,MACV;AAAA,MACA,0BAA0B,MAAM;AAC9B,6CAAqC;AAAA,MACvC;AAAA,MACA,uBAAuB,CAAC,EAAE,UAAAE,WAAU,YAAY,gBAAAC,gBAAe,MAC7D,iCAAiCA,eAAc,aAAaD,SAAQ,IAAI,UAAU,cAAc,0BAA0B;AAAA,IAC9H;AAAA,EACF,GAAG;AACD,QAAI;AAEJ,QAAI;AACF,cAAQ,KAAK,MAAM,OAAO,OAAO;AAAA,IACnC,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,iBAAiB,kBAAkB,MAAM,OAAO;AAEtD,QAAI,OAAO,mBAAmB,gBAAgB;AAC5C,qBAAe,kBAAkB;AACjC;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS;AAC5B,UAAM,YAAY,oBAAoB,MAAM,gBAAgB;AAC5D,UAAM,aAAa,oBAAoB,MAAM,iBAAiB;AAC9D,QAAI,WAAW;AAEf,QAAI,CAAC,YAAY,YAAY;AAC3B,iBAAW,mBAAmB,YAAY,cAAc;AAAA,IAC1D;AAEA,QAAI,YAAY;AACd,uBAAiB;AAAA,IACnB;AAEA,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,QAA0B;AAAA,MAC9B,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,OAAO,EAAE,OAAO,SAAS,qBAAqB,QAAQ,EAAE;AAAA,MACxD,OAAO,SAAS;AAAA,IAClB;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,KAAK,MAAM,SAAS;AAErC,QAAI,OAAO,SAAS,OAAO,KAAK;AAC9B;AAAA,IACF;AAEA,UAAM,YAAY,kBAAkB;AACpC,UAAM,sBAAsB,YACxB,mBAAmB,SAAS,IAC5B;AAEJ,wBAAoB,QAAQ,MAAM,OAAO,mBAAmB;AAE5D,QAAI,CAAC,qBAAqB;AACxB;AAAA,IACF;AAEA,wBAAoB,aAAa,qBAAqB,KAAK;AAE3D,QAAI,QAAQ,aAAa;AACvB,0BAAoB,mBAAmB,qBAAqB,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,cACpB,OACA,KACA,WAAqB,CAAC,GACC;AACvB,QAAM,QAAQ,MAAM,cAAc;AAClC,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACA,QAAM,UAAU,IAAI,MAAiC,MAAM,MAAM;AAEjE,QAAM,mBAAmB,OAAO,iBAAiB,OAAO,MAAM,UAAU;AACtE,YAAQ,KAAK,IAAI,MAAM,iBAAiB,MAAM,OAAO,KAAK,cAAc;AAAA,EAC1E,CAAC;AAED,MAAI,oCAAoC;AACxC,MAAI,eAAe;AAEnB,aAAW,UAAU,SAAS;AAC5B,2BAAuB,QAAQ,OAAO,MAAM;AAC5C,qBAAiB,aAAa,OAAO,WAAW;AAChD,qBAAiB,mBAAmB,OAAO,iBAAiB;AAE5D,QAAI,OAAO,oCAAoC,GAAG;AAChD,2CAAqC,OAAO;AAC5C,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,oCAAoC,GAAG;AACzC,aAAS;AAAA,MACP,WAAW,iCAAiC,gDAAgD,YAAY,oGAAoG,0BAA0B;AAAA,IACxO;AAAA,EACF;AAEA,SAAO,mBAAmB,SAAS,QAAQ,aAAa,mBAAmB,GAAG;AAChF;;;AChlBO,IAAM,cAA4B,CAAC,UAAU,SAAS,UAAU;AAEhE,IAAM,sBAAkD;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AACZ;;;ACRA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,UAAU,SAAS,UAAU;AACtC,SAAS,WAAAC,UAAS,cAAc;AAChC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAqD9B,SAAS,kBAAkB,QAA2C;AACpE,QAAM,aAAa,QAAQ,OAAO,QAAQ;AAC1C,QAAM,cAAc,QAAQ,OAAO,SAAS;AAC5C,QAAM,SAAS,QAAQ,SAAS,KAAK;AACrC,QAAM,UAAU,QAAQ,UAAU,KAAK;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO,YAAY,QAAQ,YAAY;AAAA,IAChD,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,eAAe,kBAAkB,UAAkB;AACjD,SAAO,iBAAkC,QAAQ;AACnD;AAEA,SAAS,qBAAqB;AAC5B,QAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAK,IAChDC,SAAQ,QAAQ,IAAI,iBAAiB,IACrCC,MAAKC,SAAQ,GAAG,UAAU,SAAS,UAAU;AAEjD,SAAO;AACT;AAEA,eAAe,oBAA6C;AAC1D,QAAM,UAAU,mBAAmB;AACnC,QAAM,eAAeD,MAAK,SAAS,aAAa;AAEhD,MAAIE,YAAW,YAAY,GAAG;AAC5B,WAAO,EAAE,MAAM,YAAY,MAAM,aAAa;AAAA,EAChD;AAEA,QAAM,cAAcF,MAAK,SAAS,WAAW,SAAS;AAEtD,SAAO,EAAE,MAAM,UAAU,OAAO,MAAM,mBAAmB,aAAa,OAAO,EAAE;AACjF;AAEA,eAAe,mBAAmB;AAChC,MAAI;AACF,UAAM,aAAa;AAEnB,WAAO,MAAM,OAAO;AAAA,EACtB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,iCAAoC,UAA4B;AAC7E,QAAM,sBAAsB,QAAQ,YAAY,KAAK,OAAO;AAE5D,UAAQ,eAAe,CAAC,YAA4B,SAAoB;AACtE,UAAM,cACJ,OAAO,YAAY,WAAW,UAAU,QAAQ;AAClD,UAAM,cACJ,mBAAmB,QAAQ,QAAQ,OAAO,OAAO,KAAK,CAAC,KAAK,EAAE;AAEhE,QACE,gBAAgB,yBAChB,UAAU,KAAK,WAAW,GAC1B;AACA;AAAA,IACF;AAEA,WAAO,QAAQ,MAAM,qBAAqB,SAAS;AAAA,MACjD;AAAA,MACA,GAAG;AAAA,IACL,CAA2C;AAAA,EAC7C;AAEA,MAAI;AACF,WAAO,MAAM,SAAS;AAAA,EACxB,UAAE;AACA,YAAQ,cAAc;AAAA,EACxB;AACF;AAEA,SAAS,yBACP,OACA,aACA,SACA;AACA,QAAM,UAAU,uBAAwC,SAAS,WAAW;AAE5E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,QAAQ,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,oBAAoB,OAAgB;AAC3C,SAAO,iBAAiB,SAAS,sBAAsB,KAAK,MAAM,OAAO;AAC3E;AAEA,eAAe,qBACb,cACA,UACA;AACA,QAAM,cAAc,MAAM,QAAQA,MAAK,OAAO,GAAG,qBAAqB,CAAC;AACvE,QAAM,eAAeA,MAAK,aAAa,aAAa;AAEpD,QAAM,SAAS,cAAc,YAAY;AAEzC,aAAW,UAAU,CAAC,QAAQ,MAAM,GAAG;AACrC,UAAM,gBAAgB,GAAG,YAAY,GAAG,MAAM;AAE9C,QAAI,CAACE,YAAW,aAAa,GAAG;AAC9B;AAAA,IACF;AAEA,UAAM,SAAS,eAAe,GAAG,YAAY,GAAG,MAAM,EAAE;AAAA,EAC1D;AAEA,MAAI;AACF,WAAO,MAAM,SAAS,YAAY;AAAA,EACpC,UAAE;AACA,UAAM,GAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACxD;AACF;AAEA,eAAe,gCACb,cACA,WACA;AACA,QAAM,iCAAiC,YAAY;AACjD,UAAM,EAAE,aAAa,IAAI,MAAM,iBAAiB;AAChD,UAAM,WAAW,IAAI,aAAa,cAAc,EAAE,UAAU,KAAK,CAAC;AAElE,QAAI;AACF,YAAM,YAAY,SAAS;AAAA,QACzB;AAAA,MACF;AAEA,iBAAW,OAAO,UAAU,QAAQ,GAAmC;AACrE;AAAA,UACE;AAAA,YACE,IAAI;AAAA,YACJ,GAAG,YAAY,YAAY,IAAI,EAAE;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,eAAS,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,6BACb,cACA,WACA;AACA,MAAI;AACF,UAAM,gCAAgC,cAAc,SAAS;AAAA,EAC/D,SAAS,OAAO;AACd,QAAI,CAAC,oBAAoB,KAAK,GAAG;AAC/B,YAAM;AAAA,IACR;AAEA,UAAM,qBAAqB,cAAc,OAAO,iBAAiB;AAC/D,YAAM,gCAAgC,cAAc,SAAS;AAAA,IAC/D,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBACP,SACA,OACA,KACA,aACA,QACA,aACA,mBACA,QACA;AACA,MAAI,OAAO,IAAI,QAAQ,EAAE,GAAG;AAC1B;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,EAAE;AAErB,QAAM,cAAc,kBAAkB,QAAQ,MAAM;AAEpD,MAAI,YAAY,SAAS,GAAG;AAC1B;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,KAAK,QAAQ,KAAK,OAAO;AAE1C,MAAI,OAAO,SAAS,OAAO,KAAK;AAC9B;AAAA,EACF;AAEA,QAAM,YAAY,mBAAmB,QAAQ,OAAO;AAEpD,sBAAoB,QAAQ,MAAM,aAAa,SAAS;AACxD,sBAAoB,aAAa,WAAW,WAAW;AAEvD,MAAI,QAAQ,aAAa;AACvB,wBAAoB,mBAAmB,WAAW,WAAW;AAAA,EAC/D;AACF;AAEA,eAAsB,iBACpB,OACA,KACuB;AACvB,QAAM,SAAS,MAAM,kBAAkB;AACvC,QAAM,SAA4B,oBAAI,IAAI;AAC1C,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,cAAc,qBAAqB,KAAK,EAAE;AAChD,QAAM,cAAc,oBAAI,IAA8B;AACtD,QAAM,oBAAoB,oBAAI,IAA8B;AAE5D,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,6BAA6B,OAAO,MAAM,CAAC,YAAY;AAC3D;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,UAAU,MAAM,kBAAkB,IAAI;AAE5C;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9RO,SAAS,mBACd,gBACA,KACqB;AACrB,QAAM,YAAY,YACf,IAAI,CAAC,aAAa,eAAe,QAAQ,CAAC,EAC1C,OAAO,CAAC,YAAqC,YAAY,IAAI;AAEhE,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,OAAO,WAAW,GAAG;AAClD;AAEA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAAyD;AACvD,QAAM,kBACJ,oBAAoB,SAAS,qBAAqB;AACpD,QAAM,iBAA0D;AAAA,IAC9D,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACA,QAAM,WAAqB,CAAC;AAE5B,aAAW,YAAY,iBAAiB;AACtC,UAAM,UACJ,aAAa,WACT,MAAM,eAAe,OAAO,GAAG,IAC/B,aAAa,UACX,MAAM,cAAc,OAAO,KAAK,QAAQ,IACxC,MAAM,iBAAiB,OAAO,GAAG;AAEzC,mBAAe,QAAQ,IAAI,SAAS,OAAO,IAAI,UAAU;AAAA,EAC3D;AAEA,SAAO,EAAE,gBAAgB,SAAS;AACpC;;;Ab/BA,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,mBAAmB,iBAAiB;AAC1C,IAAM,sBAAsB;AAE5B,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBlB,SAAS,YAAY;AACnB,UAAQ,OAAO,MAAM,SAAS;AAChC;AAEA,SAAS,aAAa,QAAiD;AACrE;AAAA,IACE;AAAA,IACA,GAAG,OAAO,WAAW;AAAA,MACnB,QAAQ,GAAG,SAAS,OAAO;AAAA,MAC3B,QAAQ,GAAG,SAAS,OAAO;AAAA,MAC3B,MAAM,GAAG;AAAA,MACT,MAAM,GAAG;AAAA,MACT,KAAK,GAAG;AAAA,MACR,QAAQ,GAAG;AAAA,MACX,OAAO,GAAG;AAAA,MACV,UAAU,GAAG;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YACP,WACA,WACA;AACA,MAAI,WAAW;AACb,OAAG,WAAW,GAAG,OAAO,MAAM,CAAC,OAAO,OAAO,MAAM,CAAU,CAAC;AAE9D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACb,UAAM,kBAAkB,QAAQ,SAAS,EAAE,YAAY;AAEvD,QAAI,oBAAoB,QAAQ;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,SAAS;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBACb,YACA,QACA,KACA,YACA;AACA,MAAI,WAAW,OAAO;AACpB,kBAAc,YAAY,KAAK,MAAM;AAErC;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,MAAM,OAAO,KAAK,GAAG,GAAG,EAAE,SAAS,IAAI,CAAC,EAC7D,OAAO,EAAE,OAAO,iBAAiB,CAAC,EAClC,QAAQ,EAAE,WAAW,CAAC,EACtB,IAAI,EACJ,SAAS;AAEZ,gBAAc,YAAY,SAAS;AACrC;AAEA,SAAS,gBAAgB,YAAoB,SAA4B;AACvE,gBAAc,YAAY,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC3E;AAEA,SAAS,mBAAmB,SAAyC;AACnE,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ,MAAM,IAAI,CAAC,SAAS;AAAA,MACjC,MAAM,gBAAgB,IAAI,IAAI;AAAA,MAC9B,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,cAAc,IAAI;AAAA,MAClB,WAAW,IAAI;AAAA,IACjB,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,gBAAgB;AACvB,QAAM,QAAQ,oBAAI,KAAK;AAEvB,QAAM,SAAS,GAAG,GAAG,GAAG,CAAC;AACzB,QAAM,YAAY,MAAM,YAAY,IAAI,CAAC;AAEzC,QAAM,MAAM,oBAAI,KAAK;AAErB,MAAI,SAAS,IAAI,IAAI,IAAI,GAAG;AAE5B,SAAO,EAAE,OAAO,IAAI;AACtB;AAEA,SAAS,0BACP,gBACA,WACA;AACA,aAAW,YAAY,WAAW;AAChC,UAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAEnD,YAAQ,OAAO,MAAM,GAAG,oBAAoB,QAAQ,CAAC,IAAI,KAAK;AAAA,CAAI;AAAA,EACpE;AACF;AAEA,SAAS,sBAAsB,QAAsB;AACnD,SAAO,YAAY,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC;AAC9C;AAEA,SAAS,mBACP,QACA,gBACA,KACA;AACA,MAAI,CAAC,OAAO,KAAK;AACf,WAAO,wBAAwB,gBAAgB,sBAAsB,MAAM,CAAC;AAAA,EAC9E;AAEA,QAAM,SAAS,mBAAmB,gBAAgB,GAAG;AAErD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,MAAM;AAChB;AAEA,SAAS,uBACP,gBACA;AACA,SAAO,YACJ,OAAO,CAAC,aAAa,eAAe,QAAQ,MAAM,IAAI,EACtD,IAAI,CAAC,aAAa,cAAc,QAAQ,EAAE,KAAK,EAC/C,KAAK,KAAK;AACf;AAEA,SAAS,wBACP,gBACA,WACA;AACA,QAAM,oBACJ,UAAU,SAAS,IACf,UAAU,OAAO,CAAC,aAAa,eAAe,QAAQ,CAAC,IACvD,YAAY,OAAO,CAAC,aAAa,eAAe,QAAQ,CAAC;AAE/D,MAAI,UAAU,SAAS,KAAK,kBAAkB,SAAS,UAAU,QAAQ;AACvE,UAAM,UAAU,UAAU,OAAO,CAAC,aAAa,CAAC,eAAe,QAAQ,CAAC;AAExE,UAAM,IAAI;AAAA,MACR,sCAAsC,QAAQ,IAAI,CAAC,aAAa,oBAAoB,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IAC3G;AAAA,EACF;AAEA,MAAI,kBAAkB,WAAW,GAAG;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,kBAAkB,IAAI,CAAC,aAAa,eAAe,QAAQ,CAAE;AACtE;AAEA,SAAS,gBACP,YACA,QACA,WACA,WACA,SACA,UACA;AACA,UAAQ,OAAO;AAAA,IACb,GAAG,KAAK;AAAA,MACN;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,gBAAgB,SAAS;AAAA,QACpC,SAAS,gBAAgB,OAAO;AAAA,QAChC;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA,EACH;AACF;AAEA,eAAe,OAAO;AACpB,MAAI;AAEJ,QAAM,SAAS,UAAU;AAAA,IACvB,SAAS;AAAA,MACP,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,MACrC,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,MACrC,MAAM,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,MACpD,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACxC,KAAK,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,QAAQ,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC1C,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACzC,UAAU,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC9C;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,eAAa,OAAO,MAAM;AAE1B,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,OAAO,MAAM;AACf,cAAU;AAEV;AAAA,EACF;AAEA,MAAI;AACF,cAAU,IAAI;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC,EAAE,MAAM;AAET,UAAM,EAAE,OAAO,IAAI,IAAI,cAAc;AACrC,UAAM,YAAuB,OAAO,OAAO,SAAS;AACpD,UAAM,SAAS,YAAY,OAAO,QAAQ,OAAO,MAAM;AACvD,UAAM,qBAAqB,OAAO,MAAM,cAAc,sBAAsB,MAAM;AAClF,UAAM,qBACJ,mBAAmB,SAAS,IAAI,qBAAqB;AACvD,UAAM,EAAE,gBAAgB,SAAS,IAAI,MAAM,eAAe;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,YAAQ,KAAK;AAEb,eAAW,WAAW,UAAU;AAC9B,cAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IACrC;AAEA,8BAA0B,gBAAgB,kBAAkB;AAE5D,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,aAAaC;AAAA,MACjB,OAAO,UAAU,uBAAuB,MAAM;AAAA,IAChD;AAEA,cAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAElD,QAAI,WAAW,QAAQ;AACrB,cAAQ,MAAM,0BAA0B;AAExC,YAAM,UAA6B;AAAA,QACjC,SAAS;AAAA,QACT,OAAO,gBAAgB,KAAK;AAAA,QAC5B,KAAK,gBAAgB,GAAG;AAAA,QACxB,WAAW,gBAAgB;AAAA,UAAI,CAAC,aAC9B,mBAAmB,QAAQ;AAAA,QAC7B;AAAA,MACF;AAEA,cAAQ,OAAO;AACf,sBAAgB,YAAY,OAAO;AAAA,IACrC,OAAO;AACL,cAAQ,MAAM,uBAAuB;AAErC,YAAM,MAAM,uBAAuB;AAAA,QACjC,WAAW;AAAA,QACX,SAAS;AAAA,QACT;AAAA,QACA,UAAU,gBAAgB,IAAI,CAAC,EAAE,UAAU,OAAO,SAAS,OAAO;AAAA,UAChE;AAAA,UACA;AAAA,UACA,OACE,aAAa,QACT,uBAAuB,cAAc,IACrC,cAAc,QAAQ,EAAE;AAAA,UAC9B,cAAc,cAAc,QAAQ,EAAE;AAAA,UACtC,QAAQ,cAAc,QAAQ,EAAE;AAAA,QAClC,EAAE;AAAA,MACJ,CAAC;AACD,YAAM,aAAa,cAAc,SAAS,YAAY;AAEtD,cAAQ,OAAO;AACf,YAAM,iBAAiB,YAAY,QAAQ,KAAK,UAAU;AAAA,IAC5D;AAEA,YAAQ,QAAQ,mBAAmB;AAEnC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,IAAI,CAAC,EAAE,SAAS,MAAM,QAAQ;AAAA,IAChD;AAAA,EACF,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,QAAI,SAAS;AACX,cAAQ,KAAK,WAAW,OAAO,EAAE;AAAA,IACnC,OAAO;AACL,cAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IACrC;AAEA,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,KAAK,KAAK;","names":["resolve","registry","maxBytes","join","join","homedir","join","resolve","resolve","join","homedir","filePath","maxRecordBytes","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","resolve"]}
|