qnce-engine 0.1.0 → 1.2.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/README.md +248 -0
- package/dist/cli/audit.js +6 -4
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/init.js +11 -9
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/perf.d.ts +30 -0
- package/dist/cli/perf.d.ts.map +1 -0
- package/dist/cli/perf.js +219 -0
- package/dist/cli/perf.js.map +1 -0
- package/dist/engine/core.d.ts +104 -8
- package/dist/engine/core.d.ts.map +1 -1
- package/dist/engine/core.js +288 -7
- package/dist/engine/core.js.map +1 -1
- package/dist/engine/demo-story.js +4 -1
- package/dist/engine/demo-story.js.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/narrative/branching/engine-simple.d.ts +84 -0
- package/dist/narrative/branching/engine-simple.d.ts.map +1 -0
- package/dist/narrative/branching/engine-simple.js +349 -0
- package/dist/narrative/branching/engine-simple.js.map +1 -0
- package/dist/narrative/branching/index.d.ts +12 -0
- package/dist/narrative/branching/index.d.ts.map +1 -0
- package/dist/narrative/branching/index.js +56 -0
- package/dist/narrative/branching/index.js.map +1 -0
- package/dist/narrative/branching/models.d.ts +223 -0
- package/dist/narrative/branching/models.d.ts.map +1 -0
- package/dist/narrative/branching/models.js +6 -0
- package/dist/narrative/branching/models.js.map +1 -0
- package/dist/performance/HotReloadDelta.d.ts +107 -0
- package/dist/performance/HotReloadDelta.d.ts.map +1 -0
- package/dist/performance/HotReloadDelta.js +333 -0
- package/dist/performance/HotReloadDelta.js.map +1 -0
- package/dist/performance/ObjectPool.d.ts +150 -0
- package/dist/performance/ObjectPool.d.ts.map +1 -0
- package/dist/performance/ObjectPool.js +297 -0
- package/dist/performance/ObjectPool.js.map +1 -0
- package/dist/performance/PerfReporter.d.ts +123 -0
- package/dist/performance/PerfReporter.d.ts.map +1 -0
- package/dist/performance/PerfReporter.js +281 -0
- package/dist/performance/PerfReporter.js.map +1 -0
- package/dist/performance/ThreadPool.d.ts +107 -0
- package/dist/performance/ThreadPool.d.ts.map +1 -0
- package/dist/performance/ThreadPool.js +348 -0
- package/dist/performance/ThreadPool.js.map +1 -0
- package/docs/PERFORMANCE.md +355 -0
- package/docs/branching/ERD.md +214 -0
- package/docs/branching/PDM.md +443 -0
- package/docs/branching/RELEASE-v1.2.0.md +169 -0
- package/examples/branching-advanced-demo.ts +339 -0
- package/examples/branching-quickstart.ts +314 -0
- package/examples/quickstart-demo.js +82 -0
- package/package.json +21 -8
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// S2-T4: Profiler Event Instrumentation
|
|
3
|
+
// PerfReporter for batched performance event collection and reporting
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.perf = exports.PerfReporter = void 0;
|
|
6
|
+
exports.getPerfReporter = getPerfReporter;
|
|
7
|
+
exports.shutdownPerfReporter = shutdownPerfReporter;
|
|
8
|
+
/**
|
|
9
|
+
* PerfReporter - Batched performance event collection and analysis
|
|
10
|
+
* Designed to work off main thread for minimal performance impact
|
|
11
|
+
*/
|
|
12
|
+
class PerfReporter {
|
|
13
|
+
events = [];
|
|
14
|
+
config;
|
|
15
|
+
flushTimer = null;
|
|
16
|
+
startTime;
|
|
17
|
+
activeSpans = new Map();
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
this.config = {
|
|
20
|
+
batchSize: config.batchSize || 100,
|
|
21
|
+
flushInterval: config.flushInterval || 5000, // 5 seconds
|
|
22
|
+
enableBackgroundFlush: config.enableBackgroundFlush !== false,
|
|
23
|
+
maxEventHistory: config.maxEventHistory || 1000,
|
|
24
|
+
enableConsoleOutput: config.enableConsoleOutput || false
|
|
25
|
+
};
|
|
26
|
+
this.startTime = performance.now();
|
|
27
|
+
if (this.config.enableBackgroundFlush) {
|
|
28
|
+
this.startFlushTimer();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Record a performance event
|
|
33
|
+
*/
|
|
34
|
+
record(type, metadata = {}, category = 'engine') {
|
|
35
|
+
const event = {
|
|
36
|
+
id: this.generateEventId(),
|
|
37
|
+
type,
|
|
38
|
+
timestamp: performance.now(),
|
|
39
|
+
metadata,
|
|
40
|
+
category
|
|
41
|
+
};
|
|
42
|
+
this.events.push(event);
|
|
43
|
+
if (this.config.enableConsoleOutput) {
|
|
44
|
+
console.log(`[PERF] ${type}:`, metadata);
|
|
45
|
+
}
|
|
46
|
+
// Auto-flush if batch size reached
|
|
47
|
+
if (this.events.length >= this.config.batchSize) {
|
|
48
|
+
this.flush();
|
|
49
|
+
}
|
|
50
|
+
return event.id;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Start a performance span (for measuring duration)
|
|
54
|
+
*/
|
|
55
|
+
startSpan(type, metadata = {}, category = 'engine') {
|
|
56
|
+
const spanId = this.generateEventId();
|
|
57
|
+
const event = {
|
|
58
|
+
id: spanId,
|
|
59
|
+
type,
|
|
60
|
+
timestamp: performance.now(),
|
|
61
|
+
metadata: { ...metadata, spanStart: true },
|
|
62
|
+
category
|
|
63
|
+
};
|
|
64
|
+
this.activeSpans.set(spanId, event);
|
|
65
|
+
return spanId;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* End a performance span and record the complete event
|
|
69
|
+
*/
|
|
70
|
+
endSpan(spanId, additionalMetadata = {}) {
|
|
71
|
+
const startEvent = this.activeSpans.get(spanId);
|
|
72
|
+
if (!startEvent) {
|
|
73
|
+
console.warn(`[PERF] Span ${spanId} not found`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const endTime = performance.now();
|
|
77
|
+
const duration = endTime - startEvent.timestamp;
|
|
78
|
+
const completeEvent = {
|
|
79
|
+
...startEvent,
|
|
80
|
+
duration,
|
|
81
|
+
metadata: {
|
|
82
|
+
...startEvent.metadata,
|
|
83
|
+
...additionalMetadata,
|
|
84
|
+
spanEnd: true
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
this.events.push(completeEvent);
|
|
88
|
+
this.activeSpans.delete(spanId);
|
|
89
|
+
if (this.config.enableConsoleOutput) {
|
|
90
|
+
console.log(`[PERF] ${startEvent.type} completed in ${duration.toFixed(2)}ms`);
|
|
91
|
+
}
|
|
92
|
+
// Auto-flush if batch size reached
|
|
93
|
+
if (this.events.length >= this.config.batchSize) {
|
|
94
|
+
this.flush();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Record flow start event (S2-T4 requirement)
|
|
99
|
+
*/
|
|
100
|
+
recordFlowStart(nodeId, metadata = {}) {
|
|
101
|
+
return this.startSpan('flow-start', { nodeId, ...metadata }, 'engine');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Record flow completion event (S2-T4 requirement)
|
|
105
|
+
*/
|
|
106
|
+
recordFlowComplete(spanId, nextNodeId, metadata = {}) {
|
|
107
|
+
this.endSpan(spanId, { nextNodeId, ...metadata });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Record cache hit event (S2-T4 requirement)
|
|
111
|
+
*/
|
|
112
|
+
recordCacheHit(cacheKey, metadata = {}) {
|
|
113
|
+
return this.record('cache-hit', { cacheKey, ...metadata }, 'cache');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Record cache miss event (S2-T4 requirement)
|
|
117
|
+
*/
|
|
118
|
+
recordCacheMiss(cacheKey, metadata = {}) {
|
|
119
|
+
return this.record('cache-miss', { cacheKey, ...metadata }, 'cache');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Record hot-reload start event (S2-T4 requirement)
|
|
123
|
+
*/
|
|
124
|
+
recordHotReloadStart(deltaSize, metadata = {}) {
|
|
125
|
+
return this.startSpan('hot-reload-start', { deltaSize, ...metadata }, 'hot-reload');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Record hot-reload completion event (S2-T4 requirement)
|
|
129
|
+
*/
|
|
130
|
+
recordHotReloadEnd(spanId, success, metadata = {}) {
|
|
131
|
+
this.endSpan(spanId, { success, ...metadata });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate performance summary for CLI dashboard
|
|
135
|
+
*/
|
|
136
|
+
summary() {
|
|
137
|
+
const now = performance.now();
|
|
138
|
+
const eventsByType = {};
|
|
139
|
+
const durationsByType = {};
|
|
140
|
+
let cacheHits = 0;
|
|
141
|
+
let cacheMisses = 0;
|
|
142
|
+
let hotReloads = [];
|
|
143
|
+
// Analyze events
|
|
144
|
+
for (const event of this.events) {
|
|
145
|
+
// Count events by type
|
|
146
|
+
eventsByType[event.type] = (eventsByType[event.type] || 0) + 1;
|
|
147
|
+
// Collect durations
|
|
148
|
+
if (event.duration !== undefined) {
|
|
149
|
+
if (!durationsByType[event.type]) {
|
|
150
|
+
durationsByType[event.type] = [];
|
|
151
|
+
}
|
|
152
|
+
durationsByType[event.type].push(event.duration);
|
|
153
|
+
}
|
|
154
|
+
// Cache metrics
|
|
155
|
+
if (event.type === 'cache-hit')
|
|
156
|
+
cacheHits++;
|
|
157
|
+
if (event.type === 'cache-miss')
|
|
158
|
+
cacheMisses++;
|
|
159
|
+
// Hot-reload metrics
|
|
160
|
+
if (event.type === 'hot-reload-start' && event.duration !== undefined) {
|
|
161
|
+
hotReloads.push(event.duration);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Calculate averages, mins, maxs
|
|
165
|
+
const avgDurations = {};
|
|
166
|
+
const maxDurations = {};
|
|
167
|
+
const minDurations = {};
|
|
168
|
+
for (const [type, durations] of Object.entries(durationsByType)) {
|
|
169
|
+
if (durations.length > 0) {
|
|
170
|
+
avgDurations[type] = durations.reduce((sum, d) => sum + d, 0) / durations.length;
|
|
171
|
+
maxDurations[type] = Math.max(...durations);
|
|
172
|
+
minDurations[type] = Math.min(...durations);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Cache hit rate
|
|
176
|
+
const totalCacheEvents = cacheHits + cacheMisses;
|
|
177
|
+
const cacheHitRate = totalCacheEvents > 0 ? (cacheHits / totalCacheEvents) * 100 : 0;
|
|
178
|
+
// Hot-reload performance
|
|
179
|
+
const hotReloadPerformance = {
|
|
180
|
+
avgTime: hotReloads.length > 0 ? hotReloads.reduce((sum, d) => sum + d, 0) / hotReloads.length : 0,
|
|
181
|
+
maxTime: hotReloads.length > 0 ? Math.max(...hotReloads) : 0,
|
|
182
|
+
totalReloads: hotReloads.length
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
totalEvents: this.events.length,
|
|
186
|
+
eventsByType,
|
|
187
|
+
avgDurations,
|
|
188
|
+
maxDurations,
|
|
189
|
+
minDurations,
|
|
190
|
+
cacheHitRate,
|
|
191
|
+
hotReloadPerformance,
|
|
192
|
+
timeRange: {
|
|
193
|
+
start: this.startTime,
|
|
194
|
+
end: now,
|
|
195
|
+
duration: now - this.startTime
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get raw events for detailed analysis
|
|
201
|
+
*/
|
|
202
|
+
getEvents() {
|
|
203
|
+
return [...this.events];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clear event history
|
|
207
|
+
*/
|
|
208
|
+
clear() {
|
|
209
|
+
this.events.length = 0;
|
|
210
|
+
this.activeSpans.clear();
|
|
211
|
+
this.startTime = performance.now();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Flush events to background processing
|
|
215
|
+
*/
|
|
216
|
+
flush() {
|
|
217
|
+
if (this.events.length === 0)
|
|
218
|
+
return;
|
|
219
|
+
// TODO: Body - integrate with ThreadPool for background processing
|
|
220
|
+
// For now, just maintain event history with size limit
|
|
221
|
+
if (this.events.length > this.config.maxEventHistory) {
|
|
222
|
+
const excess = this.events.length - this.config.maxEventHistory;
|
|
223
|
+
this.events.splice(0, excess);
|
|
224
|
+
}
|
|
225
|
+
if (this.config.enableConsoleOutput) {
|
|
226
|
+
console.log(`[PERF] Flushed ${this.events.length} events`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Start automatic flush timer
|
|
231
|
+
*/
|
|
232
|
+
startFlushTimer() {
|
|
233
|
+
this.flushTimer = setInterval(() => {
|
|
234
|
+
this.flush();
|
|
235
|
+
}, this.config.flushInterval);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Stop automatic flush timer
|
|
239
|
+
*/
|
|
240
|
+
stopFlushTimer() {
|
|
241
|
+
if (this.flushTimer) {
|
|
242
|
+
clearInterval(this.flushTimer);
|
|
243
|
+
this.flushTimer = null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Generate unique event ID
|
|
248
|
+
*/
|
|
249
|
+
generateEventId() {
|
|
250
|
+
return `perf-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.PerfReporter = PerfReporter;
|
|
254
|
+
// Singleton instance for global access
|
|
255
|
+
let globalPerfReporter = null;
|
|
256
|
+
function getPerfReporter(config) {
|
|
257
|
+
if (!globalPerfReporter) {
|
|
258
|
+
globalPerfReporter = new PerfReporter(config);
|
|
259
|
+
}
|
|
260
|
+
return globalPerfReporter;
|
|
261
|
+
}
|
|
262
|
+
function shutdownPerfReporter() {
|
|
263
|
+
if (globalPerfReporter) {
|
|
264
|
+
globalPerfReporter.stopFlushTimer();
|
|
265
|
+
globalPerfReporter.flush();
|
|
266
|
+
globalPerfReporter = null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Convenience functions for common operations
|
|
270
|
+
exports.perf = {
|
|
271
|
+
flowStart: (nodeId, metadata) => getPerfReporter().recordFlowStart(nodeId, metadata),
|
|
272
|
+
flowComplete: (spanId, nextNodeId, metadata) => getPerfReporter().recordFlowComplete(spanId, nextNodeId, metadata),
|
|
273
|
+
cacheHit: (cacheKey, metadata) => getPerfReporter().recordCacheHit(cacheKey, metadata),
|
|
274
|
+
cacheMiss: (cacheKey, metadata) => getPerfReporter().recordCacheMiss(cacheKey, metadata),
|
|
275
|
+
hotReloadStart: (deltaSize, metadata) => getPerfReporter().recordHotReloadStart(deltaSize, metadata),
|
|
276
|
+
hotReloadEnd: (spanId, success, metadata) => getPerfReporter().recordHotReloadEnd(spanId, success, metadata),
|
|
277
|
+
record: (type, metadata, category) => getPerfReporter().record(type, metadata, category),
|
|
278
|
+
summary: () => getPerfReporter().summary(),
|
|
279
|
+
clear: () => getPerfReporter().clear()
|
|
280
|
+
};
|
|
281
|
+
//# sourceMappingURL=PerfReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerfReporter.js","sourceRoot":"","sources":["../../src/performance/PerfReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export interface QnceJob {
|
|
2
|
+
id: string;
|
|
3
|
+
type: 'cache-load' | 'telemetry-write' | 'hot-reload-prep' | 'asset-process';
|
|
4
|
+
priority: 'low' | 'normal' | 'high';
|
|
5
|
+
payload: unknown;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
resolve: (result: unknown) => void;
|
|
8
|
+
reject: (error: Error) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface ThreadPoolConfig {
|
|
11
|
+
maxWorkers: number;
|
|
12
|
+
queueLimit: number;
|
|
13
|
+
idleTimeout: number;
|
|
14
|
+
enableProfiling: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ThreadPoolStats {
|
|
17
|
+
activeWorkers: number;
|
|
18
|
+
queuedJobs: number;
|
|
19
|
+
completedJobs: number;
|
|
20
|
+
failedJobs: number;
|
|
21
|
+
avgExecutionTime: number;
|
|
22
|
+
workerUtilization: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* QnceThreadPool - Background job processing for QNCE engine
|
|
26
|
+
* Handles cache operations, telemetry, and other non-blocking tasks
|
|
27
|
+
*/
|
|
28
|
+
export declare class QnceThreadPool {
|
|
29
|
+
private workers;
|
|
30
|
+
private jobQueue;
|
|
31
|
+
private activeJobs;
|
|
32
|
+
private config;
|
|
33
|
+
private stats;
|
|
34
|
+
private isShuttingDown;
|
|
35
|
+
constructor(config?: Partial<ThreadPoolConfig>);
|
|
36
|
+
/**
|
|
37
|
+
* Submit job for background processing
|
|
38
|
+
*/
|
|
39
|
+
submitJob<T = unknown>(type: QnceJob['type'], payload: unknown, priority?: QnceJob['priority']): Promise<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Cache load operation (S2-T2 primary use case)
|
|
42
|
+
*/
|
|
43
|
+
loadFromCache(cacheKey: string, loader: () => Promise<unknown>): Promise<unknown>;
|
|
44
|
+
/**
|
|
45
|
+
* Telemetry write operation (S2-T2 primary use case)
|
|
46
|
+
*/
|
|
47
|
+
writeTelemetry(eventData: unknown): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Hot-reload preparation (integration with S2-T3)
|
|
50
|
+
*/
|
|
51
|
+
prepareHotReload(deltaData: unknown): Promise<unknown>;
|
|
52
|
+
/**
|
|
53
|
+
* Get current thread pool statistics
|
|
54
|
+
*/
|
|
55
|
+
getStats(): ThreadPoolStats;
|
|
56
|
+
/**
|
|
57
|
+
* Graceful shutdown of thread pool
|
|
58
|
+
*/
|
|
59
|
+
shutdown(timeoutMs?: number): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Initialize worker threads based on environment
|
|
62
|
+
*/
|
|
63
|
+
private initializeWorkers;
|
|
64
|
+
/**
|
|
65
|
+
* Web Workers for browser environment
|
|
66
|
+
*/
|
|
67
|
+
private initializeWebWorkers;
|
|
68
|
+
/**
|
|
69
|
+
* Node.js worker_threads (placeholder - would need actual implementation)
|
|
70
|
+
*/
|
|
71
|
+
private initializeNodeWorkers;
|
|
72
|
+
/**
|
|
73
|
+
* Fallback simulation for testing/development
|
|
74
|
+
*/
|
|
75
|
+
private initializeFallbackWorkers;
|
|
76
|
+
/**
|
|
77
|
+
* Generate Web Worker code for browser execution
|
|
78
|
+
*/
|
|
79
|
+
private generateWebWorkerCode;
|
|
80
|
+
/**
|
|
81
|
+
* Setup worker message handlers
|
|
82
|
+
*/
|
|
83
|
+
private setupWorkerHandlers;
|
|
84
|
+
/**
|
|
85
|
+
* Handle worker completion messages
|
|
86
|
+
*/
|
|
87
|
+
private handleWorkerMessage;
|
|
88
|
+
/**
|
|
89
|
+
* Handle worker errors
|
|
90
|
+
*/
|
|
91
|
+
private handleWorkerError;
|
|
92
|
+
/**
|
|
93
|
+
* Process job queue by assigning jobs to available workers
|
|
94
|
+
*/
|
|
95
|
+
private processQueue;
|
|
96
|
+
/**
|
|
97
|
+
* Find insertion index for job based on priority
|
|
98
|
+
*/
|
|
99
|
+
private findInsertionIndex;
|
|
100
|
+
/**
|
|
101
|
+
* Update execution time statistics
|
|
102
|
+
*/
|
|
103
|
+
private updateExecutionTimeStats;
|
|
104
|
+
}
|
|
105
|
+
export declare function getThreadPool(config?: Partial<ThreadPoolConfig>): QnceThreadPool;
|
|
106
|
+
export declare function shutdownThreadPool(): Promise<void>;
|
|
107
|
+
//# sourceMappingURL=ThreadPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadPool.d.ts","sourceRoot":"","sources":["../../src/performance/ThreadPool.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,eAAe,CAAC;IAC7E,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAoBlD;;OAEG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EACrB,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,OAAO,CAAC,UAAU,CAAY,GACvC,OAAO,CAAC,CAAC,CAAC;IA+Bb;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvF;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5D;;OAEG;IACH,QAAQ,IAAI,eAAe;IAI3B;;OAEG;IACG,QAAQ,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwE7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAQjC;AAKD,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAKhF;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD"}
|