@lithent/lithent-template-parser 0.1.0 → 0.1.1
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 +1 -1
- package/dist/codegen/createElement.d.cts +10 -0
- package/dist/codegen/createElement.d.ts +1 -1
- package/dist/codegen/index.d.cts +1 -0
- package/dist/codegen/index.d.ts +1 -1
- package/dist/compiler.d.cts +26 -0
- package/dist/compiler.d.ts +8 -8
- package/dist/docPipe/index.d.cts +40 -0
- package/dist/docPipe/index.d.ts +2 -2
- package/dist/docPipe/scan.d.cts +8 -0
- package/dist/docPipe/scan.d.ts +2 -0
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +9 -9
- package/dist/index.mjs +955 -1192
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.cjs +12 -12
- package/dist/index.umd.cjs.map +1 -1
- package/dist/parser/ast.d.cts +207 -0
- package/dist/parser/ast.d.ts +1 -1
- package/dist/parser/lexer.d.cts +109 -0
- package/dist/parser/lexer.d.ts +1 -1
- package/dist/parser/parser.d.cts +80 -0
- package/dist/parser/parser.d.ts +5 -4
- package/dist/parser/tokens.d.cts +51 -0
- package/dist/transform/directives.d.cts +30 -0
- package/dist/transform/directives.d.ts +1 -1
- package/dist/transform/index.d.cts +14 -0
- package/dist/transform/index.d.ts +5 -5
- package/dist/transform/optimize.d.cts +21 -0
- package/dist/transform/optimize.d.ts +1 -1
- package/package.json +2 -2
- package/src/codegen/createElement.ts +48 -332
- package/src/compiler.ts +1 -1
- package/src/docPipe/scan.ts +209 -246
- package/src/parser/lexer.ts +41 -91
- package/src/parser/parser.ts +45 -39
- package/src/tests/compiler.test.ts +2 -2
- package/src/tests/parser.test.ts +2 -2
- package/src/tests/regressions.test.ts +200 -0
- package/src/transform/directives.ts +25 -2
- package/src/transform/optimize.ts +37 -25
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/parser/tokens.ts","../src/parser/lexer.ts","../src/parser/ast.ts","../src/parser/parser.ts","../src/transform/directives.ts","../src/transform/optimize.ts","../src/transform/index.ts","../src/codegen/createElement.ts","../src/compiler.ts","../../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs","../../../node_modules/.pnpm/magic-string@0.30.19/node_modules/magic-string/dist/magic-string.es.mjs","../src/docPipe/scan.ts","../src/docPipe/index.ts"],"sourcesContent":["/**\n * Token types for Lithent template lexer\n */\nexport enum TokenType {\n // Tag tokens\n TAG_OPEN_START = 'TAG_OPEN_START', // <\n TAG_OPEN_END = 'TAG_OPEN_END', // >\n TAG_CLOSE_START = 'TAG_CLOSE_START', // </\n TAG_SELF_CLOSE = 'TAG_SELF_CLOSE', // />\n\n // Identifiers and values\n IDENTIFIER = 'IDENTIFIER', // tag names, attribute names\n ATTRIBUTE_EQUALS = 'ATTRIBUTE_EQUALS', // =\n STRING_LITERAL = 'STRING_LITERAL', // \"...\" or '...'\n\n // Expressions\n EXPRESSION_START = 'EXPRESSION_START', // {\n EXPRESSION_END = 'EXPRESSION_END', // }\n EXPRESSION_CONTENT = 'EXPRESSION_CONTENT', // JavaScript code inside {}\n\n // Directives\n DIRECTIVE_IF = 'DIRECTIVE_IF', // l-if\n DIRECTIVE_ELSE_IF = 'DIRECTIVE_ELSE_IF', // l-else-if\n DIRECTIVE_ELSE = 'DIRECTIVE_ELSE', // l-else\n DIRECTIVE_FOR = 'DIRECTIVE_FOR', // l-for\n\n // Fragments\n FRAGMENT_OPEN = 'FRAGMENT_OPEN', // <>\n FRAGMENT_CLOSE = 'FRAGMENT_CLOSE', // </>\n\n KEYWORD_REF = 'KEYWORD_REF', // ref\n\n // Text and comments\n TEXT = 'TEXT', // text content\n COMMENT = 'COMMENT', // <!-- ... -->\n\n // Whitespace\n WHITESPACE = 'WHITESPACE',\n\n // End of file\n EOF = 'EOF',\n}\n\n/**\n * Position information for error reporting\n */\nexport interface Position {\n line: number;\n column: number;\n offset: number;\n}\n\n/**\n * Token interface\n */\nexport interface Token {\n type: TokenType;\n value: string;\n start: Position;\n end: Position;\n}\n\n/**\n * Create a position object\n */\nexport function createPosition(\n line: number,\n column: number,\n offset: number\n): Position {\n return { line, column, offset };\n}\n\n/**\n * Create a token\n */\nexport function createToken(\n type: TokenType,\n value: string,\n start: Position,\n end: Position\n): Token {\n return { type, value, start, end };\n}\n","import {\n Token,\n TokenType,\n Position,\n createPosition,\n createToken,\n} from './tokens';\n\n/**\n * Lexer for Lithent templates\n * Converts template string into a stream of tokens\n */\nexport class Lexer {\n private input: string;\n private position: number = 0;\n private line: number = 1;\n private column: number = 1;\n private tokens: Token[] = [];\n\n constructor(input: string) {\n this.input = input;\n }\n\n /**\n * Tokenize the entire input\n */\n public tokenize(): Token[] {\n while (this.position < this.input.length) {\n this.readToken();\n }\n\n // Add EOF token\n const pos = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.EOF, '', pos, pos));\n\n return this.tokens;\n }\n\n /**\n * Get current position\n */\n private getCurrentPosition(): Position {\n return createPosition(this.line, this.column, this.position);\n }\n\n /**\n * Peek at character without consuming\n */\n private peek(offset: number = 0): string {\n return this.input[this.position + offset] || '';\n }\n\n /**\n * Consume and return current character\n */\n private advance(): string {\n const char = this.input[this.position];\n this.position++;\n\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n\n return char;\n }\n\n /**\n * Check if we've reached the end\n */\n private isEOF(): boolean {\n return this.position >= this.input.length;\n }\n\n /**\n * Read next token\n */\n private readToken(): void {\n const char = this.peek();\n\n // Fragment open <>\n if (char === '<' && this.peek(1) === '>') {\n this.readFragmentOpen();\n return;\n }\n\n // Fragment close </>\n if (char === '<' && this.peek(1) === '/' && this.peek(2) === '>') {\n this.readFragmentClose();\n return;\n }\n\n // Check for comments first\n if (\n char === '<' &&\n this.peek(1) === '!' &&\n this.peek(2) === '-' &&\n this.peek(3) === '-'\n ) {\n this.readComment();\n return;\n }\n\n // Check for tags\n if (char === '<') {\n if (this.peek(1) === '/') {\n this.readCloseTag();\n } else {\n this.readOpenTag();\n }\n return;\n }\n\n // Check for expressions\n if (char === '{') {\n this.readExpression();\n return;\n }\n\n // Check for whitespace\n if (this.isWhitespace(char)) {\n this.readWhitespace();\n return;\n }\n\n // Otherwise it's text content\n this.readText();\n }\n\n /**\n * Read HTML comment\n */\n private readComment(): void {\n const start = this.getCurrentPosition();\n let value = '';\n\n // Consume <!--\n value += this.advance() + this.advance() + this.advance() + this.advance();\n\n // Read until -->\n while (!this.isEOF()) {\n if (this.peek() === '-' && this.peek(1) === '-' && this.peek(2) === '>') {\n value += this.advance() + this.advance() + this.advance();\n break;\n }\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.COMMENT, value, start, end));\n }\n\n /**\n * Read opening tag <\n */\n private readOpenTag(): void {\n const start = this.getCurrentPosition();\n this.advance(); // consume <\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_OPEN_START, '<', start, end));\n\n // Now read attributes until we hit > or />\n this.readTagContent();\n }\n\n /**\n * Read closing tag </\n */\n private readCloseTag(): void {\n const start = this.getCurrentPosition();\n this.advance(); // consume <\n this.advance(); // consume /\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_CLOSE_START, '</', start, end));\n\n // Read tag name\n this.skipWhitespace();\n this.readIdentifier();\n\n // Read closing >\n this.skipWhitespace();\n if (this.peek() === '>') {\n const start = this.getCurrentPosition();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_OPEN_END, '>', start, end));\n }\n }\n\n /**\n * Read tag content (tag name and attributes)\n */\n private readTagContent(): void {\n this.skipWhitespace();\n\n // Read tag name\n this.readIdentifier();\n\n // Read attributes\n while (!this.isEOF()) {\n this.skipWhitespace();\n\n const char = this.peek();\n\n // Self-closing tag\n if (char === '/' && this.peek(1) === '>') {\n const start = this.getCurrentPosition();\n this.advance();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.TAG_SELF_CLOSE, '/>', start, end)\n );\n return;\n }\n\n // End of opening tag\n if (char === '>') {\n const start = this.getCurrentPosition();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_OPEN_END, '>', start, end));\n return;\n }\n\n // Read attribute\n this.readAttribute();\n }\n }\n\n /**\n * Read an attribute (name and optional value)\n */\n private readAttribute(): void {\n const identifier = this.readIdentifier();\n if (!identifier) return;\n\n this.skipWhitespace();\n\n // Check for = sign\n if (this.peek() === '=') {\n const start = this.getCurrentPosition();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.ATTRIBUTE_EQUALS, '=', start, end)\n );\n\n this.skipWhitespace();\n\n // Read attribute value\n const char = this.peek();\n if (char === '\"' || char === \"'\") {\n this.readStringLiteral();\n } else if (char === '{') {\n this.readExpression();\n }\n }\n }\n\n /**\n * Read identifier (tag name or attribute name)\n */\n private readIdentifier(): string {\n const start = this.getCurrentPosition();\n let value = '';\n\n // First character must be letter, underscore, or $ (or : for namespaced attributes)\n const first = this.peek();\n if (this.isIdentifierStart(first)) {\n value += this.advance();\n } else {\n // Consume unexpected character to avoid infinite loops\n const unexpectedStart = this.getCurrentPosition();\n const char = this.advance();\n const unexpectedEnd = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.TEXT, char, unexpectedStart, unexpectedEnd)\n );\n return '';\n }\n\n // Read rest of identifier\n while (!this.isEOF() && this.isIdentifierPart(this.peek())) {\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n\n // Check if this is a directive or special keyword\n const tokenType = this.getIdentifierTokenType(value);\n this.tokens.push(createToken(tokenType, value, start, end));\n\n return value;\n }\n\n /**\n * Determine token type for identifier\n */\n private getIdentifierTokenType(value: string): TokenType {\n switch (value) {\n case 'l-if':\n return TokenType.DIRECTIVE_IF;\n case 'l-else-if':\n return TokenType.DIRECTIVE_ELSE_IF;\n case 'l-else':\n return TokenType.DIRECTIVE_ELSE;\n case 'l-for':\n return TokenType.DIRECTIVE_FOR;\n case 'ref':\n return TokenType.KEYWORD_REF;\n default:\n return TokenType.IDENTIFIER;\n }\n }\n\n /**\n * Read string literal\n */\n private readStringLiteral(): void {\n const start = this.getCurrentPosition();\n const quote = this.advance(); // \" or '\n let value = quote;\n let escaped = false;\n\n while (!this.isEOF()) {\n const char = this.peek();\n\n if (escaped) {\n value += this.advance();\n escaped = false;\n continue;\n }\n\n if (char === '\\\\') {\n escaped = true;\n value += this.advance();\n continue;\n }\n\n if (char === quote) {\n value += this.advance();\n break;\n }\n\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.STRING_LITERAL, value, start, end));\n }\n\n /**\n * Read fragment open <>\n */\n private readFragmentOpen(): void {\n const start = this.getCurrentPosition();\n this.advance(); // <\n this.advance(); // >\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.FRAGMENT_OPEN, '<>', start, end));\n }\n\n /**\n * Read fragment close </>\n */\n private readFragmentClose(): void {\n const start = this.getCurrentPosition();\n this.advance(); // <\n this.advance(); // /\n this.advance(); // >\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.FRAGMENT_CLOSE, '</>', start, end));\n }\n\n /**\n * Read expression content inside {}\n */\n private readExpression(): void {\n const startPos = this.getCurrentPosition();\n this.advance(); // consume {\n const openEnd = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.EXPRESSION_START, '{', startPos, openEnd)\n );\n\n let value = '';\n let depth = 1;\n let inString: string | null = null;\n let escaped = false;\n let contentStart: Position | null = null;\n let contentEnd: Position = openEnd;\n\n const consumeChar = (): string => {\n const charStart = this.getCurrentPosition();\n const char = this.advance();\n const charEnd = this.getCurrentPosition();\n\n value += char;\n if (!contentStart) {\n contentStart = charStart;\n }\n contentEnd = charEnd;\n\n return char;\n };\n\n while (!this.isEOF() && depth > 0) {\n const char = this.peek();\n\n // Handle string literals inside expressions\n if (inString) {\n if (escaped) {\n consumeChar();\n escaped = false;\n continue;\n }\n if (char === '\\\\') {\n escaped = true;\n consumeChar();\n continue;\n }\n if (char === inString) {\n consumeChar();\n inString = null;\n continue;\n }\n consumeChar();\n continue;\n }\n\n // Not in string\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = char;\n consumeChar();\n continue;\n }\n\n if (char === '{') {\n depth++;\n consumeChar();\n continue;\n }\n\n if (char === '}') {\n depth--;\n if (depth === 0) {\n // End of expression\n if (value.trim()) {\n const start = contentStart ?? openEnd;\n const end = contentEnd;\n this.tokens.push(\n createToken(TokenType.EXPRESSION_CONTENT, value, start, end)\n );\n }\n\n const closeStart = this.getCurrentPosition();\n this.advance(); // consume }\n const closeEnd = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.EXPRESSION_END, '}', closeStart, closeEnd)\n );\n return;\n }\n consumeChar();\n continue;\n }\n\n consumeChar();\n }\n\n // If we get here, expression wasn't closed properly\n // Still add the content we have\n if (value.trim()) {\n const start = contentStart ?? openEnd;\n const end = contentStart ? contentEnd : this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.EXPRESSION_CONTENT, value, start, end)\n );\n }\n }\n\n /**\n * Read text content\n */\n private readText(): void {\n const start = this.getCurrentPosition();\n let value = '';\n\n while (!this.isEOF()) {\n const char = this.peek();\n\n // Stop at tag or expression start\n if (char === '<' || char === '{') {\n break;\n }\n\n value += this.advance();\n }\n\n if (value) {\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TEXT, value, start, end));\n }\n }\n\n /**\n * Read whitespace\n */\n private readWhitespace(): void {\n const start = this.getCurrentPosition();\n let value = '';\n\n while (!this.isEOF() && this.isWhitespace(this.peek())) {\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.WHITESPACE, value, start, end));\n }\n\n /**\n * Skip whitespace without creating tokens\n */\n private skipWhitespace(): void {\n while (!this.isEOF() && this.isWhitespace(this.peek())) {\n this.advance();\n }\n }\n\n /**\n * Check if character is whitespace\n */\n private isWhitespace(char: string): boolean {\n return /\\s/.test(char);\n }\n\n /**\n * Check if character can start an identifier\n */\n private isIdentifierStart(char: string): boolean {\n return /[a-zA-Z_$:]/.test(char);\n }\n\n /**\n * Check if character can be part of an identifier\n */\n private isIdentifierPart(char: string): boolean {\n return /[a-zA-Z0-9_$:.-]/.test(char);\n }\n}\n\n/**\n * Tokenize a template string\n */\nexport function tokenize(input: string): Token[] {\n const lexer = new Lexer(input);\n return lexer.tokenize();\n}\n","import { Position } from './tokens';\n\n/**\n * Base AST Node interface\n */\nexport interface BaseNode {\n type: string;\n start: Position;\n end: Position;\n}\n\n/**\n * Node types\n */\nexport enum NodeType {\n ROOT = 'Root',\n ELEMENT = 'Element',\n FRAGMENT = 'Fragment',\n TEXT = 'Text',\n INTERPOLATION = 'Interpolation',\n COMMENT = 'Comment',\n ATTRIBUTE = 'Attribute',\n DIRECTIVE_IF = 'DirectiveIf',\n DIRECTIVE_ELSE_IF = 'DirectiveElseIf',\n DIRECTIVE_ELSE = 'DirectiveElse',\n DIRECTIVE_FOR = 'DirectiveFor',\n}\n\n/**\n * Root node - represents the entire template\n */\nexport interface RootNode extends BaseNode {\n type: NodeType.ROOT;\n children: TemplateNode[];\n}\n\n/**\n * Element node - represents HTML element or component\n */\nexport interface ElementNode extends BaseNode {\n type: NodeType.ELEMENT;\n tag: string;\n isComponent: boolean; // true if tag starts with uppercase\n isSelfClosing: boolean;\n attributes: AttributeNode[];\n directives: DirectiveNode[];\n children: TemplateNode[];\n ref?: string; // ref attribute value\n}\n\n/**\n * Fragment node - represents <></>\n */\nexport interface FragmentNode extends BaseNode {\n type: NodeType.FRAGMENT;\n children: TemplateNode[];\n}\n\n/**\n * Text node - represents plain text content\n */\nexport interface TextNode extends BaseNode {\n type: NodeType.TEXT;\n content: string;\n}\n\n/**\n * Interpolation node - represents {expression}\n */\nexport interface InterpolationNode extends BaseNode {\n type: NodeType.INTERPOLATION;\n expression: string;\n}\n\n/**\n * Comment node - represents HTML comments\n */\nexport interface CommentNode extends BaseNode {\n type: NodeType.COMMENT;\n content: string;\n}\n\n/**\n * Attribute node - represents element attributes\n */\nexport interface AttributeNode extends BaseNode {\n type: NodeType.ATTRIBUTE;\n name: string;\n value: AttributeValue | null;\n isDynamic: boolean; // true if value is an expression\n}\n\n/**\n * Attribute value can be static string or expression\n */\nexport type AttributeValue = string | { expression: string };\n\n/**\n * Base directive node\n */\nexport interface BaseDirectiveNode extends BaseNode {\n type:\n | NodeType.DIRECTIVE_IF\n | NodeType.DIRECTIVE_ELSE_IF\n | NodeType.DIRECTIVE_ELSE\n | NodeType.DIRECTIVE_FOR;\n}\n\n/**\n * l-if directive\n */\nexport interface DirectiveIfNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_IF;\n condition: string;\n}\n\n/**\n * l-else-if directive\n */\nexport interface DirectiveElseIfNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_ELSE_IF;\n condition: string;\n}\n\n/**\n * l-else directive\n */\nexport interface DirectiveElseNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_ELSE;\n}\n\n/**\n * l-for directive\n */\nexport interface DirectiveForNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_FOR;\n item: string; // loop variable name (e.g., \"item\")\n index?: string; // optional index variable name (e.g., \"index\")\n list: string; // expression for the list to iterate\n}\n\n/**\n * Union type for all directive nodes\n */\nexport type DirectiveNode =\n | DirectiveIfNode\n | DirectiveElseIfNode\n | DirectiveElseNode\n | DirectiveForNode;\n\n/**\n * Union type for all template nodes (excluding Root)\n */\nexport type TemplateNode =\n | ElementNode\n | FragmentNode\n | TextNode\n | InterpolationNode\n | CommentNode;\n\n/**\n * Type guard for Element nodes\n */\nexport function isElementNode(node: TemplateNode): node is ElementNode {\n return node.type === NodeType.ELEMENT;\n}\n\n/**\n * Type guard for Fragment nodes\n */\nexport function isFragmentNode(node: TemplateNode): node is FragmentNode {\n return node.type === NodeType.FRAGMENT;\n}\n\n/**\n * Type guard for Text nodes\n */\nexport function isTextNode(node: TemplateNode): node is TextNode {\n return node.type === NodeType.TEXT;\n}\n\n/**\n * Type guard for Interpolation nodes\n */\nexport function isInterpolationNode(\n node: TemplateNode\n): node is InterpolationNode {\n return node.type === NodeType.INTERPOLATION;\n}\n\n/**\n * Type guard for Comment nodes\n */\nexport function isCommentNode(node: TemplateNode): node is CommentNode {\n return node.type === NodeType.COMMENT;\n}\n\n/**\n * Type guard for directive nodes\n */\nexport function isDirective(\n node: AttributeNode | DirectiveNode\n): node is DirectiveNode {\n return (\n node.type === NodeType.DIRECTIVE_IF ||\n node.type === NodeType.DIRECTIVE_ELSE_IF ||\n node.type === NodeType.DIRECTIVE_ELSE ||\n node.type === NodeType.DIRECTIVE_FOR\n );\n}\n\n/**\n * Create a root node\n */\nexport function createRootNode(\n children: TemplateNode[],\n start: Position,\n end: Position\n): RootNode {\n return {\n type: NodeType.ROOT,\n children,\n start,\n end,\n };\n}\n\n/**\n * Create an element node\n */\nexport function createElementNode(\n tag: string,\n attributes: AttributeNode[],\n directives: DirectiveNode[],\n children: TemplateNode[],\n isSelfClosing: boolean,\n start: Position,\n end: Position\n): ElementNode {\n const isComponent = /^[A-Z]/.test(tag) || tag.includes('.');\n\n // Extract ref from attributes\n const refAttr = attributes.find(attr => attr.name === 'ref');\n const ref = refAttr?.value\n ? typeof refAttr.value === 'string'\n ? refAttr.value\n : refAttr.value.expression\n : undefined;\n\n return {\n type: NodeType.ELEMENT,\n tag,\n isComponent,\n isSelfClosing,\n attributes,\n directives,\n children,\n ref,\n start,\n end,\n };\n}\n\n/**\n * Create a fragment node\n */\nexport function createFragmentNode(\n children: TemplateNode[],\n start: Position,\n end: Position\n): FragmentNode {\n return {\n type: NodeType.FRAGMENT,\n children,\n start,\n end,\n };\n}\n\n/**\n * Create a text node\n */\nexport function createTextNode(\n content: string,\n start: Position,\n end: Position\n): TextNode {\n return {\n type: NodeType.TEXT,\n content,\n start,\n end,\n };\n}\n\n/**\n * Create an interpolation node\n */\nexport function createInterpolationNode(\n expression: string,\n start: Position,\n end: Position\n): InterpolationNode {\n return {\n type: NodeType.INTERPOLATION,\n expression,\n start,\n end,\n };\n}\n\n/**\n * Create a comment node\n */\nexport function createCommentNode(\n content: string,\n start: Position,\n end: Position\n): CommentNode {\n return {\n type: NodeType.COMMENT,\n content,\n start,\n end,\n };\n}\n\n/**\n * Create an attribute node\n */\nexport function createAttributeNode(\n name: string,\n value: AttributeValue | null,\n isDynamic: boolean,\n start: Position,\n end: Position\n): AttributeNode {\n return {\n type: NodeType.ATTRIBUTE,\n name,\n value,\n isDynamic,\n start,\n end,\n };\n}\n\n/**\n * Create a l-if directive node\n */\nexport function createDirectiveIfNode(\n condition: string,\n start: Position,\n end: Position\n): DirectiveIfNode {\n return {\n type: NodeType.DIRECTIVE_IF,\n condition,\n start,\n end,\n };\n}\n\n/**\n * Create a l-else-if directive node\n */\nexport function createDirectiveElseIfNode(\n condition: string,\n start: Position,\n end: Position\n): DirectiveElseIfNode {\n return {\n type: NodeType.DIRECTIVE_ELSE_IF,\n condition,\n start,\n end,\n };\n}\n\n/**\n * Create a l-else directive node\n */\nexport function createDirectiveElseNode(\n start: Position,\n end: Position\n): DirectiveElseNode {\n return {\n type: NodeType.DIRECTIVE_ELSE,\n start,\n end,\n };\n}\n\n/**\n * Create a l-for directive node\n */\nexport function createDirectiveForNode(\n item: string,\n list: string,\n index: string | undefined,\n start: Position,\n end: Position\n): DirectiveForNode {\n return {\n type: NodeType.DIRECTIVE_FOR,\n item,\n index,\n list,\n start,\n end,\n };\n}\n\n/**\n * Walk through AST and call visitor function for each node\n */\nexport function walk(\n node: RootNode | TemplateNode,\n visitor: (node: TemplateNode) => void\n): void {\n if (node.type === NodeType.ROOT) {\n node.children.forEach(child => {\n visitor(child);\n walk(child, visitor);\n });\n } else if (\n node.type === NodeType.ELEMENT ||\n node.type === NodeType.FRAGMENT\n ) {\n node.children.forEach(child => {\n visitor(child);\n walk(child, visitor);\n });\n }\n}\n\n/**\n * Transform AST by applying a transformer function to each node\n */\nexport function transformTree(\n node: RootNode | TemplateNode,\n transformer: (node: TemplateNode) => TemplateNode\n): RootNode | TemplateNode {\n if (node.type === NodeType.ROOT) {\n return {\n ...node,\n children: node.children.map(child => {\n const transformed = transformer(child);\n return transformTree(transformed, transformer) as TemplateNode;\n }),\n };\n } else if (node.type === NodeType.ELEMENT) {\n const transformed = transformer(node);\n if (transformed.type === NodeType.ELEMENT) {\n return {\n ...transformed,\n children: transformed.children.map(child => {\n const childTransformed = transformer(child);\n return transformTree(childTransformed, transformer) as TemplateNode;\n }),\n };\n }\n return transformed;\n } else if (node.type === NodeType.FRAGMENT) {\n const transformed = transformer(node);\n if (transformed.type === NodeType.FRAGMENT) {\n return {\n ...transformed,\n children: transformed.children.map(child => {\n const childTransformed = transformer(child);\n return transformTree(childTransformed, transformer) as TemplateNode;\n }),\n };\n }\n return transformed;\n }\n return transformer(node);\n}\n","import { Token, TokenType } from './tokens';\nimport {\n RootNode,\n TemplateNode,\n AttributeNode,\n DirectiveNode,\n createRootNode,\n createElementNode,\n createTextNode,\n createInterpolationNode,\n createCommentNode,\n createAttributeNode,\n createDirectiveIfNode,\n createDirectiveElseIfNode,\n createDirectiveElseNode,\n createDirectiveForNode,\n createFragmentNode,\n} from './ast';\n\n/**\n * Parser for Lithent templates\n * Converts token stream into AST\n */\nexport class Parser {\n private tokens: Token[];\n private position: number = 0;\n\n constructor(tokens: Token[]) {\n // Filter out whitespace tokens for easier parsing\n this.tokens = tokens.filter(t => t.type !== TokenType.WHITESPACE);\n }\n\n /**\n * Parse tokens into AST\n */\n public parse(): RootNode {\n const children: TemplateNode[] = [];\n\n while (!this.isEOF()) {\n const node = this.parseTemplateNode();\n if (node) {\n children.push(node);\n }\n }\n\n const start =\n children.length > 0\n ? children[0].start\n : { line: 1, column: 1, offset: 0 };\n const end =\n children.length > 0\n ? children[children.length - 1].end\n : { line: 1, column: 1, offset: 0 };\n\n return createRootNode(children, start, end);\n }\n\n /**\n * Parse a single template node\n */\n private parseTemplateNode(): TemplateNode | null {\n const token = this.peek();\n\n switch (token.type) {\n case TokenType.TAG_OPEN_START:\n return this.parseElement();\n case TokenType.FRAGMENT_OPEN:\n return this.parseFragment();\n case TokenType.TEXT:\n return this.parseText();\n case TokenType.EXPRESSION_START:\n return this.parseInterpolation();\n case TokenType.COMMENT:\n return this.parseComment();\n case TokenType.TAG_CLOSE_START:\n // Unexpected closing tag - skip it\n this.advance();\n return null;\n case TokenType.FRAGMENT_CLOSE:\n this.advance();\n return null;\n case TokenType.EOF:\n return null;\n default:\n this.advance();\n return null;\n }\n }\n\n /**\n * Parse fragment node\n */\n private parseFragment(): TemplateNode | null {\n const start = this.peek().start;\n this.expect(TokenType.FRAGMENT_OPEN);\n\n const children: TemplateNode[] = [];\n\n while (!this.isEOF() && !this.check(TokenType.FRAGMENT_CLOSE)) {\n const child = this.parseTemplateNode();\n if (child) {\n children.push(child);\n }\n }\n\n if (this.check(TokenType.FRAGMENT_CLOSE)) {\n const closeToken = this.expect(TokenType.FRAGMENT_CLOSE);\n return createFragmentNode(children, start, closeToken.end);\n }\n\n throw new Error(\n `Unclosed fragment starting at line ${start.line}, column ${start.column}`\n );\n }\n\n /**\n * Parse element\n */\n private parseElement(): TemplateNode | null {\n const start = this.peek().start;\n\n // Consume <\n this.expect(TokenType.TAG_OPEN_START);\n\n // Get tag name\n const tagToken = this.peek();\n if (tagToken.type !== TokenType.IDENTIFIER) {\n throw new Error(\n `Expected tag name at line ${tagToken.start.line}, column ${tagToken.start.column}`\n );\n }\n\n const tag = tagToken.value;\n this.advance();\n\n // Parse attributes and directives\n const { attributes, directives } = this.parseAttributesAndDirectives();\n\n // Check for self-closing tag\n if (this.check(TokenType.TAG_SELF_CLOSE)) {\n const end = this.peek().end;\n this.advance(); // consume />\n return createElementNode(\n tag,\n attributes,\n directives,\n [],\n true,\n start,\n end\n );\n }\n\n // Consume >\n this.expect(TokenType.TAG_OPEN_END);\n\n // Parse children (if not self-closing)\n const children: TemplateNode[] = [];\n\n while (!this.isEOF() && !this.check(TokenType.TAG_CLOSE_START)) {\n const child = this.parseTemplateNode();\n if (child) {\n children.push(child);\n }\n }\n\n // Parse closing tag\n if (this.check(TokenType.TAG_CLOSE_START)) {\n this.advance(); // consume </\n\n const closeTagToken = this.peek();\n if (closeTagToken.type !== TokenType.IDENTIFIER) {\n const error = new Error(\n `Expected closing tag name at line ${closeTagToken.start.line}, column ${closeTagToken.start.column}`\n ) as Error & { line?: number; column?: number };\n error.line = closeTagToken.start.line;\n error.column = closeTagToken.start.column;\n throw error;\n }\n\n const closeTag = closeTagToken.value;\n if (closeTag !== tag) {\n const error = new Error(\n `Mismatched closing tag: expected </${tag}> but got </${closeTag}> at line ${closeTagToken.start.line}, column ${closeTagToken.start.column}`\n ) as Error & { line?: number; column?: number };\n error.line = closeTagToken.start.line;\n error.column = closeTagToken.start.column;\n throw error;\n }\n\n this.advance(); // consume tag name\n\n const end = this.peek().end;\n this.expect(TokenType.TAG_OPEN_END); // consume >\n\n return createElementNode(\n tag,\n attributes,\n directives,\n children,\n false,\n start,\n end\n );\n }\n\n // No closing tag found\n const end = children.length > 0 ? children[children.length - 1].end : start;\n return createElementNode(\n tag,\n attributes,\n directives,\n children,\n false,\n start,\n end\n );\n }\n\n /**\n * Parse attributes and directives\n */\n private parseAttributesAndDirectives(): {\n attributes: AttributeNode[];\n directives: DirectiveNode[];\n } {\n const attributes: AttributeNode[] = [];\n const directives: DirectiveNode[] = [];\n\n while (\n !this.isEOF() &&\n !this.check(TokenType.TAG_OPEN_END) &&\n !this.check(TokenType.TAG_SELF_CLOSE)\n ) {\n const token = this.peek();\n\n // Check for directives\n if (\n token.type === TokenType.DIRECTIVE_IF ||\n token.type === TokenType.DIRECTIVE_ELSE_IF ||\n token.type === TokenType.DIRECTIVE_ELSE ||\n token.type === TokenType.DIRECTIVE_FOR\n ) {\n const directive = this.parseDirective();\n if (directive) {\n directives.push(directive);\n }\n } else if (\n token.type === TokenType.IDENTIFIER ||\n token.type === TokenType.KEYWORD_REF\n ) {\n const attribute = this.parseAttribute();\n if (attribute) {\n attributes.push(attribute);\n }\n } else {\n // Unexpected token, skip it\n this.advance();\n }\n }\n\n return { attributes, directives };\n }\n\n /**\n * Parse attribute\n */\n private parseAttribute(): AttributeNode | null {\n const start = this.peek().start;\n const nameToken = this.advance();\n const name = nameToken.value;\n\n // Check for = sign\n if (!this.check(TokenType.ATTRIBUTE_EQUALS)) {\n // Attribute without value (e.g., disabled, checked)\n return createAttributeNode(name, null, false, start, nameToken.end);\n }\n\n this.advance(); // consume =\n\n // Parse attribute value\n const valueToken = this.peek();\n let value: string | { expression: string };\n let isDynamic = false;\n let end = valueToken.end;\n\n if (valueToken.type === TokenType.STRING_LITERAL) {\n // Static string value\n value = valueToken.value.slice(1, -1); // Remove quotes\n this.advance();\n } else if (valueToken.type === TokenType.EXPRESSION_START) {\n // Dynamic expression value\n this.advance(); // consume {\n\n const exprToken = this.peek();\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n value = { expression: exprToken.value.trim() };\n isDynamic = true;\n this.advance();\n } else {\n value = { expression: '' };\n isDynamic = true;\n }\n\n if (this.check(TokenType.EXPRESSION_END)) {\n end = this.peek().end;\n this.advance(); // consume }\n }\n } else {\n // Unexpected token\n return createAttributeNode(name, null, false, start, nameToken.end);\n }\n\n return createAttributeNode(name, value, isDynamic, start, end);\n }\n\n /**\n * Parse directive\n */\n private parseDirective(): DirectiveNode | null {\n const start = this.peek().start;\n const directiveToken = this.advance();\n\n switch (directiveToken.type) {\n case TokenType.DIRECTIVE_IF:\n case TokenType.DIRECTIVE_ELSE_IF: {\n this.expect(TokenType.ATTRIBUTE_EQUALS);\n this.expect(TokenType.EXPRESSION_START);\n\n const exprToken = this.peek();\n let condition = '';\n\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n condition = exprToken.value.trim();\n this.advance();\n }\n\n const end = this.peek().end;\n this.expect(TokenType.EXPRESSION_END);\n\n return directiveToken.type === TokenType.DIRECTIVE_IF\n ? createDirectiveIfNode(condition, start, end)\n : createDirectiveElseIfNode(condition, start, end);\n }\n\n case TokenType.DIRECTIVE_ELSE: {\n const end = directiveToken.end;\n return createDirectiveElseNode(start, end);\n }\n\n case TokenType.DIRECTIVE_FOR: {\n this.expect(TokenType.ATTRIBUTE_EQUALS);\n this.expect(TokenType.EXPRESSION_START);\n\n const exprToken = this.peek();\n let expression = '';\n\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n expression = exprToken.value.trim();\n this.advance();\n }\n\n const end = this.peek().end;\n this.expect(TokenType.EXPRESSION_END);\n\n // Parse for expression: \"item in list\" or \"(item, index) in list\"\n const { item, index, list } = this.parseForExpression(expression);\n\n return createDirectiveForNode(item, list, index, start, end);\n }\n\n default:\n return null;\n }\n }\n\n /**\n * Parse l-for expression\n */\n private parseForExpression(expression: string): {\n item: string;\n index?: string;\n list: string;\n } {\n const identifier = '[A-Za-z_$][\\\\w$]*';\n const withParenRegex = new RegExp(\n `^\\\\s*\\\\(\\\\s*(${identifier})\\\\s*,\\\\s*(${identifier})\\\\s*\\\\)\\\\s+in\\\\s+([\\\\s\\\\S]+)$`\n );\n const simpleRegex = new RegExp(\n `^\\\\s*(${identifier})\\\\s+in\\\\s+([\\\\s\\\\S]+)$`\n );\n\n // Match pattern: \"(item, index) in list\" or \"item in list\"\n const withParenMatch = expression.match(withParenRegex);\n if (withParenMatch) {\n return {\n item: withParenMatch[1],\n index: withParenMatch[2],\n list: withParenMatch[3].trim(),\n };\n }\n\n const simpleMatch = expression.match(simpleRegex);\n if (simpleMatch) {\n return {\n item: simpleMatch[1],\n list: simpleMatch[2].trim(),\n };\n }\n\n // Fallback\n return {\n item: 'item',\n list: expression,\n };\n }\n\n /**\n * Parse text node\n */\n private parseText(): TemplateNode | null {\n const token = this.advance();\n return createTextNode(token.value, token.start, token.end);\n }\n\n /**\n * Parse interpolation node\n */\n private parseInterpolation(): TemplateNode | null {\n const start = this.peek().start;\n\n this.expect(TokenType.EXPRESSION_START);\n\n const exprToken = this.peek();\n let expression = '';\n\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n expression = exprToken.value.trim();\n this.advance();\n }\n\n const end = this.peek().end;\n this.expect(TokenType.EXPRESSION_END);\n\n return createInterpolationNode(expression, start, end);\n }\n\n /**\n * Parse comment node\n */\n private parseComment(): TemplateNode | null {\n const token = this.advance();\n // Extract content between <!-- and -->\n const content = token.value.replace(/^<!--\\s*|\\s*-->$/g, '');\n return createCommentNode(content, token.start, token.end);\n }\n\n /**\n * Peek at current token without consuming\n */\n private peek(): Token {\n return this.tokens[this.position];\n }\n\n /**\n * Advance to next token and return current\n */\n private advance(): Token {\n const token = this.tokens[this.position];\n this.position++;\n return token;\n }\n\n /**\n * Check if current token matches type\n */\n private check(type: TokenType): boolean {\n if (this.isEOF()) return false;\n return this.peek().type === type;\n }\n\n /**\n * Expect a token of specific type, throw error if not found\n */\n private expect(type: TokenType): Token {\n const token = this.peek();\n if (token.type !== type) {\n const error = new Error(\n `Expected token ${type} but got ${token.type} at line ${token.start.line}, column ${token.start.column}`\n ) as Error & { line?: number; column?: number };\n error.line = token.start.line;\n error.column = token.start.column;\n throw error;\n }\n return this.advance();\n }\n\n /**\n * Check if we've reached EOF\n */\n private isEOF(): boolean {\n return (\n this.position >= this.tokens.length || this.peek().type === TokenType.EOF\n );\n }\n}\n\n/**\n * Parse template string into AST\n */\nexport function parse(tokens: Token[]): RootNode {\n const parser = new Parser(tokens);\n return parser.parse();\n}\n","import {\n RootNode,\n TemplateNode,\n ElementNode,\n NodeType,\n DirectiveIfNode,\n DirectiveElseIfNode,\n DirectiveElseNode,\n} from '../parser/ast';\n\n/**\n * Group conditional elements (l-if/l-else-if/l-else chain)\n * This transform marks related conditional elements for easier codegen\n */\nexport interface ConditionalGroup {\n if: ElementNode;\n elseIfs: ElementNode[];\n else?: ElementNode;\n}\n\n/**\n * Transform directives in the AST\n * Currently handles:\n * - Grouping l-if/l-else-if/l-else chains\n */\nexport function transformDirectives(ast: RootNode): RootNode {\n return {\n ...ast,\n children: transformNodeList(ast.children),\n };\n}\n\n/**\n * Transform a list of nodes, handling conditional grouping\n */\nfunction transformNodeList(nodes: TemplateNode[]): TemplateNode[] {\n const result: TemplateNode[] = [];\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node.type === NodeType.ELEMENT) {\n // Process element's children recursively\n const transformedElement: ElementNode = {\n ...node,\n children: transformNodeList(node.children),\n };\n\n // Check if this starts a conditional chain\n const ifDirective = node.directives.find(\n d => d.type === NodeType.DIRECTIVE_IF\n ) as DirectiveIfNode | undefined;\n\n if (ifDirective) {\n // This starts a conditional chain, look ahead for else-if/else\n const conditionalGroup: ConditionalGroup = {\n if: transformedElement,\n elseIfs: [],\n };\n\n // Look ahead for else-if and else\n let j = i + 1;\n while (j < nodes.length) {\n const nextNode = nodes[j];\n\n if (nextNode.type === NodeType.ELEMENT) {\n const elseIfDirective = nextNode.directives.find(\n d => d.type === NodeType.DIRECTIVE_ELSE_IF\n ) as DirectiveElseIfNode | undefined;\n\n const elseDirective = nextNode.directives.find(\n d => d.type === NodeType.DIRECTIVE_ELSE\n ) as DirectiveElseNode | undefined;\n\n if (elseIfDirective) {\n conditionalGroup.elseIfs.push({\n ...nextNode,\n children: transformNodeList(nextNode.children),\n });\n j++;\n continue;\n }\n\n if (elseDirective) {\n conditionalGroup.else = {\n ...nextNode,\n children: transformNodeList(nextNode.children),\n };\n j++;\n break;\n }\n }\n\n // Not part of the conditional chain\n break;\n }\n\n // Mark the conditional group metadata (for codegen)\n // We'll store this in a symbol property that codegen can check\n (transformedElement as any).__conditionalGroup = conditionalGroup;\n\n // Skip the else-if/else nodes we've processed\n i = j - 1;\n }\n\n result.push(transformedElement);\n } else if (node.type === NodeType.FRAGMENT) {\n result.push({\n ...node,\n children: transformNodeList(node.children),\n });\n } else {\n // Non-element nodes pass through\n result.push(node);\n }\n }\n\n return result;\n}\n\n/**\n * Get conditional group if element is part of one\n */\nexport function getConditionalGroup(\n element: ElementNode\n): ConditionalGroup | undefined {\n return (element as any).__conditionalGroup;\n}\n\n/**\n * Check if element has a specific directive type\n */\nexport function hasDirective(\n element: ElementNode,\n directiveType: NodeType\n): boolean {\n return element.directives.some(d => d.type === directiveType);\n}\n\n/**\n * Get directive of specific type from element\n */\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType.DIRECTIVE_IF\n): DirectiveIfNode | undefined;\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType.DIRECTIVE_ELSE_IF\n): DirectiveElseIfNode | undefined;\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType.DIRECTIVE_ELSE\n): DirectiveElseNode | undefined;\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType\n): DirectiveIfNode | DirectiveElseIfNode | DirectiveElseNode | undefined {\n return element.directives.find(d => d.type === directiveType) as any;\n}\n","import {\n RootNode,\n TemplateNode,\n ElementNode,\n FragmentNode,\n TextNode,\n NodeType,\n createTextNode,\n} from '../parser/ast';\n\n/**\n * Optimize the AST\n * - Merge consecutive text nodes\n * - Remove empty text nodes (whitespace-only)\n * - Trim text nodes at boundaries\n */\nexport function optimize(ast: RootNode, options?: OptimizeOptions): RootNode {\n const opts: Required<OptimizeOptions> = {\n mergeTextNodes: true,\n removeWhitespace: true,\n trimText: true,\n ...options,\n };\n\n return {\n ...ast,\n children: optimizeNodeList(ast.children, opts),\n };\n}\n\nexport interface OptimizeOptions {\n mergeTextNodes?: boolean;\n removeWhitespace?: boolean;\n trimText?: boolean;\n}\n\n/**\n * Optimize a list of nodes\n */\nfunction optimizeNodeList(\n nodes: TemplateNode[],\n options: Required<OptimizeOptions>\n): TemplateNode[] {\n let result: TemplateNode[] = nodes.map(node => optimizeNode(node, options));\n\n // Merge consecutive text nodes\n if (options.mergeTextNodes) {\n result = mergeTextNodes(result);\n }\n\n // Remove whitespace-only text nodes\n if (options.removeWhitespace) {\n result = removeWhitespaceNodes(result);\n }\n\n return result;\n}\n\n/**\n * Optimize a single node\n */\nfunction optimizeNode(\n node: TemplateNode,\n options: Required<OptimizeOptions>\n): TemplateNode {\n if (node.type === NodeType.ELEMENT) {\n return optimizeElementNode(node, options);\n }\n\n if (node.type === NodeType.FRAGMENT) {\n return optimizeFragmentNode(node, options);\n }\n\n if (node.type === NodeType.TEXT) {\n return optimizeTextNode(node, options);\n }\n\n return node;\n}\n\n/**\n * Optimize an element node\n */\nfunction optimizeElementNode(\n node: ElementNode,\n options: Required<OptimizeOptions>\n): ElementNode {\n return {\n ...node,\n children: optimizeNodeList(node.children, options),\n };\n}\n\n/**\n * Optimize a fragment node\n */\nfunction optimizeFragmentNode(\n node: FragmentNode,\n options: Required<OptimizeOptions>\n): FragmentNode {\n return {\n ...node,\n children: optimizeNodeList(node.children, options),\n };\n}\n\n/**\n * Optimize a text node\n */\nfunction optimizeTextNode(\n node: TextNode,\n options: Required<OptimizeOptions>\n): TextNode {\n let content = node.content;\n\n // Trim text if enabled\n if (options.trimText) {\n content = content.trim();\n }\n\n return {\n ...node,\n content,\n };\n}\n\n/**\n * Merge consecutive text nodes\n */\nfunction mergeTextNodes(nodes: TemplateNode[]): TemplateNode[] {\n const result: TemplateNode[] = [];\n let currentText: TextNode | null = null;\n\n for (const node of nodes) {\n if (node.type === NodeType.TEXT) {\n if (currentText) {\n // Merge with previous text node\n currentText = createTextNode(\n currentText.content + node.content,\n currentText.start,\n node.end\n );\n } else {\n currentText = node;\n }\n } else {\n // Push accumulated text node if any\n if (currentText) {\n result.push(currentText);\n currentText = null;\n }\n result.push(node);\n }\n }\n\n // Don't forget the last text node\n if (currentText) {\n result.push(currentText);\n }\n\n return result;\n}\n\n/**\n * Remove whitespace-only text nodes\n */\nfunction removeWhitespaceNodes(nodes: TemplateNode[]): TemplateNode[] {\n return nodes.filter(node => {\n if (node.type === NodeType.TEXT) {\n return node.content.trim().length > 0;\n }\n return true;\n });\n}\n\n/**\n * Check if a text node is whitespace-only\n */\nexport function isWhitespaceOnly(node: TextNode): boolean {\n return node.content.trim().length === 0;\n}\n\n/**\n * Count nodes in the tree\n */\nexport function countNodes(node: RootNode | TemplateNode): number {\n let count = 1;\n\n if (node.type === NodeType.ROOT) {\n node.children.forEach(child => {\n count += countNodes(child);\n });\n } else if (\n node.type === NodeType.ELEMENT ||\n node.type === NodeType.FRAGMENT\n ) {\n node.children.forEach(child => {\n count += countNodes(child);\n });\n }\n\n return count;\n}\n","import { RootNode } from '../parser/ast';\nimport { transformDirectives } from './directives';\nimport { optimize, OptimizeOptions } from './optimize';\n\n/**\n * Apply all transformations to the AST\n */\nexport function transform(ast: RootNode, options?: TransformOptions): RootNode {\n let result = ast;\n\n // Transform directives (group conditionals)\n result = transformDirectives(result);\n\n // Optimize AST\n if (options?.optimize !== false) {\n result = optimize(result, options?.optimizeOptions);\n }\n\n return result;\n}\n\nexport interface TransformOptions {\n optimize?: boolean;\n optimizeOptions?: OptimizeOptions;\n}\n\nexport { transformDirectives, optimize };\nexport * from './directives';\nexport * from './optimize';\n","import {\n RootNode,\n TemplateNode,\n ElementNode,\n FragmentNode,\n TextNode,\n InterpolationNode,\n NodeType,\n DirectiveForNode,\n} from '../parser/ast';\nimport { tokenize } from '../parser/lexer';\nimport { parse } from '../parser/parser';\nimport { getConditionalGroup, getDirective, transform } from '../transform';\n\n/**\n * Generate JavaScript code from AST\n */\nexport function generate(ast: RootNode, options?: GenerateOptions): string {\n const opts: Required<GenerateOptions> = {\n templateFactory: 'h',\n templateFragmentFactory: 'Fragment',\n ...options,\n };\n\n const code = generateChildren(ast.children, opts);\n\n return code;\n}\n\nexport interface GenerateOptions {\n templateFactory?: string;\n templateFragmentFactory?: string;\n}\n\n/**\n * Generate code for children nodes\n */\nfunction generateChildren(\n children: TemplateNode[],\n options: Required<GenerateOptions>\n): string {\n const childrenCode = children\n .map(child => generateNode(child, options))\n .filter(code => code !== '');\n\n if (childrenCode.length === 0) {\n return 'null';\n }\n\n if (childrenCode.length === 1) {\n return childrenCode[0];\n }\n\n // Multiple children - wrap in array or Fragment\n return `[${childrenCode.join(', ')}]`;\n}\n\n/**\n * Generate code for a single node\n */\nfunction generateNode(\n node: TemplateNode,\n options: Required<GenerateOptions>\n): string {\n switch (node.type) {\n case NodeType.ELEMENT:\n return generateElement(node, options);\n case NodeType.FRAGMENT:\n return generateFragment(node, options);\n case NodeType.TEXT:\n return generateText(node);\n case NodeType.INTERPOLATION:\n return generateInterpolation(node, options);\n case NodeType.COMMENT:\n // Comments are not rendered\n return '';\n default:\n return '';\n }\n}\n\n/**\n * Generate code for an element node\n */\nfunction generateElement(\n node: ElementNode,\n options: Required<GenerateOptions>\n): string {\n // Check if this element is part of a conditional group\n const conditionalGroup = getConditionalGroup(node);\n if (conditionalGroup) {\n return generateConditionalGroup(conditionalGroup, options);\n }\n\n // Check if this element has l-for directive\n const forDirective = node.directives.find(\n d => d.type === NodeType.DIRECTIVE_FOR\n ) as DirectiveForNode | undefined;\n\n if (forDirective) {\n return generateForLoop(node, forDirective, options);\n }\n\n // Normal element\n return generateNormalElement(node, options);\n}\n\n/**\n * Generate code for a normal element (without directives)\n */\nfunction generateNormalElement(\n node: ElementNode,\n options: Required<GenerateOptions>\n): string {\n const factory = options.templateFactory;\n\n // Tag name (component or string)\n const tag = node.isComponent ? node.tag : `'${node.tag}'`;\n\n // Props\n const props = generateProps(node, options);\n\n // Children\n const children = node.children\n .map(child => generateNode(child, options))\n .filter(code => code !== '');\n\n // Build h() call\n if (children.length === 0) {\n return `${factory}(${tag}, ${props})`;\n }\n\n return `${factory}(${tag}, ${props}, ${children.join(', ')})`;\n}\n\n/**\n * Generate code for a fragment node\n */\nfunction generateFragment(\n node: FragmentNode,\n options: Required<GenerateOptions>\n): string {\n const factory = options.templateFactory;\n const fragment = options.templateFragmentFactory;\n\n const children = node.children\n .map(child => generateNode(child, options))\n .filter(code => code !== '');\n\n if (children.length === 0) {\n return `${factory}(${fragment}, null)`;\n }\n\n return `${factory}(${fragment}, null, ${children.join(', ')})`;\n}\n\n/**\n * Generate props object\n */\nfunction generateProps(\n node: ElementNode,\n options: Required<GenerateOptions>\n): string {\n if (node.attributes.length === 0) {\n return 'null';\n }\n\n const props = node.attributes.map(attr => {\n const key = attr.name;\n let value: string;\n\n if (attr.value === null) {\n // Boolean attribute (e.g., disabled, checked)\n value = 'true';\n } else if (typeof attr.value === 'string') {\n // Static string value\n value = `'${attr.value.replace(/'/g, \"\\\\'\")}'`;\n } else {\n // Dynamic expression\n value = transformExpression(attr.value.expression, options);\n }\n\n return `${key}: ${value}`;\n });\n\n return `{ ${props.join(', ')} }`;\n}\n\n/**\n * Generate code for text node\n */\nfunction generateText(node: TextNode): string {\n // Escape single quotes in text\n const escaped = node.content\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n')\n .replace(/'/g, \"\\\\'\");\n return `'${escaped}'`;\n}\n\n/**\n * Generate code for interpolation node\n */\nfunction generateInterpolation(\n node: InterpolationNode,\n options: Required<GenerateOptions>\n): string {\n return transformExpression(node.expression, options);\n}\n\n/**\n * Generate code for l-for loop\n */\nfunction generateForLoop(\n node: ElementNode,\n directive: DirectiveForNode,\n options: Required<GenerateOptions>\n): string {\n const { item, index, list } = directive;\n\n // Generate the element code (without the for directive)\n const elementWithoutFor: ElementNode = {\n ...node,\n directives: node.directives.filter(d => d.type !== NodeType.DIRECTIVE_FOR),\n };\n\n const elementCode = generateNormalElement(elementWithoutFor, options);\n\n // Generate map function\n if (index) {\n return `(${list}).map((${item}, ${index}) => ${elementCode})`;\n } else {\n return `(${list}).map(${item} => ${elementCode})`;\n }\n}\n\n/**\n * Generate code for conditional group (l-if/l-else-if/l-else)\n */\nfunction generateConditionalGroup(\n group: any,\n options: Required<GenerateOptions>\n): string {\n // Start with if condition\n const ifDirective = getDirective(group.if, NodeType.DIRECTIVE_IF);\n if (!ifDirective) {\n return generateNormalElement(group.if, options);\n }\n\n const ifElementWithoutDirective: ElementNode = {\n ...group.if,\n directives: group.if.directives.filter(\n (d: any) => d.type !== NodeType.DIRECTIVE_IF\n ),\n };\n\n let code = `(${ifDirective.condition}) ? ${generateNormalElement(ifElementWithoutDirective, options)}`;\n\n // Add else-if conditions\n for (const elseIfNode of group.elseIfs || []) {\n const elseIfDirective = getDirective(\n elseIfNode,\n NodeType.DIRECTIVE_ELSE_IF\n );\n if (!elseIfDirective) continue;\n\n const elseIfElementWithoutDirective: ElementNode = {\n ...elseIfNode,\n directives: elseIfNode.directives.filter(\n (d: any) => d.type !== NodeType.DIRECTIVE_ELSE_IF\n ),\n };\n\n code += ` : (${elseIfDirective.condition}) ? ${generateNormalElement(elseIfElementWithoutDirective, options)}`;\n }\n\n // Add else condition\n if (group.else) {\n const elseElementWithoutDirective: ElementNode = {\n ...group.else,\n directives: group.else.directives.filter(\n (d: any) => d.type !== NodeType.DIRECTIVE_ELSE\n ),\n };\n\n code += ` : ${generateNormalElement(elseElementWithoutDirective, options)}`;\n } else {\n code += ' : null';\n }\n\n return code;\n}\n\nexport function formatCode(code: string): string {\n // Basic formatting - this is a simple implementation\n // For production, you might want to use prettier or similar\n return code;\n}\n\ninterface TemplateMatch {\n start: number;\n end: number;\n snippet: string;\n}\n\nconst isAlphaNumeric = (code: number): boolean => {\n return (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n code === 95 || // _\n code === 36 // $\n );\n};\n\nconst shouldAttemptTemplate = (source: string, index: number): boolean => {\n if (source[index] !== '<') {\n return false;\n }\n\n const next = source.charCodeAt(index + 1);\n if (Number.isNaN(next)) {\n return false;\n }\n\n const isValidNext =\n next === 47 || // /\n next === 62 || // >\n next === 33 || // !\n isAlphaNumeric(next);\n\n if (!isValidNext) {\n return false;\n }\n\n let i = index - 1;\n while (i >= 0) {\n const code = source.charCodeAt(i);\n if (code === 32 || code === 9 || code === 10 || code === 13) {\n i--;\n continue;\n }\n\n if (isAlphaNumeric(code)) {\n return false;\n }\n\n break;\n }\n\n return true;\n};\n\nconst skipQuoted = (source: string, index: number, quote: string): number => {\n let i = index + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === quote) {\n return i + 1;\n }\n i++;\n }\n return source.length;\n};\n\nconst skipTemplateLiteral = (source: string, index: number): number => {\n let i = index + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '`') {\n return i + 1;\n }\n if (ch === '$' && source[i + 1] === '{') {\n i = skipJsExpression(source, i + 2);\n continue;\n }\n i++;\n }\n return source.length;\n};\n\nconst skipLineComment = (source: string, index: number): number => {\n let i = index;\n while (i < source.length && source[i] !== '\\\\n') {\n i++;\n }\n return i;\n};\n\nconst skipBlockComment = (source: string, index: number): number => {\n const end = source.indexOf('*/', index);\n return end === -1 ? source.length : end + 2;\n};\n\nconst skipHtmlComment = (source: string, index: number): number => {\n const end = source.indexOf('-->', index);\n return end === -1 ? source.length : end + 3;\n};\n\nconst skipJsExpression = (source: string, index: number): number => {\n let depth = 1;\n let i = index;\n\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === \"'\" || ch === '\"') {\n i = skipQuoted(source, i, ch);\n continue;\n }\n if (ch === '`') {\n i = skipTemplateLiteral(source, i);\n continue;\n }\n if (ch === '/' && source[i + 1] === '*') {\n i = skipBlockComment(source, i + 2);\n continue;\n }\n if (ch === '/' && source[i + 1] === '/') {\n i = skipLineComment(source, i + 2);\n continue;\n }\n if (ch === '{') {\n depth++;\n i++;\n continue;\n }\n if (ch === '}') {\n depth--;\n i++;\n if (depth === 0) {\n return i;\n }\n continue;\n }\n i++;\n }\n\n return source.length;\n};\n\ninterface SkipTagResult {\n position: number;\n selfClosing: boolean;\n}\n\nconst skipTag = (\n source: string,\n index: number,\n closing: boolean\n): SkipTagResult | null => {\n let i = index;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"'\" || ch === '\"') {\n i = skipQuoted(source, i, ch);\n continue;\n }\n if (ch === '`') {\n i = skipTemplateLiteral(source, i);\n continue;\n }\n if (ch === '{') {\n i = skipJsExpression(source, i + 1);\n continue;\n }\n if (ch === '/' && source[i + 1] === '*') {\n i = skipBlockComment(source, i + 2);\n continue;\n }\n if (ch === '/' && source[i + 1] === '/') {\n i = skipLineComment(source, i + 2);\n continue;\n }\n if (ch === '>') {\n const selfClosing = !closing && source[i - 1] === '/';\n return { position: i + 1, selfClosing };\n }\n i++;\n }\n return null;\n};\n\nconst extractTemplate = (\n source: string,\n start: number\n): TemplateMatch | null => {\n const len = source.length;\n let pos = start;\n let depth = 0;\n\n while (pos < len) {\n const ch = source[pos];\n\n if (ch === \"'\" || ch === '\"') {\n pos = skipQuoted(source, pos, ch);\n continue;\n }\n if (ch === '`') {\n pos = skipTemplateLiteral(source, pos);\n continue;\n }\n if (ch === '/' && source[pos + 1] === '*') {\n pos = skipBlockComment(source, pos + 2);\n continue;\n }\n if (ch === '/' && source[pos + 1] === '/') {\n pos = skipLineComment(source, pos + 2);\n continue;\n }\n\n if (ch === '<') {\n if (source.startsWith('<!--', pos)) {\n pos = skipHtmlComment(source, pos + 4);\n continue;\n }\n\n if (source[pos + 1] === '/') {\n depth--;\n const res = skipTag(source, pos + 2, true);\n if (!res) {\n return null;\n }\n pos = res.position;\n if (depth === 0) {\n return {\n start,\n end: pos,\n snippet: source.slice(start, pos),\n };\n }\n continue;\n } else {\n depth++;\n const res = skipTag(source, pos + 1, false);\n if (!res) {\n return null;\n }\n pos = res.position;\n if (res.selfClosing) {\n depth--;\n if (depth === 0) {\n return {\n start,\n end: pos,\n snippet: source.slice(start, pos),\n };\n }\n }\n continue;\n }\n }\n\n pos++;\n }\n\n return null;\n};\n\nconst scanTemplates = (code: string): TemplateMatch[] => {\n const matches: TemplateMatch[] = [];\n const len = code.length;\n let index = 0;\n\n while (index < len) {\n const ch = code[index];\n\n if (ch === \"'\" || ch === '\"') {\n index = skipQuoted(code, index, ch);\n continue;\n }\n if (ch === '`') {\n index = skipTemplateLiteral(code, index);\n continue;\n }\n if (ch === '/' && code[index + 1] === '*') {\n index = skipBlockComment(code, index + 2);\n continue;\n }\n if (ch === '/' && code[index + 1] === '/') {\n index = skipLineComment(code, index + 2);\n continue;\n }\n\n if (ch === '<' && shouldAttemptTemplate(code, index)) {\n const match = extractTemplate(code, index);\n if (match) {\n matches.push(match);\n index = match.end;\n continue;\n }\n }\n\n index++;\n }\n\n return matches;\n};\n\nfunction transformExpression(\n expression: string,\n options: Required<GenerateOptions>\n): string {\n if (!expression.includes('<')) {\n return expression;\n }\n\n const matches = scanTemplates(expression);\n if (matches.length === 0) {\n return expression;\n }\n\n let result = '';\n let lastIndex = 0;\n let changed = false;\n\n for (const match of matches) {\n let replacement: string | null = null;\n try {\n replacement = compileEmbeddedTemplate(match.snippet, options);\n } catch {\n replacement = null;\n }\n\n if (!replacement) {\n result += expression.slice(lastIndex, match.end);\n lastIndex = match.end;\n continue;\n }\n\n result += expression.slice(lastIndex, match.start) + replacement;\n lastIndex = match.end;\n changed = true;\n }\n\n result += expression.slice(lastIndex);\n\n return changed ? result : expression;\n}\n\nfunction compileEmbeddedTemplate(\n templateSource: string,\n options: Required<GenerateOptions>\n): string {\n const tokens = tokenize(templateSource);\n const ast = parse(tokens);\n const transformedAst = transform(ast);\n return generate(transformedAst, options);\n}\n","import { tokenize } from './parser/lexer';\nimport { parse } from './parser/parser';\nimport { transform, TransformOptions } from './transform';\nimport { generate, GenerateOptions } from './codegen';\n\n/**\n * Compile a Lithent template to JavaScript code\n */\nexport function compile(\n template: string,\n options?: CompileOptions\n): CompileResult {\n try {\n // 1. Tokenize\n const tokens = tokenize(template);\n\n // 2. Parse\n const ast = parse(tokens);\n\n // 3. Transform\n const transformedAst = transform(ast, options?.transform);\n\n // 4. Generate\n const code = generate(transformedAst, options?.generate);\n\n return {\n code,\n ast: transformedAst,\n errors: [],\n };\n } catch (error) {\n const err = error as Error & { line?: number; column?: number };\n return {\n code: '',\n ast: null,\n errors: [\n {\n message: error instanceof Error ? error.message : String(error),\n line: err.line ?? 0,\n column: err.column ?? 0,\n },\n ],\n };\n }\n}\n\nexport interface CompileOptions {\n transform?: TransformOptions;\n generate?: GenerateOptions;\n}\n\nexport interface CompileResult {\n code: string;\n ast: any;\n errors: CompileError[];\n}\n\nexport interface CompileError {\n message: string;\n line: number;\n column: number;\n}\n\n// Re-export all modules\nexport * from './parser/tokens';\nexport * from './parser/lexer';\nexport * from './parser/parser';\nexport * from './parser/ast';\nexport * from './transform';\nexport * from './codegen';\n","// src/vlq.ts\nvar comma = \",\".charCodeAt(0);\nvar semicolon = \";\".charCodeAt(0);\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar intToChar = new Uint8Array(64);\nvar charToInt = new Uint8Array(128);\nfor (let i = 0; i < chars.length; i++) {\n const c = chars.charCodeAt(i);\n intToChar[i] = c;\n charToInt[c] = i;\n}\nfunction decodeInteger(reader, relative) {\n let value = 0;\n let shift = 0;\n let integer = 0;\n do {\n const c = reader.next();\n integer = charToInt[c];\n value |= (integer & 31) << shift;\n shift += 5;\n } while (integer & 32);\n const shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -2147483648 | -value;\n }\n return relative + value;\n}\nfunction encodeInteger(builder, num, relative) {\n let delta = num - relative;\n delta = delta < 0 ? -delta << 1 | 1 : delta << 1;\n do {\n let clamped = delta & 31;\n delta >>>= 5;\n if (delta > 0) clamped |= 32;\n builder.write(intToChar[clamped]);\n } while (delta > 0);\n return num;\n}\nfunction hasMoreVlq(reader, max) {\n if (reader.pos >= max) return false;\n return reader.peek() !== comma;\n}\n\n// src/strings.ts\nvar bufLength = 1024 * 16;\nvar td = typeof TextDecoder !== \"undefined\" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== \"undefined\" ? {\n decode(buf) {\n const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n return out.toString();\n }\n} : {\n decode(buf) {\n let out = \"\";\n for (let i = 0; i < buf.length; i++) {\n out += String.fromCharCode(buf[i]);\n }\n return out;\n }\n};\nvar StringWriter = class {\n constructor() {\n this.pos = 0;\n this.out = \"\";\n this.buffer = new Uint8Array(bufLength);\n }\n write(v) {\n const { buffer } = this;\n buffer[this.pos++] = v;\n if (this.pos === bufLength) {\n this.out += td.decode(buffer);\n this.pos = 0;\n }\n }\n flush() {\n const { buffer, out, pos } = this;\n return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;\n }\n};\nvar StringReader = class {\n constructor(buffer) {\n this.pos = 0;\n this.buffer = buffer;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(char) {\n const { buffer, pos } = this;\n const idx = buffer.indexOf(char, pos);\n return idx === -1 ? buffer.length : idx;\n }\n};\n\n// src/scopes.ts\nvar EMPTY = [];\nfunction decodeOriginalScopes(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const scopes = [];\n const stack = [];\n let line = 0;\n for (; reader.pos < length; reader.pos++) {\n line = decodeInteger(reader, line);\n const column = decodeInteger(reader, 0);\n if (!hasMoreVlq(reader, length)) {\n const last = stack.pop();\n last[2] = line;\n last[3] = column;\n continue;\n }\n const kind = decodeInteger(reader, 0);\n const fields = decodeInteger(reader, 0);\n const hasName = fields & 1;\n const scope = hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind];\n let vars = EMPTY;\n if (hasMoreVlq(reader, length)) {\n vars = [];\n do {\n const varsIndex = decodeInteger(reader, 0);\n vars.push(varsIndex);\n } while (hasMoreVlq(reader, length));\n }\n scope.vars = vars;\n scopes.push(scope);\n stack.push(scope);\n }\n return scopes;\n}\nfunction encodeOriginalScopes(scopes) {\n const writer = new StringWriter();\n for (let i = 0; i < scopes.length; ) {\n i = _encodeOriginalScopes(scopes, i, writer, [0]);\n }\n return writer.flush();\n}\nfunction _encodeOriginalScopes(scopes, index, writer, state) {\n const scope = scopes[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;\n if (index > 0) writer.write(comma);\n state[0] = encodeInteger(writer, startLine, state[0]);\n encodeInteger(writer, startColumn, 0);\n encodeInteger(writer, kind, 0);\n const fields = scope.length === 6 ? 1 : 0;\n encodeInteger(writer, fields, 0);\n if (scope.length === 6) encodeInteger(writer, scope[5], 0);\n for (const v of vars) {\n encodeInteger(writer, v, 0);\n }\n for (index++; index < scopes.length; ) {\n const next = scopes[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeOriginalScopes(scopes, index, writer, state);\n }\n writer.write(comma);\n state[0] = encodeInteger(writer, endLine, state[0]);\n encodeInteger(writer, endColumn, 0);\n return index;\n}\nfunction decodeGeneratedRanges(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const ranges = [];\n const stack = [];\n let genLine = 0;\n let definitionSourcesIndex = 0;\n let definitionScopeIndex = 0;\n let callsiteSourcesIndex = 0;\n let callsiteLine = 0;\n let callsiteColumn = 0;\n let bindingLine = 0;\n let bindingColumn = 0;\n do {\n const semi = reader.indexOf(\";\");\n let genColumn = 0;\n for (; reader.pos < semi; reader.pos++) {\n genColumn = decodeInteger(reader, genColumn);\n if (!hasMoreVlq(reader, semi)) {\n const last = stack.pop();\n last[2] = genLine;\n last[3] = genColumn;\n continue;\n }\n const fields = decodeInteger(reader, 0);\n const hasDefinition = fields & 1;\n const hasCallsite = fields & 2;\n const hasScope = fields & 4;\n let callsite = null;\n let bindings = EMPTY;\n let range;\n if (hasDefinition) {\n const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);\n definitionScopeIndex = decodeInteger(\n reader,\n definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0\n );\n definitionSourcesIndex = defSourcesIndex;\n range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];\n } else {\n range = [genLine, genColumn, 0, 0];\n }\n range.isScope = !!hasScope;\n if (hasCallsite) {\n const prevCsi = callsiteSourcesIndex;\n const prevLine = callsiteLine;\n callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);\n const sameSource = prevCsi === callsiteSourcesIndex;\n callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);\n callsiteColumn = decodeInteger(\n reader,\n sameSource && prevLine === callsiteLine ? callsiteColumn : 0\n );\n callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];\n }\n range.callsite = callsite;\n if (hasMoreVlq(reader, semi)) {\n bindings = [];\n do {\n bindingLine = genLine;\n bindingColumn = genColumn;\n const expressionsCount = decodeInteger(reader, 0);\n let expressionRanges;\n if (expressionsCount < -1) {\n expressionRanges = [[decodeInteger(reader, 0)]];\n for (let i = -1; i > expressionsCount; i--) {\n const prevBl = bindingLine;\n bindingLine = decodeInteger(reader, bindingLine);\n bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);\n const expression = decodeInteger(reader, 0);\n expressionRanges.push([expression, bindingLine, bindingColumn]);\n }\n } else {\n expressionRanges = [[expressionsCount]];\n }\n bindings.push(expressionRanges);\n } while (hasMoreVlq(reader, semi));\n }\n range.bindings = bindings;\n ranges.push(range);\n stack.push(range);\n }\n genLine++;\n reader.pos = semi + 1;\n } while (reader.pos < length);\n return ranges;\n}\nfunction encodeGeneratedRanges(ranges) {\n if (ranges.length === 0) return \"\";\n const writer = new StringWriter();\n for (let i = 0; i < ranges.length; ) {\n i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);\n }\n return writer.flush();\n}\nfunction _encodeGeneratedRanges(ranges, index, writer, state) {\n const range = ranges[index];\n const {\n 0: startLine,\n 1: startColumn,\n 2: endLine,\n 3: endColumn,\n isScope,\n callsite,\n bindings\n } = range;\n if (state[0] < startLine) {\n catchupLine(writer, state[0], startLine);\n state[0] = startLine;\n state[1] = 0;\n } else if (index > 0) {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, range[1], state[1]);\n const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0);\n encodeInteger(writer, fields, 0);\n if (range.length === 6) {\n const { 4: sourcesIndex, 5: scopesIndex } = range;\n if (sourcesIndex !== state[2]) {\n state[3] = 0;\n }\n state[2] = encodeInteger(writer, sourcesIndex, state[2]);\n state[3] = encodeInteger(writer, scopesIndex, state[3]);\n }\n if (callsite) {\n const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;\n if (sourcesIndex !== state[4]) {\n state[5] = 0;\n state[6] = 0;\n } else if (callLine !== state[5]) {\n state[6] = 0;\n }\n state[4] = encodeInteger(writer, sourcesIndex, state[4]);\n state[5] = encodeInteger(writer, callLine, state[5]);\n state[6] = encodeInteger(writer, callColumn, state[6]);\n }\n if (bindings) {\n for (const binding of bindings) {\n if (binding.length > 1) encodeInteger(writer, -binding.length, 0);\n const expression = binding[0][0];\n encodeInteger(writer, expression, 0);\n let bindingStartLine = startLine;\n let bindingStartColumn = startColumn;\n for (let i = 1; i < binding.length; i++) {\n const expRange = binding[i];\n bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);\n bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);\n encodeInteger(writer, expRange[0], 0);\n }\n }\n }\n for (index++; index < ranges.length; ) {\n const next = ranges[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeGeneratedRanges(ranges, index, writer, state);\n }\n if (state[0] < endLine) {\n catchupLine(writer, state[0], endLine);\n state[0] = endLine;\n state[1] = 0;\n } else {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, endColumn, state[1]);\n return index;\n}\nfunction catchupLine(writer, lastLine, line) {\n do {\n writer.write(semicolon);\n } while (++lastLine < line);\n}\n\n// src/sourcemap-codec.ts\nfunction decode(mappings) {\n const { length } = mappings;\n const reader = new StringReader(mappings);\n const decoded = [];\n let genColumn = 0;\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n do {\n const semi = reader.indexOf(\";\");\n const line = [];\n let sorted = true;\n let lastCol = 0;\n genColumn = 0;\n while (reader.pos < semi) {\n let seg;\n genColumn = decodeInteger(reader, genColumn);\n if (genColumn < lastCol) sorted = false;\n lastCol = genColumn;\n if (hasMoreVlq(reader, semi)) {\n sourcesIndex = decodeInteger(reader, sourcesIndex);\n sourceLine = decodeInteger(reader, sourceLine);\n sourceColumn = decodeInteger(reader, sourceColumn);\n if (hasMoreVlq(reader, semi)) {\n namesIndex = decodeInteger(reader, namesIndex);\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];\n } else {\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];\n }\n } else {\n seg = [genColumn];\n }\n line.push(seg);\n reader.pos++;\n }\n if (!sorted) sort(line);\n decoded.push(line);\n reader.pos = semi + 1;\n } while (reader.pos <= length);\n return decoded;\n}\nfunction sort(line) {\n line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n return a[0] - b[0];\n}\nfunction encode(decoded) {\n const writer = new StringWriter();\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n for (let i = 0; i < decoded.length; i++) {\n const line = decoded[i];\n if (i > 0) writer.write(semicolon);\n if (line.length === 0) continue;\n let genColumn = 0;\n for (let j = 0; j < line.length; j++) {\n const segment = line[j];\n if (j > 0) writer.write(comma);\n genColumn = encodeInteger(writer, segment[0], genColumn);\n if (segment.length === 1) continue;\n sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);\n sourceLine = encodeInteger(writer, segment[2], sourceLine);\n sourceColumn = encodeInteger(writer, segment[3], sourceColumn);\n if (segment.length === 4) continue;\n namesIndex = encodeInteger(writer, segment[4], namesIndex);\n }\n }\n return writer.flush();\n}\nexport {\n decode,\n decodeGeneratedRanges,\n decodeOriginalScopes,\n encode,\n encodeGeneratedRanges,\n encodeOriginalScopes\n};\n//# sourceMappingURL=sourcemap-codec.mjs.map\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nclass BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n\nclass Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\t{\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + ''\n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nclass SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t\tif (typeof properties.debugId !== 'undefined') {\n\t\t\tthis.debugId = properties.debugId;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n\nfunction guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n\nfunction getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n\nconst toString = Object.prototype.toString;\n\nfunction isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n\nfunction getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n\nconst wordRegex = /\\w/;\n\nclass Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t\tcharInHiresBoundary = false;\n\t\t\t} else {\n\t\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nclass MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t\toffset: { writable: true, value: options.offset || 0 },\n\t\t});\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\tif (this.outro) {\n\t\t\tmappings.advance(this.outro);\n\t\t}\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t);\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t);\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\t\tindex = index + this.offset;\n\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t);\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length - this.offset) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tlet previousChunk = chunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\n\t\t\t// Prevent infinite loop (e.g. via empty chunks, where start === end)\n\t\t\tif (chunk === previousChunk) return;\n\n\t\t\tpreviousChunk = chunk;\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tif (typeof replacement === 'function') {\n\t\t\t\treplacement = replacement(string, index, original);\n\t\t\t}\n\t\t\tif (string !== replacement) {\n\t\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tlet _replacement = replacement;\n\t\t\tif (typeof replacement === 'function') {\n\t\t\t\t_replacement = replacement(previous, index, original);\n\t\t\t}\n\t\t\tif (previous !== _replacement) this.overwrite(index, index + stringLength, _replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nclass Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n\nexport { Bundle, SourceMap, MagicString as default };\n//# sourceMappingURL=magic-string.es.mjs.map\n","export interface TemplateMatch {\n start: number;\n end: number;\n snippet: string;\n}\n\nconst DEFAULT_ALPHA_NUMERIC = new Set<number>();\n\nfor (let code = 48; code <= 57; code++) {\n DEFAULT_ALPHA_NUMERIC.add(code);\n}\nfor (let code = 65; code <= 90; code++) {\n DEFAULT_ALPHA_NUMERIC.add(code);\n}\nfor (let code = 97; code <= 122; code++) {\n DEFAULT_ALPHA_NUMERIC.add(code);\n}\nDEFAULT_ALPHA_NUMERIC.add(95); // _\nDEFAULT_ALPHA_NUMERIC.add(36); // $\n\nconst isAlphaNumeric = (code: number): boolean => {\n return DEFAULT_ALPHA_NUMERIC.has(code);\n};\n\nconst shouldAttemptTemplate = (source: string, index: number): boolean => {\n if (source[index] !== '<') {\n return false;\n }\n\n const next = source.charCodeAt(index + 1);\n if (Number.isNaN(next)) {\n return false;\n }\n\n // Allow fragments <>, closing </, comments <!-, normal tags <a\n const isValidNext =\n next === 47 || // /\n next === 62 || // >\n next === 33 || // ! (e.g. <!-- -->)\n isAlphaNumeric(next);\n if (!isValidNext) {\n return false;\n }\n\n // Ensure previous meaningful char is not part of an identifier (e.g. a<b)\n let i = index - 1;\n while (i >= 0) {\n const code = source.charCodeAt(i);\n if (code === 32 || code === 9 || code === 10 || code === 13) {\n i--;\n continue;\n }\n if (isAlphaNumeric(code)) {\n // Identifier characters => likely relational operator (e.g. a<b)\n return false;\n }\n break;\n }\n\n return true;\n};\n\nconst skipQuoted = (source: string, index: number, quote: string): number => {\n let i = index + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === quote) {\n return i + 1;\n }\n i++;\n }\n return source.length;\n};\n\nconst skipTemplateLiteral = (source: string, index: number): number => {\n let i = index + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '`') {\n return i + 1;\n }\n if (ch === '$' && source[i + 1] === '{') {\n const result = skipJsExpression(source, i + 2);\n if (result == null) {\n return source.length;\n }\n i = result;\n continue;\n }\n i++;\n }\n return source.length;\n};\n\nconst skipLineComment = (source: string, index: number): number => {\n let i = index;\n while (i < source.length && source[i] !== '\\n') {\n i++;\n }\n return i;\n};\n\nconst skipBlockComment = (source: string, index: number): number => {\n const end = source.indexOf('*/', index);\n return end === -1 ? source.length : end + 2;\n};\n\nconst skipHtmlComment = (source: string, index: number): number => {\n const end = source.indexOf('-->', index);\n return end === -1 ? source.length : end + 3;\n};\n\nconst skipJsExpression = (source: string, index: number): number | null => {\n let depth = 1;\n let i = index;\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === \"'\" || ch === '\"') {\n i = skipQuoted(source, i, ch);\n continue;\n }\n if (ch === '`') {\n i = skipTemplateLiteral(source, i);\n continue;\n }\n if (ch === '/' && source[i + 1] === '*') {\n i = skipBlockComment(source, i + 2);\n continue;\n }\n if (ch === '/' && source[i + 1] === '/') {\n i = skipLineComment(source, i + 2);\n continue;\n }\n if (ch === '{') {\n depth++;\n i++;\n continue;\n }\n if (ch === '}') {\n depth--;\n i++;\n if (depth === 0) {\n return i;\n }\n continue;\n }\n i++;\n }\n return null;\n};\n\ninterface SkipTagResult {\n position: number;\n selfClosing: boolean;\n}\n\nconst skipTag = (\n source: string,\n index: number,\n closing: boolean\n): SkipTagResult | null => {\n let i = index;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"'\" || ch === '\"') {\n i = skipQuoted(source, i, ch);\n continue;\n }\n if (ch === '{') {\n const result = skipJsExpression(source, i + 1);\n if (result == null) {\n return null;\n }\n i = result;\n continue;\n }\n if (ch === '/' && source[i + 1] === '*') {\n i = skipBlockComment(source, i + 2);\n continue;\n }\n if (ch === '/' && source[i + 1] === '/') {\n i = skipLineComment(source, i + 2);\n continue;\n }\n if (ch === '>') {\n const selfClosing = !closing && source[i - 1] === '/';\n return { position: i + 1, selfClosing };\n }\n i++;\n }\n return null;\n};\n\nconst extractTemplate = (\n source: string,\n start: number\n): TemplateMatch | null => {\n const len = source.length;\n let pos = start;\n let depth = 0;\n\n while (pos < len) {\n const ch = source[pos];\n\n if (ch === '/' && source[pos + 1] === '*') {\n pos = skipBlockComment(source, pos + 2);\n continue;\n }\n if (ch === '/' && source[pos + 1] === '/') {\n pos = skipLineComment(source, pos + 2);\n continue;\n }\n if (ch === '{') {\n const result = skipJsExpression(source, pos + 1);\n if (result != null) {\n pos = result;\n continue;\n }\n }\n if (ch === '<') {\n if (source.startsWith('<!--', pos)) {\n pos = skipHtmlComment(source, pos + 4);\n continue;\n }\n\n if (source[pos + 1] === '/') {\n depth--;\n const res = skipTag(source, pos + 2, true);\n if (!res) {\n return null;\n }\n pos = res.position;\n if (depth === 0) {\n return {\n start,\n end: pos,\n snippet: source.slice(start, pos),\n };\n }\n continue;\n } else {\n depth++;\n const res = skipTag(source, pos + 1, false);\n if (!res) {\n return null;\n }\n pos = res.position;\n if (res.selfClosing) {\n depth--;\n if (depth === 0) {\n return {\n start,\n end: pos,\n snippet: source.slice(start, pos),\n };\n }\n }\n continue;\n }\n }\n\n pos++;\n }\n\n return null;\n};\n\nexport const scanTemplates = (code: string): TemplateMatch[] => {\n const matches: TemplateMatch[] = [];\n const len = code.length;\n let index = 0;\n\n while (index < len) {\n const ch = code[index];\n\n if (ch === \"'\" || ch === '\"') {\n index = skipQuoted(code, index, ch);\n continue;\n }\n if (ch === '`') {\n index = skipTemplateLiteral(code, index);\n continue;\n }\n if (ch === '/' && code[index + 1] === '*') {\n index = skipBlockComment(code, index + 2);\n continue;\n }\n if (ch === '/' && code[index + 1] === '/') {\n index = skipLineComment(code, index + 2);\n continue;\n }\n\n if (ch === '<' && shouldAttemptTemplate(code, index)) {\n const match = extractTemplate(code, index);\n if (match) {\n matches.push(match);\n index = match.end;\n continue;\n }\n }\n\n index++;\n }\n\n return matches;\n};\n","import MagicString, { type SourceMap } from 'magic-string';\nimport { compile, type CompileError, type CompileOptions } from '../compiler';\nimport { scanTemplates, type TemplateMatch } from './scan';\n\nexport interface DocumentTransformOptions {\n /**\n * Include original source name in generated source map.\n */\n source?: string;\n /**\n * Emit a source map when true.\n */\n generateSourceMap?: boolean;\n /**\n * Forwarded compile options for each template block.\n */\n compileOptions?: CompileOptions;\n}\n\nexport interface DocumentTransformError {\n match: TemplateMatch;\n error: CompileError;\n}\n\nexport interface DocumentTransformResult {\n code: string;\n map: SourceMap | null;\n /**\n * `true` when at least one replacement succeeded.\n */\n transformed: boolean;\n /**\n * Errors produced while compiling templates.\n */\n errors: DocumentTransformError[];\n /**\n * All template matches discovered in the source.\n */\n matches: TemplateMatch[];\n}\n\nexport const transformDocument = (\n source: string,\n options: DocumentTransformOptions = {}\n): DocumentTransformResult => {\n const matches = scanTemplates(source);\n if (matches.length === 0) {\n return {\n code: source,\n map: null,\n transformed: false,\n errors: [],\n matches: [],\n };\n }\n\n const ms = new MagicString(source);\n const errors: DocumentTransformError[] = [];\n let transformed = false;\n\n for (const match of matches) {\n const result = compile(match.snippet, options.compileOptions);\n if (result.errors.length > 0 || !result.code) {\n for (const error of result.errors) {\n errors.push({ match, error });\n }\n continue;\n }\n\n ms.overwrite(match.start, match.end, result.code);\n transformed = true;\n }\n\n if (!transformed) {\n return {\n code: source,\n map: null,\n transformed: false,\n errors,\n matches,\n };\n }\n\n const code = ms.toString();\n let map: SourceMap | null = null;\n\n if (options.generateSourceMap) {\n const mapConfig = options.source\n ? { source: options.source, hires: true }\n : { hires: true };\n map = ms.generateMap(mapConfig);\n }\n\n return {\n code,\n map,\n transformed: true,\n errors,\n matches,\n };\n};\n\nexport { scanTemplates };\nexport type { TemplateMatch };\n"],"names":["TokenType","createPosition","line","column","offset","createToken","type","value","start","end","Lexer","input","__publicField","pos","char","first","unexpectedStart","unexpectedEnd","tokenType","quote","escaped","startPos","openEnd","depth","inString","contentStart","contentEnd","consumeChar","charStart","charEnd","closeStart","closeEnd","tokenize","NodeType","isElementNode","node","isFragmentNode","isTextNode","isInterpolationNode","isCommentNode","isDirective","createRootNode","children","createElementNode","tag","attributes","directives","isSelfClosing","isComponent","refAttr","attr","ref","createFragmentNode","createTextNode","content","createInterpolationNode","expression","createCommentNode","createAttributeNode","name","isDynamic","createDirectiveIfNode","condition","createDirectiveElseIfNode","createDirectiveElseNode","createDirectiveForNode","item","list","index","walk","visitor","child","transformTree","transformer","transformed","childTransformed","Parser","tokens","t","closeToken","tagToken","closeTagToken","error","closeTag","token","directive","attribute","nameToken","valueToken","exprToken","directiveToken","identifier","withParenRegex","simpleRegex","withParenMatch","simpleMatch","parse","transformDirectives","ast","transformNodeList","nodes","result","i","transformedElement","d","conditionalGroup","j","nextNode","elseIfDirective","elseDirective","getConditionalGroup","element","hasDirective","directiveType","getDirective","optimize","options","opts","optimizeNodeList","optimizeNode","mergeTextNodes","removeWhitespaceNodes","optimizeElementNode","optimizeFragmentNode","optimizeTextNode","currentText","isWhitespaceOnly","countNodes","count","transform","generate","generateChildren","childrenCode","generateNode","code","generateElement","generateFragment","generateText","generateInterpolation","generateConditionalGroup","forDirective","generateForLoop","generateNormalElement","factory","props","generateProps","fragment","key","transformExpression","elementWithoutFor","elementCode","group","ifDirective","ifElementWithoutDirective","elseIfNode","elseIfElementWithoutDirective","elseElementWithoutDirective","formatCode","isAlphaNumeric","shouldAttemptTemplate","source","next","skipQuoted","ch","skipTemplateLiteral","skipJsExpression","skipLineComment","skipBlockComment","skipHtmlComment","skipTag","closing","selfClosing","extractTemplate","len","res","scanTemplates","matches","match","lastIndex","changed","replacement","compileEmbeddedTemplate","templateSource","transformedAst","compile","template","err","comma","semicolon","chars","intToChar","charToInt","c","encodeInteger","builder","num","relative","delta","clamped","bufLength","td","buf","out","StringWriter","v","buffer","encode","decoded","writer","sourcesIndex","sourceLine","sourceColumn","namesIndex","genColumn","segment","BitSet","arg","n","Chunk","chunk","fn","storeName","contentOnly","sliceIndex","originalBefore","originalAfter","newChunk","rx","trimmed","getBtoa","str","btoa","SourceMap","properties","guessIndent","lines","tabbed","spaced","min","previous","current","numSpaces","getRelativePath","from","to","fromParts","toParts","toString","isObject","thing","getLocator","originalLines","lineOffsets","m","wordRegex","Mappings","hires","sourceIndex","loc","nameIndex","contentLengthMinusOne","contentLineEnd","previousContentLineEnd","original","sourcemapLocations","originalCharIndex","charInHiresBoundary","warned","MagicString","string","cloned","originalChunk","clonedChunk","nextOriginalChunk","nextClonedChunk","names","mappings","locate","indentStr","pattern","isExcluded","exclusion","shouldIndentNextCharacter","replacer","charIndex","last","oldLeft","oldRight","newRight","newLeft","overwrite","lineIndex","lineStr","startChunk","containsEnd","sliceStart","sliceEnd","clone","previousChunk","searchForward","length","charType","aborted","searchValue","getReplacement","_","matchAll","re","stringLength","_replacement","DEFAULT_ALPHA_NUMERIC","transformDocument","ms","errors","map","mapConfig"],"mappings":"qZAGY,IAAAA,GAAAA,IAEVA,EAAA,eAAiB,iBACjBA,EAAA,aAAe,eACfA,EAAA,gBAAkB,kBAClBA,EAAA,eAAiB,iBAGjBA,EAAA,WAAa,aACbA,EAAA,iBAAmB,mBACnBA,EAAA,eAAiB,iBAGjBA,EAAA,iBAAmB,mBACnBA,EAAA,eAAiB,iBACjBA,EAAA,mBAAqB,qBAGrBA,EAAA,aAAe,eACfA,EAAA,kBAAoB,oBACpBA,EAAA,eAAiB,iBACjBA,EAAA,cAAgB,gBAGhBA,EAAA,cAAgB,gBAChBA,EAAA,eAAiB,iBAEjBA,EAAA,YAAc,cAGdA,EAAA,KAAO,OACPA,EAAA,QAAU,UAGVA,EAAA,WAAa,aAGbA,EAAA,IAAM,MArCIA,IAAAA,GAAA,CAAA,CAAA,EA8DI,SAAAC,EACdC,EACAC,EACAC,EACU,CACH,MAAA,CAAE,KAAAF,EAAM,OAAAC,EAAQ,OAAAC,EACzB,CAKO,SAASC,EACdC,EACAC,EACAC,EACAC,EACO,CACP,MAAO,CAAE,KAAAH,EAAM,MAAAC,EAAO,MAAAC,EAAO,IAAAC,CAAI,CACnC,CCvEO,MAAMC,CAAM,CAOjB,YAAYC,EAAe,CANnBC,EAAA,cACAA,EAAA,gBAAmB,GACnBA,EAAA,YAAe,GACfA,EAAA,cAAiB,GACjBA,EAAA,cAAkB,CAAA,GAGxB,KAAK,MAAQD,CACf,CAKO,UAAoB,CACzB,KAAO,KAAK,SAAW,KAAK,MAAM,QAChC,KAAK,UAAU,EAIX,MAAAE,EAAM,KAAK,qBACZ,YAAA,OAAO,KAAKR,EAAYL,EAAU,IAAK,GAAIa,EAAKA,CAAG,CAAC,EAElD,KAAK,MACd,CAKQ,oBAA+B,CACrC,OAAOZ,EAAe,KAAK,KAAM,KAAK,OAAQ,KAAK,QAAQ,CAC7D,CAKQ,KAAKG,EAAiB,EAAW,CACvC,OAAO,KAAK,MAAM,KAAK,SAAWA,CAAM,GAAK,EAC/C,CAKQ,SAAkB,CACxB,MAAMU,EAAO,KAAK,MAAM,KAAK,QAAQ,EAChC,YAAA,WAEDA,IAAS;AAAA,GACN,KAAA,OACL,KAAK,OAAS,GAET,KAAA,SAGAA,CACT,CAKQ,OAAiB,CAChB,OAAA,KAAK,UAAY,KAAK,MAAM,MACrC,CAKQ,WAAkB,CAClB,MAAAA,EAAO,KAAK,OAGlB,GAAIA,IAAS,KAAO,KAAK,KAAK,CAAC,IAAM,IAAK,CACxC,KAAK,iBAAiB,EACtB,MACF,CAGI,GAAAA,IAAS,KAAO,KAAK,KAAK,CAAC,IAAM,KAAO,KAAK,KAAK,CAAC,IAAM,IAAK,CAChE,KAAK,kBAAkB,EACvB,MACF,CAGA,GACEA,IAAS,KACT,KAAK,KAAK,CAAC,IAAM,KACjB,KAAK,KAAK,CAAC,IAAM,KACjB,KAAK,KAAK,CAAC,IAAM,IACjB,CACA,KAAK,YAAY,EACjB,MACF,CAGA,GAAIA,IAAS,IAAK,CACZ,KAAK,KAAK,CAAC,IAAM,IACnB,KAAK,aAAa,EAElB,KAAK,YAAY,EAEnB,MACF,CAGA,GAAIA,IAAS,IAAK,CAChB,KAAK,eAAe,EACpB,MACF,CAGI,GAAA,KAAK,aAAaA,CAAI,EAAG,CAC3B,KAAK,eAAe,EACpB,MACF,CAGA,KAAK,SAAS,CAChB,CAKQ,aAAoB,CACpB,MAAAN,EAAQ,KAAK,qBACnB,IAAID,EAAQ,GAML,IAHEA,GAAA,KAAK,QAAQ,EAAI,KAAK,UAAY,KAAK,QAAA,EAAY,KAAK,QAAQ,EAGlE,CAAC,KAAK,SAAS,CACpB,GAAI,KAAK,KAAA,IAAW,KAAO,KAAK,KAAK,CAAC,IAAM,KAAO,KAAK,KAAK,CAAC,IAAM,IAAK,CACvEA,GAAS,KAAK,UAAY,KAAK,UAAY,KAAK,UAChD,KACF,CACAA,GAAS,KAAK,SAChB,CAEM,MAAAE,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,QAASO,EAAOC,EAAOC,CAAG,CAAC,CACpE,CAKQ,aAAoB,CACpB,MAAAD,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,eAAgB,IAAKQ,EAAOC,CAAG,CAAC,EAGvE,KAAK,eAAe,CACtB,CAKQ,cAAqB,CACrB,MAAAD,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBASb,GARC,KAAA,OAAO,KAAKJ,EAAYL,EAAU,gBAAiB,KAAMQ,EAAOC,CAAG,CAAC,EAGzE,KAAK,eAAe,EACpB,KAAK,eAAe,EAGpB,KAAK,eAAe,EAChB,KAAK,KAAK,IAAM,IAAK,CACjBD,MAAAA,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACPC,MAAAA,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,aAAc,IAAKQ,EAAOC,CAAG,CAAC,CACvE,CACF,CAKQ,gBAAuB,CAOtB,IANP,KAAK,eAAe,EAGpB,KAAK,eAAe,EAGb,CAAC,KAAK,SAAS,CACpB,KAAK,eAAe,EAEd,MAAAK,EAAO,KAAK,OAGlB,GAAIA,IAAS,KAAO,KAAK,KAAK,CAAC,IAAM,IAAK,CAClC,MAAAN,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBACjB,KAAK,OAAO,KACVJ,EAAYL,EAAU,eAAgB,KAAMQ,EAAOC,CAAG,CAAA,EAExD,MACF,CAGA,GAAIK,IAAS,IAAK,CACV,MAAAN,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,aAAc,IAAKQ,EAAOC,CAAG,CAAC,EACrE,MACF,CAGA,KAAK,cAAc,CACrB,CACF,CAKQ,eAAsB,CAE5B,GADmB,KAAK,mBAGxB,KAAK,eAAe,EAGhB,KAAK,KAAK,IAAM,KAAK,CACjB,MAAAD,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBACjB,KAAK,OAAO,KACVJ,EAAYL,EAAU,iBAAkB,IAAKQ,EAAOC,CAAG,CAAA,EAGzD,KAAK,eAAe,EAGd,MAAAK,EAAO,KAAK,OACdA,IAAS,KAAOA,IAAS,IAC3B,KAAK,kBAAkB,EACdA,IAAS,KAClB,KAAK,eAAe,CAExB,CACF,CAKQ,gBAAyB,CACzB,MAAAN,EAAQ,KAAK,qBACnB,IAAID,EAAQ,GAGN,MAAAQ,EAAQ,KAAK,OACf,GAAA,KAAK,kBAAkBA,CAAK,EAC9BR,GAAS,KAAK,cACT,CAEC,MAAAS,EAAkB,KAAK,qBACvBF,EAAO,KAAK,UACZG,EAAgB,KAAK,qBAC3B,YAAK,OAAO,KACVZ,EAAYL,EAAU,KAAMc,EAAME,EAAiBC,CAAa,CAAA,EAE3D,EACT,CAGO,KAAA,CAAC,KAAK,SAAW,KAAK,iBAAiB,KAAK,KAAK,CAAC,GACvDV,GAAS,KAAK,UAGV,MAAAE,EAAM,KAAK,qBAGXS,EAAY,KAAK,uBAAuBX,CAAK,EACnD,YAAK,OAAO,KAAKF,EAAYa,EAAWX,EAAOC,EAAOC,CAAG,CAAC,EAEnDF,CACT,CAKQ,uBAAuBA,EAA0B,CACvD,OAAQA,EAAO,CACb,IAAK,OACH,OAAOP,EAAU,aACnB,IAAK,YACH,OAAOA,EAAU,kBACnB,IAAK,SACH,OAAOA,EAAU,eACnB,IAAK,QACH,OAAOA,EAAU,cACnB,IAAK,MACH,OAAOA,EAAU,YACnB,QACE,OAAOA,EAAU,UACrB,CACF,CAKQ,mBAA0B,CAC1B,MAAAQ,EAAQ,KAAK,qBACbW,EAAQ,KAAK,UACnB,IAAIZ,EAAQY,EACRC,EAAU,GAEP,KAAA,CAAC,KAAK,SAAS,CACd,MAAAN,EAAO,KAAK,OAElB,GAAIM,EAAS,CACXb,GAAS,KAAK,UACJa,EAAA,GACV,QACF,CAEA,GAAIN,IAAS,KAAM,CACPM,EAAA,GACVb,GAAS,KAAK,UACd,QACF,CAEA,GAAIO,IAASK,EAAO,CAClBZ,GAAS,KAAK,UACd,KACF,CAEAA,GAAS,KAAK,SAChB,CAEM,MAAAE,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,eAAgBO,EAAOC,EAAOC,CAAG,CAAC,CAC3E,CAKQ,kBAAyB,CACzB,MAAAD,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,cAAe,KAAMQ,EAAOC,CAAG,CAAC,CACzE,CAKQ,mBAA0B,CAC1B,MAAAD,EAAQ,KAAK,qBACnB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,QAAQ,EACP,MAAAC,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,eAAgB,MAAOQ,EAAOC,CAAG,CAAC,CAC3E,CAKQ,gBAAuB,CACvB,MAAAY,EAAW,KAAK,qBACtB,KAAK,QAAQ,EACP,MAAAC,EAAU,KAAK,qBACrB,KAAK,OAAO,KACVjB,EAAYL,EAAU,iBAAkB,IAAKqB,EAAUC,CAAO,CAAA,EAGhE,IAAIf,EAAQ,GACRgB,EAAQ,EACRC,EAA0B,KAC1BJ,EAAU,GACVK,EAAgC,KAChCC,EAAuBJ,EAE3B,MAAMK,EAAc,IAAc,CAC1B,MAAAC,EAAY,KAAK,qBACjBd,EAAO,KAAK,UACZe,EAAU,KAAK,qBAEZ,OAAAtB,GAAAO,EACJW,IACYA,EAAAG,GAEJF,EAAAG,EAENf,CAAA,EAGT,KAAO,CAAC,KAAK,SAAWS,EAAQ,GAAG,CAC3B,MAAAT,EAAO,KAAK,OAGlB,GAAIU,EAAU,CACZ,GAAIJ,EAAS,CACCO,IACFP,EAAA,GACV,QACF,CACA,GAAIN,IAAS,KAAM,CACPM,EAAA,GACEO,IACZ,QACF,CACA,GAAIb,IAASU,EAAU,CACTG,IACDH,EAAA,KACX,QACF,CACYG,IACZ,QACF,CAGA,GAAIb,IAAS,KAAOA,IAAS,KAAOA,IAAS,IAAK,CACrCU,EAAAV,EACCa,IACZ,QACF,CAEA,GAAIb,IAAS,IAAK,CAChBS,IACYI,IACZ,QACF,CAEA,GAAIb,IAAS,IAAK,CAEhB,GADAS,IACIA,IAAU,EAAG,CAEX,GAAAhB,EAAM,OAAQ,CAChB,MAAMC,GAAQiB,GAAgBH,EACxBb,GAAMiB,EACZ,KAAK,OAAO,KACVrB,EAAYL,EAAU,mBAAoBO,EAAOC,GAAOC,EAAG,CAAA,CAE/D,CAEM,MAAAqB,EAAa,KAAK,qBACxB,KAAK,QAAQ,EACP,MAAAC,EAAW,KAAK,qBACtB,KAAK,OAAO,KACV1B,EAAYL,EAAU,eAAgB,IAAK8B,EAAYC,CAAQ,CAAA,EAEjE,MACF,CACYJ,IACZ,QACF,CAEYA,GACd,CAII,GAAApB,EAAM,OAAQ,CAChB,MAAMC,EAAQiB,GAAgBH,EACxBb,EAAMgB,EAAeC,EAAa,KAAK,mBAAmB,EAChE,KAAK,OAAO,KACVrB,EAAYL,EAAU,mBAAoBO,EAAOC,EAAOC,CAAG,CAAA,CAE/D,CACF,CAKQ,UAAiB,CACjB,MAAAD,EAAQ,KAAK,qBACnB,IAAID,EAAQ,GAEL,KAAA,CAAC,KAAK,SAAS,CACd,MAAAO,EAAO,KAAK,OAGd,GAAAA,IAAS,KAAOA,IAAS,IAC3B,MAGFP,GAAS,KAAK,SAChB,CAEA,GAAIA,EAAO,CACH,MAAAE,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,KAAMO,EAAOC,EAAOC,CAAG,CAAC,CACjE,CACF,CAKQ,gBAAuB,CACvB,MAAAD,EAAQ,KAAK,qBACnB,IAAID,EAAQ,GAEL,KAAA,CAAC,KAAK,SAAW,KAAK,aAAa,KAAK,KAAK,CAAC,GACnDA,GAAS,KAAK,UAGV,MAAAE,EAAM,KAAK,qBACZ,KAAA,OAAO,KAAKJ,EAAYL,EAAU,WAAYO,EAAOC,EAAOC,CAAG,CAAC,CACvE,CAKQ,gBAAuB,CACtB,KAAA,CAAC,KAAK,SAAW,KAAK,aAAa,KAAK,KAAK,CAAC,GACnD,KAAK,QAAQ,CAEjB,CAKQ,aAAaK,EAAuB,CACnC,MAAA,KAAK,KAAKA,CAAI,CACvB,CAKQ,kBAAkBA,EAAuB,CACxC,MAAA,cAAc,KAAKA,CAAI,CAChC,CAKQ,iBAAiBA,EAAuB,CACvC,MAAA,mBAAmB,KAAKA,CAAI,CACrC,CACF,CAKO,SAASkB,EAASrB,EAAwB,CAE/C,OADc,IAAID,EAAMC,CAAK,EAChB,UACf,CCliBY,IAAAsB,GAAAA,IACVA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,SAAW,WACXA,EAAA,KAAO,OACPA,EAAA,cAAgB,gBAChBA,EAAA,QAAU,UACVA,EAAA,UAAY,YACZA,EAAA,aAAe,cACfA,EAAA,kBAAoB,kBACpBA,EAAA,eAAiB,gBACjBA,EAAA,cAAgB,eAXNA,IAAAA,GAAA,CAAA,CAAA,EAqJL,SAASC,GAAcC,EAAyC,CACrE,OAAOA,EAAK,OAAS,SACvB,CAKO,SAASC,GAAeD,EAA0C,CACvE,OAAOA,EAAK,OAAS,UACvB,CAKO,SAASE,GAAWF,EAAsC,CAC/D,OAAOA,EAAK,OAAS,MACvB,CAKO,SAASG,GACdH,EAC2B,CAC3B,OAAOA,EAAK,OAAS,eACvB,CAKO,SAASI,GAAcJ,EAAyC,CACrE,OAAOA,EAAK,OAAS,SACvB,CAKO,SAASK,GACdL,EACuB,CAErB,OAAAA,EAAK,OAAS,eACdA,EAAK,OAAS,mBACdA,EAAK,OAAS,iBACdA,EAAK,OAAS,cAElB,CAKgB,SAAAM,EACdC,EACAlC,EACAC,EACU,CACH,MAAA,CACL,KAAM,OACN,SAAAiC,EACA,MAAAlC,EACA,IAAAC,CAAA,CAEJ,CAKO,SAASkC,EACdC,EACAC,EACAC,EACAJ,EACAK,EACAvC,EACAC,EACa,CACb,MAAMuC,EAAc,SAAS,KAAKJ,CAAG,GAAKA,EAAI,SAAS,GAAG,EAGpDK,EAAUJ,EAAW,KAAaK,GAAAA,EAAK,OAAS,KAAK,EACrDC,EAAMF,GAAA,MAAAA,EAAS,MACjB,OAAOA,EAAQ,OAAU,SACvBA,EAAQ,MACRA,EAAQ,MAAM,WAChB,OAEG,MAAA,CACL,KAAM,UACN,IAAAL,EACA,YAAAI,EACA,cAAAD,EACA,WAAAF,EACA,WAAAC,EACA,SAAAJ,EACA,IAAAS,EACA,MAAA3C,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAA2C,EACdV,EACAlC,EACAC,EACc,CACP,MAAA,CACL,KAAM,WACN,SAAAiC,EACA,MAAAlC,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAA4C,EACdC,EACA9C,EACAC,EACU,CACH,MAAA,CACL,KAAM,OACN,QAAA6C,EACA,MAAA9C,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAA8C,EACdC,EACAhD,EACAC,EACmB,CACZ,MAAA,CACL,KAAM,gBACN,WAAA+C,EACA,MAAAhD,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAAgD,EACdH,EACA9C,EACAC,EACa,CACN,MAAA,CACL,KAAM,UACN,QAAA6C,EACA,MAAA9C,EACA,IAAAC,CAAA,CAEJ,CAKO,SAASiD,EACdC,EACApD,EACAqD,EACApD,EACAC,EACe,CACR,MAAA,CACL,KAAM,YACN,KAAAkD,EACA,MAAApD,EACA,UAAAqD,EACA,MAAApD,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAAoD,GACdC,EACAtD,EACAC,EACiB,CACV,MAAA,CACL,KAAM,cACN,UAAAqD,EACA,MAAAtD,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAAsD,GACdD,EACAtD,EACAC,EACqB,CACd,MAAA,CACL,KAAM,kBACN,UAAAqD,EACA,MAAAtD,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAAuD,GACdxD,EACAC,EACmB,CACZ,MAAA,CACL,KAAM,gBACN,MAAAD,EACA,IAAAC,CAAA,CAEJ,CAKO,SAASwD,GACdC,EACAC,EACAC,EACA5D,EACAC,EACkB,CACX,MAAA,CACL,KAAM,eACN,KAAAyD,EACA,MAAAE,EACA,KAAAD,EACA,MAAA3D,EACA,IAAAC,CAAA,CAEJ,CAKgB,SAAA4D,EACdlC,EACAmC,EACM,CACFnC,EAAK,OAAS,OACXA,EAAA,SAAS,QAAiBoC,GAAA,CAC7BD,EAAQC,CAAK,EACbF,EAAKE,EAAOD,CAAO,CAAA,CACpB,GAEDnC,EAAK,OAAS,WACdA,EAAK,OAAS,aAETA,EAAA,SAAS,QAAiBoC,GAAA,CAC7BD,EAAQC,CAAK,EACbF,EAAKE,EAAOD,CAAO,CAAA,CACpB,CAEL,CAKgB,SAAAE,EACdrC,EACAsC,EACyB,CACrB,GAAAtC,EAAK,OAAS,OACT,MAAA,CACL,GAAGA,EACH,SAAUA,EAAK,SAAS,IAAaoC,GAAA,CAC7B,MAAAG,EAAcD,EAAYF,CAAK,EAC9B,OAAAC,EAAcE,EAAaD,CAAW,CAAA,CAC9C,CAAA,EAEL,GAAWtC,EAAK,OAAS,UAAkB,CACnC,MAAAuC,EAAcD,EAAYtC,CAAI,EAChC,OAAAuC,EAAY,OAAS,UAChB,CACL,GAAGA,EACH,SAAUA,EAAY,SAAS,IAAaH,GAAA,CACpC,MAAAI,EAAmBF,EAAYF,CAAK,EACnC,OAAAC,EAAcG,EAAkBF,CAAW,CAAA,CACnD,CAAA,EAGEC,CAAA,SACEvC,EAAK,OAAS,WAAmB,CACpC,MAAAuC,EAAcD,EAAYtC,CAAI,EAChC,OAAAuC,EAAY,OAAS,WAChB,CACL,GAAGA,EACH,SAAUA,EAAY,SAAS,IAAaH,GAAA,CACpC,MAAAI,EAAmBF,EAAYF,CAAK,EACnC,OAAAC,EAAcG,EAAkBF,CAAW,CAAA,CACnD,CAAA,EAGEC,CACT,CACA,OAAOD,EAAYtC,CAAI,CACzB,CCtcO,MAAMyC,EAAO,CAIlB,YAAYC,EAAiB,CAHrBjE,EAAA,eACAA,EAAA,gBAAmB,GAIzB,KAAK,OAASiE,EAAO,UAAYC,EAAE,OAAS9E,EAAU,UAAU,CAClE,CAKO,OAAkB,CACvB,MAAM0C,EAA2B,CAAA,EAE1B,KAAA,CAAC,KAAK,SAAS,CACd,MAAAP,EAAO,KAAK,oBACdA,GACFO,EAAS,KAAKP,CAAI,CAEtB,CAEA,MAAM3B,EACJkC,EAAS,OAAS,EACdA,EAAS,CAAC,EAAE,MACZ,CAAE,KAAM,EAAG,OAAQ,EAAG,OAAQ,GAC9BjC,EACJiC,EAAS,OAAS,EACdA,EAASA,EAAS,OAAS,CAAC,EAAE,IAC9B,CAAE,KAAM,EAAG,OAAQ,EAAG,OAAQ,GAE7B,OAAAD,EAAeC,EAAUlC,EAAOC,CAAG,CAC5C,CAKQ,mBAAyC,CAG/C,OAFc,KAAK,OAEL,KAAM,CAClB,KAAKT,EAAU,eACb,OAAO,KAAK,eACd,KAAKA,EAAU,cACb,OAAO,KAAK,gBACd,KAAKA,EAAU,KACb,OAAO,KAAK,YACd,KAAKA,EAAU,iBACb,OAAO,KAAK,qBACd,KAAKA,EAAU,QACb,OAAO,KAAK,eACd,KAAKA,EAAU,gBAEb,YAAK,QAAQ,EACN,KACT,KAAKA,EAAU,eACb,YAAK,QAAQ,EACN,KACT,KAAKA,EAAU,IACN,OAAA,KACT,QACE,YAAK,QAAQ,EACN,IACX,CACF,CAKQ,eAAqC,CACrC,MAAAQ,EAAQ,KAAK,KAAA,EAAO,MACrB,KAAA,OAAOR,EAAU,aAAa,EAEnC,MAAM0C,EAA2B,CAAA,EAE1B,KAAA,CAAC,KAAK,SAAW,CAAC,KAAK,MAAM1C,EAAU,cAAc,GAAG,CACvD,MAAAuE,EAAQ,KAAK,oBACfA,GACF7B,EAAS,KAAK6B,CAAK,CAEvB,CAEA,GAAI,KAAK,MAAMvE,EAAU,cAAc,EAAG,CACxC,MAAM+E,EAAa,KAAK,OAAO/E,EAAU,cAAc,EACvD,OAAOoD,EAAmBV,EAAUlC,EAAOuE,EAAW,GAAG,CAC3D,CAEA,MAAM,IAAI,MACR,sCAAsCvE,EAAM,IAAI,YAAYA,EAAM,MAAM,EAAA,CAE5E,CAKQ,cAAoC,CACpC,MAAAA,EAAQ,KAAK,KAAA,EAAO,MAGrB,KAAA,OAAOR,EAAU,cAAc,EAG9B,MAAAgF,EAAW,KAAK,OAClB,GAAAA,EAAS,OAAShF,EAAU,WAC9B,MAAM,IAAI,MACR,6BAA6BgF,EAAS,MAAM,IAAI,YAAYA,EAAS,MAAM,MAAM,EAAA,EAIrF,MAAMpC,EAAMoC,EAAS,MACrB,KAAK,QAAQ,EAGb,KAAM,CAAE,WAAAnC,EAAY,WAAAC,CAAW,EAAI,KAAK,6BAA6B,EAGrE,GAAI,KAAK,MAAM9C,EAAU,cAAc,EAAG,CAClCS,MAAAA,EAAM,KAAK,KAAA,EAAO,IACxB,YAAK,QAAQ,EACNkC,EACLC,EACAC,EACAC,EACA,CAAC,EACD,GACAtC,EACAC,CAAA,CAEJ,CAGK,KAAA,OAAOT,EAAU,YAAY,EAGlC,MAAM0C,EAA2B,CAAA,EAE1B,KAAA,CAAC,KAAK,SAAW,CAAC,KAAK,MAAM1C,EAAU,eAAe,GAAG,CACxD,MAAAuE,EAAQ,KAAK,oBACfA,GACF7B,EAAS,KAAK6B,CAAK,CAEvB,CAGA,GAAI,KAAK,MAAMvE,EAAU,eAAe,EAAG,CACzC,KAAK,QAAQ,EAEP,MAAAiF,EAAgB,KAAK,OACvB,GAAAA,EAAc,OAASjF,EAAU,WAAY,CAC/C,MAAMkF,EAAQ,IAAI,MAChB,qCAAqCD,EAAc,MAAM,IAAI,YAAYA,EAAc,MAAM,MAAM,EAAA,EAE/F,MAAAC,EAAA,KAAOD,EAAc,MAAM,KAC3BC,EAAA,OAASD,EAAc,MAAM,OAC7BC,CACR,CAEA,MAAMC,EAAWF,EAAc,MAC/B,GAAIE,IAAavC,EAAK,CACpB,MAAMsC,EAAQ,IAAI,MAChB,sCAAsCtC,CAAG,eAAeuC,CAAQ,aAAaF,EAAc,MAAM,IAAI,YAAYA,EAAc,MAAM,MAAM,EAAA,EAEvI,MAAAC,EAAA,KAAOD,EAAc,MAAM,KAC3BC,EAAA,OAASD,EAAc,MAAM,OAC7BC,CACR,CAEA,KAAK,QAAQ,EAEPzE,MAAAA,EAAM,KAAK,KAAA,EAAO,IACnB,YAAA,OAAOT,EAAU,YAAY,EAE3B2C,EACLC,EACAC,EACAC,EACAJ,EACA,GACAlC,EACAC,CAAA,CAEJ,CAGM,MAAAA,EAAMiC,EAAS,OAAS,EAAIA,EAASA,EAAS,OAAS,CAAC,EAAE,IAAMlC,EAC/D,OAAAmC,EACLC,EACAC,EACAC,EACAJ,EACA,GACAlC,EACAC,CAAA,CAEJ,CAKQ,8BAGN,CACA,MAAMoC,EAA8B,CAAA,EAC9BC,EAA8B,CAAA,EAEpC,KACE,CAAC,KAAK,MAAM,GACZ,CAAC,KAAK,MAAM9C,EAAU,YAAY,GAClC,CAAC,KAAK,MAAMA,EAAU,cAAc,GACpC,CACM,MAAAoF,EAAQ,KAAK,OAGnB,GACEA,EAAM,OAASpF,EAAU,cACzBoF,EAAM,OAASpF,EAAU,mBACzBoF,EAAM,OAASpF,EAAU,gBACzBoF,EAAM,OAASpF,EAAU,cACzB,CACM,MAAAqF,EAAY,KAAK,iBACnBA,GACFvC,EAAW,KAAKuC,CAAS,CAC3B,SAEAD,EAAM,OAASpF,EAAU,YACzBoF,EAAM,OAASpF,EAAU,YACzB,CACM,MAAAsF,EAAY,KAAK,iBACnBA,GACFzC,EAAW,KAAKyC,CAAS,CAC3B,MAGA,KAAK,QAAQ,CAEjB,CAEO,MAAA,CAAE,WAAAzC,EAAY,WAAAC,EACvB,CAKQ,gBAAuC,CACvC,MAAAtC,EAAQ,KAAK,KAAA,EAAO,MACpB+E,EAAY,KAAK,UACjB5B,EAAO4B,EAAU,MAGvB,GAAI,CAAC,KAAK,MAAMvF,EAAU,gBAAgB,EAExC,OAAO0D,EAAoBC,EAAM,KAAM,GAAOnD,EAAO+E,EAAU,GAAG,EAGpE,KAAK,QAAQ,EAGP,MAAAC,EAAa,KAAK,OACpB,IAAAjF,EACAqD,EAAY,GACZnD,EAAM+E,EAAW,IAEjB,GAAAA,EAAW,OAASxF,EAAU,eAEhCO,EAAQiF,EAAW,MAAM,MAAM,EAAG,EAAE,EACpC,KAAK,QAAQ,UACJA,EAAW,OAASxF,EAAU,iBAAkB,CAEzD,KAAK,QAAQ,EAEP,MAAAyF,EAAY,KAAK,OACnBA,EAAU,OAASzF,EAAU,oBAC/BO,EAAQ,CAAE,WAAYkF,EAAU,MAAM,KAAO,CAAA,EACjC7B,EAAA,GACZ,KAAK,QAAQ,IAELrD,EAAA,CAAE,WAAY,IACVqD,EAAA,IAGV,KAAK,MAAM5D,EAAU,cAAc,IAC/BS,EAAA,KAAK,KAAO,EAAA,IAClB,KAAK,QAAQ,EACf,KAGA,QAAOiD,EAAoBC,EAAM,KAAM,GAAOnD,EAAO+E,EAAU,GAAG,EAGpE,OAAO7B,EAAoBC,EAAMpD,EAAOqD,EAAWpD,EAAOC,CAAG,CAC/D,CAKQ,gBAAuC,CACvC,MAAAD,EAAQ,KAAK,KAAA,EAAO,MACpBkF,EAAiB,KAAK,UAE5B,OAAQA,EAAe,KAAM,CAC3B,KAAK1F,EAAU,aACf,KAAKA,EAAU,kBAAmB,CAC3B,KAAA,OAAOA,EAAU,gBAAgB,EACjC,KAAA,OAAOA,EAAU,gBAAgB,EAEhC,MAAAyF,EAAY,KAAK,OACvB,IAAI3B,EAAY,GAEZ2B,EAAU,OAASzF,EAAU,qBACnB8D,EAAA2B,EAAU,MAAM,OAC5B,KAAK,QAAQ,GAGT,MAAAhF,EAAM,KAAK,KAAA,EAAO,IACnB,YAAA,OAAOT,EAAU,cAAc,EAE7B0F,EAAe,OAAS1F,EAAU,aACrC6D,GAAsBC,EAAWtD,EAAOC,CAAG,EAC3CsD,GAA0BD,EAAWtD,EAAOC,CAAG,CACrD,CAEA,KAAKT,EAAU,eAAgB,CAC7B,MAAMS,EAAMiF,EAAe,IACpB,OAAA1B,GAAwBxD,EAAOC,CAAG,CAC3C,CAEA,KAAKT,EAAU,cAAe,CACvB,KAAA,OAAOA,EAAU,gBAAgB,EACjC,KAAA,OAAOA,EAAU,gBAAgB,EAEhC,MAAAyF,EAAY,KAAK,OACvB,IAAIjC,EAAa,GAEbiC,EAAU,OAASzF,EAAU,qBAClBwD,EAAAiC,EAAU,MAAM,OAC7B,KAAK,QAAQ,GAGT,MAAAhF,EAAM,KAAK,KAAA,EAAO,IACnB,KAAA,OAAOT,EAAU,cAAc,EAGpC,KAAM,CAAE,KAAAkE,EAAM,MAAAE,EAAO,KAAAD,CAAS,EAAA,KAAK,mBAAmBX,CAAU,EAEhE,OAAOS,GAAuBC,EAAMC,EAAMC,EAAO5D,EAAOC,CAAG,CAC7D,CAEA,QACS,OAAA,IACX,CACF,CAKQ,mBAAmB+C,EAIzB,CACA,MAAMmC,EAAa,oBACbC,EAAiB,IAAI,OACzB,gBAAgBD,CAAU,cAAcA,CAAU,gCAAA,EAE9CE,EAAc,IAAI,OACtB,SAASF,CAAU,yBAAA,EAIfG,EAAiBtC,EAAW,MAAMoC,CAAc,EACtD,GAAIE,EACK,MAAA,CACL,KAAMA,EAAe,CAAC,EACtB,MAAOA,EAAe,CAAC,EACvB,KAAMA,EAAe,CAAC,EAAE,KAAK,CAAA,EAI3B,MAAAC,EAAcvC,EAAW,MAAMqC,CAAW,EAChD,OAAIE,EACK,CACL,KAAMA,EAAY,CAAC,EACnB,KAAMA,EAAY,CAAC,EAAE,KAAK,CAAA,EAKvB,CACL,KAAM,OACN,KAAMvC,CAAA,CAEV,CAKQ,WAAiC,CACjC,MAAA4B,EAAQ,KAAK,UACnB,OAAO/B,EAAe+B,EAAM,MAAOA,EAAM,MAAOA,EAAM,GAAG,CAC3D,CAKQ,oBAA0C,CAC1C,MAAA5E,EAAQ,KAAK,KAAA,EAAO,MAErB,KAAA,OAAOR,EAAU,gBAAgB,EAEhC,MAAAyF,EAAY,KAAK,OACvB,IAAIjC,EAAa,GAEbiC,EAAU,OAASzF,EAAU,qBAClBwD,EAAAiC,EAAU,MAAM,OAC7B,KAAK,QAAQ,GAGT,MAAAhF,EAAM,KAAK,KAAA,EAAO,IACnB,YAAA,OAAOT,EAAU,cAAc,EAE7BuD,EAAwBC,EAAYhD,EAAOC,CAAG,CACvD,CAKQ,cAAoC,CACpC,MAAA2E,EAAQ,KAAK,UAEb9B,EAAU8B,EAAM,MAAM,QAAQ,oBAAqB,EAAE,EAC3D,OAAO3B,EAAkBH,EAAS8B,EAAM,MAAOA,EAAM,GAAG,CAC1D,CAKQ,MAAc,CACb,OAAA,KAAK,OAAO,KAAK,QAAQ,CAClC,CAKQ,SAAiB,CACvB,MAAMA,EAAQ,KAAK,OAAO,KAAK,QAAQ,EAClC,YAAA,WACEA,CACT,CAKQ,MAAM9E,EAA0B,CAClC,OAAA,KAAK,QAAgB,GAClB,KAAK,OAAO,OAASA,CAC9B,CAKQ,OAAOA,EAAwB,CAC/B,MAAA8E,EAAQ,KAAK,OACf,GAAAA,EAAM,OAAS9E,EAAM,CACvB,MAAM4E,EAAQ,IAAI,MAChB,kBAAkB5E,CAAI,YAAY8E,EAAM,IAAI,YAAYA,EAAM,MAAM,IAAI,YAAYA,EAAM,MAAM,MAAM,EAAA,EAElG,MAAAF,EAAA,KAAOE,EAAM,MAAM,KACnBF,EAAA,OAASE,EAAM,MAAM,OACrBF,CACR,CACA,OAAO,KAAK,SACd,CAKQ,OAAiB,CAErB,OAAA,KAAK,UAAY,KAAK,OAAO,QAAU,KAAK,KAAO,EAAA,OAASlF,EAAU,GAE1E,CACF,CAKO,SAASgG,EAAMnB,EAA2B,CAE/C,OADe,IAAID,GAAOC,CAAM,EAClB,OAChB,CCxeO,SAASoB,GAAoBC,EAAyB,CACpD,MAAA,CACL,GAAGA,EACH,SAAUC,EAAkBD,EAAI,QAAQ,CAAA,CAE5C,CAKA,SAASC,EAAkBC,EAAuC,CAChE,MAAMC,EAAyB,CAAA,EAE/B,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CAC/B,MAAAnE,EAAOiE,EAAME,CAAC,EAEhB,GAAAnE,EAAK,OAASF,EAAS,QAAS,CAElC,MAAMsE,EAAkC,CACtC,GAAGpE,EACH,SAAUgE,EAAkBhE,EAAK,QAAQ,CAAA,EAQ3C,GAJoBA,EAAK,WAAW,KAClCqE,GAAKA,EAAE,OAASvE,EAAS,YAAA,EAGV,CAEf,MAAMwE,EAAqC,CACzC,GAAIF,EACJ,QAAS,CAAC,CAAA,EAIZ,IAAIG,EAAIJ,EAAI,EACL,KAAAI,EAAIN,EAAM,QAAQ,CACjB,MAAAO,EAAWP,EAAMM,CAAC,EAEpB,GAAAC,EAAS,OAAS1E,EAAS,QAAS,CAChC,MAAA2E,EAAkBD,EAAS,WAAW,KAC1CH,GAAKA,EAAE,OAASvE,EAAS,iBAAA,EAGrB4E,EAAgBF,EAAS,WAAW,KACxCH,GAAKA,EAAE,OAASvE,EAAS,cAAA,EAG3B,GAAI2E,EAAiB,CACnBH,EAAiB,QAAQ,KAAK,CAC5B,GAAGE,EACH,SAAUR,EAAkBQ,EAAS,QAAQ,CAAA,CAC9C,EACDD,IACA,QACF,CAEA,GAAIG,EAAe,CACjBJ,EAAiB,KAAO,CACtB,GAAGE,EACH,SAAUR,EAAkBQ,EAAS,QAAQ,CAAA,EAE/CD,IACA,KACF,CACF,CAGA,KACF,CAICH,EAA2B,mBAAqBE,EAGjDH,EAAII,EAAI,CACV,CAEAL,EAAO,KAAKE,CAAkB,CACrB,MAAApE,EAAK,OAASF,EAAS,SAChCoE,EAAO,KAAK,CACV,GAAGlE,EACH,SAAUgE,EAAkBhE,EAAK,QAAQ,CAAA,CAC1C,EAGDkE,EAAO,KAAKlE,CAAI,CAEpB,CAEO,OAAAkE,CACT,CAKO,SAASS,GACdC,EAC8B,CAC9B,OAAQA,EAAgB,kBAC1B,CAKgB,SAAAC,GACdD,EACAE,EACS,CACT,OAAOF,EAAQ,WAAW,KAAUP,GAAAA,EAAE,OAASS,CAAa,CAC9D,CAiBgB,SAAAC,EACdH,EACAE,EACuE,CACvE,OAAOF,EAAQ,WAAW,KAAUP,GAAAA,EAAE,OAASS,CAAa,CAC9D,CC/IgB,SAAAE,GAASjB,EAAekB,EAAqC,CAC3E,MAAMC,EAAkC,CACtC,eAAgB,GAChB,iBAAkB,GAClB,SAAU,GACV,GAAGD,CAAA,EAGE,MAAA,CACL,GAAGlB,EACH,SAAUoB,EAAiBpB,EAAI,SAAUmB,CAAI,CAAA,CAEjD,CAWA,SAASC,EACPlB,EACAgB,EACgB,CAChB,IAAIf,EAAyBD,EAAM,OAAYmB,GAAapF,EAAMiF,CAAO,CAAC,EAG1E,OAAIA,EAAQ,iBACVf,EAASmB,GAAenB,CAAM,GAI5Be,EAAQ,mBACVf,EAASoB,GAAsBpB,CAAM,GAGhCA,CACT,CAKA,SAASkB,GACPpF,EACAiF,EACc,CACV,OAAAjF,EAAK,OAASF,EAAS,QAClByF,GAAoBvF,EAAMiF,CAAO,EAGtCjF,EAAK,OAASF,EAAS,SAClB0F,GAAqBxF,EAAMiF,CAAO,EAGvCjF,EAAK,OAASF,EAAS,KAClB2F,GAAiBzF,EAAMiF,CAAO,EAGhCjF,CACT,CAKA,SAASuF,GACPvF,EACAiF,EACa,CACN,MAAA,CACL,GAAGjF,EACH,SAAUmF,EAAiBnF,EAAK,SAAUiF,CAAO,CAAA,CAErD,CAKA,SAASO,GACPxF,EACAiF,EACc,CACP,MAAA,CACL,GAAGjF,EACH,SAAUmF,EAAiBnF,EAAK,SAAUiF,CAAO,CAAA,CAErD,CAKA,SAASQ,GACPzF,EACAiF,EACU,CACV,IAAI9D,EAAUnB,EAAK,QAGnB,OAAIiF,EAAQ,WACV9D,EAAUA,EAAQ,QAGb,CACL,GAAGnB,EACH,QAAAmB,CAAA,CAEJ,CAKA,SAASkE,GAAepB,EAAuC,CAC7D,MAAMC,EAAyB,CAAA,EAC/B,IAAIwB,EAA+B,KAEnC,UAAW1F,KAAQiE,EACbjE,EAAK,OAASF,EAAS,KACrB4F,EAEYA,EAAAxE,EACZwE,EAAY,QAAU1F,EAAK,QAC3B0F,EAAY,MACZ1F,EAAK,GAAA,EAGO0F,EAAA1F,GAIZ0F,IACFxB,EAAO,KAAKwB,CAAW,EACTA,EAAA,MAEhBxB,EAAO,KAAKlE,CAAI,GAKpB,OAAI0F,GACFxB,EAAO,KAAKwB,CAAW,EAGlBxB,CACT,CAKA,SAASoB,GAAsBrB,EAAuC,CAC7D,OAAAA,EAAM,OAAejE,GACtBA,EAAK,OAASF,EAAS,KAClBE,EAAK,QAAQ,KAAK,EAAE,OAAS,EAE/B,EACR,CACH,CAKO,SAAS2F,GAAiB3F,EAAyB,CACxD,OAAOA,EAAK,QAAQ,KAAK,EAAE,SAAW,CACxC,CAKO,SAAS4F,EAAW5F,EAAuC,CAChE,IAAI6F,EAAQ,EAER,OAAA7F,EAAK,OAASF,EAAS,KACpBE,EAAA,SAAS,QAAiBoC,GAAA,CAC7ByD,GAASD,EAAWxD,CAAK,CAAA,CAC1B,GAEDpC,EAAK,OAASF,EAAS,SACvBE,EAAK,OAASF,EAAS,WAElBE,EAAA,SAAS,QAAiBoC,GAAA,CAC7ByD,GAASD,EAAWxD,CAAK,CAAA,CAC1B,EAGIyD,CACT,CCnMgB,SAAAC,EAAU/B,EAAekB,EAAsC,CAC7E,IAAIf,EAASH,EAGb,OAAAG,EAASJ,GAAoBI,CAAM,GAG/Be,GAAA,YAAAA,EAAS,YAAa,KACff,EAAAc,GAASd,EAAQe,GAAA,YAAAA,EAAS,eAAe,GAG7Cf,CACT,CCFgB,SAAA6B,EAAShC,EAAekB,EAAmC,CACzE,MAAMC,EAAkC,CACtC,gBAAiB,IACjB,wBAAyB,WACzB,GAAGD,CAAA,EAKE,OAFMe,GAAiBjC,EAAI,SAAUmB,CAAI,CAGlD,CAUA,SAASc,GACPzF,EACA0E,EACQ,CACR,MAAMgB,EAAe1F,EAClB,IAAI6B,GAAS8D,EAAa9D,EAAO6C,CAAO,CAAC,EACzC,OAAekB,GAAAA,IAAS,EAAE,EAEzB,OAAAF,EAAa,SAAW,EACnB,OAGLA,EAAa,SAAW,EACnBA,EAAa,CAAC,EAIhB,IAAIA,EAAa,KAAK,IAAI,CAAC,GACpC,CAKA,SAASC,EACPlG,EACAiF,EACQ,CACR,OAAQjF,EAAK,KAAM,CACjB,KAAKF,EAAS,QACL,OAAAsG,GAAgBpG,EAAMiF,CAAO,EACtC,KAAKnF,EAAS,SACL,OAAAuG,GAAiBrG,EAAMiF,CAAO,EACvC,KAAKnF,EAAS,KACZ,OAAOwG,GAAatG,CAAI,EAC1B,KAAKF,EAAS,cACL,OAAAyG,GAAsBvG,EAAMiF,CAAO,EAC5C,KAAKnF,EAAS,QAEL,MAAA,GACT,QACS,MAAA,EACX,CACF,CAKA,SAASsG,GACPpG,EACAiF,EACQ,CAEF,MAAAX,EAAmBK,GAAoB3E,CAAI,EACjD,GAAIsE,EACK,OAAAkC,GAAyBlC,EAAkBW,CAAO,EAIrD,MAAAwB,EAAezG,EAAK,WAAW,KACnCqE,GAAKA,EAAE,OAASvE,EAAS,aAAA,EAG3B,OAAI2G,EACKC,GAAgB1G,EAAMyG,EAAcxB,CAAO,EAI7C0B,EAAsB3G,EAAMiF,CAAO,CAC5C,CAKA,SAAS0B,EACP3G,EACAiF,EACQ,CACR,MAAM2B,EAAU3B,EAAQ,gBAGlBxE,EAAMT,EAAK,YAAcA,EAAK,IAAM,IAAIA,EAAK,GAAG,IAGhD6G,EAAQC,GAAc9G,EAAMiF,CAAO,EAGnC1E,EAAWP,EAAK,SACnB,IAAaoC,GAAA8D,EAAa9D,EAAO6C,CAAO,CAAC,EACzC,OAAOkB,GAAQA,IAAS,EAAE,EAGzB,OAAA5F,EAAS,SAAW,EACf,GAAGqG,CAAO,IAAInG,CAAG,KAAKoG,CAAK,IAG7B,GAAGD,CAAO,IAAInG,CAAG,KAAKoG,CAAK,KAAKtG,EAAS,KAAK,IAAI,CAAC,GAC5D,CAKA,SAAS8F,GACPrG,EACAiF,EACQ,CACR,MAAM2B,EAAU3B,EAAQ,gBAClB8B,EAAW9B,EAAQ,wBAEnB1E,EAAWP,EAAK,SACnB,IAAaoC,GAAA8D,EAAa9D,EAAO6C,CAAO,CAAC,EACzC,OAAOkB,GAAQA,IAAS,EAAE,EAEzB,OAAA5F,EAAS,SAAW,EACf,GAAGqG,CAAO,IAAIG,CAAQ,UAGxB,GAAGH,CAAO,IAAIG,CAAQ,WAAWxG,EAAS,KAAK,IAAI,CAAC,GAC7D,CAKA,SAASuG,GACP9G,EACAiF,EACQ,CACJ,OAAAjF,EAAK,WAAW,SAAW,EACtB,OAqBF,KAlBOA,EAAK,WAAW,IAAYe,GAAA,CACxC,MAAMiG,EAAMjG,EAAK,KACb,IAAA3C,EAEA,OAAA2C,EAAK,QAAU,KAET3C,EAAA,OACC,OAAO2C,EAAK,OAAU,SAE/B3C,EAAQ,IAAI2C,EAAK,MAAM,QAAQ,KAAM,KAAK,CAAC,IAG3C3C,EAAQ6I,GAAoBlG,EAAK,MAAM,WAAYkE,CAAO,EAGrD,GAAG+B,CAAG,KAAK5I,CAAK,EAAA,CACxB,EAEiB,KAAK,IAAI,CAAC,IAC9B,CAKA,SAASkI,GAAatG,EAAwB,CAO5C,MAAO,IALSA,EAAK,QAClB,QAAQ,MAAO,MAAM,EACrB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,KAAM,KAAK,CACJ,GACpB,CAKA,SAASuG,GACPvG,EACAiF,EACQ,CACD,OAAAgC,GAAoBjH,EAAK,WAAYiF,CAAO,CACrD,CAKA,SAASyB,GACP1G,EACAkD,EACA+B,EACQ,CACR,KAAM,CAAE,KAAAlD,EAAM,MAAAE,EAAO,KAAAD,CAAA,EAASkB,EAGxBgE,EAAiC,CACrC,GAAGlH,EACH,WAAYA,EAAK,WAAW,UAAYqE,EAAE,OAASvE,EAAS,aAAa,CAAA,EAGrEqH,EAAcR,EAAsBO,EAAmBjC,CAAO,EAGpE,OAAIhD,EACK,IAAID,CAAI,UAAUD,CAAI,KAAKE,CAAK,QAAQkF,CAAW,IAEnD,IAAInF,CAAI,SAASD,CAAI,OAAOoF,CAAW,GAElD,CAKA,SAASX,GACPY,EACAnC,EACQ,CAER,MAAMoC,EAActC,EAAaqC,EAAM,GAAItH,EAAS,YAAY,EAChE,GAAI,CAACuH,EACI,OAAAV,EAAsBS,EAAM,GAAInC,CAAO,EAGhD,MAAMqC,EAAyC,CAC7C,GAAGF,EAAM,GACT,WAAYA,EAAM,GAAG,WAAW,OAC7B/C,GAAWA,EAAE,OAASvE,EAAS,YAClC,CAAA,EAGE,IAAAqG,EAAO,IAAIkB,EAAY,SAAS,OAAOV,EAAsBW,EAA2BrC,CAAO,CAAC,GAGpG,UAAWsC,KAAcH,EAAM,SAAW,CAAA,EAAI,CAC5C,MAAM3C,EAAkBM,EACtBwC,EACAzH,EAAS,iBAAA,EAEX,GAAI,CAAC2E,EAAiB,SAEtB,MAAM+C,EAA6C,CACjD,GAAGD,EACH,WAAYA,EAAW,WAAW,OAC/BlD,GAAWA,EAAE,OAASvE,EAAS,iBAClC,CAAA,EAGFqG,GAAQ,OAAO1B,EAAgB,SAAS,OAAOkC,EAAsBa,EAA+BvC,CAAO,CAAC,EAC9G,CAGA,GAAImC,EAAM,KAAM,CACd,MAAMK,EAA2C,CAC/C,GAAGL,EAAM,KACT,WAAYA,EAAM,KAAK,WAAW,OAC/B/C,GAAWA,EAAE,OAASvE,EAAS,cAClC,CAAA,EAGFqG,GAAQ,MAAMQ,EAAsBc,EAA6BxC,CAAO,CAAC,EAAA,MAEjEkB,GAAA,UAGH,OAAAA,CACT,CAEO,SAASuB,GAAWvB,EAAsB,CAGxC,OAAAA,CACT,CAQA,MAAMwB,GAAkBxB,GAEnBA,GAAQ,IAAMA,GAAQ,IACtBA,GAAQ,IAAMA,GAAQ,IACtBA,GAAQ,IAAMA,GAAQ,KACvBA,IAAS,IACTA,IAAS,GAIPyB,GAAwB,CAACC,EAAgB5F,IAA2B,CACpE,GAAA4F,EAAO5F,CAAK,IAAM,IACb,MAAA,GAGT,MAAM6F,EAAOD,EAAO,WAAW5F,EAAQ,CAAC,EAWxC,GAVI,OAAO,MAAM6F,CAAI,GAUjB,EALFA,IAAS,IACTA,IAAS,IACTA,IAAS,IACTH,GAAeG,CAAI,GAGZ,MAAA,GAGT,IAAI3D,EAAIlC,EAAQ,EAChB,KAAOkC,GAAK,GAAG,CACP,MAAAgC,EAAO0B,EAAO,WAAW1D,CAAC,EAChC,GAAIgC,IAAS,IAAMA,IAAS,GAAKA,IAAS,IAAMA,IAAS,GAAI,CAC3DhC,IACA,QACF,CAEI,GAAAwD,GAAexB,CAAI,EACd,MAAA,GAGT,KACF,CAEO,MAAA,EACT,EAEM4B,EAAa,CAACF,EAAgB5F,EAAejD,IAA0B,CAC3E,IAAImF,EAAIlC,EAAQ,EACT,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACnB,GAAI6D,IAAO,KAAM,CACV7D,GAAA,EACL,QACF,CACA,GAAI6D,IAAOhJ,EACT,OAAOmF,EAAI,EAEbA,GACF,CACA,OAAO0D,EAAO,MAChB,EAEMI,EAAsB,CAACJ,EAAgB5F,IAA0B,CACrE,IAAIkC,EAAIlC,EAAQ,EACT,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACnB,GAAI6D,IAAO,KAAM,CACV7D,GAAA,EACL,QACF,CACA,GAAI6D,IAAO,IACT,OAAO7D,EAAI,EAEb,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAA+D,GAAiBL,EAAQ1D,EAAI,CAAC,EAClC,QACF,CACAA,GACF,CACA,OAAO0D,EAAO,MAChB,EAEMM,EAAkB,CAACN,EAAgB5F,IAA0B,CACjE,IAAIkC,EAAIlC,EACR,KAAOkC,EAAI0D,EAAO,QAAUA,EAAO1D,CAAC,IAAM,OACxCA,IAEK,OAAAA,CACT,EAEMiE,EAAmB,CAACP,EAAgB5F,IAA0B,CAClE,MAAM3D,EAAMuJ,EAAO,QAAQ,KAAM5F,CAAK,EACtC,OAAO3D,IAAQ,GAAKuJ,EAAO,OAASvJ,EAAM,CAC5C,EAEM+J,GAAkB,CAACR,EAAgB5F,IAA0B,CACjE,MAAM3D,EAAMuJ,EAAO,QAAQ,MAAO5F,CAAK,EACvC,OAAO3D,IAAQ,GAAKuJ,EAAO,OAASvJ,EAAM,CAC5C,EAEM4J,GAAmB,CAACL,EAAgB5F,IAA0B,CAClE,IAAI7C,EAAQ,EACR+E,EAAIlC,EAED,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACnB,GAAI6D,IAAO,KAAM,CACV7D,GAAA,EACL,QACF,CACI,GAAA6D,IAAO,KAAOA,IAAO,IAAK,CACxB7D,EAAA4D,EAAWF,EAAQ1D,EAAG6D,CAAE,EAC5B,QACF,CACA,GAAIA,IAAO,IAAK,CACV7D,EAAA8D,EAAoBJ,EAAQ1D,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAiE,EAAiBP,EAAQ1D,EAAI,CAAC,EAClC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAgE,EAAgBN,EAAQ1D,EAAI,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,IAAK,CACd5I,IACA+E,IACA,QACF,CACA,GAAI6D,IAAO,IAAK,CAGd,GAFA5I,IACA+E,IACI/E,IAAU,EACL,OAAA+E,EAET,QACF,CACAA,GACF,CAEA,OAAO0D,EAAO,MAChB,EAOMS,GAAU,CACdT,EACA5F,EACAsG,IACyB,CACzB,IAAIpE,EAAIlC,EACD,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACf,GAAA6D,IAAO,KAAOA,IAAO,IAAK,CACxB7D,EAAA4D,EAAWF,EAAQ1D,EAAG6D,CAAE,EAC5B,QACF,CACA,GAAIA,IAAO,IAAK,CACV7D,EAAA8D,EAAoBJ,EAAQ1D,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,IAAK,CACV7D,EAAA+D,GAAiBL,EAAQ1D,EAAI,CAAC,EAClC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAiE,EAAiBP,EAAQ1D,EAAI,CAAC,EAClC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAgE,EAAgBN,EAAQ1D,EAAI,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,IAAK,CACd,MAAMQ,EAAc,CAACD,GAAWV,EAAO1D,EAAI,CAAC,IAAM,IAClD,MAAO,CAAE,SAAUA,EAAI,EAAG,YAAAqE,CAAY,CACxC,CACArE,GACF,CACO,OAAA,IACT,EAEMsE,GAAkB,CACtBZ,EACAxJ,IACyB,CACzB,MAAMqK,EAAMb,EAAO,OACnB,IAAInJ,EAAML,EACNe,EAAQ,EAEZ,KAAOV,EAAMgK,GAAK,CACV,MAAAV,EAAKH,EAAOnJ,CAAG,EAEjB,GAAAsJ,IAAO,KAAOA,IAAO,IAAK,CACtBtJ,EAAAqJ,EAAWF,EAAQnJ,EAAKsJ,CAAE,EAChC,QACF,CACA,GAAIA,IAAO,IAAK,CACRtJ,EAAAuJ,EAAoBJ,EAAQnJ,CAAG,EACrC,QACF,CACA,GAAIsJ,IAAO,KAAOH,EAAOnJ,EAAM,CAAC,IAAM,IAAK,CACnCA,EAAA0J,EAAiBP,EAAQnJ,EAAM,CAAC,EACtC,QACF,CACA,GAAIsJ,IAAO,KAAOH,EAAOnJ,EAAM,CAAC,IAAM,IAAK,CACnCA,EAAAyJ,EAAgBN,EAAQnJ,EAAM,CAAC,EACrC,QACF,CAEA,GAAIsJ,IAAO,IAAK,CACd,GAAIH,EAAO,WAAW,OAAQnJ,CAAG,EAAG,CAC5BA,EAAA2J,GAAgBR,EAAQnJ,EAAM,CAAC,EACrC,QACF,CAEA,GAAImJ,EAAOnJ,EAAM,CAAC,IAAM,IAAK,CAC3BU,IACA,MAAMuJ,EAAML,GAAQT,EAAQnJ,EAAM,EAAG,EAAI,EACzC,GAAI,CAACiK,EACI,OAAA,KAGT,GADAjK,EAAMiK,EAAI,SACNvJ,IAAU,EACL,MAAA,CACL,MAAAf,EACA,IAAKK,EACL,QAASmJ,EAAO,MAAMxJ,EAAOK,CAAG,CAAA,EAGpC,QAAA,KACK,CACLU,IACA,MAAMuJ,EAAML,GAAQT,EAAQnJ,EAAM,EAAG,EAAK,EAC1C,GAAI,CAACiK,EACI,OAAA,KAGT,GADAjK,EAAMiK,EAAI,SACNA,EAAI,cACNvJ,IACIA,IAAU,GACL,MAAA,CACL,MAAAf,EACA,IAAKK,EACL,QAASmJ,EAAO,MAAMxJ,EAAOK,CAAG,CAAA,EAItC,QACF,CACF,CAEAA,GACF,CAEO,OAAA,IACT,EAEMkK,GAAiBzC,GAAkC,CACvD,MAAM0C,EAA2B,CAAA,EAC3BH,EAAMvC,EAAK,OACjB,IAAIlE,EAAQ,EAEZ,KAAOA,EAAQyG,GAAK,CACZ,MAAAV,EAAK7B,EAAKlE,CAAK,EAEjB,GAAA+F,IAAO,KAAOA,IAAO,IAAK,CACpB/F,EAAA8F,EAAW5B,EAAMlE,EAAO+F,CAAE,EAClC,QACF,CACA,GAAIA,IAAO,IAAK,CACN/F,EAAAgG,EAAoB9B,EAAMlE,CAAK,EACvC,QACF,CACA,GAAI+F,IAAO,KAAO7B,EAAKlE,EAAQ,CAAC,IAAM,IAAK,CACjCA,EAAAmG,EAAiBjC,EAAMlE,EAAQ,CAAC,EACxC,QACF,CACA,GAAI+F,IAAO,KAAO7B,EAAKlE,EAAQ,CAAC,IAAM,IAAK,CACjCA,EAAAkG,EAAgBhC,EAAMlE,EAAQ,CAAC,EACvC,QACF,CAEA,GAAI+F,IAAO,KAAOJ,GAAsBzB,EAAMlE,CAAK,EAAG,CAC9C,MAAA6G,EAAQL,GAAgBtC,EAAMlE,CAAK,EACzC,GAAI6G,EAAO,CACTD,EAAQ,KAAKC,CAAK,EAClB7G,EAAQ6G,EAAM,IACd,QACF,CACF,CAEA7G,GACF,CAEO,OAAA4G,CACT,EAEA,SAAS5B,GACP5F,EACA4D,EACQ,CACR,GAAI,CAAC5D,EAAW,SAAS,GAAG,EACnB,OAAAA,EAGH,MAAAwH,EAAUD,GAAcvH,CAAU,EACpC,GAAAwH,EAAQ,SAAW,EACd,OAAAxH,EAGT,IAAI6C,EAAS,GACT6E,EAAY,EACZC,EAAU,GAEd,UAAWF,KAASD,EAAS,CAC3B,IAAII,EAA6B,KAC7B,GAAA,CACYA,EAAAC,GAAwBJ,EAAM,QAAS7D,CAAO,CAAA,MACtD,CACQgE,EAAA,IAChB,CAEA,GAAI,CAACA,EAAa,CAChB/E,GAAU7C,EAAW,MAAM0H,EAAWD,EAAM,GAAG,EAC/CC,EAAYD,EAAM,IAClB,QACF,CAEA5E,GAAU7C,EAAW,MAAM0H,EAAWD,EAAM,KAAK,EAAIG,EACrDF,EAAYD,EAAM,IACRE,EAAA,EACZ,CAEU,OAAA9E,GAAA7C,EAAW,MAAM0H,CAAS,EAE7BC,EAAU9E,EAAS7C,CAC5B,CAEA,SAAS6H,GACPC,EACAlE,EACQ,CACF,MAAAvC,EAAS7C,EAASsJ,CAAc,EAChCpF,EAAMF,EAAMnB,CAAM,EAClB0G,EAAiBtD,EAAU/B,CAAG,EAC7B,OAAAgC,EAASqD,EAAgBnE,CAAO,CACzC,CC5oBgB,SAAAoE,GACdC,EACArE,EACe,CACX,GAAA,CAEI,MAAAvC,EAAS7C,EAASyJ,CAAQ,EAG1BvF,EAAMF,EAAMnB,CAAM,EAGlB0G,EAAiBtD,EAAU/B,EAAKkB,GAAA,YAAAA,EAAS,SAAS,EAKjD,MAAA,CACL,KAHWc,EAASqD,EAAgBnE,GAAA,YAAAA,EAAS,QAAQ,EAIrD,IAAKmE,EACL,OAAQ,CAAC,CAAA,QAEJrG,EAAO,CACd,MAAMwG,EAAMxG,EACL,MAAA,CACL,KAAM,GACN,IAAK,KACL,OAAQ,CACN,CACE,QAASA,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAC9D,KAAMwG,EAAI,MAAQ,EAClB,OAAQA,EAAI,QAAU,CACxB,CACF,CAAA,CAEJ,CACF,CC3CA,IAAIC,GAAQ,GACRC,GAAY,GACZC,GAAQ,mEACRC,GAAY,IAAI,WAAW,EAAE,EAC7BC,GAAY,IAAI,WAAW,GAAG,EAClC,QAAS,EAAI,EAAG,EAAIF,GAAM,OAAQ,IAAK,CACrC,MAAMG,EAAIH,GAAM,WAAW,CAAC,EAC5BC,GAAU,CAAC,EAAIE,EACfD,GAAUC,CAAC,EAAI,CACjB,CAkBA,SAASC,EAAcC,EAASC,EAAKC,EAAU,CAC7C,IAAIC,EAAQF,EAAMC,EAClBC,EAAQA,EAAQ,EAAI,CAACA,GAAS,EAAI,EAAIA,GAAS,EAC/C,EAAG,CACD,IAAIC,EAAUD,EAAQ,GACtBA,KAAW,EACPA,EAAQ,IAAGC,GAAW,IAC1BJ,EAAQ,MAAMJ,GAAUQ,CAAO,CAAC,CACpC,OAAWD,EAAQ,GACjB,OAAOF,CACT,CAOA,IAAII,GAAY,KAAO,GACnBC,GAAK,OAAO,YAAgB,IAA8B,IAAI,YAAgB,OAAO,OAAW,IAAc,CAChH,OAAOC,EAAK,CAEV,OADY,OAAO,KAAKA,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EACvD,UACZ,CACH,EAAI,CACF,OAAOA,EAAK,CACV,IAAIC,EAAM,GACV,QAASpG,EAAI,EAAGA,EAAImG,EAAI,OAAQnG,IAC9BoG,GAAO,OAAO,aAAaD,EAAInG,CAAC,CAAC,EAEnC,OAAOoG,CACR,CACH,EACIC,GAAe,KAAM,CACvB,aAAc,CACZ,KAAK,IAAM,EACX,KAAK,IAAM,GACX,KAAK,OAAS,IAAI,WAAWJ,EAAS,CACvC,CACD,MAAMK,EAAG,CACP,KAAM,CAAE,OAAAC,CAAQ,EAAG,KACnBA,EAAO,KAAK,KAAK,EAAID,EACjB,KAAK,MAAQL,KACf,KAAK,KAAOC,GAAG,OAAOK,CAAM,EAC5B,KAAK,IAAM,EAEd,CACD,OAAQ,CACN,KAAM,CAAE,OAAAA,EAAQ,IAAAH,EAAK,IAAA7L,CAAG,EAAK,KAC7B,OAAOA,EAAM,EAAI6L,EAAMF,GAAG,OAAOK,EAAO,SAAS,EAAGhM,CAAG,CAAC,EAAI6L,CAC7D,CACH,EAuTA,SAASI,GAAOC,EAAS,CACvB,MAAMC,EAAS,IAAIL,GACnB,IAAIM,EAAe,EACfC,EAAa,EACbC,EAAe,EACfC,EAAa,EACjB,QAAS9G,EAAI,EAAGA,EAAIyG,EAAQ,OAAQzG,IAAK,CACvC,MAAMpG,EAAO6M,EAAQzG,CAAC,EAEtB,GADIA,EAAI,GAAG0G,EAAO,MAAMpB,EAAS,EAC7B1L,EAAK,SAAW,EAAG,SACvB,IAAImN,EAAY,EAChB,QAAS3G,EAAI,EAAGA,EAAIxG,EAAK,OAAQwG,IAAK,CACpC,MAAM4G,EAAUpN,EAAKwG,CAAC,EAClBA,EAAI,GAAGsG,EAAO,MAAMrB,EAAK,EAC7B0B,EAAYpB,EAAce,EAAQM,EAAQ,CAAC,EAAGD,CAAS,EACnDC,EAAQ,SAAW,IACvBL,EAAehB,EAAce,EAAQM,EAAQ,CAAC,EAAGL,CAAY,EAC7DC,EAAajB,EAAce,EAAQM,EAAQ,CAAC,EAAGJ,CAAU,EACzDC,EAAelB,EAAce,EAAQM,EAAQ,CAAC,EAAGH,CAAY,EACzDG,EAAQ,SAAW,IACvBF,EAAanB,EAAce,EAAQM,EAAQ,CAAC,EAAGF,CAAU,GAC1D,CACF,CACD,OAAOJ,EAAO,OAChB,CC3ZA,MAAMO,CAAO,CACZ,YAAYC,EAAK,CAChB,KAAK,KAAOA,aAAeD,EAASC,EAAI,KAAK,MAAO,EAAG,EACvD,CAED,IAAIC,EAAG,CACN,KAAK,KAAKA,GAAK,CAAC,GAAK,IAAMA,EAAI,GAC/B,CAED,IAAIA,EAAG,CACN,MAAO,CAAC,EAAE,KAAK,KAAKA,GAAK,CAAC,EAAK,IAAMA,EAAI,IACzC,CACF,CAEA,MAAMC,CAAM,CACX,YAAYlN,EAAOC,EAAK6C,EAAS,CAChC,KAAK,MAAQ9C,EACb,KAAK,IAAMC,EACX,KAAK,SAAW6C,EAEhB,KAAK,MAAQ,GACb,KAAK,MAAQ,GAEb,KAAK,QAAUA,EACf,KAAK,UAAY,GACjB,KAAK,OAAS,GAGb,KAAK,SAAW,KAChB,KAAK,KAAO,IAEb,CAED,WAAWA,EAAS,CACnB,KAAK,OAASA,CACd,CAED,YAAYA,EAAS,CACpB,KAAK,MAAQ,KAAK,MAAQA,CAC1B,CAED,OAAQ,CACP,MAAMqK,EAAQ,IAAID,EAAM,KAAK,MAAO,KAAK,IAAK,KAAK,QAAQ,EAE3D,OAAAC,EAAM,MAAQ,KAAK,MACnBA,EAAM,MAAQ,KAAK,MACnBA,EAAM,QAAU,KAAK,QACrBA,EAAM,UAAY,KAAK,UACvBA,EAAM,OAAS,KAAK,OAEbA,CACP,CAED,SAASvJ,EAAO,CACf,OAAO,KAAK,MAAQA,GAASA,EAAQ,KAAK,GAC1C,CAED,SAASwJ,EAAI,CACZ,IAAID,EAAQ,KACZ,KAAOA,GACNC,EAAGD,CAAK,EACRA,EAAQA,EAAM,IAEf,CAED,aAAaC,EAAI,CAChB,IAAID,EAAQ,KACZ,KAAOA,GACNC,EAAGD,CAAK,EACRA,EAAQA,EAAM,QAEf,CAED,KAAKrK,EAASuK,EAAWC,EAAa,CACrC,YAAK,QAAUxK,EACVwK,IACJ,KAAK,MAAQ,GACb,KAAK,MAAQ,IAEd,KAAK,UAAYD,EAEjB,KAAK,OAAS,GAEP,IACP,CAED,YAAYvK,EAAS,CACpB,KAAK,MAAQA,EAAU,KAAK,KAC5B,CAED,aAAaA,EAAS,CACrB,KAAK,MAAQA,EAAU,KAAK,KAC5B,CAED,OAAQ,CACP,KAAK,MAAQ,GACb,KAAK,MAAQ,GACT,KAAK,SACR,KAAK,QAAU,KAAK,SACpB,KAAK,UAAY,GACjB,KAAK,OAAS,GAEf,CAED,MAAMc,EAAO,CACZ,MAAM2J,EAAa3J,EAAQ,KAAK,MAE1B4J,EAAiB,KAAK,SAAS,MAAM,EAAGD,CAAU,EAClDE,EAAgB,KAAK,SAAS,MAAMF,CAAU,EAEpD,KAAK,SAAWC,EAEhB,MAAME,EAAW,IAAIR,EAAMtJ,EAAO,KAAK,IAAK6J,CAAa,EACzD,OAAAC,EAAS,MAAQ,KAAK,MACtB,KAAK,MAAQ,GAEb,KAAK,IAAM9J,EAEP,KAAK,QASR8J,EAAS,KAAK,GAAI,EAAK,EACvB,KAAK,QAAU,IAEf,KAAK,QAAUF,EAGhBE,EAAS,KAAO,KAAK,KACjBA,EAAS,OAAMA,EAAS,KAAK,SAAWA,GAC5CA,EAAS,SAAW,KACpB,KAAK,KAAOA,EAELA,CACP,CAED,UAAW,CACV,OAAO,KAAK,MAAQ,KAAK,QAAU,KAAK,KACxC,CAED,QAAQC,EAAI,CAEX,GADA,KAAK,MAAQ,KAAK,MAAM,QAAQA,EAAI,EAAE,EAClC,KAAK,MAAM,OAAQ,MAAO,GAE9B,MAAMC,EAAU,KAAK,QAAQ,QAAQD,EAAI,EAAE,EAE3C,GAAIC,EAAQ,OACX,OAAIA,IAAY,KAAK,UACpB,KAAK,MAAM,KAAK,MAAQA,EAAQ,MAAM,EAAE,KAAK,GAAI,OAAW,EAAI,EAC5D,KAAK,QAER,KAAK,KAAKA,EAAS,KAAK,UAAW,EAAI,GAGlC,GAKP,GAHA,KAAK,KAAK,GAAI,OAAW,EAAI,EAE7B,KAAK,MAAQ,KAAK,MAAM,QAAQD,EAAI,EAAE,EAClC,KAAK,MAAM,OAAQ,MAAO,EAE/B,CAED,UAAUA,EAAI,CAEb,GADA,KAAK,MAAQ,KAAK,MAAM,QAAQA,EAAI,EAAE,EAClC,KAAK,MAAM,OAAQ,MAAO,GAE9B,MAAMC,EAAU,KAAK,QAAQ,QAAQD,EAAI,EAAE,EAE3C,GAAIC,EAAQ,OAAQ,CACnB,GAAIA,IAAY,KAAK,QAAS,CAC7B,MAAMF,EAAW,KAAK,MAAM,KAAK,IAAME,EAAQ,MAAM,EACjD,KAAK,QAERF,EAAS,KAAKE,EAAS,KAAK,UAAW,EAAI,EAE5C,KAAK,KAAK,GAAI,OAAW,EAAI,CAC7B,CACD,MAAO,EACV,SACG,KAAK,KAAK,GAAI,OAAW,EAAI,EAE7B,KAAK,MAAQ,KAAK,MAAM,QAAQD,EAAI,EAAE,EAClC,KAAK,MAAM,OAAQ,MAAO,EAE/B,CACF,CAEA,SAASE,IAAU,CAClB,OAAI,OAAO,WAAe,KAAe,OAAO,WAAW,MAAS,WAC3DC,GAAQ,WAAW,KAAK,SAAS,mBAAmBA,CAAG,CAAC,CAAC,EACvD,OAAO,QAAW,WACpBA,GAAQ,OAAO,KAAKA,EAAK,OAAO,EAAE,SAAS,QAAQ,EAEpD,IAAM,CACZ,MAAM,IAAI,MAAM,yEAAyE,CAC5F,CAEA,CAEA,MAAMC,GAAqBF,GAAO,EAElC,MAAMG,EAAU,CACf,YAAYC,EAAY,CACvB,KAAK,QAAU,EACf,KAAK,KAAOA,EAAW,KACvB,KAAK,QAAUA,EAAW,QAC1B,KAAK,eAAiBA,EAAW,eACjC,KAAK,MAAQA,EAAW,MACxB,KAAK,SAAW3B,GAAO2B,EAAW,QAAQ,EACtC,OAAOA,EAAW,oBAAwB,MAC7C,KAAK,oBAAsBA,EAAW,qBAEnC,OAAOA,EAAW,QAAY,MACjC,KAAK,QAAUA,EAAW,QAE3B,CAED,UAAW,CACV,OAAO,KAAK,UAAU,IAAI,CAC1B,CAED,OAAQ,CACP,MAAO,8CAAgDF,GAAK,KAAK,SAAU,CAAA,CAC3E,CACF,CAEA,SAASG,GAAYpG,EAAM,CAC1B,MAAMqG,EAAQrG,EAAK,MAAM;AAAA,CAAI,EAEvBsG,EAASD,EAAM,OAAQzO,GAAS,OAAO,KAAKA,CAAI,CAAC,EACjD2O,EAASF,EAAM,OAAQzO,GAAS,SAAS,KAAKA,CAAI,CAAC,EAEzD,GAAI0O,EAAO,SAAW,GAAKC,EAAO,SAAW,EAC5C,OAAO,KAMR,GAAID,EAAO,QAAUC,EAAO,OAC3B,MAAO,IAIR,MAAMC,EAAMD,EAAO,OAAO,CAACE,EAAUC,IAAY,CAChD,MAAMC,EAAY,MAAM,KAAKD,CAAO,EAAE,CAAC,EAAE,OACzC,OAAO,KAAK,IAAIC,EAAWF,CAAQ,CACnC,EAAE,GAAQ,EAEX,OAAO,IAAI,MAAMD,EAAM,CAAC,EAAE,KAAK,GAAG,CACnC,CAEA,SAASI,GAAgBC,EAAMC,EAAI,CAClC,MAAMC,EAAYF,EAAK,MAAM,OAAO,EAC9BG,EAAUF,EAAG,MAAM,OAAO,EAIhC,IAFAC,EAAU,IAAG,EAENA,EAAU,CAAC,IAAMC,EAAQ,CAAC,GAChCD,EAAU,MAAK,EACfC,EAAQ,MAAK,EAGd,GAAID,EAAU,OAAQ,CACrB,IAAI/I,EAAI+I,EAAU,OAClB,KAAO/I,KAAK+I,EAAU/I,CAAC,EAAI,IAC3B,CAED,OAAO+I,EAAU,OAAOC,CAAO,EAAE,KAAK,GAAG,CAC1C,CAEA,MAAMC,GAAW,OAAO,UAAU,SAElC,SAASC,GAASC,EAAO,CACxB,OAAOF,GAAS,KAAKE,CAAK,IAAM,iBACjC,CAEA,SAASC,GAAW1F,EAAQ,CAC3B,MAAM2F,EAAgB3F,EAAO,MAAM;AAAA,CAAI,EACjC4F,EAAc,CAAA,EAEpB,QAAStJ,EAAI,EAAGzF,EAAM,EAAGyF,EAAIqJ,EAAc,OAAQrJ,IAClDsJ,EAAY,KAAK/O,CAAG,EACpBA,GAAO8O,EAAcrJ,CAAC,EAAE,OAAS,EAGlC,OAAO,SAAgBlC,EAAO,CAC7B,IAAIkC,EAAI,EACJI,EAAIkJ,EAAY,OACpB,KAAOtJ,EAAII,GAAG,CACb,MAAMmJ,EAAKvJ,EAAII,GAAM,EACjBtC,EAAQwL,EAAYC,CAAC,EACxBnJ,EAAImJ,EAEJvJ,EAAIuJ,EAAI,CAET,CACD,MAAM3P,EAAOoG,EAAI,EACXnG,EAASiE,EAAQwL,EAAY1P,CAAI,EACvC,MAAO,CAAE,KAAAA,EAAM,OAAAC,EACjB,CACA,CAEA,MAAM2P,GAAY,KAElB,MAAMC,EAAS,CACd,YAAYC,EAAO,CAClB,KAAK,MAAQA,EACb,KAAK,kBAAoB,EACzB,KAAK,oBAAsB,EAC3B,KAAK,IAAM,GACX,KAAK,YAAc,KAAK,IAAI,KAAK,iBAAiB,EAAI,GACtD,KAAK,QAAU,IACf,CAED,QAAQC,EAAa3M,EAAS4M,EAAKC,EAAW,CAC7C,GAAI7M,EAAQ,OAAQ,CACnB,MAAM8M,EAAwB9M,EAAQ,OAAS,EAC/C,IAAI+M,EAAiB/M,EAAQ,QAAQ;AAAA,EAAM,CAAC,EACxCgN,EAAyB,GAG7B,KAAOD,GAAkB,GAAKD,EAAwBC,GAAgB,CACrE,MAAM/C,EAAU,CAAC,KAAK,oBAAqB2C,EAAaC,EAAI,KAAMA,EAAI,MAAM,EACxEC,GAAa,GAChB7C,EAAQ,KAAK6C,CAAS,EAEvB,KAAK,YAAY,KAAK7C,CAAO,EAE7B,KAAK,mBAAqB,EAC1B,KAAK,IAAI,KAAK,iBAAiB,EAAI,KAAK,YAAc,GACtD,KAAK,oBAAsB,EAE3BgD,EAAyBD,EACzBA,EAAiB/M,EAAQ,QAAQ;AAAA,EAAM+M,EAAiB,CAAC,CACzD,CAED,MAAM/C,EAAU,CAAC,KAAK,oBAAqB2C,EAAaC,EAAI,KAAMA,EAAI,MAAM,EACxEC,GAAa,GAChB7C,EAAQ,KAAK6C,CAAS,EAEvB,KAAK,YAAY,KAAK7C,CAAO,EAE7B,KAAK,QAAQhK,EAAQ,MAAMgN,EAAyB,CAAC,CAAC,CACzD,MAAa,KAAK,UACf,KAAK,YAAY,KAAK,KAAK,OAAO,EAClC,KAAK,QAAQhN,CAAO,GAGrB,KAAK,QAAU,IACf,CAED,iBAAiB2M,EAAatC,EAAO4C,EAAUL,EAAKM,EAAoB,CACvE,IAAIC,EAAoB9C,EAAM,MAC1B5M,EAAQ,GAER2P,EAAsB,GAE1B,KAAOD,EAAoB9C,EAAM,KAAK,CACrC,GAAI4C,EAASE,CAAiB,IAAM;AAAA,EACnCP,EAAI,MAAQ,EACZA,EAAI,OAAS,EACb,KAAK,mBAAqB,EAC1B,KAAK,IAAI,KAAK,iBAAiB,EAAI,KAAK,YAAc,GACtD,KAAK,oBAAsB,EAC3BnP,EAAQ,GACR2P,EAAsB,OAChB,CACN,GAAI,KAAK,OAAS3P,GAASyP,EAAmB,IAAIC,CAAiB,EAAG,CACrE,MAAMnD,EAAU,CAAC,KAAK,oBAAqB2C,EAAaC,EAAI,KAAMA,EAAI,MAAM,EAExE,KAAK,QAAU,WAEdJ,GAAU,KAAKS,EAASE,CAAiB,CAAC,EAExCC,IACJ,KAAK,YAAY,KAAKpD,CAAO,EAC7BoD,EAAsB,KAIvB,KAAK,YAAY,KAAKpD,CAAO,EAC7BoD,EAAsB,IAGvB,KAAK,YAAY,KAAKpD,CAAO,CAE9B,CAED4C,EAAI,QAAU,EACd,KAAK,qBAAuB,EAC5BnP,EAAQ,EACR,CAED0P,GAAqB,CACrB,CAED,KAAK,QAAU,IACf,CAED,QAAQnC,EAAK,CACZ,GAAI,CAACA,EAAK,OAEV,MAAMK,EAAQL,EAAI,MAAM;AAAA,CAAI,EAE5B,GAAIK,EAAM,OAAS,EAAG,CACrB,QAASrI,EAAI,EAAGA,EAAIqI,EAAM,OAAS,EAAGrI,IACrC,KAAK,oBACL,KAAK,IAAI,KAAK,iBAAiB,EAAI,KAAK,YAAc,GAEvD,KAAK,oBAAsB,CAC3B,CAED,KAAK,qBAAuBqI,EAAMA,EAAM,OAAS,CAAC,EAAE,MACpD,CACF,CAEA,MAAMlB,EAAI;AAAA,EAEJkD,EAAS,CACd,WAAY,GACZ,YAAa,GACb,UAAW,EACZ,EAEA,MAAMC,CAAY,CACjB,YAAYC,EAAQzJ,EAAU,GAAI,CACjC,MAAMuG,EAAQ,IAAID,EAAM,EAAGmD,EAAO,OAAQA,CAAM,EAEhD,OAAO,iBAAiB,KAAM,CAC7B,SAAU,CAAE,SAAU,GAAM,MAAOA,CAAQ,EAC3C,MAAO,CAAE,SAAU,GAAM,MAAO,EAAI,EACpC,MAAO,CAAE,SAAU,GAAM,MAAO,EAAI,EACpC,WAAY,CAAE,SAAU,GAAM,MAAOlD,CAAO,EAC5C,UAAW,CAAE,SAAU,GAAM,MAAOA,CAAO,EAC3C,kBAAmB,CAAE,SAAU,GAAM,MAAOA,CAAO,EACnD,QAAS,CAAE,SAAU,GAAM,MAAO,CAAA,CAAI,EACtC,MAAO,CAAE,SAAU,GAAM,MAAO,CAAA,CAAI,EACpC,SAAU,CAAE,SAAU,GAAM,MAAOvG,EAAQ,QAAU,EACrD,sBAAuB,CAAE,SAAU,GAAM,MAAOA,EAAQ,qBAAuB,EAC/E,mBAAoB,CAAE,SAAU,GAAM,MAAO,IAAImG,CAAU,EAC3D,YAAa,CAAE,SAAU,GAAM,MAAO,CAAA,CAAI,EAC1C,UAAW,CAAE,SAAU,GAAM,MAAO,MAAW,EAC/C,WAAY,CAAE,SAAU,GAAM,MAAOnG,EAAQ,UAAY,EACzD,OAAQ,CAAE,SAAU,GAAM,MAAOA,EAAQ,QAAU,CAAG,CACzD,CAAG,EAED,KAAK,QAAQ,CAAC,EAAIuG,EAClB,KAAK,MAAMkD,EAAO,MAAM,EAAIlD,CAC5B,CAED,qBAAqB7M,EAAM,CAC1B,KAAK,mBAAmB,IAAIA,CAAI,CAChC,CAED,OAAOwC,EAAS,CACf,GAAI,OAAOA,GAAY,SAAU,MAAM,IAAI,UAAU,gCAAgC,EAErF,YAAK,OAASA,EACP,IACP,CAED,WAAWc,EAAOd,EAAS,CAG1B,GAFAc,EAAQA,EAAQ,KAAK,OAEjB,OAAOd,GAAY,SAAU,MAAM,IAAI,UAAU,mCAAmC,EAExF,KAAK,OAAOc,CAAK,EAEjB,MAAMuJ,EAAQ,KAAK,MAAMvJ,CAAK,EAE9B,OAAIuJ,EACHA,EAAM,WAAWrK,CAAO,EAExB,KAAK,OAASA,EAER,IACP,CAED,YAAYc,EAAOd,EAAS,CAG3B,GAFAc,EAAQA,EAAQ,KAAK,OAEjB,OAAOd,GAAY,SAAU,MAAM,IAAI,UAAU,mCAAmC,EAExF,KAAK,OAAOc,CAAK,EAEjB,MAAMuJ,EAAQ,KAAK,QAAQvJ,CAAK,EAEhC,OAAIuJ,EACHA,EAAM,YAAYrK,CAAO,EAEzB,KAAK,OAASA,EAER,IACP,CAED,OAAQ,CACP,MAAMwN,EAAS,IAAIF,EAAY,KAAK,SAAU,CAAE,SAAU,KAAK,SAAU,OAAQ,KAAK,MAAQ,CAAA,EAE9F,IAAIG,EAAgB,KAAK,WACrBC,EAAeF,EAAO,WAAaA,EAAO,kBAAoBC,EAAc,MAAK,EAErF,KAAOA,GAAe,CACrBD,EAAO,QAAQE,EAAY,KAAK,EAAIA,EACpCF,EAAO,MAAME,EAAY,GAAG,EAAIA,EAEhC,MAAMC,EAAoBF,EAAc,KAClCG,EAAkBD,GAAqBA,EAAkB,MAAK,EAEhEC,IACHF,EAAY,KAAOE,EACnBA,EAAgB,SAAWF,EAE3BA,EAAcE,GAGfH,EAAgBE,CAChB,CAED,OAAAH,EAAO,UAAYE,EAEf,KAAK,wBACRF,EAAO,sBAAwB,KAAK,sBAAsB,MAAK,GAGhEA,EAAO,mBAAqB,IAAIvD,EAAO,KAAK,kBAAkB,EAE9DuD,EAAO,MAAQ,KAAK,MACpBA,EAAO,MAAQ,KAAK,MAEbA,CACP,CAED,mBAAmB1J,EAAS,CAC3BA,EAAUA,GAAW,GAErB,MAAM6I,EAAc,EACdkB,EAAQ,OAAO,KAAK,KAAK,WAAW,EACpCC,EAAW,IAAIrB,GAAS3I,EAAQ,KAAK,EAErCiK,EAAS3B,GAAW,KAAK,QAAQ,EAEvC,OAAI,KAAK,OACR0B,EAAS,QAAQ,KAAK,KAAK,EAG5B,KAAK,WAAW,SAAUzD,GAAU,CACnC,MAAMuC,EAAMmB,EAAO1D,EAAM,KAAK,EAE1BA,EAAM,MAAM,QAAQyD,EAAS,QAAQzD,EAAM,KAAK,EAEhDA,EAAM,OACTyD,EAAS,QACRnB,EACAtC,EAAM,QACNuC,EACAvC,EAAM,UAAYwD,EAAM,QAAQxD,EAAM,QAAQ,EAAI,EACvD,EAEIyD,EAAS,iBAAiBnB,EAAatC,EAAO,KAAK,SAAUuC,EAAK,KAAK,kBAAkB,EAGtFvC,EAAM,MAAM,QAAQyD,EAAS,QAAQzD,EAAM,KAAK,CACvD,CAAG,EAEG,KAAK,OACRyD,EAAS,QAAQ,KAAK,KAAK,EAGrB,CACN,KAAMhK,EAAQ,KAAOA,EAAQ,KAAK,MAAM,OAAO,EAAE,IAAG,EAAK,OACzD,QAAS,CACRA,EAAQ,OAAS8H,GAAgB9H,EAAQ,MAAQ,GAAIA,EAAQ,MAAM,EAAIA,EAAQ,MAAQ,EACvF,EACD,eAAgBA,EAAQ,eAAiB,CAAC,KAAK,QAAQ,EAAI,OAC3D,MAAA+J,EACA,SAAUC,EAAS,IACnB,oBAAqB,KAAK,WAAa,CAACnB,CAAW,EAAI,MAC1D,CACE,CAED,YAAY7I,EAAS,CACpB,OAAO,IAAIoH,GAAU,KAAK,mBAAmBpH,CAAO,CAAC,CACrD,CAED,kBAAmB,CACd,KAAK,YAAc,SACtB,KAAK,UAAYsH,GAAY,KAAK,QAAQ,EAE3C,CAED,qBAAsB,CACrB,YAAK,iBAAgB,EACd,KAAK,SACZ,CAED,iBAAkB,CACjB,YAAK,iBAAgB,EACd,KAAK,YAAc,KAAO,IAAO,KAAK,SAC7C,CAED,OAAO4C,EAAWlK,EAAS,CAC1B,MAAMmK,EAAU,aAYhB,GAVI/B,GAAS8B,CAAS,IACrBlK,EAAUkK,EACVA,EAAY,QAGTA,IAAc,SACjB,KAAK,iBAAgB,EACrBA,EAAY,KAAK,WAAa,KAG3BA,IAAc,GAAI,OAAO,KAE7BlK,EAAUA,GAAW,GAGrB,MAAMoK,EAAa,CAAA,EAEfpK,EAAQ,UAEV,OAAOA,EAAQ,QAAQ,CAAC,GAAM,SAAW,CAACA,EAAQ,OAAO,EAAIA,EAAQ,SAC3D,QAASqK,GAAc,CACjC,QAASnL,EAAImL,EAAU,CAAC,EAAGnL,EAAImL,EAAU,CAAC,EAAGnL,GAAK,EACjDkL,EAAWlL,CAAC,EAAI,EAErB,CAAI,EAGF,IAAIoL,EAA4BtK,EAAQ,cAAgB,GACxD,MAAMuK,EAAY1G,GACbyG,EAAkC,GAAGJ,CAAS,GAAGrG,CAAK,IAC1DyG,EAA4B,GACrBzG,GAGR,KAAK,MAAQ,KAAK,MAAM,QAAQsG,EAASI,CAAQ,EAEjD,IAAIC,EAAY,EACZjE,EAAQ,KAAK,WAEjB,KAAOA,GAAO,CACb,MAAMlN,EAAMkN,EAAM,IAElB,GAAIA,EAAM,OACJ6D,EAAWI,CAAS,IACxBjE,EAAM,QAAUA,EAAM,QAAQ,QAAQ4D,EAASI,CAAQ,EAEnDhE,EAAM,QAAQ,SACjB+D,EAA4B/D,EAAM,QAAQA,EAAM,QAAQ,OAAS,CAAC,IAAM;AAAA,QAM1E,KAFAiE,EAAYjE,EAAM,MAEXiE,EAAYnR,GAAK,CACvB,GAAI,CAAC+Q,EAAWI,CAAS,EAAG,CAC3B,MAAM9Q,EAAO,KAAK,SAAS8Q,CAAS,EAEhC9Q,IAAS;AAAA,EACZ4Q,EAA4B,GAClB5Q,IAAS,MAAQ4Q,IAC3BA,EAA4B,GAExBE,IAAcjE,EAAM,QAGvB,KAAK,YAAYA,EAAOiE,CAAS,EACjCjE,EAAQA,EAAM,MACdA,EAAM,aAAa2D,CAAS,EAG9B,CAEDM,GAAa,CACb,CAGFA,EAAYjE,EAAM,IAClBA,EAAQA,EAAM,IACd,CAED,YAAK,MAAQ,KAAK,MAAM,QAAQ4D,EAASI,CAAQ,EAE1C,IACP,CAED,QAAS,CACR,MAAM,IAAI,MACT,iFACH,CACE,CAED,WAAWvN,EAAOd,EAAS,CAC1B,OAAKqN,EAAO,aACX,QAAQ,KACP,oFACJ,EACGA,EAAO,WAAa,IAGd,KAAK,WAAWvM,EAAOd,CAAO,CACrC,CAED,YAAYc,EAAOd,EAAS,CAC3B,OAAKqN,EAAO,cACX,QAAQ,KACP,uFACJ,EACGA,EAAO,YAAc,IAGf,KAAK,aAAavM,EAAOd,CAAO,CACvC,CAED,KAAK9C,EAAOC,EAAK2D,EAAO,CAKvB,GAJA5D,EAAQA,EAAQ,KAAK,OACrBC,EAAMA,EAAM,KAAK,OACjB2D,EAAQA,EAAQ,KAAK,OAEjBA,GAAS5D,GAAS4D,GAAS3D,EAAK,MAAM,IAAI,MAAM,uCAAuC,EAE3F,KAAK,OAAOD,CAAK,EACjB,KAAK,OAAOC,CAAG,EACf,KAAK,OAAO2D,CAAK,EAEjB,MAAMrD,EAAQ,KAAK,QAAQP,CAAK,EAC1BqR,EAAO,KAAK,MAAMpR,CAAG,EAErBqR,EAAU/Q,EAAM,SAChBgR,EAAWF,EAAK,KAEhBG,EAAW,KAAK,QAAQ5N,CAAK,EACnC,GAAI,CAAC4N,GAAYH,IAAS,KAAK,UAAW,OAAO,KACjD,MAAMI,EAAUD,EAAWA,EAAS,SAAW,KAAK,UAEpD,OAAIF,IAASA,EAAQ,KAAOC,GACxBA,IAAUA,EAAS,SAAWD,GAE9BG,IAASA,EAAQ,KAAOlR,GACxBiR,IAAUA,EAAS,SAAWH,GAE7B9Q,EAAM,WAAU,KAAK,WAAa8Q,EAAK,MACvCA,EAAK,OACT,KAAK,UAAY9Q,EAAM,SACvB,KAAK,UAAU,KAAO,MAGvBA,EAAM,SAAWkR,EACjBJ,EAAK,KAAOG,GAAY,KAEnBC,IAAS,KAAK,WAAalR,GAC3BiR,IAAU,KAAK,UAAYH,GACzB,IACP,CAED,UAAUrR,EAAOC,EAAK6C,EAAS8D,EAAS,CACvC,OAAAA,EAAUA,GAAW,GACd,KAAK,OAAO5G,EAAOC,EAAK6C,EAAS,CAAE,GAAG8D,EAAS,UAAW,CAACA,EAAQ,WAAa,CAAA,CACvF,CAED,OAAO5G,EAAOC,EAAK6C,EAAS8D,EAAS,CAIpC,GAHA5G,EAAQA,EAAQ,KAAK,OACrBC,EAAMA,EAAM,KAAK,OAEb,OAAO6C,GAAY,SAAU,MAAM,IAAI,UAAU,sCAAsC,EAE3F,GAAI,KAAK,SAAS,SAAW,EAAG,CAC/B,KAAO9C,EAAQ,GAAGA,GAAS,KAAK,SAAS,OACzC,KAAOC,EAAM,GAAGA,GAAO,KAAK,SAAS,MACrC,CAED,GAAIA,EAAM,KAAK,SAAS,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACtE,GAAID,IAAUC,EACb,MAAM,IAAI,MACT,+EACJ,EAEE,KAAK,OAAOD,CAAK,EACjB,KAAK,OAAOC,CAAG,EAEX2G,IAAY,KACVuJ,EAAO,YACX,QAAQ,KACP,+HACL,EACIA,EAAO,UAAY,IAGpBvJ,EAAU,CAAE,UAAW,KAExB,MAAMyG,EAAYzG,IAAY,OAAYA,EAAQ,UAAY,GACxD8K,EAAY9K,IAAY,OAAYA,EAAQ,UAAY,GAE9D,GAAIyG,EAAW,CACd,MAAM0C,EAAW,KAAK,SAAS,MAAM/P,EAAOC,CAAG,EAC/C,OAAO,eAAe,KAAK,YAAa8P,EAAU,CACjD,SAAU,GACV,MAAO,GACP,WAAY,EAChB,CAAI,CACD,CAED,MAAMxP,EAAQ,KAAK,QAAQP,CAAK,EAC1BqR,EAAO,KAAK,MAAMpR,CAAG,EAE3B,GAAIM,EAAO,CACV,IAAI4M,EAAQ5M,EACZ,KAAO4M,IAAUkE,GAAM,CACtB,GAAIlE,EAAM,OAAS,KAAK,QAAQA,EAAM,GAAG,EACxC,MAAM,IAAI,MAAM,uCAAuC,EAExDA,EAAQA,EAAM,KACdA,EAAM,KAAK,GAAI,EAAK,CACpB,CAED5M,EAAM,KAAKuC,EAASuK,EAAW,CAACqE,CAAS,CAC5C,KAAS,CAEN,MAAMhE,EAAW,IAAIR,EAAMlN,EAAOC,EAAK,EAAE,EAAE,KAAK6C,EAASuK,CAAS,EAGlEgE,EAAK,KAAO3D,EACZA,EAAS,SAAW2D,CACpB,CACD,OAAO,IACP,CAED,QAAQvO,EAAS,CAChB,GAAI,OAAOA,GAAY,SAAU,MAAM,IAAI,UAAU,gCAAgC,EAErF,YAAK,MAAQA,EAAU,KAAK,MACrB,IACP,CAED,YAAYc,EAAOd,EAAS,CAG3B,GAFAc,EAAQA,EAAQ,KAAK,OAEjB,OAAOd,GAAY,SAAU,MAAM,IAAI,UAAU,mCAAmC,EAExF,KAAK,OAAOc,CAAK,EAEjB,MAAMuJ,EAAQ,KAAK,MAAMvJ,CAAK,EAE9B,OAAIuJ,EACHA,EAAM,YAAYrK,CAAO,EAEzB,KAAK,MAAQA,EAAU,KAAK,MAEtB,IACP,CAED,aAAac,EAAOd,EAAS,CAG5B,GAFAc,EAAQA,EAAQ,KAAK,OAEjB,OAAOd,GAAY,SAAU,MAAM,IAAI,UAAU,mCAAmC,EAExF,KAAK,OAAOc,CAAK,EAEjB,MAAMuJ,EAAQ,KAAK,QAAQvJ,CAAK,EAEhC,OAAIuJ,EACHA,EAAM,aAAarK,CAAO,EAE1B,KAAK,MAAQA,EAAU,KAAK,MAEtB,IACP,CAED,OAAO9C,EAAOC,EAAK,CAIlB,GAHAD,EAAQA,EAAQ,KAAK,OACrBC,EAAMA,EAAM,KAAK,OAEb,KAAK,SAAS,SAAW,EAAG,CAC/B,KAAOD,EAAQ,GAAGA,GAAS,KAAK,SAAS,OACzC,KAAOC,EAAM,GAAGA,GAAO,KAAK,SAAS,MACrC,CAED,GAAID,IAAUC,EAAK,OAAO,KAE1B,GAAID,EAAQ,GAAKC,EAAM,KAAK,SAAS,OAAQ,MAAM,IAAI,MAAM,4BAA4B,EACzF,GAAID,EAAQC,EAAK,MAAM,IAAI,MAAM,gCAAgC,EAEjE,KAAK,OAAOD,CAAK,EACjB,KAAK,OAAOC,CAAG,EAEf,IAAIkN,EAAQ,KAAK,QAAQnN,CAAK,EAE9B,KAAOmN,GACNA,EAAM,MAAQ,GACdA,EAAM,MAAQ,GACdA,EAAM,KAAK,EAAE,EAEbA,EAAQlN,EAAMkN,EAAM,IAAM,KAAK,QAAQA,EAAM,GAAG,EAAI,KAErD,OAAO,IACP,CAED,MAAMnN,EAAOC,EAAK,CAIjB,GAHAD,EAAQA,EAAQ,KAAK,OACrBC,EAAMA,EAAM,KAAK,OAEb,KAAK,SAAS,SAAW,EAAG,CAC/B,KAAOD,EAAQ,GAAGA,GAAS,KAAK,SAAS,OACzC,KAAOC,EAAM,GAAGA,GAAO,KAAK,SAAS,MACrC,CAED,GAAID,IAAUC,EAAK,OAAO,KAE1B,GAAID,EAAQ,GAAKC,EAAM,KAAK,SAAS,OAAQ,MAAM,IAAI,MAAM,4BAA4B,EACzF,GAAID,EAAQC,EAAK,MAAM,IAAI,MAAM,gCAAgC,EAEjE,KAAK,OAAOD,CAAK,EACjB,KAAK,OAAOC,CAAG,EAEf,IAAIkN,EAAQ,KAAK,QAAQnN,CAAK,EAE9B,KAAOmN,GACNA,EAAM,MAAK,EAEXA,EAAQlN,EAAMkN,EAAM,IAAM,KAAK,QAAQA,EAAM,GAAG,EAAI,KAErD,OAAO,IACP,CAED,UAAW,CACV,GAAI,KAAK,MAAM,OAAQ,OAAO,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EAC9D,IAAIA,EAAQ,KAAK,UACjB,EAAG,CACF,GAAIA,EAAM,MAAM,OAAQ,OAAOA,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,EACjE,GAAIA,EAAM,QAAQ,OAAQ,OAAOA,EAAM,QAAQA,EAAM,QAAQ,OAAS,CAAC,EACvE,GAAIA,EAAM,MAAM,OAAQ,OAAOA,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,CACpE,OAAYA,EAAQA,EAAM,UACxB,OAAI,KAAK,MAAM,OAAe,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EACvD,EACP,CAED,UAAW,CACV,IAAIwE,EAAY,KAAK,MAAM,YAAY1E,CAAC,EACxC,GAAI0E,IAAc,GAAI,OAAO,KAAK,MAAM,OAAOA,EAAY,CAAC,EAC5D,IAAIC,EAAU,KAAK,MACfzE,EAAQ,KAAK,UACjB,EAAG,CACF,GAAIA,EAAM,MAAM,OAAS,EAAG,CAE3B,GADAwE,EAAYxE,EAAM,MAAM,YAAYF,CAAC,EACjC0E,IAAc,GAAI,OAAOxE,EAAM,MAAM,OAAOwE,EAAY,CAAC,EAAIC,EACjEA,EAAUzE,EAAM,MAAQyE,CACxB,CAED,GAAIzE,EAAM,QAAQ,OAAS,EAAG,CAE7B,GADAwE,EAAYxE,EAAM,QAAQ,YAAYF,CAAC,EACnC0E,IAAc,GAAI,OAAOxE,EAAM,QAAQ,OAAOwE,EAAY,CAAC,EAAIC,EACnEA,EAAUzE,EAAM,QAAUyE,CAC1B,CAED,GAAIzE,EAAM,MAAM,OAAS,EAAG,CAE3B,GADAwE,EAAYxE,EAAM,MAAM,YAAYF,CAAC,EACjC0E,IAAc,GAAI,OAAOxE,EAAM,MAAM,OAAOwE,EAAY,CAAC,EAAIC,EACjEA,EAAUzE,EAAM,MAAQyE,CACxB,CACJ,OAAYzE,EAAQA,EAAM,UAExB,OADAwE,EAAY,KAAK,MAAM,YAAY1E,CAAC,EAChC0E,IAAc,GAAW,KAAK,MAAM,OAAOA,EAAY,CAAC,EAAIC,EACzD,KAAK,MAAQA,CACpB,CAED,MAAM5R,EAAQ,EAAGC,EAAM,KAAK,SAAS,OAAS,KAAK,OAAQ,CAI1D,GAHAD,EAAQA,EAAQ,KAAK,OACrBC,EAAMA,EAAM,KAAK,OAEb,KAAK,SAAS,SAAW,EAAG,CAC/B,KAAOD,EAAQ,GAAGA,GAAS,KAAK,SAAS,OACzC,KAAOC,EAAM,GAAGA,GAAO,KAAK,SAAS,MACrC,CAED,IAAI4F,EAAS,GAGTsH,EAAQ,KAAK,WACjB,KAAOA,IAAUA,EAAM,MAAQnN,GAASmN,EAAM,KAAOnN,IAAQ,CAE5D,GAAImN,EAAM,MAAQlN,GAAOkN,EAAM,KAAOlN,EACrC,OAAO4F,EAGRsH,EAAQA,EAAM,IACd,CAED,GAAIA,GAASA,EAAM,QAAUA,EAAM,QAAUnN,EAC5C,MAAM,IAAI,MAAM,iCAAiCA,CAAK,yBAAyB,EAEhF,MAAM6R,EAAa1E,EACnB,KAAOA,GAAO,CACTA,EAAM,QAAU0E,IAAe1E,GAASA,EAAM,QAAUnN,KAC3D6F,GAAUsH,EAAM,OAGjB,MAAM2E,EAAc3E,EAAM,MAAQlN,GAAOkN,EAAM,KAAOlN,EACtD,GAAI6R,GAAe3E,EAAM,QAAUA,EAAM,MAAQlN,EAChD,MAAM,IAAI,MAAM,iCAAiCA,CAAG,uBAAuB,EAE5E,MAAM8R,EAAaF,IAAe1E,EAAQnN,EAAQmN,EAAM,MAAQ,EAC1D6E,EAAWF,EAAc3E,EAAM,QAAQ,OAASlN,EAAMkN,EAAM,IAAMA,EAAM,QAAQ,OAQtF,GANAtH,GAAUsH,EAAM,QAAQ,MAAM4E,EAAYC,CAAQ,EAE9C7E,EAAM,QAAU,CAAC2E,GAAe3E,EAAM,MAAQlN,KACjD4F,GAAUsH,EAAM,OAGb2E,EACH,MAGD3E,EAAQA,EAAM,IACd,CAED,OAAOtH,CACP,CAGD,KAAK7F,EAAOC,EAAK,CAChB,MAAMgS,EAAQ,KAAK,QACnB,OAAAA,EAAM,OAAO,EAAGjS,CAAK,EACrBiS,EAAM,OAAOhS,EAAKgS,EAAM,SAAS,MAAM,EAEhCA,CACP,CAED,OAAOrO,EAAO,CACb,GAAI,KAAK,QAAQA,CAAK,GAAK,KAAK,MAAMA,CAAK,EAAG,OAE9C,IAAIuJ,EAAQ,KAAK,kBACb+E,EAAgB/E,EACpB,MAAMgF,EAAgBvO,EAAQuJ,EAAM,IAEpC,KAAOA,GAAO,CACb,GAAIA,EAAM,SAASvJ,CAAK,EAAG,OAAO,KAAK,YAAYuJ,EAAOvJ,CAAK,EAK/D,GAHAuJ,EAAQgF,EAAgB,KAAK,QAAQhF,EAAM,GAAG,EAAI,KAAK,MAAMA,EAAM,KAAK,EAGpEA,IAAU+E,EAAe,OAE7BA,EAAgB/E,CAChB,CACD,CAED,YAAYA,EAAOvJ,EAAO,CACzB,GAAIuJ,EAAM,QAAUA,EAAM,QAAQ,OAAQ,CAEzC,MAAMuC,EAAMR,GAAW,KAAK,QAAQ,EAAEtL,CAAK,EAC3C,MAAM,IAAI,MACT,sDAAsD8L,EAAI,IAAI,IAAIA,EAAI,MAAM,OAAOvC,EAAM,QAAQ,IACrG,CACG,CAED,MAAMO,EAAWP,EAAM,MAAMvJ,CAAK,EAElC,YAAK,MAAMA,CAAK,EAAIuJ,EACpB,KAAK,QAAQvJ,CAAK,EAAI8J,EACtB,KAAK,MAAMA,EAAS,GAAG,EAAIA,EAEvBP,IAAU,KAAK,YAAW,KAAK,UAAYO,GAE/C,KAAK,kBAAoBP,EAClB,EACP,CAED,UAAW,CACV,IAAIW,EAAM,KAAK,MAEXX,EAAQ,KAAK,WACjB,KAAOA,GACNW,GAAOX,EAAM,WACbA,EAAQA,EAAM,KAGf,OAAOW,EAAM,KAAK,KAClB,CAED,SAAU,CACT,IAAIX,EAAQ,KAAK,WACjB,EACC,IACEA,EAAM,MAAM,QAAUA,EAAM,MAAM,KAAM,GACxCA,EAAM,QAAQ,QAAUA,EAAM,QAAQ,KAAI,GAC1CA,EAAM,MAAM,QAAUA,EAAM,MAAM,KAAI,EAEvC,MAAO,SACCA,EAAQA,EAAM,MACxB,MAAO,EACP,CAED,QAAS,CACR,IAAIA,EAAQ,KAAK,WACbiF,EAAS,EACb,GACCA,GAAUjF,EAAM,MAAM,OAASA,EAAM,QAAQ,OAASA,EAAM,MAAM,aACzDA,EAAQA,EAAM,MACxB,OAAOiF,CACP,CAED,WAAY,CACX,OAAO,KAAK,KAAK,UAAU,CAC3B,CAED,KAAKC,EAAU,CACd,OAAO,KAAK,UAAUA,CAAQ,EAAE,QAAQA,CAAQ,CAChD,CAED,eAAeA,EAAU,CACxB,MAAM1E,EAAK,IAAI,QAAQ0E,GAAY,OAAS,IAAI,EAGhD,GADA,KAAK,MAAQ,KAAK,MAAM,QAAQ1E,EAAI,EAAE,EAClC,KAAK,MAAM,OAAQ,MAAO,GAE9B,IAAIR,EAAQ,KAAK,UAEjB,EAAG,CACF,MAAMlN,EAAMkN,EAAM,IACZmF,EAAUnF,EAAM,QAAQQ,CAAE,EAahC,GAVIR,EAAM,MAAQlN,IACb,KAAK,YAAckN,IACtB,KAAK,UAAYA,EAAM,MAGxB,KAAK,MAAMA,EAAM,GAAG,EAAIA,EACxB,KAAK,QAAQA,EAAM,KAAK,KAAK,EAAIA,EAAM,KACvC,KAAK,MAAMA,EAAM,KAAK,GAAG,EAAIA,EAAM,MAGhCmF,EAAS,MAAO,GACpBnF,EAAQA,EAAM,QACd,OAAQA,GAET,MAAO,EACP,CAED,QAAQkF,EAAU,CACjB,YAAK,eAAeA,CAAQ,EACrB,IACP,CACD,iBAAiBA,EAAU,CAC1B,MAAM1E,EAAK,IAAI,OAAO,KAAO0E,GAAY,OAAS,GAAG,EAGrD,GADA,KAAK,MAAQ,KAAK,MAAM,QAAQ1E,EAAI,EAAE,EAClC,KAAK,MAAM,OAAQ,MAAO,GAE9B,IAAIR,EAAQ,KAAK,WAEjB,EAAG,CACF,MAAMlN,EAAMkN,EAAM,IACZmF,EAAUnF,EAAM,UAAUQ,CAAE,EAWlC,GATIR,EAAM,MAAQlN,IAEbkN,IAAU,KAAK,YAAW,KAAK,UAAYA,EAAM,MAErD,KAAK,MAAMA,EAAM,GAAG,EAAIA,EACxB,KAAK,QAAQA,EAAM,KAAK,KAAK,EAAIA,EAAM,KACvC,KAAK,MAAMA,EAAM,KAAK,GAAG,EAAIA,EAAM,MAGhCmF,EAAS,MAAO,GACpBnF,EAAQA,EAAM,IACd,OAAQA,GAET,MAAO,EACP,CAED,UAAUkF,EAAU,CACnB,YAAK,iBAAiBA,CAAQ,EACvB,IACP,CAED,YAAa,CACZ,OAAO,KAAK,WAAa,KAAK,SAAQ,CACtC,CAED,eAAeE,EAAa3H,EAAa,CACxC,SAAS4H,EAAe/H,EAAOqD,EAAK,CACnC,OAAI,OAAOlD,GAAgB,SACnBA,EAAY,QAAQ,gBAAiB,CAAC6H,EAAG3M,IAE3CA,IAAM,IAAY,IAClBA,IAAM,IAAY2E,EAAM,CAAC,EACjB,CAAC3E,EACH2E,EAAM,OAAeA,EAAM,CAAC3E,CAAC,EAChC,IAAIA,CAAC,EACZ,EAEM8E,EAAY,GAAGH,EAAOA,EAAM,MAAOqD,EAAKrD,EAAM,MAAM,CAE5D,CACD,SAASiI,EAASC,EAAI7E,EAAK,CAC1B,IAAIrD,EACJ,MAAMD,EAAU,CAAA,EAChB,KAAQC,EAAQkI,EAAG,KAAK7E,CAAG,GAC1BtD,EAAQ,KAAKC,CAAK,EAEnB,OAAOD,CACP,CACD,GAAI+H,EAAY,OACCG,EAASH,EAAa,KAAK,QAAQ,EAC3C,QAAS9H,GAAU,CAC1B,GAAIA,EAAM,OAAS,KAAM,CACxB,MAAMG,EAAc4H,EAAe/H,EAAO,KAAK,QAAQ,EACnDG,IAAgBH,EAAM,CAAC,GAC1B,KAAK,UAAUA,EAAM,MAAOA,EAAM,MAAQA,EAAM,CAAC,EAAE,OAAQG,CAAW,CAEvE,CACL,CAAI,MACK,CACN,MAAMH,EAAQ,KAAK,SAAS,MAAM8H,CAAW,EAC7C,GAAI9H,GAASA,EAAM,OAAS,KAAM,CACjC,MAAMG,EAAc4H,EAAe/H,EAAO,KAAK,QAAQ,EACnDG,IAAgBH,EAAM,CAAC,GAC1B,KAAK,UAAUA,EAAM,MAAOA,EAAM,MAAQA,EAAM,CAAC,EAAE,OAAQG,CAAW,CAEvE,CACD,CACD,OAAO,IACP,CAED,eAAeyF,EAAQzF,EAAa,CACnC,KAAM,CAAE,SAAAmF,CAAU,EAAG,KACfnM,EAAQmM,EAAS,QAAQM,CAAM,EAErC,OAAIzM,IAAU,KACT,OAAOgH,GAAgB,aAC1BA,EAAcA,EAAYyF,EAAQzM,EAAOmM,CAAQ,GAE9CM,IAAWzF,GACd,KAAK,UAAUhH,EAAOA,EAAQyM,EAAO,OAAQzF,CAAW,GAInD,IACP,CAED,QAAQ2H,EAAa3H,EAAa,CACjC,OAAI,OAAO2H,GAAgB,SACnB,KAAK,eAAeA,EAAa3H,CAAW,EAG7C,KAAK,eAAe2H,EAAa3H,CAAW,CACnD,CAED,kBAAkByF,EAAQzF,EAAa,CACtC,KAAM,CAAE,SAAAmF,CAAU,EAAG,KACf6C,EAAevC,EAAO,OAC5B,QACKzM,EAAQmM,EAAS,QAAQM,CAAM,EACnCzM,IAAU,GACVA,EAAQmM,EAAS,QAAQM,EAAQzM,EAAQgP,CAAY,EACpD,CACD,MAAMrE,EAAWwB,EAAS,MAAMnM,EAAOA,EAAQgP,CAAY,EAC3D,IAAIC,EAAejI,EACf,OAAOA,GAAgB,aAC1BiI,EAAejI,EAAY2D,EAAU3K,EAAOmM,CAAQ,GAEjDxB,IAAasE,GAAc,KAAK,UAAUjP,EAAOA,EAAQgP,EAAcC,CAAY,CACvF,CAED,OAAO,IACP,CAED,WAAWN,EAAa3H,EAAa,CACpC,GAAI,OAAO2H,GAAgB,SAC1B,OAAO,KAAK,kBAAkBA,EAAa3H,CAAW,EAGvD,GAAI,CAAC2H,EAAY,OAChB,MAAM,IAAI,UACT,2EACJ,EAGE,OAAO,KAAK,eAAeA,EAAa3H,CAAW,CACnD,CACF,CCvwCA,MAAMkI,MAA4B,IAElC,QAAShL,EAAO,GAAIA,GAAQ,GAAIA,IAC9BgL,EAAsB,IAAIhL,CAAI,EAEhC,QAASA,EAAO,GAAIA,GAAQ,GAAIA,IAC9BgL,EAAsB,IAAIhL,CAAI,EAEhC,QAASA,EAAO,GAAIA,GAAQ,IAAKA,IAC/BgL,EAAsB,IAAIhL,CAAI,EAEhCgL,EAAsB,IAAI,EAAE,EAC5BA,EAAsB,IAAI,EAAE,EAE5B,MAAMxJ,GAAkBxB,GACfgL,EAAsB,IAAIhL,CAAI,EAGjCyB,GAAwB,CAACC,EAAgB5F,IAA2B,CACpE,GAAA4F,EAAO5F,CAAK,IAAM,IACb,MAAA,GAGT,MAAM6F,EAAOD,EAAO,WAAW5F,EAAQ,CAAC,EAWxC,GAVI,OAAO,MAAM6F,CAAI,GAUjB,EAJFA,IAAS,IACTA,IAAS,IACTA,IAAS,IACTH,GAAeG,CAAI,GAEZ,MAAA,GAIT,IAAI3D,EAAIlC,EAAQ,EAChB,KAAOkC,GAAK,GAAG,CACP,MAAAgC,EAAO0B,EAAO,WAAW1D,CAAC,EAChC,GAAIgC,IAAS,IAAMA,IAAS,GAAKA,IAAS,IAAMA,IAAS,GAAI,CAC3DhC,IACA,QACF,CACI,GAAAwD,GAAexB,CAAI,EAEd,MAAA,GAET,KACF,CAEO,MAAA,EACT,EAEM4B,EAAa,CAACF,EAAgB5F,EAAejD,IAA0B,CAC3E,IAAImF,EAAIlC,EAAQ,EACT,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACnB,GAAI6D,IAAO,KAAM,CACV7D,GAAA,EACL,QACF,CACA,GAAI6D,IAAOhJ,EACT,OAAOmF,EAAI,EAEbA,GACF,CACA,OAAO0D,EAAO,MAChB,EAEMI,GAAsB,CAACJ,EAAgB5F,IAA0B,CACrE,IAAIkC,EAAIlC,EAAQ,EACT,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACnB,GAAI6D,IAAO,KAAM,CACV7D,GAAA,EACL,QACF,CACA,GAAI6D,IAAO,IACT,OAAO7D,EAAI,EAEb,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACvC,MAAMD,EAASgE,EAAiBL,EAAQ1D,EAAI,CAAC,EAC7C,GAAID,GAAU,KACZ,OAAO2D,EAAO,OAEZ1D,EAAAD,EACJ,QACF,CACAC,GACF,CACA,OAAO0D,EAAO,MAChB,EAEMM,EAAkB,CAACN,EAAgB5F,IAA0B,CACjE,IAAIkC,EAAIlC,EACR,KAAOkC,EAAI0D,EAAO,QAAUA,EAAO1D,CAAC,IAAM;AAAA,GACxCA,IAEK,OAAAA,CACT,EAEMiE,EAAmB,CAACP,EAAgB5F,IAA0B,CAClE,MAAM3D,EAAMuJ,EAAO,QAAQ,KAAM5F,CAAK,EACtC,OAAO3D,IAAQ,GAAKuJ,EAAO,OAASvJ,EAAM,CAC5C,EAEM+J,GAAkB,CAACR,EAAgB5F,IAA0B,CACjE,MAAM3D,EAAMuJ,EAAO,QAAQ,MAAO5F,CAAK,EACvC,OAAO3D,IAAQ,GAAKuJ,EAAO,OAASvJ,EAAM,CAC5C,EAEM4J,EAAmB,CAACL,EAAgB5F,IAAiC,CACzE,IAAI7C,EAAQ,EACR+E,EAAIlC,EACD,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACnB,GAAI6D,IAAO,KAAM,CACV7D,GAAA,EACL,QACF,CACI,GAAA6D,IAAO,KAAOA,IAAO,IAAK,CACxB7D,EAAA4D,EAAWF,EAAQ1D,EAAG6D,CAAE,EAC5B,QACF,CACA,GAAIA,IAAO,IAAK,CACV7D,EAAA8D,GAAoBJ,EAAQ1D,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAiE,EAAiBP,EAAQ1D,EAAI,CAAC,EAClC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAgE,EAAgBN,EAAQ1D,EAAI,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,IAAK,CACd5I,IACA+E,IACA,QACF,CACA,GAAI6D,IAAO,IAAK,CAGd,GAFA5I,IACA+E,IACI/E,IAAU,EACL,OAAA+E,EAET,QACF,CACAA,GACF,CACO,OAAA,IACT,EAOMmE,GAAU,CACdT,EACA5F,EACAsG,IACyB,CACzB,IAAIpE,EAAIlC,EACD,KAAAkC,EAAI0D,EAAO,QAAQ,CAClB,MAAAG,EAAKH,EAAO1D,CAAC,EACf,GAAA6D,IAAO,KAAOA,IAAO,IAAK,CACxB7D,EAAA4D,EAAWF,EAAQ1D,EAAG6D,CAAE,EAC5B,QACF,CACA,GAAIA,IAAO,IAAK,CACd,MAAM9D,EAASgE,EAAiBL,EAAQ1D,EAAI,CAAC,EAC7C,GAAID,GAAU,KACL,OAAA,KAELC,EAAAD,EACJ,QACF,CACA,GAAI8D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAiE,EAAiBP,EAAQ1D,EAAI,CAAC,EAClC,QACF,CACA,GAAI6D,IAAO,KAAOH,EAAO1D,EAAI,CAAC,IAAM,IAAK,CACnCA,EAAAgE,EAAgBN,EAAQ1D,EAAI,CAAC,EACjC,QACF,CACA,GAAI6D,IAAO,IAAK,CACd,MAAMQ,EAAc,CAACD,GAAWV,EAAO1D,EAAI,CAAC,IAAM,IAClD,MAAO,CAAE,SAAUA,EAAI,EAAG,YAAAqE,CAAY,CACxC,CACArE,GACF,CACO,OAAA,IACT,EAEMsE,GAAkB,CACtBZ,EACAxJ,IACyB,CACzB,MAAMqK,EAAMb,EAAO,OACnB,IAAInJ,EAAML,EACNe,EAAQ,EAEZ,KAAOV,EAAMgK,GAAK,CACV,MAAAV,EAAKH,EAAOnJ,CAAG,EAErB,GAAIsJ,IAAO,KAAOH,EAAOnJ,EAAM,CAAC,IAAM,IAAK,CACnCA,EAAA0J,EAAiBP,EAAQnJ,EAAM,CAAC,EACtC,QACF,CACA,GAAIsJ,IAAO,KAAOH,EAAOnJ,EAAM,CAAC,IAAM,IAAK,CACnCA,EAAAyJ,EAAgBN,EAAQnJ,EAAM,CAAC,EACrC,QACF,CACA,GAAIsJ,IAAO,IAAK,CACd,MAAM9D,EAASgE,EAAiBL,EAAQnJ,EAAM,CAAC,EAC/C,GAAIwF,GAAU,KAAM,CACZxF,EAAAwF,EACN,QACF,CACF,CACA,GAAI8D,IAAO,IAAK,CACd,GAAIH,EAAO,WAAW,OAAQnJ,CAAG,EAAG,CAC5BA,EAAA2J,GAAgBR,EAAQnJ,EAAM,CAAC,EACrC,QACF,CAEA,GAAImJ,EAAOnJ,EAAM,CAAC,IAAM,IAAK,CAC3BU,IACA,MAAMuJ,EAAML,GAAQT,EAAQnJ,EAAM,EAAG,EAAI,EACzC,GAAI,CAACiK,EACI,OAAA,KAGT,GADAjK,EAAMiK,EAAI,SACNvJ,IAAU,EACL,MAAA,CACL,MAAAf,EACA,IAAKK,EACL,QAASmJ,EAAO,MAAMxJ,EAAOK,CAAG,CAAA,EAGpC,QAAA,KACK,CACLU,IACA,MAAMuJ,EAAML,GAAQT,EAAQnJ,EAAM,EAAG,EAAK,EAC1C,GAAI,CAACiK,EACI,OAAA,KAGT,GADAjK,EAAMiK,EAAI,SACNA,EAAI,cACNvJ,IACIA,IAAU,GACL,MAAA,CACL,MAAAf,EACA,IAAKK,EACL,QAASmJ,EAAO,MAAMxJ,EAAOK,CAAG,CAAA,EAItC,QACF,CACF,CAEAA,GACF,CAEO,OAAA,IACT,EAEakK,GAAiBzC,GAAkC,CAC9D,MAAM0C,EAA2B,CAAA,EAC3BH,EAAMvC,EAAK,OACjB,IAAIlE,EAAQ,EAEZ,KAAOA,EAAQyG,GAAK,CACZ,MAAAV,EAAK7B,EAAKlE,CAAK,EAEjB,GAAA+F,IAAO,KAAOA,IAAO,IAAK,CACpB/F,EAAA8F,EAAW5B,EAAMlE,EAAO+F,CAAE,EAClC,QACF,CACA,GAAIA,IAAO,IAAK,CACN/F,EAAAgG,GAAoB9B,EAAMlE,CAAK,EACvC,QACF,CACA,GAAI+F,IAAO,KAAO7B,EAAKlE,EAAQ,CAAC,IAAM,IAAK,CACjCA,EAAAmG,EAAiBjC,EAAMlE,EAAQ,CAAC,EACxC,QACF,CACA,GAAI+F,IAAO,KAAO7B,EAAKlE,EAAQ,CAAC,IAAM,IAAK,CACjCA,EAAAkG,EAAgBhC,EAAMlE,EAAQ,CAAC,EACvC,QACF,CAEA,GAAI+F,IAAO,KAAOJ,GAAsBzB,EAAMlE,CAAK,EAAG,CAC9C,MAAA6G,EAAQL,GAAgBtC,EAAMlE,CAAK,EACzC,GAAI6G,EAAO,CACTD,EAAQ,KAAKC,CAAK,EAClB7G,EAAQ6G,EAAM,IACd,QACF,CACF,CAEA7G,GACF,CAEO,OAAA4G,CACT,ECpRauI,GAAoB,CAC/BvJ,EACA5C,EAAoC,KACR,CACtB,MAAA4D,EAAUD,GAAcf,CAAM,EAChC,GAAAgB,EAAQ,SAAW,EACd,MAAA,CACL,KAAMhB,EACN,IAAK,KACL,YAAa,GACb,OAAQ,CAAC,EACT,QAAS,CAAC,CAAA,EAIR,MAAAwJ,EAAK,IAAI5C,EAAY5G,CAAM,EAC3ByJ,EAAmC,CAAA,EACzC,IAAI/O,EAAc,GAElB,UAAWuG,KAASD,EAAS,CAC3B,MAAM3E,EAASmF,GAAQP,EAAM,QAAS7D,EAAQ,cAAc,EAC5D,GAAIf,EAAO,OAAO,OAAS,GAAK,CAACA,EAAO,KAAM,CACjC,UAAAnB,KAASmB,EAAO,OACzBoN,EAAO,KAAK,CAAE,MAAAxI,EAAO,MAAA/F,CAAO,CAAA,EAE9B,QACF,CAEAsO,EAAG,UAAUvI,EAAM,MAAOA,EAAM,IAAK5E,EAAO,IAAI,EAClC3B,EAAA,EAChB,CAEA,GAAI,CAACA,EACI,MAAA,CACL,KAAMsF,EACN,IAAK,KACL,YAAa,GACb,OAAAyJ,EACA,QAAAzI,CAAA,EAIE,MAAA1C,EAAOkL,EAAG,WAChB,IAAIE,EAAwB,KAE5B,GAAItM,EAAQ,kBAAmB,CAC7B,MAAMuM,EAAYvM,EAAQ,OACtB,CAAE,OAAQA,EAAQ,OAAQ,MAAO,EAAK,EACtC,CAAE,MAAO,EAAK,EACZsM,EAAAF,EAAG,YAAYG,CAAS,CAChC,CAEO,MAAA,CACL,KAAArL,EACA,IAAAoL,EACA,YAAa,GACb,OAAAD,EACA,QAAAzI,CAAA,CAEJ","x_google_ignoreList":[9,10]}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/docPipe/scan.ts","../src/parser/tokens.ts","../src/parser/lexer.ts","../src/parser/ast.ts","../src/parser/parser.ts","../src/transform/directives.ts","../src/transform/optimize.ts","../src/transform/index.ts","../src/codegen/createElement.ts","../src/compiler.ts","../../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs","../../../node_modules/.pnpm/magic-string@0.30.19/node_modules/magic-string/dist/magic-string.es.mjs","../src/docPipe/index.ts"],"sourcesContent":["export interface TemplateMatch {\n start: number;\n end: number;\n snippet: string;\n}\n\nconst identifierStart = (char: string): boolean => /[A-Za-z_$]/.test(char);\nconst identifierPart = (char: string): boolean => /[\\w$]/.test(char);\nconst expressionKeywords = new Set([\n 'return',\n 'throw',\n 'yield',\n 'await',\n 'case',\n 'delete',\n 'void',\n 'typeof',\n 'new',\n 'in',\n 'instanceof',\n 'else',\n 'do',\n]);\n\nconst skipQuoted = (source: string, index: number, quote: string): number => {\n let i = index + 1;\n while (i < source.length) {\n if (source[i] === '\\\\') i += 2;\n else if (source[i++] === quote) return i;\n }\n return source.length;\n};\n\nconst skipLineComment = (source: string, index: number): number => {\n let i = index;\n while (i < source.length && !/[\\r\\n]/.test(source[i])) i++;\n return i;\n};\n\nconst skipBlockComment = (source: string, index: number): number => {\n const end = source.indexOf('*/', index + 2);\n return end === -1 ? source.length : end + 2;\n};\n\nconst skipRegex = (source: string, index: number): number => {\n let i = index + 1;\n let inClass = false;\n while (i < source.length) {\n const char = source[i++];\n if (char === '\\\\') i++;\n else if (char === '[') inClass = true;\n else if (char === ']') inClass = false;\n else if (char === '/' && !inClass) {\n while (i < source.length && /[a-z]/i.test(source[i])) i++;\n return i;\n } else if (char === '\\n' || char === '\\r') return i;\n }\n return i;\n};\n\nconst skipTemplateLiteral = (source: string, index: number): number => {\n let i = index + 1;\n while (i < source.length) {\n if (source[i] === '\\\\') i += 2;\n else if (source[i] === '`') return i + 1;\n else if (source[i] === '$' && source[i + 1] === '{') {\n const end = skipJsExpression(source, i + 2);\n if (end === null) return source.length;\n i = end;\n } else i++;\n }\n return i;\n};\n\ninterface JsContext {\n controlParentheses: boolean[];\n controlKeyword: boolean;\n blocks: boolean[];\n previous: string;\n statementStart: boolean;\n}\n\nconst createContext = (statementStart: boolean): JsContext => ({\n controlParentheses: [],\n controlKeyword: false,\n blocks: [],\n previous: '',\n statementStart,\n});\n\ninterface JsToken {\n end: number;\n expressionAllowed: boolean;\n}\n\n/** Advance one JS token without interpreting strings, comments, or regexes as markup. */\nconst nextJsToken = (\n source: string,\n index: number,\n expressionAllowed: boolean,\n context: JsContext\n): JsToken => {\n const char = source[index];\n if (/\\s/.test(char)) return { end: index + 1, expressionAllowed };\n if (char === '/' && source[index + 1] === '/') {\n return { end: skipLineComment(source, index + 2), expressionAllowed };\n }\n if (char === '/' && source[index + 1] === '*') {\n return { end: skipBlockComment(source, index), expressionAllowed };\n }\n if (char === '\"' || char === \"'\") {\n context.previous = 'literal';\n context.statementStart = false;\n return { end: skipQuoted(source, index, char), expressionAllowed: false };\n }\n if (char === '`')\n return {\n end: skipTemplateLiteral(source, index),\n expressionAllowed: false,\n };\n if (char === '/' && expressionAllowed)\n return { end: skipRegex(source, index), expressionAllowed: false };\n if (identifierStart(char)) {\n let end = index + 1;\n while (end < source.length && identifierPart(source[end])) end++;\n const word = source.slice(index, end);\n context.controlKeyword = /^(if|while|for|with|switch|catch)$/.test(word);\n context.previous = word;\n context.statementStart = /^(else|do|try|finally)$/.test(word);\n return { end, expressionAllowed: expressionKeywords.has(word) };\n }\n if (/[0-9]/.test(char)) {\n let end = index + 1;\n while (end < source.length && /[\\w.]/.test(source[end])) end++;\n return { end, expressionAllowed: false };\n }\n if (char === '(') {\n context.controlParentheses.push(context.controlKeyword);\n context.controlKeyword = false;\n context.previous = char;\n context.statementStart = false;\n return { end: index + 1, expressionAllowed: true };\n }\n if (char === ')') {\n const control = context.controlParentheses.pop() ?? false;\n context.previous = char;\n context.statementStart = control;\n return { end: index + 1, expressionAllowed: control };\n }\n if (char === '{') {\n const block =\n context.statementStart ||\n context.previous === ')' ||\n context.previous === '>';\n context.blocks.push(block);\n context.previous = char;\n context.statementStart = block;\n return { end: index + 1, expressionAllowed: true };\n }\n if (char === '}') {\n const block = context.blocks.pop() ?? false;\n context.previous = char;\n context.statementStart = block;\n return { end: index + 1, expressionAllowed: block };\n }\n context.previous = char;\n context.statementStart = char === ';';\n if ((char === '+' || char === '-') && source[index + 1] === char) {\n return { end: index + 2, expressionAllowed };\n }\n return { end: index + 1, expressionAllowed: !/[)\\]}.]/.test(char) };\n};\n\n/** Return the offset after a matching }, starting immediately after the opening {. */\nexport const skipJsExpression = (\n source: string,\n index: number\n): number | null => {\n let depth = 1;\n let i = index;\n let expressionAllowed = true;\n const context = createContext(false);\n while (i < source.length) {\n const char = source[i];\n if (char === '<' && expressionAllowed) {\n const match = extractTemplate(source, i);\n if (match) {\n i = match.end;\n expressionAllowed = false;\n context.previous = 'template';\n context.statementStart = false;\n continue;\n }\n }\n if (char === '{') depth++;\n else if (char === '}' && --depth === 0) return i + 1;\n const token = nextJsToken(source, i, expressionAllowed, context);\n i = token.end;\n expressionAllowed = token.expressionAllowed;\n }\n return null;\n};\n\nconst skipTag = (source: string, index: number): number | null => {\n let i = index;\n while (i < source.length) {\n const char = source[i];\n if (char === '\"' || char === \"'\") i = skipQuoted(source, i, char);\n else if (char === '{') {\n const end = skipJsExpression(source, i + 1);\n if (end === null) return null;\n i = end;\n } else if (char === '>') return i + 1;\n else i++;\n }\n return null;\n};\n\nconst extractTemplate = (\n source: string,\n start: number\n): TemplateMatch | null => {\n if (source[start] !== '<' || !/[A-Za-z_$>!]/.test(source[start + 1] ?? ''))\n return null;\n let pos = start;\n let depth = 0;\n while (pos < source.length) {\n if (source.startsWith('<!--', pos)) {\n const end = source.indexOf('-->', pos + 4);\n if (end === -1) return null;\n pos = end + 3;\n continue;\n }\n if (source[pos] === '{') {\n const end = skipJsExpression(source, pos + 1);\n if (end !== null) {\n pos = end;\n continue;\n }\n // Still extract a malformed template when possible so compile can diagnose it.\n }\n if (source[pos] === '<') {\n const closing = source[pos + 1] === '/';\n const end = skipTag(source, pos + (closing ? 2 : 1));\n if (end === null) return null;\n depth += closing ? -1 : 1;\n if (!closing && source[end - 2] === '/') depth--;\n pos = end;\n if (depth === 0)\n return { start, end: pos, snippet: source.slice(start, pos) };\n continue;\n }\n // Template text is not JavaScript: quotes and // or /* have no special meaning here.\n pos++;\n }\n return null;\n};\n\nexport const scanTemplates = (code: string): TemplateMatch[] => {\n const matches: TemplateMatch[] = [];\n let index = 0;\n let expressionAllowed = true;\n const context = createContext(true);\n while (index < code.length) {\n if (code[index] === '<' && expressionAllowed) {\n const match = extractTemplate(code, index);\n if (match) {\n matches.push(match);\n index = match.end;\n expressionAllowed = false;\n context.previous = 'template';\n context.statementStart = false;\n continue;\n }\n }\n const token = nextJsToken(code, index, expressionAllowed, context);\n index = token.end;\n expressionAllowed = token.expressionAllowed;\n }\n return matches;\n};\n","/**\n * Token types for Lithent template lexer\n */\nexport enum TokenType {\n // Tag tokens\n TAG_OPEN_START = 'TAG_OPEN_START', // <\n TAG_OPEN_END = 'TAG_OPEN_END', // >\n TAG_CLOSE_START = 'TAG_CLOSE_START', // </\n TAG_SELF_CLOSE = 'TAG_SELF_CLOSE', // />\n\n // Identifiers and values\n IDENTIFIER = 'IDENTIFIER', // tag names, attribute names\n ATTRIBUTE_EQUALS = 'ATTRIBUTE_EQUALS', // =\n STRING_LITERAL = 'STRING_LITERAL', // \"...\" or '...'\n\n // Expressions\n EXPRESSION_START = 'EXPRESSION_START', // {\n EXPRESSION_END = 'EXPRESSION_END', // }\n EXPRESSION_CONTENT = 'EXPRESSION_CONTENT', // JavaScript code inside {}\n\n // Directives\n DIRECTIVE_IF = 'DIRECTIVE_IF', // l-if\n DIRECTIVE_ELSE_IF = 'DIRECTIVE_ELSE_IF', // l-else-if\n DIRECTIVE_ELSE = 'DIRECTIVE_ELSE', // l-else\n DIRECTIVE_FOR = 'DIRECTIVE_FOR', // l-for\n\n // Fragments\n FRAGMENT_OPEN = 'FRAGMENT_OPEN', // <>\n FRAGMENT_CLOSE = 'FRAGMENT_CLOSE', // </>\n\n KEYWORD_REF = 'KEYWORD_REF', // ref\n\n // Text and comments\n TEXT = 'TEXT', // text content\n COMMENT = 'COMMENT', // <!-- ... -->\n\n // Whitespace\n WHITESPACE = 'WHITESPACE',\n\n // End of file\n EOF = 'EOF',\n}\n\n/**\n * Position information for error reporting\n */\nexport interface Position {\n line: number;\n column: number;\n offset: number;\n}\n\n/**\n * Token interface\n */\nexport interface Token {\n type: TokenType;\n value: string;\n start: Position;\n end: Position;\n}\n\n/**\n * Create a position object\n */\nexport function createPosition(\n line: number,\n column: number,\n offset: number\n): Position {\n return { line, column, offset };\n}\n\n/**\n * Create a token\n */\nexport function createToken(\n type: TokenType,\n value: string,\n start: Position,\n end: Position\n): Token {\n return { type, value, start, end };\n}\n","import { skipJsExpression } from '../docPipe/scan';\nimport {\n Token,\n TokenType,\n Position,\n createPosition,\n createToken,\n} from './tokens';\n\n/**\n * Lexer for Lithent templates\n * Converts template string into a stream of tokens\n */\nexport class Lexer {\n private input: string;\n private position: number = 0;\n private line: number = 1;\n private column: number = 1;\n private tokens: Token[] = [];\n\n constructor(input: string) {\n this.input = input;\n }\n\n /**\n * Tokenize the entire input\n */\n public tokenize(): Token[] {\n while (this.position < this.input.length) {\n this.readToken();\n }\n\n // Add EOF token\n const pos = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.EOF, '', pos, pos));\n\n return this.tokens;\n }\n\n /**\n * Get current position\n */\n private getCurrentPosition(): Position {\n return createPosition(this.line, this.column, this.position);\n }\n\n /**\n * Peek at character without consuming\n */\n private peek(offset: number = 0): string {\n return this.input[this.position + offset] || '';\n }\n\n /**\n * Consume and return current character\n */\n private advance(): string {\n const char = this.input[this.position];\n this.position++;\n\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n\n return char;\n }\n\n /**\n * Check if we've reached the end\n */\n private isEOF(): boolean {\n return this.position >= this.input.length;\n }\n\n /**\n * Read next token\n */\n private readToken(): void {\n const char = this.peek();\n\n // Fragment open <>\n if (char === '<' && this.peek(1) === '>') {\n this.readFragmentOpen();\n return;\n }\n\n // Fragment close </>\n if (char === '<' && this.peek(1) === '/' && this.peek(2) === '>') {\n this.readFragmentClose();\n return;\n }\n\n // Check for comments first\n if (\n char === '<' &&\n this.peek(1) === '!' &&\n this.peek(2) === '-' &&\n this.peek(3) === '-'\n ) {\n this.readComment();\n return;\n }\n\n // Check for tags\n if (char === '<') {\n if (this.peek(1) === '/') {\n this.readCloseTag();\n } else {\n this.readOpenTag();\n }\n return;\n }\n\n // Check for expressions\n if (char === '{') {\n this.readExpression();\n return;\n }\n\n // Check for whitespace\n if (this.isWhitespace(char)) {\n this.readWhitespace();\n return;\n }\n\n // Otherwise it's text content\n this.readText();\n }\n\n /**\n * Read HTML comment\n */\n private readComment(): void {\n const start = this.getCurrentPosition();\n let value = '';\n\n // Consume <!--\n value += this.advance() + this.advance() + this.advance() + this.advance();\n\n let closed = false;\n // Read until -->\n while (!this.isEOF()) {\n if (this.peek() === '-' && this.peek(1) === '-' && this.peek(2) === '>') {\n value += this.advance() + this.advance() + this.advance();\n closed = true;\n break;\n }\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n if (!closed)\n throw Object.assign(new Error('Unclosed comment'), {\n line: start.line,\n column: start.column,\n });\n this.tokens.push(createToken(TokenType.COMMENT, value, start, end));\n }\n\n /**\n * Read opening tag <\n */\n private readOpenTag(): void {\n const start = this.getCurrentPosition();\n this.advance(); // consume <\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_OPEN_START, '<', start, end));\n\n // Now read attributes until we hit > or />\n this.readTagContent();\n }\n\n /**\n * Read closing tag </\n */\n private readCloseTag(): void {\n const start = this.getCurrentPosition();\n this.advance(); // consume <\n this.advance(); // consume /\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_CLOSE_START, '</', start, end));\n\n // Read tag name\n this.skipWhitespace();\n this.readIdentifier();\n\n // Read closing >\n this.skipWhitespace();\n if (this.peek() === '>') {\n const start = this.getCurrentPosition();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_OPEN_END, '>', start, end));\n }\n }\n\n /**\n * Read tag content (tag name and attributes)\n */\n private readTagContent(): void {\n this.skipWhitespace();\n\n // Read tag name\n this.readIdentifier();\n\n // Read attributes\n while (!this.isEOF()) {\n this.skipWhitespace();\n\n const char = this.peek();\n\n // Self-closing tag\n if (char === '/' && this.peek(1) === '>') {\n const start = this.getCurrentPosition();\n this.advance();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.TAG_SELF_CLOSE, '/>', start, end)\n );\n return;\n }\n\n // End of opening tag\n if (char === '>') {\n const start = this.getCurrentPosition();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TAG_OPEN_END, '>', start, end));\n return;\n }\n\n // Read attribute\n this.readAttribute();\n }\n }\n\n /**\n * Read an attribute (name and optional value)\n */\n private readAttribute(): void {\n const identifier = this.readIdentifier();\n if (!identifier) return;\n\n this.skipWhitespace();\n\n // Check for = sign\n if (this.peek() === '=') {\n const start = this.getCurrentPosition();\n this.advance();\n const end = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.ATTRIBUTE_EQUALS, '=', start, end)\n );\n\n this.skipWhitespace();\n\n // Read attribute value\n const char = this.peek();\n if (char === '\"' || char === \"'\") {\n this.readStringLiteral();\n } else if (char === '{') {\n this.readExpression();\n }\n }\n }\n\n /**\n * Read identifier (tag name or attribute name)\n */\n private readIdentifier(): string {\n const start = this.getCurrentPosition();\n let value = '';\n\n // First character must be letter, underscore, or $ (or : for namespaced attributes)\n const first = this.peek();\n if (this.isIdentifierStart(first)) {\n value += this.advance();\n } else {\n // Consume unexpected character to avoid infinite loops\n const unexpectedStart = this.getCurrentPosition();\n const char = this.advance();\n const unexpectedEnd = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.TEXT, char, unexpectedStart, unexpectedEnd)\n );\n return '';\n }\n\n // Read rest of identifier\n while (!this.isEOF() && this.isIdentifierPart(this.peek())) {\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n\n // Check if this is a directive or special keyword\n const tokenType = this.getIdentifierTokenType(value);\n this.tokens.push(createToken(tokenType, value, start, end));\n\n return value;\n }\n\n /**\n * Determine token type for identifier\n */\n private getIdentifierTokenType(value: string): TokenType {\n switch (value) {\n case 'l-if':\n return TokenType.DIRECTIVE_IF;\n case 'l-else-if':\n return TokenType.DIRECTIVE_ELSE_IF;\n case 'l-else':\n return TokenType.DIRECTIVE_ELSE;\n case 'l-for':\n return TokenType.DIRECTIVE_FOR;\n case 'ref':\n return TokenType.KEYWORD_REF;\n default:\n return TokenType.IDENTIFIER;\n }\n }\n\n /**\n * Read string literal\n */\n private readStringLiteral(): void {\n const start = this.getCurrentPosition();\n const quote = this.advance(); // \" or '\n let value = quote;\n let escaped = false;\n let closed = false;\n\n while (!this.isEOF()) {\n const char = this.peek();\n\n if (escaped) {\n value += this.advance();\n escaped = false;\n continue;\n }\n\n if (char === '\\\\') {\n escaped = true;\n value += this.advance();\n continue;\n }\n\n if (char === quote) {\n value += this.advance();\n closed = true;\n break;\n }\n\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n if (!closed)\n throw Object.assign(new Error('Unclosed attribute string'), {\n line: start.line,\n column: start.column,\n });\n this.tokens.push(createToken(TokenType.STRING_LITERAL, value, start, end));\n }\n\n /**\n * Read fragment open <>\n */\n private readFragmentOpen(): void {\n const start = this.getCurrentPosition();\n this.advance(); // <\n this.advance(); // >\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.FRAGMENT_OPEN, '<>', start, end));\n }\n\n /**\n * Read fragment close </>\n */\n private readFragmentClose(): void {\n const start = this.getCurrentPosition();\n this.advance(); // <\n this.advance(); // /\n this.advance(); // >\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.FRAGMENT_CLOSE, '</>', start, end));\n }\n\n /**\n * Read expression content inside {}\n */\n private readExpression(): void {\n const startPos = this.getCurrentPosition();\n this.advance(); // consume {\n const openEnd = this.getCurrentPosition();\n this.tokens.push(\n createToken(TokenType.EXPRESSION_START, '{', startPos, openEnd)\n );\n\n const contentStart = this.getCurrentPosition();\n const end = skipJsExpression(this.input, this.position);\n if (end === null) {\n throw Object.assign(new Error('Unclosed expression'), {\n line: startPos.line,\n column: startPos.column,\n });\n }\n const value = this.input.slice(this.position, end - 1);\n while (this.position < end - 1) this.advance();\n const contentEnd = this.getCurrentPosition();\n if (value.trim())\n this.tokens.push(\n createToken(\n TokenType.EXPRESSION_CONTENT,\n value,\n contentStart,\n contentEnd\n )\n );\n this.advance();\n this.tokens.push(\n createToken(\n TokenType.EXPRESSION_END,\n '}',\n contentEnd,\n this.getCurrentPosition()\n )\n );\n }\n\n /**\n * Read text content\n */\n private readText(): void {\n const start = this.getCurrentPosition();\n let value = '';\n\n while (!this.isEOF()) {\n const char = this.peek();\n\n // Stop at tag or expression start\n if (char === '<' || char === '{') {\n break;\n }\n\n value += this.advance();\n }\n\n if (value) {\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.TEXT, value, start, end));\n }\n }\n\n /**\n * Read whitespace\n */\n private readWhitespace(): void {\n const start = this.getCurrentPosition();\n let value = '';\n\n while (!this.isEOF() && this.isWhitespace(this.peek())) {\n value += this.advance();\n }\n\n const end = this.getCurrentPosition();\n this.tokens.push(createToken(TokenType.WHITESPACE, value, start, end));\n }\n\n /**\n * Skip whitespace without creating tokens\n */\n private skipWhitespace(): void {\n while (!this.isEOF() && this.isWhitespace(this.peek())) {\n this.advance();\n }\n }\n\n /**\n * Check if character is whitespace\n */\n private isWhitespace(char: string): boolean {\n return /\\s/.test(char);\n }\n\n /**\n * Check if character can start an identifier\n */\n private isIdentifierStart(char: string): boolean {\n return /[a-zA-Z_$:]/.test(char);\n }\n\n /**\n * Check if character can be part of an identifier\n */\n private isIdentifierPart(char: string): boolean {\n return /[a-zA-Z0-9_$:.-]/.test(char);\n }\n}\n\n/**\n * Tokenize a template string\n */\nexport function tokenize(input: string): Token[] {\n const lexer = new Lexer(input);\n return lexer.tokenize();\n}\n","import { Position } from './tokens';\n\n/**\n * Base AST Node interface\n */\nexport interface BaseNode {\n type: string;\n start: Position;\n end: Position;\n}\n\n/**\n * Node types\n */\nexport enum NodeType {\n ROOT = 'Root',\n ELEMENT = 'Element',\n FRAGMENT = 'Fragment',\n TEXT = 'Text',\n INTERPOLATION = 'Interpolation',\n COMMENT = 'Comment',\n ATTRIBUTE = 'Attribute',\n DIRECTIVE_IF = 'DirectiveIf',\n DIRECTIVE_ELSE_IF = 'DirectiveElseIf',\n DIRECTIVE_ELSE = 'DirectiveElse',\n DIRECTIVE_FOR = 'DirectiveFor',\n}\n\n/**\n * Root node - represents the entire template\n */\nexport interface RootNode extends BaseNode {\n type: NodeType.ROOT;\n children: TemplateNode[];\n}\n\n/**\n * Element node - represents HTML element or component\n */\nexport interface ElementNode extends BaseNode {\n type: NodeType.ELEMENT;\n tag: string;\n isComponent: boolean; // true if tag starts with uppercase\n isSelfClosing: boolean;\n attributes: AttributeNode[];\n directives: DirectiveNode[];\n children: TemplateNode[];\n ref?: string; // ref attribute value\n}\n\n/**\n * Fragment node - represents <></>\n */\nexport interface FragmentNode extends BaseNode {\n type: NodeType.FRAGMENT;\n children: TemplateNode[];\n}\n\n/**\n * Text node - represents plain text content\n */\nexport interface TextNode extends BaseNode {\n type: NodeType.TEXT;\n content: string;\n}\n\n/**\n * Interpolation node - represents {expression}\n */\nexport interface InterpolationNode extends BaseNode {\n type: NodeType.INTERPOLATION;\n expression: string;\n}\n\n/**\n * Comment node - represents HTML comments\n */\nexport interface CommentNode extends BaseNode {\n type: NodeType.COMMENT;\n content: string;\n}\n\n/**\n * Attribute node - represents element attributes\n */\nexport interface AttributeNode extends BaseNode {\n type: NodeType.ATTRIBUTE;\n name: string;\n value: AttributeValue | null;\n isDynamic: boolean; // true if value is an expression\n}\n\n/**\n * Attribute value can be static string or expression\n */\nexport type AttributeValue = string | { expression: string };\n\n/**\n * Base directive node\n */\nexport interface BaseDirectiveNode extends BaseNode {\n type:\n | NodeType.DIRECTIVE_IF\n | NodeType.DIRECTIVE_ELSE_IF\n | NodeType.DIRECTIVE_ELSE\n | NodeType.DIRECTIVE_FOR;\n}\n\n/**\n * l-if directive\n */\nexport interface DirectiveIfNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_IF;\n condition: string;\n}\n\n/**\n * l-else-if directive\n */\nexport interface DirectiveElseIfNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_ELSE_IF;\n condition: string;\n}\n\n/**\n * l-else directive\n */\nexport interface DirectiveElseNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_ELSE;\n}\n\n/**\n * l-for directive\n */\nexport interface DirectiveForNode extends BaseDirectiveNode {\n type: NodeType.DIRECTIVE_FOR;\n item: string; // loop variable name (e.g., \"item\")\n index?: string; // optional index variable name (e.g., \"index\")\n list: string; // expression for the list to iterate\n}\n\n/**\n * Union type for all directive nodes\n */\nexport type DirectiveNode =\n | DirectiveIfNode\n | DirectiveElseIfNode\n | DirectiveElseNode\n | DirectiveForNode;\n\n/**\n * Union type for all template nodes (excluding Root)\n */\nexport type TemplateNode =\n | ElementNode\n | FragmentNode\n | TextNode\n | InterpolationNode\n | CommentNode;\n\n/**\n * Type guard for Element nodes\n */\nexport function isElementNode(node: TemplateNode): node is ElementNode {\n return node.type === NodeType.ELEMENT;\n}\n\n/**\n * Type guard for Fragment nodes\n */\nexport function isFragmentNode(node: TemplateNode): node is FragmentNode {\n return node.type === NodeType.FRAGMENT;\n}\n\n/**\n * Type guard for Text nodes\n */\nexport function isTextNode(node: TemplateNode): node is TextNode {\n return node.type === NodeType.TEXT;\n}\n\n/**\n * Type guard for Interpolation nodes\n */\nexport function isInterpolationNode(\n node: TemplateNode\n): node is InterpolationNode {\n return node.type === NodeType.INTERPOLATION;\n}\n\n/**\n * Type guard for Comment nodes\n */\nexport function isCommentNode(node: TemplateNode): node is CommentNode {\n return node.type === NodeType.COMMENT;\n}\n\n/**\n * Type guard for directive nodes\n */\nexport function isDirective(\n node: AttributeNode | DirectiveNode\n): node is DirectiveNode {\n return (\n node.type === NodeType.DIRECTIVE_IF ||\n node.type === NodeType.DIRECTIVE_ELSE_IF ||\n node.type === NodeType.DIRECTIVE_ELSE ||\n node.type === NodeType.DIRECTIVE_FOR\n );\n}\n\n/**\n * Create a root node\n */\nexport function createRootNode(\n children: TemplateNode[],\n start: Position,\n end: Position\n): RootNode {\n return {\n type: NodeType.ROOT,\n children,\n start,\n end,\n };\n}\n\n/**\n * Create an element node\n */\nexport function createElementNode(\n tag: string,\n attributes: AttributeNode[],\n directives: DirectiveNode[],\n children: TemplateNode[],\n isSelfClosing: boolean,\n start: Position,\n end: Position\n): ElementNode {\n const isComponent = /^[A-Z]/.test(tag) || tag.includes('.');\n\n // Extract ref from attributes\n const refAttr = attributes.find(attr => attr.name === 'ref');\n const ref = refAttr?.value\n ? typeof refAttr.value === 'string'\n ? refAttr.value\n : refAttr.value.expression\n : undefined;\n\n return {\n type: NodeType.ELEMENT,\n tag,\n isComponent,\n isSelfClosing,\n attributes,\n directives,\n children,\n ref,\n start,\n end,\n };\n}\n\n/**\n * Create a fragment node\n */\nexport function createFragmentNode(\n children: TemplateNode[],\n start: Position,\n end: Position\n): FragmentNode {\n return {\n type: NodeType.FRAGMENT,\n children,\n start,\n end,\n };\n}\n\n/**\n * Create a text node\n */\nexport function createTextNode(\n content: string,\n start: Position,\n end: Position\n): TextNode {\n return {\n type: NodeType.TEXT,\n content,\n start,\n end,\n };\n}\n\n/**\n * Create an interpolation node\n */\nexport function createInterpolationNode(\n expression: string,\n start: Position,\n end: Position\n): InterpolationNode {\n return {\n type: NodeType.INTERPOLATION,\n expression,\n start,\n end,\n };\n}\n\n/**\n * Create a comment node\n */\nexport function createCommentNode(\n content: string,\n start: Position,\n end: Position\n): CommentNode {\n return {\n type: NodeType.COMMENT,\n content,\n start,\n end,\n };\n}\n\n/**\n * Create an attribute node\n */\nexport function createAttributeNode(\n name: string,\n value: AttributeValue | null,\n isDynamic: boolean,\n start: Position,\n end: Position\n): AttributeNode {\n return {\n type: NodeType.ATTRIBUTE,\n name,\n value,\n isDynamic,\n start,\n end,\n };\n}\n\n/**\n * Create a l-if directive node\n */\nexport function createDirectiveIfNode(\n condition: string,\n start: Position,\n end: Position\n): DirectiveIfNode {\n return {\n type: NodeType.DIRECTIVE_IF,\n condition,\n start,\n end,\n };\n}\n\n/**\n * Create a l-else-if directive node\n */\nexport function createDirectiveElseIfNode(\n condition: string,\n start: Position,\n end: Position\n): DirectiveElseIfNode {\n return {\n type: NodeType.DIRECTIVE_ELSE_IF,\n condition,\n start,\n end,\n };\n}\n\n/**\n * Create a l-else directive node\n */\nexport function createDirectiveElseNode(\n start: Position,\n end: Position\n): DirectiveElseNode {\n return {\n type: NodeType.DIRECTIVE_ELSE,\n start,\n end,\n };\n}\n\n/**\n * Create a l-for directive node\n */\nexport function createDirectiveForNode(\n item: string,\n list: string,\n index: string | undefined,\n start: Position,\n end: Position\n): DirectiveForNode {\n return {\n type: NodeType.DIRECTIVE_FOR,\n item,\n index,\n list,\n start,\n end,\n };\n}\n\n/**\n * Walk through AST and call visitor function for each node\n */\nexport function walk(\n node: RootNode | TemplateNode,\n visitor: (node: TemplateNode) => void\n): void {\n if (node.type === NodeType.ROOT) {\n node.children.forEach(child => {\n visitor(child);\n walk(child, visitor);\n });\n } else if (\n node.type === NodeType.ELEMENT ||\n node.type === NodeType.FRAGMENT\n ) {\n node.children.forEach(child => {\n visitor(child);\n walk(child, visitor);\n });\n }\n}\n\n/**\n * Transform AST by applying a transformer function to each node\n */\nexport function transformTree(\n node: RootNode | TemplateNode,\n transformer: (node: TemplateNode) => TemplateNode\n): RootNode | TemplateNode {\n if (node.type === NodeType.ROOT) {\n return {\n ...node,\n children: node.children.map(child => {\n const transformed = transformer(child);\n return transformTree(transformed, transformer) as TemplateNode;\n }),\n };\n } else if (node.type === NodeType.ELEMENT) {\n const transformed = transformer(node);\n if (transformed.type === NodeType.ELEMENT) {\n return {\n ...transformed,\n children: transformed.children.map(child => {\n const childTransformed = transformer(child);\n return transformTree(childTransformed, transformer) as TemplateNode;\n }),\n };\n }\n return transformed;\n } else if (node.type === NodeType.FRAGMENT) {\n const transformed = transformer(node);\n if (transformed.type === NodeType.FRAGMENT) {\n return {\n ...transformed,\n children: transformed.children.map(child => {\n const childTransformed = transformer(child);\n return transformTree(childTransformed, transformer) as TemplateNode;\n }),\n };\n }\n return transformed;\n }\n return transformer(node);\n}\n","import { Token, TokenType } from './tokens';\nimport {\n RootNode,\n TemplateNode,\n AttributeNode,\n DirectiveNode,\n createRootNode,\n createElementNode,\n createTextNode,\n createInterpolationNode,\n createCommentNode,\n createAttributeNode,\n createDirectiveIfNode,\n createDirectiveElseIfNode,\n createDirectiveElseNode,\n createDirectiveForNode,\n createFragmentNode,\n} from './ast';\n\n/**\n * Parser for Lithent templates\n * Converts token stream into AST\n */\nexport class Parser {\n private tokens: Token[];\n private position: number = 0;\n\n constructor(tokens: Token[], preserveWhitespace = false) {\n // Filter out whitespace tokens for easier parsing\n this.tokens = preserveWhitespace\n ? tokens\n : tokens.filter(t => t.type !== TokenType.WHITESPACE);\n }\n\n /**\n * Parse tokens into AST\n */\n public parse(): RootNode {\n const children: TemplateNode[] = [];\n\n while (!this.isEOF()) {\n const node = this.parseTemplateNode();\n if (node) {\n children.push(node);\n }\n }\n\n const start =\n children.length > 0\n ? children[0].start\n : { line: 1, column: 1, offset: 0 };\n const end =\n children.length > 0\n ? children[children.length - 1].end\n : { line: 1, column: 1, offset: 0 };\n\n return createRootNode(children, start, end);\n }\n\n /**\n * Parse a single template node\n */\n private parseTemplateNode(): TemplateNode | null {\n const token = this.peek();\n\n switch (token.type) {\n case TokenType.TAG_OPEN_START:\n return this.parseElement();\n case TokenType.FRAGMENT_OPEN:\n return this.parseFragment();\n case TokenType.TEXT:\n case TokenType.WHITESPACE:\n return this.parseText();\n case TokenType.EXPRESSION_START:\n return this.parseInterpolation();\n case TokenType.COMMENT:\n return this.parseComment();\n case TokenType.TAG_CLOSE_START:\n throw this.error('Unexpected closing tag', token);\n case TokenType.FRAGMENT_CLOSE:\n throw this.error('Unexpected fragment closing tag', token);\n case TokenType.EOF:\n return null;\n default:\n this.advance();\n return null;\n }\n }\n\n /**\n * Parse fragment node\n */\n private parseFragment(): TemplateNode | null {\n const start = this.peek().start;\n this.expect(TokenType.FRAGMENT_OPEN);\n\n const children: TemplateNode[] = [];\n\n while (!this.isEOF() && !this.check(TokenType.FRAGMENT_CLOSE)) {\n const child = this.parseTemplateNode();\n if (child) {\n children.push(child);\n }\n }\n\n if (this.check(TokenType.FRAGMENT_CLOSE)) {\n const closeToken = this.expect(TokenType.FRAGMENT_CLOSE);\n return createFragmentNode(children, start, closeToken.end);\n }\n\n throw Object.assign(new Error('Unclosed fragment'), {\n line: start.line,\n column: start.column,\n });\n }\n\n /**\n * Parse element\n */\n private parseElement(): TemplateNode | null {\n const start = this.peek().start;\n\n // Consume <\n this.expect(TokenType.TAG_OPEN_START);\n\n // Get tag name\n const tagToken = this.peek();\n if (tagToken.type !== TokenType.IDENTIFIER) {\n throw new Error(\n `Expected tag name at line ${tagToken.start.line}, column ${tagToken.start.column}`\n );\n }\n\n const tag = tagToken.value;\n this.advance();\n\n // Parse attributes and directives\n const { attributes, directives } = this.parseAttributesAndDirectives();\n\n // Check for self-closing tag\n if (this.check(TokenType.TAG_SELF_CLOSE)) {\n const end = this.peek().end;\n this.advance(); // consume />\n return createElementNode(\n tag,\n attributes,\n directives,\n [],\n true,\n start,\n end\n );\n }\n\n // Consume >\n this.expect(TokenType.TAG_OPEN_END);\n\n // Parse children (if not self-closing)\n const children: TemplateNode[] = [];\n\n while (!this.isEOF() && !this.check(TokenType.TAG_CLOSE_START)) {\n const child = this.parseTemplateNode();\n if (child) {\n children.push(child);\n }\n }\n\n // Parse closing tag\n if (this.check(TokenType.TAG_CLOSE_START)) {\n this.advance(); // consume </\n\n const closeTagToken = this.peek();\n if (closeTagToken.type !== TokenType.IDENTIFIER) {\n const error = new Error(\n `Expected closing tag name at line ${closeTagToken.start.line}, column ${closeTagToken.start.column}`\n ) as Error & { line?: number; column?: number };\n error.line = closeTagToken.start.line;\n error.column = closeTagToken.start.column;\n throw error;\n }\n\n const closeTag = closeTagToken.value;\n if (closeTag !== tag) {\n const error = new Error(\n `Mismatched closing tag: expected </${tag}> but got </${closeTag}> at line ${closeTagToken.start.line}, column ${closeTagToken.start.column}`\n ) as Error & { line?: number; column?: number };\n error.line = closeTagToken.start.line;\n error.column = closeTagToken.start.column;\n throw error;\n }\n\n this.advance(); // consume tag name\n\n const end = this.peek().end;\n this.expect(TokenType.TAG_OPEN_END); // consume >\n\n return createElementNode(\n tag,\n attributes,\n directives,\n children,\n false,\n start,\n end\n );\n }\n\n throw this.error(`Unclosed tag <${tag}>`, tagToken);\n }\n\n /**\n * Parse attributes and directives\n */\n private parseAttributesAndDirectives(): {\n attributes: AttributeNode[];\n directives: DirectiveNode[];\n } {\n const attributes: AttributeNode[] = [];\n const directives: DirectiveNode[] = [];\n\n while (\n !this.isEOF() &&\n !this.check(TokenType.TAG_OPEN_END) &&\n !this.check(TokenType.TAG_SELF_CLOSE)\n ) {\n const token = this.peek();\n\n // Check for directives\n if (\n token.type === TokenType.DIRECTIVE_IF ||\n token.type === TokenType.DIRECTIVE_ELSE_IF ||\n token.type === TokenType.DIRECTIVE_ELSE ||\n token.type === TokenType.DIRECTIVE_FOR\n ) {\n const directive = this.parseDirective();\n if (directive) {\n directives.push(directive);\n }\n } else if (\n token.type === TokenType.IDENTIFIER ||\n token.type === TokenType.KEYWORD_REF\n ) {\n const attribute = this.parseAttribute();\n if (attribute) {\n attributes.push(attribute);\n }\n } else {\n // Unexpected token, skip it\n this.advance();\n }\n }\n\n return { attributes, directives };\n }\n\n /**\n * Parse attribute\n */\n private parseAttribute(): AttributeNode | null {\n const start = this.peek().start;\n const nameToken = this.advance();\n const name = nameToken.value;\n\n // Check for = sign\n if (!this.check(TokenType.ATTRIBUTE_EQUALS)) {\n // Attribute without value (e.g., disabled, checked)\n return createAttributeNode(name, null, false, start, nameToken.end);\n }\n\n this.advance(); // consume =\n\n // Parse attribute value\n const valueToken = this.peek();\n let value: string | { expression: string };\n let isDynamic = false;\n let end = valueToken.end;\n\n if (valueToken.type === TokenType.STRING_LITERAL) {\n // Static string value\n value = valueToken.value.slice(1, -1); // Remove quotes\n this.advance();\n } else if (valueToken.type === TokenType.EXPRESSION_START) {\n // Dynamic expression value\n this.advance(); // consume {\n\n const exprToken = this.peek();\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n value = { expression: exprToken.value.trim() };\n isDynamic = true;\n this.advance();\n } else {\n throw this.error(\n 'Expected a non-empty attribute expression',\n exprToken\n );\n }\n end = this.expect(TokenType.EXPRESSION_END).end;\n } else {\n throw this.error('Expected a quoted attribute or expression', valueToken);\n }\n\n return createAttributeNode(name, value, isDynamic, start, end);\n }\n\n /**\n * Parse directive\n */\n private parseDirective(): DirectiveNode | null {\n const start = this.peek().start;\n const directiveToken = this.advance();\n\n switch (directiveToken.type) {\n case TokenType.DIRECTIVE_IF:\n case TokenType.DIRECTIVE_ELSE_IF: {\n this.expect(TokenType.ATTRIBUTE_EQUALS);\n this.expect(TokenType.EXPRESSION_START);\n\n const exprToken = this.peek();\n let condition = '';\n\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n condition = exprToken.value.trim();\n this.advance();\n }\n\n if (!condition)\n throw this.error('Expected a non-empty condition', exprToken);\n const end = this.peek().end;\n this.expect(TokenType.EXPRESSION_END);\n\n return directiveToken.type === TokenType.DIRECTIVE_IF\n ? createDirectiveIfNode(condition, start, end)\n : createDirectiveElseIfNode(condition, start, end);\n }\n\n case TokenType.DIRECTIVE_ELSE: {\n const end = directiveToken.end;\n return createDirectiveElseNode(start, end);\n }\n\n case TokenType.DIRECTIVE_FOR: {\n this.expect(TokenType.ATTRIBUTE_EQUALS);\n this.expect(TokenType.EXPRESSION_START);\n\n const exprToken = this.peek();\n let expression = '';\n\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n expression = exprToken.value.trim();\n this.advance();\n }\n\n const end = this.peek().end;\n this.expect(TokenType.EXPRESSION_END);\n\n // Parse for expression: \"item in list\" or \"(item, index) in list\"\n const { item, index, list } = this.parseForExpression(\n expression,\n exprToken\n );\n\n return createDirectiveForNode(item, list, index, start, end);\n }\n\n default:\n return null;\n }\n }\n\n /**\n * Parse l-for expression\n */\n private parseForExpression(\n expression: string,\n token: Token\n ): {\n item: string;\n index?: string;\n list: string;\n } {\n const identifier = '[A-Za-z_$][\\\\w$]*';\n const withParenRegex = new RegExp(\n `^\\\\s*\\\\(\\\\s*(${identifier})\\\\s*,\\\\s*(${identifier})\\\\s*\\\\)\\\\s+in\\\\s+([\\\\s\\\\S]+)$`\n );\n const simpleRegex = new RegExp(\n `^\\\\s*(${identifier})\\\\s+in\\\\s+([\\\\s\\\\S]+)$`\n );\n\n // Match pattern: \"(item, index) in list\" or \"item in list\"\n const withParenMatch = expression.match(withParenRegex);\n if (withParenMatch) {\n return {\n item: withParenMatch[1],\n index: withParenMatch[2],\n list: withParenMatch[3].trim(),\n };\n }\n\n const simpleMatch = expression.match(simpleRegex);\n if (simpleMatch) {\n return {\n item: simpleMatch[1],\n list: simpleMatch[2].trim(),\n };\n }\n\n throw this.error(\n 'Invalid l-for: expected item in list or (item, index) in list',\n token\n );\n }\n\n /**\n * Parse text node\n */\n private parseText(): TemplateNode | null {\n const token = this.advance();\n return createTextNode(token.value, token.start, token.end);\n }\n\n /**\n * Parse interpolation node\n */\n private parseInterpolation(): TemplateNode | null {\n const start = this.peek().start;\n\n this.expect(TokenType.EXPRESSION_START);\n\n const exprToken = this.peek();\n let expression = '';\n\n if (exprToken.type === TokenType.EXPRESSION_CONTENT) {\n expression = exprToken.value.trim();\n this.advance();\n }\n\n if (!expression)\n throw this.error('Expected a non-empty interpolation', exprToken);\n const end = this.peek().end;\n this.expect(TokenType.EXPRESSION_END);\n\n return createInterpolationNode(expression, start, end);\n }\n\n /**\n * Parse comment node\n */\n private parseComment(): TemplateNode | null {\n const token = this.advance();\n // Extract content between <!-- and -->\n const content = token.value.replace(/^<!--\\s*|\\s*-->$/g, '');\n return createCommentNode(content, token.start, token.end);\n }\n\n private error(message: string, token: Token): Error {\n return Object.assign(\n new Error(\n `${message} at line ${token.start.line}, column ${token.start.column}`\n ),\n { line: token.start.line, column: token.start.column }\n );\n }\n\n /**\n * Peek at current token without consuming\n */\n private peek(): Token {\n return this.tokens[this.position];\n }\n\n /**\n * Advance to next token and return current\n */\n private advance(): Token {\n const token = this.tokens[this.position];\n this.position++;\n return token;\n }\n\n /**\n * Check if current token matches type\n */\n private check(type: TokenType): boolean {\n if (this.isEOF()) return false;\n return this.peek().type === type;\n }\n\n /**\n * Expect a token of specific type, throw error if not found\n */\n private expect(type: TokenType): Token {\n const token = this.peek();\n if (token.type !== type) {\n const error = new Error(\n `Expected token ${type} but got ${token.type} at line ${token.start.line}, column ${token.start.column}`\n ) as Error & { line?: number; column?: number };\n error.line = token.start.line;\n error.column = token.start.column;\n throw error;\n }\n return this.advance();\n }\n\n /**\n * Check if we've reached EOF\n */\n private isEOF(): boolean {\n return (\n this.position >= this.tokens.length || this.peek().type === TokenType.EOF\n );\n }\n}\n\n/**\n * Parse template string into AST\n */\nexport function parse(tokens: Token[], preserveWhitespace = false): RootNode {\n const parser = new Parser(tokens, preserveWhitespace);\n return parser.parse();\n}\n","import {\n RootNode,\n TemplateNode,\n ElementNode,\n NodeType,\n DirectiveIfNode,\n DirectiveElseIfNode,\n DirectiveElseNode,\n} from '../parser/ast';\n\n/**\n * Group conditional elements (l-if/l-else-if/l-else chain)\n * This transform marks related conditional elements for easier codegen\n */\nexport interface ConditionalGroup {\n if: ElementNode;\n elseIfs: ElementNode[];\n else?: ElementNode;\n}\n\n/**\n * Transform directives in the AST\n * Currently handles:\n * - Grouping l-if/l-else-if/l-else chains\n */\nexport function transformDirectives(ast: RootNode): RootNode {\n return {\n ...ast,\n children: transformNodeList(ast.children),\n };\n}\n\n/**\n * Transform a list of nodes, handling conditional grouping\n */\nfunction transformNodeList(nodes: TemplateNode[]): TemplateNode[] {\n const result: TemplateNode[] = [];\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node.type === NodeType.ELEMENT) {\n // Process element's children recursively\n const transformedElement: ElementNode = {\n ...node,\n children: transformNodeList(node.children),\n };\n\n const orphan = node.directives.find(\n d =>\n d.type === NodeType.DIRECTIVE_ELSE_IF ||\n d.type === NodeType.DIRECTIVE_ELSE\n );\n if (orphan) {\n throw Object.assign(\n new Error('l-else-if/l-else must follow l-if or l-else-if'),\n { line: orphan.start.line, column: orphan.start.column }\n );\n }\n\n // Check if this starts a conditional chain\n const ifDirective = node.directives.find(\n d => d.type === NodeType.DIRECTIVE_IF\n ) as DirectiveIfNode | undefined;\n\n if (ifDirective) {\n // This starts a conditional chain, look ahead for else-if/else\n const conditionalGroup: ConditionalGroup = {\n if: { ...transformedElement },\n elseIfs: [],\n };\n\n // Look ahead for else-if and else\n let j = i + 1;\n let consumed = i;\n while (j < nodes.length) {\n const nextNode = nodes[j];\n\n if (\n nextNode.type === NodeType.COMMENT ||\n (nextNode.type === NodeType.TEXT && !nextNode.content.trim())\n ) {\n j++;\n continue;\n }\n\n if (nextNode.type === NodeType.ELEMENT) {\n const elseIfDirective = nextNode.directives.find(\n d => d.type === NodeType.DIRECTIVE_ELSE_IF\n ) as DirectiveElseIfNode | undefined;\n\n const elseDirective = nextNode.directives.find(\n d => d.type === NodeType.DIRECTIVE_ELSE\n ) as DirectiveElseNode | undefined;\n\n if (elseIfDirective) {\n conditionalGroup.elseIfs.push({\n ...nextNode,\n children: transformNodeList(nextNode.children),\n });\n consumed = j;\n j++;\n continue;\n }\n\n if (elseDirective) {\n conditionalGroup.else = {\n ...nextNode,\n children: transformNodeList(nextNode.children),\n };\n consumed = j;\n j++;\n break;\n }\n }\n\n // Not part of the conditional chain\n break;\n }\n\n // Mark the conditional group metadata (for codegen)\n // We'll store this in a symbol property that codegen can check\n (transformedElement as any).__conditionalGroup = conditionalGroup;\n\n // Skip the else-if/else nodes we've processed\n i = consumed;\n }\n\n result.push(transformedElement);\n } else if (node.type === NodeType.FRAGMENT) {\n result.push({\n ...node,\n children: transformNodeList(node.children),\n });\n } else {\n // Non-element nodes pass through\n result.push(node);\n }\n }\n\n return result;\n}\n\n/**\n * Get conditional group if element is part of one\n */\nexport function getConditionalGroup(\n element: ElementNode\n): ConditionalGroup | undefined {\n return (element as any).__conditionalGroup;\n}\n\n/**\n * Check if element has a specific directive type\n */\nexport function hasDirective(\n element: ElementNode,\n directiveType: NodeType\n): boolean {\n return element.directives.some(d => d.type === directiveType);\n}\n\n/**\n * Get directive of specific type from element\n */\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType.DIRECTIVE_IF\n): DirectiveIfNode | undefined;\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType.DIRECTIVE_ELSE_IF\n): DirectiveElseIfNode | undefined;\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType.DIRECTIVE_ELSE\n): DirectiveElseNode | undefined;\nexport function getDirective(\n element: ElementNode,\n directiveType: NodeType\n): DirectiveIfNode | DirectiveElseIfNode | DirectiveElseNode | undefined {\n return element.directives.find(d => d.type === directiveType) as any;\n}\n","import {\n RootNode,\n TemplateNode,\n ElementNode,\n FragmentNode,\n TextNode,\n NodeType,\n createTextNode,\n} from '../parser/ast';\nimport { getConditionalGroup } from './directives';\n\n/**\n * Optimize the AST\n * - Merge consecutive text nodes\n * - Remove empty text nodes (whitespace-only)\n * - Trim text nodes at boundaries\n */\nexport function optimize(ast: RootNode, options?: OptimizeOptions): RootNode {\n const opts: Required<OptimizeOptions> = {\n mergeTextNodes: true,\n removeWhitespace: true,\n trimText: true,\n ...options,\n };\n\n return {\n ...ast,\n children: optimizeNodeList(ast.children, opts),\n };\n}\n\nexport interface OptimizeOptions {\n mergeTextNodes?: boolean;\n removeWhitespace?: boolean;\n trimText?: boolean;\n}\n\n/**\n * Optimize a list of nodes\n */\nfunction optimizeNodeList(\n nodes: TemplateNode[],\n options: Required<OptimizeOptions>\n): TemplateNode[] {\n let result: TemplateNode[] = nodes.map(node => optimizeNode(node, options));\n\n // Merge consecutive text nodes\n if (options.mergeTextNodes) {\n result = mergeTextNodes(result);\n }\n\n // Only discard multiline indentation; a single space between inline nodes is meaningful.\n if (options.removeWhitespace) {\n result = removeWhitespaceNodes(result);\n }\n if (options.trimText) {\n result = result.map((node, index) =>\n node.type === NodeType.TEXT\n ? {\n ...node,\n content:\n result.length === 1\n ? node.content.trim()\n : index === 0\n ? node.content.trimStart()\n : index === result.length - 1\n ? node.content.trimEnd()\n : node.content,\n }\n : node\n );\n }\n\n return result;\n}\n\n/**\n * Optimize a single node\n */\nfunction optimizeNode(\n node: TemplateNode,\n options: Required<OptimizeOptions>\n): TemplateNode {\n if (node.type === NodeType.ELEMENT) {\n return optimizeElementNode(node, options);\n }\n\n if (node.type === NodeType.FRAGMENT) {\n return optimizeFragmentNode(node, options);\n }\n\n if (node.type === NodeType.TEXT) {\n return node;\n }\n\n return node;\n}\n\n/**\n * Optimize an element node\n */\nfunction optimizeElementNode(\n node: ElementNode,\n options: Required<OptimizeOptions>\n): ElementNode {\n const childOptions = /^(pre|textarea)$/.test(node.tag)\n ? { ...options, trimText: false, removeWhitespace: false }\n : options;\n const result = {\n ...node,\n children: optimizeNodeList(node.children, childOptions),\n };\n const group = getConditionalGroup(node);\n if (group) {\n (result as any).__conditionalGroup = {\n if: optimizeElementNode(group.if, options),\n elseIfs: group.elseIfs.map(branch =>\n optimizeElementNode(branch, options)\n ),\n else: group.else ? optimizeElementNode(group.else, options) : undefined,\n };\n }\n return result;\n}\n\n/**\n * Optimize a fragment node\n */\nfunction optimizeFragmentNode(\n node: FragmentNode,\n options: Required<OptimizeOptions>\n): FragmentNode {\n return {\n ...node,\n children: optimizeNodeList(node.children, options),\n };\n}\n\n/**\n * Merge consecutive text nodes\n */\nfunction mergeTextNodes(nodes: TemplateNode[]): TemplateNode[] {\n const result: TemplateNode[] = [];\n let currentText: TextNode | null = null;\n\n for (const node of nodes) {\n if (node.type === NodeType.TEXT) {\n if (currentText) {\n // Merge with previous text node\n currentText = createTextNode(\n currentText.content + node.content,\n currentText.start,\n node.end\n );\n } else {\n currentText = node;\n }\n } else {\n // Push accumulated text node if any\n if (currentText) {\n result.push(currentText);\n currentText = null;\n }\n result.push(node);\n }\n }\n\n // Don't forget the last text node\n if (currentText) {\n result.push(currentText);\n }\n\n return result;\n}\n\n/**\n * Remove whitespace-only text nodes\n */\nfunction removeWhitespaceNodes(nodes: TemplateNode[]): TemplateNode[] {\n return nodes.filter(node => {\n if (node.type === NodeType.TEXT) {\n return node.content.trim().length > 0 || !/[\\r\\n]/.test(node.content);\n }\n return true;\n });\n}\n\n/**\n * Check if a text node is whitespace-only\n */\nexport function isWhitespaceOnly(node: TextNode): boolean {\n return node.content.trim().length === 0;\n}\n\n/**\n * Count nodes in the tree\n */\nexport function countNodes(node: RootNode | TemplateNode): number {\n let count = 1;\n\n if (node.type === NodeType.ROOT) {\n node.children.forEach(child => {\n count += countNodes(child);\n });\n } else if (\n node.type === NodeType.ELEMENT ||\n node.type === NodeType.FRAGMENT\n ) {\n node.children.forEach(child => {\n count += countNodes(child);\n });\n }\n\n return count;\n}\n","import { RootNode } from '../parser/ast';\nimport { transformDirectives } from './directives';\nimport { optimize, OptimizeOptions } from './optimize';\n\n/**\n * Apply all transformations to the AST\n */\nexport function transform(ast: RootNode, options?: TransformOptions): RootNode {\n let result = ast;\n\n // Transform directives (group conditionals)\n result = transformDirectives(result);\n\n // Optimize AST\n if (options?.optimize !== false) {\n result = optimize(result, options?.optimizeOptions);\n }\n\n return result;\n}\n\nexport interface TransformOptions {\n optimize?: boolean;\n optimizeOptions?: OptimizeOptions;\n}\n\nexport { transformDirectives, optimize };\nexport * from './directives';\nexport * from './optimize';\n","import {\n RootNode,\n TemplateNode,\n ElementNode,\n FragmentNode,\n TextNode,\n InterpolationNode,\n NodeType,\n DirectiveForNode,\n} from '../parser/ast';\nimport { tokenize } from '../parser/lexer';\nimport { parse } from '../parser/parser';\nimport { getConditionalGroup, getDirective, transform } from '../transform';\nimport { scanTemplates } from '../docPipe/scan';\n\n/**\n * Generate JavaScript code from AST\n */\nexport function generate(ast: RootNode, options?: GenerateOptions): string {\n const opts: Required<GenerateOptions> = {\n templateFactory: 'h',\n templateFragmentFactory: 'Fragment',\n ...options,\n };\n\n const code = generateChildren(ast.children, opts);\n\n return code;\n}\n\nexport interface GenerateOptions {\n templateFactory?: string;\n templateFragmentFactory?: string;\n}\n\n/**\n * Generate code for children nodes\n */\nfunction generateChildren(\n children: TemplateNode[],\n options: Required<GenerateOptions>\n): string {\n const childrenCode = children\n .map(child => generateNode(child, options))\n .filter(code => code !== '');\n\n if (childrenCode.length === 0) {\n return 'null';\n }\n\n if (childrenCode.length === 1) {\n return childrenCode[0];\n }\n\n // Multiple children - wrap in array or Fragment\n return `[${childrenCode.join(', ')}]`;\n}\n\n/**\n * Generate code for a single node\n */\nfunction generateNode(\n node: TemplateNode,\n options: Required<GenerateOptions>\n): string {\n switch (node.type) {\n case NodeType.ELEMENT:\n return generateElement(node, options);\n case NodeType.FRAGMENT:\n return generateFragment(node, options);\n case NodeType.TEXT:\n return generateText(node);\n case NodeType.INTERPOLATION:\n return generateInterpolation(node, options);\n case NodeType.COMMENT:\n // Comments are not rendered\n return '';\n default:\n return '';\n }\n}\n\n/**\n * Generate code for an element node\n */\nfunction generateElement(\n node: ElementNode,\n options: Required<GenerateOptions>\n): string {\n // Check if this element has l-for directive\n const forDirective = node.directives.find(\n d => d.type === NodeType.DIRECTIVE_FOR\n ) as DirectiveForNode | undefined;\n\n if (forDirective) {\n return generateForLoop(node, forDirective, options);\n }\n\n const conditionalGroup = getConditionalGroup(node);\n if (conditionalGroup) {\n return generateConditionalGroup(conditionalGroup, options);\n }\n\n return generateNormalElement(node, options);\n}\n\n/**\n * Generate code for a normal element (without directives)\n */\nfunction generateNormalElement(\n node: ElementNode,\n options: Required<GenerateOptions>\n): string {\n const factory = options.templateFactory;\n\n // Tag name (component or string)\n const tag = node.isComponent ? node.tag : `'${node.tag}'`;\n\n // Props\n const props = generateProps(node, options);\n\n // Children\n const children = node.children\n .map(child => generateNode(child, options))\n .filter(code => code !== '');\n\n // Build h() call\n if (children.length === 0) {\n return `${factory}(${tag}, ${props})`;\n }\n\n return `${factory}(${tag}, ${props}, ${children.join(', ')})`;\n}\n\n/**\n * Generate code for a fragment node\n */\nfunction generateFragment(\n node: FragmentNode,\n options: Required<GenerateOptions>\n): string {\n const factory = options.templateFactory;\n const fragment = options.templateFragmentFactory;\n\n const children = node.children\n .map(child => generateNode(child, options))\n .filter(code => code !== '');\n\n if (children.length === 0) {\n return `${factory}(${fragment}, null)`;\n }\n\n return `${factory}(${fragment}, null, ${children.join(', ')})`;\n}\n\n/**\n * Generate props object\n */\nfunction generateProps(\n node: ElementNode,\n options: Required<GenerateOptions>\n): string {\n if (node.attributes.length === 0) {\n return 'null';\n }\n\n const props = node.attributes.map(attr => {\n const key =\n /^[A-Za-z_$][\\w$]*$/.test(attr.name) && attr.name !== '__proto__'\n ? attr.name\n : `[${stringLiteral(attr.name)}]`;\n let value: string;\n\n if (attr.value === null) {\n // Boolean attribute (e.g., disabled, checked)\n value = 'true';\n } else if (typeof attr.value === 'string') {\n // Static string value\n value = stringLiteral(attr.value);\n } else {\n // Dynamic expression\n value = expressionCode(\n transformExpression(attr.value.expression, options)\n );\n }\n\n return `${key}: ${value}`;\n });\n\n return `{ ${props.join(', ')} }`;\n}\n\n/**\n * Generate code for text node\n */\nfunction generateText(node: TextNode): string {\n return stringLiteral(node.content);\n}\n\n/**\n * Generate code for interpolation node\n */\nfunction generateInterpolation(\n node: InterpolationNode,\n options: Required<GenerateOptions>\n): string {\n return expressionCode(transformExpression(node.expression, options));\n}\n\n/**\n * Generate code for l-for loop\n */\nfunction generateForLoop(\n node: ElementNode,\n directive: DirectiveForNode,\n options: Required<GenerateOptions>\n): string {\n const { item, index, list } = directive;\n const listCode = transformExpression(list, options);\n\n // Generate the element code (without the for directive)\n const elementWithoutFor: ElementNode = {\n ...node,\n directives: node.directives.filter(d => d.type !== NodeType.DIRECTIVE_FOR),\n };\n\n const group = getConditionalGroup(node);\n if (group) {\n (elementWithoutFor as any).__conditionalGroup = {\n ...group,\n if: {\n ...group.if,\n directives: group.if.directives.filter(\n d => d.type !== NodeType.DIRECTIVE_FOR\n ),\n },\n };\n }\n const elementCode = generateElement(elementWithoutFor, options);\n\n // Generate map function\n if (index) {\n return `(${listCode}).map((${item}, ${index}) => ${elementCode})`;\n } else {\n return `(${listCode}).map(${item} => ${elementCode})`;\n }\n}\n\n/**\n * Generate code for conditional group (l-if/l-else-if/l-else)\n */\nfunction generateConditionalGroup(\n group: any,\n options: Required<GenerateOptions>\n): string {\n // Start with if condition\n const ifDirective = getDirective(group.if, NodeType.DIRECTIVE_IF);\n if (!ifDirective) {\n return generateNormalElement(group.if, options);\n }\n\n const ifElementWithoutDirective: ElementNode = {\n ...group.if,\n directives: group.if.directives.filter(\n (d: any) => d.type !== NodeType.DIRECTIVE_IF\n ),\n };\n\n delete (ifElementWithoutDirective as any).__conditionalGroup;\n let code = `(${transformExpression(ifDirective.condition, options)}) ? ${generateElement(ifElementWithoutDirective, options)}`;\n\n // Add else-if conditions\n for (const elseIfNode of group.elseIfs || []) {\n const elseIfDirective = getDirective(\n elseIfNode,\n NodeType.DIRECTIVE_ELSE_IF\n );\n if (!elseIfDirective) continue;\n\n const elseIfElementWithoutDirective: ElementNode = {\n ...elseIfNode,\n directives: elseIfNode.directives.filter(\n (d: any) => d.type !== NodeType.DIRECTIVE_ELSE_IF\n ),\n };\n\n code += ` : (${transformExpression(elseIfDirective.condition, options)}) ? ${generateElement(elseIfElementWithoutDirective, options)}`;\n }\n\n // Add else condition\n if (group.else) {\n const elseElementWithoutDirective: ElementNode = {\n ...group.else,\n directives: group.else.directives.filter(\n (d: any) => d.type !== NodeType.DIRECTIVE_ELSE\n ),\n };\n\n code += ` : ${generateElement(elseElementWithoutDirective, options)}`;\n } else {\n code += ' : null';\n }\n\n return code;\n}\n\nexport function formatCode(code: string): string {\n // Basic formatting - this is a simple implementation\n // For production, you might want to use prettier or similar\n return code;\n}\n\nfunction stringLiteral(value: string): string {\n return `'${value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')}'`;\n}\n\nfunction expressionCode(expression: string): string {\n // Preserve expression boundaries when inserting into arguments or properties.\n return /^[A-Za-z_$][\\w$]*$/.test(expression) ? expression : `(${expression})`;\n}\n\nfunction transformExpression(\n expression: string,\n options: Required<GenerateOptions>\n): string {\n if (!expression.includes('<')) {\n return expression;\n }\n\n const matches = scanTemplates(expression);\n if (matches.length === 0) {\n return expression;\n }\n\n let result = '';\n let lastIndex = 0;\n let changed = false;\n\n for (const match of matches) {\n let replacement: string | null = null;\n try {\n replacement = compileEmbeddedTemplate(match.snippet, options);\n } catch {\n replacement = null;\n }\n\n if (!replacement) {\n result += expression.slice(lastIndex, match.end);\n lastIndex = match.end;\n continue;\n }\n\n result += expression.slice(lastIndex, match.start) + replacement;\n lastIndex = match.end;\n changed = true;\n }\n\n result += expression.slice(lastIndex);\n\n return changed ? result : expression;\n}\n\nfunction compileEmbeddedTemplate(\n templateSource: string,\n options: Required<GenerateOptions>\n): string {\n const tokens = tokenize(templateSource);\n const ast = parse(tokens, true);\n const transformedAst = transform(ast);\n return generate(transformedAst, options);\n}\n","import { tokenize } from './parser/lexer';\nimport { parse } from './parser/parser';\nimport { transform, TransformOptions } from './transform';\nimport { generate, GenerateOptions } from './codegen';\n\n/**\n * Compile a Lithent template to JavaScript code\n */\nexport function compile(\n template: string,\n options?: CompileOptions\n): CompileResult {\n try {\n // 1. Tokenize\n const tokens = tokenize(template);\n\n // 2. Parse\n const ast = parse(tokens, true);\n\n // 3. Transform\n const transformedAst = transform(ast, options?.transform);\n\n // 4. Generate\n const code = generate(transformedAst, options?.generate);\n\n return {\n code,\n ast: transformedAst,\n errors: [],\n };\n } catch (error) {\n const err = error as Error & { line?: number; column?: number };\n return {\n code: '',\n ast: null,\n errors: [\n {\n message: error instanceof Error ? error.message : String(error),\n line: err.line ?? 0,\n column: err.column ?? 0,\n },\n ],\n };\n }\n}\n\nexport interface CompileOptions {\n transform?: TransformOptions;\n generate?: GenerateOptions;\n}\n\nexport interface CompileResult {\n code: string;\n ast: any;\n errors: CompileError[];\n}\n\nexport interface CompileError {\n message: string;\n line: number;\n column: number;\n}\n\n// Re-export all modules\nexport * from './parser/tokens';\nexport * from './parser/lexer';\nexport * from './parser/parser';\nexport * from './parser/ast';\nexport * from './transform';\nexport * from './codegen';\n","// src/vlq.ts\nvar comma = \",\".charCodeAt(0);\nvar semicolon = \";\".charCodeAt(0);\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar intToChar = new Uint8Array(64);\nvar charToInt = new Uint8Array(128);\nfor (let i = 0; i < chars.length; i++) {\n const c = chars.charCodeAt(i);\n intToChar[i] = c;\n charToInt[c] = i;\n}\nfunction decodeInteger(reader, relative) {\n let value = 0;\n let shift = 0;\n let integer = 0;\n do {\n const c = reader.next();\n integer = charToInt[c];\n value |= (integer & 31) << shift;\n shift += 5;\n } while (integer & 32);\n const shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -2147483648 | -value;\n }\n return relative + value;\n}\nfunction encodeInteger(builder, num, relative) {\n let delta = num - relative;\n delta = delta < 0 ? -delta << 1 | 1 : delta << 1;\n do {\n let clamped = delta & 31;\n delta >>>= 5;\n if (delta > 0) clamped |= 32;\n builder.write(intToChar[clamped]);\n } while (delta > 0);\n return num;\n}\nfunction hasMoreVlq(reader, max) {\n if (reader.pos >= max) return false;\n return reader.peek() !== comma;\n}\n\n// src/strings.ts\nvar bufLength = 1024 * 16;\nvar td = typeof TextDecoder !== \"undefined\" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== \"undefined\" ? {\n decode(buf) {\n const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n return out.toString();\n }\n} : {\n decode(buf) {\n let out = \"\";\n for (let i = 0; i < buf.length; i++) {\n out += String.fromCharCode(buf[i]);\n }\n return out;\n }\n};\nvar StringWriter = class {\n constructor() {\n this.pos = 0;\n this.out = \"\";\n this.buffer = new Uint8Array(bufLength);\n }\n write(v) {\n const { buffer } = this;\n buffer[this.pos++] = v;\n if (this.pos === bufLength) {\n this.out += td.decode(buffer);\n this.pos = 0;\n }\n }\n flush() {\n const { buffer, out, pos } = this;\n return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;\n }\n};\nvar StringReader = class {\n constructor(buffer) {\n this.pos = 0;\n this.buffer = buffer;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(char) {\n const { buffer, pos } = this;\n const idx = buffer.indexOf(char, pos);\n return idx === -1 ? buffer.length : idx;\n }\n};\n\n// src/scopes.ts\nvar EMPTY = [];\nfunction decodeOriginalScopes(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const scopes = [];\n const stack = [];\n let line = 0;\n for (; reader.pos < length; reader.pos++) {\n line = decodeInteger(reader, line);\n const column = decodeInteger(reader, 0);\n if (!hasMoreVlq(reader, length)) {\n const last = stack.pop();\n last[2] = line;\n last[3] = column;\n continue;\n }\n const kind = decodeInteger(reader, 0);\n const fields = decodeInteger(reader, 0);\n const hasName = fields & 1;\n const scope = hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind];\n let vars = EMPTY;\n if (hasMoreVlq(reader, length)) {\n vars = [];\n do {\n const varsIndex = decodeInteger(reader, 0);\n vars.push(varsIndex);\n } while (hasMoreVlq(reader, length));\n }\n scope.vars = vars;\n scopes.push(scope);\n stack.push(scope);\n }\n return scopes;\n}\nfunction encodeOriginalScopes(scopes) {\n const writer = new StringWriter();\n for (let i = 0; i < scopes.length; ) {\n i = _encodeOriginalScopes(scopes, i, writer, [0]);\n }\n return writer.flush();\n}\nfunction _encodeOriginalScopes(scopes, index, writer, state) {\n const scope = scopes[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;\n if (index > 0) writer.write(comma);\n state[0] = encodeInteger(writer, startLine, state[0]);\n encodeInteger(writer, startColumn, 0);\n encodeInteger(writer, kind, 0);\n const fields = scope.length === 6 ? 1 : 0;\n encodeInteger(writer, fields, 0);\n if (scope.length === 6) encodeInteger(writer, scope[5], 0);\n for (const v of vars) {\n encodeInteger(writer, v, 0);\n }\n for (index++; index < scopes.length; ) {\n const next = scopes[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeOriginalScopes(scopes, index, writer, state);\n }\n writer.write(comma);\n state[0] = encodeInteger(writer, endLine, state[0]);\n encodeInteger(writer, endColumn, 0);\n return index;\n}\nfunction decodeGeneratedRanges(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const ranges = [];\n const stack = [];\n let genLine = 0;\n let definitionSourcesIndex = 0;\n let definitionScopeIndex = 0;\n let callsiteSourcesIndex = 0;\n let callsiteLine = 0;\n let callsiteColumn = 0;\n let bindingLine = 0;\n let bindingColumn = 0;\n do {\n const semi = reader.indexOf(\";\");\n let genColumn = 0;\n for (; reader.pos < semi; reader.pos++) {\n genColumn = decodeInteger(reader, genColumn);\n if (!hasMoreVlq(reader, semi)) {\n const last = stack.pop();\n last[2] = genLine;\n last[3] = genColumn;\n continue;\n }\n const fields = decodeInteger(reader, 0);\n const hasDefinition = fields & 1;\n const hasCallsite = fields & 2;\n const hasScope = fields & 4;\n let callsite = null;\n let bindings = EMPTY;\n let range;\n if (hasDefinition) {\n const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);\n definitionScopeIndex = decodeInteger(\n reader,\n definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0\n );\n definitionSourcesIndex = defSourcesIndex;\n range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];\n } else {\n range = [genLine, genColumn, 0, 0];\n }\n range.isScope = !!hasScope;\n if (hasCallsite) {\n const prevCsi = callsiteSourcesIndex;\n const prevLine = callsiteLine;\n callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);\n const sameSource = prevCsi === callsiteSourcesIndex;\n callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);\n callsiteColumn = decodeInteger(\n reader,\n sameSource && prevLine === callsiteLine ? callsiteColumn : 0\n );\n callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];\n }\n range.callsite = callsite;\n if (hasMoreVlq(reader, semi)) {\n bindings = [];\n do {\n bindingLine = genLine;\n bindingColumn = genColumn;\n const expressionsCount = decodeInteger(reader, 0);\n let expressionRanges;\n if (expressionsCount < -1) {\n expressionRanges = [[decodeInteger(reader, 0)]];\n for (let i = -1; i > expressionsCount; i--) {\n const prevBl = bindingLine;\n bindingLine = decodeInteger(reader, bindingLine);\n bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);\n const expression = decodeInteger(reader, 0);\n expressionRanges.push([expression, bindingLine, bindingColumn]);\n }\n } else {\n expressionRanges = [[expressionsCount]];\n }\n bindings.push(expressionRanges);\n } while (hasMoreVlq(reader, semi));\n }\n range.bindings = bindings;\n ranges.push(range);\n stack.push(range);\n }\n genLine++;\n reader.pos = semi + 1;\n } while (reader.pos < length);\n return ranges;\n}\nfunction encodeGeneratedRanges(ranges) {\n if (ranges.length === 0) return \"\";\n const writer = new StringWriter();\n for (let i = 0; i < ranges.length; ) {\n i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);\n }\n return writer.flush();\n}\nfunction _encodeGeneratedRanges(ranges, index, writer, state) {\n const range = ranges[index];\n const {\n 0: startLine,\n 1: startColumn,\n 2: endLine,\n 3: endColumn,\n isScope,\n callsite,\n bindings\n } = range;\n if (state[0] < startLine) {\n catchupLine(writer, state[0], startLine);\n state[0] = startLine;\n state[1] = 0;\n } else if (index > 0) {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, range[1], state[1]);\n const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0);\n encodeInteger(writer, fields, 0);\n if (range.length === 6) {\n const { 4: sourcesIndex, 5: scopesIndex } = range;\n if (sourcesIndex !== state[2]) {\n state[3] = 0;\n }\n state[2] = encodeInteger(writer, sourcesIndex, state[2]);\n state[3] = encodeInteger(writer, scopesIndex, state[3]);\n }\n if (callsite) {\n const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;\n if (sourcesIndex !== state[4]) {\n state[5] = 0;\n state[6] = 0;\n } else if (callLine !== state[5]) {\n state[6] = 0;\n }\n state[4] = encodeInteger(writer, sourcesIndex, state[4]);\n state[5] = encodeInteger(writer, callLine, state[5]);\n state[6] = encodeInteger(writer, callColumn, state[6]);\n }\n if (bindings) {\n for (const binding of bindings) {\n if (binding.length > 1) encodeInteger(writer, -binding.length, 0);\n const expression = binding[0][0];\n encodeInteger(writer, expression, 0);\n let bindingStartLine = startLine;\n let bindingStartColumn = startColumn;\n for (let i = 1; i < binding.length; i++) {\n const expRange = binding[i];\n bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);\n bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);\n encodeInteger(writer, expRange[0], 0);\n }\n }\n }\n for (index++; index < ranges.length; ) {\n const next = ranges[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeGeneratedRanges(ranges, index, writer, state);\n }\n if (state[0] < endLine) {\n catchupLine(writer, state[0], endLine);\n state[0] = endLine;\n state[1] = 0;\n } else {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, endColumn, state[1]);\n return index;\n}\nfunction catchupLine(writer, lastLine, line) {\n do {\n writer.write(semicolon);\n } while (++lastLine < line);\n}\n\n// src/sourcemap-codec.ts\nfunction decode(mappings) {\n const { length } = mappings;\n const reader = new StringReader(mappings);\n const decoded = [];\n let genColumn = 0;\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n do {\n const semi = reader.indexOf(\";\");\n const line = [];\n let sorted = true;\n let lastCol = 0;\n genColumn = 0;\n while (reader.pos < semi) {\n let seg;\n genColumn = decodeInteger(reader, genColumn);\n if (genColumn < lastCol) sorted = false;\n lastCol = genColumn;\n if (hasMoreVlq(reader, semi)) {\n sourcesIndex = decodeInteger(reader, sourcesIndex);\n sourceLine = decodeInteger(reader, sourceLine);\n sourceColumn = decodeInteger(reader, sourceColumn);\n if (hasMoreVlq(reader, semi)) {\n namesIndex = decodeInteger(reader, namesIndex);\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];\n } else {\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];\n }\n } else {\n seg = [genColumn];\n }\n line.push(seg);\n reader.pos++;\n }\n if (!sorted) sort(line);\n decoded.push(line);\n reader.pos = semi + 1;\n } while (reader.pos <= length);\n return decoded;\n}\nfunction sort(line) {\n line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n return a[0] - b[0];\n}\nfunction encode(decoded) {\n const writer = new StringWriter();\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n for (let i = 0; i < decoded.length; i++) {\n const line = decoded[i];\n if (i > 0) writer.write(semicolon);\n if (line.length === 0) continue;\n let genColumn = 0;\n for (let j = 0; j < line.length; j++) {\n const segment = line[j];\n if (j > 0) writer.write(comma);\n genColumn = encodeInteger(writer, segment[0], genColumn);\n if (segment.length === 1) continue;\n sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);\n sourceLine = encodeInteger(writer, segment[2], sourceLine);\n sourceColumn = encodeInteger(writer, segment[3], sourceColumn);\n if (segment.length === 4) continue;\n namesIndex = encodeInteger(writer, segment[4], namesIndex);\n }\n }\n return writer.flush();\n}\nexport {\n decode,\n decodeGeneratedRanges,\n decodeOriginalScopes,\n encode,\n encodeGeneratedRanges,\n encodeOriginalScopes\n};\n//# sourceMappingURL=sourcemap-codec.mjs.map\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nclass BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n\nclass Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\t{\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + ''\n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nclass SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t\tif (typeof properties.debugId !== 'undefined') {\n\t\t\tthis.debugId = properties.debugId;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n\nfunction guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n\nfunction getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n\nconst toString = Object.prototype.toString;\n\nfunction isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n\nfunction getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n\nconst wordRegex = /\\w/;\n\nclass Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t\tcharInHiresBoundary = false;\n\t\t\t} else {\n\t\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nclass MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t\toffset: { writable: true, value: options.offset || 0 },\n\t\t});\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\tif (this.outro) {\n\t\t\tmappings.advance(this.outro);\n\t\t}\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t);\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t);\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\t\tindex = index + this.offset;\n\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t);\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length - this.offset) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tlet previousChunk = chunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\n\t\t\t// Prevent infinite loop (e.g. via empty chunks, where start === end)\n\t\t\tif (chunk === previousChunk) return;\n\n\t\t\tpreviousChunk = chunk;\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tif (typeof replacement === 'function') {\n\t\t\t\treplacement = replacement(string, index, original);\n\t\t\t}\n\t\t\tif (string !== replacement) {\n\t\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tlet _replacement = replacement;\n\t\t\tif (typeof replacement === 'function') {\n\t\t\t\t_replacement = replacement(previous, index, original);\n\t\t\t}\n\t\t\tif (previous !== _replacement) this.overwrite(index, index + stringLength, _replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nclass Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n\nexport { Bundle, SourceMap, MagicString as default };\n//# sourceMappingURL=magic-string.es.mjs.map\n","import MagicString, { type SourceMap } from 'magic-string';\nimport { compile, type CompileError, type CompileOptions } from '../compiler';\nimport { scanTemplates, type TemplateMatch } from './scan';\n\nexport interface DocumentTransformOptions {\n /**\n * Include original source name in generated source map.\n */\n source?: string;\n /**\n * Emit a source map when true.\n */\n generateSourceMap?: boolean;\n /**\n * Forwarded compile options for each template block.\n */\n compileOptions?: CompileOptions;\n}\n\nexport interface DocumentTransformError {\n match: TemplateMatch;\n error: CompileError;\n}\n\nexport interface DocumentTransformResult {\n code: string;\n map: SourceMap | null;\n /**\n * `true` when at least one replacement succeeded.\n */\n transformed: boolean;\n /**\n * Errors produced while compiling templates.\n */\n errors: DocumentTransformError[];\n /**\n * All template matches discovered in the source.\n */\n matches: TemplateMatch[];\n}\n\nexport const transformDocument = (\n source: string,\n options: DocumentTransformOptions = {}\n): DocumentTransformResult => {\n const matches = scanTemplates(source);\n if (matches.length === 0) {\n return {\n code: source,\n map: null,\n transformed: false,\n errors: [],\n matches: [],\n };\n }\n\n const ms = new MagicString(source);\n const errors: DocumentTransformError[] = [];\n let transformed = false;\n\n for (const match of matches) {\n const result = compile(match.snippet, options.compileOptions);\n if (result.errors.length > 0 || !result.code) {\n for (const error of result.errors) {\n errors.push({ match, error });\n }\n continue;\n }\n\n ms.overwrite(match.start, match.end, result.code);\n transformed = true;\n }\n\n if (!transformed) {\n return {\n code: source,\n map: null,\n transformed: false,\n errors,\n matches,\n };\n }\n\n const code = ms.toString();\n let map: SourceMap | null = null;\n\n if (options.generateSourceMap) {\n const mapConfig = options.source\n ? { source: options.source, hires: true }\n : { hires: true };\n map = ms.generateMap(mapConfig);\n }\n\n return {\n code,\n map,\n transformed: true,\n errors,\n matches,\n };\n};\n\nexport { scanTemplates };\nexport type { TemplateMatch };\n"],"names":["identifierStart","char","identifierPart","expressionKeywords","skipQuoted","source","index","quote","skipLineComment","i","skipBlockComment","end","skipRegex","inClass","skipTemplateLiteral","skipJsExpression","createContext","statementStart","nextJsToken","expressionAllowed","context","word","control","block","depth","match","extractTemplate","token","skipTag","start","pos","closing","scanTemplates","code","matches","TokenType","createPosition","line","column","offset","createToken","type","value","Lexer","input","__publicField","closed","first","unexpectedStart","unexpectedEnd","tokenType","escaped","startPos","openEnd","contentStart","contentEnd","tokenize","NodeType","isElementNode","node","isFragmentNode","isTextNode","isInterpolationNode","isCommentNode","isDirective","createRootNode","children","createElementNode","tag","attributes","directives","isSelfClosing","isComponent","refAttr","attr","ref","createFragmentNode","createTextNode","content","createInterpolationNode","expression","createCommentNode","createAttributeNode","name","isDynamic","createDirectiveIfNode","condition","createDirectiveElseIfNode","createDirectiveElseNode","createDirectiveForNode","item","list","walk","visitor","child","transformTree","transformer","transformed","childTransformed","Parser","tokens","preserveWhitespace","t","closeToken","tagToken","closeTagToken","error","closeTag","directive","attribute","nameToken","valueToken","exprToken","directiveToken","identifier","withParenRegex","simpleRegex","withParenMatch","simpleMatch","message","parse","transformDirectives","ast","transformNodeList","nodes","result","transformedElement","orphan","d","conditionalGroup","j","consumed","nextNode","elseIfDirective","elseDirective","getConditionalGroup","element","hasDirective","directiveType","getDirective","optimize","options","opts","optimizeNodeList","optimizeNode","mergeTextNodes","removeWhitespaceNodes","optimizeElementNode","optimizeFragmentNode","childOptions","group","branch","currentText","isWhitespaceOnly","countNodes","count","transform","generate","generateChildren","childrenCode","generateNode","generateElement","generateFragment","generateText","generateInterpolation","forDirective","generateForLoop","generateConditionalGroup","generateNormalElement","factory","props","generateProps","fragment","key","stringLiteral","expressionCode","transformExpression","listCode","elementWithoutFor","elementCode","ifDirective","ifElementWithoutDirective","elseIfNode","elseIfElementWithoutDirective","elseElementWithoutDirective","formatCode","lastIndex","changed","replacement","compileEmbeddedTemplate","templateSource","transformedAst","compile","template","err","comma","semicolon","chars","intToChar","charToInt","c","encodeInteger","builder","num","relative","delta","clamped","bufLength","td","buf","out","StringWriter","v","buffer","encode","decoded","writer","sourcesIndex","sourceLine","sourceColumn","namesIndex","genColumn","segment","BitSet","arg","n","Chunk","chunk","fn","storeName","contentOnly","sliceIndex","originalBefore","originalAfter","newChunk","rx","trimmed","getBtoa","str","btoa","SourceMap","properties","guessIndent","lines","tabbed","spaced","min","previous","current","numSpaces","getRelativePath","from","to","fromParts","toParts","toString","isObject","thing","getLocator","originalLines","lineOffsets","m","wordRegex","Mappings","hires","sourceIndex","loc","nameIndex","contentLengthMinusOne","contentLineEnd","previousContentLineEnd","original","sourcemapLocations","originalCharIndex","charInHiresBoundary","warned","MagicString","string","cloned","originalChunk","clonedChunk","nextOriginalChunk","nextClonedChunk","names","mappings","locate","indentStr","pattern","isExcluded","exclusion","shouldIndentNextCharacter","replacer","charIndex","last","oldLeft","oldRight","newRight","newLeft","overwrite","lineIndex","lineStr","startChunk","containsEnd","sliceStart","sliceEnd","clone","previousChunk","searchForward","length","charType","aborted","searchValue","getReplacement","_","matchAll","re","stringLength","_replacement","transformDocument","ms","errors","map","mapConfig"],"mappings":"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","x_google_ignoreList":[10,11]}
|