dsh-ssh-tui 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +158 -0
- package/README.en.md +118 -15
- package/README.md +78 -13
- package/docs/release-notes-0.7.4.md +91 -0
- package/docs/release-notes-0.8.0.md +56 -0
- package/docs/release-notes-0.8.1.md +79 -0
- package/docs/release-notes-0.8.2-rc.1.md +159 -0
- package/docs/release-notes-0.8.2.md +62 -0
- package/docs/screenshots/reconnect.gif +0 -0
- package/docs/terminals.md +23 -0
- package/docs/windows.md +13 -0
- package/lib/approval-state.js +148 -0
- package/lib/approval-state.js.map +1 -0
- package/lib/auth-failure.js +38 -0
- package/lib/auth-failure.js.map +1 -1
- package/lib/color-depth.js +26 -0
- package/lib/color-depth.js.map +1 -1
- package/lib/copy-text.js +30 -8
- package/lib/copy-text.js.map +1 -1
- package/lib/dialogs.js +81 -0
- package/lib/dialogs.js.map +1 -1
- package/lib/display-sock.js +138 -23
- package/lib/display-sock.js.map +1 -1
- package/lib/footer-accents.js +28 -0
- package/lib/footer-accents.js.map +1 -0
- package/lib/footer-budget.js +328 -0
- package/lib/footer-budget.js.map +1 -0
- package/lib/footer-format.js +433 -0
- package/lib/footer-format.js.map +1 -0
- package/lib/footer-layout.js +407 -0
- package/lib/footer-layout.js.map +1 -0
- package/lib/footer-meters.js +185 -0
- package/lib/footer-meters.js.map +1 -0
- package/lib/footer.js +19 -558
- package/lib/footer.js.map +1 -1
- package/lib/i18n/en.js +65 -5
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +67 -5
- package/lib/i18n/zh.js.map +1 -1
- package/lib/paint.js +53 -8
- package/lib/paint.js.map +1 -1
- package/lib/plan-projection.js +291 -0
- package/lib/plan-projection.js.map +1 -0
- package/lib/plan.js +50 -0
- package/lib/plan.js.map +1 -1
- package/lib/question-state.js +83 -0
- package/lib/question-state.js.map +1 -0
- package/lib/representation.js +283 -0
- package/lib/representation.js.map +1 -0
- package/lib/screen.js +105 -0
- package/lib/screen.js.map +1 -0
- package/lib/selection.js +5 -3
- package/lib/selection.js.map +1 -1
- package/lib/startup.js +49 -0
- package/lib/startup.js.map +1 -1
- package/lib/stats.js +101 -3
- package/lib/stats.js.map +1 -1
- package/lib/term-text.js +154 -55
- package/lib/term-text.js.map +1 -1
- package/lib/theme.js +20 -3
- package/lib/theme.js.map +1 -1
- package/lib/throughput.js +305 -0
- package/lib/throughput.js.map +1 -0
- package/lib/tool-present.js +57 -7
- package/lib/tool-present.js.map +1 -1
- package/lib/tui.js +3776 -1105
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-state.d.ts +75 -0
- package/lib/types/auth-failure.d.ts +25 -0
- package/lib/types/color-depth.d.ts +21 -0
- package/lib/types/copy-text.d.ts +18 -1
- package/lib/types/dialogs.d.ts +111 -1
- package/lib/types/display-sock.d.ts +15 -0
- package/lib/types/footer-accents.d.ts +22 -0
- package/lib/types/footer-budget.d.ts +204 -0
- package/lib/types/footer-format.d.ts +221 -0
- package/lib/types/footer-layout.d.ts +292 -0
- package/lib/types/footer-meters.d.ts +151 -0
- package/lib/types/footer.d.ts +19 -269
- package/lib/types/paint.d.ts +48 -0
- package/lib/types/plan-projection.d.ts +162 -0
- package/lib/types/plan.d.ts +13 -0
- package/lib/types/question-state.d.ts +96 -0
- package/lib/types/representation.d.ts +498 -0
- package/lib/types/screen.d.ts +126 -0
- package/lib/types/startup.d.ts +24 -0
- package/lib/types/stats.d.ts +64 -1
- package/lib/types/term-text.d.ts +45 -1
- package/lib/types/throughput.d.ts +163 -0
- package/lib/types/tool-present.d.ts +41 -0
- package/lib/types/transcript-types.d.ts +63 -2
- package/lib/types/tui.d.ts +862 -11
- package/package.json +16 -6
package/lib/footer.js
CHANGED
|
@@ -1,566 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*/
|
|
4
|
-
import { t } from './i18n/index.js';
|
|
5
|
-
import { pinEmojiCells, truncateAnsiToWidth, visibleWidth } from './term-text.js';
|
|
6
|
-
import { describeSubagentFit, subagentProviderDiffers } from './subagent-model.js';
|
|
7
|
-
import { activeTheme, themeExtraToken, themeThresholdToken, themeToken } from './theme.js';
|
|
8
|
-
import { downgradeSgr } from './color-depth.js';
|
|
9
|
-
import { commandCodeSourceFor, formatQuotaStatusLine, openCodeSourceFor, } from './quota.js';
|
|
10
|
-
export const WAIT_INDICATOR_MS = 8000;
|
|
11
|
-
/** Compact token count, matching the web stats line (517 / 12.2K / 1.2M). */
|
|
12
|
-
export function formatTokens(n) {
|
|
13
|
-
const scaled = (value) => value >= 100 ? String(Math.round(value)) : String(Math.round(value * 10) / 10);
|
|
14
|
-
if (n < 1_000)
|
|
15
|
-
return String(n);
|
|
16
|
-
if (n < 1_000_000)
|
|
17
|
-
return `${scaled(n / 1_000)}K`;
|
|
18
|
-
return `${scaled(n / 1_000_000)}M`;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Prompt occupancy of the next request, from DSH `contextPressure`.
|
|
22
|
-
* Provider-agnostic: uses the routed model's advertised window, not a
|
|
23
|
-
* hardcoded xAI size. Compaction-basic still owns in-turn pressure at 80%.
|
|
24
|
-
*/
|
|
25
|
-
export const CONTEXT_PRESSURE_WARN_RATIO = 0.8;
|
|
26
|
-
export const CONTEXT_PRESSURE_DANGER_RATIO = 0.95;
|
|
27
|
-
/** Idle auto-compact starts here so recovery finishes before the 80% in-turn trigger. */
|
|
28
|
-
export const CONTEXT_IDLE_COMPACT_RATIO = 0.72;
|
|
29
|
-
/** Prompt-side occupancy of one usage sample: uncached input plus cache traffic. */
|
|
30
|
-
export function promptPressureTokens(usage) {
|
|
31
|
-
return usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
|
|
32
|
-
}
|
|
33
|
-
/** Prefer the next-request projection; fall back to last-request pressure. */
|
|
34
|
-
export function contextPressureUsedTokens(pressure) {
|
|
35
|
-
if (pressure === undefined)
|
|
36
|
-
return undefined;
|
|
37
|
-
if (typeof pressure.projectedTokens === 'number' && Number.isFinite(pressure.projectedTokens)) {
|
|
38
|
-
return Math.max(0, pressure.projectedTokens);
|
|
39
|
-
}
|
|
40
|
-
if (typeof pressure.pressureTokens === 'number' && Number.isFinite(pressure.pressureTokens)) {
|
|
41
|
-
return Math.max(0, pressure.pressureTokens);
|
|
42
|
-
}
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
export function parseContextPressure(value) {
|
|
46
|
-
if (value === null || typeof value !== 'object')
|
|
47
|
-
return undefined;
|
|
48
|
-
const raw = value;
|
|
49
|
-
const window = typeof raw.contextWindow === 'number' && Number.isFinite(raw.contextWindow)
|
|
50
|
-
? raw.contextWindow
|
|
51
|
-
: undefined;
|
|
52
|
-
if (window === undefined || window <= 0)
|
|
53
|
-
return undefined;
|
|
54
|
-
const used = contextPressureUsedTokens({
|
|
55
|
-
...(typeof raw.projectedTokens === 'number' ? { projectedTokens: raw.projectedTokens } : {}),
|
|
56
|
-
...(typeof raw.pressureTokens === 'number' ? { pressureTokens: raw.pressureTokens } : {}),
|
|
57
|
-
});
|
|
58
|
-
if (used === undefined)
|
|
59
|
-
return undefined;
|
|
60
|
-
return { usedTokens: used, contextWindow: window };
|
|
61
|
-
}
|
|
62
|
-
export function contextPressureView(sample) {
|
|
63
|
-
const percent = (sample.usedTokens / sample.contextWindow) * 100;
|
|
64
|
-
return {
|
|
65
|
-
usedTokens: sample.usedTokens,
|
|
66
|
-
contextWindow: sample.contextWindow,
|
|
67
|
-
percent,
|
|
68
|
-
level: percent >= CONTEXT_PRESSURE_DANGER_RATIO * 100
|
|
69
|
-
? 'danger'
|
|
70
|
-
: percent >= CONTEXT_PRESSURE_WARN_RATIO * 100
|
|
71
|
-
? 'warn'
|
|
72
|
-
: 'ok',
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 8-segment Braille ring. Empty `⣀`; full `⣿`. Width is always 1 cell.
|
|
77
|
-
* Index is `ceil(percent / 12.5)` clamped to 0..8.
|
|
78
|
-
*/
|
|
79
|
-
export const CONTEXT_RING_EMPTY = '⣀';
|
|
80
|
-
export const CONTEXT_RING_SEGMENTS = ['⣀', '⠉', '⠋', '⠛', '⠞', '⠟', '⠿', '⡿', '⣿'];
|
|
81
|
-
/** The full cell of the same Braille family, for bars built like the ring. */
|
|
82
|
-
export const CONTEXT_RING_FULL = '⣿';
|
|
83
|
-
export function formatContextPressureRing(percent) {
|
|
84
|
-
if (!Number.isFinite(percent) || percent <= 0)
|
|
85
|
-
return CONTEXT_RING_EMPTY;
|
|
86
|
-
const filled = Math.min(8, Math.max(0, Math.ceil(percent / 12.5)));
|
|
87
|
-
return CONTEXT_RING_SEGMENTS[filled] ?? '⣿';
|
|
88
|
-
}
|
|
89
|
-
export function contextPressureRingColor(level) {
|
|
90
|
-
return themeThresholdToken(activeTheme(), level === 'danger' ? 'over' : level === 'warn' ? 'warn' : 'ok');
|
|
91
|
-
}
|
|
92
|
-
export function formatContextPressureChip(view, color = false) {
|
|
93
|
-
const ring = formatContextPressureRing(view.percent);
|
|
94
|
-
const painted = color
|
|
95
|
-
? `\x1b[${contextPressureRingColor(view.level)}m${ring}\x1b[0m`
|
|
96
|
-
: ring;
|
|
97
|
-
return t('footer.contextRing', {
|
|
98
|
-
ring: painted,
|
|
99
|
-
used: formatTokens(view.usedTokens),
|
|
100
|
-
window: formatTokens(view.contextWindow),
|
|
101
|
-
percent: Math.round(view.percent),
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
export function formatContextPressureStatusLine(view) {
|
|
105
|
-
if (view === undefined)
|
|
106
|
-
return t('status.contextNone');
|
|
107
|
-
return t('status.contextLine', {
|
|
108
|
-
used: formatTokens(view.usedTokens),
|
|
109
|
-
window: formatTokens(view.contextWindow),
|
|
110
|
-
percent: view.percent.toFixed(1),
|
|
111
|
-
level: t(`status.contextLevel.${view.level}`),
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
export function contextPressureAlertText(view) {
|
|
115
|
-
const vars = {
|
|
116
|
-
used: formatTokens(view.usedTokens),
|
|
117
|
-
window: formatTokens(view.contextWindow),
|
|
118
|
-
percent: view.percent.toFixed(0),
|
|
119
|
-
};
|
|
120
|
-
return view.level === 'danger'
|
|
121
|
-
? t('context.alertDanger', vars)
|
|
122
|
-
: t('context.alertWarn', vars);
|
|
123
|
-
}
|
|
124
|
-
export function shouldIdleAutoCompact(view) {
|
|
125
|
-
if (view === undefined)
|
|
126
|
-
return false;
|
|
127
|
-
return view.usedTokens / view.contextWindow >= CONTEXT_IDLE_COMPACT_RATIO;
|
|
128
|
-
}
|
|
129
|
-
/** Compact duration, matching the web stats line (45.2s / 2m42s). */
|
|
130
|
-
export function formatDuration(ms) {
|
|
131
|
-
const seconds = ms / 1_000;
|
|
132
|
-
if (seconds < 60)
|
|
133
|
-
return `${Math.round(seconds * 10) / 10}s`;
|
|
134
|
-
const whole = Math.round(seconds);
|
|
135
|
-
return `${Math.floor(whole / 60)}m${whole % 60}s`;
|
|
136
|
-
}
|
|
137
|
-
export function formatTokensPerSecond(tokensPerSecond) {
|
|
138
|
-
// A slow step (a few tokens over tens of seconds) still decoded something;
|
|
139
|
-
// rounding that to "0 tok/s" reads as a stalled model.
|
|
140
|
-
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0)
|
|
141
|
-
return '0 tok/s';
|
|
142
|
-
if (tokensPerSecond < 0.5)
|
|
143
|
-
return '<1 tok/s';
|
|
144
|
-
return `${Math.round(tokensPerSecond)} tok/s`;
|
|
145
|
-
}
|
|
146
|
-
export function providerShortCode(provider) {
|
|
147
|
-
const id = provider.trim();
|
|
148
|
-
if (id === 'deepseek-official' || id === 'deepseek')
|
|
149
|
-
return t('route.deepseek');
|
|
150
|
-
if (id === 'xai' || id === 'grok' || id.startsWith('xai-'))
|
|
151
|
-
return 'SuperGrok';
|
|
152
|
-
if (id === 'opencode-go')
|
|
153
|
-
return 'OpenCode Go';
|
|
154
|
-
if (id === 'opencode')
|
|
155
|
-
return 'OpenCode Zen';
|
|
156
|
-
return id;
|
|
157
|
-
}
|
|
158
|
-
/** Stats groups in drop order (last is dropped first when the row is too wide). */
|
|
159
|
-
export function footerStatsGroups(stats) {
|
|
160
|
-
const groups = [];
|
|
161
|
-
if (stats.steps > 0)
|
|
162
|
-
groups.push(t('footer.turnsSteps', { turns: stats.turns, steps: stats.steps }));
|
|
163
|
-
const billedInput = stats.inputTokens + stats.cacheReadTokens + stats.cacheWriteTokens;
|
|
164
|
-
if (billedInput > 0 || stats.outputTokens > 0) {
|
|
165
|
-
groups.push(t('footer.tokens', { input: formatTokens(billedInput), output: formatTokens(stats.outputTokens) }));
|
|
166
|
-
}
|
|
167
|
-
const speeds = [];
|
|
168
|
-
if (stats.decodeMs > 0 && stats.decodeTokens > 0) {
|
|
169
|
-
speeds.push(formatTokensPerSecond(stats.decodeTokens / (stats.decodeMs / 1_000)));
|
|
170
|
-
}
|
|
171
|
-
else if (stats.ttftSteps > 0) {
|
|
172
|
-
speeds.push(t('footer.ttft', { duration: formatDuration(stats.ttftMs / stats.ttftSteps) }));
|
|
173
|
-
}
|
|
174
|
-
if (speeds.length > 0)
|
|
175
|
-
groups.push(speeds.join(' '));
|
|
176
|
-
const durations = [];
|
|
177
|
-
if (stats.llmMs > 0)
|
|
178
|
-
durations.push(t('footer.llmMs', { duration: formatDuration(stats.llmMs) }));
|
|
179
|
-
if (stats.toolMs > 0)
|
|
180
|
-
durations.push(t('footer.toolMs', { duration: formatDuration(stats.toolMs) }));
|
|
181
|
-
if (durations.length > 0)
|
|
182
|
-
groups.push(durations.join(' '));
|
|
183
|
-
if (billedInput > 0)
|
|
184
|
-
groups.push(t('footer.cacheHit', { percent: Math.round(stats.cacheReadTokens / billedInput * 100) }));
|
|
185
|
-
return groups;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Fit an ordered strip into `width` cells, losing text before graphics.
|
|
2
|
+
* The footer, in four parts — and the module every caller has always imported.
|
|
189
3
|
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* again lowest priority first. The result never exceeds the width.
|
|
4
|
+
* `tui.ts` paints from here, `/status` reports from here, and a dozen tests
|
|
5
|
+
* reach in through this path. The pass that turned the strip into a status row
|
|
6
|
+
* split the file along the four responsibilities that had grown together inside
|
|
7
|
+
* it; this module stays as the barrel so that split cost no call site:
|
|
195
8
|
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*/
|
|
201
|
-
export function fitFooterChips(chips, width, separator = ' │ ') {
|
|
202
|
-
const limit = Math.max(1, width);
|
|
203
|
-
const state = chips
|
|
204
|
-
.filter(chip => chip.long !== '' || chip.short !== '')
|
|
205
|
-
.map(chip => ({ chip, full: true, present: true }));
|
|
206
|
-
const render = () => state
|
|
207
|
-
.filter(entry => entry.present)
|
|
208
|
-
.map(entry => (entry.full ? entry.chip.long : entry.chip.short))
|
|
209
|
-
.filter(text => text !== '')
|
|
210
|
-
.join(separator);
|
|
211
|
-
// Budget the way it will be painted: the frame pins a symbol like ⚠ with a
|
|
212
|
-
// variation selector and a reserving space, so the raw string measures one or
|
|
213
|
-
// two cells narrower than the row it becomes. Fitting the unpinned text left
|
|
214
|
-
// a row that overflowed the terminal by exactly that much.
|
|
215
|
-
const used = () => visibleWidth(pinEmojiCells(render()));
|
|
216
|
-
const byLeastImportant = [...state].sort((a, b) => b.chip.priority - a.chip.priority);
|
|
217
|
-
for (const entry of byLeastImportant) {
|
|
218
|
-
if (used() <= limit)
|
|
219
|
-
break;
|
|
220
|
-
entry.full = false;
|
|
221
|
-
}
|
|
222
|
-
for (const entry of byLeastImportant) {
|
|
223
|
-
if (used() <= limit)
|
|
224
|
-
break;
|
|
225
|
-
entry.present = false;
|
|
226
|
-
}
|
|
227
|
-
if (state.length > 0 && state.every(entry => !entry.present)) {
|
|
228
|
-
// Nothing fits, not even the glyphs. Keeping the most important group and
|
|
229
|
-
// letting the clip shorten it beats handing the user a blank row: a ⚠ cut
|
|
230
|
-
// to one cell still says the install is broken.
|
|
231
|
-
const best = [...state].sort((a, b) => a.chip.priority - b.chip.priority)[0];
|
|
232
|
-
if (best !== undefined) {
|
|
233
|
-
best.present = true;
|
|
234
|
-
best.full = false;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
return truncateAnsiToWidth(render(), limit);
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* The roster's health as a chip: absent means `/mode` cannot switch presets and
|
|
241
|
-
* the preset-owned tools are missing. It leads the strip and keeps its glyph
|
|
242
|
-
* longest, because it is the one group that reports a broken install.
|
|
243
|
-
*/
|
|
244
|
-
export function footerHealthChip(missing, color = false,
|
|
245
|
-
/** Which rows are missing: the 0.1.5 roster, or the 0.1.7 agent plane. */
|
|
246
|
-
kind = 'roster') {
|
|
247
|
-
if (!missing)
|
|
248
|
-
return undefined;
|
|
249
|
-
const glyph = color ? `\x1b[${themeExtraToken(activeTheme(), 'warn')}m⚠\x1b[0m` : '⚠';
|
|
250
|
-
return {
|
|
251
|
-
id: 'health',
|
|
252
|
-
long: `${glyph} ${t(kind === 'agent-plane' ? 'footer.agentPlaneMissing' : 'footer.rosterMissing')}`,
|
|
253
|
-
short: glyph,
|
|
254
|
-
priority: 0,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
export function fitFooterStatsLine(chip, groups, width) {
|
|
258
|
-
const kept = [...groups];
|
|
259
|
-
const render = () => kept.length === 0 ? chip : `${chip} │ ${kept.join(' │ ')}`;
|
|
260
|
-
while (kept.length > 0 && visibleWidth(render()) > width)
|
|
261
|
-
kept.pop();
|
|
262
|
-
return truncateAnsiToWidth(render(), Math.max(1, width));
|
|
263
|
-
}
|
|
264
|
-
export function footerActivity(input) {
|
|
265
|
-
if (input.planReview)
|
|
266
|
-
return { kind: 'plan-review', text: t('footer.planReview') };
|
|
267
|
-
if (input.waitingQuestion)
|
|
268
|
-
return { kind: 'waiting', text: t('footer.waiting') };
|
|
269
|
-
if (input.compacting)
|
|
270
|
-
return { kind: 'compacting', text: t('footer.compacting') };
|
|
271
|
-
// Only a running turn can be retrying: a chip left over from a finished turn
|
|
272
|
-
// (a missed event, or a retry of a background request such as the session
|
|
273
|
-
// title) must not hide the state the user is actually in.
|
|
274
|
-
if (input.running && input.retry !== undefined) {
|
|
275
|
-
return { kind: 'retry', text: t('footer.retry', { retry: input.retry.retry, max: input.retry.maxRetries }) };
|
|
276
|
-
}
|
|
277
|
-
if (input.subagents > 0)
|
|
278
|
-
return { kind: 'subagents', text: t('footer.subagents', { count: input.subagents }) };
|
|
279
|
-
if (input.running && input.tools > 0)
|
|
280
|
-
return { kind: 'tools', text: t('footer.tools', { count: input.tools }) };
|
|
281
|
-
if (input.planLeftOpen)
|
|
282
|
-
return { kind: 'plan-open', text: t('footer.planOpen') };
|
|
283
|
-
if (input.planPending)
|
|
284
|
-
return { kind: 'plan-pending', text: t('footer.planSwitching') };
|
|
285
|
-
if (input.planActive)
|
|
286
|
-
return { kind: 'plan-pending', text: t('footer.planMode') };
|
|
287
|
-
if (input.goalPhase === 'active')
|
|
288
|
-
return { kind: 'goal', text: t('footer.goalActive') };
|
|
289
|
-
if (input.goalPhase === 'paused')
|
|
290
|
-
return { kind: 'goal', text: t('footer.goalPaused') };
|
|
291
|
-
if (input.goalPhase === 'blocked')
|
|
292
|
-
return { kind: 'goal', text: t('footer.goalBlocked') };
|
|
293
|
-
if (input.running && input.idleMs > WAIT_INDICATOR_MS) {
|
|
294
|
-
return { kind: 'waiting-llm', text: t('footer.waitSeconds', { seconds: Math.floor(input.idleMs / 1000) }) };
|
|
295
|
-
}
|
|
296
|
-
if (input.running)
|
|
297
|
-
return { kind: 'idle', text: t('footer.running') };
|
|
298
|
-
return { kind: 'idle', text: t('footer.idle') };
|
|
299
|
-
}
|
|
300
|
-
/** Short remaining-quota bar: 8 pips, filled from the left. */
|
|
301
|
-
export function formatQuotaBar(remainingPercent, width = 8) {
|
|
302
|
-
const remaining = Math.max(0, Math.min(100, remainingPercent));
|
|
303
|
-
const filled = Math.round(remaining / 100 * width);
|
|
304
|
-
return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* `sub:<model>` chip for the identity row: `sub:grok-4.5`, or
|
|
308
|
-
* `sub:grok-4.5(xhigh)` when an explicit `/subeffort` is set.
|
|
9
|
+
* - `footer-format.ts` — a value in, text out (and the pressure reading).
|
|
10
|
+
* - `footer-meters.ts` — the three meter primitives.
|
|
11
|
+
* - `footer-budget.ts` — the responsive degradation ladder and the row.
|
|
12
|
+
* - `footer-layout.ts` — the two chrome rows, and `/status`.
|
|
309
13
|
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
*/
|
|
314
|
-
export function subagentRouteLabel(model, provider, effort) {
|
|
315
|
-
const id = shortModelName(model);
|
|
316
|
-
if (id === '')
|
|
317
|
-
return '';
|
|
318
|
-
const suffix = effort === undefined || effort.trim() === '' ? '' : `(${effort.trim()})`;
|
|
319
|
-
const host = provider === undefined || provider.trim() === '' ? '' : `${provider.trim()}/`;
|
|
320
|
-
return `sub:${host}${id}${suffix}`;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Paint the `sub:` chip on an otherwise muted status line.
|
|
14
|
+
* The one helper they all share — `accent`, the "paint this run in this role's
|
|
15
|
+
* colour" primitive — lives in `color-depth.ts` beside `downgradeSgr`, which is
|
|
16
|
+
* where "what can this terminal take" is already answered.
|
|
324
17
|
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
* back onto the parent's own provider) keeps the identity row's mute — the
|
|
328
|
-
* accent means "this route is not your parent's", and spending it on every
|
|
329
|
-
* child made the following case look pinned.
|
|
330
|
-
*
|
|
331
|
-
* The mute (`90`) is reopened after the chip so the rest of the identity row
|
|
332
|
-
* stays dim.
|
|
333
|
-
*/
|
|
334
|
-
export function paintFooterSubagentChip(line, chip, foreign, muteSgr = themeToken(activeTheme(), 'system'), depth = 'truecolor', identitySgr = themeExtraToken(activeTheme(), 'subagent-foreign')) {
|
|
335
|
-
if (!foreign || chip === '' || !line.includes(chip))
|
|
336
|
-
return line;
|
|
337
|
-
const code = downgradeSgr(identitySgr, depth);
|
|
338
|
-
if (code === '')
|
|
339
|
-
return line;
|
|
340
|
-
const mute = muteSgr === '' ? '0' : muteSgr;
|
|
341
|
-
return line.replace(chip, `\x1b[${code}m${chip}\x1b[0m\x1b[${mute}m`);
|
|
342
|
-
}
|
|
343
|
-
export function footerSubagentForeign(input) {
|
|
344
|
-
return subagentProviderDiffers(input.provider, input.subProvider);
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* The model as the footer shows it: the model's own name, without a
|
|
348
|
-
* `provider/model` route prefix.
|
|
349
|
-
*
|
|
350
|
-
* Some providers carry the vendor in the model id (`xai/grok-4.6`,
|
|
351
|
-
* `deepseek-official/deepseek-v4-flash`). The route is worth a row in the header
|
|
352
|
-
* and in `/status`; in the status line it spent cells on something the reader
|
|
353
|
-
* already knows, and it pushed the quota badge towards the drop edge.
|
|
354
|
-
* `sub:` routes keep their provider on purpose — that is a *different* route
|
|
355
|
-
* from the parent's, and hiding it would make the two indistinguishable.
|
|
356
|
-
*/
|
|
357
|
-
export function shortModelName(model) {
|
|
358
|
-
const id = model.trim();
|
|
359
|
-
const slash = id.lastIndexOf('/');
|
|
360
|
-
if (slash < 0)
|
|
361
|
-
return id;
|
|
362
|
-
const tail = id.slice(slash + 1).trim();
|
|
363
|
-
// A trailing slash (or a bare `/`) leaves nothing to show: keep the original.
|
|
364
|
-
return tail === '' ? id : tail;
|
|
365
|
-
}
|
|
366
|
-
export function footerIdentityParts(input) {
|
|
367
|
-
const parts = [];
|
|
368
|
-
if (input.compactView === true)
|
|
369
|
-
parts.push(`[${t('view.footerCompact')}]`);
|
|
370
|
-
if (input.preset !== undefined && input.preset !== '')
|
|
371
|
-
parts.push(`[${input.preset}]`);
|
|
372
|
-
if (input.cwdLabel !== undefined && input.cwdLabel !== '')
|
|
373
|
-
parts.push(input.cwdLabel);
|
|
374
|
-
const modelName = shortModelName(input.model);
|
|
375
|
-
const effort = input.effort === undefined || input.effort.trim() === '' ? '' : input.effort.trim();
|
|
376
|
-
const model = [modelName, effort].filter(part => part !== '').join(' ');
|
|
377
|
-
if (model !== '')
|
|
378
|
-
parts.push(model);
|
|
379
|
-
if (input.balanceText !== undefined && input.balanceText !== '') {
|
|
380
|
-
parts.push(input.balanceText);
|
|
381
|
-
}
|
|
382
|
-
if (input.quotaUnknown === true) {
|
|
383
|
-
parts.push(formatQuotaUnknown());
|
|
384
|
-
}
|
|
385
|
-
else if (input.quotaPercent !== undefined) {
|
|
386
|
-
parts.push(formatFooterQuota(input.quotaPercent, input.quotaCode, input.quotaPeriod));
|
|
387
|
-
}
|
|
388
|
-
if (input.contextChip !== undefined && input.contextChip !== '')
|
|
389
|
-
parts.push(input.contextChip);
|
|
390
|
-
// The subagent route is what every child inherits, so it is always on the
|
|
391
|
-
// line again (hiding it when it repeated the parent model read as a
|
|
392
|
-
// regression) — but it sits after the quota/context chips, which are live
|
|
393
|
-
// operational signals and should be the last thing a narrow row drops.
|
|
394
|
-
const sub = subagentRouteLabel(input.subModel, input.subProvider, input.subEffort);
|
|
395
|
-
if (sub !== '')
|
|
396
|
-
parts.push(sub);
|
|
397
|
-
if (input.search !== undefined)
|
|
398
|
-
parts.push(t('footer.search', { index: input.search.index + 1, total: input.search.total }));
|
|
399
|
-
if (input.foldedInput)
|
|
400
|
-
parts.push(t('footer.inputFolded'));
|
|
401
|
-
else if (input.multiLineInput)
|
|
402
|
-
parts.push(t('footer.multiLine'));
|
|
403
|
-
if (input.queued > 0)
|
|
404
|
-
parts.push(t('footer.queued', { count: input.queued }));
|
|
405
|
-
return parts;
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* `SuperGrok 5Hr ███████░ 82%` — short plan badge, the window the number belongs
|
|
409
|
-
* to, then the bar.
|
|
410
|
-
*
|
|
411
|
-
* The tags are fixed technical labels (`5Hr` / `1Wk` / `1Mo`) rather than
|
|
412
|
-
* localized words: they sit in a footer that is already fighting for cells, and
|
|
413
|
-
* a window tag that changes with the locale would be unreadable in a screenshot
|
|
414
|
-
* or a bug report. Everything else about the window (label, reset time, detail)
|
|
415
|
-
* stays in `/quota`.
|
|
416
|
-
*/
|
|
417
|
-
export function formatFooterQuota(percent, code, period) {
|
|
418
|
-
const bar = `${formatQuotaBar(percent)} ${percent.toFixed(0)}%`;
|
|
419
|
-
const tag = quotaWindowTag(period);
|
|
420
|
-
const name = code === undefined ? '' : code.trim();
|
|
421
|
-
return [name, tag, bar].filter(part => part !== '').join(' ');
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* The quota widget before the first reading arrives, or while the provider
|
|
425
|
-
* cannot be reached: an empty bar and a question mark.
|
|
426
|
-
*
|
|
427
|
-
* Deliberately not `0%`: an unreachable quota API is not a used-up quota, and a
|
|
428
|
-
* number the footer cannot back up is worse than no number. The bar is there
|
|
429
|
-
* from the first frame so the row does not jump when the reading lands.
|
|
430
|
-
*/
|
|
431
|
-
export function formatQuotaUnknown() {
|
|
432
|
-
return `${formatQuotaBar(0)} ?%`;
|
|
433
|
-
}
|
|
434
|
-
/** Fixed-width tag for the window a footer quota number belongs to. */
|
|
435
|
-
export function quotaWindowTag(period) {
|
|
436
|
-
if (period === 'hourly')
|
|
437
|
-
return '5Hr';
|
|
438
|
-
if (period === 'weekly')
|
|
439
|
-
return '1Wk';
|
|
440
|
-
if (period === 'monthly')
|
|
441
|
-
return '1Mo';
|
|
442
|
-
return '';
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* The badge the footer shows instead of the billing plan's own label:
|
|
446
|
-
* `SuperGrok`, `OC·GO` (OpenCode Go), `CC·GOAT` (Command Code Goat).
|
|
447
|
-
*
|
|
448
|
-
* The long names live in `/quota`; this one has to survive next to a model id.
|
|
449
|
-
* Without a `source` (a hand-built snapshot) the plan label is matched instead,
|
|
450
|
-
* so old callers and tests keep a sensible badge.
|
|
451
|
-
*/
|
|
452
|
-
export function shortQuotaPlanName(snapshot) {
|
|
453
|
-
const plan = snapshot.plan.trim();
|
|
454
|
-
if (snapshot.source === 'supergrok')
|
|
455
|
-
return 'SuperGrok';
|
|
456
|
-
if (snapshot.source === 'opencode-go')
|
|
457
|
-
return 'OC·GO';
|
|
458
|
-
if (snapshot.source === 'command-code') {
|
|
459
|
-
const tier = plan === '' || plan.toLowerCase() === 'command code' ? '' : plan.toUpperCase();
|
|
460
|
-
return tier === '' ? 'CC' : `CC·${tier}`;
|
|
461
|
-
}
|
|
462
|
-
if (/supergrok/iu.test(plan))
|
|
463
|
-
return 'SuperGrok';
|
|
464
|
-
if (/opencode/iu.test(plan))
|
|
465
|
-
return 'OC·GO';
|
|
466
|
-
if (/goat/iu.test(plan))
|
|
467
|
-
return 'CC·GOAT';
|
|
468
|
-
return plan;
|
|
469
|
-
}
|
|
470
|
-
/**
|
|
471
|
-
* Drop the Go / SuperGrok plan name from a quota identity part, keeping the
|
|
472
|
-
* remaining-percent bar. Returns true when a part was rewritten.
|
|
473
|
-
*/
|
|
474
|
-
export function dropFooterQuotaPlanName(parts) {
|
|
475
|
-
for (let index = 0; index < parts.length; index++) {
|
|
476
|
-
const part = parts[index];
|
|
477
|
-
if (part === undefined)
|
|
478
|
-
continue;
|
|
479
|
-
const barAt = part.search(/[█░]{8} \d+%$/);
|
|
480
|
-
if (barAt <= 0)
|
|
481
|
-
continue;
|
|
482
|
-
// The window tag is the last thing before the bar and survives the badge:
|
|
483
|
-
// `SuperGrok 5Hr ███ 82%` narrows to `5Hr ███ 82%`, not to a bare bar.
|
|
484
|
-
const tag = /(?:5Hr|1Wk|1Mo)$/u.exec(part.slice(0, barAt).trimEnd())?.[0];
|
|
485
|
-
parts[index] = tag === undefined ? part.slice(barAt) : `${tag} ${part.slice(barAt)}`;
|
|
486
|
-
return true;
|
|
487
|
-
}
|
|
488
|
-
return false;
|
|
489
|
-
}
|
|
490
|
-
export function fitFooterStatusLine(activity, identity, width) {
|
|
491
|
-
const kept = [...identity];
|
|
492
|
-
const render = () => kept.length === 0 ? activity : `${activity} ${kept.join(' · ')}`;
|
|
493
|
-
if (visibleWidth(render()) > width)
|
|
494
|
-
dropFooterQuotaPlanName(kept);
|
|
495
|
-
while (kept.length > 0 && visibleWidth(render()) > width)
|
|
496
|
-
kept.pop();
|
|
497
|
-
return truncateAnsiToWidth(render(), Math.max(1, width));
|
|
498
|
-
}
|
|
499
|
-
/** Lines printed by `/status` — SSH first-boot diagnostics, no extra command. */
|
|
500
|
-
export function formatStatusReport(input) {
|
|
501
|
-
const route = describeProviderRoute(input.provider);
|
|
502
|
-
const effort = input.effort === undefined ? '' : ` (${input.effort})`;
|
|
503
|
-
const fit = describeSubagentFit({
|
|
504
|
-
parentProvider: input.provider,
|
|
505
|
-
parentModel: input.parentModel,
|
|
506
|
-
subProvider: input.subProvider,
|
|
507
|
-
subModel: input.subModel,
|
|
508
|
-
});
|
|
509
|
-
return [
|
|
510
|
-
`session: ${input.sessionId}`,
|
|
511
|
-
`plugin: dsh-ssh-tui ${input.pluginVersion}`,
|
|
512
|
-
`cwd: ${input.cwd ?? ''}`,
|
|
513
|
-
`route: ${input.provider}/${input.model}${effort}`,
|
|
514
|
-
`provider: ${route.kind}`,
|
|
515
|
-
`status: ${input.agentStatus}`,
|
|
516
|
-
`preset: ${input.preset}`,
|
|
517
|
-
`subagents: ${input.activeSubagents}`,
|
|
518
|
-
fit.line,
|
|
519
|
-
`plan: ${input.plan}`,
|
|
520
|
-
formatQuotaStatusLine(input.quota),
|
|
521
|
-
formatContextPressureStatusLine(input.context),
|
|
522
|
-
`paint: ${input.paint}`,
|
|
523
|
-
`disconnect: ${input.disconnect ?? 'pause'}`,
|
|
524
|
-
input.waitingQuestions > 0 ? `questions: waiting ${input.waitingQuestions}` : 'questions: none',
|
|
525
|
-
];
|
|
526
|
-
}
|
|
527
|
-
/** Human-facing kind for a live LLM route. */
|
|
528
|
-
export function describeProviderRoute(provider) {
|
|
529
|
-
const id = provider.trim();
|
|
530
|
-
if (id === 'deepseek-official' || id === 'deepseek') {
|
|
531
|
-
return { kind: t('route.deepseek'), short: t('route.deepseek') };
|
|
532
|
-
}
|
|
533
|
-
if (id === 'xai' || id === 'grok' || id.startsWith('xai-')) {
|
|
534
|
-
return { kind: t('route.supergrokKind'), short: t('route.supergrokShort') };
|
|
535
|
-
}
|
|
536
|
-
if (id === 'opencode-go')
|
|
537
|
-
return { kind: t('route.go'), short: t('route.go') };
|
|
538
|
-
if (id === 'opencode')
|
|
539
|
-
return { kind: t('route.zen'), short: t('route.zen') };
|
|
540
|
-
return { kind: t('route.registered'), short: id };
|
|
541
|
-
}
|
|
542
|
-
/** Routes that authenticate without a harness API-key credential. */
|
|
543
|
-
export function providerUsesLocalOAuth(provider) {
|
|
544
|
-
const id = provider.trim();
|
|
545
|
-
return id === 'xai' || id === 'grok' || id.startsWith('xai-');
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* Whether a provider has a quota surface at all, without asking it.
|
|
18
|
+
* Import from here unless you are inside the footer; the four modules import
|
|
19
|
+
* each other in exactly that order and never back.
|
|
549
20
|
*
|
|
550
|
-
*
|
|
551
|
-
* until a reading arrives — so it needs to tell "this provider will have one"
|
|
552
|
-
* from "this provider reports a balance instead" (DeepSeek) or nothing at all.
|
|
553
|
-
* Every branch is a synchronous settings read, so a repaint never does IO.
|
|
21
|
+
* @module dsh-ssh-tui/footer
|
|
554
22
|
*/
|
|
555
|
-
export
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
if (providerUsesLocalOAuth(id))
|
|
560
|
-
return true;
|
|
561
|
-
if (commandCodeSourceFor(id, llmPiAiSection) !== null)
|
|
562
|
-
return true;
|
|
563
|
-
const source = openCodeSourceFor(id, llmPiAiSection);
|
|
564
|
-
return source !== null && source.flavor === 'go';
|
|
565
|
-
}
|
|
23
|
+
export * from './footer-format.js';
|
|
24
|
+
export * from './footer-meters.js';
|
|
25
|
+
export * from './footer-budget.js';
|
|
26
|
+
export * from './footer-layout.js';
|
|
566
27
|
//# sourceMappingURL=footer.js.map
|
package/lib/footer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAA;AAChE,OAAO,EACL,oBAAoB,EAAE,qBAAqB,EAAE,iBAAiB,GAE/D,MAAM,YAAY,CAAA;AAGnB,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAA;AACrC,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CACvC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;IAChF,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,GAAG,SAAS;QAAE,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAA;IACjD,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAA;AAC9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAA;AACjD,yFAAyF;AACzF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAA;AAc9C,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAAC,KAIpC;IACC,OAAO,KAAK,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAA;AACzF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,yBAAyB,CAAC,QAG7B;IACX,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC5C,IAAI,OAAO,QAAQ,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACjE,MAAM,GAAG,GAAG,KAIX,CAAA;IACD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QACxF,CAAC,CAAC,GAAG,CAAC,aAAa;QACnB,CAAC,CAAC,SAAS,CAAA;IACb,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACzD,MAAM,IAAI,GAAG,yBAAyB,CAAC;QACrC,GAAG,CAAC,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CAAC,CAAA;IACF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAA6B;IAC/D,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,GAAG,CAAA;IAChE,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO;QACP,KAAK,EAAE,OAAO,IAAI,6BAA6B,GAAG,GAAG;YACnD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,IAAI,2BAA2B,GAAG,GAAG;gBAC5C,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,IAAI;KACX,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAC3F,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAEpC,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,kBAAkB,CAAA;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IAClE,OAAO,qBAAqB,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAmC;IAC1E,OAAO,mBAAmB,CAAC,WAAW,EAAE,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC3G,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAyB,EAAE,KAAK,GAAG,KAAK;IAChF,MAAM,IAAI,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,QAAQ,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS;QAC/D,CAAC,CAAC,IAAI,CAAA;IACR,OAAO,CAAC,CAAC,oBAAoB,EAAE;QAC7B,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;KAClC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,IAAqC;IACnF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAA;IACtD,OAAO,CAAC,CAAC,oBAAoB,EAAE;QAC7B,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,uBAAuB,IAAI,CAAC,KAAK,EAAE,CAAC;KAC9C,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAyB;IAChE,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;KACjC,CAAA;IACD,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC5B,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAqC;IACzE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACpC,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,IAAI,0BAA0B,CAAA;AAC3E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,CAAA;IAC1B,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAA;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,eAAuB;IAC3D,2EAA2E;IAC3E,uDAAuD;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IAC/E,IAAI,eAAe,GAAG,GAAG;QAAE,OAAO,UAAU,CAAA;IAC5C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAA;AAC/C,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,mBAAmB,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAA;IAC/E,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAA;IAC9E,IAAI,EAAE,KAAK,aAAa;QAAE,OAAO,aAAa,CAAA;IAC9C,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,cAAc,CAAA;IAC5C,OAAO,EAAE,CAAA;AACX,CAAC;AAiBD,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACpG,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,gBAAgB,CAAA;IACtF,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;IACjH,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACnF,CAAC;SAAM,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;IACjG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IACpG,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,IAAI,WAAW,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1H,OAAO,MAAM,CAAA;AACf,CAAC;AAeD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,KAA4B,EAAE,KAAa,EAAE,SAAS,GAAG,KAAK;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,KAAK;SAChB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;SACrD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,KAAK;SAC/B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;SAC9B,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC3B,IAAI,CAAC,SAAS,CAAC,CAAA;IAClB,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,2DAA2D;IAC3D,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAChE,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrF,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,IAAI,EAAE,IAAI,KAAK;YAAE,MAAK;QAC1B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,IAAI,EAAE,IAAI,KAAK;YAAE,MAAK;QAC1B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,0EAA0E;QAC1E,0EAA0E;QAC1E,gDAAgD;QAChD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;QACnB,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,KAAK,GAAG,KAAK;AACb,0EAA0E;AAC1E,OAAiC,QAAQ;IAEzC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,eAAe,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAA;IACrF,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE;QACnG,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,CAAC;KACZ,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAyB,EAAE,KAAa;IACvF,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IACxB,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IACvF,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK;QAAE,IAAI,CAAC,GAAG,EAAE,CAAA;IACpE,OAAO,mBAAmB,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;AAC1D,CAAC;AAsDD,MAAM,UAAU,cAAc,CAAC,KAAwB;IACrD,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IAClF,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAA;IAChF,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IACjF,6EAA6E;IAC7E,0EAA0E;IAC1E,0DAA0D;IAC1D,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAA;IAC9G,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAA;IAC9G,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAA;IAC/G,IAAI,KAAK,CAAC,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAA;IAChF,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAA;IACvF,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAA;IACjF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IACvF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IACvF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAA;IACzF,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;IAC7G,CAAC;IACD,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAA;IACrE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,cAAc,CAAC,gBAAwB,EAAE,KAAK,GAAG,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,CAAA;IAClD,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAA;AAC7D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,QAAiB,EAAE,MAAe;IAClF,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IACxB,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAA;IACvF,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAA;IAC1F,OAAO,OAAO,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;AACpC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAY,EACZ,OAAgB,EAChB,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,EAC7C,QAAoB,WAAW,EAC/B,WAAW,GAAG,eAAe,CAAC,WAAW,EAAE,EAAE,kBAAkB,CAAC;IAEhE,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAChE,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAC7C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAC5B,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,IAAI,eAAe,IAAI,GAAG,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAA0D;IAC9F,OAAO,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;AACnE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACvB,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACvC,8EAA8E;IAC9E,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IACtF,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACrF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IAClG,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvE,IAAI,KAAK,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAA;IAClC,CAAC;SAAM,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;IACvF,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC9F,0EAA0E;IAC1E,oEAAoE;IACpE,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAClF,IAAI,GAAG,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC5H,IAAI,KAAK,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAA;SACrD,IAAI,KAAK,CAAC,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAChE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC7E,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa,EAAE,MAAoB;IACpF,MAAM,GAAG,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/D,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAClD,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAA;AAClC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC5D,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACtC,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgD;IACjF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAA;IACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,OAAO,CAAA;IACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;QAC3F,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAA;IAC1C,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAA;IAChD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAA;IAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACzC,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAe;IACrD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAQ;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;QAC1C,IAAI,KAAK,IAAI,CAAC;YAAE,SAAQ;QACxB,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACzE,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAA;QACpF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,QAA2B,EAAE,KAAa;IAC9F,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9F,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK;QAAE,uBAAuB,CAAC,IAAI,CAAC,CAAA;IACjE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK;QAAE,IAAI,CAAC,GAAG,EAAE,CAAA;IACpE,OAAO,mBAAmB,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;AAC1D,CAAC;AAuBD,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAA;IACrE,MAAM,GAAG,GAAG,mBAAmB,CAAC;QAC9B,cAAc,EAAE,KAAK,CAAC,QAAQ;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAA;IACF,OAAO;QACL,YAAY,KAAK,CAAC,SAAS,EAAE;QAC7B,uBAAuB,KAAK,CAAC,aAAa,EAAE;QAC5C,QAAQ,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE;QACzB,UAAU,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,EAAE;QAClD,aAAa,KAAK,CAAC,IAAI,EAAE;QACzB,WAAW,KAAK,CAAC,WAAW,EAAE;QAC9B,WAAW,KAAK,CAAC,MAAM,EAAE;QACzB,cAAc,KAAK,CAAC,eAAe,EAAE;QACrC,GAAG,CAAC,IAAI;QACR,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9C,UAAU,KAAK,CAAC,KAAK,EAAE;QACvB,eAAe,KAAK,CAAC,UAAU,IAAI,OAAO,EAAE;QAC5C,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,iBAAiB;KAChG,CAAA;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,mBAAmB,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAA;IAClE,CAAC;IACD,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAA;IAC7E,CAAC;IACD,IAAI,EAAE,KAAK,aAAa;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAA;IAC9E,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAA;IAC7E,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACnD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,OAAO,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB,EAAE,cAAuB;IAC/E,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAC3B,IAAI,sBAAsB,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAA;IAC3C,IAAI,oBAAoB,CAAC,EAAE,EAAE,cAAc,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAClE,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;IACpD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAA;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA"}
|