@pat-lewczuk/cezar 0.1.2 → 0.1.4
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 +249 -45
- package/dist/config.d.ts +8 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-runner.d.ts +44 -2
- package/dist/core/agent-runner.js +8 -2
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/backend-detect.d.ts +6 -4
- package/dist/core/backend-detect.js +44 -4
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +3 -25
- package/dist/core/claude-cli-runner.js +2 -19
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/claude-ui-mapper.d.ts +57 -0
- package/dist/core/claude-ui-mapper.js +370 -0
- package/dist/core/claude-ui-mapper.js.map +1 -0
- package/dist/core/codex-app-server-runner.d.ts +29 -0
- package/dist/core/codex-app-server-runner.js +452 -0
- package/dist/core/codex-app-server-runner.js.map +1 -0
- package/dist/core/codex-ui-mapper.d.ts +53 -0
- package/dist/core/codex-ui-mapper.js +411 -0
- package/dist/core/codex-ui-mapper.js.map +1 -0
- package/dist/core/ndjson.d.ts +6 -0
- package/dist/core/ndjson.js +23 -0
- package/dist/core/ndjson.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +30 -0
- package/dist/core/opencode-server-runner.js +451 -0
- package/dist/core/opencode-server-runner.js.map +1 -0
- package/dist/core/opencode-ui-mapper.d.ts +105 -0
- package/dist/core/opencode-ui-mapper.js +578 -0
- package/dist/core/opencode-ui-mapper.js.map +1 -0
- package/dist/core/process-usage.d.ts +63 -0
- package/dist/core/process-usage.js +181 -0
- package/dist/core/process-usage.js.map +1 -0
- package/dist/core/runner-factory.d.ts +8 -0
- package/dist/core/runner-factory.js +22 -0
- package/dist/core/runner-factory.js.map +1 -0
- package/dist/core/tool-display.d.ts +27 -0
- package/dist/core/tool-display.js +150 -0
- package/dist/core/tool-display.js.map +1 -0
- package/dist/core/ui-events.d.ts +294 -0
- package/dist/core/ui-events.js +25 -0
- package/dist/core/ui-events.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/pack-check.d.ts +17 -0
- package/dist/pack-check.js +27 -0
- package/dist/pack-check.js.map +1 -0
- package/dist/planner.js +7 -3
- package/dist/planner.js.map +1 -1
- package/dist/runs/store.d.ts +5 -0
- package/dist/runs/store.js +3 -0
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/title-summary.d.ts +15 -0
- package/dist/runs/title-summary.js +84 -0
- package/dist/runs/title-summary.js.map +1 -0
- package/dist/runs/ui-event-sink.d.ts +81 -0
- package/dist/runs/ui-event-sink.js +210 -0
- package/dist/runs/ui-event-sink.js.map +1 -0
- package/dist/server/capabilities.d.ts +18 -0
- package/dist/server/capabilities.js +23 -0
- package/dist/server/capabilities.js.map +1 -0
- package/dist/server/forge/github.d.ts +39 -0
- package/dist/server/forge/github.js +369 -0
- package/dist/server/forge/github.js.map +1 -0
- package/dist/server/forge/index.d.ts +24 -0
- package/dist/server/forge/index.js +45 -0
- package/dist/server/forge/index.js.map +1 -0
- package/dist/server/forge/types.d.ts +80 -0
- package/dist/server/forge/types.js +2 -0
- package/dist/server/forge/types.js.map +1 -0
- package/dist/server/git-changes.d.ts +182 -0
- package/dist/server/git-changes.js +424 -0
- package/dist/server/git-changes.js.map +1 -0
- package/dist/server/open-in-app.d.ts +19 -0
- package/dist/server/open-in-app.js +134 -0
- package/dist/server/open-in-app.js.map +1 -0
- package/dist/server/server.js +34 -10
- package/dist/server/server.js.map +1 -1
- package/dist/server/static-ui.d.ts +49 -0
- package/dist/server/static-ui.js +92 -0
- package/dist/server/static-ui.js.map +1 -0
- package/dist/update-check.d.ts +12 -0
- package/dist/update-check.js +41 -0
- package/dist/update-check.js.map +1 -0
- package/dist/workflows/run.d.ts +3 -0
- package/dist/workflows/run.js +22 -7
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +16 -0
- package/dist/workflows/types.js +3 -1
- package/dist/workflows/types.js.map +1 -1
- package/package.json +1 -1
- package/web/app/node_modules/.vite/vitest/ca84d1343b96baa8137c943ed1860e522cacb238/results.json +1 -0
- package/web/app/src/components/app-shell-container.tsx +76 -0
- package/web/app.js +145 -18
- package/web/dist/assets/arrow-left-BE957rJs.js +1 -0
- package/web/dist/assets/bundle-mjs-DLPpRFyl.js +1 -0
- package/web/dist/assets/chunk-BO2N2NFS-f5igTtpB.js +131 -0
- package/web/dist/assets/compare-variants-D6fPL9cS.js +1 -0
- package/web/dist/assets/core-BuMqAF_1.js +12 -0
- package/web/dist/assets/css-BsVw1vtW.js +1 -0
- package/web/dist/assets/dialog-BEgEWFDS.js +1 -0
- package/web/dist/assets/diff-view-CctnJHWe.js +4 -0
- package/web/dist/assets/diff-woXpYk--.js +1 -0
- package/web/dist/assets/dist-CW7M_Jhs.js +1 -0
- package/web/dist/assets/ellipsis-vertical-DJPAfccS.js +1 -0
- package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
- package/web/dist/assets/folder-RbRLfIX-.js +1 -0
- package/web/dist/assets/git-pull-request-DJkAMT0f.js +1 -0
- package/web/dist/assets/git-toolbar-D8OPPqBP.js +1 -0
- package/web/dist/assets/github-BYIHwIJB.js +1 -0
- package/web/dist/assets/go-rLFTqkRN.js +1 -0
- package/web/dist/assets/highlighted-body-OFNGDK62-DGHHie_q.js +1 -0
- package/web/dist/assets/highlighter-BKVEsACy.js +3 -0
- package/web/dist/assets/html-BY76lXLH.js +1 -0
- package/web/dist/assets/index-9qG98Orw.js +11 -0
- package/web/dist/assets/index-Bz_r8Jt3.css +2 -0
- package/web/dist/assets/input-BRsSo4xH.js +1 -0
- package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
- package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/web/dist/assets/json-qhed-kSA.js +1 -0
- package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
- package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
- package/web/dist/assets/lib-CNGa3Dig.js +1 -0
- package/web/dist/assets/loader-circle-BV3DO9mE.js +1 -0
- package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/web/dist/assets/markdown-CR_HLGTs.js +1 -0
- package/web/dist/assets/mermaid-GHXKKRXX-DM2VsGBG.js +1 -0
- package/web/dist/assets/open-mercato-toBr6SOa.svg +11 -0
- package/web/dist/assets/python-gzcpVVnB.js +1 -0
- package/web/dist/assets/react-dom-Ddtik4qM.js +1 -0
- package/web/dist/assets/refresh-cw-DCa-Rlwz.js +1 -0
- package/web/dist/assets/repo-git-XTqlVOl2.js +1 -0
- package/web/dist/assets/run-diff-C7mfxj7f.js +3 -0
- package/web/dist/assets/run-header-CfVeY3uM.js +1 -0
- package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/web/dist/assets/search-x-CoCyl7zT.js +1 -0
- package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
- package/web/dist/assets/skill-detail-C9cniyId.js +1 -0
- package/web/dist/assets/skills-DXgY1uXJ.js +1 -0
- package/web/dist/assets/skills-ynuO5oCr.js +1 -0
- package/web/dist/assets/sql-BsFa4tDR.js +1 -0
- package/web/dist/assets/square-terminal-B6PZX4Qp.js +1 -0
- package/web/dist/assets/tab-link-phWEqSBy.js +1 -0
- package/web/dist/assets/task-changes-DYwnPnTN.js +1 -0
- package/web/dist/assets/task-commits-DZzxEzbn.js +1 -0
- package/web/dist/assets/task-files-FOAAz2FB.js +2 -0
- package/web/dist/assets/task-thread-Bncxe8Os.js +5 -0
- package/web/dist/assets/toaster-BS2E1bhz.js +43 -0
- package/web/dist/assets/trash-2-CDtxmmc8.js +1 -0
- package/web/dist/assets/triangle-alert-6su4Js5O.js +1 -0
- package/web/dist/assets/tsx-udAQXfEw.js +1 -0
- package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
- package/web/dist/assets/upload-Bp7hQxll.js +1 -0
- package/web/dist/assets/use-desktop-eHm2iTXX.js +3 -0
- package/web/dist/assets/utils-rQGbOrwc.js +1 -0
- package/web/dist/assets/workflows-Dg2wQg6i.js +11 -0
- package/web/dist/assets/x-Br_jIDBw.js +1 -0
- package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
- package/web/dist/index.html +67 -0
- package/web/index.html +1 -0
- package/web/style.css +28 -8
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure opencode SSE-bus → protocol-v2 mapper. `mapOpencodeEvent` folds one
|
|
3
|
+
* parsed `{type, properties}` bus event into `UiEvent`s plus the next mapper
|
|
4
|
+
* state; the runner calls it ALONGSIDE the v1 path (v1 events keep flowing
|
|
5
|
+
* unchanged — including v1's HTTP-response-synthesized `turn-end`; only the
|
|
6
|
+
* v2 stream uses the correct `session.idle` signal, fixing gap §5.9).
|
|
7
|
+
*
|
|
8
|
+
* Contract: `.ai/analysis/cockpit-ui-redesign/agent-event-protocols.md` §4
|
|
9
|
+
* (wire format: Message/Part model, ToolState lifecycle) and §7.1
|
|
10
|
+
* "OpenCode (SSE)" (the mapping). Golden fixtures replaying wire-faithful
|
|
11
|
+
* bus-event sequences live in `__fixtures__/opencode/`.
|
|
12
|
+
*
|
|
13
|
+
* Robustness rule: input is untrusted wire data — the mapper never throws;
|
|
14
|
+
* unknown event/part types map to zero events.
|
|
15
|
+
*
|
|
16
|
+
* State is explicit and treated as immutable: callers thread the returned
|
|
17
|
+
* `state` into the next call. Ids are deterministic — items reuse the wire
|
|
18
|
+
* part ids, turns get `turn_<n>` minted at each prompt POST — so replaying
|
|
19
|
+
* a stored transcript reproduces the exact event sequence.
|
|
20
|
+
*
|
|
21
|
+
* Opencode-specific mechanics baked in:
|
|
22
|
+
* - text/reasoning parts carry the FULL accumulated text on every update;
|
|
23
|
+
* a per-part cursor diffs it into true `item.delta`s (a server-provided
|
|
24
|
+
* `delta` field wins when present — newer servers send it);
|
|
25
|
+
* - tool parts have the ONLY real `pending` phase of the three backends
|
|
26
|
+
* (`pending→pending`, `running→running`, `completed→completed`,
|
|
27
|
+
* `error→failed`);
|
|
28
|
+
* - the SSE bus is server-wide: parts from a foreign session id are the
|
|
29
|
+
* active subtask's child session and nest via `parentItemId` (§7.1);
|
|
30
|
+
* anything foreign outside a subtask scope is dropped.
|
|
31
|
+
*/
|
|
32
|
+
import { toolDisplay } from './tool-display.js';
|
|
33
|
+
export function createOpencodeUiState() {
|
|
34
|
+
return {
|
|
35
|
+
sessionId: null,
|
|
36
|
+
sessionStarted: false,
|
|
37
|
+
turnSeq: 0,
|
|
38
|
+
currentTurnId: null,
|
|
39
|
+
turnErrored: false,
|
|
40
|
+
msgRoles: new Map(),
|
|
41
|
+
cursors: new Map(),
|
|
42
|
+
startedItems: new Set(),
|
|
43
|
+
endedItems: new Set(),
|
|
44
|
+
tools: new Map(),
|
|
45
|
+
lastPlanJson: null,
|
|
46
|
+
subtask: null,
|
|
47
|
+
usageByMessage: new Map(),
|
|
48
|
+
lastUsage: null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Opencode has no wire-level session-start event — the session is created by
|
|
53
|
+
* the runner's `POST /session`, so the runner calls this once the response
|
|
54
|
+
* carries the id (like codex's out-of-band thread/start result).
|
|
55
|
+
*/
|
|
56
|
+
export function opencodeSessionStarted(sessionId, state) {
|
|
57
|
+
if (state.sessionStarted || sessionId === '')
|
|
58
|
+
return { events: [], state };
|
|
59
|
+
return {
|
|
60
|
+
events: [{ type: 'session.started', sessionId, backend: 'opencode' }],
|
|
61
|
+
state: { ...state, sessionId, sessionStarted: true },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Opencode has no wire-level turn-start either — the runner POSTing a prompt
|
|
66
|
+
* IS the turn boundary, so the runner calls this on each prompt POST. The
|
|
67
|
+
* matching `turn.completed` comes from the wire `session.idle` (never from
|
|
68
|
+
* the HTTP prompt response — that is v1's known fidelity gap).
|
|
69
|
+
*/
|
|
70
|
+
export function opencodeTurnStarted(state) {
|
|
71
|
+
const turnId = `turn_${state.turnSeq + 1}`;
|
|
72
|
+
return {
|
|
73
|
+
events: [{ type: 'turn.started', turnId }],
|
|
74
|
+
state: { ...state, turnSeq: state.turnSeq + 1, currentTurnId: turnId, turnErrored: false },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Fold one parsed SSE bus event into v2 events. Never throws. */
|
|
78
|
+
export function mapOpencodeEvent(evt, state) {
|
|
79
|
+
if (!isRecord(evt) || typeof evt.type !== 'string')
|
|
80
|
+
return { events: [], state };
|
|
81
|
+
const props = isRecord(evt.properties) ? evt.properties : {};
|
|
82
|
+
switch (evt.type) {
|
|
83
|
+
case 'message.updated':
|
|
84
|
+
case 'message.created':
|
|
85
|
+
case 'message.completed':
|
|
86
|
+
return mapMessageInfo(props, state);
|
|
87
|
+
case 'message.part.updated':
|
|
88
|
+
case 'message.part.created':
|
|
89
|
+
return mapPart(props, state);
|
|
90
|
+
case 'session.idle':
|
|
91
|
+
return mapIdle(props, state);
|
|
92
|
+
case 'session.error':
|
|
93
|
+
return mapSessionError(props, state);
|
|
94
|
+
default:
|
|
95
|
+
// server.connected, session.updated, message.part.removed,
|
|
96
|
+
// permission.* (reserved for the permission.* events later), …
|
|
97
|
+
return { events: [], state };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ---- message info → roles + usage.updated -----------------------------------
|
|
101
|
+
function mapMessageInfo(props, state) {
|
|
102
|
+
const info = isRecord(props.info) ? props.info : props;
|
|
103
|
+
const id = str(info.id);
|
|
104
|
+
const role = str(info.role);
|
|
105
|
+
let next = state;
|
|
106
|
+
if (id !== undefined && role !== undefined && state.msgRoles.get(id) !== role) {
|
|
107
|
+
const msgRoles = new Map(state.msgRoles);
|
|
108
|
+
msgRoles.set(id, role);
|
|
109
|
+
next = { ...next, msgRoles };
|
|
110
|
+
}
|
|
111
|
+
// Telemetry rides only on assistant messages (cumulative per message).
|
|
112
|
+
if (id !== undefined && role === 'assistant') {
|
|
113
|
+
const usage = tokensToUsage(info.tokens);
|
|
114
|
+
const cost = num(info.cost);
|
|
115
|
+
if (usage || cost !== undefined) {
|
|
116
|
+
const prev = next.usageByMessage.get(id) ?? EMPTY_MESSAGE_USAGE;
|
|
117
|
+
const merged = {
|
|
118
|
+
// Monotonic guard: a stale/zero snapshot never shrinks the record.
|
|
119
|
+
info: usage && (prev.info === null || usage.total >= prev.info.total) ? usage : prev.info,
|
|
120
|
+
infoCost: maxCost(prev.infoCost, cost),
|
|
121
|
+
steps: prev.steps,
|
|
122
|
+
stepsCost: prev.stepsCost,
|
|
123
|
+
};
|
|
124
|
+
const usageByMessage = new Map(next.usageByMessage);
|
|
125
|
+
usageByMessage.set(id, merged);
|
|
126
|
+
return emitUsage({ ...next, usageByMessage });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { events: [], state: next };
|
|
130
|
+
}
|
|
131
|
+
// ---- parts -------------------------------------------------------------------
|
|
132
|
+
function mapPart(props, state) {
|
|
133
|
+
const part = isRecord(props.part) ? props.part : props;
|
|
134
|
+
const type = str(part.type);
|
|
135
|
+
const messageID = str(part.messageID);
|
|
136
|
+
const id = str(part.id) ?? messageID;
|
|
137
|
+
if (type === undefined || id === undefined)
|
|
138
|
+
return { events: [], state };
|
|
139
|
+
// Foreign-session parts are the active subtask's child session — they nest
|
|
140
|
+
// under it; without a subtask scope they are another session's traffic.
|
|
141
|
+
const partSession = str(part.sessionID);
|
|
142
|
+
const foreign = partSession !== undefined && state.sessionId !== null && partSession !== state.sessionId;
|
|
143
|
+
if (foreign && state.subtask === null)
|
|
144
|
+
return { events: [], state };
|
|
145
|
+
const parentItemId = foreign && state.subtask !== null ? state.subtask.id : undefined;
|
|
146
|
+
// Only assistant parts surface — the user's own prompt streams as parts
|
|
147
|
+
// over the same feed. Role is known early (message.updated precedes its
|
|
148
|
+
// parts); an unknown role means "not assistant yet" → skip.
|
|
149
|
+
if (messageID !== undefined && state.msgRoles.get(messageID) !== 'assistant') {
|
|
150
|
+
return { events: [], state };
|
|
151
|
+
}
|
|
152
|
+
switch (type) {
|
|
153
|
+
case 'text':
|
|
154
|
+
return mapTextLike(part, id, 'text', props.delta, parentItemId, state);
|
|
155
|
+
case 'reasoning':
|
|
156
|
+
return mapTextLike(part, id, 'reasoning', props.delta, parentItemId, state);
|
|
157
|
+
case 'tool':
|
|
158
|
+
return mapTool(part, id, parentItemId, state);
|
|
159
|
+
case 'patch':
|
|
160
|
+
return mapPatch(part, id, parentItemId, state);
|
|
161
|
+
case 'subtask':
|
|
162
|
+
return mapSubtask(part, id, state);
|
|
163
|
+
case 'step-finish':
|
|
164
|
+
return mapStepFinish(part, messageID, state);
|
|
165
|
+
default:
|
|
166
|
+
// file, snapshot, step-start, agent, retry, compaction, … — nothing to
|
|
167
|
+
// render yet.
|
|
168
|
+
return { events: [], state };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** Text/reasoning parts carry the FULL accumulated text each update — the
|
|
172
|
+
* cursor diffs it into true deltas; a server-sent `delta` wins when present.
|
|
173
|
+
* `time.end` marks the part finished → `item.completed` (once). */
|
|
174
|
+
function mapTextLike(part, id, field, serverDelta, parentItemId, state) {
|
|
175
|
+
const full = typeof part.text === 'string' ? part.text : '';
|
|
176
|
+
const events = [];
|
|
177
|
+
let startedItems = state.startedItems;
|
|
178
|
+
let cursors = state.cursors;
|
|
179
|
+
let endedItems = state.endedItems;
|
|
180
|
+
const makeItem = (text) => {
|
|
181
|
+
const item = field === 'text'
|
|
182
|
+
? { kind: 'message', id, role: 'assistant', text }
|
|
183
|
+
: { kind: 'reasoning', id, text };
|
|
184
|
+
if (parentItemId !== undefined)
|
|
185
|
+
item.parentItemId = parentItemId;
|
|
186
|
+
return item;
|
|
187
|
+
};
|
|
188
|
+
if (!startedItems.has(id)) {
|
|
189
|
+
events.push({ type: 'item.started', item: makeItem('') });
|
|
190
|
+
startedItems = new Set(startedItems).add(id);
|
|
191
|
+
}
|
|
192
|
+
const cursor = cursors.get(id) ?? 0;
|
|
193
|
+
const winning = str(serverDelta);
|
|
194
|
+
let delta;
|
|
195
|
+
let nextCursor = cursor;
|
|
196
|
+
if (winning !== undefined) {
|
|
197
|
+
delta = winning;
|
|
198
|
+
// Keep the cursor consistent with the accumulated text so a later
|
|
199
|
+
// full-text-only update doesn't re-emit what the server delta covered.
|
|
200
|
+
nextCursor = Math.max(cursor + winning.length, full.length);
|
|
201
|
+
}
|
|
202
|
+
else if (full.length > cursor) {
|
|
203
|
+
delta = full.slice(cursor);
|
|
204
|
+
nextCursor = full.length;
|
|
205
|
+
}
|
|
206
|
+
if (delta !== undefined) {
|
|
207
|
+
events.push({ type: 'item.delta', itemId: id, field, delta });
|
|
208
|
+
const nextCursors = new Map(cursors);
|
|
209
|
+
nextCursors.set(id, nextCursor);
|
|
210
|
+
cursors = nextCursors;
|
|
211
|
+
}
|
|
212
|
+
const time = isRecord(part.time) ? part.time : undefined;
|
|
213
|
+
if (time && num(time.end) !== undefined && !endedItems.has(id)) {
|
|
214
|
+
events.push({ type: 'item.completed', item: makeItem(full) });
|
|
215
|
+
endedItems = new Set(endedItems).add(id);
|
|
216
|
+
}
|
|
217
|
+
if (events.length === 0)
|
|
218
|
+
return { events, state };
|
|
219
|
+
return { events, state: { ...state, startedItems, cursors, endedItems } };
|
|
220
|
+
}
|
|
221
|
+
/** The §7.1 direct status map — opencode is the only backend with a real
|
|
222
|
+
* pending phase, and its `error` state is v2's `failed`. */
|
|
223
|
+
const STATUS_MAP = {
|
|
224
|
+
pending: 'pending',
|
|
225
|
+
running: 'running',
|
|
226
|
+
completed: 'completed',
|
|
227
|
+
error: 'failed',
|
|
228
|
+
};
|
|
229
|
+
function mapTool(part, id, parentItemId, state) {
|
|
230
|
+
const name = str(part.tool) ?? str(part.name) ?? 'tool';
|
|
231
|
+
const toolState = isRecord(part.state) ? part.state : {};
|
|
232
|
+
const prev = state.tools.get(id);
|
|
233
|
+
const mapped = typeof toolState.status === 'string' ? STATUS_MAP[toolState.status] : undefined;
|
|
234
|
+
const status = mapped ?? prev?.status ?? 'pending';
|
|
235
|
+
const display = toolDisplay(name, toolState.input);
|
|
236
|
+
// The running/completed states carry a live human title ("npm test") — the
|
|
237
|
+
// wire word wins over the derived one (§7.1). The error state has no title
|
|
238
|
+
// field (§4.2), so the last live title carries over instead of regressing.
|
|
239
|
+
const title = str(toolState.title) ?? prev?.title ?? display.title;
|
|
240
|
+
const item = { kind: 'tool', id, name, toolKind: display.toolKind, title, status };
|
|
241
|
+
if (toolState.input !== undefined)
|
|
242
|
+
item.input = toolState.input;
|
|
243
|
+
if (status === 'completed') {
|
|
244
|
+
const output = str(toolState.output);
|
|
245
|
+
if (output !== undefined)
|
|
246
|
+
item.output = output;
|
|
247
|
+
}
|
|
248
|
+
if (status === 'failed') {
|
|
249
|
+
const error = errorText(toolState.error);
|
|
250
|
+
if (error !== undefined)
|
|
251
|
+
item.error = error;
|
|
252
|
+
}
|
|
253
|
+
const metadata = isRecord(toolState.metadata) ? toolState.metadata : undefined;
|
|
254
|
+
const exitCode = metadata ? num(metadata.exit) : undefined;
|
|
255
|
+
if (exitCode !== undefined)
|
|
256
|
+
item.exitCode = exitCode;
|
|
257
|
+
if (parentItemId !== undefined)
|
|
258
|
+
item.parentItemId = parentItemId;
|
|
259
|
+
const events = [];
|
|
260
|
+
const settled = status === 'completed' || status === 'failed';
|
|
261
|
+
if (prev === undefined) {
|
|
262
|
+
// First sight — a part already settled is a lone final snapshot
|
|
263
|
+
// (consumers upsert by id, so it renders fine).
|
|
264
|
+
events.push({ type: settled ? 'item.completed' : 'item.started', item });
|
|
265
|
+
}
|
|
266
|
+
else if (prev.status !== status) {
|
|
267
|
+
events.push({ type: settled ? 'item.completed' : 'item.updated', item });
|
|
268
|
+
}
|
|
269
|
+
else if (prev.title !== title && !settled) {
|
|
270
|
+
// Same state, new live title (running-state metadata updates).
|
|
271
|
+
events.push({ type: 'item.updated', item });
|
|
272
|
+
}
|
|
273
|
+
let next = state;
|
|
274
|
+
if (events.length > 0) {
|
|
275
|
+
const tools = new Map(state.tools);
|
|
276
|
+
tools.set(id, { status, title });
|
|
277
|
+
next = { ...next, tools };
|
|
278
|
+
}
|
|
279
|
+
// todowrite IS the plan (full-replacement semantics, deduplicated).
|
|
280
|
+
if (name.toLowerCase() === 'todowrite') {
|
|
281
|
+
const entries = planEntriesOf(toolState.input);
|
|
282
|
+
if (entries) {
|
|
283
|
+
const json = JSON.stringify(entries);
|
|
284
|
+
if (json !== next.lastPlanJson) {
|
|
285
|
+
events.push({ type: 'plan.updated', entries });
|
|
286
|
+
next = { ...next, lastPlanJson: json };
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (events.length === 0 && next === state)
|
|
291
|
+
return { events, state };
|
|
292
|
+
return { events, state: next };
|
|
293
|
+
}
|
|
294
|
+
/** todowrite input `{todos:[{content,status,priority}]}` → plan entries
|
|
295
|
+
* (an empty list is a valid plan; malformed rows are filtered). */
|
|
296
|
+
function planEntriesOf(input) {
|
|
297
|
+
if (!isRecord(input) || !Array.isArray(input.todos))
|
|
298
|
+
return undefined;
|
|
299
|
+
const entries = [];
|
|
300
|
+
for (const todo of input.todos) {
|
|
301
|
+
if (!isRecord(todo) || typeof todo.content !== 'string')
|
|
302
|
+
continue;
|
|
303
|
+
const status = PLAN_STATUSES.find((s) => s === todo.status);
|
|
304
|
+
if (status === undefined)
|
|
305
|
+
continue;
|
|
306
|
+
const entry = { content: todo.content, status };
|
|
307
|
+
if (todo.priority === 'high' || todo.priority === 'medium' || todo.priority === 'low') {
|
|
308
|
+
entry.priority = todo.priority;
|
|
309
|
+
}
|
|
310
|
+
entries.push(entry);
|
|
311
|
+
}
|
|
312
|
+
return entries;
|
|
313
|
+
}
|
|
314
|
+
const PLAN_STATUSES = ['pending', 'in_progress', 'completed'];
|
|
315
|
+
/** `patch` parts snapshot applied file changes → a completed edit-tool item
|
|
316
|
+
* carrying `diffs` (unified when the wire includes content; the older
|
|
317
|
+
* paths-only shape still yields per-file entries + locations). */
|
|
318
|
+
function mapPatch(part, id, parentItemId, state) {
|
|
319
|
+
if (state.endedItems.has(id))
|
|
320
|
+
return { events: [], state };
|
|
321
|
+
const artifacts = patchArtifacts(part.files);
|
|
322
|
+
if (!artifacts)
|
|
323
|
+
return { events: [], state };
|
|
324
|
+
const { diffs, locations } = artifacts;
|
|
325
|
+
const label = locations.length === 1 ? locations[0]?.path : locations.length > 1 ? `${locations.length} files` : undefined;
|
|
326
|
+
const item = {
|
|
327
|
+
kind: 'tool',
|
|
328
|
+
id,
|
|
329
|
+
name: 'patch',
|
|
330
|
+
toolKind: 'edit',
|
|
331
|
+
title: label !== undefined ? `Edit ${label}` : 'Edit',
|
|
332
|
+
status: 'completed',
|
|
333
|
+
diffs,
|
|
334
|
+
locations,
|
|
335
|
+
};
|
|
336
|
+
if (parentItemId !== undefined)
|
|
337
|
+
item.parentItemId = parentItemId;
|
|
338
|
+
return {
|
|
339
|
+
events: [{ type: 'item.completed', item }],
|
|
340
|
+
state: { ...state, endedItems: new Set(state.endedItems).add(id) },
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
/** `files` as `{path: unifiedDiff}` record (or `[{path, diff}]`) carries the
|
|
344
|
+
* content; the paths-only `string[]` shape still yields diff entries.
|
|
345
|
+
* Opencode sends unified diffs only — old text is unknown, never "empty". */
|
|
346
|
+
function patchArtifacts(files) {
|
|
347
|
+
const diffs = [];
|
|
348
|
+
const push = (path, unified) => {
|
|
349
|
+
const diff = { path, oldText: null };
|
|
350
|
+
if (unified !== undefined)
|
|
351
|
+
diff.unified = unified;
|
|
352
|
+
diffs.push(diff);
|
|
353
|
+
};
|
|
354
|
+
if (Array.isArray(files)) {
|
|
355
|
+
for (const entry of files) {
|
|
356
|
+
if (typeof entry === 'string' && entry !== '')
|
|
357
|
+
push(entry);
|
|
358
|
+
else if (isRecord(entry)) {
|
|
359
|
+
const path = str(entry.path) ?? str(entry.file) ?? str(entry.filename);
|
|
360
|
+
if (path !== undefined)
|
|
361
|
+
push(path, str(entry.diff) ?? str(entry.patch));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else if (isRecord(files)) {
|
|
366
|
+
for (const [path, value] of Object.entries(files)) {
|
|
367
|
+
if (path === '')
|
|
368
|
+
continue;
|
|
369
|
+
if (typeof value === 'string')
|
|
370
|
+
push(path, str(value));
|
|
371
|
+
else if (isRecord(value))
|
|
372
|
+
push(path, str(value.diff) ?? str(value.patch));
|
|
373
|
+
else
|
|
374
|
+
push(path);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (diffs.length === 0)
|
|
378
|
+
return undefined;
|
|
379
|
+
return { diffs, locations: diffs.map((d) => ({ path: d.path })) };
|
|
380
|
+
}
|
|
381
|
+
/** `subtask` parts spawn a child session → a task-kind tool item whose id
|
|
382
|
+
* scopes subsequent foreign-session items via `parentItemId` (§7.1); the
|
|
383
|
+
* child's `session.idle` completes it. */
|
|
384
|
+
function mapSubtask(part, id, state) {
|
|
385
|
+
if (state.startedItems.has(id))
|
|
386
|
+
return { events: [], state };
|
|
387
|
+
const description = str(part.description);
|
|
388
|
+
const display = toolDisplay('task', { description });
|
|
389
|
+
const item = {
|
|
390
|
+
kind: 'tool',
|
|
391
|
+
id,
|
|
392
|
+
name: 'subtask',
|
|
393
|
+
toolKind: display.toolKind,
|
|
394
|
+
title: display.title,
|
|
395
|
+
status: 'running',
|
|
396
|
+
};
|
|
397
|
+
const input = {};
|
|
398
|
+
if (str(part.prompt) !== undefined)
|
|
399
|
+
input.prompt = part.prompt;
|
|
400
|
+
if (description !== undefined)
|
|
401
|
+
input.description = description;
|
|
402
|
+
if (str(part.agent) !== undefined)
|
|
403
|
+
input.agent = part.agent;
|
|
404
|
+
if (Object.keys(input).length > 0)
|
|
405
|
+
item.input = input;
|
|
406
|
+
return {
|
|
407
|
+
events: [{ type: 'item.started', item }],
|
|
408
|
+
state: {
|
|
409
|
+
...state,
|
|
410
|
+
startedItems: new Set(state.startedItems).add(id),
|
|
411
|
+
subtask: { id, title: item.title, input: item.input },
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
/** `step-finish` parts carry per-LLM-round-trip cost + tokens → summed as
|
|
416
|
+
* usage increments (the larger of this sum and the `message.updated`
|
|
417
|
+
* snapshot wins per message — see `MessageUsage`). */
|
|
418
|
+
function mapStepFinish(part, messageID, state) {
|
|
419
|
+
if (messageID === undefined)
|
|
420
|
+
return { events: [], state };
|
|
421
|
+
const tokens = tokensToUsage(part.tokens);
|
|
422
|
+
const cost = num(part.cost);
|
|
423
|
+
if (!tokens && cost === undefined)
|
|
424
|
+
return { events: [], state };
|
|
425
|
+
const prev = state.usageByMessage.get(messageID) ?? EMPTY_MESSAGE_USAGE;
|
|
426
|
+
const merged = {
|
|
427
|
+
info: prev.info,
|
|
428
|
+
infoCost: prev.infoCost,
|
|
429
|
+
steps: tokens ? addUsage(prev.steps, tokens) : prev.steps,
|
|
430
|
+
stepsCost: cost !== undefined ? (prev.stepsCost ?? 0) + cost : prev.stepsCost,
|
|
431
|
+
};
|
|
432
|
+
const usageByMessage = new Map(state.usageByMessage);
|
|
433
|
+
usageByMessage.set(messageID, merged);
|
|
434
|
+
return emitUsage({ ...state, usageByMessage });
|
|
435
|
+
}
|
|
436
|
+
// ---- session lifecycle -------------------------------------------------------
|
|
437
|
+
/** `session.idle` is THE turn-end signal (§4.1). The main session's idle
|
|
438
|
+
* closes the current turn; a foreign idle is the subtask's child session
|
|
439
|
+
* going quiet → the subtask item completes. */
|
|
440
|
+
function mapIdle(props, state) {
|
|
441
|
+
const sid = str(props.sessionID);
|
|
442
|
+
const isMain = sid === undefined || state.sessionId === null || sid === state.sessionId;
|
|
443
|
+
if (!isMain) {
|
|
444
|
+
if (state.subtask === null)
|
|
445
|
+
return { events: [], state };
|
|
446
|
+
const item = {
|
|
447
|
+
kind: 'tool',
|
|
448
|
+
id: state.subtask.id,
|
|
449
|
+
name: 'subtask',
|
|
450
|
+
toolKind: 'task',
|
|
451
|
+
title: state.subtask.title,
|
|
452
|
+
status: 'completed',
|
|
453
|
+
};
|
|
454
|
+
if (state.subtask.input !== undefined)
|
|
455
|
+
item.input = state.subtask.input;
|
|
456
|
+
return { events: [{ type: 'item.completed', item }], state: { ...state, subtask: null } };
|
|
457
|
+
}
|
|
458
|
+
// Idle with no turn in flight (or a repeated idle) closes nothing.
|
|
459
|
+
if (state.currentTurnId === null)
|
|
460
|
+
return { events: [], state };
|
|
461
|
+
return {
|
|
462
|
+
events: [
|
|
463
|
+
{
|
|
464
|
+
type: 'turn.completed',
|
|
465
|
+
turnId: state.currentTurnId,
|
|
466
|
+
stopReason: state.turnErrored ? 'error' : 'end_turn',
|
|
467
|
+
},
|
|
468
|
+
],
|
|
469
|
+
state: { ...state, currentTurnId: null, turnErrored: false },
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
/** `session.error` → non-fatal `session.error` (the mapper can't know the
|
|
473
|
+
* session died — the runner owns fatality) + the turn closes as 'error'. */
|
|
474
|
+
function mapSessionError(props, state) {
|
|
475
|
+
const sid = str(props.sessionID);
|
|
476
|
+
const foreign = sid !== undefined && state.sessionId !== null && sid !== state.sessionId;
|
|
477
|
+
if (foreign && state.subtask === null)
|
|
478
|
+
return { events: [], state };
|
|
479
|
+
const message = errorText(props.error) ?? 'opencode session error';
|
|
480
|
+
return {
|
|
481
|
+
events: [{ type: 'session.error', message, fatal: false }],
|
|
482
|
+
state: { ...state, turnErrored: state.currentTurnId !== null ? true : state.turnErrored },
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
// ---- telemetry ----------------------------------------------------------------
|
|
486
|
+
const EMPTY_MESSAGE_USAGE = { info: null, infoCost: null, steps: null, stepsCost: null };
|
|
487
|
+
/** `{input, output, reasoning, cache:{read,write}}` → raw TokenUsage
|
|
488
|
+
* (opencode reports no total — the sum of the parts is the total). */
|
|
489
|
+
function tokensToUsage(tokens) {
|
|
490
|
+
if (!isRecord(tokens))
|
|
491
|
+
return undefined;
|
|
492
|
+
const input = num(tokens.input) ?? 0;
|
|
493
|
+
const output = num(tokens.output) ?? 0;
|
|
494
|
+
const reasoning = num(tokens.reasoning);
|
|
495
|
+
const cache = isRecord(tokens.cache) ? tokens.cache : undefined;
|
|
496
|
+
const cacheRead = cache ? num(cache.read) : undefined;
|
|
497
|
+
const cacheWrite = cache ? num(cache.write) : undefined;
|
|
498
|
+
const usage = {
|
|
499
|
+
input,
|
|
500
|
+
output,
|
|
501
|
+
total: input + output + (reasoning ?? 0) + (cacheRead ?? 0) + (cacheWrite ?? 0),
|
|
502
|
+
};
|
|
503
|
+
if (cacheRead !== undefined)
|
|
504
|
+
usage.cacheRead = cacheRead;
|
|
505
|
+
if (cacheWrite !== undefined)
|
|
506
|
+
usage.cacheWrite = cacheWrite;
|
|
507
|
+
if (reasoning !== undefined)
|
|
508
|
+
usage.reasoning = reasoning;
|
|
509
|
+
return usage;
|
|
510
|
+
}
|
|
511
|
+
function addUsage(a, b) {
|
|
512
|
+
if (a === null)
|
|
513
|
+
return b;
|
|
514
|
+
const sum = { input: a.input + b.input, output: a.output + b.output, total: a.total + b.total };
|
|
515
|
+
const cacheRead = optSum(a.cacheRead, b.cacheRead);
|
|
516
|
+
if (cacheRead !== undefined)
|
|
517
|
+
sum.cacheRead = cacheRead;
|
|
518
|
+
const cacheWrite = optSum(a.cacheWrite, b.cacheWrite);
|
|
519
|
+
if (cacheWrite !== undefined)
|
|
520
|
+
sum.cacheWrite = cacheWrite;
|
|
521
|
+
const reasoning = optSum(a.reasoning, b.reasoning);
|
|
522
|
+
if (reasoning !== undefined)
|
|
523
|
+
sum.reasoning = reasoning;
|
|
524
|
+
return sum;
|
|
525
|
+
}
|
|
526
|
+
function optSum(a, b) {
|
|
527
|
+
if (a === undefined && b === undefined)
|
|
528
|
+
return undefined;
|
|
529
|
+
return (a ?? 0) + (b ?? 0);
|
|
530
|
+
}
|
|
531
|
+
function maxCost(a, b) {
|
|
532
|
+
if (b === undefined)
|
|
533
|
+
return a;
|
|
534
|
+
return a === null ? b : Math.max(a, b);
|
|
535
|
+
}
|
|
536
|
+
/** Session totals = per-message effective usage summed across messages;
|
|
537
|
+
* emitted only when the snapshot actually changed and is non-zero. */
|
|
538
|
+
function emitUsage(state) {
|
|
539
|
+
let usage = { input: 0, output: 0, total: 0 };
|
|
540
|
+
let cost = null;
|
|
541
|
+
for (const mu of state.usageByMessage.values()) {
|
|
542
|
+
const effective = mu.info !== null && (mu.steps === null || mu.info.total >= mu.steps.total) ? mu.info : mu.steps;
|
|
543
|
+
if (effective !== null)
|
|
544
|
+
usage = addUsage(usage, effective);
|
|
545
|
+
const effCost = maxCost(mu.infoCost, mu.stepsCost ?? undefined);
|
|
546
|
+
if (effCost !== null)
|
|
547
|
+
cost = (cost ?? 0) + effCost;
|
|
548
|
+
}
|
|
549
|
+
if (usage.total === 0 && (cost === null || cost === 0))
|
|
550
|
+
return { events: [], state };
|
|
551
|
+
if (state.lastUsage !== null && state.lastUsage.total === usage.total && state.lastUsage.cost === cost) {
|
|
552
|
+
return { events: [], state };
|
|
553
|
+
}
|
|
554
|
+
const event = { type: 'usage.updated', usage };
|
|
555
|
+
if (cost !== null)
|
|
556
|
+
event.costUsd = cost;
|
|
557
|
+
return { events: [event], state: { ...state, lastUsage: { total: usage.total, cost } } };
|
|
558
|
+
}
|
|
559
|
+
// ---- tiny guards ---------------------------------------------------------------
|
|
560
|
+
function isRecord(value) {
|
|
561
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
562
|
+
}
|
|
563
|
+
function str(value) {
|
|
564
|
+
return typeof value === 'string' && value !== '' ? value : undefined;
|
|
565
|
+
}
|
|
566
|
+
function num(value) {
|
|
567
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
568
|
+
}
|
|
569
|
+
/** Opencode error objects are `{name, data:{message}}` (or plain strings). */
|
|
570
|
+
function errorText(error) {
|
|
571
|
+
if (typeof error === 'string')
|
|
572
|
+
return str(error);
|
|
573
|
+
if (!isRecord(error))
|
|
574
|
+
return undefined;
|
|
575
|
+
const data = isRecord(error.data) ? error.data : undefined;
|
|
576
|
+
return str(error.message) ?? (data && str(data.message)) ?? str(error.name);
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=opencode-ui-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-ui-mapper.js","sourceRoot":"","sources":["../../src/core/opencode-ui-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAeH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmDhD,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,KAA4B;IAE5B,IAAI,KAAK,CAAC,cAAc,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC3E,OAAO;QACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACrE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE;KACrD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA4B;IAC9D,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;IAC3C,OAAO;QACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAC1C,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;KAC3F,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,GAAY,EAAE,KAA4B;IACzE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACjF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,iBAAiB,CAAC;QACvB,KAAK,iBAAiB,CAAC;QACvB,KAAK,mBAAmB;YACtB,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,KAAK,sBAAsB,CAAC;QAC5B,KAAK,sBAAsB;YACzB,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,KAAK,cAAc;YACjB,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC;YACE,2DAA2D;YAC3D,+DAA+D;YAC/D,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,cAAc,CAAC,KAA8B,EAAE,KAA4B;IAClF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACvD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvB,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,uEAAuE;IACvE,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,mBAAmB,CAAC;YAChE,MAAM,MAAM,GAAiB;gBAC3B,mEAAmE;gBACnE,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;gBACzF,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;gBACtC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC;YACF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpD,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,iFAAiF;AAEjF,SAAS,OAAO,CAAC,KAA8B,EAAE,KAA4B;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACvD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAEzE,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,WAAW,KAAK,KAAK,CAAC,SAAS,CAAC;IACzG,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtF,wEAAwE;IACxE,wEAAwE;IACxE,4DAA4D;IAC5D,IAAI,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,WAAW,EAAE,CAAC;QAC7E,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACzE,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QAC9E,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QAChD,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACjD,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/C;YACE,uEAAuE;YACvE,cAAc;YACd,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;oEAEoE;AACpE,SAAS,WAAW,CAClB,IAA6B,EAC7B,EAAU,EACV,KAA2B,EAC3B,WAAoB,EACpB,YAAgC,EAChC,KAA4B;IAE5B,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,YAAY,GAAwB,KAAK,CAAC,YAAY,CAAC;IAC3D,IAAI,OAAO,GAAgC,KAAK,CAAC,OAAO,CAAC;IACzD,IAAI,UAAU,GAAwB,KAAK,CAAC,UAAU,CAAC;IAEvD,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAmC,EAAE;QACjE,MAAM,IAAI,GACR,KAAK,KAAK,MAAM;YACd,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;YAClD,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtC,IAAI,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,IAAI,KAAyB,CAAC;IAC9B,IAAI,UAAU,GAAG,MAAM,CAAC;IACxB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,GAAG,OAAO,CAAC;QAChB,kEAAkE;QAClE,uEAAuE;QACvE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAChC,OAAO,GAAG,WAAW,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED;6DAC6D;AAC7D,MAAM,UAAU,GAAyC;IACvD,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,SAAS,OAAO,CACd,IAA6B,EAC7B,EAAU,EACV,YAAgC,EAChC,KAA4B;IAE5B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,MAAM,GAAe,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC;IAE/D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACnD,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAEnE,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/F,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IAChE,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9C,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,IAAI,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACrD,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IAEjE,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,CAAC;IAC9D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,gEAAgE;QAChE,gDAAgD;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5C,+DAA+D;QAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/C,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;oEACoE;AACpE,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,SAAS;QAClE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,MAAM,KAAK,GAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACtF,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,aAAa,GAA0B,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAErF;;mEAEmE;AACnE,SAAS,QAAQ,CACf,IAA6B,EAC7B,EAAU,EACV,YAAgC,EAChC,KAA4B;IAE5B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACvC,MAAM,KAAK,GACT,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,MAAM;QACZ,EAAE;QACF,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM;QACrD,MAAM,EAAE,WAAW;QACnB,KAAK;QACL,SAAS;KACV,CAAC;IACF,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACjE,OAAO;QACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC1C,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;KACnE,CAAC;AACJ,CAAC;AAED;;8EAE8E;AAC9E,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAgB,EAAQ,EAAE;QACpD,MAAM,IAAI,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACvE,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,KAAK,EAAE;gBAAE,SAAS;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;iBACjD,IAAI,QAAQ,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;gBACrE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED;;2CAE2C;AAC3C,SAAS,UAAU,CACjB,IAA6B,EAC7B,EAAU,EACV,KAA4B;IAE5B,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,MAAM;QACZ,EAAE;QACF,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,SAAS;KAClB,CAAC;IACF,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/D,IAAI,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAC/D,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACtD,OAAO;QACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QACxC,KAAK,EAAE;YACL,GAAG,KAAK;YACR,YAAY,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;SACtD;KACF,CAAC;AACJ,CAAC;AAED;;uDAEuD;AACvD,SAAS,aAAa,CACpB,IAA6B,EAC7B,SAA6B,EAC7B,KAA4B;IAE5B,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC;IACxE,MAAM,MAAM,GAAiB;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;QACzD,SAAS,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;KAC9E,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACrD,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,iFAAiF;AAEjF;;gDAEgD;AAChD,SAAS,OAAO,CAAC,KAA8B,EAAE,KAA4B;IAC3E,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,SAAS,CAAC;IACxF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,GAAe;YACvB,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;YACpB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;YAC1B,MAAM,EAAE,WAAW;SACpB,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5F,CAAC;IACD,mEAAmE;IACnE,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC/D,OAAO;QACL,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,KAAK,CAAC,aAAa;gBAC3B,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;aACrD;SACF;QACD,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;KAC7D,CAAC;AACJ,CAAC;AAED;6EAC6E;AAC7E,SAAS,eAAe,CAAC,KAA8B,EAAE,KAA4B;IACnF,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,SAAS,CAAC;IACzF,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,wBAAwB,CAAC;IACnE,OAAO;QACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1D,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;KAC1F,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,MAAM,mBAAmB,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAEvG;uEACuE;AACvE,SAAS,aAAa,CAAC,MAAe;IACpC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,MAAM,KAAK,GAAe;QACxB,KAAK;QACL,MAAM;QACN,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;KAChF,CAAC;IACF,IAAI,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACzD,IAAI,UAAU,KAAK,SAAS;QAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5D,IAAI,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACzD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,CAAoB,EAAE,CAAa;IACnD,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACzB,MAAM,GAAG,GAAe,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5G,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,SAAS,KAAK,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,UAAU,KAAK,SAAS;QAAE,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,SAAS,KAAK,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IACvD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,MAAM,CAAC,CAAqB,EAAE,CAAqB;IAC1D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,CAAgB,EAAE,CAAqB;IACtD,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;uEACuE;AACvE,SAAS,SAAS,CAAC,KAA4B;IAC7C,IAAI,KAAK,GAAe,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC1D,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAClH,IAAI,SAAS,KAAK,IAAI;YAAE,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;QAChE,IAAI,OAAO,KAAK,IAAI;YAAE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACrF,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvG,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAwB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,IAAI,KAAK,IAAI;QAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAC3F,CAAC;AAED,mFAAmF;AAEnF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,8EAA8E;AAC9E,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC"}
|