@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.
- package/dist/gateway/adapters/webchat.d.ts +5 -7
- package/dist/gateway/adapters/webchat.d.ts.map +1 -1
- package/dist/gateway/adapters/webchat.js +204 -57
- package/dist/gateway/adapters/webchat.js.map +1 -1
- package/dist/gateway/config.d.ts +48 -0
- package/dist/gateway/config.d.ts.map +1 -1
- package/dist/gateway/config.js +90 -0
- package/dist/gateway/config.js.map +1 -1
- package/dist/gateway/daemon.d.ts.map +1 -1
- package/dist/gateway/daemon.js +268 -27
- package/dist/gateway/daemon.js.map +1 -1
- package/dist/gateway/gateway-agents-mcp.js +570 -31
- package/dist/gateway/gateway-agents-mcp.js.map +1 -1
- package/dist/gateway/hooks.d.ts +101 -0
- package/dist/gateway/hooks.d.ts.map +1 -0
- package/dist/gateway/hooks.js +200 -0
- package/dist/gateway/hooks.js.map +1 -0
- package/dist/gateway/scheduler.d.ts +50 -0
- package/dist/gateway/scheduler.d.ts.map +1 -0
- package/dist/gateway/scheduler.js +263 -0
- package/dist/gateway/scheduler.js.map +1 -0
- package/dist/gateway/server.d.ts +16 -1
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +451 -22
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/static/blex.min.js +74 -17
- package/dist/gateway/static/chat.html +1 -4
- package/dist/gateway/static/dashboard.html +151 -0
- package/dist/gateway/static/dashboard.js +229 -0
- package/dist/gateway/static/widget.js +656 -460
- package/dist/index.d.ts +13 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agentic-loop.d.ts +124 -0
- package/dist/lib/agentic-loop.d.ts.map +1 -0
- package/dist/lib/agentic-loop.js +338 -0
- package/dist/lib/agentic-loop.js.map +1 -0
- package/dist/lib/config.d.ts +28 -15
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +47 -41
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/gateway.d.ts +34 -3
- package/dist/lib/gateway.d.ts.map +1 -1
- package/dist/lib/gateway.js +584 -37
- package/dist/lib/gateway.js.map +1 -1
- package/dist/lib/huggingface-provider.d.ts +26 -0
- package/dist/lib/huggingface-provider.d.ts.map +1 -0
- package/dist/lib/huggingface-provider.js +338 -0
- package/dist/lib/huggingface-provider.js.map +1 -0
- package/dist/lib/provider.d.ts +71 -0
- package/dist/lib/provider.d.ts.map +1 -0
- package/dist/lib/provider.js +90 -0
- package/dist/lib/provider.js.map +1 -0
- package/dist/lib/tools/ask-user-question.d.ts +14 -0
- package/dist/lib/tools/ask-user-question.d.ts.map +1 -0
- package/dist/lib/tools/ask-user-question.js +74 -0
- package/dist/lib/tools/ask-user-question.js.map +1 -0
- package/dist/lib/tools/bash.d.ts +6 -0
- package/dist/lib/tools/bash.d.ts.map +1 -0
- package/dist/lib/tools/bash.js +85 -0
- package/dist/lib/tools/bash.js.map +1 -0
- package/dist/lib/tools/edit.d.ts +6 -0
- package/dist/lib/tools/edit.d.ts.map +1 -0
- package/dist/lib/tools/edit.js +79 -0
- package/dist/lib/tools/edit.js.map +1 -0
- package/dist/lib/tools/glob.d.ts +6 -0
- package/dist/lib/tools/glob.d.ts.map +1 -0
- package/dist/lib/tools/glob.js +91 -0
- package/dist/lib/tools/glob.js.map +1 -0
- package/dist/lib/tools/grep.d.ts +6 -0
- package/dist/lib/tools/grep.d.ts.map +1 -0
- package/dist/lib/tools/grep.js +110 -0
- package/dist/lib/tools/grep.js.map +1 -0
- package/dist/lib/tools/index.d.ts +29 -0
- package/dist/lib/tools/index.d.ts.map +1 -0
- package/dist/lib/tools/index.js +52 -0
- package/dist/lib/tools/index.js.map +1 -0
- package/dist/lib/tools/read.d.ts +6 -0
- package/dist/lib/tools/read.d.ts.map +1 -0
- package/dist/lib/tools/read.js +80 -0
- package/dist/lib/tools/read.js.map +1 -0
- package/dist/lib/tools/tool-search.d.ts +30 -0
- package/dist/lib/tools/tool-search.d.ts.map +1 -0
- package/dist/lib/tools/tool-search.js +108 -0
- package/dist/lib/tools/tool-search.js.map +1 -0
- package/dist/lib/tools/web-fetch.d.ts +9 -0
- package/dist/lib/tools/web-fetch.d.ts.map +1 -0
- package/dist/lib/tools/web-fetch.js +114 -0
- package/dist/lib/tools/web-fetch.js.map +1 -0
- package/dist/lib/tools/web-search.d.ts +12 -0
- package/dist/lib/tools/web-search.d.ts.map +1 -0
- package/dist/lib/tools/web-search.js +89 -0
- package/dist/lib/tools/web-search.js.map +1 -0
- package/dist/lib/tools/write.d.ts +6 -0
- package/dist/lib/tools/write.d.ts.map +1 -0
- package/dist/lib/tools/write.js +44 -0
- package/dist/lib/tools/write.js.map +1 -0
- 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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"}
|
package/dist/gateway/server.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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"}
|