faf-cli 4.4.4 → 4.5.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 +27 -17
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts +14 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +353 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/bi-sync.d.ts +3 -0
- package/dist/commands/bi-sync.d.ts.map +1 -1
- package/dist/commands/bi-sync.js +38 -0
- package/dist/commands/bi-sync.js.map +1 -1
- package/dist/commands/cursor.d.ts +13 -0
- package/dist/commands/cursor.d.ts.map +1 -0
- package/dist/commands/cursor.js +310 -0
- package/dist/commands/cursor.js.map +1 -0
- package/dist/commands/go.d.ts.map +1 -1
- package/dist/commands/go.js +22 -19
- package/dist/commands/go.js.map +1 -1
- package/dist/commands/taf-log.d.ts +1 -0
- package/dist/commands/taf-log.d.ts.map +1 -1
- package/dist/commands/taf-log.js +53 -5
- package/dist/commands/taf-log.js.map +1 -1
- package/dist/commands/taf-stars.d.ts +8 -0
- package/dist/commands/taf-stars.d.ts.map +1 -0
- package/dist/commands/taf-stars.js +105 -0
- package/dist/commands/taf-stars.js.map +1 -0
- package/dist/commands/taf.d.ts +1 -0
- package/dist/commands/taf.d.ts.map +1 -1
- package/dist/commands/taf.js +9 -0
- package/dist/commands/taf.js.map +1 -1
- package/dist/compiler/faf-compiler.d.ts.map +1 -1
- package/dist/compiler/faf-compiler.js +24 -2
- package/dist/compiler/faf-compiler.js.map +1 -1
- package/dist/github/repo-selector.js +4 -4
- package/dist/github/repo-selector.js.map +1 -1
- package/dist/taf/index.d.ts +4 -0
- package/dist/taf/index.d.ts.map +1 -1
- package/dist/taf/index.js +16 -1
- package/dist/taf/index.js.map +1 -1
- package/dist/taf/star-badge.d.ts +32 -0
- package/dist/taf/star-badge.d.ts.map +1 -0
- package/dist/taf/star-badge.js +158 -0
- package/dist/taf/star-badge.js.map +1 -0
- package/dist/taf/star-rating.d.ts +30 -0
- package/dist/taf/star-rating.d.ts.map +1 -0
- package/dist/taf/star-rating.js +79 -0
- package/dist/taf/star-rating.js.map +1 -0
- package/dist/taf/test-output-parser.d.ts +42 -0
- package/dist/taf/test-output-parser.d.ts.map +1 -0
- package/dist/taf/test-output-parser.js +114 -0
- package/dist/taf/test-output-parser.js.map +1 -0
- package/dist/utils/agents-parser.d.ts +60 -0
- package/dist/utils/agents-parser.d.ts.map +1 -0
- package/dist/utils/agents-parser.js +325 -0
- package/dist/utils/agents-parser.js.map +1 -0
- package/dist/utils/cursorrules-parser.d.ts +56 -0
- package/dist/utils/cursorrules-parser.d.ts.map +1 -0
- package/dist/utils/cursorrules-parser.js +315 -0
- package/dist/utils/cursorrules-parser.js.map +1 -0
- package/package.json +1 -1
- package/project.faf +4 -4
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AGENTS.md Parser
|
|
4
|
+
*
|
|
5
|
+
* Parses OpenAI Codex / Linux Foundation AGENTS.md files for bidirectional
|
|
6
|
+
* interoperability with FAF.
|
|
7
|
+
*
|
|
8
|
+
* AGENTS.md Structure:
|
|
9
|
+
* - H1: Project name
|
|
10
|
+
* - H2: Section headers (Project Overview, Tech Stack, etc.)
|
|
11
|
+
* - Bullets: Specific guidelines
|
|
12
|
+
*
|
|
13
|
+
* @see https://github.com/anthropics/claude-code/issues/27050
|
|
14
|
+
*/
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.parseAgentsMd = parseAgentsMd;
|
|
20
|
+
exports.agentsImport = agentsImport;
|
|
21
|
+
exports.agentsExport = agentsExport;
|
|
22
|
+
exports.detectAgentsMd = detectAgentsMd;
|
|
23
|
+
exports.detectGlobalAgentsMd = detectGlobalAgentsMd;
|
|
24
|
+
const fs_1 = require("fs");
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Parsing
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Parse AGENTS.md file content
|
|
31
|
+
*/
|
|
32
|
+
function parseAgentsMd(content) {
|
|
33
|
+
// Strip BOM and normalize line endings (Windows \r\n, old Mac \r)
|
|
34
|
+
const normalized = content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
35
|
+
const lines = normalized.split('\n');
|
|
36
|
+
let projectName = 'Unknown Project';
|
|
37
|
+
const sections = [];
|
|
38
|
+
let currentSection = null;
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
// H1 = Project name
|
|
41
|
+
const h1Match = line.match(/^#\s+(?:Project:\s*)?(.+)$/);
|
|
42
|
+
if (h1Match) {
|
|
43
|
+
projectName = h1Match[1].trim();
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// H2 = Section header
|
|
47
|
+
const h2Match = line.match(/^##\s+(.+)$/);
|
|
48
|
+
if (h2Match) {
|
|
49
|
+
if (currentSection) {
|
|
50
|
+
sections.push(currentSection);
|
|
51
|
+
}
|
|
52
|
+
currentSection = {
|
|
53
|
+
title: h2Match[1].trim(),
|
|
54
|
+
content: [],
|
|
55
|
+
};
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Bullet point
|
|
59
|
+
const bulletMatch = line.match(/^[-*]\s+(.+)$/);
|
|
60
|
+
if (bulletMatch && currentSection) {
|
|
61
|
+
currentSection.content.push(bulletMatch[1].trim());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Push last section
|
|
65
|
+
if (currentSection) {
|
|
66
|
+
sections.push(currentSection);
|
|
67
|
+
}
|
|
68
|
+
return { projectName, sections };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Categorize AGENTS.md sections into FAF structure
|
|
72
|
+
*/
|
|
73
|
+
function categorizeSections(sections) {
|
|
74
|
+
const rules = [];
|
|
75
|
+
const guidelines = [];
|
|
76
|
+
const codingStyle = [];
|
|
77
|
+
const buildCommands = [];
|
|
78
|
+
const architecture = [];
|
|
79
|
+
for (const section of sections) {
|
|
80
|
+
const titleLower = section.title.toLowerCase();
|
|
81
|
+
if (titleLower.includes('build') || titleLower.includes('test') || titleLower.includes('command')) {
|
|
82
|
+
buildCommands.push(...section.content);
|
|
83
|
+
}
|
|
84
|
+
else if (titleLower.includes('architect') || titleLower.includes('structure') || titleLower.includes('design')) {
|
|
85
|
+
architecture.push(...section.content);
|
|
86
|
+
}
|
|
87
|
+
else if (titleLower.includes('coding') || titleLower.includes('style') || titleLower.includes('format') || titleLower.includes('guideline')) {
|
|
88
|
+
codingStyle.push(...section.content);
|
|
89
|
+
}
|
|
90
|
+
else if (titleLower.includes('rule') || titleLower.includes('constraint') || titleLower.includes('requirement') || titleLower.includes('warning')) {
|
|
91
|
+
rules.push(...section.content);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Default to guidelines (includes "Project Overview", "Tech Stack", etc.)
|
|
95
|
+
guidelines.push(...section.content);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { rules, guidelines, codingStyle, buildCommands, architecture };
|
|
99
|
+
}
|
|
100
|
+
// ============================================================================
|
|
101
|
+
// Import: AGENTS.md → FAF
|
|
102
|
+
// ============================================================================
|
|
103
|
+
async function agentsImport(agentsPath) {
|
|
104
|
+
const warnings = [];
|
|
105
|
+
// Check if file exists
|
|
106
|
+
try {
|
|
107
|
+
await fs_1.promises.access(agentsPath);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
faf: createEmptyFaf(),
|
|
113
|
+
warnings: [`AGENTS.md not found: ${agentsPath}`],
|
|
114
|
+
sectionsFound: [],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Read and parse
|
|
118
|
+
const content = await fs_1.promises.readFile(agentsPath, 'utf-8');
|
|
119
|
+
const parsed = parseAgentsMd(content);
|
|
120
|
+
if (parsed.sections.length === 0) {
|
|
121
|
+
warnings.push('No sections found in AGENTS.md');
|
|
122
|
+
}
|
|
123
|
+
const { rules, guidelines, codingStyle, buildCommands, architecture } = categorizeSections(parsed.sections);
|
|
124
|
+
const faf = {
|
|
125
|
+
project: {
|
|
126
|
+
name: parsed.projectName,
|
|
127
|
+
description: `Imported from AGENTS.md`,
|
|
128
|
+
type: 'agents-import',
|
|
129
|
+
rules,
|
|
130
|
+
guidelines,
|
|
131
|
+
codingStyle,
|
|
132
|
+
buildCommands,
|
|
133
|
+
architecture,
|
|
134
|
+
},
|
|
135
|
+
metadata: {
|
|
136
|
+
source: 'agents',
|
|
137
|
+
imported: new Date().toISOString(),
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
return {
|
|
141
|
+
success: true,
|
|
142
|
+
faf,
|
|
143
|
+
warnings,
|
|
144
|
+
sectionsFound: parsed.sections.map(s => s.title),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function createEmptyFaf() {
|
|
148
|
+
return {
|
|
149
|
+
project: {
|
|
150
|
+
name: 'Unknown',
|
|
151
|
+
description: '',
|
|
152
|
+
type: 'agents-import',
|
|
153
|
+
rules: [],
|
|
154
|
+
guidelines: [],
|
|
155
|
+
codingStyle: [],
|
|
156
|
+
buildCommands: [],
|
|
157
|
+
architecture: [],
|
|
158
|
+
},
|
|
159
|
+
metadata: {
|
|
160
|
+
source: 'agents',
|
|
161
|
+
imported: new Date().toISOString(),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// Export: FAF → AGENTS.md
|
|
167
|
+
// ============================================================================
|
|
168
|
+
async function agentsExport(fafContent, outputPath) {
|
|
169
|
+
const warnings = [];
|
|
170
|
+
// Build AGENTS.md content
|
|
171
|
+
const lines = [];
|
|
172
|
+
// Project header
|
|
173
|
+
const projectName = fafContent.project?.name || fafContent.name || 'My Project';
|
|
174
|
+
const projectGoal = fafContent.project?.goal || fafContent.project?.description || fafContent.ai_tldr?.project || '';
|
|
175
|
+
lines.push(`# ${projectName}`);
|
|
176
|
+
lines.push('');
|
|
177
|
+
// Project Overview section
|
|
178
|
+
lines.push('## Project Overview');
|
|
179
|
+
lines.push('');
|
|
180
|
+
if (projectGoal) {
|
|
181
|
+
lines.push(`- ${projectGoal}`);
|
|
182
|
+
}
|
|
183
|
+
if (fafContent.instant_context?.what_building) {
|
|
184
|
+
lines.push(`- ${fafContent.instant_context.what_building}`);
|
|
185
|
+
}
|
|
186
|
+
lines.push('');
|
|
187
|
+
// Tech Stack section
|
|
188
|
+
const stack = fafContent.stack || fafContent.project?.stack || {};
|
|
189
|
+
const hasStack = stack.frontend || stack.backend || stack.build || stack.runtime || stack.database;
|
|
190
|
+
if (hasStack) {
|
|
191
|
+
lines.push('## Tech Stack');
|
|
192
|
+
lines.push('');
|
|
193
|
+
if (stack.frontend)
|
|
194
|
+
lines.push(`- Frontend: ${stack.frontend}`);
|
|
195
|
+
if (stack.backend)
|
|
196
|
+
lines.push(`- Backend: ${stack.backend}`);
|
|
197
|
+
if (stack.runtime)
|
|
198
|
+
lines.push(`- Runtime: ${stack.runtime}`);
|
|
199
|
+
if (stack.build)
|
|
200
|
+
lines.push(`- Build: ${stack.build}`);
|
|
201
|
+
if (stack.database && stack.database !== 'None')
|
|
202
|
+
lines.push(`- Database: ${stack.database}`);
|
|
203
|
+
if (stack.package_manager)
|
|
204
|
+
lines.push(`- Package Manager: ${stack.package_manager}`);
|
|
205
|
+
if (stack.hosting)
|
|
206
|
+
lines.push(`- Hosting: ${stack.hosting}`);
|
|
207
|
+
if (stack.cicd)
|
|
208
|
+
lines.push(`- CI/CD: ${stack.cicd}`);
|
|
209
|
+
// Also include languages/frameworks arrays if present
|
|
210
|
+
if (stack.languages?.length > 0) {
|
|
211
|
+
lines.push(`- Languages: ${stack.languages.join(', ')}`);
|
|
212
|
+
}
|
|
213
|
+
if (stack.frameworks?.length > 0) {
|
|
214
|
+
lines.push(`- Frameworks: ${stack.frameworks.join(', ')}`);
|
|
215
|
+
}
|
|
216
|
+
lines.push('');
|
|
217
|
+
}
|
|
218
|
+
// Code Style Guidelines section
|
|
219
|
+
const warnings_list = fafContent.ai_instructions?.warnings || [];
|
|
220
|
+
const codingStyle = fafContent.project?.codingStyle || [];
|
|
221
|
+
const preferences = fafContent.preferences || {};
|
|
222
|
+
const styleItems = [...codingStyle, ...warnings_list];
|
|
223
|
+
if (preferences.quality_bar)
|
|
224
|
+
styleItems.push(`Quality bar: ${preferences.quality_bar}`);
|
|
225
|
+
if (preferences.commit_style)
|
|
226
|
+
styleItems.push(`Commit style: ${preferences.commit_style}`);
|
|
227
|
+
if (preferences.testing)
|
|
228
|
+
styleItems.push(`Testing: ${preferences.testing}`);
|
|
229
|
+
if (styleItems.length > 0) {
|
|
230
|
+
lines.push('## Code Style Guidelines');
|
|
231
|
+
lines.push('');
|
|
232
|
+
for (const item of styleItems) {
|
|
233
|
+
lines.push(`- ${item}`);
|
|
234
|
+
}
|
|
235
|
+
lines.push('');
|
|
236
|
+
}
|
|
237
|
+
// Build and Test Commands section
|
|
238
|
+
const howContext = fafContent.human_context?.how || fafContent.context?.how;
|
|
239
|
+
const buildCommands = fafContent.project?.buildCommands || [];
|
|
240
|
+
if (howContext || buildCommands.length > 0) {
|
|
241
|
+
lines.push('## Build and Test Commands');
|
|
242
|
+
lines.push('');
|
|
243
|
+
if (howContext)
|
|
244
|
+
lines.push(`- ${howContext}`);
|
|
245
|
+
for (const cmd of buildCommands) {
|
|
246
|
+
lines.push(`- ${cmd}`);
|
|
247
|
+
}
|
|
248
|
+
lines.push('');
|
|
249
|
+
}
|
|
250
|
+
// Architecture section
|
|
251
|
+
const humanContext = fafContent.human_context || {};
|
|
252
|
+
const architecture = fafContent.project?.architecture || [];
|
|
253
|
+
const archItems = [...architecture];
|
|
254
|
+
if (humanContext.what)
|
|
255
|
+
archItems.push(humanContext.what);
|
|
256
|
+
if (humanContext.where)
|
|
257
|
+
archItems.push(`Deployed: ${humanContext.where}`);
|
|
258
|
+
if (archItems.length > 0) {
|
|
259
|
+
lines.push('## Architecture');
|
|
260
|
+
lines.push('');
|
|
261
|
+
for (const item of archItems) {
|
|
262
|
+
lines.push(`- ${item}`);
|
|
263
|
+
}
|
|
264
|
+
lines.push('');
|
|
265
|
+
}
|
|
266
|
+
// General Instructions (rules + guidelines)
|
|
267
|
+
const rules = fafContent.project?.rules || [];
|
|
268
|
+
const guidelines = fafContent.project?.guidelines || [];
|
|
269
|
+
const generalInstructions = [...rules, ...guidelines];
|
|
270
|
+
if (generalInstructions.length > 0) {
|
|
271
|
+
lines.push('## General Instructions');
|
|
272
|
+
lines.push('');
|
|
273
|
+
for (const item of generalInstructions) {
|
|
274
|
+
lines.push(`- ${item}`);
|
|
275
|
+
}
|
|
276
|
+
lines.push('');
|
|
277
|
+
}
|
|
278
|
+
// Footer
|
|
279
|
+
lines.push('---');
|
|
280
|
+
lines.push(`*Generated from project.faf by faf-cli — ${new Date().toISOString().split('T')[0]}*`);
|
|
281
|
+
lines.push('');
|
|
282
|
+
// Write file
|
|
283
|
+
const content = lines.join('\n');
|
|
284
|
+
await fs_1.promises.writeFile(outputPath, content);
|
|
285
|
+
return {
|
|
286
|
+
success: true,
|
|
287
|
+
filePath: outputPath,
|
|
288
|
+
warnings,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
// ============================================================================
|
|
292
|
+
// Detection
|
|
293
|
+
// ============================================================================
|
|
294
|
+
async function detectAgentsMd(basePath) {
|
|
295
|
+
const possiblePaths = [
|
|
296
|
+
path_1.default.join(basePath, 'AGENTS.md'),
|
|
297
|
+
path_1.default.join(basePath, 'agents.md'),
|
|
298
|
+
path_1.default.join(basePath, 'Agents.md'),
|
|
299
|
+
];
|
|
300
|
+
for (const p of possiblePaths) {
|
|
301
|
+
try {
|
|
302
|
+
await fs_1.promises.access(p);
|
|
303
|
+
return p;
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Check for global AGENTS.md (~/.codex/AGENTS.md)
|
|
313
|
+
*/
|
|
314
|
+
async function detectGlobalAgentsMd() {
|
|
315
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
316
|
+
const globalPath = path_1.default.join(home, '.codex', 'AGENTS.md');
|
|
317
|
+
try {
|
|
318
|
+
await fs_1.promises.access(globalPath);
|
|
319
|
+
return globalPath;
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=agents-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-parser.js","sourceRoot":"","sources":["../../src/utils/agents-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .cursorrules Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Cursor IDE .cursorrules files for bidirectional
|
|
5
|
+
* interoperability with FAF.
|
|
6
|
+
*
|
|
7
|
+
* .cursorrules Structure:
|
|
8
|
+
* - Free-form markdown with sections
|
|
9
|
+
* - H2: Section headers (optional)
|
|
10
|
+
* - Bullets/paragraphs: Guidelines and rules
|
|
11
|
+
*
|
|
12
|
+
* Note: This generates legacy .cursorrules (single file).
|
|
13
|
+
* The new .cursor/rules/ MDC directory format is a future enhancement.
|
|
14
|
+
*/
|
|
15
|
+
export interface CursorRulesSection {
|
|
16
|
+
title: string;
|
|
17
|
+
content: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface CursorRulesFile {
|
|
20
|
+
projectName: string;
|
|
21
|
+
sections: CursorRulesSection[];
|
|
22
|
+
rawLines: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface FafFromCursor {
|
|
25
|
+
project: {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
type: string;
|
|
29
|
+
rules: string[];
|
|
30
|
+
guidelines: string[];
|
|
31
|
+
codingStyle: string[];
|
|
32
|
+
};
|
|
33
|
+
metadata: {
|
|
34
|
+
source: string;
|
|
35
|
+
imported: string;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface CursorImportResult {
|
|
39
|
+
success: boolean;
|
|
40
|
+
faf: FafFromCursor;
|
|
41
|
+
warnings: string[];
|
|
42
|
+
sectionsFound: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface CursorExportResult {
|
|
45
|
+
success: boolean;
|
|
46
|
+
filePath: string;
|
|
47
|
+
warnings: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse .cursorrules file content
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseCursorRules(content: string): CursorRulesFile;
|
|
53
|
+
export declare function cursorImport(cursorPath: string): Promise<CursorImportResult>;
|
|
54
|
+
export declare function cursorExport(fafContent: any, outputPath: string): Promise<CursorExportResult>;
|
|
55
|
+
export declare function detectCursorRules(basePath: string): Promise<string | null>;
|
|
56
|
+
//# sourceMappingURL=cursorrules-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursorrules-parser.d.ts","sourceRoot":"","sources":["../../src/utils/cursorrules-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAoDjE;AAkCD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwElF;AAuBD,wBAAsB,YAAY,CAChC,UAAU,EAAE,GAAG,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CA6G7B;AAMD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBhF"}
|