@goreal-ai/echo-pdk 0.1.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/ai-judge/index.d.ts +177 -0
- package/dist/ai-judge/index.d.ts.map +1 -0
- package/dist/ai-judge/index.js +299 -0
- package/dist/ai-judge/index.js.map +1 -0
- package/dist/evaluator/evaluator.d.ts +136 -0
- package/dist/evaluator/evaluator.d.ts.map +1 -0
- package/dist/evaluator/evaluator.js +407 -0
- package/dist/evaluator/evaluator.js.map +1 -0
- package/dist/evaluator/index.d.ts +7 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +8 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/evaluator/operators.d.ts +105 -0
- package/dist/evaluator/operators.d.ts.map +1 -0
- package/dist/evaluator/operators.js +371 -0
- package/dist/evaluator/operators.js.map +1 -0
- package/dist/index.d.ts +115 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +388 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/ast.d.ts +106 -0
- package/dist/parser/ast.d.ts.map +1 -0
- package/dist/parser/ast.js +260 -0
- package/dist/parser/ast.js.map +1 -0
- package/dist/parser/index.d.ts +8 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +13 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/lexer.d.ts +199 -0
- package/dist/parser/lexer.d.ts.map +1 -0
- package/dist/parser/lexer.js +491 -0
- package/dist/parser/lexer.js.map +1 -0
- package/dist/parser/parser.d.ts +49 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +615 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/plugins/index.d.ts +62 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +170 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/renderer/index.d.ts +6 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +5 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/renderer.d.ts +97 -0
- package/dist/renderer/renderer.d.ts.map +1 -0
- package/dist/renderer/renderer.js +243 -0
- package/dist/renderer/renderer.js.map +1 -0
- package/dist/types.d.ts +255 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Echo DSL Parser - AST Generation
|
|
3
|
+
*
|
|
4
|
+
* This file implements the parser for Echo DSL using Chevrotain.
|
|
5
|
+
* The parser converts a token stream into an Abstract Syntax Tree (AST).
|
|
6
|
+
*
|
|
7
|
+
* GRAMMAR (pseudo-BNF):
|
|
8
|
+
*
|
|
9
|
+
* template := (node)*
|
|
10
|
+
* node := text | variable | conditional | section | import | include
|
|
11
|
+
* text := TEXT
|
|
12
|
+
* variable := "{{" identifier ("??" defaultValue)? "}}"
|
|
13
|
+
* conditional := ifBlock (elseIfBlock)* (elseBlock)? endIf
|
|
14
|
+
* ifBlock := "[#IF" condition "]" (node)*
|
|
15
|
+
* elseIfBlock := "[ELSE IF" condition "]" (node)*
|
|
16
|
+
* elseBlock := "[ELSE]" (node)*
|
|
17
|
+
* endIf := "[END IF]"
|
|
18
|
+
* condition := "{{" identifier "}}" operator
|
|
19
|
+
* operator := "#" IDENTIFIER ("(" arguments ")")?
|
|
20
|
+
* arguments := value ("," value)*
|
|
21
|
+
* value := STRING | NUMBER | IDENTIFIER
|
|
22
|
+
* section := "[#SECTION" "name" "=" STRING "]" (node)* "[END SECTION]"
|
|
23
|
+
* import := "[#IMPORT" (STRING | path) "]"
|
|
24
|
+
* include := "[#INCLUDE" IDENTIFIER "]"
|
|
25
|
+
*/
|
|
26
|
+
import { CstParser } from 'chevrotain';
|
|
27
|
+
import { allTokens, tokenize, formatLexerErrors, Text, VariableOpen, VariableClose, IfOpen, ElseIf, Else, EndIf, SectionOpen, EndSection, Import, Include, Operator, Identifier, StringLiteral, NumberLiteral, LParen, RParen, CloseBracket, DefaultOp, Equals, OperatorArgText, } from './lexer.js';
|
|
28
|
+
import { createTextNode, createVariableNode, createConditionalNode, createConditionExpr, createSectionNode, createImportNode, createIncludeNode, } from './ast.js';
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// PARSER CLASS
|
|
31
|
+
// =============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Echo CST Parser
|
|
34
|
+
*
|
|
35
|
+
* Parses Echo template tokens into a Concrete Syntax Tree (CST).
|
|
36
|
+
* The CST is then transformed into our AST format using the visitor.
|
|
37
|
+
*/
|
|
38
|
+
class EchoParser extends CstParser {
|
|
39
|
+
constructor() {
|
|
40
|
+
super(allTokens, {
|
|
41
|
+
recoveryEnabled: true,
|
|
42
|
+
nodeLocationTracking: 'full',
|
|
43
|
+
});
|
|
44
|
+
this.performSelfAnalysis();
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// GRAMMAR RULES
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Top-level rule: a template is a sequence of nodes
|
|
51
|
+
*/
|
|
52
|
+
template = this.RULE('template', () => {
|
|
53
|
+
this.MANY(() => {
|
|
54
|
+
this.SUBRULE(this.node);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* A node can be text, variable, conditional, section, import, or include
|
|
59
|
+
*/
|
|
60
|
+
node = this.RULE('node', () => {
|
|
61
|
+
this.OR([
|
|
62
|
+
{ ALT: () => this.SUBRULE(this.textNode) },
|
|
63
|
+
{ ALT: () => this.SUBRULE(this.variableNode) },
|
|
64
|
+
{ ALT: () => this.SUBRULE(this.conditionalNode) },
|
|
65
|
+
{ ALT: () => this.SUBRULE(this.sectionNode) },
|
|
66
|
+
{ ALT: () => this.SUBRULE(this.importNode) },
|
|
67
|
+
{ ALT: () => this.SUBRULE(this.includeNode) },
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
* Plain text node
|
|
72
|
+
*/
|
|
73
|
+
textNode = this.RULE('textNode', () => {
|
|
74
|
+
this.CONSUME(Text);
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Variable reference: {{path}} or {{path ?? "default"}}
|
|
78
|
+
*/
|
|
79
|
+
variableNode = this.RULE('variableNode', () => {
|
|
80
|
+
this.CONSUME(VariableOpen);
|
|
81
|
+
this.CONSUME(Identifier);
|
|
82
|
+
this.OPTION(() => {
|
|
83
|
+
this.CONSUME(DefaultOp);
|
|
84
|
+
this.OR([
|
|
85
|
+
{ ALT: () => this.CONSUME(StringLiteral) },
|
|
86
|
+
{ ALT: () => this.CONSUME(NumberLiteral) },
|
|
87
|
+
]);
|
|
88
|
+
});
|
|
89
|
+
this.CONSUME(VariableClose);
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* Conditional block: [#IF condition]...[ELSE IF]...[ELSE]...[END IF]
|
|
93
|
+
*/
|
|
94
|
+
conditionalNode = this.RULE('conditionalNode', () => {
|
|
95
|
+
// [#IF condition]
|
|
96
|
+
this.CONSUME(IfOpen);
|
|
97
|
+
this.SUBRULE(this.condition);
|
|
98
|
+
this.CONSUME(CloseBracket);
|
|
99
|
+
// Body nodes
|
|
100
|
+
this.MANY(() => {
|
|
101
|
+
this.SUBRULE(this.node);
|
|
102
|
+
});
|
|
103
|
+
// Optional ELSE IF blocks
|
|
104
|
+
this.MANY2(() => {
|
|
105
|
+
this.SUBRULE(this.elseIfBlock);
|
|
106
|
+
});
|
|
107
|
+
// Optional ELSE block
|
|
108
|
+
this.OPTION(() => {
|
|
109
|
+
this.SUBRULE(this.elseBlock);
|
|
110
|
+
});
|
|
111
|
+
// [END IF]
|
|
112
|
+
this.CONSUME(EndIf);
|
|
113
|
+
});
|
|
114
|
+
/**
|
|
115
|
+
* ELSE IF block
|
|
116
|
+
*/
|
|
117
|
+
elseIfBlock = this.RULE('elseIfBlock', () => {
|
|
118
|
+
this.CONSUME(ElseIf);
|
|
119
|
+
this.SUBRULE(this.condition);
|
|
120
|
+
this.CONSUME(CloseBracket);
|
|
121
|
+
this.MANY(() => {
|
|
122
|
+
this.SUBRULE(this.node);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
/**
|
|
126
|
+
* ELSE block
|
|
127
|
+
*/
|
|
128
|
+
elseBlock = this.RULE('elseBlock', () => {
|
|
129
|
+
this.CONSUME(Else);
|
|
130
|
+
this.MANY(() => {
|
|
131
|
+
this.SUBRULE(this.node);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Condition expression: {{var}} #operator(arg)
|
|
136
|
+
*/
|
|
137
|
+
condition = this.RULE('condition', () => {
|
|
138
|
+
// Variable being tested
|
|
139
|
+
this.CONSUME(VariableOpen);
|
|
140
|
+
this.CONSUME(Identifier);
|
|
141
|
+
this.CONSUME(VariableClose);
|
|
142
|
+
// Operator
|
|
143
|
+
this.CONSUME(Operator);
|
|
144
|
+
// Optional arguments - free-form text
|
|
145
|
+
this.OPTION(() => {
|
|
146
|
+
this.CONSUME(LParen);
|
|
147
|
+
this.OPTION2(() => {
|
|
148
|
+
this.CONSUME(OperatorArgText);
|
|
149
|
+
});
|
|
150
|
+
this.CONSUME(RParen);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
/**
|
|
154
|
+
* Section definition: [#SECTION name="..."]...[END SECTION]
|
|
155
|
+
*/
|
|
156
|
+
sectionNode = this.RULE('sectionNode', () => {
|
|
157
|
+
this.CONSUME(SectionOpen);
|
|
158
|
+
this.CONSUME(Identifier); // "name"
|
|
159
|
+
this.CONSUME(Equals);
|
|
160
|
+
this.CONSUME(StringLiteral); // "value"
|
|
161
|
+
this.CONSUME(CloseBracket);
|
|
162
|
+
this.MANY(() => {
|
|
163
|
+
this.SUBRULE(this.node);
|
|
164
|
+
});
|
|
165
|
+
this.CONSUME(EndSection);
|
|
166
|
+
});
|
|
167
|
+
/**
|
|
168
|
+
* Import directive: [#IMPORT path]
|
|
169
|
+
*/
|
|
170
|
+
importNode = this.RULE('importNode', () => {
|
|
171
|
+
this.CONSUME(Import);
|
|
172
|
+
this.OR([
|
|
173
|
+
{ ALT: () => this.CONSUME(StringLiteral) },
|
|
174
|
+
{ ALT: () => this.CONSUME(Identifier) },
|
|
175
|
+
]);
|
|
176
|
+
this.CONSUME(CloseBracket);
|
|
177
|
+
});
|
|
178
|
+
/**
|
|
179
|
+
* Include directive: [#INCLUDE name]
|
|
180
|
+
*/
|
|
181
|
+
includeNode = this.RULE('includeNode', () => {
|
|
182
|
+
this.CONSUME(Include);
|
|
183
|
+
this.CONSUME(Identifier);
|
|
184
|
+
this.CONSUME(CloseBracket);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// =============================================================================
|
|
188
|
+
// PARSER INSTANCE
|
|
189
|
+
// =============================================================================
|
|
190
|
+
const parserInstance = new EchoParser();
|
|
191
|
+
// =============================================================================
|
|
192
|
+
// CST TO AST VISITOR
|
|
193
|
+
// =============================================================================
|
|
194
|
+
/**
|
|
195
|
+
* Get the base CST visitor class from our parser instance.
|
|
196
|
+
*/
|
|
197
|
+
const BaseCstVisitor = parserInstance.getBaseCstVisitorConstructor();
|
|
198
|
+
/**
|
|
199
|
+
* Default source location for fallback.
|
|
200
|
+
*/
|
|
201
|
+
const defaultLocation = {
|
|
202
|
+
startLine: 1,
|
|
203
|
+
startColumn: 1,
|
|
204
|
+
endLine: 1,
|
|
205
|
+
endColumn: 1,
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* CST Visitor that transforms the Concrete Syntax Tree into our AST.
|
|
209
|
+
*/
|
|
210
|
+
class EchoAstVisitor extends BaseCstVisitor {
|
|
211
|
+
constructor() {
|
|
212
|
+
super();
|
|
213
|
+
this.validateVisitor();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Visit the root template rule.
|
|
217
|
+
*/
|
|
218
|
+
template(ctx) {
|
|
219
|
+
const nodes = [];
|
|
220
|
+
if (ctx.node) {
|
|
221
|
+
for (const nodeCtx of ctx.node) {
|
|
222
|
+
const node = this.visit(nodeCtx);
|
|
223
|
+
if (node) {
|
|
224
|
+
nodes.push(node);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return nodes;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Visit a node (dispatches to specific node type).
|
|
232
|
+
*/
|
|
233
|
+
node(ctx) {
|
|
234
|
+
if (ctx.textNode?.[0]) {
|
|
235
|
+
return this.visit(ctx.textNode[0]);
|
|
236
|
+
}
|
|
237
|
+
if (ctx.variableNode?.[0]) {
|
|
238
|
+
return this.visit(ctx.variableNode[0]);
|
|
239
|
+
}
|
|
240
|
+
if (ctx.conditionalNode?.[0]) {
|
|
241
|
+
return this.visit(ctx.conditionalNode[0]);
|
|
242
|
+
}
|
|
243
|
+
if (ctx.sectionNode?.[0]) {
|
|
244
|
+
return this.visit(ctx.sectionNode[0]);
|
|
245
|
+
}
|
|
246
|
+
if (ctx.importNode?.[0]) {
|
|
247
|
+
return this.visit(ctx.importNode[0]);
|
|
248
|
+
}
|
|
249
|
+
if (ctx.includeNode?.[0]) {
|
|
250
|
+
return this.visit(ctx.includeNode[0]);
|
|
251
|
+
}
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Visit a text node.
|
|
256
|
+
*/
|
|
257
|
+
textNode(ctx) {
|
|
258
|
+
const token = ctx.Text?.[0];
|
|
259
|
+
if (!token) {
|
|
260
|
+
return createTextNode('', defaultLocation);
|
|
261
|
+
}
|
|
262
|
+
return createTextNode(token.image, getTokenLocation(token));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Visit a variable node.
|
|
266
|
+
*/
|
|
267
|
+
variableNode(ctx) {
|
|
268
|
+
const openToken = ctx.VariableOpen?.[0];
|
|
269
|
+
const closeToken = ctx.VariableClose?.[0];
|
|
270
|
+
const identifierToken = ctx.Identifier?.[0];
|
|
271
|
+
if (!identifierToken) {
|
|
272
|
+
return createVariableNode('', defaultLocation);
|
|
273
|
+
}
|
|
274
|
+
const path = identifierToken.image;
|
|
275
|
+
let defaultValue;
|
|
276
|
+
if (ctx.DefaultOp && (ctx.StringLiteral || ctx.NumberLiteral)) {
|
|
277
|
+
const valueToken = ctx.StringLiteral?.[0] ?? ctx.NumberLiteral?.[0];
|
|
278
|
+
if (valueToken) {
|
|
279
|
+
defaultValue = stripQuotes(valueToken.image);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const location = openToken && closeToken
|
|
283
|
+
? mergeLocations(getTokenLocation(openToken), getTokenLocation(closeToken))
|
|
284
|
+
: getTokenLocation(identifierToken);
|
|
285
|
+
return createVariableNode(path, location, defaultValue);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Visit a conditional node.
|
|
289
|
+
*/
|
|
290
|
+
conditionalNode(ctx) {
|
|
291
|
+
const ifOpenToken = ctx.IfOpen?.[0];
|
|
292
|
+
const endIfToken = ctx.EndIf?.[0];
|
|
293
|
+
// Parse the main condition
|
|
294
|
+
const conditionCtx = ctx.condition?.[0];
|
|
295
|
+
const condition = conditionCtx
|
|
296
|
+
? this.visit(conditionCtx)
|
|
297
|
+
: createConditionExpr('', 'exists');
|
|
298
|
+
// Parse body nodes
|
|
299
|
+
const consequent = [];
|
|
300
|
+
if (ctx.node) {
|
|
301
|
+
for (const nodeCtx of ctx.node) {
|
|
302
|
+
const node = this.visit(nodeCtx);
|
|
303
|
+
if (node) {
|
|
304
|
+
consequent.push(node);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Build the alternate chain (ELSE IF and ELSE blocks)
|
|
309
|
+
let alternate;
|
|
310
|
+
// Handle ELSE block (process first as it's the end of the chain)
|
|
311
|
+
if (ctx.elseBlock?.[0]) {
|
|
312
|
+
const elseNodes = this.visit(ctx.elseBlock[0]);
|
|
313
|
+
alternate = elseNodes;
|
|
314
|
+
}
|
|
315
|
+
// Handle ELSE IF blocks (in reverse order to build the chain)
|
|
316
|
+
if (ctx.elseIfBlock) {
|
|
317
|
+
for (let i = ctx.elseIfBlock.length - 1; i >= 0; i--) {
|
|
318
|
+
const elseIfCtx = ctx.elseIfBlock[i];
|
|
319
|
+
if (elseIfCtx) {
|
|
320
|
+
const elseIfResult = this.visitElseIfBlockWithAlternate(elseIfCtx, alternate);
|
|
321
|
+
alternate = elseIfResult;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const location = ifOpenToken && endIfToken
|
|
326
|
+
? mergeLocations(getTokenLocation(ifOpenToken), getTokenLocation(endIfToken))
|
|
327
|
+
: defaultLocation;
|
|
328
|
+
return createConditionalNode(condition, consequent, location, alternate);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Visit an ELSE IF block and create a ConditionalNode with alternate.
|
|
332
|
+
*
|
|
333
|
+
* This method handles the CstNode structure from Chevrotain, using runtime
|
|
334
|
+
* validation to safely access the children property.
|
|
335
|
+
*/
|
|
336
|
+
visitElseIfBlockWithAlternate(ctx, nextAlternate) {
|
|
337
|
+
// Safely extract children with runtime validation
|
|
338
|
+
const children = getCstChildren(ctx, 'elseIfBlock');
|
|
339
|
+
const elseIfToken = children.ElseIf?.[0];
|
|
340
|
+
const closeBracketToken = children.CloseBracket?.[0];
|
|
341
|
+
const conditionCtx = children.condition?.[0];
|
|
342
|
+
const condition = conditionCtx
|
|
343
|
+
? this.visit(conditionCtx)
|
|
344
|
+
: createConditionExpr('', 'exists');
|
|
345
|
+
const consequent = [];
|
|
346
|
+
if (children.node) {
|
|
347
|
+
for (const nodeCtx of children.node) {
|
|
348
|
+
const node = this.visit(nodeCtx);
|
|
349
|
+
if (node) {
|
|
350
|
+
consequent.push(node);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const location = elseIfToken && closeBracketToken
|
|
355
|
+
? mergeLocations(getTokenLocation(elseIfToken), getTokenLocation(closeBracketToken))
|
|
356
|
+
: defaultLocation;
|
|
357
|
+
return createConditionalNode(condition, consequent, location, nextAlternate);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Visit an ELSE IF block.
|
|
361
|
+
*
|
|
362
|
+
* NOTE: This method exists to satisfy Chevrotain's visitor validation but should
|
|
363
|
+
* never be called directly. ELSE IF blocks are only meaningful within the context
|
|
364
|
+
* of a conditional chain, where they need the `nextAlternate` parameter.
|
|
365
|
+
*
|
|
366
|
+
* Use `visitElseIfBlockWithAlternate` instead, which is called from `conditionalNode`
|
|
367
|
+
* to properly build the ELSE IF chain with alternates.
|
|
368
|
+
*
|
|
369
|
+
* @throws Error always - this method should not be called directly
|
|
370
|
+
*/
|
|
371
|
+
elseIfBlock(_ctx) {
|
|
372
|
+
throw new Error('elseIfBlock visitor should not be called directly. ' +
|
|
373
|
+
'ELSE IF blocks are processed via visitElseIfBlockWithAlternate from conditionalNode.');
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Visit an ELSE block.
|
|
377
|
+
*/
|
|
378
|
+
elseBlock(ctx) {
|
|
379
|
+
const nodes = [];
|
|
380
|
+
if (ctx.node) {
|
|
381
|
+
for (const nodeCtx of ctx.node) {
|
|
382
|
+
const node = this.visit(nodeCtx);
|
|
383
|
+
if (node) {
|
|
384
|
+
nodes.push(node);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return nodes;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Visit a condition expression.
|
|
392
|
+
*/
|
|
393
|
+
condition(ctx) {
|
|
394
|
+
const identifierToken = ctx.Identifier?.[0];
|
|
395
|
+
const operatorToken = ctx.Operator?.[0];
|
|
396
|
+
const variable = identifierToken?.image ?? '';
|
|
397
|
+
const operator = (operatorToken?.image ?? '#exists').replace(/^#/, '');
|
|
398
|
+
let argument;
|
|
399
|
+
// Get the free-form argument text
|
|
400
|
+
const argTextToken = ctx.OperatorArgText?.[0];
|
|
401
|
+
if (argTextToken) {
|
|
402
|
+
let argText = argTextToken.image.trim();
|
|
403
|
+
// Strip surrounding quotes if present (backwards compatibility)
|
|
404
|
+
argText = stripQuotes(argText);
|
|
405
|
+
// Check if it looks like a number
|
|
406
|
+
const num = parseFloat(argText);
|
|
407
|
+
if (!isNaN(num) && String(num) === argText) {
|
|
408
|
+
argument = num;
|
|
409
|
+
}
|
|
410
|
+
// Check if it contains commas (for list operators like #one_of)
|
|
411
|
+
else if (argText.includes(',')) {
|
|
412
|
+
argument = argText.split(',').map(s => stripQuotes(s.trim()));
|
|
413
|
+
}
|
|
414
|
+
// Otherwise treat as plain text
|
|
415
|
+
else {
|
|
416
|
+
argument = argText;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return createConditionExpr(variable, operator, argument);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Visit a section node.
|
|
423
|
+
*/
|
|
424
|
+
sectionNode(ctx) {
|
|
425
|
+
const sectionOpenToken = ctx.SectionOpen?.[0];
|
|
426
|
+
const endSectionToken = ctx.EndSection?.[0];
|
|
427
|
+
const nameToken = ctx.StringLiteral?.[0];
|
|
428
|
+
const name = nameToken ? stripQuotes(nameToken.image) : '';
|
|
429
|
+
const body = [];
|
|
430
|
+
if (ctx.node) {
|
|
431
|
+
for (const nodeCtx of ctx.node) {
|
|
432
|
+
const node = this.visit(nodeCtx);
|
|
433
|
+
if (node) {
|
|
434
|
+
body.push(node);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const location = sectionOpenToken && endSectionToken
|
|
439
|
+
? mergeLocations(getTokenLocation(sectionOpenToken), getTokenLocation(endSectionToken))
|
|
440
|
+
: defaultLocation;
|
|
441
|
+
return createSectionNode(name, body, location);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Visit an import node.
|
|
445
|
+
*/
|
|
446
|
+
importNode(ctx) {
|
|
447
|
+
const importToken = ctx.Import?.[0];
|
|
448
|
+
const closeBracketToken = ctx.CloseBracket?.[0];
|
|
449
|
+
let path;
|
|
450
|
+
if (ctx.StringLiteral?.[0]) {
|
|
451
|
+
path = stripQuotes(ctx.StringLiteral[0].image);
|
|
452
|
+
}
|
|
453
|
+
else if (ctx.Identifier?.[0]) {
|
|
454
|
+
path = ctx.Identifier[0].image;
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
path = '';
|
|
458
|
+
}
|
|
459
|
+
const location = importToken && closeBracketToken
|
|
460
|
+
? mergeLocations(getTokenLocation(importToken), getTokenLocation(closeBracketToken))
|
|
461
|
+
: defaultLocation;
|
|
462
|
+
return createImportNode(path, location);
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Visit an include node.
|
|
466
|
+
*/
|
|
467
|
+
includeNode(ctx) {
|
|
468
|
+
const includeToken = ctx.Include?.[0];
|
|
469
|
+
const closeBracketToken = ctx.CloseBracket?.[0];
|
|
470
|
+
const identifierToken = ctx.Identifier?.[0];
|
|
471
|
+
const name = identifierToken?.image ?? '';
|
|
472
|
+
const location = includeToken && closeBracketToken
|
|
473
|
+
? mergeLocations(getTokenLocation(includeToken), getTokenLocation(closeBracketToken))
|
|
474
|
+
: defaultLocation;
|
|
475
|
+
return createIncludeNode(name, location);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// Create singleton visitor instance
|
|
479
|
+
const astVisitor = new EchoAstVisitor();
|
|
480
|
+
// =============================================================================
|
|
481
|
+
// UTILITY FUNCTIONS
|
|
482
|
+
// =============================================================================
|
|
483
|
+
/**
|
|
484
|
+
* Safely extract children from a CstNode with runtime validation.
|
|
485
|
+
*
|
|
486
|
+
* Chevrotain's CstNode has a `children` property containing the parsed elements.
|
|
487
|
+
* This helper provides type-safe access with runtime validation to guard against
|
|
488
|
+
* unexpected structure changes.
|
|
489
|
+
*
|
|
490
|
+
* @param ctx - The CstNode to extract children from
|
|
491
|
+
* @param expectedRule - Optional rule name to validate (for better error messages)
|
|
492
|
+
* @returns The children object, typed as T
|
|
493
|
+
* @throws Error if children property is missing or invalid
|
|
494
|
+
*/
|
|
495
|
+
function getCstChildren(ctx, expectedRule) {
|
|
496
|
+
if (!ctx || typeof ctx !== 'object') {
|
|
497
|
+
throw new Error(`Invalid CST node${expectedRule ? ` for rule "${expectedRule}"` : ''}: expected object, got ${typeof ctx}`);
|
|
498
|
+
}
|
|
499
|
+
if (!('children' in ctx)) {
|
|
500
|
+
throw new Error(`Invalid CST node${expectedRule ? ` for rule "${expectedRule}"` : ''}: missing "children" property`);
|
|
501
|
+
}
|
|
502
|
+
const children = ctx.children;
|
|
503
|
+
if (!children || typeof children !== 'object') {
|
|
504
|
+
throw new Error(`Invalid CST node${expectedRule ? ` for rule "${expectedRule}"` : ''}: "children" must be an object`);
|
|
505
|
+
}
|
|
506
|
+
return children;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Extract source location from a token.
|
|
510
|
+
*/
|
|
511
|
+
export function getTokenLocation(token) {
|
|
512
|
+
return {
|
|
513
|
+
startLine: token.startLine ?? 1,
|
|
514
|
+
startColumn: token.startColumn ?? 1,
|
|
515
|
+
endLine: token.endLine ?? 1,
|
|
516
|
+
endColumn: token.endColumn ?? 1,
|
|
517
|
+
source: token.image,
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Merge two source locations into one spanning both.
|
|
522
|
+
*/
|
|
523
|
+
function mergeLocations(start, end) {
|
|
524
|
+
return {
|
|
525
|
+
startLine: start.startLine,
|
|
526
|
+
startColumn: start.startColumn,
|
|
527
|
+
endLine: end.endLine,
|
|
528
|
+
endColumn: end.endColumn,
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Strip quotes from a string literal token.
|
|
533
|
+
*/
|
|
534
|
+
function stripQuotes(str) {
|
|
535
|
+
if ((str.startsWith('"') && str.endsWith('"')) ||
|
|
536
|
+
(str.startsWith("'") && str.endsWith("'"))) {
|
|
537
|
+
return str.slice(1, -1);
|
|
538
|
+
}
|
|
539
|
+
return str;
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Format parser errors for display.
|
|
543
|
+
*/
|
|
544
|
+
function formatParserErrors(errors) {
|
|
545
|
+
return errors.map((error) => {
|
|
546
|
+
const token = error.token;
|
|
547
|
+
return {
|
|
548
|
+
code: 'PARSE_ERROR',
|
|
549
|
+
message: error.message,
|
|
550
|
+
location: token ? getTokenLocation(token) : undefined,
|
|
551
|
+
};
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
// =============================================================================
|
|
555
|
+
// PUBLIC API
|
|
556
|
+
// =============================================================================
|
|
557
|
+
/**
|
|
558
|
+
* Parse an Echo template into an AST.
|
|
559
|
+
*
|
|
560
|
+
* @param template - The Echo template string
|
|
561
|
+
* @returns ParseResult with AST or errors
|
|
562
|
+
*
|
|
563
|
+
* @example
|
|
564
|
+
* ```typescript
|
|
565
|
+
* const result = parse('Hello {{name}}!');
|
|
566
|
+
* if (result.success) {
|
|
567
|
+
* console.log('AST:', result.ast);
|
|
568
|
+
* } else {
|
|
569
|
+
* console.error('Errors:', result.errors);
|
|
570
|
+
* }
|
|
571
|
+
* ```
|
|
572
|
+
*/
|
|
573
|
+
export function parse(template) {
|
|
574
|
+
// Step 1: Tokenize the input
|
|
575
|
+
const lexResult = tokenize(template);
|
|
576
|
+
if (lexResult.errors.length > 0) {
|
|
577
|
+
return {
|
|
578
|
+
success: false,
|
|
579
|
+
errors: formatLexerErrors(lexResult.errors).map((msg) => ({
|
|
580
|
+
code: 'LEXER_ERROR',
|
|
581
|
+
message: msg,
|
|
582
|
+
})),
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
// Step 2: Parse tokens to CST
|
|
586
|
+
parserInstance.input = lexResult.tokens;
|
|
587
|
+
const cst = parserInstance.template();
|
|
588
|
+
if (parserInstance.errors.length > 0) {
|
|
589
|
+
return {
|
|
590
|
+
success: false,
|
|
591
|
+
errors: formatParserErrors(parserInstance.errors),
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
// Step 3: Transform CST to AST
|
|
595
|
+
try {
|
|
596
|
+
const ast = astVisitor.visit(cst);
|
|
597
|
+
return {
|
|
598
|
+
success: true,
|
|
599
|
+
ast,
|
|
600
|
+
errors: [],
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
catch (error) {
|
|
604
|
+
return {
|
|
605
|
+
success: false,
|
|
606
|
+
errors: [
|
|
607
|
+
{
|
|
608
|
+
code: 'AST_ERROR',
|
|
609
|
+
message: error instanceof Error ? error.message : 'Unknown AST transformation error',
|
|
610
|
+
},
|
|
611
|
+
],
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAC;AASlE,OAAO,EACL,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,WAAW,EACX,UAAU,EACV,MAAM,EACN,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,MAAM,EACN,MAAM,EACN,YAAY,EACZ,SAAS,EACT,MAAM,EACN,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAElB,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAW,SAAQ,SAAS;IAChC;QACE,KAAK,CAAC,SAAS,EAAE;YACf,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,MAAM;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,8EAA8E;IAC9E,gBAAgB;IAChB,8EAA8E;IAE9E;;OAEG;IACI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,EAAE,CAAC;YACN,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC1C,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAC9C,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;YACjD,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC7C,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC5C,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;QACpD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC;gBACN,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAC1C,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;aAC3C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC1D,kBAAkB;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE3B,aAAa;QACb,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,WAAW;QACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QAC9C,wBAAwB;QACxB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAE5B,WAAW;QACX,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvB,sCAAsC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QAClD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU;QACvC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;QAChD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC;YACN,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;YAC1C,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH;;OAEG;IACK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QAClD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;CACJ;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,MAAM,cAAc,GAAG,IAAI,UAAU,EAAE,CAAC;AAExC,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,cAAc,GAAG,cAAc,CAAC,4BAA4B,EAAE,CAAC;AAErE;;GAEG;AACH,MAAM,eAAe,GAAmB;IACtC,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,cAAe,SAAQ,cAAc;IACzC;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAuB;QAC9B,MAAM,KAAK,GAAc,EAAE,CAAC;QAE5B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAmB;QACtB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAuB;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,cAAc,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,GAA2B;QACtC,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5C,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,kBAAkB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC;QAEnC,IAAI,YAAgC,CAAC;QACrC,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;YACpE,IAAI,UAAU,EAAE,CAAC;gBACf,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,IAAI,UAAU;YACtC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC3E,CAAC,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAEtC,OAAO,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,GAA8B;QAC5C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAElC,2BAA2B;QAC3B,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY;YAC5B,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAmB;YAC7C,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEtC,mBAAmB;QACnB,MAAM,UAAU,GAAc,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,EAAE,CAAC;oBACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,SAAkD,CAAC;QAEvD,iEAAiE;QACjE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAc,CAAC;YAC5D,SAAS,GAAG,SAAS,CAAC;QACxB,CAAC;QAED,8DAA8D;QAC9D,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACrC,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,YAAY,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;oBAC9E,SAAS,GAAG,YAAY,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,IAAI,UAAU;YACxC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC7E,CAAC,CAAC,eAAe,CAAC;QAEpB,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;OAKG;IACK,6BAA6B,CACnC,GAAY,EACZ,aAA2C;QAE3C,kDAAkD;QAClD,MAAM,QAAQ,GAAG,cAAc,CAAwB,GAAG,EAAE,aAAa,CAAC,CAAC;QAE3E,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QAErD,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,YAAY;YAC5B,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAmB;YAC7C,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEtC,MAAM,UAAU,GAAc,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,EAAE,CAAC;oBACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,IAAI,iBAAiB;YAC/C,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACpF,CAAC,CAAC,eAAe,CAAC;QAEpB,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC/E,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,IAA2B;QACrC,MAAM,IAAI,KAAK,CACb,qDAAqD;YACrD,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAwB;QAChC,MAAM,KAAK,GAAc,EAAE,CAAC;QAE5B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAwB;QAChC,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAG,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEvE,IAAI,QAAgD,CAAC;QAErD,kCAAkC;QAClC,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAExC,gEAAgE;YAChE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAE/B,kCAAkC;YAClC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC3C,QAAQ,GAAG,GAAG,CAAC;YACjB,CAAC;YACD,gEAAgE;iBAC3D,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,gCAAgC;iBAC3B,CAAC;gBACJ,QAAQ,GAAG,OAAO,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAA0B;QACpC,MAAM,gBAAgB,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3D,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,IAAI,eAAe;YAClD,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACvF,CAAC,CAAC,eAAe,CAAC;QAEpB,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,GAAyB;QAClC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,iBAAiB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhD,IAAI,IAAY,CAAC;QACjB,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,IAAI,iBAAiB;YAC/C,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACpF,CAAC,CAAC,eAAe,CAAC;QAEpB,OAAO,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAA0B;QACpC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,iBAAiB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC;QAE1C,MAAM,QAAQ,GAAG,YAAY,IAAI,iBAAiB;YAChD,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACrF,CAAC,CAAC,eAAe,CAAC;QAEpB,OAAO,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,oCAAoC;AACpC,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;AAuFxC,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,SAAS,cAAc,CAAI,GAAY,EAAE,YAAqB;IAC5D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,mBAAmB,YAAY,CAAC,CAAC,CAAC,cAAc,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,0BAA0B,OAAO,GAAG,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,mBAAmB,YAAY,CAAC,CAAC,CAAC,cAAc,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,+BAA+B,CACpG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC9B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,mBAAmB,YAAY,CAAC,CAAC,CAAC,cAAc,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,gCAAgC,CACrG,CAAC;IACJ,CAAC;IAED,OAAO,QAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;QAC/B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;QACnC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;QAC3B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;QAC/B,MAAM,EAAE,KAAK,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAqB,EAAE,GAAmB;IAChE,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAoC;IAC9D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;SACtD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,KAAK,CAAC,QAAgB;IACpC,6BAA6B;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxD,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,cAAc,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IACxC,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAEtC,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAE/C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG;YACH,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC;iBACrF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|