claude-code-infinite 1.0.9 → 1.0.14

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 (136) hide show
  1. package/README.md +230 -37
  2. package/dist/cc-request.d.ts +94 -0
  3. package/dist/cc-request.d.ts.map +1 -0
  4. package/dist/cc-request.js +194 -0
  5. package/dist/cc-request.js.map +1 -0
  6. package/dist/claude-env.d.ts +30 -0
  7. package/dist/claude-env.d.ts.map +1 -0
  8. package/dist/claude-env.js +55 -0
  9. package/dist/claude-env.js.map +1 -0
  10. package/dist/cli-args.d.ts +32 -0
  11. package/dist/cli-args.d.ts.map +1 -0
  12. package/dist/cli-args.js +72 -0
  13. package/dist/cli-args.js.map +1 -0
  14. package/dist/cli-lifecycle.d.ts +17 -0
  15. package/dist/cli-lifecycle.d.ts.map +1 -0
  16. package/dist/cli-lifecycle.js +30 -0
  17. package/dist/cli-lifecycle.js.map +1 -0
  18. package/dist/cli-main.d.ts +15 -0
  19. package/dist/cli-main.d.ts.map +1 -0
  20. package/dist/cli-main.js +464 -0
  21. package/dist/cli-main.js.map +1 -0
  22. package/dist/cli.js +13 -177
  23. package/dist/cli.js.map +1 -1
  24. package/dist/config.d.ts +3 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +29 -3
  27. package/dist/config.js.map +1 -1
  28. package/dist/count-tokens.d.ts +78 -0
  29. package/dist/count-tokens.d.ts.map +1 -0
  30. package/dist/count-tokens.js +277 -0
  31. package/dist/count-tokens.js.map +1 -0
  32. package/dist/final-index.d.ts +10 -0
  33. package/dist/final-index.d.ts.map +1 -0
  34. package/dist/final-index.js +37 -0
  35. package/dist/final-index.js.map +1 -0
  36. package/dist/hooks.d.ts +239 -0
  37. package/dist/hooks.d.ts.map +1 -0
  38. package/dist/hooks.js +618 -0
  39. package/dist/hooks.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +8 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/memtree-fetch.d.ts +24 -0
  45. package/dist/memtree-fetch.d.ts.map +1 -0
  46. package/dist/memtree-fetch.js +121 -0
  47. package/dist/memtree-fetch.js.map +1 -0
  48. package/dist/memtree-finder.d.ts +99 -0
  49. package/dist/memtree-finder.d.ts.map +1 -0
  50. package/dist/memtree-finder.js +235 -0
  51. package/dist/memtree-finder.js.map +1 -0
  52. package/dist/memtree-links.d.ts +16 -0
  53. package/dist/memtree-links.d.ts.map +1 -0
  54. package/dist/memtree-links.js +66 -0
  55. package/dist/memtree-links.js.map +1 -0
  56. package/dist/memtree-mcp-config.d.ts +28 -0
  57. package/dist/memtree-mcp-config.d.ts.map +1 -0
  58. package/dist/memtree-mcp-config.js +121 -0
  59. package/dist/memtree-mcp-config.js.map +1 -0
  60. package/dist/memtree-mcp.d.ts +265 -0
  61. package/dist/memtree-mcp.d.ts.map +1 -0
  62. package/dist/memtree-mcp.js +667 -0
  63. package/dist/memtree-mcp.js.map +1 -0
  64. package/dist/memtree-newest.d.ts +74 -0
  65. package/dist/memtree-newest.d.ts.map +1 -0
  66. package/dist/memtree-newest.js +217 -0
  67. package/dist/memtree-newest.js.map +1 -0
  68. package/dist/memtree-tools.d.ts +105 -0
  69. package/dist/memtree-tools.d.ts.map +1 -0
  70. package/dist/memtree-tools.js +408 -0
  71. package/dist/memtree-tools.js.map +1 -0
  72. package/dist/memtree.d.ts +398 -0
  73. package/dist/memtree.d.ts.map +1 -0
  74. package/dist/memtree.js +1231 -0
  75. package/dist/memtree.js.map +1 -0
  76. package/dist/notices.d.ts +177 -0
  77. package/dist/notices.d.ts.map +1 -0
  78. package/dist/notices.js +469 -0
  79. package/dist/notices.js.map +1 -0
  80. package/dist/payment-gate.d.ts +53 -0
  81. package/dist/payment-gate.d.ts.map +1 -0
  82. package/dist/payment-gate.js +97 -0
  83. package/dist/payment-gate.js.map +1 -0
  84. package/dist/project-meta.d.ts +15 -0
  85. package/dist/project-meta.d.ts.map +1 -0
  86. package/dist/project-meta.js +80 -0
  87. package/dist/project-meta.js.map +1 -0
  88. package/dist/prompt-accounting.d.ts +12 -0
  89. package/dist/prompt-accounting.d.ts.map +1 -0
  90. package/dist/prompt-accounting.js +70 -0
  91. package/dist/prompt-accounting.js.map +1 -0
  92. package/dist/proxy.d.ts +197 -0
  93. package/dist/proxy.d.ts.map +1 -0
  94. package/dist/proxy.js +4247 -0
  95. package/dist/proxy.js.map +1 -0
  96. package/dist/reqlog.d.ts +419 -0
  97. package/dist/reqlog.d.ts.map +1 -0
  98. package/dist/reqlog.js +146 -0
  99. package/dist/reqlog.js.map +1 -0
  100. package/dist/request-sizing.d.ts +52 -0
  101. package/dist/request-sizing.d.ts.map +1 -0
  102. package/dist/request-sizing.js +92 -0
  103. package/dist/request-sizing.js.map +1 -0
  104. package/dist/resume-repair-file.d.ts +17 -0
  105. package/dist/resume-repair-file.d.ts.map +1 -0
  106. package/dist/resume-repair-file.js +100 -0
  107. package/dist/resume-repair-file.js.map +1 -0
  108. package/dist/resume-repair.d.ts +27 -0
  109. package/dist/resume-repair.d.ts.map +1 -0
  110. package/dist/resume-repair.js +198 -0
  111. package/dist/resume-repair.js.map +1 -0
  112. package/dist/route-cache.d.ts +5 -0
  113. package/dist/route-cache.d.ts.map +1 -0
  114. package/dist/route-cache.js +63 -0
  115. package/dist/route-cache.js.map +1 -0
  116. package/dist/route-fallback.d.ts +29 -0
  117. package/dist/route-fallback.d.ts.map +1 -0
  118. package/dist/route-fallback.js +49 -0
  119. package/dist/route-fallback.js.map +1 -0
  120. package/dist/route-identity.d.ts +6 -0
  121. package/dist/route-identity.d.ts.map +1 -0
  122. package/dist/route-identity.js +100 -0
  123. package/dist/route-identity.js.map +1 -0
  124. package/dist/transcript-usage.d.ts +57 -0
  125. package/dist/transcript-usage.d.ts.map +1 -0
  126. package/dist/transcript-usage.js +570 -0
  127. package/dist/transcript-usage.js.map +1 -0
  128. package/dist/turns.d.ts +73 -0
  129. package/dist/turns.d.ts.map +1 -0
  130. package/dist/turns.js +298 -0
  131. package/dist/turns.js.map +1 -0
  132. package/dist/update-check.d.ts +38 -0
  133. package/dist/update-check.d.ts.map +1 -0
  134. package/dist/update-check.js +67 -0
  135. package/dist/update-check.js.map +1 -0
  136. package/package.json +6 -2
@@ -0,0 +1,49 @@
1
+ /** After attempting compression at the soft budget, forward input that fits
2
+ * the model's native context together with its output reservation. */
3
+ export function fitsFallbackBudget(inputTokens, outputTokens, budgetTokens, contextTokens) {
4
+ return [inputTokens, outputTokens, budgetTokens, contextTokens].every((value) => Number.isFinite(value) && value >= 0) && inputTokens + outputTokens <= contextTokens;
5
+ }
6
+ /**
7
+ * Claude Code 2.1.288 retries 503 itself, even with SDK maxRetries=0.
8
+ * 529 has extra overload handling (including indefinite watchdog retries).
9
+ * Use ordinary 503 retries and bound the episode in the proxy itself.
10
+ * Successful delivery ends an episode; hook events and elapsed time do not.
11
+ */
12
+ export class RouteFallbackFailures {
13
+ capacity;
14
+ failures = new Map();
15
+ constructor(capacity = 128) {
16
+ this.capacity = capacity;
17
+ }
18
+ fail(lane) {
19
+ const previous = this.failures.get(lane);
20
+ // Fail closed when full rather than evicting a lane and granting it
21
+ // another retry budget. A successful lane frees its slot.
22
+ const attempt = previous === undefined && this.failures.size >= this.capacity
23
+ ? 3 : Math.min((previous ?? 0) + 1, 3);
24
+ if (previous !== undefined || this.failures.size < this.capacity) {
25
+ this.failures.set(lane, attempt);
26
+ }
27
+ const retry = attempt <= 2;
28
+ return {
29
+ status: retry ? 503 : 400,
30
+ attempt,
31
+ headers: retry
32
+ ? { "retry-after": "1", "x-should-retry": "true" }
33
+ : { "x-should-retry": "false" },
34
+ body: {
35
+ type: "error",
36
+ error: {
37
+ type: retry ? "api_error" : "invalid_request_error",
38
+ message: retry
39
+ ? "MemTree could not produce a usable compressed request; retrying within a bounded limit."
40
+ : "MemTree could not fit this request within its budget. Automatic recovery stopped; retry after service recovery or reduce the conversation.",
41
+ },
42
+ },
43
+ };
44
+ }
45
+ succeeded(lane) {
46
+ this.failures.delete(lane);
47
+ }
48
+ }
49
+ //# sourceMappingURL=route-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-fallback.js","sourceRoot":"","sources":["../src/route-fallback.ts"],"names":[],"mappings":"AAAA;sEACsE;AACtE,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,YAAoB,EACpB,YAAoB,EACpB,aAAqB;IAErB,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,KAAK,CACnE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAChD,IAAI,WAAW,GAAG,YAAY,IAAI,aAAa,CAAC;AACnD,CAAC;AASD;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IAGH;IAFZ,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtD,YAA6B,WAAW,GAAG;QAAd,aAAQ,GAAR,QAAQ,CAAM;IAAG,CAAC;IAE/C,IAAI,CAAC,IAAY;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;YAC3E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,CAAC;QAC3B,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACzB,OAAO;YACP,OAAO,EAAE,KAAK;gBACZ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE;gBAClD,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE;YACjC,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB;oBACnD,OAAO,EAAE,KAAK;wBACZ,CAAC,CAAC,yFAAyF;wBAC3F,CAAC,CAAC,4IAA4I;iBACjJ;aACF;SACF,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { type Message } from "./turns.js";
2
+ /** Hash each incoming message once, then reuse it across route candidates/checks. */
3
+ export declare function routeMessageHash(message: Message): string;
4
+ /** Stable prefixes span turns in which Claude can omit earlier thinking blocks. */
5
+ export declare function stablePrefixMessageHash(message: Message): string;
6
+ //# sourceMappingURL=route-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-identity.d.ts","sourceRoot":"","sources":["../src/route-identity.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAOnE,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAEzD;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAKhE"}
@@ -0,0 +1,100 @@
1
+ import { createHash } from "node:crypto";
2
+ import { stripSystemReminderText } from "./turns.js";
3
+ // Request messages are immutable snapshots. Weak keys retain no completed request.
4
+ // Route installation stores these digests, not the original megabytes of history.
5
+ const routeHashes = new WeakMap();
6
+ const stableHashes = new WeakMap();
7
+ /** Hash each incoming message once, then reuse it across route candidates/checks. */
8
+ export function routeMessageHash(message) {
9
+ return messageHash(message, false);
10
+ }
11
+ /** Stable prefixes span turns in which Claude can omit earlier thinking blocks. */
12
+ export function stablePrefixMessageHash(message) {
13
+ if (message.role !== "assistant" || !Array.isArray(message.content)) {
14
+ return routeMessageHash(message);
15
+ }
16
+ return messageHash(message, true);
17
+ }
18
+ function messageHash(message, stable) {
19
+ const cache = stable ? stableHashes : routeHashes;
20
+ const cached = cache.get(message);
21
+ if (cached !== undefined)
22
+ return cached;
23
+ let content = message.content;
24
+ if (stable && Array.isArray(content)) {
25
+ content = content.filter((part) => part?.type !== "thinking" && part?.type !== "redacted_thinking");
26
+ }
27
+ const blocks = typeof content === "string" ? [{ type: "text", text: content }] : content;
28
+ const normalized = { ...message, content: stripBlockCache(normalizeReminders(blocks)) };
29
+ const hash = createHash("sha256");
30
+ updateCanonical(hash, normalized);
31
+ const digest = hash.digest("hex");
32
+ cache.set(message, digest);
33
+ return digest;
34
+ }
35
+ /** Same transform for stored and incoming messages, including nested tool results. */
36
+ function normalizeReminders(content) {
37
+ if (typeof content === "string")
38
+ return stripSystemReminderText(content);
39
+ if (!Array.isArray(content))
40
+ return content;
41
+ return content.map((part) => {
42
+ if (typeof part === "string")
43
+ return stripSystemReminderText(part);
44
+ if (!part || typeof part !== "object")
45
+ return part;
46
+ if (part.type === "text" && typeof part.text === "string") {
47
+ return { ...part, text: stripSystemReminderText(part.text) };
48
+ }
49
+ if (part.type === "tool_result") {
50
+ return { ...part, content: normalizeReminders(part.content) };
51
+ }
52
+ return part;
53
+ });
54
+ }
55
+ /** Cache metadata on blocks is incidental; identically named tool input keys aren't. */
56
+ function stripBlockCache(content) {
57
+ if (Array.isArray(content))
58
+ return content.map(stripBlockCache);
59
+ if (!content || typeof content !== "object")
60
+ return content;
61
+ const { cache_control: _ignored, ...block } = content;
62
+ return block;
63
+ }
64
+ /**
65
+ * Typed, length-framed canonical encoding avoids serializing large strings twice.
66
+ * UTF-16 preserves lone surrogates too; UTF-8 would equate them with U+FFFD.
67
+ * This is a process-local identity digest, not a wire-format hash.
68
+ */
69
+ function updateCanonical(hash, value) {
70
+ if (value === null || value === undefined) {
71
+ hash.update("n");
72
+ }
73
+ else if (typeof value === "string") {
74
+ hash.update(`s${value.length}:`).update(value, "utf16le");
75
+ }
76
+ else if (typeof value === "number") {
77
+ hash.update(Number.isFinite(value) ? `d${String(value)};` : "n");
78
+ }
79
+ else if (typeof value === "boolean") {
80
+ hash.update(value ? "t" : "f");
81
+ }
82
+ else if (Array.isArray(value)) {
83
+ hash.update(`a${value.length}:`);
84
+ for (const item of value)
85
+ updateCanonical(hash, item);
86
+ }
87
+ else if (typeof value === "object") {
88
+ const object = value;
89
+ const keys = Object.keys(object).filter((key) => object[key] !== undefined).sort();
90
+ hash.update(`o${keys.length}:`);
91
+ for (const key of keys) {
92
+ updateCanonical(hash, key);
93
+ updateCanonical(hash, object[key]);
94
+ }
95
+ }
96
+ else {
97
+ throw new TypeError("Route identity requires JSON message data");
98
+ }
99
+ }
100
+ //# sourceMappingURL=route-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-identity.js","sourceRoot":"","sources":["../src/route-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { Message } from "./turns.js";
2
+ export interface ResponseUsage {
3
+ output_tokens: number;
4
+ thinking_tokens: number;
5
+ input_tokens?: number;
6
+ cache_read_input_tokens?: number;
7
+ cache_creation_input_tokens?: number;
8
+ }
9
+ /** Keyed by the assistant message's position in the list sent to MemTree. */
10
+ export type MessageUsage = Record<string, ResponseUsage>;
11
+ /** ISO 8601 time of each message the transcript knows, keyed like MessageUsage. */
12
+ export type MessageTimes = Record<string, string>;
13
+ export interface TranscriptUsageSource {
14
+ /** Usage for each assistant message in `messages` that the transcript knows. */
15
+ usageFor(sessionId: string, messages: Message[], agentId?: string): MessageUsage;
16
+ /**
17
+ * When Claude Code wrote each message in `messages` that the transcript
18
+ * knows; a subagent's (`agentId`) from its own transcript.
19
+ */
20
+ timesFor?(sessionId: string, messages: Message[], agentId?: string): MessageTimes;
21
+ /**
22
+ * The session's last assistant reply when it made no tool call (the answer
23
+ * a turn ended with), as a message; read to the transcript's end.
24
+ */
25
+ finalReply?(sessionId: string): Message | undefined;
26
+ finalReplyAsync?(sessionId: string, signal?: AbortSignal): Promise<Message | undefined>;
27
+ }
28
+ /**
29
+ * Reads transcripts incrementally: each session's file is opened once and
30
+ * only the bytes appended since the last call are parsed.
31
+ */
32
+ export declare class ClaudeTranscriptUsage implements TranscriptUsageSource {
33
+ private readonly projectsDir;
34
+ private readonly sessions;
35
+ constructor(projectsDir?: string);
36
+ usageFor(sessionId: string, messages: Message[], agentId?: string): MessageUsage;
37
+ /**
38
+ * Reads a session's transcript to its end now, off the request path. A
39
+ * lookup reads one bounded chunk, so without this the first requests after
40
+ * resuming a long session see only its oldest responses and undercount the
41
+ * thinking MemTree's budget check relies on. Best effort: never throws.
42
+ */
43
+ catchUp(sessionId: string): void;
44
+ timesFor(sessionId: string, messages: Message[], agentId?: string): MessageTimes;
45
+ finalReply(sessionId: string): Message | undefined;
46
+ finalReplyAsync(sessionId: string, signal?: AbortSignal): Promise<Message | undefined>;
47
+ private indexFor;
48
+ }
49
+ /** `$CLAUDE_CONFIG_DIR/projects`, else `~/.claude/projects`. */
50
+ export declare function defaultProjectsDir(env?: NodeJS.ProcessEnv): string;
51
+ /**
52
+ * The session's transcript in whichever project directory holds it, or with
53
+ * `agentId`, that subagent's. The id is accepted with or without its `agent-`
54
+ * file prefix.
55
+ */
56
+ export declare function findTranscript(projectsDir: string, sessionId: string, agentId?: string): string | undefined;
57
+ //# sourceMappingURL=transcript-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-usage.d.ts","sourceRoot":"","sources":["../src/transcript-usage.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAKzD,mFAAmF;AACnF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAYlD,MAAM,WAAW,qBAAqB;IACpC,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACjF;;;OAGG;IACH,QAAQ,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAClF;;;OAGG;IACH,UAAU,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,eAAe,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CACzF;AAED;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,qBAAqB;IAI/D,OAAO,CAAC,QAAQ,CAAC,WAAW;IAH9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;gBAG5C,WAAW,GAAE,MAA6B;IAG7D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IAWhF;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAchC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IAWhF,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAgB5C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAoB5F,OAAO,CAAC,QAAQ;CAYjB;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAG/E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB"}