@michelabboud/visual-forge-mcp 0.7.0 → 0.9.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/CHANGELOG.md +272 -0
- package/README.md +196 -2
- package/config/pricing.json +32 -4
- package/dist/providers/base-provider.d.ts +10 -2
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +53 -3
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +40 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/zai/zai-provider.d.ts +22 -0
- package/dist/providers/zai/zai-provider.d.ts.map +1 -0
- package/dist/providers/zai/zai-provider.js +154 -0
- package/dist/providers/zai/zai-provider.js.map +1 -0
- package/dist/quality/index.d.ts +1 -0
- package/dist/quality/index.d.ts.map +1 -1
- package/dist/quality/index.js +1 -0
- package/dist/quality/index.js.map +1 -1
- package/dist/quality/model-tester.d.ts +87 -0
- package/dist/quality/model-tester.d.ts.map +1 -0
- package/dist/quality/model-tester.js +357 -0
- package/dist/quality/model-tester.js.map +1 -0
- package/dist/server/mcp-server.d.ts +5 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +371 -5
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/types/generation.d.ts +1 -1
- package/dist/types/generation.d.ts.map +1 -1
- package/dist/types/provider.d.ts +28 -1
- package/dist/types/provider.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/user-config-manager.d.ts +68 -0
- package/dist/utils/user-config-manager.d.ts.map +1 -0
- package/dist/utils/user-config-manager.js +131 -0
- package/dist/utils/user-config-manager.js.map +1 -0
- package/docs/guides/comprehensive-guide.md +1552 -0
- package/package.json +2 -2
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Tester - Test models with standard or custom prompts and score quality
|
|
3
|
+
*/
|
|
4
|
+
import { providerFactory } from '../providers/index.js';
|
|
5
|
+
import { QualityInspector } from './quality-inspector.js';
|
|
6
|
+
import { userConfigManager } from '../utils/user-config-manager.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
export class ModelTester {
|
|
11
|
+
qualityInspector;
|
|
12
|
+
outputDir;
|
|
13
|
+
constructor(outputDir) {
|
|
14
|
+
this.qualityInspector = new QualityInspector();
|
|
15
|
+
this.outputDir = outputDir || path.join(process.cwd(), 'generated-images', 'tests');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate standard test image
|
|
19
|
+
*/
|
|
20
|
+
async generateStandardTest(provider, modelId, aspectRatio = '16:9') {
|
|
21
|
+
const providerInstance = providerFactory.getProvider(provider);
|
|
22
|
+
const models = providerInstance.getModels();
|
|
23
|
+
const model = models.find(m => m.id === modelId);
|
|
24
|
+
if (!model) {
|
|
25
|
+
throw new Error(`Model ${modelId} not found for provider ${provider}`);
|
|
26
|
+
}
|
|
27
|
+
const standardPrompt = this.buildStandardTestPrompt(model.name);
|
|
28
|
+
const spec = {
|
|
29
|
+
id: `test-${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}-${Date.now()}`,
|
|
30
|
+
sourceFile: 'model-test',
|
|
31
|
+
type: 'diagram',
|
|
32
|
+
placement: {
|
|
33
|
+
section: 'Standard Quality Test',
|
|
34
|
+
line: 0,
|
|
35
|
+
context: 'Automated model quality test',
|
|
36
|
+
suggestedFilename: `test-${provider}-${modelId}`,
|
|
37
|
+
},
|
|
38
|
+
prompt: standardPrompt,
|
|
39
|
+
aspectRatio: aspectRatio,
|
|
40
|
+
metadata: {
|
|
41
|
+
altText: `Standard quality test for ${model.name}`,
|
|
42
|
+
priority: 'high',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
return await this.executeTest(provider, modelId, spec);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate user-provided test image
|
|
49
|
+
*/
|
|
50
|
+
async generateUserTest(provider, modelId, prompt, aspectRatio = '16:9', globalContext) {
|
|
51
|
+
const providerInstance = providerFactory.getProvider(provider);
|
|
52
|
+
const models = providerInstance.getModels();
|
|
53
|
+
const model = models.find(m => m.id === modelId);
|
|
54
|
+
const spec = {
|
|
55
|
+
id: `test-${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}-${Date.now()}`,
|
|
56
|
+
sourceFile: 'model-test',
|
|
57
|
+
type: 'diagram',
|
|
58
|
+
placement: {
|
|
59
|
+
section: 'User Test',
|
|
60
|
+
line: 0,
|
|
61
|
+
context: 'User-provided test prompt',
|
|
62
|
+
suggestedFilename: `test-${provider}-${modelId}`,
|
|
63
|
+
},
|
|
64
|
+
prompt,
|
|
65
|
+
aspectRatio: aspectRatio,
|
|
66
|
+
metadata: {
|
|
67
|
+
altText: `User test for ${model?.name || modelId}`,
|
|
68
|
+
priority: 'high',
|
|
69
|
+
},
|
|
70
|
+
globalContext,
|
|
71
|
+
};
|
|
72
|
+
return await this.executeTest(provider, modelId, spec);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Compare multiple models with same prompt
|
|
76
|
+
*/
|
|
77
|
+
async compareModels(prompt, providers, aspectRatio = '16:9', globalContext) {
|
|
78
|
+
logger.info('Starting model comparison', {
|
|
79
|
+
prompt: prompt.substring(0, 100),
|
|
80
|
+
providerCount: providers.length,
|
|
81
|
+
aspectRatio,
|
|
82
|
+
});
|
|
83
|
+
const results = [];
|
|
84
|
+
let totalCost = 0;
|
|
85
|
+
let totalTime = 0;
|
|
86
|
+
// Run all tests
|
|
87
|
+
for (const { provider, model } of providers) {
|
|
88
|
+
try {
|
|
89
|
+
const result = await this.generateUserTest(provider, model, prompt, aspectRatio, globalContext);
|
|
90
|
+
results.push(result);
|
|
91
|
+
totalCost += result.cost;
|
|
92
|
+
totalTime += result.generationTime;
|
|
93
|
+
logger.info('Model test completed', {
|
|
94
|
+
provider,
|
|
95
|
+
model,
|
|
96
|
+
score: result.qualityScore.overall,
|
|
97
|
+
cost: result.cost,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
logger.error('Model test failed', {
|
|
102
|
+
provider,
|
|
103
|
+
model,
|
|
104
|
+
error: error.message,
|
|
105
|
+
});
|
|
106
|
+
const providerInstance = providerFactory.getProvider(provider);
|
|
107
|
+
const models = providerInstance.getModels();
|
|
108
|
+
const modelInfo = models.find(m => m.id === model);
|
|
109
|
+
results.push({
|
|
110
|
+
provider,
|
|
111
|
+
providerName: providerInstance.displayName,
|
|
112
|
+
modelId: model,
|
|
113
|
+
modelName: modelInfo?.name || model,
|
|
114
|
+
success: false,
|
|
115
|
+
qualityScore: {
|
|
116
|
+
overall: 0,
|
|
117
|
+
sharpness: 0,
|
|
118
|
+
brightness: 0,
|
|
119
|
+
textRendering: 0,
|
|
120
|
+
colorAccuracy: 0,
|
|
121
|
+
passed: false,
|
|
122
|
+
},
|
|
123
|
+
generationTime: 0,
|
|
124
|
+
cost: 0,
|
|
125
|
+
error: error.message,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Rank results by quality score
|
|
130
|
+
const rankedResults = results
|
|
131
|
+
.map(r => ({ ...r, rank: 0 }))
|
|
132
|
+
.sort((a, b) => b.qualityScore.overall - a.qualityScore.overall)
|
|
133
|
+
.map((r, idx) => ({ ...r, rank: idx + 1 }));
|
|
134
|
+
// Generate recommendation
|
|
135
|
+
const recommendation = this.generateRecommendation(rankedResults, prompt);
|
|
136
|
+
return {
|
|
137
|
+
prompt,
|
|
138
|
+
aspectRatio,
|
|
139
|
+
totalCost,
|
|
140
|
+
totalTime,
|
|
141
|
+
results: rankedResults,
|
|
142
|
+
recommendation,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Execute a single test
|
|
147
|
+
*/
|
|
148
|
+
async executeTest(provider, modelId, spec) {
|
|
149
|
+
const startTime = Date.now();
|
|
150
|
+
try {
|
|
151
|
+
// Ensure output directory exists
|
|
152
|
+
await fs.mkdir(this.outputDir, { recursive: true });
|
|
153
|
+
// Get provider and model info
|
|
154
|
+
const providerInstance = providerFactory.getProvider(provider);
|
|
155
|
+
const models = providerInstance.getModels();
|
|
156
|
+
const model = models.find(m => m.id === modelId);
|
|
157
|
+
if (!model) {
|
|
158
|
+
throw new Error(`Model ${modelId} not found`);
|
|
159
|
+
}
|
|
160
|
+
// Generate image
|
|
161
|
+
logger.info('Generating test image', {
|
|
162
|
+
provider,
|
|
163
|
+
model: modelId,
|
|
164
|
+
imageId: spec.id,
|
|
165
|
+
});
|
|
166
|
+
const generated = await providerInstance.generate(spec, { model: modelId });
|
|
167
|
+
const generationTime = Date.now() - startTime;
|
|
168
|
+
// Copy to test directory
|
|
169
|
+
const testFilename = `${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}-${Date.now()}.png`;
|
|
170
|
+
const testFilepath = path.join(this.outputDir, testFilename);
|
|
171
|
+
await fs.copyFile(generated.filepath, testFilepath);
|
|
172
|
+
// Update filepath for inspection
|
|
173
|
+
const testGenerated = { ...generated, filepath: testFilepath };
|
|
174
|
+
// Inspect quality
|
|
175
|
+
const qualityReport = await this.qualityInspector.inspect(testGenerated, spec);
|
|
176
|
+
// Calculate enhanced quality score
|
|
177
|
+
const enhancedScore = this.calculateEnhancedScore(qualityReport, spec);
|
|
178
|
+
// Record test result
|
|
179
|
+
await userConfigManager.recordModelTest(provider, modelId, enhancedScore.overall, enhancedScore.passed);
|
|
180
|
+
return {
|
|
181
|
+
provider,
|
|
182
|
+
providerName: providerInstance.displayName,
|
|
183
|
+
modelId,
|
|
184
|
+
modelName: model.name,
|
|
185
|
+
success: true,
|
|
186
|
+
generatedImage: testGenerated,
|
|
187
|
+
qualityScore: enhancedScore,
|
|
188
|
+
generationTime,
|
|
189
|
+
cost: model.costPerImage,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
const generationTime = Date.now() - startTime;
|
|
194
|
+
logger.error('Test failed', {
|
|
195
|
+
provider,
|
|
196
|
+
model: modelId,
|
|
197
|
+
error: error.message,
|
|
198
|
+
});
|
|
199
|
+
const providerInstance = providerFactory.getProvider(provider);
|
|
200
|
+
const models = providerInstance.getModels();
|
|
201
|
+
const model = models.find(m => m.id === modelId);
|
|
202
|
+
return {
|
|
203
|
+
provider,
|
|
204
|
+
providerName: providerInstance.displayName,
|
|
205
|
+
modelId,
|
|
206
|
+
modelName: model?.name || modelId,
|
|
207
|
+
success: false,
|
|
208
|
+
qualityScore: {
|
|
209
|
+
overall: 0,
|
|
210
|
+
sharpness: 0,
|
|
211
|
+
brightness: 0,
|
|
212
|
+
textRendering: 0,
|
|
213
|
+
colorAccuracy: 0,
|
|
214
|
+
passed: false,
|
|
215
|
+
},
|
|
216
|
+
generationTime,
|
|
217
|
+
cost: 0,
|
|
218
|
+
error: error.message,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Build standard test prompt
|
|
224
|
+
*/
|
|
225
|
+
buildStandardTestPrompt(modelName) {
|
|
226
|
+
return `Generate a professional quality test image with the following elements:
|
|
227
|
+
|
|
228
|
+
1. Large title text: "Visual Forge Quality Test"
|
|
229
|
+
2. Subtitle: "Model: ${modelName}"
|
|
230
|
+
3. Geometric shapes: red circle, blue square, green triangle
|
|
231
|
+
4. Color gradient background from #1a365d to #0891b2
|
|
232
|
+
5. Small detailed text: "Sharpness Test: 0.123456789"
|
|
233
|
+
6. Technical diagram element: Simple flowchart with 3 boxes and arrows
|
|
234
|
+
7. Professional style, clean layout, high contrast
|
|
235
|
+
|
|
236
|
+
This is a standardized test image for quality validation.`;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Calculate enhanced quality score with text rendering and color accuracy
|
|
240
|
+
*/
|
|
241
|
+
calculateEnhancedScore(qualityReport, spec) {
|
|
242
|
+
const metrics = qualityReport.metrics;
|
|
243
|
+
// Sharpness score (0-100): Normalize Laplacian variance
|
|
244
|
+
const sharpnessRaw = metrics.sharpness || 0;
|
|
245
|
+
const sharpness = Math.min(100, (sharpnessRaw / 500) * 100); // 500 is good sharpness
|
|
246
|
+
// Brightness score (0-100): Penalize extremes
|
|
247
|
+
const brightnessRaw = metrics.meanBrightness || 128;
|
|
248
|
+
let brightness = 100;
|
|
249
|
+
if (brightnessRaw < 30 || brightnessRaw > 240) {
|
|
250
|
+
brightness = 0; // Too dark or too bright
|
|
251
|
+
}
|
|
252
|
+
else if (brightnessRaw < 60 || brightnessRaw > 200) {
|
|
253
|
+
brightness = 50; // Suboptimal
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
brightness = 100; // Good range
|
|
257
|
+
}
|
|
258
|
+
// Text rendering score (0-100)
|
|
259
|
+
// For now, estimate based on sharpness and contrast
|
|
260
|
+
// In future, could integrate OCR (Tesseract) to verify actual text
|
|
261
|
+
const textRendering = this.estimateTextQuality(spec, sharpnessRaw);
|
|
262
|
+
// Color accuracy score (0-100)
|
|
263
|
+
// For now, use basic heuristics
|
|
264
|
+
// In future, could analyze actual color values
|
|
265
|
+
const colorAccuracy = this.estimateColorAccuracy(spec);
|
|
266
|
+
// Overall score: weighted average
|
|
267
|
+
// sharpness * 0.3 + brightness * 0.2 + textRendering * 0.4 + colorAccuracy * 0.1
|
|
268
|
+
const overall = sharpness * 0.3 +
|
|
269
|
+
brightness * 0.2 +
|
|
270
|
+
textRendering * 0.4 +
|
|
271
|
+
colorAccuracy * 0.1;
|
|
272
|
+
const passed = overall >= 60; // Default threshold
|
|
273
|
+
return {
|
|
274
|
+
overall: Math.round(overall * 10) / 10,
|
|
275
|
+
sharpness: Math.round(sharpness * 10) / 10,
|
|
276
|
+
brightness: brightnessRaw,
|
|
277
|
+
textRendering: Math.round(textRendering * 10) / 10,
|
|
278
|
+
colorAccuracy: Math.round(colorAccuracy * 10) / 10,
|
|
279
|
+
passed,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Estimate text quality (placeholder for OCR)
|
|
284
|
+
*/
|
|
285
|
+
estimateTextQuality(spec, sharpness) {
|
|
286
|
+
// Check if prompt mentions text
|
|
287
|
+
const hasText = spec.prompt.toLowerCase().includes('text') ||
|
|
288
|
+
spec.prompt.toLowerCase().includes('label') ||
|
|
289
|
+
spec.prompt.toLowerCase().includes('title');
|
|
290
|
+
if (!hasText) {
|
|
291
|
+
return 100; // No text expected, perfect score
|
|
292
|
+
}
|
|
293
|
+
// Estimate based on sharpness (text needs sharp edges)
|
|
294
|
+
if (sharpness > 400)
|
|
295
|
+
return 95;
|
|
296
|
+
if (sharpness > 300)
|
|
297
|
+
return 85;
|
|
298
|
+
if (sharpness > 200)
|
|
299
|
+
return 75;
|
|
300
|
+
if (sharpness > 100)
|
|
301
|
+
return 65;
|
|
302
|
+
return 50;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Estimate color accuracy (placeholder for actual color analysis)
|
|
306
|
+
*/
|
|
307
|
+
estimateColorAccuracy(spec) {
|
|
308
|
+
// Check if prompt mentions specific colors
|
|
309
|
+
const hasColors = spec.prompt.toLowerCase().includes('color') ||
|
|
310
|
+
spec.prompt.toLowerCase().includes('red') ||
|
|
311
|
+
spec.prompt.toLowerCase().includes('blue') ||
|
|
312
|
+
spec.prompt.toLowerCase().includes('green') ||
|
|
313
|
+
spec.prompt.match(/#[0-9a-f]{6}/i);
|
|
314
|
+
if (!hasColors) {
|
|
315
|
+
return 100; // No specific colors requested
|
|
316
|
+
}
|
|
317
|
+
// For now, give benefit of the doubt
|
|
318
|
+
// In future, could analyze actual RGB values
|
|
319
|
+
return 90;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Generate recommendation from ranked results
|
|
323
|
+
*/
|
|
324
|
+
generateRecommendation(results, prompt) {
|
|
325
|
+
const winner = results[0];
|
|
326
|
+
const alternatives = results.slice(1, 3); // Top 2 alternatives
|
|
327
|
+
// Determine reason based on scores and cost
|
|
328
|
+
let reason = `Highest overall quality (${winner.qualityScore.overall}/100)`;
|
|
329
|
+
if (winner.qualityScore.textRendering > 90) {
|
|
330
|
+
reason += ', especially excellent text rendering';
|
|
331
|
+
}
|
|
332
|
+
if (winner.cost > 0) {
|
|
333
|
+
reason += `. Worth the $${winner.cost.toFixed(3)} cost`;
|
|
334
|
+
if (prompt.toLowerCase().includes('technical') || prompt.toLowerCase().includes('diagram')) {
|
|
335
|
+
reason += ' for technical diagrams';
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
reason += '. Best free option';
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
provider: winner.provider,
|
|
343
|
+
model: winner.modelId,
|
|
344
|
+
reason,
|
|
345
|
+
alternatives: alternatives
|
|
346
|
+
.filter(a => a.success)
|
|
347
|
+
.map(alt => ({
|
|
348
|
+
provider: alt.provider,
|
|
349
|
+
model: alt.modelId,
|
|
350
|
+
reason: alt.cost === 0
|
|
351
|
+
? `Free alternative with ${alt.qualityScore.overall === 0 ? 'failed generation' : `good quality (${alt.qualityScore.overall}/100)`}`
|
|
352
|
+
: `Quality: ${alt.qualityScore.overall}/100, Cost: $${alt.cost.toFixed(3)}`,
|
|
353
|
+
})),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=model-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-tester.js","sourceRoot":"","sources":["../../src/quality/model-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export declare class VisualForgeMCPServer {
|
|
|
10
10
|
private workflowOrchestrator?;
|
|
11
11
|
private workflowTools;
|
|
12
12
|
private configManager;
|
|
13
|
+
private modelTester;
|
|
13
14
|
constructor();
|
|
14
15
|
/**
|
|
15
16
|
* Initialize server
|
|
@@ -46,6 +47,10 @@ export declare class VisualForgeMCPServer {
|
|
|
46
47
|
private handleGetProviderStatus;
|
|
47
48
|
private handleTestProviderConnection;
|
|
48
49
|
private handleRemoveProvider;
|
|
50
|
+
private handleSetDefaultModel;
|
|
51
|
+
private handleGetModelInfo;
|
|
52
|
+
private handleTestModel;
|
|
53
|
+
private handleCompareModels;
|
|
49
54
|
/**
|
|
50
55
|
* Handle approve_changes tool
|
|
51
56
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAC,CAAuB;IACpD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;;IAyBjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IA6qBhB;;OAEG;YACW,cAAc;IAgH5B;;OAEG;YAEW,mBAAmB;YAiCnB,mBAAmB;YAmBnB,mBAAmB;YAyBnB,mBAAmB;YA8CnB,eAAe;YAkBf,oBAAoB;YASpB,gBAAgB;YAqBhB,mBAAmB;YAanB,oBAAoB;IAalC;;OAEG;YAEW,uBAAuB;YAgCvB,uBAAuB;YAavB,4BAA4B;YA4C5B,oBAAoB;YAmBpB,qBAAqB;YAwCrB,kBAAkB;YAqDlB,eAAe;YA4Gf,mBAAmB;IA+EjC;;OAEG;YACW,oBAAoB;IAsClC;;OAEG;YACW,wBAAwB;IAyCtC;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}
|