@vizejs/vite-plugin-musea 0.0.1-alpha.100

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","names":["args: string[]","options: CliOptions","root: string","files: string[]","dir: string","filePath: string","variants: ArtFileInfo[\"variants\"]","artFiles: ArtFileInfo[]","vrtOptions: VrtOptions","reportDir"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Musea CLI\n *\n * Usage:\n * musea-vrt [command] [options]\n *\n * Commands:\n * (default) Run VRT tests\n * approve [pat] Approve failed snapshots (optionally filtered by pattern)\n * clean Remove orphaned snapshots\n *\n * Options:\n * -u, --update Update baseline snapshots\n * -c, --config Path to vite config (default: vite.config.ts)\n * -o, --output Output directory for reports (default: .vize)\n * -t, --threshold Diff threshold percentage (default: 0.1)\n * --json Output JSON report instead of HTML\n * --ci CI mode - exit with non-zero code on failures\n * --a11y Run accessibility audits alongside VRT\n * -h, --help Show help\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { MuseaVrtRunner, generateVrtReport, generateVrtJsonReport } from \"./vrt.js\";\nimport type { ArtFileInfo, VrtOptions } from \"./types.js\";\n\ntype Command = \"run\" | \"approve\" | \"clean\" | \"generate\";\n\ninterface CliOptions {\n command: Command;\n update: boolean;\n config: string;\n output: string;\n threshold: number;\n json: boolean;\n ci: boolean;\n a11y: boolean;\n help: boolean;\n baseUrl: string;\n pattern?: string;\n componentPath?: string;\n}\n\nfunction parseArgs(args: string[]): CliOptions {\n const options: CliOptions = {\n command: \"run\",\n update: false,\n config: \"vite.config.ts\",\n output: \".vize\",\n threshold: 0.1,\n json: false,\n ci: false,\n a11y: false,\n help: false,\n baseUrl: \"http://localhost:5173\",\n };\n\n let i = 0;\n\n // Check for subcommand as first arg\n if (args.length > 0 && !args[0].startsWith(\"-\")) {\n const sub = args[0];\n if (sub === \"approve\") {\n options.command = \"approve\";\n i = 1;\n // Optional pattern argument after approve\n if (args.length > 1 && !args[1].startsWith(\"-\")) {\n options.pattern = args[1];\n i = 2;\n }\n } else if (sub === \"clean\") {\n options.command = \"clean\";\n i = 1;\n } else if (sub === \"generate\") {\n options.command = \"generate\";\n i = 1;\n // Required component path argument\n if (args.length > 1 && !args[1].startsWith(\"-\")) {\n options.componentPath = args[1];\n i = 2;\n }\n }\n }\n\n for (; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"-u\":\n case \"--update\":\n options.update = true;\n break;\n case \"-c\":\n case \"--config\":\n options.config = args[++i] || \"vite.config.ts\";\n break;\n case \"-o\":\n case \"--output\":\n options.output = args[++i] || \".vize\";\n break;\n case \"-t\":\n case \"--threshold\":\n options.threshold = parseFloat(args[++i]) || 0.1;\n break;\n case \"--json\":\n options.json = true;\n break;\n case \"--ci\":\n options.ci = true;\n break;\n case \"--a11y\":\n options.a11y = true;\n break;\n case \"-b\":\n case \"--base-url\":\n options.baseUrl = args[++i] || \"http://localhost:5173\";\n break;\n case \"-h\":\n case \"--help\":\n options.help = true;\n break;\n }\n }\n\n return options;\n}\n\nfunction printHelp(): void {\n console.log(`\nMusea VRT - Visual Regression Testing for Component Gallery\n\nUsage:\n musea-vrt [command] [options]\n\nCommands:\n (default) Run VRT tests\n approve [pattern] Approve failed snapshots and update baselines\n Optional pattern filters which snapshots to approve\n clean Remove orphaned snapshots (no matching art/variant)\n generate <component> Auto-generate .art.vue from a Vue component\n\nOptions:\n -u, --update Update baseline snapshots with current screenshots\n -c, --config <path> Path to vite config file (default: vite.config.ts)\n -o, --output <dir> Output directory for reports (default: .vize)\n -t, --threshold <n> Diff threshold percentage (default: 0.1)\n -b, --base-url <url> Base URL for dev server (default: http://localhost:5173)\n --json Output JSON report instead of HTML\n --ci CI mode - exit with non-zero code on failures\n --a11y Run accessibility audits alongside VRT\n -h, --help Show this help message\n\nExamples:\n # Run VRT tests\n musea-vrt\n\n # Update baseline snapshots\n musea-vrt -u\n\n # Run with custom threshold\n musea-vrt -t 0.5\n\n # CI mode with JSON output\n musea-vrt --ci --json\n\n # Run with accessibility audits\n musea-vrt --a11y\n\n # Approve all failed snapshots\n musea-vrt approve\n\n # Approve specific snapshots by pattern\n musea-vrt approve \"Button/*\"\n\n # Clean orphaned snapshots\n musea-vrt clean\n\n # Auto-generate .art.vue from component\n musea-vrt generate src/components/Button.vue\n\n # Custom base URL\n musea-vrt -b http://localhost:3000\n`);\n}\n\nasync function scanArtFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n\n async function scan(dir: string): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n // Skip node_modules and dist\n if (entry.name === \"node_modules\" || entry.name === \"dist\") {\n continue;\n }\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".art.vue\")) {\n files.push(fullPath);\n }\n }\n }\n\n await scan(root);\n return files;\n}\n\nasync function parseArtFile(filePath: string): Promise<ArtFileInfo | null> {\n try {\n const source = await fs.promises.readFile(filePath, \"utf-8\");\n\n // Simple parsing - in production, use @vizejs/native\n const titleMatch = source.match(/<art[^>]*\\stitle=[\"']([^\"']+)[\"']/);\n const componentMatch = source.match(/<art[^>]*\\scomponent=[\"']([^\"']+)[\"']/);\n const categoryMatch = source.match(/<art[^>]*\\scategory=[\"']([^\"']+)[\"']/);\n\n const variants: ArtFileInfo[\"variants\"] = [];\n const variantRegex = /<variant\\s+([^>]*)>([\\s\\S]*?)<\\/variant>/g;\n let match;\n\n while ((match = variantRegex.exec(source)) !== null) {\n const attrs = match[1];\n const template = match[2].trim();\n\n const nameMatch = attrs.match(/name=[\"']([^\"']+)[\"']/);\n const isDefault = /\\bdefault\\b/.test(attrs);\n const skipVrt = /\\bskip-vrt\\b/.test(attrs);\n\n if (nameMatch) {\n variants.push({\n name: nameMatch[1],\n template,\n isDefault,\n skipVrt,\n });\n }\n }\n\n return {\n path: filePath,\n metadata: {\n title: titleMatch?.[1] || path.basename(filePath, \".art.vue\"),\n component: componentMatch?.[1],\n category: categoryMatch?.[1],\n tags: [],\n status: \"ready\",\n },\n variants,\n hasScriptSetup: /<script\\s+setup/.test(source),\n hasScript: /<script(?!\\s+setup)/.test(source),\n styleCount: (source.match(/<style/g) || []).length,\n };\n } catch (error) {\n console.error(`Failed to parse ${filePath}:`, error);\n return null;\n }\n}\n\nasync function runVrt(options: CliOptions, artFiles: ArtFileInfo[]): Promise<void> {\n const totalVariants = artFiles.reduce(\n (sum, art) => sum + art.variants.filter((v) => !v.skipVrt).length,\n 0,\n );\n\n console.log(` Testing ${totalVariants} variant(s) across ${artFiles.length} art file(s)\\n`);\n\n // Initialize VRT runner\n const vrtOptions: VrtOptions = {\n snapshotDir: path.join(options.output, \"snapshots\"),\n threshold: options.threshold,\n };\n\n const runner = new MuseaVrtRunner({\n ...vrtOptions,\n ci: options.ci ? { failOnDiff: true, jsonReport: options.json } : undefined,\n });\n\n try {\n console.log(\" Launching browser...\");\n await runner.init();\n\n console.log(\" Running visual regression tests...\\n\");\n\n // Run tests\n const results = await runner.runAllTests(artFiles, options.baseUrl);\n const summary = runner.getSummary(results);\n\n // Print results\n console.log(\" Results:\");\n console.log(\" ---------\");\n console.log(` Passed: ${summary.passed}`);\n console.log(` Failed: ${summary.failed}`);\n console.log(` New: ${summary.new}`);\n console.log(` Skipped: ${summary.skipped}`);\n console.log(` Total: ${summary.total}`);\n console.log(` Duration: ${(summary.duration / 1000).toFixed(2)}s\\n`);\n\n // Run a11y audits if requested\n if (options.a11y) {\n console.log(\" Running accessibility audits...\\n\");\n try {\n const { MuseaA11yRunner } = await import(\"./a11y.js\");\n const a11yRunner = new MuseaA11yRunner();\n const a11yResults = await a11yRunner.runAudits(artFiles, options.baseUrl, runner);\n const a11ySummary = a11yRunner.getSummary(a11yResults);\n\n console.log(\" A11y Results:\");\n console.log(\" -------------\");\n console.log(` Components: ${a11ySummary.totalComponents}`);\n console.log(` Variants: ${a11ySummary.totalVariants}`);\n console.log(` Violations: ${a11ySummary.totalViolations}`);\n console.log(` Critical: ${a11ySummary.criticalCount}`);\n console.log(` Serious: ${a11ySummary.seriousCount}\\n`);\n\n // Generate a11y report\n const reportDir = options.output;\n await fs.promises.mkdir(reportDir, { recursive: true });\n\n if (options.json) {\n const a11yJson = a11yRunner.generateJsonReport(a11yResults);\n const a11yPath = path.join(reportDir, \"a11y-report.json\");\n await fs.promises.writeFile(a11yPath, a11yJson);\n console.log(` A11y JSON report: ${a11yPath}\\n`);\n } else {\n const a11yHtml = a11yRunner.generateHtmlReport(a11yResults);\n const a11yPath = path.join(reportDir, \"a11y-report.html\");\n await fs.promises.writeFile(a11yPath, a11yHtml);\n console.log(` A11y HTML report: ${a11yPath}\\n`);\n }\n\n // CI mode - exit with error on critical/serious violations\n if (options.ci && (a11ySummary.criticalCount > 0 || a11ySummary.seriousCount > 0)) {\n console.log(\" CI mode: Accessibility violations found\\n\");\n process.exit(1);\n }\n } catch (e) {\n console.warn(\" A11y audits skipped:\", e instanceof Error ? e.message : String(e));\n console.warn(\" Make sure axe-core is installed: npm install axe-core\\n\");\n }\n }\n\n // Update baselines if requested\n if (options.update) {\n console.log(\" Updating baselines...\");\n const updated = await runner.updateBaselines(results);\n console.log(` Updated ${updated} baseline(s)\\n`);\n }\n\n // Generate VRT report\n const reportDir = options.output;\n await fs.promises.mkdir(reportDir, { recursive: true });\n\n if (options.json) {\n const jsonReport = generateVrtJsonReport(results, summary);\n const jsonPath = path.join(reportDir, \"vrt-report.json\");\n await fs.promises.writeFile(jsonPath, jsonReport);\n console.log(` JSON report: ${jsonPath}\\n`);\n } else {\n const htmlReport = generateVrtReport(results, summary);\n const htmlPath = path.join(reportDir, \"vrt-report.html\");\n await fs.promises.writeFile(htmlPath, htmlReport);\n console.log(` HTML report: ${htmlPath}\\n`);\n }\n\n // CI mode - exit with error if failures\n if (options.ci && summary.failed > 0) {\n console.log(\" CI mode: Exiting with error due to failures\\n\");\n process.exit(1);\n }\n } finally {\n await runner.close();\n }\n}\n\nasync function runApprove(options: CliOptions, artFiles: ArtFileInfo[]): Promise<void> {\n const vrtOptions: VrtOptions = {\n snapshotDir: path.join(options.output, \"snapshots\"),\n threshold: options.threshold,\n };\n\n const runner = new MuseaVrtRunner(vrtOptions);\n\n try {\n console.log(\" Launching browser...\");\n await runner.init();\n\n console.log(\" Running tests to find diffs...\\n\");\n\n const results = await runner.runAllTests(artFiles, options.baseUrl);\n const failed = results.filter((r) => !r.passed && !r.error);\n\n if (failed.length === 0) {\n console.log(\" No failed tests to approve.\\n\");\n return;\n }\n\n const pattern = options.pattern;\n if (pattern) {\n console.log(` Approving snapshots matching: ${pattern}\\n`);\n } else {\n console.log(` Approving all ${failed.length} failed snapshot(s)...\\n`);\n }\n\n const approved = await runner.approveResults(results, pattern);\n console.log(` Approved ${approved} snapshot(s)\\n`);\n } finally {\n await runner.close();\n }\n}\n\nasync function runClean(options: CliOptions, artFiles: ArtFileInfo[]): Promise<void> {\n const vrtOptions: VrtOptions = {\n snapshotDir: path.join(options.output, \"snapshots\"),\n threshold: options.threshold,\n };\n\n const runner = new MuseaVrtRunner(vrtOptions);\n\n console.log(\" Scanning for orphaned snapshots...\\n\");\n\n const cleaned = await runner.cleanOrphans(artFiles);\n\n if (cleaned === 0) {\n console.log(\" No orphaned snapshots found.\\n\");\n } else {\n console.log(`\\n Cleaned ${cleaned} orphaned snapshot(s)\\n`);\n }\n}\n\nasync function runGenerate(options: CliOptions): Promise<void> {\n if (!options.componentPath) {\n console.error(\" Error: Missing component path.\");\n console.error(\" Usage: musea-vrt generate <component.vue>\\n\");\n process.exit(1);\n }\n\n const componentPath = path.resolve(options.componentPath);\n\n // Check file exists\n try {\n await fs.promises.access(componentPath);\n } catch {\n console.error(` Error: File not found: ${componentPath}\\n`);\n process.exit(1);\n }\n\n console.log(` Generating art file for: ${path.relative(process.cwd(), componentPath)}\\n`);\n\n try {\n const { writeArtFile } = await import(\"./autogen.js\");\n const outputPath = await writeArtFile(componentPath);\n const relOutput = path.relative(process.cwd(), outputPath);\n\n console.log(` Generated: ${relOutput}\\n`);\n } catch (e) {\n console.error(\" Generation failed:\", e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options = parseArgs(args);\n\n if (options.help) {\n printHelp();\n process.exit(0);\n }\n\n const cwd = process.cwd();\n\n console.log(\"\\n Musea VRT\");\n console.log(\" =========\\n\");\n\n // Handle generate command early (doesn't need art file scanning)\n if (options.command === \"generate\") {\n try {\n await runGenerate(options);\n } catch (error) {\n console.error(\"\\n Error:\", error);\n process.exit(1);\n }\n return;\n }\n\n // Scan for art files\n console.log(\" Scanning for art files...\");\n const artFilePaths = await scanArtFiles(cwd);\n\n if (artFilePaths.length === 0) {\n console.log(\" No art files found.\\n\");\n process.exit(0);\n }\n\n console.log(` Found ${artFilePaths.length} art file(s)\\n`);\n\n // Parse art files\n const artFiles: ArtFileInfo[] = [];\n for (const filePath of artFilePaths) {\n const art = await parseArtFile(filePath);\n if (art) {\n artFiles.push(art);\n }\n }\n\n try {\n switch (options.command) {\n case \"run\":\n await runVrt(options, artFiles);\n break;\n case \"approve\":\n await runApprove(options, artFiles);\n break;\n case \"clean\":\n await runClean(options, artFiles);\n break;\n case \"generate\":\n // Handled above before art file scanning\n break;\n }\n } catch (error) {\n console.error(\"\\n Error:\", error);\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n"],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import { A11yOptions, A11yResult, AnalysisApiResponse, ArtFileInfo, ArtMetadata, ArtVariant, CaptureConfig, CiConfig, ComparisonConfig, CsfOutput, MuseaOptions, MuseaTheme, MuseaThemeColors, MuseaVrtRunner$1 as MuseaVrtRunner, PaletteApiResponse, ViewportConfig, VrtOptions, VrtResult, VrtSummary, generateVrtJsonReport$1 as generateVrtJsonReport, generateVrtReport$1 as generateVrtReport } from "./vrt-m01uFerp.js";
2
+ import { A11ySummary, MuseaA11yRunner$1 as MuseaA11yRunner } from "./a11y-CHcxz6UR.js";
3
+ import { AutogenOptions, AutogenOutput, GeneratedVariant, PropDefinition, generateArtFile$1 as generateArtFile, writeArtFile$1 as writeArtFile } from "./autogen-D3Zjc3zI.js";
4
+ import { Plugin } from "vite";
5
+
6
+ //#region src/style-dictionary.d.ts
7
+ /**
8
+ * Style Dictionary integration for Musea.
9
+ * Generates design token documentation from Style Dictionary format.
10
+ */
11
+ /**
12
+ * Design token value.
13
+ */
14
+ /**
15
+ * Style Dictionary integration for Musea.
16
+ * Generates design token documentation from Style Dictionary format.
17
+ */
18
+ /**
19
+ * Design token value.
20
+ */
21
+ interface DesignToken {
22
+ value: string | number;
23
+ type?: string;
24
+ description?: string;
25
+ attributes?: Record<string, unknown>;
26
+ $tier?: "primitive" | "semantic";
27
+ $reference?: string;
28
+ $resolvedValue?: string | number;
29
+ }
30
+ /**
31
+ * Token category (e.g., colors, spacing, typography).
32
+ */
33
+ interface TokenCategory {
34
+ name: string;
35
+ tokens: Record<string, DesignToken>;
36
+ subcategories?: TokenCategory[];
37
+ }
38
+ /**
39
+ * Style Dictionary output format.
40
+ */
41
+ interface StyleDictionaryOutput {
42
+ categories: TokenCategory[];
43
+ metadata: {
44
+ name: string;
45
+ version?: string;
46
+ generatedAt: string;
47
+ };
48
+ }
49
+ /**
50
+ * Configuration for Style Dictionary integration.
51
+ */
52
+ interface StyleDictionaryConfig {
53
+ /**
54
+ * Path to tokens JSON/JS file or directory.
55
+ */
56
+ tokensPath: string;
57
+ /**
58
+ * Output format for documentation.
59
+ * @default 'html'
60
+ */
61
+ outputFormat?: "html" | "json" | "markdown";
62
+ /**
63
+ * Output directory for generated documentation.
64
+ * @default '.vize/tokens'
65
+ */
66
+ outputDir?: string;
67
+ /**
68
+ * Custom token transformations.
69
+ */
70
+ transforms?: TokenTransform[];
71
+ }
72
+ /**
73
+ * Token transformation function.
74
+ */
75
+ type TokenTransform = (token: DesignToken, path: string[]) => DesignToken;
76
+ /**
77
+ * Parse Style Dictionary tokens file.
78
+ */
79
+ declare function parseTokens(tokensPath: string): Promise<TokenCategory[]>;
80
+ /**
81
+ * Flatten nested categories into a flat map keyed by dot-path.
82
+ */
83
+ declare function buildTokenMap(categories: TokenCategory[], prefix?: string[]): Record<string, DesignToken>;
84
+ /**
85
+ * Resolve references in categories, setting $tier, $reference, and $resolvedValue.
86
+ */
87
+ declare function resolveReferences(categories: TokenCategory[], tokenMap: Record<string, DesignToken>): void;
88
+ /**
89
+ * Read raw JSON token file.
90
+ */
91
+
92
+ /**
93
+ * Generate HTML documentation for tokens.
94
+ */
95
+ declare function generateTokensHtml(categories: TokenCategory[]): string;
96
+ /**
97
+ * Generate Markdown documentation for tokens.
98
+ */
99
+ declare function generateTokensMarkdown(categories: TokenCategory[]): string;
100
+ /**
101
+ * Style Dictionary plugin for Musea.
102
+ */
103
+ declare function processStyleDictionary(config: StyleDictionaryConfig): Promise<StyleDictionaryOutput>;
104
+ interface TokenUsageMatch {
105
+ line: number;
106
+ lineContent: string;
107
+ property: string;
108
+ }
109
+ interface TokenUsageEntry {
110
+ artPath: string;
111
+ artTitle: string;
112
+ artCategory?: string;
113
+ matches: TokenUsageMatch[];
114
+ }
115
+ type TokenUsageMap = Record<string, TokenUsageEntry[]>;
116
+ /**
117
+ * Normalize a token value for comparison.
118
+ * - Lowercase, trim
119
+ * - Leading-zero: `.5rem` → `0.5rem`
120
+ * - Short hex: `#fff` → `#ffffff`
121
+ */
122
+
123
+ /**
124
+ * Scan art file sources for token value matches in `<style>` blocks.
125
+ */
126
+ declare function scanTokenUsage(artFiles: Map<string, {
127
+ path: string;
128
+ metadata: {
129
+ title: string;
130
+ category?: string;
131
+ };
132
+ }>, tokenMap: Record<string, DesignToken>): TokenUsageMap; //#endregion
133
+ //#region src/index.d.ts
134
+
135
+ //# sourceMappingURL=style-dictionary.d.ts.map
136
+ /**
137
+ * Create Musea Vite plugin.
138
+ */
139
+ declare function musea(options?: MuseaOptions): Plugin[];
140
+
141
+ //#endregion
142
+ export { A11yOptions, A11yResult, A11ySummary, AnalysisApiResponse, ArtFileInfo, ArtMetadata, ArtVariant, AutogenOptions, AutogenOutput, CaptureConfig, CiConfig, ComparisonConfig, CsfOutput, DesignToken, GeneratedVariant, MuseaA11yRunner, MuseaOptions, MuseaTheme, MuseaThemeColors, MuseaVrtRunner, PaletteApiResponse, PropDefinition, StyleDictionaryConfig, StyleDictionaryOutput, TokenCategory, TokenUsageMap, ViewportConfig, VrtOptions, VrtResult, VrtSummary, buildTokenMap, musea as default, generateArtFile, generateTokensHtml, generateTokensMarkdown, generateVrtJsonReport, generateVrtReport, musea, parseTokens, processStyleDictionary, resolveReferences, scanTokenUsage, writeArtFile };
143
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/style-dictionary.ts","../src/index.ts"],"sourcesContent":null,"mappings":";;;;;;;;;;;;;;;;;;;;UAWiB,WAAA;;;;eAIF;;EAJE,UAAA,CAAA,EAAA,MAAW;;;;AAa5B;;AAEyB,UAFR,aAAA,CAEQ;EAAW,IAA1B,EAAA,MAAA;EAAM,MACE,EADR,MACQ,CAAA,MAAA,EADO,WACP,CAAA;EAAa,aAAA,CAAA,EAAb,aAAa,EAAA;;;;AAM/B;UAAiB,qBAAA;cACH;;IAWG,IAAA,EAAA,MAAA;;;;AA2BjB;;;;AAAgF,UA3B/D,qBAAA,CA2B+D;;;;EAK1D,UAAA,EAAA,MAAW;EAAA;;;AAA6B;;;;AAuJ9D;;EAA6B,SACf,CAAA,EAAA,MAAA;EAAa;;AAElB;eArKM;;;AAkMf;;AACc,KA7LF,cAAA,GA6LE,CAAA,KAAA,EA7LuB,WA6LvB,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,GA7LuD,WA6LvD;;;AACI;iBAzLI,WAAA,sBAAiC,QAAQ;;;AAsY/D;iBA/OgB,aAAA,aACF,qCAEX,eAAe;;;AA8WlB;iBAjVgB,iBAAA,aACF,2BACF,eAAe;;;AAqX3B;;;;;iBAxKgB,kBAAA,aAA+B;ACjO/C;;;AAAmD,iBDmWnC,sBAAA,CCnWmC,UAAA,EDmWA,aCnWA,EAAA,CAAA,EAAA,MAAA;AAAM;;;iBDyYnC,sBAAA,SACZ,wBACP,QAAQ;UA6CM,eAAA;;;;;UAMA,eAAA;;;;WAIN;;KAGC,aAAA,GAAgB,eAAe;;;;;;;;;;;iBAgC3B,cAAA,WACJ;;;;;;cACA,eAAe,eACxB;;;;AA/rB4B;;;iBCuNf,KAAA,WAAe,eAAoB"}