bonsai-js 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["getObjectPropertyKey","makeLambdaAccessor"],"sources":["../src/parser.ts","../src/compiler.ts","../src/eval-ops.ts","../src/evaluator.ts","../src/evaluator-async.ts","../src/cache.ts","../src/plugins.ts","../src/index.ts"],"sourcesContent":["import type {\n ASTNode,\n BinaryExpressionOperator,\n ObjectProperty,\n OperatorValue,\n Token,\n} from './types.js'\nimport { tokenize } from './lexer.js'\nimport { ExpressionError } from './errors.js'\n\n// Precedence levels (binding power) for Pratt parsing\nconst PIPE_PRECEDENCE = 5\n\nconst PRECEDENCE: Readonly<Record<OperatorValue | '??', number | undefined>> = {\n '||': 10,\n '&&': 20,\n '??': 25,\n '==': 30,\n '!=': 30,\n '<': 40,\n '>': 40,\n '<=': 40,\n '>=': 40,\n 'in': 40,\n '+': 50,\n '-': 50,\n '*': 60,\n '/': 60,\n '%': 60,\n '**': 70,\n // Unary-only operators have no binary precedence\n '!': undefined,\n 'not': undefined,\n}\n\nconst MAX_PARSE_DEPTH = 32\n\nexport function parse(source: string, _depth = 0): ASTNode {\n if (_depth > MAX_PARSE_DEPTH) {\n throw new ExpressionError(\n 'Maximum template nesting depth exceeded',\n { source, start: 0, end: source.length },\n )\n }\n const tokens = tokenize(source)\n let pos = 0\n\n function current(): Token {\n return tokens[pos]\n }\n\n function advance(): Token {\n return tokens[pos++]\n }\n\n function expect(type: string, value?: string): Token {\n const tok = current()\n if (tok.type !== type || (value !== undefined && tok.value !== value)) {\n throw new ExpressionError(\n `Expected ${value ? `\"${value}\"` : type} but got ${tok.value ? `\"${tok.value}\"` : tok.type}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n return advance()\n }\n\n function parseExpression(minPrec = 0): ASTNode {\n let left = parseUnary()\n\n // Ternary — lowest precedence, handled before binary ops\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n return left\n }\n\n // Pipe expressions — very low precedence\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance() // skip '|>'\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n // Binary operators via Pratt parsing\n while (true) {\n const tok = current()\n let prec: number | undefined\n\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n // Handle 'not in' as a combined operator\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n if (prec === undefined || prec < minPrec) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n // Right-associative for **\n const nextMinPrec = opValue === '**' ? prec : prec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n\n // Ternary after binary (for cases like `a > 5 ? b : c`)\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n }\n\n // Pipe after binary/ternary\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance()\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n return left\n }\n\n function parsePipeTransform(): ASTNode {\n let node = parsePrimary()\n\n // Allow transform to be a call expression: `upper` or `default(\"N/A\")`\n if (current().type === 'Punctuation' && current().value === '(') {\n advance() // skip '('\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n }\n\n return node\n }\n\n function parseUnary(): ASTNode {\n const tok = current()\n\n if (tok.type === 'Operator' && (tok.value === '!' || tok.value === '-' || tok.value === '+')) {\n advance()\n const operand = parseUnary()\n return {\n type: 'UnaryExpression',\n operator: tok.value,\n operand,\n start: tok.start,\n end: operand.end,\n }\n }\n\n return parsePostfix()\n }\n\n function parsePostfix(): ASTNode {\n let node = parsePrimary()\n\n while (true) {\n const tok = current()\n\n // Dot notation: obj.prop\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const prop = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Bracket notation: obj[expr]\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n\n // Optional chaining: obj?.prop or obj?.[expr]\n if (tok.type === 'OptionalChain') {\n advance()\n // obj?.[expr] — computed optional\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n // obj?.prop — regular optional\n const prop = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Function call: fn(args)\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n\n break\n }\n\n return node\n }\n\n function parsePrimary(): ASTNode {\n const tok = current()\n\n // Number\n if (tok.type === 'Number') {\n advance()\n const raw = tok.value.replace(/_/g, '')\n return { type: 'NumberLiteral', value: Number(raw), start: tok.start, end: tok.end }\n }\n\n // String\n if (tok.type === 'String') {\n advance()\n return { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n }\n\n // Boolean\n if (tok.type === 'Boolean') {\n advance()\n return { type: 'BooleanLiteral', value: tok.value === 'true', start: tok.start, end: tok.end }\n }\n\n // Null\n if (tok.type === 'Null') {\n advance()\n return { type: 'NullLiteral', value: null, start: tok.start, end: tok.end }\n }\n\n // Undefined\n if (tok.type === 'Undefined') {\n advance()\n return { type: 'UndefinedLiteral', value: undefined, start: tok.start, end: tok.end }\n }\n\n // Template literal\n if (tok.type === 'TemplateLiteral') {\n return parseTemplateLiteral()\n }\n\n // Identifier\n if (tok.type === 'Identifier') {\n advance()\n return { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n }\n\n // Parenthesized expression\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const expr = parseExpression(0)\n expect('Punctuation', ')')\n return expr\n }\n\n // Array literal\n if (tok.type === 'Punctuation' && tok.value === '[') {\n return parseArrayLiteral()\n }\n\n // Object literal\n if (tok.type === 'Punctuation' && tok.value === '{') {\n return parseObjectLiteral()\n }\n\n // Lambda: .property or .property >= value (compound predicate)\n if (tok.type === 'Punctuation' && tok.value === '.') {\n return parseLambdaExpression()\n }\n\n // Spread element\n if (tok.type === 'Spread') {\n advance()\n const argument = parseExpression(0)\n return { type: 'SpreadElement', argument, start: tok.start, end: argument.end }\n }\n\n throw new ExpressionError(\n `Unexpected ${tok.type === 'EOF' ? 'end of expression' : `token \"${tok.value}\"`}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n function parseLambdaExpression(): ASTNode {\n // We're at the `.` token\n const start = current().start\n advance() // skip the `.`\n\n // Bare `.` as identity lambda (e.g., `. > 2`, `. == \"x\"`)\n // Must be followed by an operator to form a compound predicate.\n let node: ASTNode\n if (current().type !== 'Identifier') {\n if (current().type !== 'Operator' && current().type !== 'NullishCoalescing') {\n throw new ExpressionError(\n `Expected property name or operator after \".\"`,\n { source, start, end: start + 1 },\n )\n }\n node = { type: 'LambdaIdentity', start, end: start + 1 }\n } else {\n const prop = expect('Identifier')\n node = {\n type: 'LambdaAccessor',\n property: prop.value,\n start,\n end: prop.end,\n }\n }\n\n // Continue with postfix operations (member access, optional chaining, calls)\n while (true) {\n const tok = current()\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'OptionalChain') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n break\n }\n\n // Check for binary operator to form compound predicate\n const tok = current()\n let prec: number | undefined\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n // If followed by an operator, this is a compound lambda like `.age >= 18`\n if (prec !== undefined) {\n let left: ASTNode = node\n while (true) {\n const opTok = current()\n let opPrec: number | undefined\n if (opTok.type === 'Operator') {\n opPrec = PRECEDENCE[opTok.value]\n if (opTok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n opPrec = PRECEDENCE['in']\n }\n }\n } else if (opTok.type === 'NullishCoalescing') {\n opPrec = PRECEDENCE['??']\n }\n if (opPrec === undefined) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n const nextMinPrec = opValue === '**' ? opPrec : opPrec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n node = left\n }\n\n // Check for ternary — compound lambda with conditional\n if (current().type === 'Punctuation' && current().value === '?') {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n const body: ASTNode = {\n type: 'ConditionalExpression',\n test: node,\n consequent,\n alternate,\n start,\n end: alternate.end,\n }\n return {\n type: 'LambdaExpression',\n body,\n start,\n end: alternate.end,\n }\n }\n\n // If node is just a LambdaAccessor or LambdaIdentity, keep it as-is\n if (node.type === 'LambdaAccessor' || node.type === 'LambdaIdentity') {\n return node\n }\n\n // It has member access / calls / binary ops — wrap in LambdaExpression\n return {\n type: 'LambdaExpression',\n body: node,\n start,\n end: node.end,\n }\n }\n\n function parseArrayLiteral(): ASTNode {\n const start = expect('Punctuation', '[').start\n const elements: ASTNode[] = []\n\n while (!(current().type === 'Punctuation' && current().value === ']')) {\n if (elements.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ']') break\n elements.push(parseExpression(0))\n }\n\n const end = expect('Punctuation', ']').end\n return { type: 'ArrayLiteral', elements, start, end }\n }\n\n function parseObjectLiteral(): ASTNode {\n const start = expect('Punctuation', '{').start\n const properties: ObjectProperty[] = []\n\n while (!(current().type === 'Punctuation' && current().value === '}')) {\n if (properties.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === '}') break\n\n let key: ASTNode\n let computed = false\n\n // Computed property: [expr]\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n key = parseExpression(0)\n expect('Punctuation', ']')\n computed = true\n } else {\n // Identifier or string key\n const tok = current()\n if (tok.type === 'Identifier') {\n advance()\n key = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n\n // Shorthand: { name } → { name: name }\n const next = current()\n if (next.type === 'Punctuation' && (next.value === ',' || next.value === '}')) {\n const value: ASTNode = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed: false,\n start: key.start,\n end: value.end,\n })\n continue\n }\n } else if (tok.type === 'String') {\n advance()\n key = { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n } else {\n throw new ExpressionError(\n `Expected property name but got \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n }\n\n expect('Punctuation', ':')\n const value = parseExpression(0)\n\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed,\n start: key.start,\n end: value.end,\n })\n }\n\n const end = expect('Punctuation', '}').end\n return { type: 'ObjectLiteral', properties, start, end }\n }\n\n function parseTemplateLiteral(): ASTNode {\n const tok = advance() // consume TemplateLiteral token\n const raw = tok.value.slice(1, -1) // remove backticks\n const parts: ASTNode[] = []\n let i = 0\n let textStart = 0\n\n while (i < raw.length) {\n if (raw[i] === '$' && i + 1 < raw.length && raw[i + 1] === '{') {\n // Add text before interpolation\n if (i > textStart) {\n const text = raw.slice(textStart, i)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n // Find matching }\n i += 2\n let depth = 1\n const exprStart = i\n while (i < raw.length && depth > 0) {\n if (raw[i] === '{') depth++\n else if (raw[i] === '}') depth--\n if (depth > 0) i++\n }\n const exprSource = raw.slice(exprStart, i)\n i++ // skip closing }\n textStart = i\n // Parse the interpolated expression\n const exprAst = parse(exprSource, _depth + 1)\n parts.push(exprAst)\n } else {\n i++\n }\n }\n\n // Remaining text\n if (textStart < raw.length) {\n const text = raw.slice(textStart)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n\n return { type: 'TemplateLiteral', parts, start: tok.start, end: tok.end }\n }\n\n const result = parseExpression(0)\n\n if (current().type !== 'EOF') {\n const tok = current()\n throw new ExpressionError(\n `Unexpected token \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n return result\n}\n","import type { ASTNode, BinaryExpressionOperator } from './types.js'\n\nexport function compile(ast: ASTNode): ASTNode {\n return optimize(ast)\n}\n\nfunction optimize(node: ASTNode): ASTNode {\n switch (node.type) {\n case 'BinaryExpression': {\n const left = optimize(node.left)\n const right = optimize(node.right)\n\n // Constant folding\n if (isConstant(left) && isConstant(right)) {\n const result = evalConstant(node.operator, valueOf(left), valueOf(right))\n if (result !== undefined) {\n return makeConstant(result, node.start, node.end)\n }\n }\n\n return { ...node, left, right }\n }\n\n case 'ConditionalExpression': {\n const test = optimize(node.test)\n\n // Dead branch elimination\n if (isConstant(test)) {\n const value = valueOf(test)\n return value ? optimize(node.consequent) : optimize(node.alternate)\n }\n\n return {\n ...node,\n test,\n consequent: optimize(node.consequent),\n alternate: optimize(node.alternate),\n }\n }\n\n case 'UnaryExpression': {\n const operand = optimize(node.operand)\n if (isConstant(operand)) {\n const val = valueOf(operand)\n if (node.operator === '!' && typeof val === 'boolean') {\n return { type: 'BooleanLiteral', value: !val, start: node.start, end: node.end }\n }\n if (node.operator === '-' && typeof val === 'number') {\n return { type: 'NumberLiteral', value: -val, start: node.start, end: node.end }\n }\n }\n return { ...node, operand }\n }\n\n case 'PipeExpression':\n return { ...node, input: optimize(node.input), transform: optimize(node.transform) }\n\n case 'ArrayLiteral':\n return { ...node, elements: node.elements.map(e => optimize(e)) }\n\n case 'CallExpression':\n return { ...node, args: node.args.map(a => optimize(a)) }\n\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n return { ...node, object: optimize(node.object), property: node.computed ? optimize(node.property) : node.property }\n\n case 'LambdaExpression':\n return { ...node, body: optimize(node.body) }\n\n default:\n return node\n }\n}\n\nfunction isConstant(node: ASTNode): boolean {\n return node.type === 'NumberLiteral'\n || node.type === 'StringLiteral'\n || node.type === 'BooleanLiteral'\n || node.type === 'NullLiteral'\n}\n\nfunction valueOf(node: ASTNode): unknown {\n if (node.type === 'NumberLiteral') return node.value\n if (node.type === 'StringLiteral') return node.value\n if (node.type === 'BooleanLiteral') return node.value\n if (node.type === 'NullLiteral') return null\n return undefined\n}\n\nfunction evalConstant(op: BinaryExpressionOperator, left: unknown, right: unknown): unknown | undefined {\n if (typeof left === 'number' && typeof right === 'number') {\n switch (op) {\n case '+': return left + right\n case '-': return left - right\n case '*': return left * right\n case '/': return left / right\n case '%': return left % right\n case '**': return left ** right\n case '<': return left < right\n case '>': return left > right\n case '<=': return left <= right\n case '>=': return left >= right\n case '==': return left === right\n case '!=': return left !== right\n }\n }\n if (typeof left === 'string' && typeof right === 'string' && op === '+') {\n return left + right\n }\n if (typeof left === 'boolean' && typeof right === 'boolean') {\n if (op === '&&') return left && right\n if (op === '||') return left || right\n }\n if (op === '==') return left === right\n if (op === '!=') return left !== right\n return undefined\n}\n\nfunction makeConstant(value: unknown, start: number, end: number): ASTNode {\n if (typeof value === 'number') return { type: 'NumberLiteral', value, start, end }\n if (typeof value === 'string') return { type: 'StringLiteral', value, start, end }\n if (typeof value === 'boolean') return { type: 'BooleanLiteral', value, start, end }\n if (value === null) return { type: 'NullLiteral', value: null, start, end }\n return { type: 'UndefinedLiteral', value: undefined, start, end }\n}\n","import { suggest, BonsaiReferenceError, BonsaiSecurityError, BonsaiTypeError } from './errors.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport type {\n ASTNode,\n BinaryExpressionOperator,\n TransformFn,\n FunctionFn,\n UnaryOperator,\n} from './types.js'\n\ntype SafeMethod = (...args: unknown[]) => unknown\n\n/** Receiver type check for safe methods. */\nfunction isAllowedReceiver(obj: unknown, methodName: string): boolean {\n const t = typeof obj\n switch (methodName) {\n // String-only\n case 'startsWith': case 'endsWith': case 'substring':\n case 'charAt': case 'charCodeAt': case 'repeat':\n case 'trim': case 'trimStart': case 'trimEnd':\n case 'toLowerCase': case 'toUpperCase':\n case 'replace': case 'replaceAll':\n case 'padStart': case 'padEnd':\n case 'split':\n return t === 'string'\n // String + Array\n case 'includes': case 'indexOf': case 'lastIndexOf':\n case 'slice': case 'at': case 'concat':\n return t === 'string' || Array.isArray(obj)\n // Array-only (higher-order)\n case 'filter': case 'map': case 'find': case 'findIndex':\n case 'some': case 'every': case 'flatMap':\n return Array.isArray(obj)\n // Array-only (non-callback, non-mutating)\n case 'join': case 'flat':\n case 'toReversed': case 'toSorted': case 'toSpliced': case 'with':\n return Array.isArray(obj)\n // Number\n case 'toFixed':\n return t === 'number'\n // Number + String\n case 'toString':\n return t === 'string' || t === 'number'\n default:\n return false\n }\n}\n\nexport function toPropertyKey(value: unknown): string {\n return String(value)\n}\n\nexport function applyBinaryOp(operator: BinaryExpressionOperator, left: unknown, right: unknown): unknown {\n switch (operator) {\n case '+': return (left as number) + (right as number)\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (left as number) / (right as number)\n case '%': return (left as number) % (right as number)\n case '**': return (left as number) ** (right as number)\n case '==': return left === right\n case '!=': return left !== right\n case '<': return (left as number) < (right as number)\n case '>': return (left as number) > (right as number)\n case '<=': return (left as number) <= (right as number)\n case '>=': return (left as number) >= (right as number)\n case 'in': {\n if (typeof right === 'string') return (right as string).includes(left as string)\n if (Array.isArray(right)) return right.includes(left)\n throw new BonsaiTypeError('in', 'a string or array', right)\n }\n case 'not in': {\n if (typeof right === 'string') return !(right as string).includes(left as string)\n if (Array.isArray(right)) return !right.includes(left)\n throw new BonsaiTypeError('not in', 'a string or array', right)\n }\n default: throw new Error(`Unknown binary operator: ${operator}`)\n }\n}\n\nexport function applyUnaryOp(operator: UnaryOperator, operand: unknown): unknown {\n switch (operator) {\n case '!': return !operand\n case '-': return -(operand as number)\n case '+': return Number(operand)\n default: throw new Error(`Unknown unary operator: ${operator}`)\n }\n}\n\nexport function validateMethodCall(\n obj: unknown,\n methodName: string,\n guard: ExecutionContext,\n): SafeMethod {\n guard.checkNameAccess(methodName, 'method')\n if (obj == null) throw new BonsaiTypeError(methodName, 'a non-null value', obj)\n if (!isAllowedReceiver(obj, methodName)) {\n throw new BonsaiSecurityError(\n 'METHOD_NOT_ALLOWED',\n `Method \"${methodName}\" is not allowed on ${typeof obj}`,\n )\n }\n const method = (obj as Record<string, unknown>)[methodName]\n if (typeof method !== 'function') throw new BonsaiTypeError(methodName, 'a method', method)\n return method as SafeMethod\n}\n\nexport function resolveTransform(name: string, transforms: Record<string, TransformFn>): TransformFn {\n if (!Object.hasOwn(transforms, name)) {\n const suggestion = suggest(name, Object.keys(transforms))\n throw new BonsaiReferenceError('transform', name, suggestion)\n }\n return transforms[name]\n}\n\nexport function resolveFunction(name: string, functions: Record<string, FunctionFn>): FunctionFn {\n if (!Object.hasOwn(functions, name)) {\n const suggestion = suggest(name, Object.keys(functions))\n throw new BonsaiReferenceError('function', name, suggestion)\n }\n return functions[name]\n}\n\nexport function getIdentifierName(node: ASTNode, message = 'Expected identifier'): string {\n if (node.type !== 'Identifier') {\n throw new Error(message)\n }\n return node.name\n}\n\nexport function getObjectLiteralKeyName(node: ASTNode, message = 'Expected identifier or string literal'): string {\n if (node.type === 'Identifier' || node.type === 'StringLiteral') {\n return node.type === 'Identifier' ? node.name : node.value\n }\n throw new Error(message)\n}\n\nexport function expandSpreadValue(value: unknown, maxLength?: number): unknown[] {\n if (Array.isArray(value)) {\n if (maxLength !== undefined && value.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread source length (${value.length}) exceeds maximum (${maxLength})`,\n )\n }\n return value\n }\n if (value != null) {\n const iterator = (value as { [Symbol.iterator]?: unknown })[Symbol.iterator]\n if (typeof iterator === 'function') {\n const result: unknown[] = []\n for (const item of value as Iterable<unknown>) {\n result.push(item)\n if (maxLength !== undefined && result.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread exceeds maximum array length (${maxLength})`,\n )\n }\n }\n return result\n }\n }\n throw new BonsaiTypeError('spread', 'an iterable value', value)\n}\n\nconst REPLACE_METHODS = new Set(['replace', 'replaceAll'])\nconst MAX_REPEAT_COUNT = 100_000\n\nexport function validateMethodArgs(methodName: string, args: unknown[]): void {\n if (REPLACE_METHODS.has(methodName)) {\n for (const arg of args) {\n if (typeof arg === 'function') {\n throw new BonsaiTypeError(methodName, 'string arguments (callbacks are not allowed)', arg)\n }\n if (arg instanceof RegExp) {\n throw new BonsaiTypeError(methodName, 'string arguments (RegExp is not allowed)', arg)\n }\n if (arg != null && typeof arg === 'object') {\n throw new BonsaiTypeError(methodName, 'string arguments (objects are not allowed)', arg)\n }\n }\n }\n if (methodName === 'repeat') {\n const count = Number(args[0])\n if (!Number.isFinite(count) || count < 0 || count > MAX_REPEAT_COUNT) {\n throw new BonsaiTypeError('repeat', `a count between 0 and ${MAX_REPEAT_COUNT}`, args[0])\n }\n }\n}\n\nexport function accessMember(\n object: unknown,\n propertyNode: ASTNode,\n computed: boolean,\n computedValue: unknown,\n guard: ExecutionContext,\n): unknown {\n const key = computed ? toPropertyKey(computedValue) : getIdentifierName(propertyNode, 'Expected identifier property')\n guard.checkNameAccess(key, 'member')\n return (object as Record<string, unknown>)?.[key]\n}\n","import type { ASTNode, FunctionFn, ObjectProperty, TransformFn } from './types.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation, BonsaiTypeError } from './errors.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveFunction,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\nfunction rejectPromise(value: unknown, kind: 'function' | 'method' | 'transform', name: string): unknown {\n if (value instanceof Promise) {\n throw new BonsaiTypeError(\n name,\n `a synchronous ${kind} result — use evaluate() instead of evaluateSync() for async`,\n value,\n )\n }\n return value\n}\n\nexport interface EvalEnv {\n ctx: Record<string, unknown>\n tr: Record<string, TransformFn>\n fn: Record<string, FunctionFn>\n g: ExecutionContext\n s?: string\n}\n\nexport function evaluate(\n node: ASTNode,\n context: Record<string, unknown>,\n transforms: Record<string, TransformFn>,\n functions: Record<string, FunctionFn>,\n guard: ExecutionContext,\n source?: string,\n): unknown {\n return evalNode(node, { ctx: context, tr: transforms, fn: functions, g: guard, s: source })\n}\n\nfunction evalNode(node: ASTNode, env: EvalEnv): unknown {\n // Fast path for leaf nodes — no depth tracking or step counting needed\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n case 'NullLiteral':\n return null\n case 'UndefinedLiteral':\n return undefined\n case 'Identifier':\n env.g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(env.ctx, node.name) ? env.ctx[node.name] : undefined\n }\n\n // Compound nodes: full depth tracking\n return evalCompound(node, env)\n}\n\nfunction evalCompound(node: ASTNode, env: EvalEnv): unknown {\n const { g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalNode(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalNode(node.left, env)\n return left ? evalNode(node.right, env) : left\n }\n if (op === '||') {\n const left = evalNode(node.left, env)\n return left ? left : evalNode(node.right, env)\n }\n if (op === '??') {\n const left = evalNode(node.left, env)\n return left != null ? left : evalNode(node.right, env)\n }\n return applyBinaryOp(op, evalNode(node.left, env), evalNode(node.right, env))\n }\n\n case 'ConditionalExpression':\n return evalNode(node.test, env) ? evalNode(node.consequent, env) : evalNode(node.alternate, env)\n\n case 'MemberExpression': {\n const object = evalNode(node.object, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = evalNode(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(evalNode(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(evalNode(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = getObjectPropertyKey(prop, env)\n obj[key] = evalNode(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return evalCallExpression(node, env)\n\n case 'PipeExpression': {\n const input = evalNode(node.input, env)\n try {\n return evalPipe(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(evalNode(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return evalNode(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBody(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nfunction evalCallExpression(node: Extract<ASTNode, { type: 'CallExpression' }>, env: EvalEnv): unknown {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalNode(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const func = resolveFunction(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(...args), 'function', node.callee.name)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nfunction pushCallArgument(args: unknown[], node: ASTNode, env: EvalEnv): void {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(evalArg(node, env))\n}\n\nfunction evalArg(node: ASTNode, env: EvalEnv): unknown {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return evalNode(node, env)\n}\n\nfunction evalPipe(input: unknown, transformNode: ASTNode, env: EvalEnv): unknown {\n const { tr } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(input, ...args), 'transform', calleeName)\n }\n\n if (transformNode.type === 'Identifier') {\n return rejectPromise(resolveTransform(transformNode.name, tr)(input), 'transform', transformNode.name)\n }\n\n throw new Error('Invalid transform expression')\n}\n\nexport function evaluateLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n return evalLambdaBody(node, item, env)\n}\n\nfunction evalLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalLambdaBody(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(evalArg(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n }\n // Delegate to evalNode for non-method calls (e.g. registered functions)\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? evalLambdaBody(node.right, item, env) : left\n }\n if (op === '||') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? left : evalLambdaBody(node.right, item, env)\n }\n if (op === '??') {\n const left = evalLambdaBody(node.left, item, env)\n return left != null ? left : evalLambdaBody(node.right, item, env)\n }\n return applyBinaryOp(op, evalLambdaBody(node.left, item, env), evalLambdaBody(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalLambdaBody(node.operand, item, env))\n\n case 'ConditionalExpression':\n return evalLambdaBody(node.test, item, env)\n ? evalLambdaBody(node.consequent, item, env)\n : evalLambdaBody(node.alternate, item, env)\n\n case 'LambdaExpression':\n return evalLambdaBody(node.body, item, env)\n\n default:\n // Delegate to evalNode which manages its own depth\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nfunction getObjectPropertyKey(prop: ObjectProperty, env: EvalEnv): string {\n const key = prop.computed ? String(evalNode(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","import type { ASTNode, FunctionFn, ObjectProperty, TransformFn } from './types.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation } from './errors.js'\nimport { type EvalEnv } from './evaluator.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveFunction,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\ntype AsyncEvalEnv = EvalEnv\n\nexport async function evaluateAsync(\n node: ASTNode,\n context: Record<string, unknown>,\n transforms: Record<string, TransformFn>,\n functions: Record<string, FunctionFn>,\n guard: ExecutionContext,\n source?: string,\n): Promise<unknown> {\n const env: AsyncEvalEnv = { ctx: context, tr: transforms, fn: functions, g: guard, s: source }\n const result = await evalNodeAsync(node, env)\n guard.checkTimeout()\n return result\n}\n\nasync function evalNodeAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n // Fast path for leaf nodes — no depth tracking or step counting needed\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n case 'NullLiteral':\n return null\n case 'UndefinedLiteral':\n return undefined\n case 'Identifier':\n env.g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(env.ctx, node.name) ? env.ctx[node.name] : undefined\n }\n\n return evalCompoundAsync(node, env)\n}\n\nasync function evalCompoundAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalNodeAsync(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalNodeAsync(node.left, env)\n return left ? await evalNodeAsync(node.right, env) : left\n }\n if (op === '||') {\n const left = await evalNodeAsync(node.left, env)\n return left ? left : await evalNodeAsync(node.right, env)\n }\n if (op === '??') {\n const left = await evalNodeAsync(node.left, env)\n return left != null ? left : await evalNodeAsync(node.right, env)\n }\n return applyBinaryOp(op, await evalNodeAsync(node.left, env), await evalNodeAsync(node.right, env))\n }\n\n case 'ConditionalExpression':\n return await evalNodeAsync(node.test, env)\n ? await evalNodeAsync(node.consequent, env)\n : await evalNodeAsync(node.alternate, env)\n\n case 'MemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(await evalNodeAsync(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(await evalNodeAsync(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = await getObjectPropertyKey(prop, env)\n obj[key] = await evalNodeAsync(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return await evalCallExpressionAsync(node, env)\n\n case 'PipeExpression': {\n const input = await evalNodeAsync(node.input, env)\n try {\n return await evalPipeAsync(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(await evalNodeAsync(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return await evalNodeAsync(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBodyAsync(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nasync function evalCallExpressionAsync(\n node: Extract<ASTNode, { type: 'CallExpression' }>,\n env: AsyncEvalEnv,\n): Promise<unknown> {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalNodeAsync(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n\n // Higher-order array methods need async-aware iteration\n // because lambda callbacks may return Promises, which native\n // Array methods can't handle (Promises are always truthy).\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const arr = obj\n const predicate = args[0] as (item: unknown) => unknown\n const asyncResult = await evalAsyncArrayMethod(methodName, arr, predicate)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n const result = await method.call(obj, ...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const func = resolveFunction(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nasync function pushCallArgumentAsync(args: unknown[], node: ASTNode, env: AsyncEvalEnv): Promise<void> {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(await evalArgAsync(node, env))\n}\n\n// Async-safe higher-order array method evaluation. Native JS array methods\n// call predicates synchronously, but our lambdas may return Promises.\n// Returns { value } if handled, undefined if the method isn't higher-order.\nasync function evalAsyncArrayMethod(\n methodName: string,\n arr: unknown[],\n predicate: (item: unknown) => unknown,\n): Promise<{ value: unknown } | undefined> {\n switch (methodName) {\n case 'filter': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: arr.filter((_, i) => resolved[i]) }\n }\n case 'map': {\n const results = arr.map(predicate)\n return { value: results.some(r => r instanceof Promise) ? await Promise.all(results) : results }\n }\n case 'find': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n const idx = resolved.findIndex(Boolean)\n return { value: idx >= 0 ? arr[idx] : undefined }\n }\n case 'some': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.some(Boolean) }\n }\n case 'every': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.every(Boolean) }\n }\n case 'findIndex': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.findIndex(Boolean) }\n }\n case 'flatMap': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: (resolved as unknown[]).flat() }\n }\n default:\n return undefined\n }\n}\n\nasync function evalArgAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return await evalNodeAsync(node, env)\n}\n\nasync function evalPipeAsync(input: unknown, transformNode: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { tr, g } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(input, ...args)\n g.checkTimeout()\n return result\n }\n\n if (transformNode.type === 'Identifier') {\n const result = await resolveTransform(transformNode.name, tr)(input)\n g.checkTimeout()\n return result\n }\n\n throw new Error('Invalid transform expression')\n}\n\nasync function evalLambdaBodyAsync(node: ASTNode, item: unknown, env: AsyncEvalEnv): Promise<unknown> {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalLambdaBodyAsync(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(await evalArgAsync(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n\n // Async-safe higher-order array method handling (same as top-level path)\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const asyncResult = await evalAsyncArrayMethod(methodName, obj, args[0] as (item: unknown) => unknown)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n return await method.call(obj, ...args)\n }\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? await evalLambdaBodyAsync(node.right, item, env) : left\n }\n if (op === '||') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n if (op === '??') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left != null ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n return applyBinaryOp(op, await evalLambdaBodyAsync(node.left, item, env), await evalLambdaBodyAsync(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalLambdaBodyAsync(node.operand, item, env))\n\n case 'ConditionalExpression':\n return await evalLambdaBodyAsync(node.test, item, env)\n ? await evalLambdaBodyAsync(node.consequent, item, env)\n : await evalLambdaBodyAsync(node.alternate, item, env)\n\n case 'LambdaExpression':\n return await evalLambdaBodyAsync(node.body, item, env)\n\n default:\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nasync function getObjectPropertyKey(prop: ObjectProperty, env: AsyncEvalEnv): Promise<string> {\n const key = prop.computed ? String(await evalNodeAsync(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","export class LRUCache<K, V> {\n private readonly max: number\n private readonly map = new Map<K, V>()\n // Fast path: track last accessed key to skip LRU reordering on repeated hits\n private lastKey: K | undefined\n private lastValue: V | undefined\n\n constructor(max: number) {\n this.max = max > 0 ? max : 0\n }\n\n get(key: K): V | undefined {\n // Fast path: same key as last access — no Map reordering needed\n if (key === this.lastKey) return this.lastValue\n\n if (!this.map.has(key)) return undefined\n const value = this.map.get(key) as V\n // Move to end (most recent) for LRU ordering\n this.map.delete(key)\n this.map.set(key, value)\n this.lastKey = key\n this.lastValue = value\n return value\n }\n\n set(key: K, value: V): void {\n if (this.max === 0) return\n\n if (this.map.has(key)) {\n this.map.delete(key)\n } else if (this.map.size >= this.max) {\n // Evict oldest (first key)\n const oldest = this.map.keys().next().value!\n this.map.delete(oldest)\n if (this.lastKey === oldest) {\n this.lastKey = undefined\n this.lastValue = undefined\n }\n }\n this.map.set(key, value)\n this.lastKey = key\n this.lastValue = value\n }\n\n get size(): number {\n return this.map.size\n }\n\n clear(): void {\n this.map.clear()\n this.lastKey = undefined\n this.lastValue = undefined\n }\n}\n","import type { TransformFn, FunctionFn } from './types.js'\n\nexport interface PluginRegistry {\n addTransform(name: string, fn: TransformFn): void\n addFunction(name: string, fn: FunctionFn): void\n removeTransform(name: string): boolean\n removeFunction(name: string): boolean\n getTransform(name: string): TransformFn | undefined\n getFunction(name: string): FunctionFn | undefined\n getTransformNames(): string[]\n getFunctionNames(): string[]\n use(plugin: (registry: PluginRegistry) => void): void\n readonly transforms: Record<string, TransformFn>\n readonly functions: Record<string, FunctionFn>\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n const transformMap = new Map<string, TransformFn>()\n const functionMap = new Map<string, FunctionFn>()\n\n // Cached snapshots — rebuilt only when registry changes\n let transformsCache: Record<string, TransformFn> = {}\n let functionsCache: Record<string, FunctionFn> = {}\n let transformsDirty = false\n let functionsDirty = false\n\n const registry: PluginRegistry = {\n addTransform(name, fn) { transformMap.set(name, fn); transformsDirty = true },\n addFunction(name, fn) { functionMap.set(name, fn); functionsDirty = true },\n removeTransform(name) { const r = transformMap.delete(name); if (r) transformsDirty = true; return r },\n removeFunction(name) { const r = functionMap.delete(name); if (r) functionsDirty = true; return r },\n getTransform(name) { return transformMap.get(name) },\n getFunction(name) { return functionMap.get(name) },\n getTransformNames() { return [...transformMap.keys()] },\n getFunctionNames() { return [...functionMap.keys()] },\n use(plugin) { plugin(registry) },\n get transforms() {\n if (transformsDirty) {\n transformsCache = Object.fromEntries(transformMap)\n transformsDirty = false\n }\n return transformsCache\n },\n get functions() {\n if (functionsDirty) {\n functionsCache = Object.fromEntries(functionMap)\n functionsDirty = false\n }\n return functionsCache\n },\n }\n\n return registry\n}\n","import type {\n BonsaiOptions,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n TransformFn,\n FunctionFn,\n BonsaiPlugin,\n ASTNode,\n} from './types.js'\nimport { parse } from './parser.js'\nimport { compile } from './compiler.js'\nimport { evaluate } from './evaluator.js'\nimport { evaluateAsync } from './evaluator-async.js'\nimport { SecurityPolicy, ExecutionContext } from './execution-context.js'\nimport { LRUCache } from './cache.js'\nimport { createPluginRegistry } from './plugins.js'\nimport { ExpressionError, formatError, offsetToPosition } from './errors.js'\nimport { getIdentifierName } from './eval-ops.js'\n\nexport { ExpressionError, BonsaiTypeError, BonsaiSecurityError, BonsaiReferenceError, formatError, formatBonsaiError } from './errors.js'\nexport { tokenize } from './lexer.js'\nexport { parse } from './parser.js'\nexport { compile } from './compiler.js'\nexport type {\n ASTNode,\n Token,\n TokenType,\n InferredTypeName,\n PolicySnapshot,\n ResolveResult,\n BonsaiPlugin,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n BonsaiOptions,\n TransformFn,\n FunctionFn,\n} from './types.js'\n\nconst DEFAULT_CACHE_SIZE = 256\n\n// Shared instance for standalone one-off evaluation\nlet _shared: BonsaiInstance | undefined\n\n/**\n * Evaluate a single expression with default options. Uses a shared instance internally.\n * For repeated evaluation or custom configuration, use `bonsai()` to create a dedicated instance.\n */\nexport function evaluateExpression<T = unknown>(expression: string, context?: Record<string, unknown>): T {\n if (!_shared) _shared = bonsai()\n return _shared.evaluateSync<T>(expression, context)\n}\n\n/**\n * Create a new Bonsai instance with optional safety and caching configuration.\n * Register transforms and functions via `.use()`, `.addTransform()`, and `.addFunction()`.\n *\n * @example\n * ```ts\n * const expr = bonsai({ timeout: 50 })\n * expr.use(strings)\n * expr.evaluateSync('name |> trim |> upper', { name: ' hello ' }) // \"HELLO\"\n * ```\n */\nexport function bonsai(options: BonsaiOptions = {}): BonsaiInstance {\n const registry = createPluginRegistry()\n const cache = new LRUCache<string, CompiledExpression>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n const astCache = new LRUCache<string, ASTNode>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n\n const policy = new SecurityPolicy(options)\n\n // Pooled ExecutionContext for evaluateSync — avoids per-call allocation\n const syncCtx = new ExecutionContext(policy)\n let syncCtxInUse = false\n\n function createExecutionContext(): ExecutionContext {\n return new ExecutionContext(policy)\n }\n\n function getAst(source: string): ASTNode {\n let ast = astCache.get(source)\n if (ast) return ast\n ast = compile(parse(source))\n astCache.set(source, ast)\n return ast\n }\n\n function compileExpr(source: string): CompiledExpression {\n const cached = cache.get(source)\n if (cached) return cached\n\n const optimized = getAst(source)\n\n const compiled: CompiledExpression = {\n ast: optimized,\n source,\n async evaluate<T = unknown>(context = {}) {\n return evaluateAsync(optimized, context, registry.transforms, registry.functions, createExecutionContext(), source) as Promise<T>\n },\n evaluateSync<T = unknown>(context = {}) {\n if (syncCtxInUse) {\n return evaluate(optimized, context, registry.transforms, registry.functions, createExecutionContext(), source) as T\n }\n syncCtxInUse = true\n try {\n syncCtx.reset()\n return evaluate(optimized, context, registry.transforms, registry.functions, syncCtx, source) as T\n } finally {\n syncCtxInUse = false\n }\n },\n }\n\n cache.set(source, compiled)\n return compiled\n }\n\n const instance: BonsaiInstance = {\n use(plugin) { plugin(instance); return instance },\n addTransform(name, fn) { registry.addTransform(name, fn); return instance },\n addFunction(name, fn) { registry.addFunction(name, fn); return instance },\n removeTransform(name) { return registry.removeTransform(name) },\n removeFunction(name) { return registry.removeFunction(name) },\n hasTransform(name) { return registry.getTransform(name) !== undefined },\n hasFunction(name) { return registry.getFunction(name) !== undefined },\n listTransforms() { return registry.getTransformNames() },\n listFunctions() { return registry.getFunctionNames() },\n getPolicy() {\n return {\n ...(policy.allowedProperties ? { allowedProperties: [...policy.allowedProperties] } : {}),\n ...(policy.deniedProperties ? { deniedProperties: [...policy.deniedProperties] } : {}),\n }\n },\n clearCache() { cache.clear(); astCache.clear() },\n compile(expression) { return compileExpr(expression) },\n async evaluate<T = unknown>(expression: string, context = {}) {\n const ast = getAst(expression)\n return evaluateAsync(ast, context, registry.transforms, registry.functions, createExecutionContext(), expression) as Promise<T>\n },\n evaluateSync<T = unknown>(expression: string, context = {}) {\n // Hot path: reuse pooled ExecutionContext to avoid per-call allocation\n const ast = getAst(expression)\n if (syncCtxInUse) {\n // Reentrant call (e.g., custom function calling evaluateSync) — fresh allocation\n return evaluate(ast, context, registry.transforms, registry.functions, createExecutionContext(), expression) as T\n }\n syncCtxInUse = true\n try {\n syncCtx.reset()\n return evaluate(ast, context, registry.transforms, registry.functions, syncCtx, expression) as T\n } finally {\n syncCtxInUse = false\n }\n },\n validate(expression) {\n try {\n const ast = parse(expression)\n return { valid: true, errors: [], ast, references: extractReferences(ast) }\n } catch (error: unknown) {\n let message: string\n if (error instanceof ExpressionError) {\n message = error.rawMessage\n } else if (error instanceof Error) {\n message = error.message\n } else {\n message = String(error)\n }\n const { start, end } = error instanceof ExpressionError ? error : { start: 0, end: 1 }\n const position = offsetToPosition(expression, start)\n return {\n valid: false,\n errors: [{\n message,\n position: { line: position.line, column: position.column },\n formatted: error instanceof ExpressionError\n ? error.message\n : formatError(message, { source: expression, start, end }),\n }],\n }\n }\n },\n }\n\n return instance\n}\n\nfunction extractReferences(node: ASTNode): ExpressionReferences {\n const identifiers = new Set<string>()\n const transforms = new Set<string>()\n const functions = new Set<string>()\n\n function walk(n: ASTNode): void {\n switch (n.type) {\n case 'Identifier':\n identifiers.add(n.name)\n break\n case 'PipeExpression':\n walk(n.input)\n if (n.transform.type === 'Identifier') {\n transforms.add(n.transform.name)\n } else if (n.transform.type === 'CallExpression') {\n if (n.transform.callee.type === 'Identifier') {\n transforms.add(getIdentifierName(n.transform.callee))\n }\n n.transform.args.forEach(walk)\n }\n break\n case 'CallExpression':\n if (n.callee.type === 'Identifier') {\n functions.add(n.callee.name)\n } else {\n walk(n.callee)\n }\n n.args.forEach(walk)\n break\n case 'BinaryExpression':\n walk(n.left)\n walk(n.right)\n break\n case 'UnaryExpression':\n walk(n.operand)\n break\n case 'ConditionalExpression':\n walk(n.test)\n walk(n.consequent)\n walk(n.alternate)\n break\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n walk(n.object)\n if (n.computed) walk(n.property)\n break\n case 'ArrayLiteral':\n n.elements.forEach(walk)\n break\n case 'ObjectLiteral':\n n.properties.forEach(p => { walk(p.key); walk(p.value) })\n break\n case 'TemplateLiteral':\n n.parts.forEach(walk)\n break\n case 'SpreadElement':\n walk(n.argument)\n break\n case 'LambdaExpression':\n walk(n.body)\n break\n }\n }\n\n walk(node)\n return {\n identifiers: [...identifiers],\n transforms: [...transforms],\n functions: [...functions],\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["getObjectPropertyKey","makeLambdaAccessor"],"sources":["../src/parser.ts","../src/compiler.ts","../src/eval-ops.ts","../src/evaluator.ts","../src/evaluator-async.ts","../src/cache.ts","../src/plugins.ts","../src/index.ts"],"sourcesContent":["import type {\n ASTNode,\n BinaryExpressionOperator,\n ObjectProperty,\n OperatorValue,\n Token,\n} from './types.js'\nimport { tokenize } from './lexer.js'\nimport { ExpressionError } from './errors.js'\n\n// Precedence levels (binding power) for Pratt parsing\nconst PIPE_PRECEDENCE = 5\n\nconst PRECEDENCE: Readonly<Record<OperatorValue | '??', number | undefined>> = {\n '||': 10,\n '&&': 20,\n '??': 25,\n '==': 30,\n '!=': 30,\n '<': 40,\n '>': 40,\n '<=': 40,\n '>=': 40,\n 'in': 40,\n '+': 50,\n '-': 50,\n '*': 60,\n '/': 60,\n '%': 60,\n '**': 70,\n // Unary-only operators have no binary precedence\n '!': undefined,\n 'not': undefined,\n}\n\nconst MAX_PARSE_DEPTH = 32\n\nexport function parse(source: string, _depth = 0): ASTNode {\n if (_depth > MAX_PARSE_DEPTH) {\n throw new ExpressionError(\n 'Maximum template nesting depth exceeded',\n { source, start: 0, end: source.length },\n )\n }\n const tokens = tokenize(source)\n let pos = 0\n\n function current(): Token {\n return tokens[pos]\n }\n\n function advance(): Token {\n return tokens[pos++]\n }\n\n function expect(type: string, value?: string): Token {\n const tok = current()\n if (tok.type !== type || (value !== undefined && tok.value !== value)) {\n throw new ExpressionError(\n `Expected ${value ? `\"${value}\"` : type} but got ${tok.value ? `\"${tok.value}\"` : tok.type}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n return advance()\n }\n\n function parseExpression(minPrec = 0): ASTNode {\n let left = parseUnary()\n\n // Ternary — lowest precedence, handled before binary ops\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n return left\n }\n\n // Pipe expressions — very low precedence\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance() // skip '|>'\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n // Binary operators via Pratt parsing\n while (true) {\n const tok = current()\n let prec: number | undefined\n\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n // Handle 'not in' as a combined operator\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n if (prec === undefined || prec < minPrec) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n // Right-associative for **\n const nextMinPrec = opValue === '**' ? prec : prec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n\n // Ternary after binary (for cases like `a > 5 ? b : c`)\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n }\n\n // Pipe after binary/ternary\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance()\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n return left\n }\n\n function parsePipeTransform(): ASTNode {\n let node = parsePrimary()\n\n // Allow transform to be a call expression: `upper` or `default(\"N/A\")`\n if (current().type === 'Punctuation' && current().value === '(') {\n advance() // skip '('\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n }\n\n return node\n }\n\n function parseUnary(): ASTNode {\n const tok = current()\n\n if (tok.type === 'Operator' && (tok.value === '!' || tok.value === '-' || tok.value === '+')) {\n advance()\n const operand = parseUnary()\n return {\n type: 'UnaryExpression',\n operator: tok.value,\n operand,\n start: tok.start,\n end: operand.end,\n }\n }\n\n return parsePostfix()\n }\n\n function parsePostfix(): ASTNode {\n let node = parsePrimary()\n\n while (true) {\n const tok = current()\n\n // Dot notation: obj.prop\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const prop = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Bracket notation: obj[expr]\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n\n // Optional chaining: obj?.prop or obj?.[expr]\n if (tok.type === 'OptionalChain') {\n advance()\n // obj?.[expr] — computed optional\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n // obj?.prop — regular optional\n const prop = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Function call: fn(args)\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n\n break\n }\n\n return node\n }\n\n function parsePrimary(): ASTNode {\n const tok = current()\n\n // Number\n if (tok.type === 'Number') {\n advance()\n const raw = tok.value.replace(/_/gu, '')\n return { type: 'NumberLiteral', value: Number(raw), start: tok.start, end: tok.end }\n }\n\n // String\n if (tok.type === 'String') {\n advance()\n return { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n }\n\n // Boolean\n if (tok.type === 'Boolean') {\n advance()\n return { type: 'BooleanLiteral', value: tok.value === 'true', start: tok.start, end: tok.end }\n }\n\n // Null\n if (tok.type === 'Null') {\n advance()\n return { type: 'NullLiteral', value: null, start: tok.start, end: tok.end }\n }\n\n // Undefined\n if (tok.type === 'Undefined') {\n advance()\n return { type: 'UndefinedLiteral', value: undefined, start: tok.start, end: tok.end }\n }\n\n // Template literal\n if (tok.type === 'TemplateLiteral') {\n return parseTemplateLiteral()\n }\n\n // Identifier\n if (tok.type === 'Identifier') {\n advance()\n return { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n }\n\n // Parenthesized expression\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const expr = parseExpression(0)\n expect('Punctuation', ')')\n return expr\n }\n\n // Array literal\n if (tok.type === 'Punctuation' && tok.value === '[') {\n return parseArrayLiteral()\n }\n\n // Object literal\n if (tok.type === 'Punctuation' && tok.value === '{') {\n return parseObjectLiteral()\n }\n\n // Lambda: .property or .property >= value (compound predicate)\n if (tok.type === 'Punctuation' && tok.value === '.') {\n return parseLambdaExpression()\n }\n\n // Spread element\n if (tok.type === 'Spread') {\n advance()\n const argument = parseExpression(0)\n return { type: 'SpreadElement', argument, start: tok.start, end: argument.end }\n }\n\n throw new ExpressionError(\n `Unexpected ${tok.type === 'EOF' ? 'end of expression' : `token \"${tok.value}\"`}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n function parseLambdaExpression(): ASTNode {\n // We're at the `.` token\n const start = current().start\n advance() // skip the `.`\n\n // Bare `.` as identity lambda (e.g., `. > 2`, `. == \"x\"`)\n // Must be followed by an operator to form a compound predicate.\n let node: ASTNode\n if (current().type !== 'Identifier') {\n if (current().type !== 'Operator' && current().type !== 'NullishCoalescing') {\n throw new ExpressionError(\n `Expected property name or operator after \".\"`,\n { source, start, end: start + 1 },\n )\n }\n node = { type: 'LambdaIdentity', start, end: start + 1 }\n } else {\n const prop = expect('Identifier')\n node = {\n type: 'LambdaAccessor',\n property: prop.value,\n start,\n end: prop.end,\n }\n }\n\n // Continue with postfix operations (member access, optional chaining, calls)\n while (true) {\n const tok = current()\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'OptionalChain') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n break\n }\n\n // Check for binary operator to form compound predicate\n const tok = current()\n let prec: number | undefined\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n // If followed by an operator, this is a compound lambda like `.age >= 18`\n if (prec !== undefined) {\n let left: ASTNode = node\n while (true) {\n const opTok = current()\n let opPrec: number | undefined\n if (opTok.type === 'Operator') {\n opPrec = PRECEDENCE[opTok.value]\n if (opTok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n opPrec = PRECEDENCE['in']\n }\n }\n } else if (opTok.type === 'NullishCoalescing') {\n opPrec = PRECEDENCE['??']\n }\n if (opPrec === undefined) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n const nextMinPrec = opValue === '**' ? opPrec : opPrec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n node = left\n }\n\n // Check for ternary — compound lambda with conditional\n if (current().type === 'Punctuation' && current().value === '?') {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n const body: ASTNode = {\n type: 'ConditionalExpression',\n test: node,\n consequent,\n alternate,\n start,\n end: alternate.end,\n }\n return {\n type: 'LambdaExpression',\n body,\n start,\n end: alternate.end,\n }\n }\n\n // If node is just a LambdaAccessor or LambdaIdentity, keep it as-is\n if (node.type === 'LambdaAccessor' || node.type === 'LambdaIdentity') {\n return node\n }\n\n // It has member access / calls / binary ops — wrap in LambdaExpression\n return {\n type: 'LambdaExpression',\n body: node,\n start,\n end: node.end,\n }\n }\n\n function parseArrayLiteral(): ASTNode {\n const start = expect('Punctuation', '[').start\n const elements: ASTNode[] = []\n\n while (!(current().type === 'Punctuation' && current().value === ']')) {\n if (elements.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ']') break\n elements.push(parseExpression(0))\n }\n\n const end = expect('Punctuation', ']').end\n return { type: 'ArrayLiteral', elements, start, end }\n }\n\n function parseObjectLiteral(): ASTNode {\n const start = expect('Punctuation', '{').start\n const properties: ObjectProperty[] = []\n\n while (!(current().type === 'Punctuation' && current().value === '}')) {\n if (properties.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === '}') break\n\n let key: ASTNode\n let computed = false\n\n // Computed property: [expr]\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n key = parseExpression(0)\n expect('Punctuation', ']')\n computed = true\n } else {\n // Identifier or string key\n const tok = current()\n if (tok.type === 'Identifier') {\n advance()\n key = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n\n // Shorthand: { name } → { name: name }\n const next = current()\n if (next.type === 'Punctuation' && (next.value === ',' || next.value === '}')) {\n const value: ASTNode = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed: false,\n start: key.start,\n end: value.end,\n })\n continue\n }\n } else if (tok.type === 'String') {\n advance()\n key = { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n } else {\n throw new ExpressionError(\n `Expected property name but got \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n }\n\n expect('Punctuation', ':')\n const value = parseExpression(0)\n\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed,\n start: key.start,\n end: value.end,\n })\n }\n\n const end = expect('Punctuation', '}').end\n return { type: 'ObjectLiteral', properties, start, end }\n }\n\n function parseTemplateLiteral(): ASTNode {\n const tok = advance() // consume TemplateLiteral token\n const raw = tok.value.slice(1, -1) // remove backticks\n const parts: ASTNode[] = []\n let i = 0\n let textStart = 0\n\n while (i < raw.length) {\n if (raw[i] === '$' && i + 1 < raw.length && raw[i + 1] === '{') {\n // Add text before interpolation\n if (i > textStart) {\n const text = raw.slice(textStart, i)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n // Find matching }\n i += 2\n let depth = 1\n const exprStart = i\n while (i < raw.length && depth > 0) {\n if (raw[i] === '{') depth++\n else if (raw[i] === '}') depth--\n if (depth > 0) i++\n }\n const exprSource = raw.slice(exprStart, i)\n i++ // skip closing }\n textStart = i\n // Parse the interpolated expression\n const exprAst = parse(exprSource, _depth + 1)\n parts.push(exprAst)\n } else {\n i++\n }\n }\n\n // Remaining text\n if (textStart < raw.length) {\n const text = raw.slice(textStart)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n\n return { type: 'TemplateLiteral', parts, start: tok.start, end: tok.end }\n }\n\n const result = parseExpression(0)\n\n if (current().type !== 'EOF') {\n const tok = current()\n throw new ExpressionError(\n `Unexpected token \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n return result\n}\n","import type { ASTNode, BinaryExpressionOperator } from './types.js'\n\nexport function compile(ast: ASTNode): ASTNode {\n return optimize(ast)\n}\n\nfunction optimize(node: ASTNode): ASTNode {\n switch (node.type) {\n case 'BinaryExpression': {\n const left = optimize(node.left)\n const right = optimize(node.right)\n\n // Constant folding\n if (isConstant(left) && isConstant(right)) {\n const result = evalConstant(node.operator, valueOf(left), valueOf(right))\n if (result !== undefined) {\n return makeConstant(result, node.start, node.end)\n }\n }\n\n return { ...node, left, right }\n }\n\n case 'ConditionalExpression': {\n const test = optimize(node.test)\n\n // Dead branch elimination\n if (isConstant(test)) {\n const value = valueOf(test)\n return value ? optimize(node.consequent) : optimize(node.alternate)\n }\n\n return {\n ...node,\n test,\n consequent: optimize(node.consequent),\n alternate: optimize(node.alternate),\n }\n }\n\n case 'UnaryExpression': {\n const operand = optimize(node.operand)\n if (isConstant(operand)) {\n const val = valueOf(operand)\n if (node.operator === '!' && typeof val === 'boolean') {\n return { type: 'BooleanLiteral', value: !val, start: node.start, end: node.end }\n }\n if (node.operator === '-' && typeof val === 'number') {\n return { type: 'NumberLiteral', value: -val, start: node.start, end: node.end }\n }\n }\n return { ...node, operand }\n }\n\n case 'PipeExpression':\n return { ...node, input: optimize(node.input), transform: optimize(node.transform) }\n\n case 'ArrayLiteral':\n return { ...node, elements: node.elements.map(e => optimize(e)) }\n\n case 'CallExpression':\n return { ...node, args: node.args.map(a => optimize(a)) }\n\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n return { ...node, object: optimize(node.object), property: node.computed ? optimize(node.property) : node.property }\n\n case 'LambdaExpression':\n return { ...node, body: optimize(node.body) }\n\n default:\n return node\n }\n}\n\nfunction isConstant(node: ASTNode): boolean {\n return node.type === 'NumberLiteral'\n || node.type === 'StringLiteral'\n || node.type === 'BooleanLiteral'\n || node.type === 'NullLiteral'\n}\n\nfunction valueOf(node: ASTNode): unknown {\n if (node.type === 'NumberLiteral') return node.value\n if (node.type === 'StringLiteral') return node.value\n if (node.type === 'BooleanLiteral') return node.value\n if (node.type === 'NullLiteral') return null\n return undefined\n}\n\nfunction evalConstant(op: BinaryExpressionOperator, left: unknown, right: unknown): unknown | undefined {\n if (typeof left === 'number' && typeof right === 'number') {\n switch (op) {\n case '+': return left + right\n case '-': return left - right\n case '*': return left * right\n case '/': return left / right\n case '%': return left % right\n case '**': return left ** right\n case '<': return left < right\n case '>': return left > right\n case '<=': return left <= right\n case '>=': return left >= right\n case '==': return left === right\n case '!=': return left !== right\n }\n }\n if (typeof left === 'string' && typeof right === 'string' && op === '+') {\n return left + right\n }\n if (typeof left === 'boolean' && typeof right === 'boolean') {\n if (op === '&&') return left && right\n if (op === '||') return left || right\n }\n if (op === '==') return left === right\n if (op === '!=') return left !== right\n return undefined\n}\n\nfunction makeConstant(value: unknown, start: number, end: number): ASTNode {\n if (typeof value === 'number') return { type: 'NumberLiteral', value, start, end }\n if (typeof value === 'string') return { type: 'StringLiteral', value, start, end }\n if (typeof value === 'boolean') return { type: 'BooleanLiteral', value, start, end }\n if (value === null) return { type: 'NullLiteral', value: null, start, end }\n return { type: 'UndefinedLiteral', value: undefined, start, end }\n}\n","import { suggest, BonsaiReferenceError, BonsaiSecurityError, BonsaiTypeError } from './errors.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport type {\n ASTNode,\n BinaryExpressionOperator,\n RegisteredFunction,\n TransformFn,\n UnaryOperator,\n} from './types.js'\n\ntype SafeMethod = (...args: unknown[]) => unknown\n\n/** Receiver type check for safe methods. */\nfunction isAllowedReceiver(obj: unknown, methodName: string): boolean {\n const t = typeof obj\n switch (methodName) {\n // String-only\n case 'startsWith': case 'endsWith': case 'substring':\n case 'charAt': case 'charCodeAt': case 'repeat':\n case 'trim': case 'trimStart': case 'trimEnd':\n case 'toLowerCase': case 'toUpperCase':\n case 'replace': case 'replaceAll':\n case 'padStart': case 'padEnd':\n case 'split':\n return t === 'string'\n // String + Array\n case 'includes': case 'indexOf': case 'lastIndexOf':\n case 'slice': case 'at': case 'concat':\n return t === 'string' || Array.isArray(obj)\n // Array-only (higher-order)\n case 'filter': case 'map': case 'find': case 'findIndex':\n case 'some': case 'every': case 'flatMap':\n return Array.isArray(obj)\n // Array-only (non-callback, non-mutating)\n case 'join': case 'flat':\n case 'toReversed': case 'toSorted': case 'toSpliced': case 'with':\n return Array.isArray(obj)\n // Number\n case 'toFixed':\n return t === 'number'\n // Number + String\n case 'toString':\n return t === 'string' || t === 'number'\n default:\n return false\n }\n}\n\nexport function toPropertyKey(value: unknown): string {\n return String(value)\n}\n\nexport function applyBinaryOp(operator: BinaryExpressionOperator, left: unknown, right: unknown): unknown {\n switch (operator) {\n case '+': return (left as number) + (right as number)\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (left as number) / (right as number)\n case '%': return (left as number) % (right as number)\n case '**': return (left as number) ** (right as number)\n case '==': return left === right\n case '!=': return left !== right\n case '<': return (left as number) < (right as number)\n case '>': return (left as number) > (right as number)\n case '<=': return (left as number) <= (right as number)\n case '>=': return (left as number) >= (right as number)\n case 'in': {\n if (typeof right === 'string') return (right as string).includes(left as string)\n if (Array.isArray(right)) return right.includes(left)\n throw new BonsaiTypeError('in', 'a string or array', right)\n }\n case 'not in': {\n if (typeof right === 'string') return !(right as string).includes(left as string)\n if (Array.isArray(right)) return !right.includes(left)\n throw new BonsaiTypeError('not in', 'a string or array', right)\n }\n default: throw new Error(`Unknown binary operator: ${operator}`)\n }\n}\n\nexport function applyUnaryOp(operator: UnaryOperator, operand: unknown): unknown {\n switch (operator) {\n case '!': return !operand\n case '-': return -(operand as number)\n case '+': return Number(operand)\n default: throw new Error(`Unknown unary operator: ${operator}`)\n }\n}\n\nexport function validateMethodCall(\n obj: unknown,\n methodName: string,\n guard: ExecutionContext,\n): SafeMethod {\n guard.checkNameAccess(methodName, 'method')\n if (obj == null) throw new BonsaiTypeError(methodName, 'a non-null value', obj)\n if (!isAllowedReceiver(obj, methodName)) {\n throw new BonsaiSecurityError(\n 'METHOD_NOT_ALLOWED',\n `Method \"${methodName}\" is not allowed on ${typeof obj}`,\n )\n }\n const method = (obj as Record<string, unknown>)[methodName]\n if (typeof method !== 'function') throw new BonsaiTypeError(methodName, 'a method', method)\n return method as SafeMethod\n}\n\nexport function resolveTransform(name: string, transforms: Record<string, TransformFn>): TransformFn {\n if (!Object.hasOwn(transforms, name)) {\n const suggestion = suggest(name, Object.keys(transforms))\n throw new BonsaiReferenceError('transform', name, suggestion)\n }\n return transforms[name]\n}\n\n/**\n * Resolve a callable by name in the shared function namespace. Pure and context\n * functions occupy one registry keyed by name, so a single lookup returns the\n * tagged entry; the call site uses `kind` to decide how to invoke it (pure\n * functions take only call args; context functions receive the evaluation\n * context first, then call args).\n */\nexport function resolveCallable(\n name: string,\n functions: Record<string, RegisteredFunction>,\n): RegisteredFunction {\n if (Object.hasOwn(functions, name)) {\n return functions[name]\n }\n const suggestion = suggest(name, Object.keys(functions))\n throw new BonsaiReferenceError('function', name, suggestion)\n}\n\nexport function getIdentifierName(node: ASTNode, message = 'Expected identifier'): string {\n if (node.type !== 'Identifier') {\n throw new Error(message)\n }\n return node.name\n}\n\nexport function getObjectLiteralKeyName(node: ASTNode, message = 'Expected identifier or string literal'): string {\n if (node.type === 'Identifier' || node.type === 'StringLiteral') {\n return node.type === 'Identifier' ? node.name : node.value\n }\n throw new Error(message)\n}\n\nexport function expandSpreadValue(value: unknown, maxLength?: number): unknown[] {\n if (Array.isArray(value)) {\n if (maxLength !== undefined && value.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread source length (${value.length}) exceeds maximum (${maxLength})`,\n )\n }\n return value\n }\n if (value != null) {\n const iterator = (value as { [Symbol.iterator]?: unknown })[Symbol.iterator]\n if (typeof iterator === 'function') {\n const result: unknown[] = []\n for (const item of value as Iterable<unknown>) {\n result.push(item)\n if (maxLength !== undefined && result.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread exceeds maximum array length (${maxLength})`,\n )\n }\n }\n return result\n }\n }\n throw new BonsaiTypeError('spread', 'an iterable value', value)\n}\n\nconst REPLACE_METHODS = new Set(['replace', 'replaceAll'])\nconst MAX_REPEAT_COUNT = 100_000\n\nexport function validateMethodArgs(methodName: string, args: unknown[]): void {\n if (REPLACE_METHODS.has(methodName)) {\n for (const arg of args) {\n if (typeof arg === 'function') {\n throw new BonsaiTypeError(methodName, 'string arguments (callbacks are not allowed)', arg)\n }\n if (arg instanceof RegExp) {\n throw new BonsaiTypeError(methodName, 'string arguments (RegExp is not allowed)', arg)\n }\n if (arg != null && typeof arg === 'object') {\n throw new BonsaiTypeError(methodName, 'string arguments (objects are not allowed)', arg)\n }\n }\n }\n if (methodName === 'repeat') {\n const count = Number(args[0])\n if (!Number.isFinite(count) || count < 0 || count > MAX_REPEAT_COUNT) {\n throw new BonsaiTypeError('repeat', `a count between 0 and ${MAX_REPEAT_COUNT}`, args[0])\n }\n }\n}\n\nexport function accessMember(\n object: unknown,\n propertyNode: ASTNode,\n computed: boolean,\n computedValue: unknown,\n guard: ExecutionContext,\n): unknown {\n const key = computed ? toPropertyKey(computedValue) : getIdentifierName(propertyNode, 'Expected identifier property')\n guard.checkNameAccess(key, 'member')\n return (object as Record<string, unknown>)?.[key]\n}\n","import type { ASTNode, ObjectProperty, RegisteredFunction, TransformFn } from './types.js'\nimport type { Bindings } from './plugins.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation, BonsaiTypeError } from './errors.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveCallable,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\nfunction rejectPromise(value: unknown, kind: 'function' | 'method' | 'transform', name: string): unknown {\n if (value instanceof Promise) {\n throw new BonsaiTypeError(\n name,\n `a synchronous ${kind} result — use evaluate() instead of evaluateSync() for async`,\n value,\n )\n }\n return value\n}\n\nexport interface EvalEnv {\n ctx: Record<string, unknown>\n tr: Record<string, TransformFn>\n fn: Record<string, RegisteredFunction>\n g: ExecutionContext\n s?: string\n}\n\nexport function evaluate(\n node: ASTNode,\n context: Record<string, unknown>,\n bindings: Bindings,\n guard: ExecutionContext,\n source?: string,\n): unknown {\n return evalNode(node, {\n ctx: context,\n tr: bindings.transforms,\n fn: bindings.functions,\n g: guard,\n s: source,\n })\n}\n\nfunction evalNode(node: ASTNode, env: EvalEnv): unknown {\n // Fast path for leaf nodes — no depth tracking or step counting needed\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n case 'NullLiteral':\n return null\n case 'UndefinedLiteral':\n return undefined\n case 'Identifier':\n env.g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(env.ctx, node.name) ? env.ctx[node.name] : undefined\n }\n\n // Compound nodes: full depth tracking\n return evalCompound(node, env)\n}\n\nfunction evalCompound(node: ASTNode, env: EvalEnv): unknown {\n const { g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalNode(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalNode(node.left, env)\n return left ? evalNode(node.right, env) : left\n }\n if (op === '||') {\n const left = evalNode(node.left, env)\n return left ? left : evalNode(node.right, env)\n }\n if (op === '??') {\n const left = evalNode(node.left, env)\n return left != null ? left : evalNode(node.right, env)\n }\n return applyBinaryOp(op, evalNode(node.left, env), evalNode(node.right, env))\n }\n\n case 'ConditionalExpression':\n return evalNode(node.test, env) ? evalNode(node.consequent, env) : evalNode(node.alternate, env)\n\n case 'MemberExpression': {\n const object = evalNode(node.object, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = evalNode(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(evalNode(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(evalNode(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = getObjectPropertyKey(prop, env)\n obj[key] = evalNode(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return evalCallExpression(node, env)\n\n case 'PipeExpression': {\n const input = evalNode(node.input, env)\n try {\n return evalPipe(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(evalNode(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return evalNode(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBody(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nfunction evalCallExpression(node: Extract<ASTNode, { type: 'CallExpression' }>, env: EvalEnv): unknown {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalNode(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const resolved = resolveCallable(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n // Context functions receive the live evaluation context as their first\n // argument. It is typed Readonly<TCtx> to signal read-only intent; bonsai\n // does not copy or freeze it (see the context-aware functions docs).\n const result = resolved.kind === 'context'\n ? resolved.fn(env.ctx, ...args)\n : resolved.fn(...args)\n return rejectPromise(result, 'function', node.callee.name)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nfunction pushCallArgument(args: unknown[], node: ASTNode, env: EvalEnv): void {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(evalArg(node, env))\n}\n\nfunction evalArg(node: ASTNode, env: EvalEnv): unknown {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return evalNode(node, env)\n}\n\nfunction evalPipe(input: unknown, transformNode: ASTNode, env: EvalEnv): unknown {\n const { tr } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(input, ...args), 'transform', calleeName)\n }\n\n if (transformNode.type === 'Identifier') {\n return rejectPromise(resolveTransform(transformNode.name, tr)(input), 'transform', transformNode.name)\n }\n\n throw new Error('Invalid transform expression')\n}\n\nexport function evaluateLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n return evalLambdaBody(node, item, env)\n}\n\nfunction evalLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalLambdaBody(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(evalArg(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n }\n // Delegate to evalNode for non-method calls (e.g. registered functions)\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? evalLambdaBody(node.right, item, env) : left\n }\n if (op === '||') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? left : evalLambdaBody(node.right, item, env)\n }\n if (op === '??') {\n const left = evalLambdaBody(node.left, item, env)\n return left != null ? left : evalLambdaBody(node.right, item, env)\n }\n return applyBinaryOp(op, evalLambdaBody(node.left, item, env), evalLambdaBody(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalLambdaBody(node.operand, item, env))\n\n case 'ConditionalExpression':\n return evalLambdaBody(node.test, item, env)\n ? evalLambdaBody(node.consequent, item, env)\n : evalLambdaBody(node.alternate, item, env)\n\n case 'LambdaExpression':\n return evalLambdaBody(node.body, item, env)\n\n default:\n // Delegate to evalNode which manages its own depth\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nfunction getObjectPropertyKey(prop: ObjectProperty, env: EvalEnv): string {\n const key = prop.computed ? String(evalNode(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","import type { ASTNode, ObjectProperty } from './types.js'\nimport type { Bindings } from './plugins.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation } from './errors.js'\nimport type { EvalEnv } from './evaluator.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveCallable,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\ntype AsyncEvalEnv = EvalEnv\n\nexport async function evaluateAsync(\n node: ASTNode,\n context: Record<string, unknown>,\n bindings: Bindings,\n guard: ExecutionContext,\n source?: string,\n): Promise<unknown> {\n const env: AsyncEvalEnv = {\n ctx: context,\n tr: bindings.transforms,\n fn: bindings.functions,\n g: guard,\n s: source,\n }\n const result = await evalNodeAsync(node, env)\n guard.checkTimeout()\n return result\n}\n\nasync function evalNodeAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n // Fast path for leaf nodes — no depth tracking or step counting needed\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n case 'NullLiteral':\n return null\n case 'UndefinedLiteral':\n return undefined\n case 'Identifier':\n env.g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(env.ctx, node.name) ? env.ctx[node.name] : undefined\n }\n\n return evalCompoundAsync(node, env)\n}\n\nasync function evalCompoundAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalNodeAsync(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalNodeAsync(node.left, env)\n return left ? await evalNodeAsync(node.right, env) : left\n }\n if (op === '||') {\n const left = await evalNodeAsync(node.left, env)\n return left ? left : await evalNodeAsync(node.right, env)\n }\n if (op === '??') {\n const left = await evalNodeAsync(node.left, env)\n return left != null ? left : await evalNodeAsync(node.right, env)\n }\n return applyBinaryOp(op, await evalNodeAsync(node.left, env), await evalNodeAsync(node.right, env))\n }\n\n case 'ConditionalExpression':\n return await evalNodeAsync(node.test, env)\n ? await evalNodeAsync(node.consequent, env)\n : await evalNodeAsync(node.alternate, env)\n\n case 'MemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(await evalNodeAsync(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(await evalNodeAsync(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = await getObjectPropertyKey(prop, env)\n obj[key] = await evalNodeAsync(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return await evalCallExpressionAsync(node, env)\n\n case 'PipeExpression': {\n const input = await evalNodeAsync(node.input, env)\n try {\n return await evalPipeAsync(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(await evalNodeAsync(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return await evalNodeAsync(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBodyAsync(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nasync function evalCallExpressionAsync(\n node: Extract<ASTNode, { type: 'CallExpression' }>,\n env: AsyncEvalEnv,\n): Promise<unknown> {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalNodeAsync(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n\n // Higher-order array methods need async-aware iteration\n // because lambda callbacks may return Promises, which native\n // Array methods can't handle (Promises are always truthy).\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const arr = obj\n const predicate = args[0] as (item: unknown) => unknown\n const asyncResult = await evalAsyncArrayMethod(methodName, arr, predicate)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n const result = await method.call(obj, ...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const resolved = resolveCallable(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n // Context functions receive the live evaluation context as their first\n // argument (typed Readonly<TCtx> for intent; not copied or frozen).\n const result = resolved.kind === 'context'\n ? await resolved.fn(env.ctx, ...args)\n : await resolved.fn(...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nasync function pushCallArgumentAsync(args: unknown[], node: ASTNode, env: AsyncEvalEnv): Promise<void> {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(await evalArgAsync(node, env))\n}\n\n// Async-safe higher-order array method evaluation. Native JS array methods\n// call predicates synchronously, but our lambdas may return Promises.\n// Returns { value } if handled, undefined if the method isn't higher-order.\nasync function evalAsyncArrayMethod(\n methodName: string,\n arr: unknown[],\n predicate: (item: unknown) => unknown,\n): Promise<{ value: unknown } | undefined> {\n switch (methodName) {\n case 'filter': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: arr.filter((_, i) => resolved[i]) }\n }\n case 'map': {\n const results = arr.map(predicate)\n return { value: results.some(r => r instanceof Promise) ? await Promise.all(results) : results }\n }\n case 'find': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n const idx = resolved.findIndex(Boolean)\n return { value: idx >= 0 ? arr[idx] : undefined }\n }\n case 'some': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.some(Boolean) }\n }\n case 'every': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.every(Boolean) }\n }\n case 'findIndex': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.findIndex(Boolean) }\n }\n case 'flatMap': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: (resolved as unknown[]).flat() }\n }\n default:\n return undefined\n }\n}\n\nasync function evalArgAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return await evalNodeAsync(node, env)\n}\n\nasync function evalPipeAsync(input: unknown, transformNode: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { tr, g } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(input, ...args)\n g.checkTimeout()\n return result\n }\n\n if (transformNode.type === 'Identifier') {\n const result = await resolveTransform(transformNode.name, tr)(input)\n g.checkTimeout()\n return result\n }\n\n throw new Error('Invalid transform expression')\n}\n\nasync function evalLambdaBodyAsync(node: ASTNode, item: unknown, env: AsyncEvalEnv): Promise<unknown> {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalLambdaBodyAsync(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(await evalArgAsync(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n\n // Async-safe higher-order array method handling (same as top-level path)\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const asyncResult = await evalAsyncArrayMethod(methodName, obj, args[0] as (item: unknown) => unknown)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n return await method.call(obj, ...args)\n }\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? await evalLambdaBodyAsync(node.right, item, env) : left\n }\n if (op === '||') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n if (op === '??') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left != null ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n return applyBinaryOp(op, await evalLambdaBodyAsync(node.left, item, env), await evalLambdaBodyAsync(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalLambdaBodyAsync(node.operand, item, env))\n\n case 'ConditionalExpression':\n return await evalLambdaBodyAsync(node.test, item, env)\n ? await evalLambdaBodyAsync(node.consequent, item, env)\n : await evalLambdaBodyAsync(node.alternate, item, env)\n\n case 'LambdaExpression':\n return await evalLambdaBodyAsync(node.body, item, env)\n\n default:\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nasync function getObjectPropertyKey(prop: ObjectProperty, env: AsyncEvalEnv): Promise<string> {\n const key = prop.computed ? String(await evalNodeAsync(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","export class LRUCache<K, V> {\n private readonly max: number\n private readonly map = new Map<K, V>()\n // Fast path: track last accessed key to skip LRU reordering on repeated hits\n private lastKey: K | undefined\n private lastValue: V | undefined\n\n constructor(max: number) {\n this.max = max > 0 ? max : 0\n }\n\n get(key: K): V | undefined {\n // Fast path: same key as last access — no Map reordering needed\n if (key === this.lastKey) return this.lastValue\n\n if (!this.map.has(key)) return undefined\n const value = this.map.get(key) as V\n // Move to end (most recent) for LRU ordering\n this.map.delete(key)\n this.map.set(key, value)\n this.lastKey = key\n this.lastValue = value\n return value\n }\n\n set(key: K, value: V): void {\n if (this.max === 0) return\n\n if (this.map.has(key)) {\n this.map.delete(key)\n } else if (this.map.size >= this.max) {\n // Evict oldest (first key)\n const oldest = this.map.keys().next().value!\n this.map.delete(oldest)\n if (this.lastKey === oldest) {\n this.lastKey = undefined\n this.lastValue = undefined\n }\n }\n this.map.set(key, value)\n this.lastKey = key\n this.lastValue = value\n }\n\n get size(): number {\n return this.map.size\n }\n\n clear(): void {\n this.map.clear()\n this.lastKey = undefined\n this.lastValue = undefined\n }\n}\n","import type { TransformFn, FunctionFn, ContextFunctionFn, RegisteredFunction } from './types.js'\n\n/**\n * Snapshot of every registered binding passed to the evaluator on each call.\n * Bundled into a single object so the evaluator signature stays compact and\n * we avoid per-call allocation (the registry caches and reuses the snapshot\n * until a registration changes).\n */\nexport interface Bindings {\n readonly transforms: Record<string, TransformFn>\n readonly functions: Record<string, RegisteredFunction>\n}\n\nexport interface PluginRegistry {\n addTransform(name: string, fn: TransformFn): void\n addFunction(name: string, fn: FunctionFn): void\n addContextFunction(name: string, fn: ContextFunctionFn): void\n removeTransform(name: string): boolean\n removeFunction(name: string): boolean\n getTransform(name: string): TransformFn | undefined\n getFunction(name: string): RegisteredFunction | undefined\n isContextFunction(name: string): boolean\n hasFunction(name: string): boolean\n getTransformNames(): string[]\n getFunctionNames(): string[]\n use(plugin: (registry: PluginRegistry) => void): void\n readonly transforms: Record<string, TransformFn>\n readonly functions: Record<string, RegisteredFunction>\n /** Cached snapshot of all bindings. Rebuilt only when a registration changes. */\n readonly bindings: Bindings\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n const transformMap = new Map<string, TransformFn>()\n // Pure and context functions share one namespace keyed by name; the tagged\n // value records which kind was registered. Re-registering a name with either\n // method structurally replaces the prior entry (last registration wins),\n // so there is no cross-map invariant to keep in sync.\n const functionMap = new Map<string, RegisteredFunction>()\n\n // Cached snapshots, rebuilt only when the registry changes\n let transformsCache: Record<string, TransformFn> = {}\n let functionsCache: Record<string, RegisteredFunction> = {}\n let transformsDirty = false\n let functionsDirty = false\n let bindingsCache: Bindings | undefined\n\n const registry: PluginRegistry = {\n addTransform(name, fn) {\n transformMap.set(name, fn)\n transformsDirty = true\n },\n addFunction(name, fn) {\n functionMap.set(name, { kind: 'pure', fn })\n functionsDirty = true\n },\n addContextFunction(name, fn) {\n functionMap.set(name, { kind: 'context', fn })\n functionsDirty = true\n },\n removeTransform(name) {\n const r = transformMap.delete(name)\n if (r) transformsDirty = true\n return r\n },\n removeFunction(name) {\n const r = functionMap.delete(name)\n if (r) functionsDirty = true\n return r\n },\n getTransform(name) { return transformMap.get(name) },\n getFunction(name) { return functionMap.get(name) },\n isContextFunction(name) { return functionMap.get(name)?.kind === 'context' },\n hasFunction(name) { return functionMap.has(name) },\n getTransformNames() { return [...transformMap.keys()] },\n getFunctionNames() { return [...functionMap.keys()] },\n use(plugin) { plugin(registry) },\n get transforms() {\n if (transformsDirty) {\n transformsCache = Object.fromEntries(transformMap)\n transformsDirty = false\n }\n return transformsCache\n },\n get functions() {\n if (functionsDirty) {\n functionsCache = Object.fromEntries(functionMap)\n functionsDirty = false\n }\n return functionsCache\n },\n get bindings(): Bindings {\n // Reuse the cached individual snapshots. The composite object is\n // rebuilt only when either underlying cache changes.\n const t = registry.transforms\n const f = registry.functions\n if (!bindingsCache || bindingsCache.transforms !== t || bindingsCache.functions !== f) {\n bindingsCache = { transforms: t, functions: f }\n }\n return bindingsCache\n },\n }\n\n return registry\n}\n","import type {\n BonsaiOptions,\n BonsaiContext,\n BonsaiInstance,\n CompiledExpression,\n EvaluationContextArgs,\n ExpressionReferences,\n ContextFunctionFn,\n ASTNode,\n} from './types.js'\nimport { parse } from './parser.js'\nimport { compile } from './compiler.js'\nimport { evaluate } from './evaluator.js'\nimport { evaluateAsync } from './evaluator-async.js'\nimport { SecurityPolicy, ExecutionContext } from './execution-context.js'\nimport { LRUCache } from './cache.js'\nimport { createPluginRegistry } from './plugins.js'\nimport { ExpressionError, formatError, offsetToPosition } from './errors.js'\nimport { getIdentifierName } from './eval-ops.js'\n\nexport { ExpressionError, BonsaiTypeError, BonsaiSecurityError, BonsaiReferenceError, formatError, formatBonsaiError } from './errors.js'\nexport { tokenize } from './lexer.js'\nexport { parse } from './parser.js'\nexport { compile } from './compiler.js'\nexport type {\n ASTNode,\n Token,\n TokenType,\n InferredTypeName,\n PolicySnapshot,\n ResolveResult,\n BonsaiPlugin,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n BonsaiOptions,\n TransformFn,\n FunctionFn,\n ContextFunctionFn,\n} from './types.js'\n\nconst DEFAULT_CACHE_SIZE = 256\n\n// Shared instance for standalone one-off evaluation\nlet sharedInstance: BonsaiInstance | undefined\n\n/**\n * Evaluate a single expression with default options. Uses a shared instance internally.\n * For repeated evaluation or custom configuration, use `bonsai()` to create a dedicated instance.\n */\nexport function evaluateExpression<T = unknown>(expression: string, context?: Record<string, unknown>): T {\n if (!sharedInstance) sharedInstance = bonsai()\n return sharedInstance.evaluateSync<T>(expression, context)\n}\n\n/**\n * Create a new Bonsai instance with optional safety and caching configuration.\n * Register transforms and functions via `.use()`, `.addTransform()`, `.addFunction()`,\n * and `.addContextFunction()`.\n *\n * Pass a context type argument to get end-to-end type safety on the evaluation\n * context: `bonsai<MyContext>()` will type-check `evaluate(expr, ctx)` calls,\n * require a context argument when `MyContext` has required fields, and\n * propagate `MyContext` into context-aware function signatures.\n *\n * @example\n * ```ts\n * const expr = bonsai({ timeout: 50 })\n * expr.use(strings)\n * expr.evaluateSync('name |> trim |> upper', { name: ' hello ' }) // \"HELLO\"\n *\n * type AppCtx = { userId: string; perms: string[] }\n * const app = bonsai<AppCtx>()\n * app.addContextFunction('hasPermission', (ctx, action) =>\n * ctx.perms.includes(String(action)))\n * app.evaluateSync('hasPermission(\"write\")', { userId: 'u_1', perms: ['write'] })\n * ```\n */\nexport function bonsai<TCtx extends BonsaiContext = Record<string, unknown>>(\n options: BonsaiOptions = {},\n): BonsaiInstance<TCtx> {\n const registry = createPluginRegistry()\n const cache = new LRUCache<string, CompiledExpression<TCtx>>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n const astCache = new LRUCache<string, ASTNode>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n\n const policy = new SecurityPolicy(options)\n\n // Pooled ExecutionContext for evaluateSync — avoids per-call allocation\n const syncCtx = new ExecutionContext(policy)\n let syncCtxInUse = false\n\n function createExecutionContext(): ExecutionContext {\n return new ExecutionContext(policy)\n }\n\n function getAst(source: string): ASTNode {\n let ast = astCache.get(source)\n if (ast) return ast\n ast = compile(parse(source))\n astCache.set(source, ast)\n return ast\n }\n\n function compileExpr(source: string): CompiledExpression<TCtx> {\n const cached = cache.get(source)\n if (cached) return cached\n\n const optimized = getAst(source)\n\n const compiled: CompiledExpression<TCtx> = {\n ast: optimized,\n source,\n async evaluate<T = unknown>(...args: EvaluationContextArgs<TCtx>) {\n const ctx = (args[0] ?? {}) as Record<string, unknown>\n return evaluateAsync(optimized, ctx, registry.bindings, createExecutionContext(), source) as Promise<T>\n },\n evaluateSync<T = unknown>(...args: EvaluationContextArgs<TCtx>) {\n const ctx = (args[0] ?? {}) as Record<string, unknown>\n if (syncCtxInUse) {\n return evaluate(optimized, ctx, registry.bindings, createExecutionContext(), source) as T\n }\n syncCtxInUse = true\n try {\n syncCtx.reset()\n return evaluate(optimized, ctx, registry.bindings, syncCtx, source) as T\n } finally {\n syncCtxInUse = false\n }\n },\n }\n\n cache.set(source, compiled)\n return compiled\n }\n\n const instance: BonsaiInstance<TCtx> = {\n use(plugin) {\n plugin(instance)\n return instance\n },\n addTransform(name, fn) { registry.addTransform(name, fn); return instance },\n addFunction(name, fn) { registry.addFunction(name, fn); return instance },\n addContextFunction(name, fn) {\n // Cast: internal registry stores context functions as ContextFunctionFn\n // (default generic), public API exposes them typed against TCtx. The\n // runtime treats the ctx arg as opaque, so the cast is sound.\n registry.addContextFunction(name, fn as unknown as ContextFunctionFn)\n return instance\n },\n removeTransform(name) { return registry.removeTransform(name) },\n removeFunction(name) { return registry.removeFunction(name) },\n hasTransform(name) { return registry.getTransform(name) !== undefined },\n hasFunction(name) { return registry.hasFunction(name) },\n isContextFunction(name) { return registry.isContextFunction(name) },\n listTransforms() { return registry.getTransformNames() },\n listFunctions() { return registry.getFunctionNames() },\n getPolicy() {\n return {\n ...(policy.allowedProperties ? { allowedProperties: [...policy.allowedProperties] } : {}),\n ...(policy.deniedProperties ? { deniedProperties: [...policy.deniedProperties] } : {}),\n }\n },\n clearCache() { cache.clear(); astCache.clear() },\n compile(expression) { return compileExpr(expression) },\n async evaluate<T = unknown>(expression: string, ...args: EvaluationContextArgs<TCtx>) {\n const ast = getAst(expression)\n const ctx = (args[0] ?? {}) as Record<string, unknown>\n return evaluateAsync(ast, ctx, registry.bindings, createExecutionContext(), expression) as Promise<T>\n },\n evaluateSync<T = unknown>(expression: string, ...args: EvaluationContextArgs<TCtx>) {\n // Hot path: reuse pooled ExecutionContext to avoid per-call allocation\n const ast = getAst(expression)\n const ctx = (args[0] ?? {}) as Record<string, unknown>\n if (syncCtxInUse) {\n // Reentrant call (e.g. custom function calling evaluateSync). Allocate fresh.\n return evaluate(ast, ctx, registry.bindings, createExecutionContext(), expression) as T\n }\n syncCtxInUse = true\n try {\n syncCtx.reset()\n return evaluate(ast, ctx, registry.bindings, syncCtx, expression) as T\n } finally {\n syncCtxInUse = false\n }\n },\n validate(expression) {\n try {\n const ast = parse(expression)\n return { valid: true, errors: [], ast, references: extractReferences(ast) }\n } catch (error: unknown) {\n let message: string\n if (error instanceof ExpressionError) {\n message = error.rawMessage\n } else if (error instanceof Error) {\n message = error.message\n } else {\n message = String(error)\n }\n const { start, end } = error instanceof ExpressionError ? error : { start: 0, end: 1 }\n const position = offsetToPosition(expression, start)\n return {\n valid: false,\n errors: [{\n message,\n position: { line: position.line, column: position.column },\n formatted: error instanceof ExpressionError\n ? error.message\n : formatError(message, { source: expression, start, end }),\n }],\n }\n }\n },\n }\n\n return instance\n}\n\nfunction extractReferences(node: ASTNode): ExpressionReferences {\n const identifiers = new Set<string>()\n const transforms = new Set<string>()\n const functions = new Set<string>()\n\n function walk(n: ASTNode): void {\n switch (n.type) {\n case 'Identifier':\n identifiers.add(n.name)\n break\n case 'PipeExpression':\n walk(n.input)\n if (n.transform.type === 'Identifier') {\n transforms.add(n.transform.name)\n } else if (n.transform.type === 'CallExpression') {\n if (n.transform.callee.type === 'Identifier') {\n transforms.add(getIdentifierName(n.transform.callee))\n }\n n.transform.args.forEach(walk)\n }\n break\n case 'CallExpression':\n if (n.callee.type === 'Identifier') {\n functions.add(n.callee.name)\n } else {\n walk(n.callee)\n }\n n.args.forEach(walk)\n break\n case 'BinaryExpression':\n walk(n.left)\n walk(n.right)\n break\n case 'UnaryExpression':\n walk(n.operand)\n break\n case 'ConditionalExpression':\n walk(n.test)\n walk(n.consequent)\n walk(n.alternate)\n break\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n walk(n.object)\n if (n.computed) walk(n.property)\n break\n case 'ArrayLiteral':\n n.elements.forEach(walk)\n break\n case 'ObjectLiteral':\n n.properties.forEach(p => { walk(p.key); walk(p.value) })\n break\n case 'TemplateLiteral':\n n.parts.forEach(walk)\n break\n case 'SpreadElement':\n walk(n.argument)\n break\n case 'LambdaExpression':\n walk(n.body)\n break\n }\n }\n\n walk(node)\n return {\n identifiers: [...identifiers],\n transforms: [...transforms],\n functions: [...functions],\n }\n}\n"],"mappings":";;;AAWA,MAAM,kBAAkB;AAExB,MAAM,aAAyE;CAC7E,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CAEN,KAAK,KAAA;CACL,OAAO,KAAA;CACR;AAED,MAAM,kBAAkB;AAExB,SAAgB,MAAM,QAAgB,SAAS,GAAY;AACzD,KAAI,SAAS,gBACX,OAAM,IAAI,gBACR,2CACA;EAAE;EAAQ,OAAO;EAAG,KAAK,OAAO;EAAQ,CACzC;CAEH,MAAM,SAAS,SAAS,OAAO;CAC/B,IAAI,MAAM;CAEV,SAAS,UAAiB;AACxB,SAAO,OAAO;;CAGhB,SAAS,UAAiB;AACxB,SAAO,OAAO;;CAGhB,SAAS,OAAO,MAAc,OAAuB;EACnD,MAAM,MAAM,SAAS;AACrB,MAAI,IAAI,SAAS,QAAS,UAAU,KAAA,KAAa,IAAI,UAAU,MAC7D,OAAM,IAAI,gBACR,YAAY,QAAQ,IAAI,MAAM,KAAK,KAAK,WAAW,IAAI,QAAQ,IAAI,IAAI,MAAM,KAAK,IAAI,QACtF;GAAE;GAAQ,OAAO,IAAI;GAAO,KAAK,IAAI;GAAK,CAC3C;AAEH,SAAO,SAAS;;CAGlB,SAAS,gBAAgB,UAAU,GAAY;EAC7C,IAAI,OAAO,YAAY;AAGvB,MAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,OAAO,YAAY,GAAG;AAChF,YAAS;GACT,MAAM,aAAa,gBAAgB,EAAE;AACrC,UAAO,eAAe,IAAI;GAC1B,MAAM,YAAY,gBAAgB,EAAE;AACpC,UAAO;IACL,MAAM;IACN,MAAM;IACN;IACA;IACA,OAAO,KAAK;IACZ,KAAK,UAAU;IAChB;AACD,UAAO;;AAIT,SAAO,SAAS,CAAC,SAAS,UAAU,WAAW,iBAAiB;AAC9D,YAAS;GACT,MAAM,YAAY,oBAAoB;AACtC,UAAO;IACL,MAAM;IACN,OAAO;IACP;IACA,OAAO,KAAK;IACZ,KAAK,UAAU;IAChB;;AAIH,SAAO,MAAM;GACX,MAAM,MAAM,SAAS;GACrB,IAAI;AAEJ,OAAI,IAAI,SAAS,YAAY;AAC3B,WAAO,WAAW,IAAI;AAEtB,QAAI,IAAI,UAAU,OAAO;KACvB,MAAM,UAAU,OAAO,MAAM;AAC7B,SAAI,WAAW,QAAQ,SAAS,cAAc,QAAQ,UAAU,KAC9D,QAAO,WAAW;;cAGb,IAAI,SAAS,oBACtB,QAAO,WAAW;AAGpB,OAAI,SAAS,KAAA,KAAa,OAAO,QAAS;GAE1C,MAAM,KAAK,SAAS;GACpB,IAAI;AACJ,OAAI,GAAG,SAAS,oBACd,WAAU;YACD,GAAG,UAAU,OAAO;AAC7B,aAAS;AACT,cAAU;SAEV,WAAU,GAAG;GAKf,MAAM,QAAQ,gBADM,YAAY,OAAO,OAAO,OAAO,EACX;AAE1C,UAAO;IACL,MAAM;IACN,UAAU;IACV;IACA;IACA,OAAO,KAAK;IACZ,KAAK,MAAM;IACZ;;AAIH,MAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,OAAO,YAAY,GAAG;AAChF,YAAS;GACT,MAAM,aAAa,gBAAgB,EAAE;AACrC,UAAO,eAAe,IAAI;GAC1B,MAAM,YAAY,gBAAgB,EAAE;AACpC,UAAO;IACL,MAAM;IACN,MAAM;IACN;IACA;IACA,OAAO,KAAK;IACZ,KAAK,UAAU;IAChB;;AAIH,SAAO,SAAS,CAAC,SAAS,UAAU,WAAW,iBAAiB;AAC9D,YAAS;GACT,MAAM,YAAY,oBAAoB;AACtC,UAAO;IACL,MAAM;IACN,OAAO;IACP;IACA,OAAO,KAAK;IACZ,KAAK,UAAU;IAChB;;AAGH,SAAO;;CAGT,SAAS,qBAA8B;EACrC,IAAI,OAAO,cAAc;AAGzB,MAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,KAAK;AAC/D,YAAS;GACT,MAAM,OAAkB,EAAE;AAC1B,UAAO,EAAE,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,MAAM;AACrE,QAAI,KAAK,SAAS,EAAG,QAAO,eAAe,IAAI;AAC/C,QAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,IAAK;AACjE,SAAK,KAAK,gBAAgB,EAAE,CAAC;;GAE/B,MAAM,MAAM,OAAO,eAAe,IAAI,CAAC;AACvC,UAAO;IACL,MAAM;IACN,QAAQ;IACR;IACA,OAAO,KAAK;IACZ;IACD;;AAGH,SAAO;;CAGT,SAAS,aAAsB;EAC7B,MAAM,MAAM,SAAS;AAErB,MAAI,IAAI,SAAS,eAAe,IAAI,UAAU,OAAO,IAAI,UAAU,OAAO,IAAI,UAAU,MAAM;AAC5F,YAAS;GACT,MAAM,UAAU,YAAY;AAC5B,UAAO;IACL,MAAM;IACN,UAAU,IAAI;IACd;IACA,OAAO,IAAI;IACX,KAAK,QAAQ;IACd;;AAGH,SAAO,cAAc;;CAGvB,SAAS,eAAwB;EAC/B,IAAI,OAAO,cAAc;AAEzB,SAAO,MAAM;GACX,MAAM,MAAM,SAAS;AAGrB,OAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,aAAS;IACT,MAAM,OAAO,OAAO,aAAa;AACjC,WAAO;KACL,MAAM;KACN,QAAQ;KACR,UAAU;MAAE,MAAM;MAAc,MAAM,KAAK;MAAO,OAAO,KAAK;MAAO,KAAK,KAAK;MAAK;KACpF,UAAU;KACV,OAAO,KAAK;KACZ,KAAK,KAAK;KACX;AACD;;AAIF,OAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,aAAS;IACT,MAAM,WAAW,gBAAgB,EAAE;IACnC,MAAM,MAAM,OAAO,eAAe,IAAI,CAAC;AACvC,WAAO;KACL,MAAM;KACN,QAAQ;KACR;KACA,UAAU;KACV,OAAO,KAAK;KACZ;KACD;AACD;;AAIF,OAAI,IAAI,SAAS,iBAAiB;AAChC,aAAS;AAET,QAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,KAAK;AAC/D,cAAS;KACT,MAAM,WAAW,gBAAgB,EAAE;KACnC,MAAM,MAAM,OAAO,eAAe,IAAI,CAAC;AACvC,YAAO;MACL,MAAM;MACN,QAAQ;MACR;MACA,UAAU;MACV,OAAO,KAAK;MACZ;MACD;AACD;;IAGF,MAAM,OAAO,OAAO,aAAa;AACjC,WAAO;KACL,MAAM;KACN,QAAQ;KACR,UAAU;MAAE,MAAM;MAAc,MAAM,KAAK;MAAO,OAAO,KAAK;MAAO,KAAK,KAAK;MAAK;KACpF,UAAU;KACV,OAAO,KAAK;KACZ,KAAK,KAAK;KACX;AACD;;AAIF,OAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,aAAS;IACT,MAAM,OAAkB,EAAE;AAC1B,WAAO,EAAE,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,MAAM;AACrE,SAAI,KAAK,SAAS,EAAG,QAAO,eAAe,IAAI;AAC/C,SAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,IAAK;AACjE,UAAK,KAAK,gBAAgB,EAAE,CAAC;;IAE/B,MAAM,MAAM,OAAO,eAAe,IAAI,CAAC;AACvC,WAAO;KACL,MAAM;KACN,QAAQ;KACR;KACA,OAAO,KAAK;KACZ;KACD;AACD;;AAGF;;AAGF,SAAO;;CAGT,SAAS,eAAwB;EAC/B,MAAM,MAAM,SAAS;AAGrB,MAAI,IAAI,SAAS,UAAU;AACzB,YAAS;GACT,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,GAAG;AACxC,UAAO;IAAE,MAAM;IAAiB,OAAO,OAAO,IAAI;IAAE,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK;;AAItF,MAAI,IAAI,SAAS,UAAU;AACzB,YAAS;AACT,UAAO;IAAE,MAAM;IAAiB,OAAO,IAAI;IAAO,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK;;AAIpF,MAAI,IAAI,SAAS,WAAW;AAC1B,YAAS;AACT,UAAO;IAAE,MAAM;IAAkB,OAAO,IAAI,UAAU;IAAQ,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK;;AAIhG,MAAI,IAAI,SAAS,QAAQ;AACvB,YAAS;AACT,UAAO;IAAE,MAAM;IAAe,OAAO;IAAM,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK;;AAI7E,MAAI,IAAI,SAAS,aAAa;AAC5B,YAAS;AACT,UAAO;IAAE,MAAM;IAAoB,OAAO,KAAA;IAAW,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK;;AAIvF,MAAI,IAAI,SAAS,kBACf,QAAO,sBAAsB;AAI/B,MAAI,IAAI,SAAS,cAAc;AAC7B,YAAS;AACT,UAAO;IAAE,MAAM;IAAc,MAAM,IAAI;IAAO,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK;;AAIhF,MAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,YAAS;GACT,MAAM,OAAO,gBAAgB,EAAE;AAC/B,UAAO,eAAe,IAAI;AAC1B,UAAO;;AAIT,MAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,IAC9C,QAAO,mBAAmB;AAI5B,MAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,IAC9C,QAAO,oBAAoB;AAI7B,MAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,IAC9C,QAAO,uBAAuB;AAIhC,MAAI,IAAI,SAAS,UAAU;AACzB,YAAS;GACT,MAAM,WAAW,gBAAgB,EAAE;AACnC,UAAO;IAAE,MAAM;IAAiB;IAAU,OAAO,IAAI;IAAO,KAAK,SAAS;IAAK;;AAGjF,QAAM,IAAI,gBACR,cAAc,IAAI,SAAS,QAAQ,sBAAsB,UAAU,IAAI,MAAM,MAC7E;GAAE;GAAQ,OAAO,IAAI;GAAO,KAAK,IAAI;GAAK,CAC3C;;CAGH,SAAS,wBAAiC;EAExC,MAAM,QAAQ,SAAS,CAAC;AACxB,WAAS;EAIT,IAAI;AACJ,MAAI,SAAS,CAAC,SAAS,cAAc;AACnC,OAAI,SAAS,CAAC,SAAS,cAAc,SAAS,CAAC,SAAS,oBACtD,OAAM,IAAI,gBACR,gDACA;IAAE;IAAQ;IAAO,KAAK,QAAQ;IAAG,CAClC;AAEH,UAAO;IAAE,MAAM;IAAkB;IAAO,KAAK,QAAQ;IAAG;SACnD;GACL,MAAM,OAAO,OAAO,aAAa;AACjC,UAAO;IACL,MAAM;IACN,UAAU,KAAK;IACf;IACA,KAAK,KAAK;IACX;;AAIH,SAAO,MAAM;GACX,MAAM,MAAM,SAAS;AACrB,OAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,aAAS;IACT,MAAM,WAAW,OAAO,aAAa;AACrC,WAAO;KACL,MAAM;KACN,QAAQ;KACR,UAAU;MAAE,MAAM;MAAc,MAAM,SAAS;MAAO,OAAO,SAAS;MAAO,KAAK,SAAS;MAAK;KAChG,UAAU;KACV,OAAO,KAAK;KACZ,KAAK,SAAS;KACf;AACD;;AAEF,OAAI,IAAI,SAAS,iBAAiB;AAChC,aAAS;IACT,MAAM,WAAW,OAAO,aAAa;AACrC,WAAO;KACL,MAAM;KACN,QAAQ;KACR,UAAU;MAAE,MAAM;MAAc,MAAM,SAAS;MAAO,OAAO,SAAS;MAAO,KAAK,SAAS;MAAK;KAChG,UAAU;KACV,OAAO,KAAK;KACZ,KAAK,SAAS;KACf;AACD;;AAEF,OAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,aAAS;IACT,MAAM,WAAW,gBAAgB,EAAE;IACnC,MAAM,MAAM,OAAO,eAAe,IAAI,CAAC;AACvC,WAAO;KACL,MAAM;KACN,QAAQ;KACR;KACA,UAAU;KACV,OAAO,KAAK;KACZ;KACD;AACD;;AAEF,OAAI,IAAI,SAAS,iBAAiB,IAAI,UAAU,KAAK;AACnD,aAAS;IACT,MAAM,OAAkB,EAAE;AAC1B,WAAO,EAAE,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,MAAM;AACrE,SAAI,KAAK,SAAS,EAAG,QAAO,eAAe,IAAI;AAC/C,SAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,IAAK;AACjE,UAAK,KAAK,gBAAgB,EAAE,CAAC;;IAE/B,MAAM,MAAM,OAAO,eAAe,IAAI,CAAC;AACvC,WAAO;KACL,MAAM;KACN,QAAQ;KACR;KACA,OAAO,KAAK;KACZ;KACD;AACD;;AAEF;;EAIF,MAAM,MAAM,SAAS;EACrB,IAAI;AACJ,MAAI,IAAI,SAAS,YAAY;AAC3B,UAAO,WAAW,IAAI;AACtB,OAAI,IAAI,UAAU,OAAO;IACvB,MAAM,UAAU,OAAO,MAAM;AAC7B,QAAI,WAAW,QAAQ,SAAS,cAAc,QAAQ,UAAU,KAC9D,QAAO,WAAW;;aAGb,IAAI,SAAS,oBACtB,QAAO,WAAW;AAIpB,MAAI,SAAS,KAAA,GAAW;GACtB,IAAI,OAAgB;AACpB,UAAO,MAAM;IACX,MAAM,QAAQ,SAAS;IACvB,IAAI;AACJ,QAAI,MAAM,SAAS,YAAY;AAC7B,cAAS,WAAW,MAAM;AAC1B,SAAI,MAAM,UAAU,OAAO;MACzB,MAAM,UAAU,OAAO,MAAM;AAC7B,UAAI,WAAW,QAAQ,SAAS,cAAc,QAAQ,UAAU,KAC9D,UAAS,WAAW;;eAGf,MAAM,SAAS,oBACxB,UAAS,WAAW;AAEtB,QAAI,WAAW,KAAA,EAAW;IAE1B,MAAM,KAAK,SAAS;IACpB,IAAI;AACJ,QAAI,GAAG,SAAS,oBACd,WAAU;aACD,GAAG,UAAU,OAAO;AAC7B,cAAS;AACT,eAAU;UAEV,WAAU,GAAG;IAIf,MAAM,QAAQ,gBADM,YAAY,OAAO,SAAS,SAAS,EACf;AAE1C,WAAO;KACL,MAAM;KACN,UAAU;KACV;KACA;KACA,OAAO,KAAK;KACZ,KAAK,MAAM;KACZ;;AAEH,UAAO;;AAIT,MAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,KAAK;AAC/D,YAAS;GACT,MAAM,aAAa,gBAAgB,EAAE;AACrC,UAAO,eAAe,IAAI;GAC1B,MAAM,YAAY,gBAAgB,EAAE;AASpC,UAAO;IACL,MAAM;IACN,MAAA;KATA,MAAM;KACN,MAAM;KACN;KACA;KACA;KACA,KAAK,UAAU;KAIX;IACJ;IACA,KAAK,UAAU;IAChB;;AAIH,MAAI,KAAK,SAAS,oBAAoB,KAAK,SAAS,iBAClD,QAAO;AAIT,SAAO;GACL,MAAM;GACN,MAAM;GACN;GACA,KAAK,KAAK;GACX;;CAGH,SAAS,oBAA6B;EACpC,MAAM,QAAQ,OAAO,eAAe,IAAI,CAAC;EACzC,MAAM,WAAsB,EAAE;AAE9B,SAAO,EAAE,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,MAAM;AACrE,OAAI,SAAS,SAAS,EAAG,QAAO,eAAe,IAAI;AACnD,OAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,IAAK;AACjE,YAAS,KAAK,gBAAgB,EAAE,CAAC;;AAInC,SAAO;GAAE,MAAM;GAAgB;GAAU;GAAO,KADpC,OAAO,eAAe,IAAI,CAAC;GACc;;CAGvD,SAAS,qBAA8B;EACrC,MAAM,QAAQ,OAAO,eAAe,IAAI,CAAC;EACzC,MAAM,aAA+B,EAAE;AAEvC,SAAO,EAAE,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,MAAM;AACrE,OAAI,WAAW,SAAS,EAAG,QAAO,eAAe,IAAI;AACrD,OAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,IAAK;GAEjE,IAAI;GACJ,IAAI,WAAW;AAGf,OAAI,SAAS,CAAC,SAAS,iBAAiB,SAAS,CAAC,UAAU,KAAK;AAC/D,aAAS;AACT,UAAM,gBAAgB,EAAE;AACxB,WAAO,eAAe,IAAI;AAC1B,eAAW;UACN;IAEL,MAAM,MAAM,SAAS;AACrB,QAAI,IAAI,SAAS,cAAc;AAC7B,cAAS;AACT,WAAM;MAAE,MAAM;MAAc,MAAM,IAAI;MAAO,OAAO,IAAI;MAAO,KAAK,IAAI;MAAK;KAG7E,MAAM,OAAO,SAAS;AACtB,SAAI,KAAK,SAAS,kBAAkB,KAAK,UAAU,OAAO,KAAK,UAAU,MAAM;MAC7E,MAAM,QAAiB;OAAE,MAAM;OAAc,MAAM,IAAI;OAAO,OAAO,IAAI;OAAO,KAAK,IAAI;OAAK;AAC9F,iBAAW,KAAK;OACd,MAAM;OACN;OACA;OACA,UAAU;OACV,OAAO,IAAI;OACX,KAAK,MAAM;OACZ,CAAC;AACF;;eAEO,IAAI,SAAS,UAAU;AAChC,cAAS;AACT,WAAM;MAAE,MAAM;MAAiB,OAAO,IAAI;MAAO,OAAO,IAAI;MAAO,KAAK,IAAI;MAAK;UAEjF,OAAM,IAAI,gBACR,mCAAmC,IAAI,MAAM,IAC7C;KAAE;KAAQ,OAAO,IAAI;KAAO,KAAK,IAAI;KAAK,CAC3C;;AAIL,UAAO,eAAe,IAAI;GAC1B,MAAM,QAAQ,gBAAgB,EAAE;AAEhC,cAAW,KAAK;IACd,MAAM;IACN;IACA;IACA;IACA,OAAO,IAAI;IACX,KAAK,MAAM;IACZ,CAAC;;AAIJ,SAAO;GAAE,MAAM;GAAiB;GAAY;GAAO,KADvC,OAAO,eAAe,IAAI,CAAC;GACiB;;CAG1D,SAAS,uBAAgC;EACvC,MAAM,MAAM,SAAS;EACrB,MAAM,MAAM,IAAI,MAAM,MAAM,GAAG,GAAG;EAClC,MAAM,QAAmB,EAAE;EAC3B,IAAI,IAAI;EACR,IAAI,YAAY;AAEhB,SAAO,IAAI,IAAI,OACb,KAAI,IAAI,OAAO,OAAO,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,OAAO,KAAK;AAE9D,OAAI,IAAI,WAAW;IACjB,MAAM,OAAO,IAAI,MAAM,WAAW,EAAE;AACpC,UAAM,KAAK;KAAE,MAAM;KAAiB,OAAO;KAAM,OAAO,IAAI;KAAO,KAAK,IAAI;KAAK,CAAC;;AAGpF,QAAK;GACL,IAAI,QAAQ;GACZ,MAAM,YAAY;AAClB,UAAO,IAAI,IAAI,UAAU,QAAQ,GAAG;AAClC,QAAI,IAAI,OAAO,IAAK;aACX,IAAI,OAAO,IAAK;AACzB,QAAI,QAAQ,EAAG;;GAEjB,MAAM,aAAa,IAAI,MAAM,WAAW,EAAE;AAC1C;AACA,eAAY;GAEZ,MAAM,UAAU,MAAM,YAAY,SAAS,EAAE;AAC7C,SAAM,KAAK,QAAQ;QAEnB;AAKJ,MAAI,YAAY,IAAI,QAAQ;GAC1B,MAAM,OAAO,IAAI,MAAM,UAAU;AACjC,SAAM,KAAK;IAAE,MAAM;IAAiB,OAAO;IAAM,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK,CAAC;;AAGpF,SAAO;GAAE,MAAM;GAAmB;GAAO,OAAO,IAAI;GAAO,KAAK,IAAI;GAAK;;CAG3E,MAAM,SAAS,gBAAgB,EAAE;AAEjC,KAAI,SAAS,CAAC,SAAS,OAAO;EAC5B,MAAM,MAAM,SAAS;AACrB,QAAM,IAAI,gBACR,qBAAqB,IAAI,MAAM,IAC/B;GAAE;GAAQ,OAAO,IAAI;GAAO,KAAK,IAAI;GAAK,CAC3C;;AAGH,QAAO;;;;ACvsBT,SAAgB,QAAQ,KAAuB;AAC7C,QAAO,SAAS,IAAI;;AAGtB,SAAS,SAAS,MAAwB;AACxC,SAAQ,KAAK,MAAb;EACE,KAAK,oBAAoB;GACvB,MAAM,OAAO,SAAS,KAAK,KAAK;GAChC,MAAM,QAAQ,SAAS,KAAK,MAAM;AAGlC,OAAI,WAAW,KAAK,IAAI,WAAW,MAAM,EAAE;IACzC,MAAM,SAAS,aAAa,KAAK,UAAU,QAAQ,KAAK,EAAE,QAAQ,MAAM,CAAC;AACzE,QAAI,WAAW,KAAA,EACb,QAAO,aAAa,QAAQ,KAAK,OAAO,KAAK,IAAI;;AAIrD,UAAO;IAAE,GAAG;IAAM;IAAM;IAAO;;EAGjC,KAAK,yBAAyB;GAC5B,MAAM,OAAO,SAAS,KAAK,KAAK;AAGhC,OAAI,WAAW,KAAK,CAElB,QADc,QAAQ,KACV,GAAG,SAAS,KAAK,WAAW,GAAG,SAAS,KAAK,UAAU;AAGrE,UAAO;IACL,GAAG;IACH;IACA,YAAY,SAAS,KAAK,WAAW;IACrC,WAAW,SAAS,KAAK,UAAU;IACpC;;EAGH,KAAK,mBAAmB;GACtB,MAAM,UAAU,SAAS,KAAK,QAAQ;AACtC,OAAI,WAAW,QAAQ,EAAE;IACvB,MAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAI,KAAK,aAAa,OAAO,OAAO,QAAQ,UAC1C,QAAO;KAAE,MAAM;KAAkB,OAAO,CAAC;KAAK,OAAO,KAAK;KAAO,KAAK,KAAK;KAAK;AAElF,QAAI,KAAK,aAAa,OAAO,OAAO,QAAQ,SAC1C,QAAO;KAAE,MAAM;KAAiB,OAAO,CAAC;KAAK,OAAO,KAAK;KAAO,KAAK,KAAK;KAAK;;AAGnF,UAAO;IAAE,GAAG;IAAM;IAAS;;EAG7B,KAAK,iBACH,QAAO;GAAE,GAAG;GAAM,OAAO,SAAS,KAAK,MAAM;GAAE,WAAW,SAAS,KAAK,UAAU;GAAE;EAEtF,KAAK,eACH,QAAO;GAAE,GAAG;GAAM,UAAU,KAAK,SAAS,KAAI,MAAK,SAAS,EAAE,CAAC;GAAE;EAEnE,KAAK,iBACH,QAAO;GAAE,GAAG;GAAM,MAAM,KAAK,KAAK,KAAI,MAAK,SAAS,EAAE,CAAC;GAAE;EAE3D,KAAK;EACL,KAAK,2BACH,QAAO;GAAE,GAAG;GAAM,QAAQ,SAAS,KAAK,OAAO;GAAE,UAAU,KAAK,WAAW,SAAS,KAAK,SAAS,GAAG,KAAK;GAAU;EAEtH,KAAK,mBACH,QAAO;GAAE,GAAG;GAAM,MAAM,SAAS,KAAK,KAAK;GAAE;EAE/C,QACE,QAAO;;;AAIb,SAAS,WAAW,MAAwB;AAC1C,QAAO,KAAK,SAAS,mBAChB,KAAK,SAAS,mBACd,KAAK,SAAS,oBACd,KAAK,SAAS;;AAGrB,SAAS,QAAQ,MAAwB;AACvC,KAAI,KAAK,SAAS,gBAAiB,QAAO,KAAK;AAC/C,KAAI,KAAK,SAAS,gBAAiB,QAAO,KAAK;AAC/C,KAAI,KAAK,SAAS,iBAAkB,QAAO,KAAK;AAChD,KAAI,KAAK,SAAS,cAAe,QAAO;;AAI1C,SAAS,aAAa,IAA8B,MAAe,OAAqC;AACtG,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAC/C,SAAQ,IAAR;EACE,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,KAAM,QAAO,QAAQ;EAC1B,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,IAAK,QAAO,OAAO;EACxB,KAAK,KAAM,QAAO,QAAQ;EAC1B,KAAK,KAAM,QAAO,QAAQ;EAC1B,KAAK,KAAM,QAAO,SAAS;EAC3B,KAAK,KAAM,QAAO,SAAS;;AAG/B,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,YAAY,OAAO,IAClE,QAAO,OAAO;AAEhB,KAAI,OAAO,SAAS,aAAa,OAAO,UAAU,WAAW;AAC3D,MAAI,OAAO,KAAM,QAAO,QAAQ;AAChC,MAAI,OAAO,KAAM,QAAO,QAAQ;;AAElC,KAAI,OAAO,KAAM,QAAO,SAAS;AACjC,KAAI,OAAO,KAAM,QAAO,SAAS;;AAInC,SAAS,aAAa,OAAgB,OAAe,KAAsB;AACzE,KAAI,OAAO,UAAU,SAAU,QAAO;EAAE,MAAM;EAAiB;EAAO;EAAO;EAAK;AAClF,KAAI,OAAO,UAAU,SAAU,QAAO;EAAE,MAAM;EAAiB;EAAO;EAAO;EAAK;AAClF,KAAI,OAAO,UAAU,UAAW,QAAO;EAAE,MAAM;EAAkB;EAAO;EAAO;EAAK;AACpF,KAAI,UAAU,KAAM,QAAO;EAAE,MAAM;EAAe,OAAO;EAAM;EAAO;EAAK;AAC3E,QAAO;EAAE,MAAM;EAAoB,OAAO,KAAA;EAAW;EAAO;EAAK;;;;;AC/GnE,SAAS,kBAAkB,KAAc,YAA6B;CACpE,MAAM,IAAI,OAAO;AACjB,SAAQ,YAAR;EAEE,KAAK;EAAc,KAAK;EAAY,KAAK;EACzC,KAAK;EAAU,KAAK;EAAc,KAAK;EACvC,KAAK;EAAQ,KAAK;EAAa,KAAK;EACpC,KAAK;EAAe,KAAK;EACzB,KAAK;EAAW,KAAK;EACrB,KAAK;EAAY,KAAK;EACtB,KAAK,QACH,QAAO,MAAM;EAEf,KAAK;EAAY,KAAK;EAAW,KAAK;EACtC,KAAK;EAAS,KAAK;EAAM,KAAK,SAC5B,QAAO,MAAM,YAAY,MAAM,QAAQ,IAAI;EAE7C,KAAK;EAAU,KAAK;EAAO,KAAK;EAAQ,KAAK;EAC7C,KAAK;EAAQ,KAAK;EAAS,KAAK,UAC9B,QAAO,MAAM,QAAQ,IAAI;EAE3B,KAAK;EAAQ,KAAK;EAClB,KAAK;EAAc,KAAK;EAAY,KAAK;EAAa,KAAK,OACzD,QAAO,MAAM,QAAQ,IAAI;EAE3B,KAAK,UACH,QAAO,MAAM;EAEf,KAAK,WACH,QAAO,MAAM,YAAY,MAAM;EACjC,QACE,QAAO;;;AAIb,SAAgB,cAAc,OAAwB;AACpD,QAAO,OAAO,MAAM;;AAGtB,SAAgB,cAAc,UAAoC,MAAe,OAAyB;AACxG,SAAQ,UAAR;EACE,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,KAAM,QAAQ,QAAoB;EACvC,KAAK,KAAM,QAAO,SAAS;EAC3B,KAAK,KAAM,QAAO,SAAS;EAC3B,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,IAAK,QAAQ,OAAmB;EACrC,KAAK,KAAM,QAAQ,QAAoB;EACvC,KAAK,KAAM,QAAQ,QAAoB;EACvC,KAAK;AACH,OAAI,OAAO,UAAU,SAAU,QAAQ,MAAiB,SAAS,KAAe;AAChF,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,SAAS,KAAK;AACrD,SAAM,IAAI,gBAAgB,MAAM,qBAAqB,MAAM;EAE7D,KAAK;AACH,OAAI,OAAO,UAAU,SAAU,QAAO,CAAE,MAAiB,SAAS,KAAe;AACjF,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,CAAC,MAAM,SAAS,KAAK;AACtD,SAAM,IAAI,gBAAgB,UAAU,qBAAqB,MAAM;EAEjE,QAAS,OAAM,IAAI,MAAM,4BAA4B,WAAW;;;AAIpE,SAAgB,aAAa,UAAyB,SAA2B;AAC/E,SAAQ,UAAR;EACE,KAAK,IAAK,QAAO,CAAC;EAClB,KAAK,IAAK,QAAO,CAAE;EACnB,KAAK,IAAK,QAAO,OAAO,QAAQ;EAChC,QAAS,OAAM,IAAI,MAAM,2BAA2B,WAAW;;;AAInE,SAAgB,mBACd,KACA,YACA,OACY;AACZ,OAAM,gBAAgB,YAAY,SAAS;AAC3C,KAAI,OAAO,KAAM,OAAM,IAAI,gBAAgB,YAAY,oBAAoB,IAAI;AAC/E,KAAI,CAAC,kBAAkB,KAAK,WAAW,CACrC,OAAM,IAAI,oBACR,sBACA,WAAW,WAAW,sBAAsB,OAAO,MACpD;CAEH,MAAM,SAAU,IAAgC;AAChD,KAAI,OAAO,WAAW,WAAY,OAAM,IAAI,gBAAgB,YAAY,YAAY,OAAO;AAC3F,QAAO;;AAGT,SAAgB,iBAAiB,MAAc,YAAsD;AACnG,KAAI,CAAC,OAAO,OAAO,YAAY,KAAK,CAElC,OAAM,IAAI,qBAAqB,aAAa,MADzB,QAAQ,MAAM,OAAO,KAAK,WAAW,CACI,CAAC;AAE/D,QAAO,WAAW;;;;;;;;;AAUpB,SAAgB,gBACd,MACA,WACoB;AACpB,KAAI,OAAO,OAAO,WAAW,KAAK,CAChC,QAAO,UAAU;AAGnB,OAAM,IAAI,qBAAqB,YAAY,MADxB,QAAQ,MAAM,OAAO,KAAK,UAAU,CACI,CAAC;;AAG9D,SAAgB,kBAAkB,MAAe,UAAU,uBAA+B;AACxF,KAAI,KAAK,SAAS,aAChB,OAAM,IAAI,MAAM,QAAQ;AAE1B,QAAO,KAAK;;AAGd,SAAgB,wBAAwB,MAAe,UAAU,yCAAiD;AAChH,KAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,gBAC9C,QAAO,KAAK,SAAS,eAAe,KAAK,OAAO,KAAK;AAEvD,OAAM,IAAI,MAAM,QAAQ;;AAG1B,SAAgB,kBAAkB,OAAgB,WAA+B;AAC/E,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,MAAI,cAAc,KAAA,KAAa,MAAM,SAAS,UAC5C,OAAM,IAAI,oBACR,oBACA,yBAAyB,MAAM,OAAO,qBAAqB,UAAU,GACtE;AAEH,SAAO;;AAET,KAAI,SAAS;MAEP,OADc,MAA0C,OAAO,cAC3C,YAAY;GAClC,MAAM,SAAoB,EAAE;AAC5B,QAAK,MAAM,QAAQ,OAA4B;AAC7C,WAAO,KAAK,KAAK;AACjB,QAAI,cAAc,KAAA,KAAa,OAAO,SAAS,UAC7C,OAAM,IAAI,oBACR,oBACA,wCAAwC,UAAU,GACnD;;AAGL,UAAO;;;AAGX,OAAM,IAAI,gBAAgB,UAAU,qBAAqB,MAAM;;AAGjE,MAAM,kBAAkB,IAAI,IAAI,CAAC,WAAW,aAAa,CAAC;AAC1D,MAAM,mBAAmB;AAEzB,SAAgB,mBAAmB,YAAoB,MAAuB;AAC5E,KAAI,gBAAgB,IAAI,WAAW,CACjC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,OAAO,QAAQ,WACjB,OAAM,IAAI,gBAAgB,YAAY,gDAAgD,IAAI;AAE5F,MAAI,eAAe,OACjB,OAAM,IAAI,gBAAgB,YAAY,4CAA4C,IAAI;AAExF,MAAI,OAAO,QAAQ,OAAO,QAAQ,SAChC,OAAM,IAAI,gBAAgB,YAAY,8CAA8C,IAAI;;AAI9F,KAAI,eAAe,UAAU;EAC3B,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC7B,MAAI,CAAC,OAAO,SAAS,MAAM,IAAI,QAAQ,KAAK,QAAQ,iBAClD,OAAM,IAAI,gBAAgB,UAAU,yBAAyB,oBAAoB,KAAK,GAAG;;;AAK/F,SAAgB,aACd,QACA,cACA,UACA,eACA,OACS;CACT,MAAM,MAAM,WAAW,cAAc,cAAc,GAAG,kBAAkB,cAAc,+BAA+B;AACrH,OAAM,gBAAgB,KAAK,SAAS;AACpC,QAAQ,SAAqC;;;;ACjM/C,SAAS,cAAc,OAAgB,MAA2C,MAAuB;AACvG,KAAI,iBAAiB,QACnB,OAAM,IAAI,gBACR,MACA,iBAAiB,KAAK,+DACtB,MACD;AAEH,QAAO;;AAWT,SAAgB,SACd,MACA,SACA,UACA,OACA,QACS;AACT,QAAO,SAAS,MAAM;EACpB,KAAK;EACL,IAAI,SAAS;EACb,IAAI,SAAS;EACb,GAAG;EACH,GAAG;EACJ,CAAC;;AAGJ,SAAS,SAAS,MAAe,KAAuB;AAEtD,SAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;EACL,KAAK,iBACH,QAAO,KAAK;EACd,KAAK,cACH,QAAO;EACT,KAAK,mBACH;EACF,KAAK;AACH,OAAI,EAAE,gBAAgB,KAAK,MAAM,aAAa;AAC9C,UAAO,OAAO,OAAO,IAAI,KAAK,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAA;;AAIpE,QAAO,aAAa,MAAM,IAAI;;AAGhC,SAAS,aAAa,MAAe,KAAuB;CAC1D,MAAM,EAAE,GAAG,MAAM;AACjB,GAAE,YAAY;AACd,GAAE,MAAM;AAER,KAAI;AACF,UAAQ,KAAK,MAAb;GACE,KAAK,kBACH,QAAO,aAAa,KAAK,UAAU,SAAS,KAAK,SAAS,IAAI,CAAC;GAEjE,KAAK,oBAAoB;IACvB,MAAM,KAAK,KAAK;AAChB,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,SAAS,KAAK,MAAM,IAAI;AACrC,YAAO,OAAO,SAAS,KAAK,OAAO,IAAI,GAAG;;AAE5C,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,SAAS,KAAK,MAAM,IAAI;AACrC,YAAO,OAAO,OAAO,SAAS,KAAK,OAAO,IAAI;;AAEhD,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,SAAS,KAAK,MAAM,IAAI;AACrC,YAAO,QAAQ,OAAO,OAAO,SAAS,KAAK,OAAO,IAAI;;AAExD,WAAO,cAAc,IAAI,SAAS,KAAK,MAAM,IAAI,EAAE,SAAS,KAAK,OAAO,IAAI,CAAC;;GAG/E,KAAK,wBACH,QAAO,SAAS,KAAK,MAAM,IAAI,GAAG,SAAS,KAAK,YAAY,IAAI,GAAG,SAAS,KAAK,WAAW,IAAI;GAElG,KAAK,oBAAoB;IACvB,MAAM,SAAS,SAAS,KAAK,QAAQ,IAAI;IACzC,MAAM,gBAAgB,KAAK,WAAW,SAAS,KAAK,UAAU,IAAI,GAAG,KAAA;AACrE,QAAI;AACF,YAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;aACpE,GAAG;AACV,SAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,WAAM;;;GAIV,KAAK,4BAA4B;IAC/B,MAAM,SAAS,SAAS,KAAK,QAAQ,IAAI;AACzC,QAAI,UAAU,KAAM,QAAO,KAAA;IAC3B,MAAM,gBAAgB,KAAK,WAAW,SAAS,KAAK,UAAU,IAAI,GAAG,KAAA;AACrE,QAAI;AACF,YAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;aACpE,GAAG;AACV,SAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,WAAM;;;GAIV,KAAK,gBAAgB;IACnB,MAAM,WAAsB,EAAE;AAC9B,SAAK,MAAM,MAAM,KAAK,SACpB,KAAI,GAAG,SAAS,gBACd,UAAS,KAAK,GAAG,kBAAkB,SAAS,GAAG,UAAU,IAAI,EAAE,EAAE,OAAO,eAAe,CAAC;QAExF,UAAS,KAAK,SAAS,IAAI,IAAI,CAAC;AAGpC,MAAE,iBAAiB,SAAS,OAAO;AACnC,WAAO;;GAGT,KAAK,iBAAiB;IACpB,MAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,SAAK,MAAM,QAAQ,KAAK,YAAY;KAClC,MAAM,MAAMA,uBAAqB,MAAM,IAAI;AAC3C,SAAI,OAAO,SAAS,KAAK,OAAO,IAAI;;AAEtC,WAAO;;GAGT,KAAK,iBACH,QAAO,mBAAmB,MAAM,IAAI;GAEtC,KAAK,kBAAkB;IACrB,MAAM,QAAQ,SAAS,KAAK,OAAO,IAAI;AACvC,QAAI;AACF,YAAO,SAAS,OAAO,KAAK,WAAW,IAAI;aACpC,GAAG;AACV,SAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,UAAU,OAAO,KAAK,UAAU,IAAI;AACrE,WAAM;;;GAIV,KAAK,mBAAmB;IACtB,IAAI,SAAS;AACb,SAAK,MAAM,QAAQ,KAAK,MACtB,WAAU,KAAK,SAAS,kBAAkB,KAAK,QAAQ,OAAO,SAAS,MAAM,IAAI,CAAC;AAEpF,WAAO;;GAGT,KAAK,gBACH,QAAO,SAAS,KAAK,UAAU,IAAI;GAErC,KAAK,iBACH,QAAOC,qBAAmB,KAAK,UAAU,EAAE;GAE7C,KAAK,iBACH,SAAQ,SAAkB;GAE5B,KAAK,mBACH,SAAQ,SAAkB,eAAe,KAAK,MAAM,MAAM,IAAI;GAEhE,QACE,OAAM,IAAI,MAAM,sBAAuB,KAAiB,OAAO;;WAE3D;AACR,IAAE,WAAW;;;AAIjB,SAAS,mBAAmB,MAAoD,KAAuB;CACrG,MAAM,EAAE,IAAI,GAAG,MAAM;AAErB,KAAI,KAAK,OAAO,SAAS,sBAAsB,KAAK,OAAO,SAAS,4BAA4B;EAC9F,MAAM,MAAM,SAAS,KAAK,OAAO,QAAQ,IAAI;AAC7C,MAAI,KAAK,OAAO,SAAS,8BAA8B,OAAO,KAAM,QAAO,KAAA;EAC3E,MAAM,gBAAgB,KAAK,OAAO,WAAW,SAAS,KAAK,OAAO,UAAU,IAAI,GAAG,KAAA;EACnF,MAAM,aAAa,KAAK,OAAO,WAC3B,OAAO,cAAc,GACrB,kBAAkB,KAAK,OAAO,UAAU,uBAAuB;AAEnE,MAAI;GACF,MAAM,SAAS,mBAAmB,KAAK,YAAY,EAAE;GACrD,MAAM,OAAkB,EAAE;AAC1B,QAAK,MAAM,OAAO,KAAK,KACrB,kBAAiB,MAAM,KAAK,IAAI;AAElC,sBAAmB,YAAY,KAAK;AACpC,UAAO,cAAc,OAAO,KAAK,KAAK,GAAG,KAAK,EAAE,UAAU,WAAW;WAC9D,GAAG;AACV,OAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,SAAM;;;AAIV,KAAI,KAAK,OAAO,SAAS,aACvB,KAAI;EACF,MAAM,WAAW,gBAAgB,KAAK,OAAO,MAAM,GAAG;EACtD,MAAM,OAAkB,EAAE;AAC1B,OAAK,MAAM,OAAO,KAAK,KACrB,kBAAiB,MAAM,KAAK,IAAI;AAQlC,SAAO,cAHQ,SAAS,SAAS,YAC7B,SAAS,GAAG,IAAI,KAAK,GAAG,KAAK,GAC7B,SAAS,GAAG,GAAG,KAAK,EACK,YAAY,KAAK,OAAO,KAAK;UACnD,GAAG;AACV,MAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,QAAM;;AAIV,OAAM,IAAI,MAAM,6BAA6B;;AAG/C,SAAS,iBAAiB,MAAiB,MAAe,KAAoB;AAC5E,KAAI,KAAK,SAAS,iBAAiB;AACjC,OAAK,KAAK,GAAG,kBAAkB,SAAS,KAAK,UAAU,IAAI,EAAE,IAAI,EAAE,OAAO,eAAe,CAAC;AAC1F;;AAGF,MAAK,KAAK,QAAQ,MAAM,IAAI,CAAC;;AAG/B,SAAS,QAAQ,MAAe,KAAuB;AACrD,KAAI,KAAK,SAAS,iBAChB,QAAOA,qBAAmB,KAAK,UAAU,IAAI,EAAE;AAEjD,KAAI,KAAK,SAAS,iBAChB,SAAQ,SAAkB;AAE5B,QAAO,SAAS,MAAM,IAAI;;AAG5B,SAAS,SAAS,OAAgB,eAAwB,KAAuB;CAC/E,MAAM,EAAE,OAAO;AAEf,KAAI,cAAc,SAAS,kBAAkB;EAC3C,MAAM,aAAa,kBAAkB,cAAc,QAAQ,kCAAkC;EAC7F,MAAM,OAAO,iBAAiB,YAAY,GAAG;EAC7C,MAAM,OAAkB,EAAE;AAC1B,OAAK,MAAM,OAAO,cAAc,KAC9B,kBAAiB,MAAM,KAAK,IAAI;AAElC,SAAO,cAAc,KAAK,OAAO,GAAG,KAAK,EAAE,aAAa,WAAW;;AAGrE,KAAI,cAAc,SAAS,aACzB,QAAO,cAAc,iBAAiB,cAAc,MAAM,GAAG,CAAC,MAAM,EAAE,aAAa,cAAc,KAAK;AAGxG,OAAM,IAAI,MAAM,+BAA+B;;AAOjD,SAAS,eAAe,MAAe,MAAe,KAAuB;CAC3E,MAAM,EAAE,MAAM;AACd,GAAE,YAAY;AACd,GAAE,MAAM;CAER,IAAI,WAAW;AACf,KAAI;AACF,UAAQ,KAAK,MAAb;GACE,KAAK,iBACH,QAAO;GAET,KAAK;AACH,MAAE,gBAAgB,KAAK,UAAU,SAAS;AAC1C,WAAQ,OAAmC,KAAK;GAElD,KAAK,oBAAoB;IACvB,MAAM,SAAS,eAAe,KAAK,QAAQ,MAAM,IAAI;IACrD,MAAM,gBAAgB,KAAK,WAAW,SAAS,KAAK,UAAU,IAAI,GAAG,KAAA;AACrE,WAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;;GAG7E,KAAK,4BAA4B;IAC/B,MAAM,SAAS,eAAe,KAAK,QAAQ,MAAM,IAAI;AACrD,QAAI,UAAU,KAAM,QAAO,KAAA;IAC3B,MAAM,gBAAgB,KAAK,WAAW,SAAS,KAAK,UAAU,IAAI,GAAG,KAAA;AACrE,WAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;;GAG7E,KAAK;AACH,QAAI,KAAK,OAAO,SAAS,sBAAsB,KAAK,OAAO,SAAS,4BAA4B;KAC9F,MAAM,MAAM,eAAe,KAAK,OAAO,QAAQ,MAAM,IAAI;AACzD,SAAI,KAAK,OAAO,SAAS,8BAA8B,OAAO,KAAM,QAAO,KAAA;KAC3E,MAAM,gBAAgB,KAAK,OAAO,WAAW,SAAS,KAAK,OAAO,UAAU,IAAI,GAAG,KAAA;KACnF,MAAM,aAAa,KAAK,OAAO,WAC3B,OAAO,cAAc,GACrB,kBAAkB,KAAK,OAAO,UAAU,uBAAuB;KACnE,MAAM,SAAS,mBAAmB,KAAK,YAAY,EAAE;KACrD,MAAM,OAAkB,EAAE;AAC1B,UAAK,MAAM,OAAO,KAAK,KACrB,KAAI,IAAI,SAAS,gBACf,MAAK,KAAK,GAAG,kBAAkB,SAAS,IAAI,UAAU,IAAI,EAAE,EAAE,OAAO,eAAe,CAAC;SAErF,MAAK,KAAK,QAAQ,KAAK,IAAI,CAAC;AAGhC,wBAAmB,YAAY,KAAK;AACpC,YAAO,cAAc,OAAO,KAAK,KAAK,GAAG,KAAK,EAAE,UAAU,WAAW;;AAGvE,eAAW;AACX,MAAE,WAAW;AACb,WAAO,SAAS,MAAM,IAAI;GAG5B,KAAK,oBAAoB;IACvB,MAAM,KAAK,KAAK;AAChB,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,eAAe,KAAK,MAAM,MAAM,IAAI;AACjD,YAAO,OAAO,eAAe,KAAK,OAAO,MAAM,IAAI,GAAG;;AAExD,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,eAAe,KAAK,MAAM,MAAM,IAAI;AACjD,YAAO,OAAO,OAAO,eAAe,KAAK,OAAO,MAAM,IAAI;;AAE5D,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,eAAe,KAAK,MAAM,MAAM,IAAI;AACjD,YAAO,QAAQ,OAAO,OAAO,eAAe,KAAK,OAAO,MAAM,IAAI;;AAEpE,WAAO,cAAc,IAAI,eAAe,KAAK,MAAM,MAAM,IAAI,EAAE,eAAe,KAAK,OAAO,MAAM,IAAI,CAAC;;GAGvG,KAAK,kBACH,QAAO,aAAa,KAAK,UAAU,eAAe,KAAK,SAAS,MAAM,IAAI,CAAC;GAE7E,KAAK,wBACH,QAAO,eAAe,KAAK,MAAM,MAAM,IAAI,GACvC,eAAe,KAAK,YAAY,MAAM,IAAI,GAC1C,eAAe,KAAK,WAAW,MAAM,IAAI;GAE/C,KAAK,mBACH,QAAO,eAAe,KAAK,MAAM,MAAM,IAAI;GAE7C;AAEE,eAAW;AACX,MAAE,WAAW;AACb,WAAO,SAAS,MAAM,IAAI;;WAEtB;AACR,MAAI,SAAU,GAAE,WAAW;;;AAI/B,SAASD,uBAAqB,MAAsB,KAAsB;CACxE,MAAM,MAAM,KAAK,WAAW,OAAO,SAAS,KAAK,KAAK,IAAI,CAAC,GAAG,wBAAwB,KAAK,IAAI;AAC/F,KAAI,EAAE,gBAAgB,KAAK,aAAa;AACxC,QAAO;;AAGT,SAASC,qBAAmB,UAAkB,OAAqE;AACjH,SAAQ,SAAkC;AACxC,QAAM,gBAAgB,UAAU,SAAS;AACzC,SAAO,OAAO;;;;;ACzWlB,eAAsB,cACpB,MACA,SACA,UACA,OACA,QACkB;CAQlB,MAAM,SAAS,MAAM,cAAc,MAAM;EANvC,KAAK;EACL,IAAI,SAAS;EACb,IAAI,SAAS;EACb,GAAG;EACH,GAAG;EAEuC,CAAC;AAC7C,OAAM,cAAc;AACpB,QAAO;;AAGT,eAAe,cAAc,MAAe,KAAqC;AAE/E,SAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;EACL,KAAK,iBACH,QAAO,KAAK;EACd,KAAK,cACH,QAAO;EACT,KAAK,mBACH;EACF,KAAK;AACH,OAAI,EAAE,gBAAgB,KAAK,MAAM,aAAa;AAC9C,UAAO,OAAO,OAAO,IAAI,KAAK,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAA;;AAGpE,QAAO,kBAAkB,MAAM,IAAI;;AAGrC,eAAe,kBAAkB,MAAe,KAAqC;CACnF,MAAM,EAAE,GAAG,MAAM;AACjB,GAAE,YAAY;AACd,GAAE,MAAM;AAER,KAAI;AACF,UAAQ,KAAK,MAAb;GACE,KAAK,kBACH,QAAO,aAAa,KAAK,UAAU,MAAM,cAAc,KAAK,SAAS,IAAI,CAAC;GAE5E,KAAK,oBAAoB;IACvB,MAAM,KAAK,KAAK;AAChB,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,MAAM,cAAc,KAAK,MAAM,IAAI;AAChD,YAAO,OAAO,MAAM,cAAc,KAAK,OAAO,IAAI,GAAG;;AAEvD,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,MAAM,cAAc,KAAK,MAAM,IAAI;AAChD,YAAO,OAAO,OAAO,MAAM,cAAc,KAAK,OAAO,IAAI;;AAE3D,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,MAAM,cAAc,KAAK,MAAM,IAAI;AAChD,YAAO,QAAQ,OAAO,OAAO,MAAM,cAAc,KAAK,OAAO,IAAI;;AAEnE,WAAO,cAAc,IAAI,MAAM,cAAc,KAAK,MAAM,IAAI,EAAE,MAAM,cAAc,KAAK,OAAO,IAAI,CAAC;;GAGrG,KAAK,wBACH,QAAO,MAAM,cAAc,KAAK,MAAM,IAAI,GACtC,MAAM,cAAc,KAAK,YAAY,IAAI,GACzC,MAAM,cAAc,KAAK,WAAW,IAAI;GAE9C,KAAK,oBAAoB;IACvB,MAAM,SAAS,MAAM,cAAc,KAAK,QAAQ,IAAI;IACpD,MAAM,gBAAgB,KAAK,WAAW,MAAM,cAAc,KAAK,UAAU,IAAI,GAAG,KAAA;AAChF,QAAI;AACF,YAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;aACpE,GAAG;AACV,SAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,WAAM;;;GAIV,KAAK,4BAA4B;IAC/B,MAAM,SAAS,MAAM,cAAc,KAAK,QAAQ,IAAI;AACpD,QAAI,UAAU,KAAM,QAAO,KAAA;IAC3B,MAAM,gBAAgB,KAAK,WAAW,MAAM,cAAc,KAAK,UAAU,IAAI,GAAG,KAAA;AAChF,QAAI;AACF,YAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;aACpE,GAAG;AACV,SAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,WAAM;;;GAIV,KAAK,gBAAgB;IACnB,MAAM,WAAsB,EAAE;AAC9B,SAAK,MAAM,MAAM,KAAK,SACpB,KAAI,GAAG,SAAS,gBACd,UAAS,KAAK,GAAG,kBAAkB,MAAM,cAAc,GAAG,UAAU,IAAI,EAAE,EAAE,OAAO,eAAe,CAAC;QAEnG,UAAS,KAAK,MAAM,cAAc,IAAI,IAAI,CAAC;AAG/C,MAAE,iBAAiB,SAAS,OAAO;AACnC,WAAO;;GAGT,KAAK,iBAAiB;IACpB,MAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,SAAK,MAAM,QAAQ,KAAK,YAAY;KAClC,MAAM,MAAM,MAAM,qBAAqB,MAAM,IAAI;AACjD,SAAI,OAAO,MAAM,cAAc,KAAK,OAAO,IAAI;;AAEjD,WAAO;;GAGT,KAAK,iBACH,QAAO,MAAM,wBAAwB,MAAM,IAAI;GAEjD,KAAK,kBAAkB;IACrB,MAAM,QAAQ,MAAM,cAAc,KAAK,OAAO,IAAI;AAClD,QAAI;AACF,YAAO,MAAM,cAAc,OAAO,KAAK,WAAW,IAAI;aAC/C,GAAG;AACV,SAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,UAAU,OAAO,KAAK,UAAU,IAAI;AACrE,WAAM;;;GAIV,KAAK,mBAAmB;IACtB,IAAI,SAAS;AACb,SAAK,MAAM,QAAQ,KAAK,MACtB,WAAU,KAAK,SAAS,kBAAkB,KAAK,QAAQ,OAAO,MAAM,cAAc,MAAM,IAAI,CAAC;AAE/F,WAAO;;GAGT,KAAK,gBACH,QAAO,MAAM,cAAc,KAAK,UAAU,IAAI;GAEhD,KAAK,iBACH,QAAO,mBAAmB,KAAK,UAAU,EAAE;GAE7C,KAAK,iBACH,SAAQ,SAAkB;GAE5B,KAAK,mBACH,SAAQ,SAAkB,oBAAoB,KAAK,MAAM,MAAM,IAAI;GAErE,QACE,OAAM,IAAI,MAAM,sBAAuB,KAAiB,OAAO;;WAE3D;AACR,IAAE,WAAW;;;AAIjB,eAAe,wBACb,MACA,KACkB;CAClB,MAAM,EAAE,IAAI,GAAG,MAAM;AAErB,KAAI,KAAK,OAAO,SAAS,sBAAsB,KAAK,OAAO,SAAS,4BAA4B;EAC9F,MAAM,MAAM,MAAM,cAAc,KAAK,OAAO,QAAQ,IAAI;AACxD,MAAI,KAAK,OAAO,SAAS,8BAA8B,OAAO,KAAM,QAAO,KAAA;EAC3E,MAAM,gBAAgB,KAAK,OAAO,WAAW,MAAM,cAAc,KAAK,OAAO,UAAU,IAAI,GAAG,KAAA;EAC9F,MAAM,aAAa,KAAK,OAAO,WAC3B,OAAO,cAAc,GACrB,kBAAkB,KAAK,OAAO,UAAU,uBAAuB;AAEnE,MAAI;GACF,MAAM,SAAS,mBAAmB,KAAK,YAAY,EAAE;GACrD,MAAM,OAAkB,EAAE;AAC1B,QAAK,MAAM,OAAO,KAAK,KACrB,OAAM,sBAAsB,MAAM,KAAK,IAAI;AAE7C,sBAAmB,YAAY,KAAK;AAKpC,OAAI,MAAM,QAAQ,IAAI,IAAI,KAAK,WAAW,KAAK,OAAO,KAAK,OAAO,YAAY;IAC5E,MAAM,MAAM;IACZ,MAAM,YAAY,KAAK;IACvB,MAAM,cAAc,MAAM,qBAAqB,YAAY,KAAK,UAAU;AAC1E,QAAI,gBAAgB,KAAA,GAAW;AAC7B,OAAE,cAAc;AAChB,YAAO,YAAY;;;GAIvB,MAAM,SAAS,MAAM,OAAO,KAAK,KAAK,GAAG,KAAK;AAC9C,KAAE,cAAc;AAChB,UAAO;WACA,GAAG;AACV,OAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,SAAM;;;AAIV,KAAI,KAAK,OAAO,SAAS,aACvB,KAAI;EACF,MAAM,WAAW,gBAAgB,KAAK,OAAO,MAAM,GAAG;EACtD,MAAM,OAAkB,EAAE;AAC1B,OAAK,MAAM,OAAO,KAAK,KACrB,OAAM,sBAAsB,MAAM,KAAK,IAAI;EAI7C,MAAM,SAAS,SAAS,SAAS,YAC7B,MAAM,SAAS,GAAG,IAAI,KAAK,GAAG,KAAK,GACnC,MAAM,SAAS,GAAG,GAAG,KAAK;AAC9B,IAAE,cAAc;AAChB,SAAO;UACA,GAAG;AACV,MAAI,EAAG,gBAAe,GAAG,GAAG,KAAK,OAAO,KAAK,IAAI;AACjD,QAAM;;AAIV,OAAM,IAAI,MAAM,6BAA6B;;AAG/C,eAAe,sBAAsB,MAAiB,MAAe,KAAkC;AACrG,KAAI,KAAK,SAAS,iBAAiB;AACjC,OAAK,KAAK,GAAG,kBAAkB,MAAM,cAAc,KAAK,UAAU,IAAI,EAAE,IAAI,EAAE,OAAO,eAAe,CAAC;AACrG;;AAGF,MAAK,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC;;AAM1C,eAAe,qBACb,YACA,KACA,WACyC;AACzC,SAAQ,YAAR;EACE,KAAK,UAAU;GACb,MAAM,UAAU,IAAI,IAAI,UAAU;GAClC,MAAM,WAAW,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG;AACxF,UAAO,EAAE,OAAO,IAAI,QAAQ,GAAG,MAAM,SAAS,GAAG,EAAE;;EAErD,KAAK,OAAO;GACV,MAAM,UAAU,IAAI,IAAI,UAAU;AAClC,UAAO,EAAE,OAAO,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,SAAS;;EAElG,KAAK,QAAQ;GACX,MAAM,UAAU,IAAI,IAAI,UAAU;GAElC,MAAM,OADW,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,SACnE,UAAU,QAAQ;AACvC,UAAO,EAAE,OAAO,OAAO,IAAI,IAAI,OAAO,KAAA,GAAW;;EAEnD,KAAK,QAAQ;GACX,MAAM,UAAU,IAAI,IAAI,UAAU;AAElC,UAAO,EAAE,QADQ,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,SAC/D,KAAK,QAAQ,EAAE;;EAE1C,KAAK,SAAS;GACZ,MAAM,UAAU,IAAI,IAAI,UAAU;AAElC,UAAO,EAAE,QADQ,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,SAC/D,MAAM,QAAQ,EAAE;;EAE3C,KAAK,aAAa;GAChB,MAAM,UAAU,IAAI,IAAI,UAAU;AAElC,UAAO,EAAE,QADQ,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,SAC/D,UAAU,QAAQ,EAAE;;EAE/C,KAAK,WAAW;GACd,MAAM,UAAU,IAAI,IAAI,UAAU;AAElC,UAAO,EAAE,QADQ,QAAQ,MAAK,MAAK,aAAa,QAAQ,GAAG,MAAM,QAAQ,IAAI,QAAQ,GAAG,SAChD,MAAM,EAAE;;EAElD,QACE;;;AAIN,eAAe,aAAa,MAAe,KAAqC;AAC9E,KAAI,KAAK,SAAS,iBAChB,QAAO,mBAAmB,KAAK,UAAU,IAAI,EAAE;AAEjD,KAAI,KAAK,SAAS,iBAChB,SAAQ,SAAkB;AAE5B,QAAO,MAAM,cAAc,MAAM,IAAI;;AAGvC,eAAe,cAAc,OAAgB,eAAwB,KAAqC;CACxG,MAAM,EAAE,IAAI,MAAM;AAElB,KAAI,cAAc,SAAS,kBAAkB;EAE3C,MAAM,OAAO,iBADM,kBAAkB,cAAc,QAAQ,kCACnB,EAAE,GAAG;EAC7C,MAAM,OAAkB,EAAE;AAC1B,OAAK,MAAM,OAAO,cAAc,KAC9B,OAAM,sBAAsB,MAAM,KAAK,IAAI;EAE7C,MAAM,SAAS,MAAM,KAAK,OAAO,GAAG,KAAK;AACzC,IAAE,cAAc;AAChB,SAAO;;AAGT,KAAI,cAAc,SAAS,cAAc;EACvC,MAAM,SAAS,MAAM,iBAAiB,cAAc,MAAM,GAAG,CAAC,MAAM;AACpE,IAAE,cAAc;AAChB,SAAO;;AAGT,OAAM,IAAI,MAAM,+BAA+B;;AAGjD,eAAe,oBAAoB,MAAe,MAAe,KAAqC;CACpG,MAAM,EAAE,MAAM;AACd,GAAE,YAAY;AACd,GAAE,MAAM;CAER,IAAI,WAAW;AACf,KAAI;AACF,UAAQ,KAAK,MAAb;GACE,KAAK,iBACH,QAAO;GAET,KAAK;AACH,MAAE,gBAAgB,KAAK,UAAU,SAAS;AAC1C,WAAQ,OAAmC,KAAK;GAElD,KAAK,oBAAoB;IACvB,MAAM,SAAS,MAAM,oBAAoB,KAAK,QAAQ,MAAM,IAAI;IAChE,MAAM,gBAAgB,KAAK,WAAW,MAAM,cAAc,KAAK,UAAU,IAAI,GAAG,KAAA;AAChF,WAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;;GAG7E,KAAK,4BAA4B;IAC/B,MAAM,SAAS,MAAM,oBAAoB,KAAK,QAAQ,MAAM,IAAI;AAChE,QAAI,UAAU,KAAM,QAAO,KAAA;IAC3B,MAAM,gBAAgB,KAAK,WAAW,MAAM,cAAc,KAAK,UAAU,IAAI,GAAG,KAAA;AAChF,WAAO,aAAa,QAAQ,KAAK,UAAU,KAAK,UAAU,eAAe,EAAE;;GAG7E,KAAK;AACH,QAAI,KAAK,OAAO,SAAS,sBAAsB,KAAK,OAAO,SAAS,4BAA4B;KAC9F,MAAM,MAAM,MAAM,oBAAoB,KAAK,OAAO,QAAQ,MAAM,IAAI;AACpE,SAAI,KAAK,OAAO,SAAS,8BAA8B,OAAO,KAAM,QAAO,KAAA;KAC3E,MAAM,gBAAgB,KAAK,OAAO,WAAW,MAAM,cAAc,KAAK,OAAO,UAAU,IAAI,GAAG,KAAA;KAC9F,MAAM,aAAa,KAAK,OAAO,WAC3B,OAAO,cAAc,GACrB,kBAAkB,KAAK,OAAO,UAAU,uBAAuB;KACnE,MAAM,SAAS,mBAAmB,KAAK,YAAY,EAAE;KACrD,MAAM,OAAkB,EAAE;AAC1B,UAAK,MAAM,OAAO,KAAK,KACrB,KAAI,IAAI,SAAS,gBACf,MAAK,KAAK,GAAG,kBAAkB,MAAM,cAAc,IAAI,UAAU,IAAI,EAAE,EAAE,OAAO,eAAe,CAAC;SAEhG,MAAK,KAAK,MAAM,aAAa,KAAK,IAAI,CAAC;AAG3C,wBAAmB,YAAY,KAAK;AAGpC,SAAI,MAAM,QAAQ,IAAI,IAAI,KAAK,WAAW,KAAK,OAAO,KAAK,OAAO,YAAY;MAC5E,MAAM,cAAc,MAAM,qBAAqB,YAAY,KAAK,KAAK,GAAiC;AACtG,UAAI,gBAAgB,KAAA,GAAW;AAC7B,SAAE,cAAc;AAChB,cAAO,YAAY;;;AAIvB,YAAO,MAAM,OAAO,KAAK,KAAK,GAAG,KAAK;;AAExC,eAAW;AACX,MAAE,WAAW;AACb,WAAO,MAAM,cAAc,MAAM,IAAI;GAGvC,KAAK,oBAAoB;IACvB,MAAM,KAAK,KAAK;AAChB,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,MAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI;AAC5D,YAAO,OAAO,MAAM,oBAAoB,KAAK,OAAO,MAAM,IAAI,GAAG;;AAEnE,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,MAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI;AAC5D,YAAO,OAAO,OAAO,MAAM,oBAAoB,KAAK,OAAO,MAAM,IAAI;;AAEvE,QAAI,OAAO,MAAM;KACf,MAAM,OAAO,MAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI;AAC5D,YAAO,QAAQ,OAAO,OAAO,MAAM,oBAAoB,KAAK,OAAO,MAAM,IAAI;;AAE/E,WAAO,cAAc,IAAI,MAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI,EAAE,MAAM,oBAAoB,KAAK,OAAO,MAAM,IAAI,CAAC;;GAG7H,KAAK,kBACH,QAAO,aAAa,KAAK,UAAU,MAAM,oBAAoB,KAAK,SAAS,MAAM,IAAI,CAAC;GAExF,KAAK,wBACH,QAAO,MAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI,GAClD,MAAM,oBAAoB,KAAK,YAAY,MAAM,IAAI,GACrD,MAAM,oBAAoB,KAAK,WAAW,MAAM,IAAI;GAE1D,KAAK,mBACH,QAAO,MAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI;GAExD;AACE,eAAW;AACX,MAAE,WAAW;AACb,WAAO,MAAM,cAAc,MAAM,IAAI;;WAEjC;AACR,MAAI,SAAU,GAAE,WAAW;;;AAI/B,eAAe,qBAAqB,MAAsB,KAAoC;CAC5F,MAAM,MAAM,KAAK,WAAW,OAAO,MAAM,cAAc,KAAK,KAAK,IAAI,CAAC,GAAG,wBAAwB,KAAK,IAAI;AAC1G,KAAI,EAAE,gBAAgB,KAAK,aAAa;AACxC,QAAO;;AAGT,SAAS,mBAAmB,UAAkB,OAAqE;AACjH,SAAQ,SAAkC;AACxC,QAAM,gBAAgB,UAAU,SAAS;AACzC,SAAO,OAAO;;;;;AC7blB,IAAa,WAAb,MAA4B;CAC1B;CACA,sBAAuB,IAAI,KAAW;CAEtC;CACA;CAEA,YAAY,KAAa;AACvB,OAAK,MAAM,MAAM,IAAI,MAAM;;CAG7B,IAAI,KAAuB;AAEzB,MAAI,QAAQ,KAAK,QAAS,QAAO,KAAK;AAEtC,MAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAE,QAAO,KAAA;EAC/B,MAAM,QAAQ,KAAK,IAAI,IAAI,IAAI;AAE/B,OAAK,IAAI,OAAO,IAAI;AACpB,OAAK,IAAI,IAAI,KAAK,MAAM;AACxB,OAAK,UAAU;AACf,OAAK,YAAY;AACjB,SAAO;;CAGT,IAAI,KAAQ,OAAgB;AAC1B,MAAI,KAAK,QAAQ,EAAG;AAEpB,MAAI,KAAK,IAAI,IAAI,IAAI,CACnB,MAAK,IAAI,OAAO,IAAI;WACX,KAAK,IAAI,QAAQ,KAAK,KAAK;GAEpC,MAAM,SAAS,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC;AACtC,QAAK,IAAI,OAAO,OAAO;AACvB,OAAI,KAAK,YAAY,QAAQ;AAC3B,SAAK,UAAU,KAAA;AACf,SAAK,YAAY,KAAA;;;AAGrB,OAAK,IAAI,IAAI,KAAK,MAAM;AACxB,OAAK,UAAU;AACf,OAAK,YAAY;;CAGnB,IAAI,OAAe;AACjB,SAAO,KAAK,IAAI;;CAGlB,QAAc;AACZ,OAAK,IAAI,OAAO;AAChB,OAAK,UAAU,KAAA;AACf,OAAK,YAAY,KAAA;;;;;ACnBrB,SAAgB,uBAAuC;CACrD,MAAM,+BAAe,IAAI,KAA0B;CAKnD,MAAM,8BAAc,IAAI,KAAiC;CAGzD,IAAI,kBAA+C,EAAE;CACrD,IAAI,iBAAqD,EAAE;CAC3D,IAAI,kBAAkB;CACtB,IAAI,iBAAiB;CACrB,IAAI;CAEJ,MAAM,WAA2B;EAC/B,aAAa,MAAM,IAAI;AACrB,gBAAa,IAAI,MAAM,GAAG;AAC1B,qBAAkB;;EAEpB,YAAY,MAAM,IAAI;AACpB,eAAY,IAAI,MAAM;IAAE,MAAM;IAAQ;IAAI,CAAC;AAC3C,oBAAiB;;EAEnB,mBAAmB,MAAM,IAAI;AAC3B,eAAY,IAAI,MAAM;IAAE,MAAM;IAAW;IAAI,CAAC;AAC9C,oBAAiB;;EAEnB,gBAAgB,MAAM;GACpB,MAAM,IAAI,aAAa,OAAO,KAAK;AACnC,OAAI,EAAG,mBAAkB;AACzB,UAAO;;EAET,eAAe,MAAM;GACnB,MAAM,IAAI,YAAY,OAAO,KAAK;AAClC,OAAI,EAAG,kBAAiB;AACxB,UAAO;;EAET,aAAa,MAAM;AAAE,UAAO,aAAa,IAAI,KAAK;;EAClD,YAAY,MAAM;AAAE,UAAO,YAAY,IAAI,KAAK;;EAChD,kBAAkB,MAAM;AAAE,UAAO,YAAY,IAAI,KAAK,EAAE,SAAS;;EACjE,YAAY,MAAM;AAAE,UAAO,YAAY,IAAI,KAAK;;EAChD,oBAAoB;AAAE,UAAO,CAAC,GAAG,aAAa,MAAM,CAAC;;EACrD,mBAAmB;AAAE,UAAO,CAAC,GAAG,YAAY,MAAM,CAAC;;EACnD,IAAI,QAAQ;AAAE,UAAO,SAAS;;EAC9B,IAAI,aAAa;AACf,OAAI,iBAAiB;AACnB,sBAAkB,OAAO,YAAY,aAAa;AAClD,sBAAkB;;AAEpB,UAAO;;EAET,IAAI,YAAY;AACd,OAAI,gBAAgB;AAClB,qBAAiB,OAAO,YAAY,YAAY;AAChD,qBAAiB;;AAEnB,UAAO;;EAET,IAAI,WAAqB;GAGvB,MAAM,IAAI,SAAS;GACnB,MAAM,IAAI,SAAS;AACnB,OAAI,CAAC,iBAAiB,cAAc,eAAe,KAAK,cAAc,cAAc,EAClF,iBAAgB;IAAE,YAAY;IAAG,WAAW;IAAG;AAEjD,UAAO;;EAEV;AAED,QAAO;;;;AC7DT,MAAM,qBAAqB;AAG3B,IAAI;;;;;AAMJ,SAAgB,mBAAgC,YAAoB,SAAsC;AACxG,KAAI,CAAC,eAAgB,kBAAiB,QAAQ;AAC9C,QAAO,eAAe,aAAgB,YAAY,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0B5D,SAAgB,OACd,UAAyB,EAAE,EACL;CACtB,MAAM,WAAW,sBAAsB;CACvC,MAAM,QAAQ,IAAI,SAA2C,QAAQ,aAAa,mBAAmB;CACrG,MAAM,WAAW,IAAI,SAA0B,QAAQ,aAAa,mBAAmB;CAEvF,MAAM,SAAS,IAAI,eAAe,QAAQ;CAG1C,MAAM,UAAU,IAAI,iBAAiB,OAAO;CAC5C,IAAI,eAAe;CAEnB,SAAS,yBAA2C;AAClD,SAAO,IAAI,iBAAiB,OAAO;;CAGrC,SAAS,OAAO,QAAyB;EACvC,IAAI,MAAM,SAAS,IAAI,OAAO;AAC9B,MAAI,IAAK,QAAO;AAChB,QAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,WAAS,IAAI,QAAQ,IAAI;AACzB,SAAO;;CAGT,SAAS,YAAY,QAA0C;EAC7D,MAAM,SAAS,MAAM,IAAI,OAAO;AAChC,MAAI,OAAQ,QAAO;EAEnB,MAAM,YAAY,OAAO,OAAO;EAEhC,MAAM,WAAqC;GACzC,KAAK;GACL;GACA,MAAM,SAAsB,GAAG,MAAmC;AAEhE,WAAO,cAAc,WADR,KAAK,MAAM,EAAE,EACW,SAAS,UAAU,wBAAwB,EAAE,OAAO;;GAE3F,aAA0B,GAAG,MAAmC;IAC9D,MAAM,MAAO,KAAK,MAAM,EAAE;AAC1B,QAAI,aACF,QAAO,SAAS,WAAW,KAAK,SAAS,UAAU,wBAAwB,EAAE,OAAO;AAEtF,mBAAe;AACf,QAAI;AACF,aAAQ,OAAO;AACf,YAAO,SAAS,WAAW,KAAK,SAAS,UAAU,SAAS,OAAO;cAC3D;AACR,oBAAe;;;GAGpB;AAED,QAAM,IAAI,QAAQ,SAAS;AAC3B,SAAO;;CAGT,MAAM,WAAiC;EACrC,IAAI,QAAQ;AACV,UAAO,SAAS;AAChB,UAAO;;EAET,aAAa,MAAM,IAAI;AAAE,YAAS,aAAa,MAAM,GAAG;AAAE,UAAO;;EACjE,YAAY,MAAM,IAAI;AAAE,YAAS,YAAY,MAAM,GAAG;AAAE,UAAO;;EAC/D,mBAAmB,MAAM,IAAI;AAI3B,YAAS,mBAAmB,MAAM,GAAmC;AACrE,UAAO;;EAET,gBAAgB,MAAM;AAAE,UAAO,SAAS,gBAAgB,KAAK;;EAC7D,eAAe,MAAM;AAAE,UAAO,SAAS,eAAe,KAAK;;EAC3D,aAAa,MAAM;AAAE,UAAO,SAAS,aAAa,KAAK,KAAK,KAAA;;EAC5D,YAAY,MAAM;AAAE,UAAO,SAAS,YAAY,KAAK;;EACrD,kBAAkB,MAAM;AAAE,UAAO,SAAS,kBAAkB,KAAK;;EACjE,iBAAiB;AAAE,UAAO,SAAS,mBAAmB;;EACtD,gBAAgB;AAAE,UAAO,SAAS,kBAAkB;;EACpD,YAAY;AACV,UAAO;IACL,GAAI,OAAO,oBAAoB,EAAE,mBAAmB,CAAC,GAAG,OAAO,kBAAkB,EAAE,GAAG,EAAE;IACxF,GAAI,OAAO,mBAAmB,EAAE,kBAAkB,CAAC,GAAG,OAAO,iBAAiB,EAAE,GAAG,EAAE;IACtF;;EAEH,aAAa;AAAE,SAAM,OAAO;AAAE,YAAS,OAAO;;EAC9C,QAAQ,YAAY;AAAE,UAAO,YAAY,WAAW;;EACpD,MAAM,SAAsB,YAAoB,GAAG,MAAmC;AAGpF,UAAO,cAFK,OAAO,WAEK,EADX,KAAK,MAAM,EAAE,EACK,SAAS,UAAU,wBAAwB,EAAE,WAAW;;EAEzF,aAA0B,YAAoB,GAAG,MAAmC;GAElF,MAAM,MAAM,OAAO,WAAW;GAC9B,MAAM,MAAO,KAAK,MAAM,EAAE;AAC1B,OAAI,aAEF,QAAO,SAAS,KAAK,KAAK,SAAS,UAAU,wBAAwB,EAAE,WAAW;AAEpF,kBAAe;AACf,OAAI;AACF,YAAQ,OAAO;AACf,WAAO,SAAS,KAAK,KAAK,SAAS,UAAU,SAAS,WAAW;aACzD;AACR,mBAAe;;;EAGnB,SAAS,YAAY;AACnB,OAAI;IACF,MAAM,MAAM,MAAM,WAAW;AAC7B,WAAO;KAAE,OAAO;KAAM,QAAQ,EAAE;KAAE;KAAK,YAAY,kBAAkB,IAAI;KAAE;YACpE,OAAgB;IACvB,IAAI;AACJ,QAAI,iBAAiB,gBACnB,WAAU,MAAM;aACP,iBAAiB,MAC1B,WAAU,MAAM;QAEhB,WAAU,OAAO,MAAM;IAEzB,MAAM,EAAE,OAAO,QAAQ,iBAAiB,kBAAkB,QAAQ;KAAE,OAAO;KAAG,KAAK;KAAG;IACtF,MAAM,WAAW,iBAAiB,YAAY,MAAM;AACpD,WAAO;KACL,OAAO;KACP,QAAQ,CAAC;MACP;MACA,UAAU;OAAE,MAAM,SAAS;OAAM,QAAQ,SAAS;OAAQ;MAC1D,WAAW,iBAAiB,kBACxB,MAAM,UACN,YAAY,SAAS;OAAE,QAAQ;OAAY;OAAO;OAAK,CAAC;MAC7D,CAAC;KACH;;;EAGN;AAED,QAAO;;AAGT,SAAS,kBAAkB,MAAqC;CAC9D,MAAM,8BAAc,IAAI,KAAa;CACrC,MAAM,6BAAa,IAAI,KAAa;CACpC,MAAM,4BAAY,IAAI,KAAa;CAEnC,SAAS,KAAK,GAAkB;AAC9B,UAAQ,EAAE,MAAV;GACE,KAAK;AACH,gBAAY,IAAI,EAAE,KAAK;AACvB;GACF,KAAK;AACH,SAAK,EAAE,MAAM;AACb,QAAI,EAAE,UAAU,SAAS,aACvB,YAAW,IAAI,EAAE,UAAU,KAAK;aACvB,EAAE,UAAU,SAAS,kBAAkB;AAChD,SAAI,EAAE,UAAU,OAAO,SAAS,aAC9B,YAAW,IAAI,kBAAkB,EAAE,UAAU,OAAO,CAAC;AAEvD,OAAE,UAAU,KAAK,QAAQ,KAAK;;AAEhC;GACF,KAAK;AACH,QAAI,EAAE,OAAO,SAAS,aACpB,WAAU,IAAI,EAAE,OAAO,KAAK;QAE5B,MAAK,EAAE,OAAO;AAEhB,MAAE,KAAK,QAAQ,KAAK;AACpB;GACF,KAAK;AACH,SAAK,EAAE,KAAK;AACZ,SAAK,EAAE,MAAM;AACb;GACF,KAAK;AACH,SAAK,EAAE,QAAQ;AACf;GACF,KAAK;AACH,SAAK,EAAE,KAAK;AACZ,SAAK,EAAE,WAAW;AAClB,SAAK,EAAE,UAAU;AACjB;GACF,KAAK;GACL,KAAK;AACH,SAAK,EAAE,OAAO;AACd,QAAI,EAAE,SAAU,MAAK,EAAE,SAAS;AAChC;GACF,KAAK;AACH,MAAE,SAAS,QAAQ,KAAK;AACxB;GACF,KAAK;AACH,MAAE,WAAW,SAAQ,MAAK;AAAE,UAAK,EAAE,IAAI;AAAE,UAAK,EAAE,MAAM;MAAG;AACzD;GACF,KAAK;AACH,MAAE,MAAM,QAAQ,KAAK;AACrB;GACF,KAAK;AACH,SAAK,EAAE,SAAS;AAChB;GACF,KAAK;AACH,SAAK,EAAE,KAAK;AACZ;;;AAIN,MAAK,KAAK;AACV,QAAO;EACL,aAAa,CAAC,GAAG,YAAY;EAC7B,YAAY,CAAC,GAAG,WAAW;EAC3B,WAAW,CAAC,GAAG,UAAU;EAC1B"}
@@ -1,4 +1,4 @@
1
- import { i as BonsaiPlugin } from "../types-BhsZZsLY.mjs";
1
+ import { a as BonsaiPlugin } from "../types-C58c6SlH.mjs";
2
2
 
3
3
  //#region src/stdlib/strings.d.ts
4
4
  declare const strings: BonsaiPlugin;
@@ -1,4 +1,4 @@
1
- import { r as BonsaiTypeError } from "../errors-t5i9AEaf.mjs";
1
+ import { r as BonsaiTypeError } from "../errors-BONB6P_5.mjs";
2
2
  //#region src/stdlib/strings.ts
3
3
  function expectString$1(val, name) {
4
4
  if (typeof val !== "string") throw new BonsaiTypeError(name, "a string", val);