@scotthuang/agent-knock-knock 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +45 -17
  3. package/dist/src/agent-session-provider.d.ts +13 -0
  4. package/dist/src/claude-local-transcript-provider.d.ts +29 -1
  5. package/dist/src/claude-local-transcript-provider.js +313 -0
  6. package/dist/src/claude-local-transcript-provider.js.map +1 -1
  7. package/dist/src/claude-terminal-agent-adapter.d.ts +6 -1
  8. package/dist/src/claude-terminal-agent-adapter.js +178 -0
  9. package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
  10. package/dist/src/cli.js +5671 -317
  11. package/dist/src/cli.js.map +1 -1
  12. package/dist/src/codex-local-session-provider.d.ts +3 -1
  13. package/dist/src/codex-local-session-provider.js +17 -0
  14. package/dist/src/codex-local-session-provider.js.map +1 -1
  15. package/dist/src/codex-store-adapter.d.ts +26 -1
  16. package/dist/src/codex-store-adapter.js +575 -2
  17. package/dist/src/codex-store-adapter.js.map +1 -1
  18. package/dist/src/codex-terminal-agent-adapter.d.ts +6 -1
  19. package/dist/src/codex-terminal-agent-adapter.js +192 -0
  20. package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
  21. package/dist/src/managed-session.d.ts +163 -0
  22. package/dist/src/managed-session.js +873 -0
  23. package/dist/src/managed-session.js.map +1 -0
  24. package/dist/src/native-thread-lifecycle-policy.d.ts +57 -0
  25. package/dist/src/native-thread-lifecycle-policy.js +116 -0
  26. package/dist/src/native-thread-lifecycle-policy.js.map +1 -0
  27. package/dist/src/openclaw-plugin-helpers.d.ts +45 -12
  28. package/dist/src/openclaw-plugin-helpers.js +386 -47
  29. package/dist/src/openclaw-plugin-helpers.js.map +1 -1
  30. package/dist/src/openclaw-plugin.js +814 -144
  31. package/dist/src/openclaw-plugin.js.map +1 -1
  32. package/dist/src/protocol.d.ts +28 -1
  33. package/dist/src/protocol.js +93 -4
  34. package/dist/src/protocol.js.map +1 -1
  35. package/dist/src/session-store.d.ts +57 -0
  36. package/dist/src/session-store.js +529 -0
  37. package/dist/src/session-store.js.map +1 -0
  38. package/dist/src/store.d.ts +5 -3
  39. package/dist/src/store.js +422 -17
  40. package/dist/src/store.js.map +1 -1
  41. package/dist/src/terminal-agent-adapter.d.ts +175 -0
  42. package/dist/src/terminal-agent-adapter.js +12 -0
  43. package/dist/src/terminal-agent-adapter.js.map +1 -1
  44. package/dist/src/terminal-agent-bridge.d.ts +9 -0
  45. package/dist/src/terminal-agent-bridge.js +17 -1
  46. package/dist/src/terminal-agent-bridge.js.map +1 -1
  47. package/dist/src/terminal-control-provider.d.ts +2 -0
  48. package/dist/src/terminal-control-provider.js +1 -0
  49. package/dist/src/terminal-control-provider.js.map +1 -1
  50. package/docs/quickstart-tmux.md +23 -2
  51. package/openclaw.plugin.json +19 -3
  52. package/package.json +1 -1
  53. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +42 -17
@@ -1,9 +1,16 @@
1
+ import { createHash } from "node:crypto";
1
2
  import fs from "node:fs";
2
3
  import os from "node:os";
3
4
  import path from "node:path";
4
5
  import { discoverCodexProcesses } from "./codex-session-provider.js";
5
6
  import { SystemTerminalProcessSource, runProcessCommand } from "./terminal-process-source.js";
6
7
  export { parseLsofCwdMap, parsePsProcessSnapshots } from "./terminal-process-source.js";
8
+ const CODEX_LIFECYCLE_VERSION = "0.146.0";
9
+ const NATIVE_THREAD_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
10
+ const MAX_CODEX_SESSION_META_BYTES = 1024 * 1024;
11
+ const NO_FOLLOW_FLAG = typeof fs.constants.O_NOFOLLOW === "number"
12
+ ? fs.constants.O_NOFOLLOW
13
+ : 0;
7
14
  export class CodexStoreAdapter {
8
15
  codexHome;
9
16
  runCommand;
@@ -25,6 +32,96 @@ export class CodexStoreAdapter {
25
32
  }
26
33
  return this.queryJson(dbPath, buildThreadSelect(columns, this.maxSessions));
27
34
  }
35
+ async listThreadLifecycleCandidates(request) {
36
+ assertCodexLifecycleCandidateRequest(request);
37
+ const candidates = [];
38
+ for (const row of await this.listThreadRows()) {
39
+ try {
40
+ const candidate = codexLifecycleCandidateFromRow({
41
+ row,
42
+ codexHome: this.codexHome,
43
+ request
44
+ });
45
+ if (candidate) {
46
+ candidates.push(candidate);
47
+ }
48
+ }
49
+ catch {
50
+ // Historical rows are untrusted discovery input. Unsafe or unstable rows
51
+ // are hidden and can never become resume targets.
52
+ }
53
+ }
54
+ return candidates.sort((left, right) => Number(right.updatedAtMs ?? 0) - Number(left.updatedAtMs ?? 0));
55
+ }
56
+ async revalidateThreadLifecycleCandidate(candidate, request) {
57
+ try {
58
+ assertCodexLifecycleCandidateRequest(request);
59
+ const token = "candidateToken" in candidate
60
+ ? candidate.candidateToken
61
+ : candidate;
62
+ if (token.schema !== "agent-knock-knock/thread-candidate-token" ||
63
+ token.version !== 1 ||
64
+ token.agent !== "codex" ||
65
+ token.source !== "codex_rollout" ||
66
+ token.agentVersion !== request.agentVersion ||
67
+ !path.isAbsolute(token.cwd) ||
68
+ path.resolve(token.cwd) !== path.resolve(request.cwd) ||
69
+ !NATIVE_THREAD_ID_PATTERN.test(token.nativeThreadId)) {
70
+ return {
71
+ status: "unsafe",
72
+ reason: "candidate is not an exact Codex root-thread identity"
73
+ };
74
+ }
75
+ const row = await this.getThreadRow(token.nativeThreadId);
76
+ if (!row) {
77
+ return {
78
+ status: "unavailable",
79
+ reason: "the Codex thread row no longer exists"
80
+ };
81
+ }
82
+ const current = codexLifecycleCandidateFromRow({
83
+ row,
84
+ codexHome: this.codexHome,
85
+ request
86
+ });
87
+ if (!current) {
88
+ return {
89
+ status: "unavailable",
90
+ reason: "the Codex thread is no longer a resumable root CLI session"
91
+ };
92
+ }
93
+ if (!sameThreadFileToken(current.fileToken, token.fileToken) ||
94
+ current.metadataFingerprint !== token.metadataFingerprint ||
95
+ current.modelProvider !== token.modelProvider) {
96
+ return {
97
+ status: "changed",
98
+ candidate: current,
99
+ reason: "the Codex rollout changed after candidate discovery"
100
+ };
101
+ }
102
+ return { status: "valid", candidate: current };
103
+ }
104
+ catch (error) {
105
+ return {
106
+ status: "unsafe",
107
+ reason: error instanceof Error ? error.message : String(error)
108
+ };
109
+ }
110
+ }
111
+ async getThreadRow(nativeThreadId) {
112
+ if (!NATIVE_THREAD_ID_PATTERN.test(nativeThreadId)) {
113
+ throw new Error("Codex thread lookup requires an exact UUID");
114
+ }
115
+ const dbPath = latestStateDbPath(this.codexHome);
116
+ if (!dbPath) {
117
+ return undefined;
118
+ }
119
+ const columns = this.queryJson(dbPath, "pragma table_info(threads)").map((column) => column.name);
120
+ if (!columns.includes("id") || !columns.includes("cwd")) {
121
+ throw new Error("Codex threads table is missing required id or cwd columns");
122
+ }
123
+ return this.queryJson(dbPath, buildThreadByIdSelect(columns, nativeThreadId))[0];
124
+ }
28
125
  async readRollout(rolloutPath) {
29
126
  if (!fs.existsSync(rolloutPath)) {
30
127
  return undefined;
@@ -35,8 +132,39 @@ export class CodexStoreAdapter {
35
132
  return new SystemTerminalProcessSource({ runCommand: this.runCommand })
36
133
  .listProcessSnapshots((snapshot) => discoverCodexProcesses([snapshot]).length > 0);
37
134
  }
135
+ async resolveActiveSessionIdentityForPid(pid, cwd, preferredSessionId, allowedCompanionIdentity, allowedAdditionalIdentities) {
136
+ if (!Number.isSafeInteger(pid) || pid <= 1) {
137
+ throw new Error("Codex process pid must be a positive integer greater than 1");
138
+ }
139
+ const birthResult = this.runCommand("ps", ["-o", "lstart=", "-p", String(pid)]);
140
+ const processBirth = birthResult.stdout.trim();
141
+ if (birthResult.status !== 0 || !processBirth) {
142
+ throw new Error(birthResult.stderr || birthResult.error?.message ||
143
+ `could not inspect start time for Codex process ${pid}`);
144
+ }
145
+ const result = this.runCommand("lsof", [
146
+ "-a",
147
+ "-p",
148
+ String(pid),
149
+ "-FnfDit"
150
+ ]);
151
+ if (result.status !== 0) {
152
+ throw new Error(result.stderr || result.error?.message ||
153
+ `could not inspect open rollout files for Codex process ${pid}`);
154
+ }
155
+ return resolveCodexOpenRolloutIdentity({
156
+ codexHome: this.codexHome,
157
+ pid,
158
+ cwd,
159
+ preferredSessionId,
160
+ allowedCompanionIdentity,
161
+ allowedAdditionalIdentities,
162
+ processBirth,
163
+ lsofOutput: result.stdout
164
+ });
165
+ }
38
166
  queryJson(dbPath, sql) {
39
- const result = this.runCommand("sqlite3", ["-json", dbPath, sql]);
167
+ const result = this.runCommand("sqlite3", ["-readonly", "-json", dbPath, sql]);
40
168
  if (result.status !== 0) {
41
169
  throw new Error(result.stderr || result.error?.message || "sqlite3 query failed");
42
170
  }
@@ -52,6 +180,246 @@ export function latestStateDbPath(codexHome) {
52
180
  .map((entry) => path.join(codexHome, entry))
53
181
  .sort((left, right) => fs.statSync(right).mtimeMs - fs.statSync(left).mtimeMs)[0];
54
182
  }
183
+ export function parseLsofOpenFiles(text) {
184
+ const records = [];
185
+ let current;
186
+ const flush = () => {
187
+ if (current) {
188
+ records.push(current);
189
+ }
190
+ };
191
+ for (const line of text.split(/\r?\n/u)) {
192
+ if (line.startsWith("f")) {
193
+ flush();
194
+ current = { fd: line.slice(1) };
195
+ }
196
+ else if (current && line.startsWith("t")) {
197
+ current.type = line.slice(1);
198
+ }
199
+ else if (current && line.startsWith("D")) {
200
+ current.device = line.slice(1);
201
+ }
202
+ else if (current && line.startsWith("i")) {
203
+ current.inode = line.slice(1);
204
+ }
205
+ else if (current && line.startsWith("n")) {
206
+ current.path = line.slice(1);
207
+ }
208
+ }
209
+ flush();
210
+ return records;
211
+ }
212
+ export function resolveCodexOpenRolloutIdentity({ codexHome, pid, cwd, preferredSessionId, allowedCompanionIdentity, allowedAdditionalIdentities, processBirth, lsofOutput }) {
213
+ const rolloutFiles = parseLsofOpenFiles(lsofOutput).filter((openFile) => {
214
+ if (!openFile.path) {
215
+ return false;
216
+ }
217
+ const openPath = openFile.path.replace(/\s+\(deleted\)$/u, "");
218
+ return /^rollout-.*\.jsonl$/u.test(path.basename(openPath));
219
+ });
220
+ // An absent sessions directory is only evidence of a virgin process when lsof
221
+ // also reported no rollout descriptor at all. Once a rollout FD exists, every
222
+ // part of its identity must be verified or the send fence fails closed.
223
+ if (rolloutFiles.length === 0) {
224
+ return undefined;
225
+ }
226
+ const configuredSessionsRoot = path.join(codexHome, "sessions");
227
+ let sessionsRoot;
228
+ try {
229
+ sessionsRoot = fs.realpathSync(configuredSessionsRoot);
230
+ }
231
+ catch {
232
+ throw new Error(`Codex process ${pid} has open rollout files but CODEX_HOME/sessions is unavailable`);
233
+ }
234
+ const expectedCwd = cwd ? path.resolve(cwd) : undefined;
235
+ const identities = [];
236
+ for (const openFile of rolloutFiles) {
237
+ const openPath = openFile.path;
238
+ const descriptorPath = openPath.replace(/\s+\(deleted\)$/u, "");
239
+ const lexicalRelative = path.relative(path.resolve(configuredSessionsRoot), path.resolve(descriptorPath));
240
+ if (!lexicalRelative ||
241
+ lexicalRelative.startsWith("..") ||
242
+ path.isAbsolute(lexicalRelative)) {
243
+ throw new Error(`Codex process ${pid} has an open rollout outside CODEX_HOME/sessions`);
244
+ }
245
+ if (openFile.type !== "REG" ||
246
+ !openFile.fd ||
247
+ !openFile.device ||
248
+ !openFile.inode ||
249
+ /\s+\(deleted\)$/u.test(openPath)) {
250
+ throw new Error(`Codex process ${pid} has an unverifiable open rollout descriptor`);
251
+ }
252
+ let realPath;
253
+ try {
254
+ realPath = fs.realpathSync(descriptorPath);
255
+ }
256
+ catch {
257
+ throw new Error(`Codex process ${pid} has an unreadable open rollout descriptor`);
258
+ }
259
+ const relative = path.relative(sessionsRoot, realPath);
260
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
261
+ throw new Error(`Codex process ${pid} has an open rollout outside CODEX_HOME/sessions`);
262
+ }
263
+ const expectedDevice = parseLsofInteger(openFile.device);
264
+ const expectedInode = parseLsofInteger(openFile.inode);
265
+ const metadata = readCodexSessionMetadata(descriptorPath, expectedDevice, expectedInode, pid);
266
+ let confirmedRealPath;
267
+ try {
268
+ confirmedRealPath = fs.realpathSync(descriptorPath);
269
+ }
270
+ catch {
271
+ throw new Error(`Codex process ${pid} has an unreadable open rollout descriptor`);
272
+ }
273
+ if (confirmedRealPath !== realPath) {
274
+ throw new Error(`Codex process ${pid} rollout path changed while it was being verified`);
275
+ }
276
+ const filenameSessionId = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/iu
277
+ .exec(path.basename(descriptorPath))?.[1];
278
+ if (!metadata || metadata.id !== filenameSessionId) {
279
+ throw new Error(`Codex process ${pid} has invalid rollout session metadata`);
280
+ }
281
+ if (typeof metadata.source === "object" &&
282
+ metadata.source !== null &&
283
+ "subagent" in metadata.source) {
284
+ continue;
285
+ }
286
+ if (metadata.originator !== "codex-tui" ||
287
+ metadata.source !== "cli" ||
288
+ (expectedCwd && path.resolve(metadata.cwd) !== expectedCwd)) {
289
+ throw new Error(`Codex process ${pid} has an indeterminate open root rollout`);
290
+ }
291
+ identities.push({
292
+ sessionId: metadata.id,
293
+ processUuid: `codex-pid:${pid}:birth:${processBirth}`,
294
+ processBirth,
295
+ rollout: {
296
+ fd: openFile.fd,
297
+ device: openFile.device,
298
+ inode: openFile.inode,
299
+ path: confirmedRealPath
300
+ },
301
+ evidence: "codex_open_root_rollout"
302
+ });
303
+ }
304
+ if (identities.length === 0) {
305
+ throw new Error(`Codex process ${pid} has open rollout files but no exact TUI root identity`);
306
+ }
307
+ if (preferredSessionId) {
308
+ const preferred = identities.filter((identity) => identity.sessionId === preferredSessionId);
309
+ if (preferred.length > 1) {
310
+ throw new Error(`Codex process ${pid} has multiple open root rollouts for preferred ` +
311
+ `session ${preferredSessionId}`);
312
+ }
313
+ if (allowedCompanionIdentity) {
314
+ const allowedConstraints = [
315
+ allowedCompanionIdentity,
316
+ ...(allowedAdditionalIdentities ?? [])
317
+ ];
318
+ const allowedMatches = [];
319
+ for (const constraint of allowedConstraints) {
320
+ const matches = identities.filter((identity) => sameActiveCodexIdentity(identity, constraint));
321
+ if (matches.length > 1) {
322
+ throw new Error(`Codex process ${pid} has multiple open root rollouts for an ` +
323
+ "allowed companion session");
324
+ }
325
+ if (matches[0] && !allowedMatches.includes(matches[0])) {
326
+ allowedMatches.push(matches[0]);
327
+ }
328
+ }
329
+ const unexpected = identities.filter((identity) => identity !== preferred[0] && !allowedMatches.includes(identity));
330
+ if (unexpected.length > 0) {
331
+ throw new Error(`Codex process ${pid} has an unexpected open root rollout outside ` +
332
+ "the preferred and exact companion identities");
333
+ }
334
+ if (preferred.length === 1) {
335
+ return preferred[0];
336
+ }
337
+ const primaryCompanion = identities.find((identity) => sameActiveCodexIdentity(identity, allowedCompanionIdentity));
338
+ if (primaryCompanion) {
339
+ return primaryCompanion;
340
+ }
341
+ if (allowedMatches.length > 0) {
342
+ // The immediately preceding rollout can close while an older,
343
+ // independently verified managed ancestor remains open. Constraint
344
+ // order is authoritative and deterministic; unknown roots were
345
+ // rejected above, so the first surviving exact companion is safe
346
+ // process-incarnation evidence for a fresh status-card proof.
347
+ return allowedMatches[0];
348
+ }
349
+ throw new Error(`Codex process ${pid} has neither the preferred session nor an ` +
350
+ "exact managed companion rollout open");
351
+ }
352
+ else if (preferred.length === 1 && identities.length === 1) {
353
+ return preferred[0];
354
+ }
355
+ else {
356
+ throw new Error(`Codex process ${pid} does not have the preferred session as its ` +
357
+ "sole open root rollout");
358
+ }
359
+ }
360
+ if (identities.length !== 1) {
361
+ throw new Error(`Codex process ${pid} has ${identities.length} open root rollout files; ` +
362
+ "the foreground native session is ambiguous");
363
+ }
364
+ return identities[0];
365
+ }
366
+ function sameActiveCodexIdentity(left, right) {
367
+ return Boolean(left.sessionId === right.sessionId &&
368
+ left.processUuid === right.processUuid &&
369
+ left.processBirth === right.processBirth &&
370
+ left.rollout?.fd === right.rollout?.fd &&
371
+ left.rollout?.device === right.rollout?.device &&
372
+ left.rollout?.inode === right.rollout?.inode &&
373
+ left.rollout?.path === right.rollout?.path);
374
+ }
375
+ function parseLsofInteger(value) {
376
+ try {
377
+ return BigInt(value);
378
+ }
379
+ catch {
380
+ return -1n;
381
+ }
382
+ }
383
+ function readCodexSessionMetadata(filePath, expectedDevice, expectedInode, pid) {
384
+ let fd;
385
+ try {
386
+ fd = fs.openSync(filePath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
387
+ }
388
+ catch {
389
+ throw new Error(`Codex process ${pid} has an unreadable open rollout descriptor`);
390
+ }
391
+ try {
392
+ const stat = fs.fstatSync(fd, { bigint: true });
393
+ if (!stat.isFile() ||
394
+ stat.dev !== expectedDevice ||
395
+ stat.ino !== expectedInode) {
396
+ throw new Error(`Codex process ${pid} rollout descriptor no longer matches its file`);
397
+ }
398
+ const buffer = Buffer.alloc(1024 * 1024);
399
+ const bytesRead = fs.readSync(fd, buffer, 0, buffer.length, 0);
400
+ const text = buffer.subarray(0, bytesRead).toString("utf8");
401
+ const newline = text.indexOf("\n");
402
+ if (newline < 0 && bytesRead === buffer.length) {
403
+ throw new Error(`Codex session metadata line is too large: ${filePath}`);
404
+ }
405
+ const parsed = JSON.parse(newline >= 0 ? text.slice(0, newline) : text);
406
+ const payload = parsed?.type === "session_meta" ? parsed.payload : undefined;
407
+ if (typeof payload?.id !== "string" ||
408
+ typeof payload?.cwd !== "string" ||
409
+ typeof payload?.originator !== "string") {
410
+ return undefined;
411
+ }
412
+ return {
413
+ id: payload.id,
414
+ cwd: payload.cwd,
415
+ originator: payload.originator,
416
+ source: payload.source
417
+ };
418
+ }
419
+ finally {
420
+ fs.closeSync(fd);
421
+ }
422
+ }
55
423
  export function buildThreadSelect(columns, limit) {
56
424
  const columnSet = new Set(columns);
57
425
  const updatedAtExpression = columnSet.has("updated_at_ms")
@@ -67,8 +435,213 @@ export function buildThreadSelect(columns, limit) {
67
435
  columnSet.has("preview") ? "preview" : "null as preview",
68
436
  columnSet.has("first_user_message") ? "first_user_message" : "null as first_user_message",
69
437
  columnSet.has("updated_at_ms") ? "updated_at_ms" : columnSet.has("updated_at") ? "updated_at * 1000 as updated_at_ms" : "null as updated_at_ms",
70
- columnSet.has("archived") ? "archived" : "0 as archived"
438
+ columnSet.has("archived") ? "archived" : "0 as archived",
439
+ columnSet.has("source") ? "source" : "null as source",
440
+ columnSet.has("model_provider") ? "model_provider" : "null as model_provider",
441
+ columnSet.has("cli_version") ? "cli_version" : "null as cli_version",
442
+ columnSet.has("name") ? "name" : "null as name"
71
443
  ].join(", ");
72
444
  return `select ${select} from threads order by ${updatedAtExpression} desc limit ${Math.max(1, Math.floor(limit))}`;
73
445
  }
446
+ export function buildThreadByIdSelect(columns, nativeThreadId) {
447
+ if (!NATIVE_THREAD_ID_PATTERN.test(nativeThreadId)) {
448
+ throw new Error("Codex thread lookup requires an exact UUID");
449
+ }
450
+ const base = buildThreadSelect(columns, 1);
451
+ return base.replace(" from threads order by ", ` from threads where id = '${nativeThreadId.toLowerCase()}' order by `);
452
+ }
453
+ function assertCodexLifecycleCandidateRequest(request) {
454
+ if (request.agentVersion !== CODEX_LIFECYCLE_VERSION) {
455
+ throw new Error(`Codex lifecycle candidates require exact version ${CODEX_LIFECYCLE_VERSION}`);
456
+ }
457
+ if (!request.cwd || !path.isAbsolute(request.cwd)) {
458
+ throw new Error("Codex lifecycle candidate discovery requires an absolute cwd");
459
+ }
460
+ }
461
+ function codexLifecycleCandidateFromRow({ row, codexHome, request }) {
462
+ const nativeThreadId = stringField(row.id)?.toLowerCase();
463
+ const rowCwd = stringField(row.cwd);
464
+ const rolloutPath = stringField(row.rollout_path ?? row.rolloutPath);
465
+ const rowSource = stringField(row.source);
466
+ const rowVersion = stringField(row.cli_version);
467
+ const rowModelProvider = stringField(row.model_provider);
468
+ if (!nativeThreadId ||
469
+ !NATIVE_THREAD_ID_PATTERN.test(nativeThreadId) ||
470
+ !rowCwd ||
471
+ !rolloutPath ||
472
+ !path.isAbsolute(rowCwd) ||
473
+ !path.isAbsolute(rolloutPath) ||
474
+ rowSource !== "cli" ||
475
+ rowVersion !== CODEX_LIFECYCLE_VERSION ||
476
+ row.archived === true ||
477
+ row.archived === 1 ||
478
+ path.resolve(rowCwd) !== path.resolve(request.cwd) ||
479
+ (request.modelProvider !== undefined &&
480
+ rowModelProvider !== request.modelProvider)) {
481
+ return undefined;
482
+ }
483
+ const opened = readCodexLifecycleMetadata({
484
+ codexHome,
485
+ rolloutPath,
486
+ nativeThreadId
487
+ });
488
+ if (opened.metadata.id !== nativeThreadId ||
489
+ !path.isAbsolute(opened.metadata.cwd) ||
490
+ path.resolve(opened.metadata.cwd) !== path.resolve(request.cwd) ||
491
+ opened.metadata.originator !== "codex-tui" ||
492
+ opened.metadata.source !== "cli" ||
493
+ opened.metadata.cliVersion !== CODEX_LIFECYCLE_VERSION ||
494
+ (rowModelProvider !== undefined &&
495
+ opened.metadata.modelProvider !== rowModelProvider) ||
496
+ (request.modelProvider !== undefined &&
497
+ opened.metadata.modelProvider !== request.modelProvider)) {
498
+ return undefined;
499
+ }
500
+ const title = boundedCandidateText(row.name ?? row.title);
501
+ const preview = boundedCandidateText(row.preview ?? row.first_user_message ?? row.firstUserMessage);
502
+ const updatedAtMs = finiteNumber(row.updated_at_ms ?? row.updatedAtMs) ??
503
+ opened.fileToken.mtimeMs;
504
+ const metadataFingerprint = createHash("sha256")
505
+ .update(JSON.stringify({
506
+ nativeThreadId,
507
+ cwd: path.resolve(opened.metadata.cwd),
508
+ originator: opened.metadata.originator,
509
+ source: opened.metadata.source,
510
+ cliVersion: opened.metadata.cliVersion,
511
+ modelProvider: opened.metadata.modelProvider ?? null,
512
+ rolloutPath: opened.fileToken.path
513
+ }))
514
+ .digest("hex");
515
+ const candidateToken = {
516
+ schema: "agent-knock-knock/thread-candidate-token",
517
+ version: 1,
518
+ agent: "codex",
519
+ nativeThreadId,
520
+ cwd: path.resolve(request.cwd),
521
+ source: "codex_rollout",
522
+ agentVersion: CODEX_LIFECYCLE_VERSION,
523
+ fileToken: opened.fileToken,
524
+ metadataFingerprint,
525
+ modelProvider: opened.metadata.modelProvider
526
+ };
527
+ return {
528
+ agent: "codex",
529
+ nativeThreadId,
530
+ cwd: path.resolve(request.cwd),
531
+ source: "codex_rollout",
532
+ rootInteractive: true,
533
+ fileToken: opened.fileToken,
534
+ agentVersion: CODEX_LIFECYCLE_VERSION,
535
+ title,
536
+ preview,
537
+ updatedAtMs,
538
+ modelProvider: opened.metadata.modelProvider,
539
+ metadataFingerprint,
540
+ candidateToken
541
+ };
542
+ }
543
+ function readCodexLifecycleMetadata({ codexHome, rolloutPath, nativeThreadId }) {
544
+ const configuredRoot = path.resolve(codexHome, "sessions");
545
+ const lexicalRelative = path.relative(configuredRoot, path.resolve(rolloutPath));
546
+ if (!lexicalRelative ||
547
+ lexicalRelative.startsWith("..") ||
548
+ path.isAbsolute(lexicalRelative)) {
549
+ throw new Error("Codex lifecycle rollout is outside CODEX_HOME/sessions");
550
+ }
551
+ const sessionsRoot = fs.realpathSync(configuredRoot);
552
+ const lstat = fs.lstatSync(rolloutPath);
553
+ if (lstat.isSymbolicLink() || !lstat.isFile()) {
554
+ throw new Error("Codex lifecycle rollout must be a non-symlink regular file");
555
+ }
556
+ const realPath = fs.realpathSync(rolloutPath);
557
+ const realRelative = path.relative(sessionsRoot, realPath);
558
+ if (!realRelative ||
559
+ realRelative.startsWith("..") ||
560
+ path.isAbsolute(realRelative)) {
561
+ throw new Error("Codex lifecycle rollout resolves outside CODEX_HOME/sessions");
562
+ }
563
+ const filenameId = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/iu
564
+ .exec(path.basename(realPath))?.[1]?.toLowerCase();
565
+ if (filenameId !== nativeThreadId) {
566
+ throw new Error("Codex lifecycle rollout filename does not match its thread UUID");
567
+ }
568
+ const fd = fs.openSync(realPath, fs.constants.O_RDONLY | NO_FOLLOW_FLAG);
569
+ try {
570
+ const before = fs.fstatSync(fd);
571
+ if (!before.isFile() || before.size <= 0 || !Number.isSafeInteger(before.size)) {
572
+ throw new Error("Codex lifecycle rollout has an invalid file identity");
573
+ }
574
+ if (process.platform !== "win32" &&
575
+ typeof process.getuid === "function" &&
576
+ before.uid !== process.getuid()) {
577
+ throw new Error("Codex lifecycle rollout is not owned by the current user");
578
+ }
579
+ if (process.platform !== "win32" && (before.mode & 0o022) !== 0) {
580
+ throw new Error("Codex lifecycle rollout is writable by another user");
581
+ }
582
+ const bytesToRead = Math.min(before.size, MAX_CODEX_SESSION_META_BYTES);
583
+ const buffer = Buffer.allocUnsafe(bytesToRead);
584
+ const bytesRead = fs.readSync(fd, buffer, 0, bytesToRead, 0);
585
+ const text = buffer.subarray(0, bytesRead).toString("utf8");
586
+ const newline = text.indexOf("\n");
587
+ if (newline < 0 && before.size > bytesRead) {
588
+ throw new Error("Codex lifecycle session metadata line exceeds the read limit");
589
+ }
590
+ const parsed = JSON.parse(newline >= 0 ? text.slice(0, newline) : text);
591
+ const payload = parsed?.type === "session_meta" ? parsed.payload : undefined;
592
+ const id = stringField(payload?.id)?.toLowerCase();
593
+ const cwd = stringField(payload?.cwd);
594
+ const originator = stringField(payload?.originator);
595
+ const source = stringField(payload?.source);
596
+ const cliVersion = stringField(payload?.cli_version);
597
+ const modelProvider = stringField(payload?.model_provider);
598
+ if (!id || !cwd || !originator || !source || !cliVersion) {
599
+ throw new Error("Codex lifecycle rollout has incomplete session metadata");
600
+ }
601
+ const after = fs.fstatSync(fd);
602
+ if (after.dev !== before.dev ||
603
+ after.ino !== before.ino ||
604
+ after.size !== before.size ||
605
+ after.mtimeMs !== before.mtimeMs ||
606
+ fs.realpathSync(realPath) !== realPath) {
607
+ throw new Error("Codex lifecycle rollout changed while it was inspected");
608
+ }
609
+ return {
610
+ fileToken: {
611
+ path: realPath,
612
+ device: String(before.dev),
613
+ inode: String(before.ino),
614
+ size: before.size,
615
+ mtimeMs: before.mtimeMs
616
+ },
617
+ metadata: { id, cwd, originator, source, cliVersion, modelProvider }
618
+ };
619
+ }
620
+ finally {
621
+ fs.closeSync(fd);
622
+ }
623
+ }
624
+ function sameThreadFileToken(left, right) {
625
+ return left.path === right.path &&
626
+ left.device === right.device &&
627
+ left.inode === right.inode &&
628
+ left.size === right.size &&
629
+ left.mtimeMs === right.mtimeMs;
630
+ }
631
+ function stringField(value) {
632
+ return typeof value === "string" && value.trim().length > 0
633
+ ? value.trim()
634
+ : undefined;
635
+ }
636
+ function finiteNumber(value) {
637
+ const number = Number(value);
638
+ return Number.isFinite(number) ? number : undefined;
639
+ }
640
+ function boundedCandidateText(value) {
641
+ const text = stringField(value)?.replace(/\s+/gu, " ");
642
+ if (!text) {
643
+ return undefined;
644
+ }
645
+ return text.length <= 400 ? text : `${text.slice(0, 399)}…`;
646
+ }
74
647
  //# sourceMappingURL=codex-store-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-store-adapter.js","sourceRoot":"","sources":["../../src/codex-store-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-store-adapter.js","sourceRoot":"","sources":["../../src/codex-store-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAkD,MAAM,6BAA6B,CAAC;AAUrH,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EAElB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,uBAAuB,EAExB,MAAM,8BAA8B,CAAC;AAetC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAC1C,MAAM,wBAAwB,GAC5B,kEAAkE,CAAC;AACrE,MAAM,4BAA4B,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,cAAc,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,QAAQ;IAChE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU;IACzB,CAAC,CAAC,CAAC,CAAC;AAEN,MAAM,OAAO,iBAAiB;IAGX,SAAS,CAAS;IAClB,UAAU,CAA4D;IACtE,WAAW,CAAS;IAErC,YAAY,OAAO,GAA6B,EAAE;QAChD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;QAC1D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAmB,MAAM,EAAE,4BAA4B,CAAC;aACnF,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAiB,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,6BAA6B,CACjC,OAAgD;QAEhD,oCAAoC,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAuC,EAAE,CAAC;QAC1D,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,cAAc,EAA+B,EAAE,CAAC;YAC3E,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,8BAA8B,CAAC;oBAC/C,GAAG;oBACH,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,OAAO;iBACR,CAAC,CAAC;gBACH,IAAI,SAAS,EAAE,CAAC;oBACd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;gBACzE,kDAAkD;YACpD,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kCAAkC,CACtC,SAAmF,EACnF,OAAgD;QAEhD,IAAI,CAAC;YACH,oCAAoC,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,gBAAgB,IAAI,SAAS;gBACzC,CAAC,CAAC,SAAS,CAAC,cAAc;gBAC1B,CAAC,CAAC,SAAS,CAAC;YACd,IACE,KAAK,CAAC,MAAM,KAAK,0CAA0C;gBAC3D,KAAK,CAAC,OAAO,KAAK,CAAC;gBACnB,KAAK,CAAC,KAAK,KAAK,OAAO;gBACvB,KAAK,CAAC,MAAM,KAAK,eAAe;gBAChC,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;gBAC3C,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBACrD,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EACpD,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,sDAAsD;iBAC/D,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;oBACL,MAAM,EAAE,aAAa;oBACrB,MAAM,EAAE,uCAAuC;iBAChD,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,8BAA8B,CAAC;gBAC7C,GAAG;gBACH,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO;aACR,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;oBACL,MAAM,EAAE,aAAa;oBACrB,MAAM,EAAE,4DAA4D;iBACrE,CAAC;YACJ,CAAC;YACD,IACE,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;gBACxD,OAAO,CAAC,mBAAmB,KAAK,KAAK,CAAC,mBAAmB;gBACzD,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,EAC7C,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,OAAO;oBAClB,MAAM,EAAE,qDAAqD;iBAC9D,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,cAAsB;QAEtB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B,MAAM,EACN,4BAA4B,CAC7B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CACnB,MAAM,EACN,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC,CAC/C,CAAC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,2BAA2B,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aACpE,oBAAoB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,kCAAkC,CACtC,GAAW,EACX,GAAY,EACZ,kBAA2B,EAC3B,wBAAqD,EACrD,2BAAmE;QAEnE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO;gBAChD,kDAAkD,GAAG,EAAE,CACxD,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACrC,IAAI;YACJ,IAAI;YACJ,MAAM,CAAC,GAAG,CAAC;YACX,SAAS;SACV,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO;gBACtC,0DAA0D,GAAG,EAAE,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,+BAA+B,CAAC;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG;YACH,GAAG;YACH,kBAAkB;YAClB,wBAAwB;YACxB,2BAA2B;YAC3B,YAAY;YACZ,UAAU,EAAE,MAAM,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;IAEO,SAAS,CAAI,MAAc,EAAE,GAAW;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAQ,CAAC;IAClD,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;SAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAUD,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,IAAI,OAAuC,CAAC;IAC5C,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,EAC9C,SAAS,EACT,GAAG,EACH,GAAG,EACH,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,YAAY,EACZ,UAAU,EAUX;IACC,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QACtE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,8EAA8E;IAC9E,8EAA8E;IAC9E,wEAAwE;IACxE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChE,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,gEAAgE,CACrF,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,MAAM,UAAU,GAAiC,EAAE,CAAC;IACpD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAK,CAAC;QAChC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CACnC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,EACpC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAC7B,CAAC;QACF,IACE,CAAC,eAAe;YAChB,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAChC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,kDAAkD,CACvE,CAAC;QACJ,CAAC;QACD,IACE,QAAQ,CAAC,IAAI,KAAK,KAAK;YACvB,CAAC,QAAQ,CAAC,EAAE;YACZ,CAAC,QAAQ,CAAC,MAAM;YAChB,CAAC,QAAQ,CAAC,KAAK;YACf,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EACjC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,8CAA8C,CACnE,CAAC;QACJ,CAAC;QACD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,4CAA4C,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,kDAAkD,CACvE,CAAC;QACJ,CAAC;QACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,wBAAwB,CACvC,cAAc,EACd,cAAc,EACd,aAAa,EACb,GAAG,CACJ,CAAC;QACF,IAAI,iBAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,4CAA4C,CACjE,CAAC;QACJ,CAAC;QACD,IAAI,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,mDAAmD,CACxE,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG,0EAA0E;aACjG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,iBAAiB,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,uCAAuC,CAC5D,CAAC;QACJ,CAAC;QACD,IACE,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;YACnC,QAAQ,CAAC,MAAM,KAAK,IAAI;YACxB,UAAU,IAAI,QAAQ,CAAC,MAAM,EAC7B,CAAC;YACD,SAAS;QACX,CAAC;QACD,IACE,QAAQ,CAAC,UAAU,KAAK,WAAW;YACnC,QAAQ,CAAC,MAAM,KAAK,KAAK;YACzB,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,EAC3D,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,yCAAyC,CAC9D,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,QAAQ,CAAC,EAAE;YACtB,WAAW,EAAE,aAAa,GAAG,UAAU,YAAY,EAAE;YACrD,YAAY;YACZ,OAAO,EAAE;gBACP,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,iBAAiB;aACxB;YACD,QAAQ,EAAE,yBAAyB;SACpC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,wDAAwD,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/C,QAAQ,CAAC,SAAS,KAAK,kBAAkB,CAC1C,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,iDAAiD;gBACrE,WAAW,kBAAkB,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,IAAI,wBAAwB,EAAE,CAAC;YAC7B,MAAM,kBAAkB,GAAG;gBACzB,wBAAwB;gBACxB,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC;aACvC,CAAC;YACF,MAAM,cAAc,GAAiC,EAAE,CAAC;YACxD,KAAK,MAAM,UAAU,IAAI,kBAAkB,EAAE,CAAC;gBAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7C,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAC9C,CAAC;gBACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,0CAA0C;wBAC9D,2BAA2B,CAC5B,CAAC;gBACJ,CAAC;gBACD,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChD,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAChE,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,+CAA+C;oBACnE,8CAA8C,CAC/C,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACpD,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAC5D,CAAC;YACF,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,gBAAgB,CAAC;YAC1B,CAAC;YACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,8DAA8D;gBAC9D,mEAAmE;gBACnE,+DAA+D;gBAC/D,iEAAiE;gBACjE,8DAA8D;gBAC9D,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,4CAA4C;gBAChE,sCAAsC,CACvC,CAAC;QACJ,CAAC;aAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,8CAA8C;gBAClE,wBAAwB,CACzB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,QAAQ,UAAU,CAAC,MAAM,4BAA4B;YACzE,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAgC,EAChC,KAAiC;IAEjC,OAAO,OAAO,CACZ,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAClC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QACtC,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY;QACxC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,MAAM;QAC9C,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK;QAC5C,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,IAAI,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAgB,EAChB,cAAsB,EACtB,aAAqB,EACrB,GAAW;IAOX,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,EAAE,CAAC,QAAQ,CACd,QAAQ,EACR,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAChD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,4CAA4C,CACjE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IACE,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,IAAI,CAAC,GAAG,KAAK,cAAc;YAC3B,IAAI,CAAC,GAAG,KAAK,aAAa,EAC1B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,gDAAgD,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,IACE,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ;YAC/B,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ;YAChC,OAAO,OAAO,EAAE,UAAU,KAAK,QAAQ,EACvC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAiB,EAAE,KAAa;IAChE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,mBAAmB,GAAG,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC;QACxD,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;YAC3B,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,GAAG,CAAC;IACV,MAAM,MAAM,GAAG;QACb,IAAI;QACJ,KAAK;QACL,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB;QACvE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;QAClD,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;QACxD,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,4BAA4B;QACzF,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,uBAAuB;QAC/I,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe;QACxD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB;QACrD,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,wBAAwB;QAC7E,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,qBAAqB;QACpE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,UAAU,MAAM,0BAA0B,mBAAmB,eAAe,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAiB,EACjB,cAAsB;IAEtB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,OAAO,CACjB,yBAAyB,EACzB,6BAA6B,cAAc,CAAC,WAAW,EAAE,aAAa,CACvE,CAAC;AACJ,CAAC;AAED,SAAS,oCAAoC,CAC3C,OAAgD;IAEhD,IAAI,OAAO,CAAC,YAAY,KAAK,uBAAuB,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,oDAAoD,uBAAuB,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,EACtC,GAAG,EACH,SAAS,EACT,OAAO,EAKR;IACC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACzD,IACE,CAAC,cAAc;QACf,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC;QAC9C,CAAC,MAAM;QACP,CAAC,WAAW;QACZ,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACxB,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAC7B,SAAS,KAAK,KAAK;QACnB,UAAU,KAAK,uBAAuB;QACtC,GAAG,CAAC,QAAQ,KAAK,IAAI;QACrB,GAAG,CAAC,QAAQ,KAAK,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAClD,CACE,OAAO,CAAC,aAAa,KAAK,SAAS;YACnC,gBAAgB,KAAK,OAAO,CAAC,aAAa,CAC3C,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,0BAA0B,CAAC;QACxC,SAAS;QACT,WAAW;QACX,cAAc;KACf,CAAC,CAAC;IACH,IACE,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,cAAc;QACrC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,WAAW;QAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK;QAChC,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,uBAAuB;QACtD,CACE,gBAAgB,KAAK,SAAS;YAC9B,MAAM,CAAC,QAAQ,CAAC,aAAa,KAAK,gBAAgB,CACnD;QACD,CACE,OAAO,CAAC,aAAa,KAAK,SAAS;YACnC,MAAM,CAAC,QAAQ,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CACxD,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,oBAAoB,CAClC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,gBAAgB,CAC9D,CAAC;IACF,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,WAAW,CAAC;QACpE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IAC3B,MAAM,mBAAmB,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,cAAc;QACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC9B,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI;QACpD,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI;KACnC,CAAC,CAAC;SACF,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,MAAM,cAAc,GAA0C;QAC5D,MAAM,EAAE,0CAA0C;QAClD,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,OAAO;QACd,cAAc;QACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAC9B,MAAM,EAAE,eAAe;QACvB,YAAY,EAAE,uBAAuB;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,mBAAmB;QACnB,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;KAC7C,CAAC;IACF,OAAO;QACL,KAAK,EAAE,OAAO;QACd,cAAc;QACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAC9B,MAAM,EAAE,eAAe;QACvB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,uBAAuB;QACrC,KAAK;QACL,OAAO;QACP,WAAW;QACX,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;QAC5C,mBAAmB;QACnB,cAAc;KACf,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,EAClC,SAAS,EACT,WAAW,EACX,cAAc,EAKf;IAWC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACjF,IACE,CAAC,eAAe;QAChB,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3D,IACE,CAAC,YAAY;QACb,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,UAAU,GAAG,0EAA0E;SAC1F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACrD,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;YACpC,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,EAC/B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,IACE,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;YACxB,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;YACxB,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YAC1B,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;YAChC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO;YACL,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;YACD,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE;SACrE,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAA6B,EAC7B,KAA8B;IAE9B,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QAC7B,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC5B,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAC1B,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACxB,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACd,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAC9D,CAAC"}