@luckydraw/cumulus 0.27.40 → 0.28.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 (99) hide show
  1. package/dist/gateway/adapters/webchat.d.ts +5 -7
  2. package/dist/gateway/adapters/webchat.d.ts.map +1 -1
  3. package/dist/gateway/adapters/webchat.js +204 -57
  4. package/dist/gateway/adapters/webchat.js.map +1 -1
  5. package/dist/gateway/config.d.ts +48 -0
  6. package/dist/gateway/config.d.ts.map +1 -1
  7. package/dist/gateway/config.js +90 -0
  8. package/dist/gateway/config.js.map +1 -1
  9. package/dist/gateway/daemon.d.ts.map +1 -1
  10. package/dist/gateway/daemon.js +268 -27
  11. package/dist/gateway/daemon.js.map +1 -1
  12. package/dist/gateway/gateway-agents-mcp.js +570 -31
  13. package/dist/gateway/gateway-agents-mcp.js.map +1 -1
  14. package/dist/gateway/hooks.d.ts +101 -0
  15. package/dist/gateway/hooks.d.ts.map +1 -0
  16. package/dist/gateway/hooks.js +200 -0
  17. package/dist/gateway/hooks.js.map +1 -0
  18. package/dist/gateway/scheduler.d.ts +50 -0
  19. package/dist/gateway/scheduler.d.ts.map +1 -0
  20. package/dist/gateway/scheduler.js +263 -0
  21. package/dist/gateway/scheduler.js.map +1 -0
  22. package/dist/gateway/server.d.ts +16 -1
  23. package/dist/gateway/server.d.ts.map +1 -1
  24. package/dist/gateway/server.js +451 -22
  25. package/dist/gateway/server.js.map +1 -1
  26. package/dist/gateway/static/blex.min.js +74 -17
  27. package/dist/gateway/static/chat.html +1 -4
  28. package/dist/gateway/static/dashboard.html +151 -0
  29. package/dist/gateway/static/dashboard.js +229 -0
  30. package/dist/gateway/static/widget.js +656 -460
  31. package/dist/index.d.ts +13 -5
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +9 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/agentic-loop.d.ts +124 -0
  36. package/dist/lib/agentic-loop.d.ts.map +1 -0
  37. package/dist/lib/agentic-loop.js +338 -0
  38. package/dist/lib/agentic-loop.js.map +1 -0
  39. package/dist/lib/config.d.ts +28 -15
  40. package/dist/lib/config.d.ts.map +1 -1
  41. package/dist/lib/config.js +47 -41
  42. package/dist/lib/config.js.map +1 -1
  43. package/dist/lib/gateway.d.ts +34 -3
  44. package/dist/lib/gateway.d.ts.map +1 -1
  45. package/dist/lib/gateway.js +584 -37
  46. package/dist/lib/gateway.js.map +1 -1
  47. package/dist/lib/huggingface-provider.d.ts +26 -0
  48. package/dist/lib/huggingface-provider.d.ts.map +1 -0
  49. package/dist/lib/huggingface-provider.js +338 -0
  50. package/dist/lib/huggingface-provider.js.map +1 -0
  51. package/dist/lib/provider.d.ts +71 -0
  52. package/dist/lib/provider.d.ts.map +1 -0
  53. package/dist/lib/provider.js +90 -0
  54. package/dist/lib/provider.js.map +1 -0
  55. package/dist/lib/tools/ask-user-question.d.ts +14 -0
  56. package/dist/lib/tools/ask-user-question.d.ts.map +1 -0
  57. package/dist/lib/tools/ask-user-question.js +74 -0
  58. package/dist/lib/tools/ask-user-question.js.map +1 -0
  59. package/dist/lib/tools/bash.d.ts +6 -0
  60. package/dist/lib/tools/bash.d.ts.map +1 -0
  61. package/dist/lib/tools/bash.js +85 -0
  62. package/dist/lib/tools/bash.js.map +1 -0
  63. package/dist/lib/tools/edit.d.ts +6 -0
  64. package/dist/lib/tools/edit.d.ts.map +1 -0
  65. package/dist/lib/tools/edit.js +79 -0
  66. package/dist/lib/tools/edit.js.map +1 -0
  67. package/dist/lib/tools/glob.d.ts +6 -0
  68. package/dist/lib/tools/glob.d.ts.map +1 -0
  69. package/dist/lib/tools/glob.js +91 -0
  70. package/dist/lib/tools/glob.js.map +1 -0
  71. package/dist/lib/tools/grep.d.ts +6 -0
  72. package/dist/lib/tools/grep.d.ts.map +1 -0
  73. package/dist/lib/tools/grep.js +110 -0
  74. package/dist/lib/tools/grep.js.map +1 -0
  75. package/dist/lib/tools/index.d.ts +29 -0
  76. package/dist/lib/tools/index.d.ts.map +1 -0
  77. package/dist/lib/tools/index.js +52 -0
  78. package/dist/lib/tools/index.js.map +1 -0
  79. package/dist/lib/tools/read.d.ts +6 -0
  80. package/dist/lib/tools/read.d.ts.map +1 -0
  81. package/dist/lib/tools/read.js +80 -0
  82. package/dist/lib/tools/read.js.map +1 -0
  83. package/dist/lib/tools/tool-search.d.ts +30 -0
  84. package/dist/lib/tools/tool-search.d.ts.map +1 -0
  85. package/dist/lib/tools/tool-search.js +108 -0
  86. package/dist/lib/tools/tool-search.js.map +1 -0
  87. package/dist/lib/tools/web-fetch.d.ts +9 -0
  88. package/dist/lib/tools/web-fetch.d.ts.map +1 -0
  89. package/dist/lib/tools/web-fetch.js +114 -0
  90. package/dist/lib/tools/web-fetch.js.map +1 -0
  91. package/dist/lib/tools/web-search.d.ts +12 -0
  92. package/dist/lib/tools/web-search.d.ts.map +1 -0
  93. package/dist/lib/tools/web-search.js +89 -0
  94. package/dist/lib/tools/web-search.js.map +1 -0
  95. package/dist/lib/tools/write.d.ts +6 -0
  96. package/dist/lib/tools/write.d.ts.map +1 -0
  97. package/dist/lib/tools/write.js +44 -0
  98. package/dist/lib/tools/write.js.map +1 -0
  99. package/package.json +3 -2
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Scheduler engine — manages per-thread scheduled triggers.
3
+ *
4
+ * Schedules are stored in thread config files ({thread}.config.json).
5
+ * The scheduler scans all configs on startup, builds an in-memory timer map,
6
+ * and fires triggers by injecting messages into threads.
7
+ *
8
+ * Supports:
9
+ * - `once` triggers: fire at a specific datetime, then auto-remove
10
+ * - `cron` triggers: fire on a cron schedule, persist until cancelled
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as os from 'os';
14
+ import * as path from 'path';
15
+ import { loadThreadConfig, saveThreadConfig } from '../lib/config.js';
16
+ import { sendMessage } from '../lib/gateway.js';
17
+ const THREADS_DIR = path.join(os.homedir(), '.cumulus', 'threads');
18
+ /**
19
+ * Parse a cron expression and check if it matches the current minute.
20
+ * Supports: minute hour day-of-month month day-of-week
21
+ * Each field supports: number, *, and step (star/N).
22
+ */
23
+ export function cronMatchesNow(cron, now = new Date()) {
24
+ const parts = cron.trim().split(/\s+/);
25
+ if (parts.length !== 5)
26
+ return false;
27
+ const fields = [
28
+ now.getMinutes(),
29
+ now.getHours(),
30
+ now.getDate(),
31
+ now.getMonth() + 1,
32
+ now.getDay(),
33
+ ];
34
+ for (let i = 0; i < 5; i++) {
35
+ if (!fieldMatches(parts[i], fields[i]))
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ function fieldMatches(pattern, value) {
41
+ if (pattern === '*')
42
+ return true;
43
+ // Handle */N step
44
+ if (pattern.startsWith('*/')) {
45
+ const step = parseInt(pattern.slice(2), 10);
46
+ return !isNaN(step) && step > 0 && value % step === 0;
47
+ }
48
+ // Handle comma-separated values
49
+ if (pattern.includes(',')) {
50
+ return pattern.split(',').some(p => fieldMatches(p.trim(), value));
51
+ }
52
+ // Handle range (e.g., 1-5)
53
+ if (pattern.includes('-')) {
54
+ const [lo, hi] = pattern.split('-').map(Number);
55
+ return !isNaN(lo) && !isNaN(hi) && value >= lo && value <= hi;
56
+ }
57
+ // Plain number
58
+ const num = parseInt(pattern, 10);
59
+ return !isNaN(num) && num === value;
60
+ }
61
+ /**
62
+ * Create and start the scheduler engine.
63
+ * Scans all thread configs for schedules, sets up timers, and starts a
64
+ * 60-second interval for cron evaluation.
65
+ */
66
+ export function createScheduler(opts) {
67
+ const log = opts.log ?? ((msg) => console.log(`[Scheduler] ${msg}`));
68
+ const threadTimers = new Map();
69
+ let cronInterval = null;
70
+ let stopped = false;
71
+ // ─── Fire a trigger ──────────────────────────────────────
72
+ async function fireTrigger(threadName, schedule) {
73
+ log(`Firing trigger "${schedule.id}" on thread "${threadName}"`, {
74
+ trigger: schedule.trigger,
75
+ message: schedule.message.slice(0, 100),
76
+ });
77
+ try {
78
+ await sendMessage({
79
+ threadName,
80
+ message: `[Scheduled trigger: ${schedule.id}] ${schedule.message}`,
81
+ ...opts.pipelineOpts,
82
+ });
83
+ }
84
+ catch (err) {
85
+ log(`Failed to fire trigger "${schedule.id}" on "${threadName}": ${err}`);
86
+ }
87
+ // Auto-remove 'once' triggers after firing
88
+ if (schedule.trigger === 'once') {
89
+ try {
90
+ const config = await loadThreadConfig(threadName);
91
+ if (config.schedules) {
92
+ config.schedules = config.schedules.filter((s) => s.id !== schedule.id);
93
+ await saveThreadConfig(threadName, { schedules: config.schedules });
94
+ log(`Removed one-shot schedule "${schedule.id}" from "${threadName}"`);
95
+ }
96
+ }
97
+ catch (err) {
98
+ log(`Failed to clean up one-shot schedule: ${err}`);
99
+ }
100
+ }
101
+ }
102
+ // ─── Set up timers for a thread ──────────────────────────
103
+ function setupThread(threadName, schedules) {
104
+ // Clear existing timers for this thread
105
+ clearThread(threadName);
106
+ const entry = { timers: new Map() };
107
+ for (const schedule of schedules) {
108
+ if (schedule.trigger === 'once' && schedule.at) {
109
+ const fireAt = new Date(schedule.at).getTime();
110
+ const delay = fireAt - Date.now();
111
+ if (delay <= 0) {
112
+ // Already past — fire immediately
113
+ fireTrigger(threadName, schedule);
114
+ }
115
+ else {
116
+ const timer = setTimeout(() => {
117
+ fireTrigger(threadName, schedule);
118
+ entry.timers.delete(schedule.id);
119
+ }, delay);
120
+ timer.unref(); // Don't prevent process exit
121
+ entry.timers.set(schedule.id, timer);
122
+ }
123
+ }
124
+ // Cron triggers are handled by the interval checker
125
+ }
126
+ threadTimers.set(threadName, entry);
127
+ }
128
+ function clearThread(threadName) {
129
+ const entry = threadTimers.get(threadName);
130
+ if (entry) {
131
+ for (const timer of entry.timers.values()) {
132
+ clearTimeout(timer);
133
+ }
134
+ threadTimers.delete(threadName);
135
+ }
136
+ }
137
+ // ─── Cron tick — runs every 60 seconds ───────────────────
138
+ async function cronTick() {
139
+ if (stopped)
140
+ return;
141
+ const now = new Date();
142
+ let configFiles;
143
+ try {
144
+ configFiles = fs.readdirSync(THREADS_DIR).filter(f => f.endsWith('.config.json'));
145
+ }
146
+ catch {
147
+ return;
148
+ }
149
+ for (const file of configFiles) {
150
+ const threadName = file.replace('.config.json', '');
151
+ try {
152
+ const config = await loadThreadConfig(threadName);
153
+ if (!config.schedules)
154
+ continue;
155
+ for (const schedule of config.schedules) {
156
+ if (schedule.trigger !== 'cron' || !schedule.cron)
157
+ continue;
158
+ if (cronMatchesNow(schedule.cron, now)) {
159
+ // Don't fire if we already fired this minute
160
+ if (schedule.lastFired) {
161
+ const lastFired = new Date(schedule.lastFired);
162
+ if (lastFired.getMinutes() === now.getMinutes() &&
163
+ lastFired.getHours() === now.getHours() &&
164
+ lastFired.getDate() === now.getDate()) {
165
+ continue; // Already fired this minute
166
+ }
167
+ }
168
+ // Update lastFired before firing (to prevent double-fire)
169
+ schedule.lastFired = now.toISOString();
170
+ await saveThreadConfig(threadName, { schedules: config.schedules });
171
+ fireTrigger(threadName, schedule);
172
+ }
173
+ }
174
+ }
175
+ catch (err) {
176
+ log(`Error checking cron for "${threadName}": ${err}`);
177
+ }
178
+ }
179
+ }
180
+ // ─── Initial scan ────────────────────────────────────────
181
+ async function scanAll() {
182
+ let configFiles;
183
+ try {
184
+ configFiles = fs.readdirSync(THREADS_DIR).filter(f => f.endsWith('.config.json'));
185
+ }
186
+ catch {
187
+ return;
188
+ }
189
+ let scheduleCount = 0;
190
+ for (const file of configFiles) {
191
+ const threadName = file.replace('.config.json', '');
192
+ try {
193
+ const config = await loadThreadConfig(threadName);
194
+ if (config.schedules && config.schedules.length > 0) {
195
+ setupThread(threadName, config.schedules);
196
+ scheduleCount += config.schedules.length;
197
+ }
198
+ }
199
+ catch (err) {
200
+ log(`Error loading config for "${threadName}": ${err}`);
201
+ }
202
+ }
203
+ if (scheduleCount > 0) {
204
+ log(`Loaded ${scheduleCount} schedule(s) from thread configs`);
205
+ }
206
+ }
207
+ // ─── Start ───────────────────────────────────────────────
208
+ scanAll();
209
+ cronInterval = setInterval(cronTick, 60_000);
210
+ cronInterval.unref();
211
+ return {
212
+ stop() {
213
+ stopped = true;
214
+ if (cronInterval) {
215
+ clearInterval(cronInterval);
216
+ cronInterval = null;
217
+ }
218
+ for (const [, entry] of threadTimers) {
219
+ for (const timer of entry.timers.values()) {
220
+ clearTimeout(timer);
221
+ }
222
+ }
223
+ threadTimers.clear();
224
+ },
225
+ reloadThread(threadName) {
226
+ loadThreadConfig(threadName).then(config => {
227
+ if (config.schedules && config.schedules.length > 0) {
228
+ setupThread(threadName, config.schedules);
229
+ }
230
+ else {
231
+ clearThread(threadName);
232
+ }
233
+ });
234
+ },
235
+ getAll() {
236
+ const result = [];
237
+ // Scan all configs synchronously for listing
238
+ try {
239
+ const configFiles = fs.readdirSync(THREADS_DIR).filter(f => f.endsWith('.config.json'));
240
+ for (const file of configFiles) {
241
+ const threadName = file.replace('.config.json', '');
242
+ try {
243
+ const content = fs.readFileSync(path.join(THREADS_DIR, file), 'utf-8');
244
+ const config = JSON.parse(content);
245
+ if (config.schedules) {
246
+ for (const s of config.schedules) {
247
+ result.push({ threadName, schedule: s });
248
+ }
249
+ }
250
+ }
251
+ catch {
252
+ // Skip invalid configs
253
+ }
254
+ }
255
+ }
256
+ catch {
257
+ // threads dir doesn't exist
258
+ }
259
+ return result;
260
+ },
261
+ };
262
+ }
263
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/gateway/scheduler.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,13 @@
10
10
  * GET /api/threads — list all threads
11
11
  * DELETE /api/thread/:name — delete thread (requires X-Confirm: delete)
12
12
  * POST /api/migrate — sync thread + clone repo + set projectDir
13
+ * POST /api/media/upload — upload file to media directory (returns URL)
14
+ * GET /media/* — serve uploaded media files (no auth)
13
15
  * GET /health — health check (no auth)
14
16
  */
15
17
  import { ExecutorRegistry } from '../lib/executor.js';
16
18
  import { type McpServerEntry, type GatewayAgentsConfig } from '../lib/gateway.js';
19
+ import type { HooksConfig } from './config.js';
17
20
  import { type VapidConfig } from './push.js';
18
21
  export interface GatewayServerOptions {
19
22
  basePath?: string;
@@ -33,6 +36,14 @@ export interface GatewayServerOptions {
33
36
  broadcastToThread?: (threadName: string, event: Record<string, unknown>) => void;
34
37
  /** VAPID config for web push notifications */
35
38
  vapid?: VapidConfig;
39
+ /** Inbound webhook configurations */
40
+ hooks?: HooksConfig;
41
+ /** HuggingFace API key for non-Claude models */
42
+ hfApiKey?: string;
43
+ /** Available models for GET /api/models endpoint */
44
+ models?: import('./config.js').ModelEntry[];
45
+ /** Global default model (from gateway config) */
46
+ model?: string;
36
47
  }
37
48
  export interface GatewayServerHandle {
38
49
  port: number;
@@ -46,6 +57,10 @@ export interface GatewayServerHandle {
46
57
  executorRegistry: ExecutorRegistry;
47
58
  /** Set broadcast function — routes agent inject notifications to WebSocket clients */
48
59
  setBroadcastToThread: (fn: (threadName: string, event: Record<string, unknown>) => void) => void;
60
+ /** Set scheduler reference — used by schedule REST endpoints to reload timers */
61
+ setScheduler: (s: {
62
+ reloadThread: (name: string) => void;
63
+ }) => void;
49
64
  }
50
65
  /**
51
66
  * Format an agent message for a specific recipient, applying visibility rules.
@@ -63,7 +78,7 @@ export declare function formatAgentMessageForRecipient(messageText: string, send
63
78
  hidden: string[];
64
79
  };
65
80
  }): string;
66
- /** Override the threads directory (used by startGatewayServer when basePath is set) */
81
+ /** Override the threads directory (used by tests to isolate from production) */
67
82
  export declare function setThreadsDir(dir: string): void;
68
83
  export declare function startGatewayServer(options: GatewayServerOptions): Promise<GatewayServerHandle>;
69
84
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,OAAO,EAAE,gBAAgB,EAAgC,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,WAAW,CAAC;AAInB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,8CAA8C;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,4CAA4C;IAC5C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,sFAAsF;IACtF,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;CAClG;AAoSD;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GACpF,MAAM,CA2DR;AAkHD,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AA6tBD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAwQ9B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAaH,OAAO,EAAE,gBAAgB,EAAgC,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,WAAW,CAAC;AAInB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,8CAA8C;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,qCAAqC;IACrC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5C,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,4CAA4C;IAC5C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,sFAAsF;IACtF,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;IACjG,iFAAiF;IACjF,YAAY,EAAE,CAAC,CAAC,EAAE;QAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE;AAwXD;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GACpF,MAAM,CA2DR;AA8HD,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AA2jCD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA6U9B"}