azurajs 3.0.5 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Logger-iEQNVVSc.d.mts +25 -0
- package/dist/Logger-iEQNVVSc.d.ts +25 -0
- package/dist/core/index.d.mts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +0 -1
- package/dist/core/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.d.mts +82 -24
- package/dist/logger/index.d.ts +82 -24
- package/dist/logger/index.js +154 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/logger/index.mjs +152 -2
- package/dist/logger/index.mjs.map +1 -1
- package/dist/utils/index.d.mts +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +0 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/logger/index.ts +9 -1
- package/src/types/logger.types.ts +15 -0
- package/src/types/utils/colors.type.ts +44 -0
- package/src/types/utils/icons.type.ts +11 -0
- package/src/utils/Logger.ts +0 -2
- package/src/utils/consoleLogger.ts +137 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
|
|
2
|
+
declare class Logger {
|
|
3
|
+
private level;
|
|
4
|
+
private useColors;
|
|
5
|
+
private showTimestamp;
|
|
6
|
+
private prefix;
|
|
7
|
+
constructor(options?: {
|
|
8
|
+
level?: LogLevel;
|
|
9
|
+
colors?: boolean;
|
|
10
|
+
timestamp?: boolean;
|
|
11
|
+
prefix?: string;
|
|
12
|
+
});
|
|
13
|
+
private shouldLog;
|
|
14
|
+
private timestamp;
|
|
15
|
+
private tag;
|
|
16
|
+
debug(message: string, ...args: any[]): void;
|
|
17
|
+
info(message: string, ...args: any[]): void;
|
|
18
|
+
warn(message: string, ...args: any[]): void;
|
|
19
|
+
error(message: string, ...args: any[]): void;
|
|
20
|
+
request(method: string, path: string, statusCode: number, duration: bigint): void;
|
|
21
|
+
banner(port: number, host: string): void;
|
|
22
|
+
setLevel(level: LogLevel): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { Logger as L };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
|
|
2
|
+
declare class Logger {
|
|
3
|
+
private level;
|
|
4
|
+
private useColors;
|
|
5
|
+
private showTimestamp;
|
|
6
|
+
private prefix;
|
|
7
|
+
constructor(options?: {
|
|
8
|
+
level?: LogLevel;
|
|
9
|
+
colors?: boolean;
|
|
10
|
+
timestamp?: boolean;
|
|
11
|
+
prefix?: string;
|
|
12
|
+
});
|
|
13
|
+
private shouldLog;
|
|
14
|
+
private timestamp;
|
|
15
|
+
private tag;
|
|
16
|
+
debug(message: string, ...args: any[]): void;
|
|
17
|
+
info(message: string, ...args: any[]): void;
|
|
18
|
+
warn(message: string, ...args: any[]): void;
|
|
19
|
+
error(message: string, ...args: any[]): void;
|
|
20
|
+
request(method: string, path: string, statusCode: number, duration: bigint): void;
|
|
21
|
+
banner(port: number, host: string): void;
|
|
22
|
+
setLevel(level: LogLevel): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { Logger as L };
|
package/dist/core/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { R as Router, a as RouteDocument } from '../index-j6QGMhZU.mjs';
|
|
2
2
|
import { Server } from 'node:http';
|
|
3
|
-
import { Logger } from '../
|
|
3
|
+
import { L as Logger } from '../Logger-iEQNVVSc.mjs';
|
|
4
4
|
import { M as MiddlewareHandler, E as ErrorHandler, H as HttpMethod } from '../common.type-BhGCNyEm.mjs';
|
|
5
5
|
import { A as AzuraConfig } from '../config.type-4K-xcMSy.mjs';
|
|
6
6
|
import { g as PluginHandler } from '../plugin.type-BNooWhKa.mjs';
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { R as Router, a as RouteDocument } from '../index-tpPZS_UK.js';
|
|
2
2
|
import { Server } from 'node:http';
|
|
3
|
-
import { Logger } from '../
|
|
3
|
+
import { L as Logger } from '../Logger-iEQNVVSc.js';
|
|
4
4
|
import { M as MiddlewareHandler, E as ErrorHandler, H as HttpMethod } from '../common.type-BhGCNyEm.js';
|
|
5
5
|
import { A as AzuraConfig } from '../config.type-s3ImgfM_.js';
|
|
6
6
|
import { g as PluginHandler } from '../plugin.type-D4HHceYz.js';
|
package/dist/core/index.js
CHANGED
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/router.ts","../../src/utils/Logger.ts","../../src/types/http/status.ts","../../src/utils/HttpError.ts","../../src/utils/Parser.ts","../../src/utils/IpResolver.ts","../../src/utils/cookies/CookieManager.ts","../../src/swagger/constants.ts","../../src/swagger/openapi-builder.ts","../../src/core/server.ts"],"names":["result","createHttpsServer","readFileSync","createServer"],"mappings":"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","file":"index.js","sourcesContent":["import type { HttpMethod, RouteHandler, MiddlewareHandler, RouteMatch } from \"../types/common.type.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\n\r\n/** Rota registada com metadados opcionais (OpenAPI / documentação). */\r\nexport interface RouteDocument {\r\n method: HttpMethod;\r\n path: string;\r\n meta?: RouteMeta;\r\n}\r\n\r\nconst PARAM_PREFIX = 58; // ':'\r\n\r\ninterface RadixNode {\r\n segment: string;\r\n children: Map<string, RadixNode>;\r\n paramChild: RadixNode | null;\r\n paramName: string;\r\n handlers: Map<HttpMethod, StoredRoute>;\r\n wildcardHandler: Map<HttpMethod, StoredRoute> | null;\r\n}\r\n\r\ninterface StoredRoute {\r\n handler: RouteHandler;\r\n middlewares: MiddlewareHandler[];\r\n meta?: Record<string, any>;\r\n}\r\n\r\nfunction createNode(segment: string = \"\"): RadixNode {\r\n return {\r\n segment,\r\n children: new Map(),\r\n paramChild: null,\r\n paramName: \"\",\r\n handlers: new Map(),\r\n wildcardHandler: null,\r\n };\r\n}\r\n\r\n/**\r\n * LRU Cache with O(1) get/set via doubly linked list + hash map.\r\n * Used for route lookup caching in hot paths.\r\n */\r\nclass LRUCache<K, V> {\r\n private capacity: number;\r\n private map: Map<K, { value: V; key: K; prev: any; next: any }>;\r\n private head: any;\r\n private tail: any;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.map = new Map();\r\n this.head = { prev: null, next: null };\r\n this.tail = { prev: null, next: null };\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n const node = this.map.get(key);\r\n if (!node) return undefined;\r\n this.moveToHead(node);\r\n return node.value;\r\n }\r\n\r\n set(key: K, value: V): void {\r\n const existing = this.map.get(key);\r\n if (existing) {\r\n existing.value = value;\r\n this.moveToHead(existing);\r\n return;\r\n }\r\n\r\n const node = { value, key, prev: null as any, next: null as any };\r\n this.map.set(key, node);\r\n this.addToHead(node);\r\n\r\n if (this.map.size > this.capacity) {\r\n const removed = this.removeTail();\r\n if (removed) this.map.delete(removed.key);\r\n }\r\n }\r\n\r\n private addToHead(node: any): void {\r\n node.prev = this.head;\r\n node.next = this.head.next;\r\n this.head.next.prev = node;\r\n this.head.next = node;\r\n }\r\n\r\n private removeNode(node: any): void {\r\n node.prev.next = node.next;\r\n node.next.prev = node.prev;\r\n }\r\n\r\n private moveToHead(node: any): void {\r\n this.removeNode(node);\r\n this.addToHead(node);\r\n }\r\n\r\n private removeTail(): any {\r\n const node = this.tail.prev;\r\n if (node === this.head) return null;\r\n this.removeNode(node);\r\n return node;\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n}\r\n\r\nexport class Router {\r\n private root: RadixNode = createNode();\r\n private cache: LRUCache<string, RouteMatch | null>;\r\n private staticRoutes: Map<string, StoredRoute> = new Map();\r\n\r\n constructor(cacheSize: number = 1024) {\r\n this.cache = new LRUCache(cacheSize);\r\n }\r\n\r\n add(\r\n method: HttpMethod,\r\n path: string,\r\n handler: RouteHandler,\r\n middlewares: MiddlewareHandler[] = [],\r\n meta?: Record<string, any>,\r\n ): void {\r\n this.cache.clear();\r\n const normalizedPath = this.normalizePath(path);\r\n const stored: StoredRoute = { handler, middlewares, meta };\r\n\r\n if (!normalizedPath.includes(\":\") && !normalizedPath.includes(\"*\")) {\r\n const key = `${method}:${normalizedPath}`;\r\n this.staticRoutes.set(key, stored);\r\n return;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n let node = this.root;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n if (seg === \"*\") {\r\n if (!node.wildcardHandler) {\r\n node.wildcardHandler = new Map();\r\n }\r\n node.wildcardHandler.set(method, stored);\r\n return;\r\n }\r\n\r\n if (seg.charCodeAt(0) === PARAM_PREFIX) {\r\n if (!node.paramChild) {\r\n node.paramChild = createNode(seg);\r\n node.paramChild.paramName = seg.slice(1);\r\n }\r\n node = node.paramChild;\r\n continue;\r\n }\r\n\r\n let child = node.children.get(seg);\r\n if (!child) {\r\n child = createNode(seg);\r\n node.children.set(seg, child);\r\n }\r\n node = child;\r\n }\r\n\r\n node.handlers.set(method, stored);\r\n }\r\n\r\n find(method: HttpMethod, path: string): RouteMatch | null {\r\n const normalizedPath = this.normalizePath(path);\r\n\r\n const staticKey = `${method}:${normalizedPath}`;\r\n const staticRoute = this.staticRoutes.get(staticKey);\r\n if (staticRoute) {\r\n return {\r\n handler: staticRoute.handler,\r\n params: {},\r\n middlewares: staticRoute.middlewares,\r\n meta: staticRoute.meta,\r\n };\r\n }\r\n\r\n const cacheKey = staticKey;\r\n const cached = this.cache.get(cacheKey);\r\n if (cached !== undefined) {\r\n return cached ? { ...cached, params: { ...cached.params } } : null;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n const params: Record<string, string> = {};\r\n const result = this.matchNode(this.root, segments, 0, params, method);\r\n\r\n if (result) {\r\n const match: RouteMatch = {\r\n handler: result.handler,\r\n params,\r\n middlewares: result.middlewares,\r\n meta: result.meta,\r\n };\r\n this.cache.set(cacheKey, match);\r\n return { ...match, params: { ...params } };\r\n }\r\n\r\n this.cache.set(cacheKey, null);\r\n return null;\r\n }\r\n\r\n private matchNode(\r\n node: RadixNode,\r\n segments: string[],\r\n idx: number,\r\n params: Record<string, string>,\r\n method: HttpMethod,\r\n ): StoredRoute | null {\r\n if (idx === segments.length) {\r\n return node.handlers.get(method) ?? null;\r\n }\r\n\r\n const seg = segments[idx];\r\n\r\n const child = node.children.get(seg);\r\n if (child) {\r\n const result = this.matchNode(child, segments, idx + 1, params, method);\r\n if (result) return result;\r\n }\r\n\r\n if (node.paramChild) {\r\n params[node.paramChild.paramName] = seg;\r\n const result = this.matchNode(node.paramChild, segments, idx + 1, params, method);\r\n if (result) return result;\r\n delete params[node.paramChild.paramName];\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n const route = node.wildcardHandler.get(method);\r\n if (route) return route;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private normalizePath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n if (path.endsWith(\"/\") && path.length > 1) return path.slice(0, -1);\r\n return path;\r\n }\r\n\r\n getAllRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.getRouteDocuments().map(({ method, path }) => ({ method, path }));\r\n }\r\n\r\n /**\r\n * Todas as rotas com metadados (ex.: OpenAPI) associados ao handler.\r\n */\r\n getRouteDocuments(): RouteDocument[] {\r\n const routes: RouteDocument[] = [];\r\n\r\n for (const [key, stored] of this.staticRoutes) {\r\n const [method, path] = key.split(\":\", 2) as [HttpMethod, string];\r\n routes.push({ method, path, meta: stored.meta });\r\n }\r\n\r\n this.collectRoutesWithMeta(this.root, \"\", routes);\r\n return routes;\r\n }\r\n\r\n private collectRoutesWithMeta(node: RadixNode, prefix: string, routes: RouteDocument[]): void {\r\n for (const [method, stored] of node.handlers) {\r\n routes.push({ method, path: prefix || \"/\", meta: stored.meta });\r\n }\r\n\r\n for (const [seg, child] of node.children) {\r\n this.collectRoutesWithMeta(child, `${prefix}/${seg}`, routes);\r\n }\r\n\r\n if (node.paramChild) {\r\n this.collectRoutesWithMeta(\r\n node.paramChild,\r\n `${prefix}/:${node.paramChild.paramName}`,\r\n routes,\r\n );\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n for (const [method, stored] of node.wildcardHandler) {\r\n routes.push({ method, path: `${prefix}/*`, meta: stored.meta });\r\n }\r\n }\r\n }\r\n}\r\n","type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\r\n\r\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst COLORS = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n gray: \"\\x1b[90m\",\r\n bgRed: \"\\x1b[41m\",\r\n bgGreen: \"\\x1b[42m\",\r\n bgYellow: \"\\x1b[43m\",\r\n bgBlue: \"\\x1b[44m\",\r\n} as const;\r\n\r\nconst METHOD_COLORS: Record<string, string> = {\r\n GET: COLORS.green,\r\n POST: COLORS.blue,\r\n PUT: COLORS.yellow,\r\n DELETE: COLORS.red,\r\n PATCH: COLORS.magenta,\r\n HEAD: COLORS.cyan,\r\n OPTIONS: COLORS.gray,\r\n};\r\n\r\nfunction statusColor(code: number): string {\r\n if (code < 200) return COLORS.gray;\r\n if (code < 300) return COLORS.green;\r\n if (code < 400) return COLORS.cyan;\r\n if (code < 500) return COLORS.yellow;\r\n return COLORS.red;\r\n}\r\n\r\nfunction formatDuration(ns: bigint): string {\r\n const us = Number(ns) / 1_000;\r\n if (us < 1_000) return `${us.toFixed(0)}µs`;\r\n const ms = us / 1_000;\r\n if (ms < 1_000) return `${ms.toFixed(1)}ms`;\r\n return `${(ms / 1_000).toFixed(2)}s`;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private useColors: boolean;\r\n private showTimestamp: boolean;\r\n private prefix: string;\r\n\r\n constructor(options: {\r\n level?: LogLevel;\r\n colors?: boolean;\r\n timestamp?: boolean;\r\n prefix?: string;\r\n } = {}) {\r\n this.level = options.level ?? \"info\";\r\n this.useColors = options.colors ?? process.stdout.isTTY !== false;\r\n this.showTimestamp = options.timestamp ?? true;\r\n this.prefix = options.prefix ?? \"azura\";\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];\r\n }\r\n\r\n private timestamp(): string {\r\n if (!this.showTimestamp) return \"\";\r\n const now = new Date();\r\n return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;\r\n }\r\n\r\n private tag(level: LogLevel): string {\r\n if (!this.useColors) return `[${level.toUpperCase()}]`;\r\n const colorMap: Record<string, string> = {\r\n debug: COLORS.gray,\r\n info: COLORS.blue,\r\n warn: COLORS.yellow,\r\n error: COLORS.red,\r\n };\r\n return `${colorMap[level] ?? \"\"}[${level.toUpperCase()}]${COLORS.reset}`;\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"debug\")) return;\r\n console.debug(`${this.timestamp()}${this.tag(\"debug\")} ${message}`, ...args);\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n console.info(`${this.timestamp()}${this.tag(\"info\")} ${message}`, ...args);\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"warn\")) return;\r\n console.warn(`${this.timestamp()}${this.tag(\"warn\")} ${message}`, ...args);\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"error\")) return;\r\n console.error(`${this.timestamp()}${this.tag(\"error\")} ${message}`, ...args);\r\n }\r\n\r\n request(method: string, path: string, statusCode: number, duration: bigint): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : \"\";\r\n const sc = this.useColors ? statusColor(statusCode) : \"\";\r\n const r = this.useColors ? COLORS.reset : \"\";\r\n const dur = formatDuration(duration);\r\n console.info(\r\n `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`,\r\n );\r\n }\r\n\r\n banner(port: number, host: string): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const c = this.useColors;\r\n const lines = [\r\n \"\",\r\n `${c ? COLORS.bold + COLORS.cyan : \"\"} ⚡ AzuraJS v3.0.0${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n `${c ? COLORS.green : \"\"} ➜ Local: ${c ? COLORS.bold : \"\"}http://${host}:${port}/${c ? COLORS.reset : \"\"}`,\r\n `${c ? COLORS.dim : \"\"} ➜ Press Ctrl+C to stop${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n ];\r\n console.info(lines.join(\"\\n\"));\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n","export const HttpStatus = {\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];\r\n\r\nexport const HttpStatusText: Record<number, string> = {\r\n 200: \"OK\",\r\n 201: \"Created\",\r\n 202: \"Accepted\",\r\n 204: \"No Content\",\r\n 301: \"Moved Permanently\",\r\n 302: \"Found\",\r\n 304: \"Not Modified\",\r\n 400: \"Bad Request\",\r\n 401: \"Unauthorized\",\r\n 403: \"Forbidden\",\r\n 404: \"Not Found\",\r\n 405: \"Method Not Allowed\",\r\n 409: \"Conflict\",\r\n 410: \"Gone\",\r\n 422: \"Unprocessable Entity\",\r\n 429: \"Too Many Requests\",\r\n 500: \"Internal Server Error\",\r\n 501: \"Not Implemented\",\r\n 502: \"Bad Gateway\",\r\n 503: \"Service Unavailable\",\r\n 504: \"Gateway Timeout\",\r\n};\r\n","import { HttpStatusText } from \"../types/http/status.js\";\r\n\r\nexport class HttpError extends Error {\r\n public readonly statusCode: number;\r\n public readonly details?: any;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(statusCode: number, message?: string, details?: any) {\r\n super(message ?? HttpStatusText[statusCode] ?? \"Unknown Error\");\r\n this.statusCode = statusCode;\r\n this.details = details;\r\n this.isOperational = true;\r\n Object.setPrototypeOf(this, HttpError.prototype);\r\n }\r\n\r\n toJSON(): Record<string, any> {\r\n const obj: Record<string, any> = {\r\n error: {\r\n statusCode: this.statusCode,\r\n message: this.message,\r\n },\r\n };\r\n if (this.details) obj.error.details = this.details;\r\n return obj;\r\n }\r\n\r\n static badRequest(message?: string, details?: any): HttpError {\r\n return new HttpError(400, message ?? \"Bad Request\", details);\r\n }\r\n\r\n static unauthorized(message?: string): HttpError {\r\n return new HttpError(401, message ?? \"Unauthorized\");\r\n }\r\n\r\n static forbidden(message?: string): HttpError {\r\n return new HttpError(403, message ?? \"Forbidden\");\r\n }\r\n\r\n static notFound(message?: string): HttpError {\r\n return new HttpError(404, message ?? \"Not Found\");\r\n }\r\n\r\n static methodNotAllowed(message?: string): HttpError {\r\n return new HttpError(405, message ?? \"Method Not Allowed\");\r\n }\r\n\r\n static conflict(message?: string, details?: any): HttpError {\r\n return new HttpError(409, message ?? \"Conflict\", details);\r\n }\r\n\r\n static unprocessableEntity(message?: string, details?: any): HttpError {\r\n return new HttpError(422, message ?? \"Unprocessable Entity\", details);\r\n }\r\n\r\n static tooManyRequests(message?: string): HttpError {\r\n return new HttpError(429, message ?? \"Too Many Requests\");\r\n }\r\n\r\n static internal(message?: string): HttpError {\r\n return new HttpError(500, message ?? \"Internal Server Error\");\r\n }\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nexport function parseQueryString(qs: string): Record<string, string | string[]> {\r\n const result: Record<string, string | string[]> = Object.create(null);\r\n if (!qs || qs.length === 0) return result;\r\n\r\n let key = \"\";\r\n let value = \"\";\r\n let startingKey = true;\r\n let i = qs.charCodeAt(0) === 63 ? 1 : 0; // skip leading ?\r\n\r\n for (; i < qs.length; i++) {\r\n const ch = qs.charCodeAt(i);\r\n\r\n if (ch === 61 /* = */ && startingKey) {\r\n startingKey = false;\r\n continue;\r\n }\r\n\r\n if (ch === 38 /* & */) {\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n key = \"\";\r\n value = \"\";\r\n startingKey = true;\r\n continue;\r\n }\r\n\r\n if (startingKey) {\r\n key += qs[i];\r\n } else {\r\n value += qs[i];\r\n }\r\n }\r\n\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction fastDecode(str: string): string {\r\n if (str.indexOf(\"%\") === -1 && str.indexOf(\"+\") === -1) return str;\r\n try {\r\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\nexport function parseCookies(header: string | undefined): Record<string, string> {\r\n const cookies: Record<string, string> = Object.create(null);\r\n if (!header) return cookies;\r\n\r\n let i = 0;\r\n const len = header.length;\r\n\r\n while (i < len) {\r\n while (i < len && header.charCodeAt(i) === 32) i++; // skip spaces\r\n\r\n let eqIdx = -1;\r\n let semiIdx = -1;\r\n for (let j = i; j < len; j++) {\r\n const ch = header.charCodeAt(j);\r\n if (ch === 61 && eqIdx === -1) eqIdx = j;\r\n if (ch === 59) { semiIdx = j; break; }\r\n }\r\n\r\n if (eqIdx === -1) {\r\n i = semiIdx === -1 ? len : semiIdx + 1;\r\n continue;\r\n }\r\n\r\n const end = semiIdx === -1 ? len : semiIdx;\r\n const name = header.slice(i, eqIdx).trim();\r\n let val = header.slice(eqIdx + 1, end).trim();\r\n\r\n if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {\r\n val = val.slice(1, -1);\r\n }\r\n\r\n if (cookies[name] === undefined) {\r\n cookies[name] = fastDecode(val);\r\n }\r\n\r\n i = end + 1;\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\nconst CONTENT_TYPE_JSON = \"application/json\";\r\nconst CONTENT_TYPE_FORM = \"application/x-www-form-urlencoded\";\r\n\r\nexport async function parseBody(req: IncomingMessage): Promise<any> {\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n const contentLength = req.headers[\"content-length\"];\r\n\r\n if (\r\n req.method === \"GET\" ||\r\n req.method === \"HEAD\" ||\r\n req.method === \"OPTIONS\" ||\r\n (contentLength !== undefined && contentLength === \"0\")\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n const maxSize = 10 * 1024 * 1024; // 10MB default\r\n\r\n return new Promise((resolve, reject) => {\r\n req.on(\"data\", (chunk: Buffer) => {\r\n totalSize += chunk.length;\r\n if (totalSize > maxSize) {\r\n req.destroy();\r\n reject(new Error(\"Request body too large\"));\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on(\"end\", () => {\r\n if (chunks.length === 0) {\r\n resolve(undefined);\r\n return;\r\n }\r\n\r\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\r\n\r\n if (contentType.startsWith(CONTENT_TYPE_JSON)) {\r\n try {\r\n resolve(JSON.parse(raw));\r\n } catch {\r\n resolve(raw);\r\n }\r\n } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {\r\n resolve(parseQueryString(raw));\r\n } else {\r\n resolve(raw);\r\n }\r\n });\r\n\r\n req.on(\"error\", reject);\r\n });\r\n}\r\n\r\nexport function parseUrl(url: string): { pathname: string; search: string } {\r\n let pathname = \"\";\r\n let search = \"\";\r\n let i = 0;\r\n\r\n for (; i < url.length; i++) {\r\n if (url.charCodeAt(i) === 63) { // ?\r\n pathname = url.slice(0, i);\r\n search = url.slice(i);\r\n return { pathname, search };\r\n }\r\n }\r\n\r\n return { pathname: url, search: \"\" };\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nconst PROXY_HEADERS = [\r\n \"x-forwarded-for\",\r\n \"x-real-ip\",\r\n \"cf-connecting-ip\",\r\n \"x-client-ip\",\r\n \"x-cluster-client-ip\",\r\n \"fastly-client-ip\",\r\n \"true-client-ip\",\r\n] as const;\r\n\r\nexport function resolveIp(req: IncomingMessage): string {\r\n for (const header of PROXY_HEADERS) {\r\n const val = req.headers[header];\r\n if (val) {\r\n const ip = typeof val === \"string\" ? val.split(\",\")[0].trim() : val[0];\r\n if (ip && ip.length > 0) return normalizeIp(ip);\r\n }\r\n }\r\n\r\n const remoteAddr = req.socket?.remoteAddress ?? \"127.0.0.1\";\r\n return normalizeIp(remoteAddr);\r\n}\r\n\r\nfunction normalizeIp(ip: string): string {\r\n if (ip === \"::1\" || ip === \"::ffff:127.0.0.1\") return \"127.0.0.1\";\r\n if (ip.startsWith(\"::ffff:\")) return ip.slice(7);\r\n return ip;\r\n}\r\n","import type { CookieOptions } from \"../../types/common.type.js\";\r\n\r\nexport function serializeCookie(\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {},\r\n): string {\r\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\r\n\r\n if (options.maxAge != null) {\r\n cookie += `; Max-Age=${Math.floor(options.maxAge)}`;\r\n }\r\n\r\n if (options.expires) {\r\n cookie += `; Expires=${options.expires.toUTCString()}`;\r\n }\r\n\r\n if (options.domain) {\r\n cookie += `; Domain=${options.domain}`;\r\n }\r\n\r\n cookie += `; Path=${options.path ?? \"/\"}`;\r\n\r\n if (options.secure) {\r\n cookie += \"; Secure\";\r\n }\r\n\r\n if (options.httpOnly !== false) {\r\n cookie += \"; HttpOnly\";\r\n }\r\n\r\n if (options.sameSite) {\r\n cookie += `; SameSite=${options.sameSite}`;\r\n }\r\n\r\n return cookie;\r\n}\r\n\r\nexport function clearCookieHeader(\r\n name: string,\r\n options: CookieOptions = {},\r\n): string {\r\n return serializeCookie(name, \"\", {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n","/** Tags OpenAPI a nível de controller (todas as rotas do class) */\r\nexport const API_TAGS_KEY = \"azura:api-tags\";\r\n\r\n/** Tags por método (independente da ordem em relação a @Get/@Post) */\r\nexport const METHOD_TAGS_KEY = \"azura:swagger-method-tags\";\r\n\r\n/** Metadados OpenAPI por método (summary, responses, etc.) */\r\nexport const API_OPERATION_KEY = \"azura:swagger-operation\";\r\n","import type { HttpMethod } from \"../types/common.type.js\";\r\nimport type { RouteDocument } from \"../core/router.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions, OpenApiInfo } from \"../types/swagger.type.js\";\r\n\r\nfunction resolveInfo(options: BuildOpenApiOptions): OpenApiInfo {\r\n return (\r\n options.info ?? {\r\n title: \"AzuraJS API\",\r\n version: \"1.0.0\",\r\n description: \"Generated OpenAPI specification\",\r\n }\r\n );\r\n}\r\n\r\n/** Converte path AzuraJS `/users/:id` → OpenAPI `/users/{id}` */\r\nexport function toOpenApiPath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n const mapped = path\r\n .split(\"/\")\r\n .map((seg) => {\r\n if (seg === \"*\") return \"{wildcard}\";\r\n return seg.startsWith(\":\") ? `{${seg.slice(1)}}` : seg;\r\n })\r\n .join(\"/\")\r\n .replace(/\\/{2,}/g, \"/\");\r\n if (mapped.endsWith(\"/*\")) {\r\n return mapped.slice(0, -2) + \"/{wildcard}\";\r\n }\r\n return mapped;\r\n}\r\n\r\nfunction pathParametersFromTemplate(path: string): Array<Record<string, unknown>> {\r\n const re = /\\{([^}]+)\\}/g;\r\n const out: Array<Record<string, unknown>> = [];\r\n let m: RegExpExecArray | null;\r\n const seen = new Set<string>();\r\n while ((m = re.exec(path)) !== null) {\r\n const name = m[1];\r\n if (seen.has(name)) continue;\r\n seen.add(name);\r\n out.push({\r\n name,\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nfunction defaultResponses(meta?: RouteMeta): Record<string, unknown> {\r\n if (meta?.responses && Object.keys(meta.responses).length > 0) {\r\n const out: Record<string, unknown> = {};\r\n for (const [code, r] of Object.entries(meta.responses)) {\r\n out[String(code)] = {\r\n description: r.description,\r\n ...(r.schema ? { content: { \"application/json\": { schema: r.schema } } } : {}),\r\n };\r\n }\r\n return out;\r\n }\r\n return {\r\n \"200\": {\r\n description: \"Successful response\",\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction mergeParameters(\r\n meta: RouteMeta | undefined,\r\n pathParams: Array<Record<string, unknown>>,\r\n): Array<Record<string, unknown>> {\r\n const fromMeta = meta?.parameters ?? [];\r\n const names = new Set(pathParams.map((p) => p.name as string));\r\n const rest = fromMeta.filter((p) => !(p.in === \"path\" && names.has(p.name)));\r\n const mapped = fromMeta\r\n .filter((p) => p.in === \"path\")\r\n .map((p) => ({\r\n name: p.name,\r\n in: \"path\",\r\n required: p.required ?? true,\r\n description: p.description,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n }));\r\n const pathMerged = [...pathParams];\r\n for (const m of mapped) {\r\n if (!pathMerged.find((x) => x.name === m.name)) pathMerged.push(m);\r\n }\r\n return [...pathMerged, ...rest.map((p) => mapParameter(p))];\r\n}\r\n\r\nfunction mapParameter(p: import(\"../types/routes.type.js\").ParameterMeta): Record<string, unknown> {\r\n const base: Record<string, unknown> = {\r\n name: p.name,\r\n in: p.in,\r\n required: p.required ?? (p.in === \"path\" ? true : false),\r\n description: p.description,\r\n };\r\n if (p.in === \"body\") {\r\n return {\r\n ...base,\r\n content: {\r\n \"application/json\": {\r\n schema: p.schema ?? { type: \"object\" },\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n ...base,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n };\r\n}\r\n\r\nfunction operationIdFor(method: HttpMethod, oPath: string): string {\r\n const slug = oPath\r\n .replace(/[/{}\\-*]/g, \"_\")\r\n .replace(/_+/g, \"_\")\r\n .replace(/^_|_$/g, \"\");\r\n return `${method.toLowerCase()}_${slug || \"root\"}`;\r\n}\r\n\r\nfunction operationForMethod(\r\n method: HttpMethod,\r\n oPath: string,\r\n meta: RouteMeta | undefined,\r\n): Record<string, unknown> {\r\n const op: Record<string, unknown> = {\r\n operationId: operationIdFor(method, oPath),\r\n summary: meta?.summary ?? `${method} ${oPath}`,\r\n ...(meta?.description ? { description: meta.description } : {}),\r\n ...(meta?.deprecated ? { deprecated: true } : {}),\r\n ...(meta?.tags?.length ? { tags: meta.tags } : {}),\r\n ...(meta?.security?.length ? { security: meta.security } : {}),\r\n };\r\n\r\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method) && !meta?.parameters?.some((x) => x.in === \"body\")) {\r\n op.requestBody = {\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n required: false,\r\n };\r\n }\r\n\r\n op.responses = defaultResponses(meta);\r\n return op;\r\n}\r\n\r\n/**\r\n * Gera documento OpenAPI 3.0 a partir das rotas registadas.\r\n */\r\nexport function buildOpenApiDocument(\r\n routes: RouteDocument[],\r\n options: BuildOpenApiOptions,\r\n): Record<string, unknown> {\r\n const info = resolveInfo(options);\r\n const prefix = options.pathPrefix ?? \"\";\r\n const paths: Record<string, Record<string, unknown>> = {};\r\n\r\n const seen = new Set<string>();\r\n for (const r of routes) {\r\n const full = prefix + r.path;\r\n const oPath = toOpenApiPath(full);\r\n const key = `${r.method}:${oPath}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const pathParams = pathParametersFromTemplate(oPath);\r\n const op = operationForMethod(r.method, oPath, r.meta);\r\n const parameters = mergeParameters(r.meta, pathParams);\r\n if (parameters.length) op.parameters = parameters;\r\n\r\n const methodLc = r.method.toLowerCase();\r\n if (!paths[oPath]) paths[oPath] = {};\r\n paths[oPath][methodLc] = op;\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: {\r\n title: info.title,\r\n version: info.version,\r\n ...(info.description ? { description: info.description } : {}),\r\n ...(info.contact ? { contact: info.contact } : {}),\r\n ...(info.license ? { license: info.license } : {}),\r\n },\r\n ...(options.servers?.length ? { servers: options.servers } : {}),\r\n paths,\r\n };\r\n}\r\n","import { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport { createServer as createHttpsServer } from \"node:https\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { Router } from \"./router.js\";\r\nimport { Logger } from \"../utils/Logger.js\";\r\nimport { HttpError } from \"../utils/HttpError.js\";\r\nimport { parseQueryString, parseCookies, parseBody, parseUrl } from \"../utils/Parser.js\";\r\nimport { resolveIp } from \"../utils/IpResolver.js\";\r\nimport { serializeCookie, clearCookieHeader } from \"../utils/cookies/CookieManager.js\";\r\nimport type {\r\n AzuraRequest,\r\n AzuraResponse,\r\n NextFunction,\r\n MiddlewareHandler,\r\n ErrorHandler,\r\n HttpMethod,\r\n CookieOptions,\r\n} from \"../types/common.type.js\";\r\nimport type { AzuraConfig } from \"../types/config.type.js\";\r\nimport type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { ControllerMetadata, RouteMeta, RouteMetadata } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions } from \"../types/swagger.type.js\";\r\nimport { API_OPERATION_KEY, API_TAGS_KEY, METHOD_TAGS_KEY } from \"../swagger/constants.js\";\r\nimport { buildOpenApiDocument } from \"../swagger/openapi-builder.js\";\r\n\r\nfunction isRouteDocumentMeta(o: unknown): o is RouteMeta {\r\n if (!o || typeof o !== \"object\" || Array.isArray(o)) return false;\r\n const x = o as Record<string, unknown>;\r\n return (\r\n \"summary\" in x ||\r\n \"description\" in x ||\r\n \"tags\" in x ||\r\n \"deprecated\" in x ||\r\n \"parameters\" in x ||\r\n \"responses\" in x ||\r\n \"security\" in x ||\r\n \"produces\" in x ||\r\n \"consumes\" in x\r\n );\r\n}\r\n\r\nconst CONTROLLER_META_KEY = \"azura:controller\";\r\nconst ROUTES_META_KEY = \"azura:routes\";\r\nconst PARAMS_META_KEY = \"azura:params\";\r\n\r\nexport class AzuraServer {\r\n private server: Server | null = null;\r\n private router: Router;\r\n private logger: Logger;\r\n private middlewares: MiddlewareHandler[] = [];\r\n private plugins: PluginHandler[] = [];\r\n private errorHandler: ErrorHandler | null = null;\r\n private config: AzuraConfig;\r\n private compiledChain: ((req: AzuraRequest, res: AzuraResponse) => Promise<void>) | null = null;\r\n\r\n constructor(config: AzuraConfig = {}) {\r\n this.config = {\r\n environment: config.environment ?? (process.env.NODE_ENV as any) ?? \"development\",\r\n server: {\r\n port: config.server?.port ?? 3000,\r\n host: config.server?.host ?? \"0.0.0.0\",\r\n keepAliveTimeout: config.server?.keepAliveTimeout ?? 72000,\r\n headersTimeout: config.server?.headersTimeout ?? 75000,\r\n requestTimeout: config.server?.requestTimeout ?? 30000,\r\n ...config.server,\r\n },\r\n logging: {\r\n enabled: config.logging?.enabled ?? true,\r\n level: config.logging?.level ?? \"info\",\r\n timestamp: config.logging?.timestamp ?? true,\r\n colors: config.logging?.colors ?? true,\r\n requestLogging: config.logging?.requestLogging ?? true,\r\n ...config.logging,\r\n },\r\n plugins: config.plugins ?? {},\r\n debug: config.debug ?? false,\r\n };\r\n\r\n this.router = new Router();\r\n this.logger = new Logger({\r\n level: this.config.logging?.enabled === false ? \"silent\" : this.config.logging?.level,\r\n colors: this.config.logging?.colors,\r\n timestamp: this.config.logging?.timestamp,\r\n });\r\n }\r\n\r\n use(handler: MiddlewareHandler | PluginHandler): this {\r\n this.compiledChain = null;\r\n if (handler.length <= 2) {\r\n this.plugins.push(handler as PluginHandler);\r\n } else {\r\n this.middlewares.push(handler as MiddlewareHandler);\r\n }\r\n return this;\r\n }\r\n\r\n plugin(handler: PluginHandler): this {\r\n this.compiledChain = null;\r\n this.plugins.push(handler);\r\n return this;\r\n }\r\n\r\n onError(handler: ErrorHandler): this {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n get(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"GET\", path, handlers);\r\n }\r\n\r\n post(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"POST\", path, handlers);\r\n }\r\n\r\n put(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PUT\", path, handlers);\r\n }\r\n\r\n delete(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"DELETE\", path, handlers);\r\n }\r\n\r\n patch(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PATCH\", path, handlers);\r\n }\r\n\r\n head(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"HEAD\", path, handlers);\r\n }\r\n\r\n options(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"OPTIONS\", path, handlers);\r\n }\r\n\r\n all(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n const methods: HttpMethod[] = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\n for (const method of methods) {\r\n this.route(method, path, handlers);\r\n }\r\n return this;\r\n }\r\n\r\n private route(method: HttpMethod, path: string, handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n let meta: RouteMeta | undefined;\r\n let list = handlers as unknown[];\r\n const last = list[list.length - 1];\r\n if (list.length >= 2 && isRouteDocumentMeta(last)) {\r\n meta = last;\r\n list = list.slice(0, -1);\r\n }\r\n if (list.length === 0) {\r\n throw new Error(`Route ${method} ${path} requires a handler function`);\r\n }\r\n const routeHandler = list[list.length - 1] as any;\r\n const middlewares = list.slice(0, -1) as MiddlewareHandler[];\r\n this.router.add(method, path, routeHandler, middlewares, meta);\r\n return this;\r\n }\r\n\r\n register(...controllers: (new (...args: any[]) => any)[]): this {\r\n for (const Controller of controllers) {\r\n this.registerController(Controller);\r\n }\r\n return this;\r\n }\r\n\r\n private registerController(Controller: new (...args: any[]) => any): void {\r\n const instance = new Controller();\r\n const prefix: string = Reflect.getMetadata?.(CONTROLLER_META_KEY, Controller) ?? \"\";\r\n const controllerMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", Controller) ?? [];\r\n const controllerTags: string[] = Reflect.getMetadata?.(API_TAGS_KEY, Controller) ?? [];\r\n\r\n const prototype = Controller.prototype;\r\n const propertyNames = Object.getOwnPropertyNames(prototype).filter(\r\n (p) => p !== \"constructor\",\r\n );\r\n\r\n for (const propertyKey of propertyNames) {\r\n const routeMeta: RouteMetadata | undefined = Reflect.getMetadata?.(\r\n ROUTES_META_KEY,\r\n prototype,\r\n propertyKey,\r\n );\r\n\r\n if (!routeMeta) continue;\r\n\r\n const fullPath = this.joinPaths(prefix, routeMeta.path);\r\n const paramsMeta = Reflect.getMetadata?.(PARAMS_META_KEY, prototype, propertyKey) ?? [];\r\n const routeMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", prototype, propertyKey) ?? [];\r\n\r\n const allMiddlewares = [...controllerMiddlewares, ...routeMiddlewares];\r\n\r\n const methodTags: string[] = Reflect.getMetadata?.(METHOD_TAGS_KEY, prototype, propertyKey) ?? [];\r\n const opExtra = (Reflect.getMetadata?.(API_OPERATION_KEY, prototype, propertyKey) ??\r\n {}) as Partial<RouteMeta>;\r\n const tagList = [...controllerTags, ...methodTags, ...(routeMeta.meta?.tags ?? [])];\r\n const mergedMeta: RouteMeta | undefined = (() => {\r\n const m = { ...routeMeta.meta, ...opExtra } as RouteMeta;\r\n if (tagList.length) m.tags = tagList;\r\n return Object.keys(m).length ? m : undefined;\r\n })();\r\n\r\n const handler = async (req: AzuraRequest, res: AzuraResponse) => {\r\n const args = this.resolveParams(paramsMeta, req, res);\r\n const result = await instance[propertyKey](...args);\r\n if (result !== undefined && !res.sent) {\r\n if (typeof result === \"object\") {\r\n res.json(result);\r\n } else {\r\n res.send(String(result));\r\n }\r\n }\r\n };\r\n\r\n this.router.add(routeMeta.method, fullPath, handler, allMiddlewares, mergedMeta);\r\n }\r\n }\r\n\r\n private resolveParams(paramsMeta: any[], req: AzuraRequest, res: AzuraResponse): any[] {\r\n if (!paramsMeta || paramsMeta.length === 0) return [req, res];\r\n\r\n const sorted = [...paramsMeta].sort((a, b) => a.index - b.index);\r\n const args: any[] = new Array(sorted.length);\r\n\r\n for (const meta of sorted) {\r\n let value: any;\r\n\r\n switch (meta.type) {\r\n case \"body\":\r\n value = meta.name ? req.body?.[meta.name] : req.body;\r\n break;\r\n case \"query\":\r\n value = meta.name ? req.query[meta.name] : req.query;\r\n break;\r\n case \"param\":\r\n value = meta.name ? req.params[meta.name] : req.params;\r\n break;\r\n case \"header\":\r\n value = meta.name ? req.headers[meta.name.toLowerCase()] : req.headers;\r\n break;\r\n case \"cookie\":\r\n value = meta.name ? req.cookies[meta.name] : req.cookies;\r\n break;\r\n case \"req\":\r\n value = req;\r\n break;\r\n case \"res\":\r\n value = res;\r\n break;\r\n case \"next\":\r\n value = () => {};\r\n break;\r\n case \"ip\":\r\n value = req.ip;\r\n break;\r\n case \"session\":\r\n value = req.session;\r\n break;\r\n default:\r\n value = undefined;\r\n }\r\n\r\n if (meta.pipes) {\r\n for (const pipe of meta.pipes) {\r\n value = pipe(value);\r\n }\r\n }\r\n\r\n args[meta.index] = value;\r\n }\r\n\r\n return args;\r\n }\r\n\r\n private joinPaths(prefix: string, path: string): string {\r\n const p = prefix.endsWith(\"/\") ? prefix.slice(0, -1) : prefix;\r\n const s = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${p}${s}`;\r\n }\r\n\r\n private extendRequest(req: IncomingMessage, pathname: string, query: Record<string, string | string[]>): AzuraRequest {\r\n const azReq = req as AzuraRequest;\r\n azReq.pathname = pathname;\r\n azReq.query = query;\r\n azReq.params = {};\r\n azReq.cookies = parseCookies(req.headers.cookie);\r\n azReq.ip = resolveIp(req);\r\n azReq.protocol = (req.socket as any).encrypted ? \"https\" : \"http\";\r\n azReq.secure = azReq.protocol === \"https\";\r\n azReq.hostname = (req.headers.host ?? \"localhost\").split(\":\")[0];\r\n azReq.startTime = process.hrtime.bigint();\r\n azReq.raw = req;\r\n return azReq;\r\n }\r\n\r\n private extendResponse(res: ServerResponse): AzuraResponse {\r\n const azRes = res as AzuraResponse;\r\n azRes.locals = {};\r\n azRes.sent = false;\r\n\r\n azRes.status = function (code: number) {\r\n this.statusCode = code;\r\n return this;\r\n };\r\n\r\n azRes.json = function (data: unknown) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n const body = JSON.stringify(data);\r\n this.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.send = function (body: string | Buffer) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n if (!this.getHeader(\"Content-Type\")) {\r\n this.setHeader(\"Content-Type\", typeof body === \"string\" ? \"text/plain; charset=utf-8\" : \"application/octet-stream\");\r\n }\r\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\r\n this.setHeader(\"Content-Length\", buf.length);\r\n this.end(buf);\r\n };\r\n\r\n azRes.html = function (body: string) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.redirect = function (url: string, code = 302) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.statusCode = code;\r\n this.setHeader(\"Location\", url);\r\n this.end();\r\n };\r\n\r\n azRes.cookie = function (name: string, value: string, options?: CookieOptions) {\r\n const header = serializeCookie(name, value, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.clearCookie = function (name: string, options?: CookieOptions) {\r\n const header = clearCookieHeader(name, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.header = function (name: string, value: string | number | string[]) {\r\n this.setHeader(name, value as any);\r\n return this;\r\n };\r\n\r\n azRes.type = function (contentType: string) {\r\n this.setHeader(\"Content-Type\", contentType);\r\n return this;\r\n };\r\n\r\n azRes.attachment = function (filename?: string) {\r\n if (filename) {\r\n this.setHeader(\"Content-Disposition\", `attachment; filename=\"${filename}\"`);\r\n } else {\r\n this.setHeader(\"Content-Disposition\", \"attachment\");\r\n }\r\n return this;\r\n };\r\n\r\n azRes.download = function (_path: string, _filename?: string) {\r\n // TODO: implement file streaming\r\n };\r\n\r\n return azRes;\r\n }\r\n\r\n private compileMiddlewareChain(): (req: AzuraRequest, res: AzuraResponse) => Promise<void> {\r\n if (this.compiledChain) return this.compiledChain;\r\n\r\n const self = this;\r\n const globalMiddlewares = [...this.middlewares];\r\n\r\n this.compiledChain = async (req: AzuraRequest, res: AzuraResponse) => {\r\n for (const plugin of self.plugins) {\r\n if (res.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = plugin({ req, res }, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (res.sent) return;\r\n\r\n let idx = 0;\r\n const runMiddleware = async (): Promise<void> => {\r\n if (idx >= globalMiddlewares.length || res.sent) return;\r\n const mw = globalMiddlewares[idx++];\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(req, res, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n await runMiddleware();\r\n };\r\n\r\n await runMiddleware();\r\n };\r\n\r\n return this.compiledChain;\r\n }\r\n\r\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n const { pathname, search } = parseUrl(req.url ?? \"/\");\r\n const query = parseQueryString(search);\r\n\r\n const azReq = this.extendRequest(req, pathname, query);\r\n const azRes = this.extendResponse(res);\r\n\r\n try {\r\n const chain = this.compileMiddlewareChain();\r\n await chain(azReq, azRes);\r\n\r\n if (azRes.sent) return;\r\n\r\n const method = (req.method ?? \"GET\").toUpperCase() as HttpMethod;\r\n const match = this.router.find(method, pathname);\r\n\r\n if (!match) {\r\n if (pathname === \"/favicon.ico\") {\r\n azRes.status(204).send(\"\");\r\n return;\r\n }\r\n throw HttpError.notFound(`Route ${method} ${pathname} not found`);\r\n }\r\n\r\n azReq.params = match.params;\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\") {\r\n azReq.body = await parseBody(req);\r\n }\r\n\r\n for (const mw of match.middlewares) {\r\n if (azRes.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(azReq, azRes, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (azRes.sent) return;\r\n\r\n const result = await match.handler(azReq, azRes);\r\n\r\n if (result !== undefined && !azRes.sent) {\r\n if (typeof result === \"object\" && result !== null) {\r\n azRes.json(result);\r\n } else {\r\n azRes.send(String(result));\r\n }\r\n }\r\n } catch (err) {\r\n this.handleError(err, azReq, azRes);\r\n } finally {\r\n if (this.config.logging?.requestLogging) {\r\n const duration = process.hrtime.bigint() - azReq.startTime;\r\n this.logger.request(\r\n req.method ?? \"GET\",\r\n pathname,\r\n res.statusCode,\r\n duration,\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleError(err: any, req: AzuraRequest, res: AzuraResponse): void {\r\n if (res.sent) return;\r\n\r\n if (this.errorHandler) {\r\n try {\r\n this.errorHandler(err, req, res, () => {});\r\n return;\r\n } catch (handlerErr) {\r\n this.logger.error(\"Error handler threw:\", handlerErr);\r\n }\r\n }\r\n\r\n if (err instanceof HttpError) {\r\n res.status(err.statusCode).json(err.toJSON());\r\n return;\r\n }\r\n\r\n const statusCode = err?.statusCode ?? err?.status ?? 500;\r\n const message = this.config.environment === \"production\"\r\n ? \"Internal Server Error\"\r\n : err?.message ?? \"Internal Server Error\";\r\n\r\n this.logger.error(`Unhandled error: ${err?.message ?? err}`);\r\n if (this.config.debug && err?.stack) {\r\n this.logger.error(err.stack);\r\n }\r\n\r\n res.status(statusCode).json({\r\n error: {\r\n statusCode,\r\n message,\r\n ...(this.config.debug ? { stack: err?.stack } : {}),\r\n },\r\n });\r\n }\r\n\r\n async listen(port?: number, callback?: () => void): Promise<Server> {\r\n const serverPort = port ?? this.config.server?.port ?? 3000;\r\n const host = this.config.server?.host ?? \"0.0.0.0\";\r\n\r\n const handler = (req: IncomingMessage, res: ServerResponse) => {\r\n this.handleRequest(req, res).catch((err) => {\r\n this.logger.error(\"Fatal request error:\", err);\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.end('{\"error\":{\"statusCode\":500,\"message\":\"Internal Server Error\"}}');\r\n }\r\n });\r\n };\r\n\r\n if (this.config.server?.https) {\r\n const httpsConfig = this.config.server.https;\r\n this.server = createHttpsServer(\r\n {\r\n key: readFileSync(httpsConfig.key),\r\n cert: readFileSync(httpsConfig.cert),\r\n ...(httpsConfig.ca ? { ca: readFileSync(httpsConfig.ca) } : {}),\r\n },\r\n handler,\r\n );\r\n } else {\r\n this.server = createServer(handler);\r\n }\r\n\r\n if (this.config.server?.keepAliveTimeout) {\r\n this.server.keepAliveTimeout = this.config.server.keepAliveTimeout;\r\n }\r\n if (this.config.server?.headersTimeout) {\r\n this.server.headersTimeout = this.config.server.headersTimeout;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this.server!.listen(serverPort, host, () => {\r\n this.logger.banner(serverPort, host);\r\n callback?.();\r\n resolve(this.server!);\r\n });\r\n });\r\n }\r\n\r\n async close(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n resolve();\r\n return;\r\n }\r\n this.server.close((err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n });\r\n }\r\n\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n getLogger(): Logger {\r\n return this.logger;\r\n }\r\n\r\n getConfig(): AzuraConfig {\r\n return this.config;\r\n }\r\n\r\n getRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.router.getAllRoutes();\r\n }\r\n\r\n /** Rotas com metadados OpenAPI (para Swagger ou export manual). */\r\n getRouteDocuments() {\r\n return this.router.getRouteDocuments();\r\n }\r\n\r\n /** Gera documento OpenAPI 3.0 a partir das rotas registadas. */\r\n getOpenApiDocument(options: BuildOpenApiOptions = {}) {\r\n return buildOpenApiDocument(this.getRouteDocuments(), options);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/router.ts","../../src/utils/Logger.ts","../../src/types/http/status.ts","../../src/utils/HttpError.ts","../../src/utils/Parser.ts","../../src/utils/IpResolver.ts","../../src/utils/cookies/CookieManager.ts","../../src/swagger/constants.ts","../../src/swagger/openapi-builder.ts","../../src/core/server.ts"],"names":["result","createHttpsServer","readFileSync","createServer"],"mappings":";;;;;;;;;AAUA,IAAM,YAAA,GAAe,EAAA;AAiBrB,SAAS,UAAA,CAAW,UAAkB,EAAA,EAAe;AACnD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,QAAA,sBAAc,GAAA,EAAI;AAAA,IAClB,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,EAAA;AAAA,IACX,QAAA,sBAAc,GAAA,EAAI;AAAA,IAClB,eAAA,EAAiB;AAAA,GACnB;AACF;AAMA,IAAM,WAAN,MAAqB;AAAA,EACX,QAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EAER,YAAY,QAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,GAAA,uBAAU,GAAA,EAAI;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AACrC,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACxB;AAAA,EAEA,IAAI,GAAA,EAAuB;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,GAAA,CAAI,KAAQ,KAAA,EAAgB;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AACjB,MAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,EAAE,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,EAAa,MAAM,IAAA,EAAY;AAChE,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAEnB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,IAAA,CAAK,QAAA,EAAU;AACjC,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,IAAI,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,GAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,UAAU,IAAA,EAAiB;AACjC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AACtB,IAAA,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAAA,EACnB;AAAA,EAEQ,WAAW,IAAA,EAAiB;AAClC,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACxB;AAAA,EAEQ,WAAW,IAAA,EAAiB;AAClC,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,IAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EACrB;AAAA,EAEQ,UAAA,GAAkB;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AACvB,IAAA,IAAI,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AAC/B,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACxB;AACF,CAAA;AAEO,IAAM,SAAN,MAAa;AAAA,EACV,OAAkB,UAAA,EAAW;AAAA,EAC7B,KAAA;AAAA,EACA,YAAA,uBAA6C,GAAA,EAAI;AAAA,EAEzD,WAAA,CAAY,YAAoB,IAAA,EAAM;AACpC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,SAAS,CAAA;AAAA,EACrC;AAAA,EAEA,IACE,MAAA,EACA,IAAA,EACA,SACA,WAAA,GAAmC,IACnC,IAAA,EACM;AACN,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAsB,EAAE,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK;AAEzD,IAAA,IAAI,CAAC,eAAe,QAAA,CAAS,GAAG,KAAK,CAAC,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA,EAAG;AAClE,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACzD,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAEhB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AAEtB,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,UAAA,IAAA,CAAK,eAAA,uBAAsB,GAAA,EAAI;AAAA,QACjC;AACA,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AACvC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,KAAM,YAAA,EAAc;AACtC,QAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,UAAA,IAAA,CAAK,UAAA,GAAa,WAAW,GAAG,CAAA;AAChC,UAAA,IAAA,CAAK,UAAA,CAAW,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AAAA,QACzC;AACA,QAAA,IAAA,GAAO,IAAA,CAAK,UAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACjC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,WAAW,GAAG,CAAA;AACtB,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MAC9B;AACA,MAAA,IAAA,GAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,EAClC;AAAA,EAEA,IAAA,CAAK,QAAoB,IAAA,EAAiC;AACxD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAE9C,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO;AAAA,QACL,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,QAAQ,EAAC;AAAA,QACT,aAAa,WAAA,CAAY,WAAA;AAAA,QACzB,MAAM,WAAA,CAAY;AAAA,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,SAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,EAAE,GAAG,MAAA,CAAO,MAAA,EAAO,EAAE,GAAI,IAAA;AAAA,IAChE;AAEA,IAAA,MAAM,WAAW,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACzD,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,QAAA,EAAU,CAAA,EAAG,QAAQ,MAAM,CAAA;AAEpE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,MAAA;AAAA,QACA,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,MAAM,MAAA,CAAO;AAAA,OACf;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAC9B,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,EAAE,GAAG,QAAO,EAAE;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,SAAA,CACN,IAAA,EACA,QAAA,EACA,GAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,GAAA,KAAQ,SAAS,MAAA,EAAQ;AAC3B,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,IACtC;AAEA,IAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,KAAA,EAAO,UAAU,GAAA,GAAM,CAAA,EAAG,QAAQ,MAAM,CAAA;AACtE,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAEA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,GAAI,GAAA;AACpC,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,IAAA,CAAK,YAAY,QAAA,EAAU,GAAA,GAAM,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAChF,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAC7C,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,cAAc,IAAA,EAAsB;AAC1C,IAAA,IAAI,IAAA,KAAS,KAAK,OAAO,GAAA;AACzB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAA4D;AAC1D,IAAA,OAAO,IAAA,CAAK,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,EAAE,MAAA,EAAQ,IAAA,EAAK,MAAO,EAAE,MAAA,EAAQ,IAAA,EAAK,CAAE,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAqC;AACnC,IAAA,MAAM,SAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,KAAK,YAAA,EAAc;AAC7C,MAAA,MAAM,CAAC,MAAA,EAAQ,IAAI,IAAI,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AACvC,MAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,qBAAA,CAAsB,IAAA,EAAiB,MAAA,EAAgB,MAAA,EAA+B;AAC5F,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,QAAA,EAAU;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAU,GAAA,EAAK,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IAChE;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAK,QAAA,EAAU;AACxC,MAAA,IAAA,CAAK,sBAAsB,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,IAAI,MAAM,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,qBAAA;AAAA,QACH,IAAA,CAAK,UAAA;AAAA,QACL,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,WAAW,SAAS,CAAA,CAAA;AAAA,QACvC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,eAAA,EAAiB;AACnD,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA,EAAM,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;;;ACpSA,IAAM,cAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,MAAA,GAAS;AAAA,EACb,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,UAKR,CAAA;AAEA,IAAM,aAAA,GAAwC;AAAA,EAC5C,KAAK,MAAA,CAAO,KAAA;AAAA,EACZ,MAAM,MAAA,CAAO,IAAA;AAAA,EACb,KAAK,MAAA,CAAO,MAAA;AAAA,EACZ,QAAQ,MAAA,CAAO,GAAA;AAAA,EACf,OAAO,MAAA,CAAO,OAAA;AAAA,EACd,MAAM,MAAA,CAAO,IAAA;AAAA,EACb,SAAS,MAAA,CAAO;AAClB,CAAA;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,IAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,KAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,IAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,MAAA;AAC9B,EAAA,OAAO,MAAA,CAAO,GAAA;AAChB;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AACxB,EAAA,IAAI,KAAK,GAAA,EAAO,OAAO,GAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAA;AACvC,EAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,EAAA,IAAI,KAAK,GAAA,EAAO,OAAO,GAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACvC,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACnC;AAEO,IAAM,SAAN,MAAa;AAAA,EACV,KAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAKR,EAAC,EAAG;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,OAAO,KAAA,KAAU,KAAA;AAC5D,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,SAAA,IAAa,IAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AAAA,EAClC;AAAA,EAEQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,EAC3D;AAAA,EAEQ,SAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,OAAO,EAAA;AAChC,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAG,GAAA,CAAI,WAAA,EAAY,CAAE,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,EAAG,OAAO,KAAK,CAAA,CAAA,CAAA;AAAA,EACxE;AAAA,EAEQ,IAAI,KAAA,EAAyB;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,SAAkB,CAAA,CAAA,EAAI,KAAA,CAAM,aAAa,CAAA,CAAA,CAAA;AACnD,IAAA,MAAM,QAAA,GAAmC;AAAA,MACvC,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,MAAA;AAAA,MACb,OAAO,MAAA,CAAO;AAAA,KAChB;AACA,IAAA,OAAO,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,IAAK,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,EACxE;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC7E;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAmB;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3E;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAmB;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3E;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC7E;AAAA,EAEA,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,UAAA,EAAoB,QAAA,EAAwB;AAChF,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAK,IAAA,CAAK,SAAA,GAAY,cAAc,MAAM,CAAA,IAAK,OAAO,KAAA,GAAQ,EAAA;AACpE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA,GAAI,EAAA;AACtD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,KAAA,GAAQ,EAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,EAAE,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,EAAG,UAAU,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,CAAA;AAAA,KACxG;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,MAAc,IAAA,EAAoB;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,IAAA,CAAK,SAAA;AACf,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,EAAA;AAAA,MACA,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,EAAE,CAAA,uBAAA,EAAqB,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAA;AAAA,MAC/E,EAAA;AAAA,MACA,GAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,kBAAA,EAAgB,IAAI,MAAA,CAAO,IAAA,GAAO,EAAE,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,MAC3G,CAAA,EAAG,IAAI,MAAA,CAAO,GAAA,GAAM,EAAE,CAAA,6BAAA,EAA2B,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAA;AAAA,MACtE;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC/B;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;;;ACnHO,IAAM,cAAA,GAAyC;AAAA,EACpD,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;;;AC9CO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,KAAA,CAAM;AAAA,EACnB,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CAAY,UAAA,EAAoB,OAAA,EAAkB,OAAA,EAAe;AAC/D,IAAA,KAAA,CAAM,OAAA,IAAW,cAAA,CAAe,UAAU,CAAA,IAAK,eAAe,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,UAAA,CAAU,SAAS,CAAA;AAAA,EACjD;AAAA,EAEA,MAAA,GAA8B;AAC5B,IAAA,MAAM,GAAA,GAA2B;AAAA,MAC/B,KAAA,EAAO;AAAA,QACL,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,SAAS,IAAA,CAAK;AAAA;AAChB,KACF;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,UAAU,IAAA,CAAK,OAAA;AAC3C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,OAAO,UAAA,CAAW,OAAA,EAAkB,OAAA,EAA0B;AAC5D,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,eAAe,OAAO,CAAA;AAAA,EAC7D;AAAA,EAEA,OAAO,aAAa,OAAA,EAA6B;AAC/C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,cAAc,CAAA;AAAA,EACrD;AAAA,EAEA,OAAO,UAAU,OAAA,EAA6B;AAC5C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,WAAW,CAAA;AAAA,EAClD;AAAA,EAEA,OAAO,SAAS,OAAA,EAA6B;AAC3C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,WAAW,CAAA;AAAA,EAClD;AAAA,EAEA,OAAO,iBAAiB,OAAA,EAA6B;AACnD,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,oBAAoB,CAAA;AAAA,EAC3D;AAAA,EAEA,OAAO,QAAA,CAAS,OAAA,EAAkB,OAAA,EAA0B;AAC1D,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,YAAY,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,mBAAA,CAAoB,OAAA,EAAkB,OAAA,EAA0B;AACrE,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,wBAAwB,OAAO,CAAA;AAAA,EACtE;AAAA,EAEA,OAAO,gBAAgB,OAAA,EAA6B;AAClD,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,mBAAmB,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,SAAS,OAAA,EAA6B;AAC3C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,uBAAuB,CAAA;AAAA,EAC9D;AACF,CAAA;;;AC3DO,SAAS,iBAAiB,EAAA,EAA+C;AAC9E,EAAA,MAAM,MAAA,mBAA4C,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACpE,EAAA,IAAI,CAAC,EAAA,IAAM,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,MAAA;AAEnC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,WAAA,GAAc,IAAA;AAClB,EAAA,IAAI,IAAI,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA;AAEtC,EAAA,OAAO,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAA,EAAK;AACzB,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAE1B,IAAA,IAAI,EAAA,KAAO,MAAc,WAAA,EAAa;AACpC,MAAA,WAAA,GAAc,KAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,EAAA,EAAY;AACrB,MAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,QAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AACjC,QAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA;AACnC,QAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAAA,QACvB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACvC,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,QAC1B;AAAA,MACF;AACA,MAAA,GAAA,GAAM,EAAA;AACN,MAAA,KAAA,GAAQ,EAAA;AACR,MAAA,WAAA,GAAc,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,IAAO,GAAG,CAAC,CAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,GAAG,CAAC,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AACjC,IAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAAA,IACvB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACvC,MAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,EAAA,IAAM,IAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,EAAA,EAAI,OAAO,GAAA;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEO,SAAS,aAAa,MAAA,EAAoD;AAC/E,EAAA,MAAM,OAAA,mBAAkC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAC1D,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAEpB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AAEnB,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,OAAO,IAAI,GAAA,IAAO,MAAA,CAAO,UAAA,CAAW,CAAC,MAAM,EAAA,EAAI,CAAA,EAAA;AAE/C,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAC9B,MAAA,IAAI,EAAA,KAAO,EAAA,IAAM,KAAA,KAAU,EAAA,EAAI,KAAA,GAAQ,CAAA;AACvC,MAAA,IAAI,OAAO,EAAA,EAAI;AAAE,QAAA,OAAA,GAAU,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACvC;AAEA,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,CAAA,GAAI,OAAA,KAAY,EAAA,GAAK,GAAA,GAAM,OAAA,GAAU,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,OAAA,KAAY,EAAA,GAAK,GAAA,GAAM,OAAA;AACnC,IAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,MAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAE5C,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,KAAM,EAAA,EAAI;AACrE,MAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,KAAM,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,UAAA,CAAW,GAAG,CAAA;AAAA,IAChC;AAEA,IAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,EACZ;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,iBAAA,GAAoB,kBAAA;AAC1B,IAAM,iBAAA,GAAoB,mCAAA;AAE1B,eAAsB,UAAU,GAAA,EAAoC;AAClE,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA;AAElD,EAAA,IACE,GAAA,CAAI,MAAA,KAAW,KAAA,IACf,GAAA,CAAI,MAAA,KAAW,MAAA,IACf,GAAA,CAAI,MAAA,KAAW,SAAA,IACd,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,GAAA,EAClD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,GAAO,IAAA;AAE5B,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AAChC,MAAA,SAAA,IAAa,KAAA,CAAM,MAAA;AACnB,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,MAAS,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAElD,MAAA,IAAI,WAAA,CAAY,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC7C,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QACzB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,QACb;AAAA,MACF,CAAA,MAAA,IAAW,WAAA,CAAY,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACpD,QAAA,OAAA,CAAQ,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACb;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEO,SAAS,SAAS,GAAA,EAAmD;AAC1E,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,EAAI;AAC5B,MAAA,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB,MAAA,MAAA,GAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AACpB,MAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AACrC;;;ACnLA,IAAM,aAAA,GAAgB;AAAA,EACpB,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC9B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,EAAA,GAAK,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK,GAAI,IAAI,CAAC,CAAA;AACrE,MAAA,IAAI,MAAM,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,OAAO,YAAY,EAAE,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,EAAQ,aAAA,IAAiB,WAAA;AAChD,EAAA,OAAO,YAAY,UAAU,CAAA;AAC/B;AAEA,SAAS,YAAY,EAAA,EAAoB;AACvC,EAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,kBAAA,EAAoB,OAAO,WAAA;AACtD,EAAA,IAAI,GAAG,UAAA,CAAW,SAAS,GAAG,OAAO,EAAA,CAAG,MAAM,CAAC,CAAA;AAC/C,EAAA,OAAO,EAAA;AACT;;;AC3BO,SAAS,eAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,GAAyB,EAAC,EAClB;AACR,EAAA,IAAI,MAAA,GAAS,GAAG,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC1B,IAAA,MAAA,IAAU,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAA,IAAU,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAA,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,IAAU,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA,EACtC;AAEA,EAAA,MAAA,IAAU,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,IAAQ,GAAG,CAAA,CAAA;AAEvC,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,IAAU,UAAA;AAAA,EACZ;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,KAAA,EAAO;AAC9B,IAAA,MAAA,IAAU,YAAA;AAAA,EACZ;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,IAAU,CAAA,WAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,GAAyB,EAAC,EAClB;AACR,EAAA,OAAO,eAAA,CAAgB,MAAM,EAAA,EAAI;AAAA,IAC/B,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,kBAAS,IAAI,IAAA,CAAK,CAAC;AAAA,GACpB,CAAA;AACH;;;AC9CO,IAAM,YAAA,GAAe,gBAAA;AAGrB,IAAM,eAAA,GAAkB,2BAAA;AAGxB,IAAM,iBAAA,GAAoB,yBAAA;;;ACFjC,SAAS,YAAY,OAAA,EAA2C;AAC9D,EAAA,OACE,QAAQ,IAAA,IAAQ;AAAA,IACd,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAEJ;AAGO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,IAAI,IAAA,KAAS,KAAK,OAAO,GAAA;AACzB,EAAA,MAAM,SAAS,IAAA,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,IAAI,GAAA,KAAQ,KAAK,OAAO,YAAA;AACxB,IAAA,OAAO,GAAA,CAAI,WAAW,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,GAAA;AAAA,EACrD,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA,CACR,OAAA,CAAQ,WAAW,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,aAAA;AAAA,EAC/B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,2BAA2B,IAAA,EAA8C;AAChF,EAAA,MAAM,EAAA,GAAK,cAAA;AACX,EAAA,MAAM,MAAsC,EAAC;AAC7C,EAAA,IAAI,CAAA;AACJ,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AACnC,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAA;AAAA,MACA,EAAA,EAAI,MAAA;AAAA,MACJ,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,KAC1B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAiB,IAAA,EAA2C;AACnE,EAAA,IAAI,IAAA,EAAM,aAAa,MAAA,CAAO,IAAA,CAAK,KAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AAC7D,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,MAAM,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACtD,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI;AAAA,QAClB,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,GAAI,CAAA,CAAE,MAAA,GAAS,EAAE,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,EAAE,KAAM;AAAC,OAC9E;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,WAAA,EAAa,qBAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,kBAAA,EAAoB;AAAA,UAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA;AAAK;AACvD;AACF;AACF,GACF;AACF;AAEA,SAAS,eAAA,CACP,MACA,UAAA,EACgC;AAChC,EAAA,MAAM,QAAA,GAAW,IAAA,EAAM,UAAA,IAAc,EAAC;AACtC,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAc,CAAC,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,CAAA,CAAE,EAAA,KAAO,MAAA,IAAU,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,QAAA,CACZ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,EAAA,EAAI,MAAA;AAAA,IACJ,QAAA,EAAU,EAAE,QAAA,IAAY,IAAA;AAAA,IACxB,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,QAAQ,CAAA,CAAE,MAAA,IAAU,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,QAAA;AAAS,GACjD,CAAE,CAAA;AACJ,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,UAAU,CAAA;AACjC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAI,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,CAAC,GAAG,UAAA,EAAY,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAC5D;AAEA,SAAS,aAAa,CAAA,EAA6E;AACjG,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,UAAU,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,EAAA,KAAO,SAAS,IAAA,GAAO,KAAA,CAAA;AAAA,IAClD,aAAa,CAAA,CAAE;AAAA,GACjB;AACA,EAAA,IAAI,CAAA,CAAE,OAAO,MAAA,EAAQ;AACnB,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,kBAAA,EAAoB;AAAA,UAClB,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,EAAE,MAAM,QAAA;AAAS;AACvC;AACF,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,QAAQ,CAAA,CAAE,MAAA,IAAU,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,QAAA;AAAS,GACjD;AACF;AAEA,SAAS,cAAA,CAAe,QAAoB,KAAA,EAAuB;AACjE,EAAA,MAAM,IAAA,GAAO,KAAA,CACV,OAAA,CAAQ,WAAA,EAAa,GAAG,CAAA,CACxB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvB,EAAA,OAAO,GAAG,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,CAAA;AAClD;AAEA,SAAS,kBAAA,CACP,MAAA,EACA,KAAA,EACA,IAAA,EACyB;AACzB,EAAA,MAAM,EAAA,GAA8B;AAAA,IAClC,WAAA,EAAa,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAA;AAAA,IACzC,SAAS,IAAA,EAAM,OAAA,IAAW,CAAA,EAAG,MAAM,IAAI,KAAK,CAAA,CAAA;AAAA,IAC5C,GAAI,MAAM,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB,EAAC;AAAA,IAC7D,GAAI,IAAA,EAAM,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,KAAS,EAAC;AAAA,IAC/C,GAAI,MAAM,IAAA,EAAM,MAAA,GAAS,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,IAChD,GAAI,MAAM,QAAA,EAAU,MAAA,GAAS,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI;AAAC,GAC9D;AAEA,EAAA,IAAI,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA,CAAE,SAAS,MAAM,CAAA,IAAK,CAAC,IAAA,EAAM,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,EAAG;AAChG,IAAA,EAAA,CAAG,WAAA,GAAc;AAAA,MACf,OAAA,EAAS;AAAA,QACP,kBAAA,EAAoB;AAAA,UAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA;AAAK;AACvD,OACF;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,EAAA,CAAG,SAAA,GAAY,iBAAiB,IAAI,CAAA;AACpC,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,oBAAA,CACd,QACA,OAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,QAAQ,UAAA,IAAc,EAAA;AACrC,EAAA,MAAM,QAAiD,EAAC;AAExD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,SAAS,CAAA,CAAE,IAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,cAAc,IAAI,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,MAAM,IAAI,KAAK,CAAA,CAAA;AAChC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,IAAA,MAAM,UAAA,GAAa,2BAA2B,KAAK,CAAA;AACnD,IAAA,MAAM,KAAK,kBAAA,CAAmB,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,EAAE,IAAI,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAAA,CAAE,IAAA,EAAM,UAAU,CAAA;AACrD,IAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,EAAA,CAAG,UAAA,GAAa,UAAA;AAEvC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,WAAA,EAAY;AACtC,IAAA,IAAI,CAAC,KAAA,CAAM,KAAK,GAAG,KAAA,CAAM,KAAK,IAAI,EAAC;AACnC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,QAAQ,CAAA,GAAI,EAAA;AAAA,EAC3B;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB,EAAC;AAAA,MAC5D,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY,EAAC;AAAA,MAChD,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY;AAAC,KAClD;AAAA,IACA,GAAI,QAAQ,OAAA,EAAS,MAAA,GAAS,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI,EAAC;AAAA,IAC9D;AAAA,GACF;AACF;;;AC7KA,SAAS,oBAAoB,CAAA,EAA4B;AACvD,EAAA,IAAI,CAAC,KAAK,OAAO,CAAA,KAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,KAAA;AAC5D,EAAA,MAAM,CAAA,GAAI,CAAA;AACV,EAAA,OACE,aAAa,CAAA,IACb,aAAA,IAAiB,CAAA,IACjB,MAAA,IAAU,KACV,YAAA,IAAgB,CAAA,IAChB,YAAA,IAAgB,CAAA,IAChB,eAAe,CAAA,IACf,UAAA,IAAc,CAAA,IACd,UAAA,IAAc,KACd,UAAA,IAAc,CAAA;AAElB;AAEA,IAAM,mBAAA,GAAsB,kBAAA;AAC5B,IAAM,eAAA,GAAkB,cAAA;AACxB,IAAM,eAAA,GAAkB,cAAA;AAEjB,IAAM,cAAN,MAAkB;AAAA,EACf,MAAA,GAAwB,IAAA;AAAA,EACxB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAmC,EAAC;AAAA,EACpC,UAA2B,EAAC;AAAA,EAC5B,YAAA,GAAoC,IAAA;AAAA,EACpC,MAAA;AAAA,EACA,aAAA,GAAmF,IAAA;AAAA,EAE3F,WAAA,CAAY,MAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,WAAA,EAAa,MAAA,CAAO,WAAA,IAAgB,OAAA,CAAQ,IAAI,QAAA,IAAoB,aAAA;AAAA,MACpE,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ,GAAA;AAAA,QAC7B,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ,SAAA;AAAA,QAC7B,gBAAA,EAAkB,MAAA,CAAO,MAAA,EAAQ,gBAAA,IAAoB,IAAA;AAAA,QACrD,cAAA,EAAgB,MAAA,CAAO,MAAA,EAAQ,cAAA,IAAkB,IAAA;AAAA,QACjD,cAAA,EAAgB,MAAA,CAAO,MAAA,EAAQ,cAAA,IAAkB,GAAA;AAAA,QACjD,GAAG,MAAA,CAAO;AAAA,OACZ;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,IAAA;AAAA,QACpC,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,KAAA,IAAS,MAAA;AAAA,QAChC,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,SAAA,IAAa,IAAA;AAAA,QACxC,MAAA,EAAQ,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,IAAA;AAAA,QAClC,cAAA,EAAgB,MAAA,CAAO,OAAA,EAAS,cAAA,IAAkB,IAAA;AAAA,QAClD,GAAG,MAAA,CAAO;AAAA,OACZ;AAAA,MACA,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,MAC5B,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,KACzB;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,MACvB,KAAA,EAAO,KAAK,MAAA,CAAO,OAAA,EAAS,YAAY,KAAA,GAAQ,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,KAAA;AAAA,MAChF,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA;AAAA,MAC7B,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,OAAA,EAAkD;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAwB,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,OAA4B,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,OAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAQ,OAAA,EAA6B;AACnC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,SAAiB,QAAA,EAA8D;AACjF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,IAAA,CAAK,SAAiB,QAAA,EAA8D;AAClF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEA,GAAA,CAAI,SAAiB,QAAA,EAA8D;AACjF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,MAAA,CAAO,SAAiB,QAAA,EAA8D;AACpF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC5C;AAAA,EAEA,KAAA,CAAM,SAAiB,QAAA,EAA8D;AACnF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAA,CAAK,SAAiB,QAAA,EAA8D;AAClF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAA,CAAQ,SAAiB,QAAA,EAA8D;AACrF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,GAAA,CAAI,SAAiB,QAAA,EAA8D;AACjF,IAAA,MAAM,OAAA,GAAwB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAU,OAAA,EAAS,QAAQ,SAAS,CAAA;AACzF,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,KAAA,CAAM,MAAA,EAAoB,IAAA,EAAc,QAAA,EAA8D;AAC5G,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,mBAAA,CAAoB,IAAI,CAAA,EAAG;AACjD,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACpC,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,aAAa,IAAI,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,WAAA,EAAoD;AAC9D,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,IAAA,CAAK,mBAAmB,UAAU,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,UAAA,EAA+C;AACxE,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAiB,OAAA,CAAQ,WAAA,GAAc,mBAAA,EAAqB,UAAU,CAAA,IAAK,EAAA;AACjF,IAAA,MAAM,wBACJ,OAAA,CAAQ,WAAA,GAAc,mBAAA,EAAqB,UAAU,KAAK,EAAC;AAC7D,IAAA,MAAM,iBAA2B,OAAA,CAAQ,WAAA,GAAc,YAAA,EAAc,UAAU,KAAK,EAAC;AAErF,IAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAC7B,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,mBAAA,CAAoB,SAAS,CAAA,CAAE,MAAA;AAAA,MAC1D,CAAC,MAAM,CAAA,KAAM;AAAA,KACf;AAEA,IAAA,KAAA,MAAW,eAAe,aAAA,EAAe;AACvC,MAAA,MAAM,YAAuC,OAAA,CAAQ,WAAA;AAAA,QACnD,eAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,IAAI,CAAA;AACtD,MAAA,MAAM,aAAa,OAAA,CAAQ,WAAA,GAAc,iBAAiB,SAAA,EAAW,WAAW,KAAK,EAAC;AACtF,MAAA,MAAM,mBACJ,OAAA,CAAQ,WAAA,GAAc,qBAAqB,SAAA,EAAW,WAAW,KAAK,EAAC;AAEzE,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,qBAAA,EAAuB,GAAG,gBAAgB,CAAA;AAErE,MAAA,MAAM,aAAuB,OAAA,CAAQ,WAAA,GAAc,iBAAiB,SAAA,EAAW,WAAW,KAAK,EAAC;AAChG,MAAA,MAAM,UAAW,OAAA,CAAQ,WAAA,GAAc,mBAAmB,SAAA,EAAW,WAAW,KAC9E,EAAC;AACH,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,cAAA,EAAgB,GAAG,UAAA,EAAY,GAAI,SAAA,CAAU,IAAA,EAAM,IAAA,IAAQ,EAAG,CAAA;AAClF,MAAA,MAAM,cAAqC,MAAM;AAC/C,QAAA,MAAM,IAAI,EAAE,GAAG,SAAA,CAAU,IAAA,EAAM,GAAG,OAAA,EAAQ;AAC1C,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,GAAO,OAAA;AAC7B,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AAAA,MACrC,CAAA,GAAG;AAEH,MAAA,MAAM,OAAA,GAAU,OAAO,GAAA,EAAmB,GAAA,KAAuB;AAC/D,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY,KAAK,GAAG,CAAA;AACpD,QAAA,MAAM,SAAS,MAAM,QAAA,CAAS,WAAW,CAAA,CAAE,GAAG,IAAI,CAAA;AAClD,QAAA,IAAI,MAAA,KAAW,MAAA,IAAa,CAAC,GAAA,CAAI,IAAA,EAAM;AACrC,UAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,YAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,UACjB,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,UACzB;AAAA,QACF;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,OAAO,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAA,EAAU,OAAA,EAAS,gBAAgB,UAAU,CAAA;AAAA,IACjF;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,UAAA,EAAmB,GAAA,EAAmB,GAAA,EAA2B;AACrF,IAAA,IAAI,CAAC,cAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,CAAC,KAAK,GAAG,CAAA;AAE5D,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAc,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAE3C,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,IAAI,KAAA;AAEJ,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,MAAA;AACH,UAAA,KAAA,GAAQ,KAAK,IAAA,GAAO,GAAA,CAAI,OAAO,IAAA,CAAK,IAAI,IAAI,GAAA,CAAI,IAAA;AAChD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,KAAA,GAAQ,KAAK,IAAA,GAAO,GAAA,CAAI,MAAM,IAAA,CAAK,IAAI,IAAI,GAAA,CAAI,KAAA;AAC/C,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,KAAA,GAAQ,KAAK,IAAA,GAAO,GAAA,CAAI,OAAO,IAAA,CAAK,IAAI,IAAI,GAAA,CAAI,MAAA;AAChD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,KAAA,GAAQ,IAAA,CAAK,OAAO,GAAA,CAAI,OAAA,CAAQ,KAAK,IAAA,CAAK,WAAA,EAAa,CAAA,GAAI,GAAA,CAAI,OAAA;AAC/D,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,KAAA,GAAQ,KAAK,IAAA,GAAO,GAAA,CAAI,QAAQ,IAAA,CAAK,IAAI,IAAI,GAAA,CAAI,OAAA;AACjD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,KAAA,GAAQ,MAAM;AAAA,UAAC,CAAA;AACf,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,KAAA,GAAQ,GAAA,CAAI,EAAA;AACZ,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,KAAA,GAAQ,GAAA,CAAI,OAAA;AACZ,UAAA;AAAA,QACF;AACE,UAAA,KAAA,GAAQ,MAAA;AAAA;AAGZ,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,UAAA,KAAA,GAAQ,KAAK,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AAAA,IACrB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,SAAA,CAAU,QAAgB,IAAA,EAAsB;AACtD,IAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,GAAG,IAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACvD,IAAA,MAAM,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAChD,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,EACjB;AAAA,EAEQ,aAAA,CAAc,GAAA,EAAsB,QAAA,EAAkB,KAAA,EAAwD;AACpH,IAAA,MAAM,KAAA,GAAQ,GAAA;AACd,IAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AACjB,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,IAAA,KAAA,CAAM,SAAS,EAAC;AAChB,IAAA,KAAA,CAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC/C,IAAA,KAAA,CAAM,EAAA,GAAK,UAAU,GAAG,CAAA;AACxB,IAAA,KAAA,CAAM,QAAA,GAAY,GAAA,CAAI,MAAA,CAAe,SAAA,GAAY,OAAA,GAAU,MAAA;AAC3D,IAAA,KAAA,CAAM,MAAA,GAAS,MAAM,QAAA,KAAa,OAAA;AAClC,IAAA,KAAA,CAAM,QAAA,GAAA,CAAY,IAAI,OAAA,CAAQ,IAAA,IAAQ,aAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC/D,IAAA,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAO;AACxC,IAAA,KAAA,CAAM,GAAA,GAAM,GAAA;AACZ,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAe,GAAA,EAAoC;AACzD,IAAA,MAAM,KAAA,GAAQ,GAAA;AACd,IAAA,KAAA,CAAM,SAAS,EAAC;AAChB,IAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AAEb,IAAA,KAAA,CAAM,MAAA,GAAS,SAAU,IAAA,EAAc;AACrC,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,CAAM,IAAA,GAAO,SAAU,IAAA,EAAe;AACpC,MAAA,IAAI,KAAK,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,iCAAiC,CAAA;AAChE,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,KAAA,CAAM,IAAA,GAAO,SAAU,IAAA,EAAuB;AAC5C,MAAA,IAAI,KAAK,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,UAAU,cAAA,EAAgB,OAAO,IAAA,KAAS,QAAA,GAAW,8BAA8B,0BAA0B,CAAA;AAAA,MACpH;AACA,MAAA,MAAM,MAAM,OAAO,IAAA,KAAS,WAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC3D,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,GAAA,CAAI,MAAM,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,KAAA,CAAM,IAAA,GAAO,SAAU,IAAA,EAAc;AACnC,MAAA,IAAI,KAAK,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,0BAA0B,CAAA;AACzD,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,KAAA,CAAM,QAAA,GAAW,SAAU,GAAA,EAAa,IAAA,GAAO,GAAA,EAAK;AAClD,MAAA,IAAI,KAAK,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,YAAY,GAAG,CAAA;AAC9B,MAAA,IAAA,CAAK,GAAA,EAAI;AAAA,IACX,CAAA;AAEA,IAAA,KAAA,CAAM,MAAA,GAAS,SAAU,IAAA,EAAc,KAAA,EAAe,OAAA,EAAyB;AAC7E,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAC5C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,GAAW,CAAC,MAAA,CAAO,QAAQ,CAAC,CAAA;AAClE,QAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,SAAA,CAAU,cAAc,GAAG,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,CAAU,cAAc,MAAM,CAAA;AAAA,MACrC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,CAAM,WAAA,GAAc,SAAU,IAAA,EAAc,OAAA,EAAyB;AACnE,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAA;AAC9C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAC5C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,GAAW,CAAC,MAAA,CAAO,QAAQ,CAAC,CAAA;AAClE,QAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,SAAA,CAAU,cAAc,GAAG,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,CAAU,cAAc,MAAM,CAAA;AAAA,MACrC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,CAAM,MAAA,GAAS,SAAU,IAAA,EAAc,KAAA,EAAmC;AACxE,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,KAAY,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,CAAM,IAAA,GAAO,SAAU,WAAA,EAAqB;AAC1C,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,WAAW,CAAA;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,CAAM,UAAA,GAAa,SAAU,QAAA,EAAmB;AAC9C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAuB,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5E,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,CAAU,uBAAuB,YAAY,CAAA;AAAA,MACpD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,KAAA,CAAM,QAAA,GAAW,SAAU,KAAA,EAAe,SAAA,EAAoB;AAAA,IAE9D,CAAA;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,sBAAA,GAAmF;AACzF,IAAA,IAAI,IAAA,CAAK,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAEpC,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAE9C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,GAAA,EAAmB,GAAA,KAAuB;AACpE,MAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,QAAA,IAAI,IAAI,IAAA,EAAM;AACd,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,UAAA,IAAI;AACF,YAAA,MAAM,SAAS,MAAA,CAAO,EAAE,KAAK,GAAA,EAAI,EAAG,CAAC,GAAA,KAAQ;AAC3C,cAAA,IAAI,GAAA,SAAY,GAAG,CAAA;AAAA,mBACd,OAAA,EAAQ;AAAA,YACf,CAAC,CAAA;AACD,YAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAe,IAAA,KAAS,UAAA,EAAY;AACxD,cAAC,MAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,YAChD;AAAA,UACF,SAAS,CAAA,EAAG;AACV,YAAA,MAAA,CAAO,CAAC,CAAA;AAAA,UACV;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,IAAI,IAAA,EAAM;AAEd,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,MAAM,gBAAgB,YAA2B;AAC/C,QAAA,IAAI,GAAA,IAAO,iBAAA,CAAkB,MAAA,IAAU,GAAA,CAAI,IAAA,EAAM;AACjD,QAAA,MAAM,EAAA,GAAK,kBAAkB,GAAA,EAAK,CAAA;AAClC,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,EAAA,CAAG,GAAA,EAAK,GAAA,EAAK,CAAC,GAAA,KAAQ;AACnC,cAAA,IAAI,GAAA,SAAY,GAAG,CAAA;AAAA,mBACd,OAAA,EAAQ;AAAA,YACf,CAAC,CAAA;AACD,YAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAe,IAAA,KAAS,UAAA,EAAY;AACxD,cAAC,MAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,YAChD;AAAA,UACF,SAAS,CAAA,EAAG;AACV,YAAA,MAAA,CAAO,CAAC,CAAA;AAAA,UACV;AAAA,QACF,CAAC,CAAA;AACD,QAAA,MAAM,aAAA,EAAc;AAAA,MACtB,CAAA;AAEA,MAAA,MAAM,aAAA,EAAc;AAAA,IACtB,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAc,aAAA,CAAc,GAAA,EAAsB,GAAA,EAAoC;AACpF,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,KAAW,QAAA,CAAS,GAAA,CAAI,OAAO,GAAG,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AAErC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,UAAU,KAAK,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA;AAErC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAK,sBAAA,EAAuB;AAC1C,MAAA,MAAM,KAAA,CAAM,OAAO,KAAK,CAAA;AAExB,MAAA,IAAI,MAAM,IAAA,EAAM;AAEhB,MAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,MAAA,IAAU,KAAA,EAAO,WAAA,EAAY;AACjD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAE/C,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,UAAA,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACzB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAU,QAAA,CAAS,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,MAClE;AAEA,MAAA,KAAA,CAAM,SAAS,KAAA,CAAM,MAAA;AAErB,MAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA,IAAU,WAAW,SAAA,EAAW;AACjE,QAAA,KAAA,CAAM,IAAA,GAAO,MAAM,SAAA,CAAU,GAAG,CAAA;AAAA,MAClC;AAEA,MAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,QAAA,IAAI,MAAM,IAAA,EAAM;AAChB,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,UAAA,IAAI;AACF,YAAA,MAAMA,OAAAA,GAAS,EAAA,CAAG,KAAA,EAAO,KAAA,EAAO,CAAC,GAAA,KAAQ;AACvC,cAAA,IAAI,GAAA,SAAY,GAAG,CAAA;AAAA,mBACd,OAAA,EAAQ;AAAA,YACf,CAAC,CAAA;AACD,YAAA,IAAIA,OAAAA,IAAU,OAAQA,OAAAA,CAAe,IAAA,KAAS,UAAA,EAAY;AACxD,cAACA,OAAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,YAChD;AAAA,UACF,SAAS,CAAA,EAAG;AACV,YAAA,MAAA,CAAO,CAAC,CAAA;AAAA,UACV;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AAEhB,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAO,KAAK,CAAA;AAE/C,MAAA,IAAI,MAAA,KAAW,KAAA,CAAA,IAAa,CAAC,KAAA,CAAM,IAAA,EAAM;AACvC,QAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,UAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,cAAA,EAAgB;AACvC,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,KAAA,CAAM,SAAA;AACjD,QAAA,IAAA,CAAK,MAAA,CAAO,OAAA;AAAA,UACV,IAAI,MAAA,IAAU,KAAA;AAAA,UACd,QAAA;AAAA,UACA,GAAA,CAAI,UAAA;AAAA,UACJ;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,GAAA,EAAU,GAAA,EAAmB,GAAA,EAA0B;AACzE,IAAA,IAAI,IAAI,IAAA,EAAM;AAEd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,MAAM;AAAA,QAAC,CAAC,CAAA;AACzC,QAAA;AAAA,MACF,SAAS,UAAA,EAAY;AACnB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,UAAU,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,MAAA,GAAA,CAAI,OAAO,GAAA,CAAI,UAAU,EAAE,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,GAAA,EAAK,UAAA,IAAc,GAAA,EAAK,MAAA,IAAU,GAAA;AACrD,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,gBAAgB,YAAA,GACxC,uBAAA,GACA,KAAK,OAAA,IAAW,uBAAA;AAEpB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,iBAAA,EAAoB,GAAA,EAAK,OAAA,IAAW,GAAG,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,GAAA,EAAK,KAAA,EAAO;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAAA,IAC7B;AAEA,IAAA,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA,CAAK;AAAA,MAC1B,KAAA,EAAO;AAAA,QACL,UAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAI,KAAK,MAAA,CAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAM,GAAI;AAAC;AACnD,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CAAO,IAAA,EAAe,QAAA,EAAwC;AAClE,IAAA,MAAM,UAAA,GAAa,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,QAAQ,IAAA,IAAQ,GAAA;AACvD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ,SAAA;AAEzC,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAsB,GAAA,KAAwB;AAC7D,MAAA,IAAA,CAAK,cAAc,GAAA,EAAK,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC1C,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,GAAG,CAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,UAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,UAAA,GAAA,CAAI,IAAI,gEAAgE,CAAA;AAAA,QAC1E;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO;AAC7B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA;AACvC,MAAA,IAAA,CAAK,MAAA,GAASC,kBAAA;AAAA,QACZ;AAAA,UACE,GAAA,EAAKC,eAAA,CAAa,WAAA,CAAY,GAAG,CAAA;AAAA,UACjC,IAAA,EAAMA,eAAA,CAAa,WAAA,CAAY,IAAI,CAAA;AAAA,UACnC,GAAI,WAAA,CAAY,EAAA,GAAK,EAAE,EAAA,EAAIA,gBAAa,WAAA,CAAY,EAAE,CAAA,EAAE,GAAI;AAAC,SAC/D;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,GAASC,kBAAa,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,gBAAA,EAAkB;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,gBAAA;AAAA,IACpD;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,cAAA,EAAgB;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA;AAAA,IAClD;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,IAAA,EAAM,MAAM;AAC1C,QAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AACnC,QAAA,QAAA,IAAW;AACX,QAAA,OAAA,CAAQ,KAAK,MAAO,CAAA;AAAA,MACtB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,GAAA,KAAQ;AACzB,QAAA,IAAI,GAAA,SAAY,GAAG,CAAA;AAAA,aACd,OAAA,EAAQ;AAAA,MACf,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAyD;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,EAAa;AAAA,EAClC;AAAA;AAAA,EAGA,iBAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAAA,EACvC;AAAA;AAAA,EAGA,kBAAA,CAAmB,OAAA,GAA+B,EAAC,EAAG;AACpD,IAAA,OAAO,oBAAA,CAAqB,IAAA,CAAK,iBAAA,EAAkB,EAAG,OAAO,CAAA;AAAA,EAC/D;AACF","file":"index.js","sourcesContent":["import type { HttpMethod, RouteHandler, MiddlewareHandler, RouteMatch } from \"../types/common.type.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\n\r\n/** Rota registada com metadados opcionais (OpenAPI / documentação). */\r\nexport interface RouteDocument {\r\n method: HttpMethod;\r\n path: string;\r\n meta?: RouteMeta;\r\n}\r\n\r\nconst PARAM_PREFIX = 58; // ':'\r\n\r\ninterface RadixNode {\r\n segment: string;\r\n children: Map<string, RadixNode>;\r\n paramChild: RadixNode | null;\r\n paramName: string;\r\n handlers: Map<HttpMethod, StoredRoute>;\r\n wildcardHandler: Map<HttpMethod, StoredRoute> | null;\r\n}\r\n\r\ninterface StoredRoute {\r\n handler: RouteHandler;\r\n middlewares: MiddlewareHandler[];\r\n meta?: Record<string, any>;\r\n}\r\n\r\nfunction createNode(segment: string = \"\"): RadixNode {\r\n return {\r\n segment,\r\n children: new Map(),\r\n paramChild: null,\r\n paramName: \"\",\r\n handlers: new Map(),\r\n wildcardHandler: null,\r\n };\r\n}\r\n\r\n/**\r\n * LRU Cache with O(1) get/set via doubly linked list + hash map.\r\n * Used for route lookup caching in hot paths.\r\n */\r\nclass LRUCache<K, V> {\r\n private capacity: number;\r\n private map: Map<K, { value: V; key: K; prev: any; next: any }>;\r\n private head: any;\r\n private tail: any;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.map = new Map();\r\n this.head = { prev: null, next: null };\r\n this.tail = { prev: null, next: null };\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n const node = this.map.get(key);\r\n if (!node) return undefined;\r\n this.moveToHead(node);\r\n return node.value;\r\n }\r\n\r\n set(key: K, value: V): void {\r\n const existing = this.map.get(key);\r\n if (existing) {\r\n existing.value = value;\r\n this.moveToHead(existing);\r\n return;\r\n }\r\n\r\n const node = { value, key, prev: null as any, next: null as any };\r\n this.map.set(key, node);\r\n this.addToHead(node);\r\n\r\n if (this.map.size > this.capacity) {\r\n const removed = this.removeTail();\r\n if (removed) this.map.delete(removed.key);\r\n }\r\n }\r\n\r\n private addToHead(node: any): void {\r\n node.prev = this.head;\r\n node.next = this.head.next;\r\n this.head.next.prev = node;\r\n this.head.next = node;\r\n }\r\n\r\n private removeNode(node: any): void {\r\n node.prev.next = node.next;\r\n node.next.prev = node.prev;\r\n }\r\n\r\n private moveToHead(node: any): void {\r\n this.removeNode(node);\r\n this.addToHead(node);\r\n }\r\n\r\n private removeTail(): any {\r\n const node = this.tail.prev;\r\n if (node === this.head) return null;\r\n this.removeNode(node);\r\n return node;\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n}\r\n\r\nexport class Router {\r\n private root: RadixNode = createNode();\r\n private cache: LRUCache<string, RouteMatch | null>;\r\n private staticRoutes: Map<string, StoredRoute> = new Map();\r\n\r\n constructor(cacheSize: number = 1024) {\r\n this.cache = new LRUCache(cacheSize);\r\n }\r\n\r\n add(\r\n method: HttpMethod,\r\n path: string,\r\n handler: RouteHandler,\r\n middlewares: MiddlewareHandler[] = [],\r\n meta?: Record<string, any>,\r\n ): void {\r\n this.cache.clear();\r\n const normalizedPath = this.normalizePath(path);\r\n const stored: StoredRoute = { handler, middlewares, meta };\r\n\r\n if (!normalizedPath.includes(\":\") && !normalizedPath.includes(\"*\")) {\r\n const key = `${method}:${normalizedPath}`;\r\n this.staticRoutes.set(key, stored);\r\n return;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n let node = this.root;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n if (seg === \"*\") {\r\n if (!node.wildcardHandler) {\r\n node.wildcardHandler = new Map();\r\n }\r\n node.wildcardHandler.set(method, stored);\r\n return;\r\n }\r\n\r\n if (seg.charCodeAt(0) === PARAM_PREFIX) {\r\n if (!node.paramChild) {\r\n node.paramChild = createNode(seg);\r\n node.paramChild.paramName = seg.slice(1);\r\n }\r\n node = node.paramChild;\r\n continue;\r\n }\r\n\r\n let child = node.children.get(seg);\r\n if (!child) {\r\n child = createNode(seg);\r\n node.children.set(seg, child);\r\n }\r\n node = child;\r\n }\r\n\r\n node.handlers.set(method, stored);\r\n }\r\n\r\n find(method: HttpMethod, path: string): RouteMatch | null {\r\n const normalizedPath = this.normalizePath(path);\r\n\r\n const staticKey = `${method}:${normalizedPath}`;\r\n const staticRoute = this.staticRoutes.get(staticKey);\r\n if (staticRoute) {\r\n return {\r\n handler: staticRoute.handler,\r\n params: {},\r\n middlewares: staticRoute.middlewares,\r\n meta: staticRoute.meta,\r\n };\r\n }\r\n\r\n const cacheKey = staticKey;\r\n const cached = this.cache.get(cacheKey);\r\n if (cached !== undefined) {\r\n return cached ? { ...cached, params: { ...cached.params } } : null;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n const params: Record<string, string> = {};\r\n const result = this.matchNode(this.root, segments, 0, params, method);\r\n\r\n if (result) {\r\n const match: RouteMatch = {\r\n handler: result.handler,\r\n params,\r\n middlewares: result.middlewares,\r\n meta: result.meta,\r\n };\r\n this.cache.set(cacheKey, match);\r\n return { ...match, params: { ...params } };\r\n }\r\n\r\n this.cache.set(cacheKey, null);\r\n return null;\r\n }\r\n\r\n private matchNode(\r\n node: RadixNode,\r\n segments: string[],\r\n idx: number,\r\n params: Record<string, string>,\r\n method: HttpMethod,\r\n ): StoredRoute | null {\r\n if (idx === segments.length) {\r\n return node.handlers.get(method) ?? null;\r\n }\r\n\r\n const seg = segments[idx];\r\n\r\n const child = node.children.get(seg);\r\n if (child) {\r\n const result = this.matchNode(child, segments, idx + 1, params, method);\r\n if (result) return result;\r\n }\r\n\r\n if (node.paramChild) {\r\n params[node.paramChild.paramName] = seg;\r\n const result = this.matchNode(node.paramChild, segments, idx + 1, params, method);\r\n if (result) return result;\r\n delete params[node.paramChild.paramName];\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n const route = node.wildcardHandler.get(method);\r\n if (route) return route;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private normalizePath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n if (path.endsWith(\"/\") && path.length > 1) return path.slice(0, -1);\r\n return path;\r\n }\r\n\r\n getAllRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.getRouteDocuments().map(({ method, path }) => ({ method, path }));\r\n }\r\n\r\n /**\r\n * Todas as rotas com metadados (ex.: OpenAPI) associados ao handler.\r\n */\r\n getRouteDocuments(): RouteDocument[] {\r\n const routes: RouteDocument[] = [];\r\n\r\n for (const [key, stored] of this.staticRoutes) {\r\n const [method, path] = key.split(\":\", 2) as [HttpMethod, string];\r\n routes.push({ method, path, meta: stored.meta });\r\n }\r\n\r\n this.collectRoutesWithMeta(this.root, \"\", routes);\r\n return routes;\r\n }\r\n\r\n private collectRoutesWithMeta(node: RadixNode, prefix: string, routes: RouteDocument[]): void {\r\n for (const [method, stored] of node.handlers) {\r\n routes.push({ method, path: prefix || \"/\", meta: stored.meta });\r\n }\r\n\r\n for (const [seg, child] of node.children) {\r\n this.collectRoutesWithMeta(child, `${prefix}/${seg}`, routes);\r\n }\r\n\r\n if (node.paramChild) {\r\n this.collectRoutesWithMeta(\r\n node.paramChild,\r\n `${prefix}/:${node.paramChild.paramName}`,\r\n routes,\r\n );\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n for (const [method, stored] of node.wildcardHandler) {\r\n routes.push({ method, path: `${prefix}/*`, meta: stored.meta });\r\n }\r\n }\r\n }\r\n}\r\n","type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\r\n\r\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst COLORS = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n gray: \"\\x1b[90m\",\r\n bgRed: \"\\x1b[41m\",\r\n bgGreen: \"\\x1b[42m\",\r\n bgYellow: \"\\x1b[43m\",\r\n bgBlue: \"\\x1b[44m\",\r\n} as const;\r\n\r\nconst METHOD_COLORS: Record<string, string> = {\r\n GET: COLORS.green,\r\n POST: COLORS.blue,\r\n PUT: COLORS.yellow,\r\n DELETE: COLORS.red,\r\n PATCH: COLORS.magenta,\r\n HEAD: COLORS.cyan,\r\n OPTIONS: COLORS.gray,\r\n};\r\n\r\nfunction statusColor(code: number): string {\r\n if (code < 200) return COLORS.gray;\r\n if (code < 300) return COLORS.green;\r\n if (code < 400) return COLORS.cyan;\r\n if (code < 500) return COLORS.yellow;\r\n return COLORS.red;\r\n}\r\n\r\nfunction formatDuration(ns: bigint): string {\r\n const us = Number(ns) / 1_000;\r\n if (us < 1_000) return `${us.toFixed(0)}µs`;\r\n const ms = us / 1_000;\r\n if (ms < 1_000) return `${ms.toFixed(1)}ms`;\r\n return `${(ms / 1_000).toFixed(2)}s`;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private useColors: boolean;\r\n private showTimestamp: boolean;\r\n private prefix: string;\r\n\r\n constructor(options: {\r\n level?: LogLevel;\r\n colors?: boolean;\r\n timestamp?: boolean;\r\n prefix?: string;\r\n } = {}) {\r\n this.level = options.level ?? \"info\";\r\n this.useColors = options.colors ?? process.stdout.isTTY !== false;\r\n this.showTimestamp = options.timestamp ?? true;\r\n this.prefix = options.prefix ?? \"azura\";\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];\r\n }\r\n\r\n private timestamp(): string {\r\n if (!this.showTimestamp) return \"\";\r\n const now = new Date();\r\n return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;\r\n }\r\n\r\n private tag(level: LogLevel): string {\r\n if (!this.useColors) return `[${level.toUpperCase()}]`;\r\n const colorMap: Record<string, string> = {\r\n debug: COLORS.gray,\r\n info: COLORS.blue,\r\n warn: COLORS.yellow,\r\n error: COLORS.red,\r\n };\r\n return `${colorMap[level] ?? \"\"}[${level.toUpperCase()}]${COLORS.reset}`;\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"debug\")) return;\r\n console.debug(`${this.timestamp()}${this.tag(\"debug\")} ${message}`, ...args);\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n console.info(`${this.timestamp()}${this.tag(\"info\")} ${message}`, ...args);\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"warn\")) return;\r\n console.warn(`${this.timestamp()}${this.tag(\"warn\")} ${message}`, ...args);\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"error\")) return;\r\n console.error(`${this.timestamp()}${this.tag(\"error\")} ${message}`, ...args);\r\n }\r\n\r\n request(method: string, path: string, statusCode: number, duration: bigint): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : \"\";\r\n const sc = this.useColors ? statusColor(statusCode) : \"\";\r\n const r = this.useColors ? COLORS.reset : \"\";\r\n const dur = formatDuration(duration);\r\n console.info(\r\n `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`,\r\n );\r\n }\r\n\r\n banner(port: number, host: string): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const c = this.useColors;\r\n const lines = [\r\n \"\",\r\n `${c ? COLORS.bold + COLORS.cyan : \"\"} ⚡ AzuraJS v3.0.0${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n `${c ? COLORS.green : \"\"} ➜ Local: ${c ? COLORS.bold : \"\"}http://${host}:${port}/${c ? COLORS.reset : \"\"}`,\r\n `${c ? COLORS.dim : \"\"} ➜ Press Ctrl+C to stop${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n ];\r\n console.info(lines.join(\"\\n\"));\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n}\r\n","export const HttpStatus = {\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];\r\n\r\nexport const HttpStatusText: Record<number, string> = {\r\n 200: \"OK\",\r\n 201: \"Created\",\r\n 202: \"Accepted\",\r\n 204: \"No Content\",\r\n 301: \"Moved Permanently\",\r\n 302: \"Found\",\r\n 304: \"Not Modified\",\r\n 400: \"Bad Request\",\r\n 401: \"Unauthorized\",\r\n 403: \"Forbidden\",\r\n 404: \"Not Found\",\r\n 405: \"Method Not Allowed\",\r\n 409: \"Conflict\",\r\n 410: \"Gone\",\r\n 422: \"Unprocessable Entity\",\r\n 429: \"Too Many Requests\",\r\n 500: \"Internal Server Error\",\r\n 501: \"Not Implemented\",\r\n 502: \"Bad Gateway\",\r\n 503: \"Service Unavailable\",\r\n 504: \"Gateway Timeout\",\r\n};\r\n","import { HttpStatusText } from \"../types/http/status.js\";\r\n\r\nexport class HttpError extends Error {\r\n public readonly statusCode: number;\r\n public readonly details?: any;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(statusCode: number, message?: string, details?: any) {\r\n super(message ?? HttpStatusText[statusCode] ?? \"Unknown Error\");\r\n this.statusCode = statusCode;\r\n this.details = details;\r\n this.isOperational = true;\r\n Object.setPrototypeOf(this, HttpError.prototype);\r\n }\r\n\r\n toJSON(): Record<string, any> {\r\n const obj: Record<string, any> = {\r\n error: {\r\n statusCode: this.statusCode,\r\n message: this.message,\r\n },\r\n };\r\n if (this.details) obj.error.details = this.details;\r\n return obj;\r\n }\r\n\r\n static badRequest(message?: string, details?: any): HttpError {\r\n return new HttpError(400, message ?? \"Bad Request\", details);\r\n }\r\n\r\n static unauthorized(message?: string): HttpError {\r\n return new HttpError(401, message ?? \"Unauthorized\");\r\n }\r\n\r\n static forbidden(message?: string): HttpError {\r\n return new HttpError(403, message ?? \"Forbidden\");\r\n }\r\n\r\n static notFound(message?: string): HttpError {\r\n return new HttpError(404, message ?? \"Not Found\");\r\n }\r\n\r\n static methodNotAllowed(message?: string): HttpError {\r\n return new HttpError(405, message ?? \"Method Not Allowed\");\r\n }\r\n\r\n static conflict(message?: string, details?: any): HttpError {\r\n return new HttpError(409, message ?? \"Conflict\", details);\r\n }\r\n\r\n static unprocessableEntity(message?: string, details?: any): HttpError {\r\n return new HttpError(422, message ?? \"Unprocessable Entity\", details);\r\n }\r\n\r\n static tooManyRequests(message?: string): HttpError {\r\n return new HttpError(429, message ?? \"Too Many Requests\");\r\n }\r\n\r\n static internal(message?: string): HttpError {\r\n return new HttpError(500, message ?? \"Internal Server Error\");\r\n }\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nexport function parseQueryString(qs: string): Record<string, string | string[]> {\r\n const result: Record<string, string | string[]> = Object.create(null);\r\n if (!qs || qs.length === 0) return result;\r\n\r\n let key = \"\";\r\n let value = \"\";\r\n let startingKey = true;\r\n let i = qs.charCodeAt(0) === 63 ? 1 : 0; // skip leading ?\r\n\r\n for (; i < qs.length; i++) {\r\n const ch = qs.charCodeAt(i);\r\n\r\n if (ch === 61 /* = */ && startingKey) {\r\n startingKey = false;\r\n continue;\r\n }\r\n\r\n if (ch === 38 /* & */) {\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n key = \"\";\r\n value = \"\";\r\n startingKey = true;\r\n continue;\r\n }\r\n\r\n if (startingKey) {\r\n key += qs[i];\r\n } else {\r\n value += qs[i];\r\n }\r\n }\r\n\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction fastDecode(str: string): string {\r\n if (str.indexOf(\"%\") === -1 && str.indexOf(\"+\") === -1) return str;\r\n try {\r\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\nexport function parseCookies(header: string | undefined): Record<string, string> {\r\n const cookies: Record<string, string> = Object.create(null);\r\n if (!header) return cookies;\r\n\r\n let i = 0;\r\n const len = header.length;\r\n\r\n while (i < len) {\r\n while (i < len && header.charCodeAt(i) === 32) i++; // skip spaces\r\n\r\n let eqIdx = -1;\r\n let semiIdx = -1;\r\n for (let j = i; j < len; j++) {\r\n const ch = header.charCodeAt(j);\r\n if (ch === 61 && eqIdx === -1) eqIdx = j;\r\n if (ch === 59) { semiIdx = j; break; }\r\n }\r\n\r\n if (eqIdx === -1) {\r\n i = semiIdx === -1 ? len : semiIdx + 1;\r\n continue;\r\n }\r\n\r\n const end = semiIdx === -1 ? len : semiIdx;\r\n const name = header.slice(i, eqIdx).trim();\r\n let val = header.slice(eqIdx + 1, end).trim();\r\n\r\n if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {\r\n val = val.slice(1, -1);\r\n }\r\n\r\n if (cookies[name] === undefined) {\r\n cookies[name] = fastDecode(val);\r\n }\r\n\r\n i = end + 1;\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\nconst CONTENT_TYPE_JSON = \"application/json\";\r\nconst CONTENT_TYPE_FORM = \"application/x-www-form-urlencoded\";\r\n\r\nexport async function parseBody(req: IncomingMessage): Promise<any> {\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n const contentLength = req.headers[\"content-length\"];\r\n\r\n if (\r\n req.method === \"GET\" ||\r\n req.method === \"HEAD\" ||\r\n req.method === \"OPTIONS\" ||\r\n (contentLength !== undefined && contentLength === \"0\")\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n const maxSize = 10 * 1024 * 1024; // 10MB default\r\n\r\n return new Promise((resolve, reject) => {\r\n req.on(\"data\", (chunk: Buffer) => {\r\n totalSize += chunk.length;\r\n if (totalSize > maxSize) {\r\n req.destroy();\r\n reject(new Error(\"Request body too large\"));\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on(\"end\", () => {\r\n if (chunks.length === 0) {\r\n resolve(undefined);\r\n return;\r\n }\r\n\r\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\r\n\r\n if (contentType.startsWith(CONTENT_TYPE_JSON)) {\r\n try {\r\n resolve(JSON.parse(raw));\r\n } catch {\r\n resolve(raw);\r\n }\r\n } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {\r\n resolve(parseQueryString(raw));\r\n } else {\r\n resolve(raw);\r\n }\r\n });\r\n\r\n req.on(\"error\", reject);\r\n });\r\n}\r\n\r\nexport function parseUrl(url: string): { pathname: string; search: string } {\r\n let pathname = \"\";\r\n let search = \"\";\r\n let i = 0;\r\n\r\n for (; i < url.length; i++) {\r\n if (url.charCodeAt(i) === 63) { // ?\r\n pathname = url.slice(0, i);\r\n search = url.slice(i);\r\n return { pathname, search };\r\n }\r\n }\r\n\r\n return { pathname: url, search: \"\" };\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nconst PROXY_HEADERS = [\r\n \"x-forwarded-for\",\r\n \"x-real-ip\",\r\n \"cf-connecting-ip\",\r\n \"x-client-ip\",\r\n \"x-cluster-client-ip\",\r\n \"fastly-client-ip\",\r\n \"true-client-ip\",\r\n] as const;\r\n\r\nexport function resolveIp(req: IncomingMessage): string {\r\n for (const header of PROXY_HEADERS) {\r\n const val = req.headers[header];\r\n if (val) {\r\n const ip = typeof val === \"string\" ? val.split(\",\")[0].trim() : val[0];\r\n if (ip && ip.length > 0) return normalizeIp(ip);\r\n }\r\n }\r\n\r\n const remoteAddr = req.socket?.remoteAddress ?? \"127.0.0.1\";\r\n return normalizeIp(remoteAddr);\r\n}\r\n\r\nfunction normalizeIp(ip: string): string {\r\n if (ip === \"::1\" || ip === \"::ffff:127.0.0.1\") return \"127.0.0.1\";\r\n if (ip.startsWith(\"::ffff:\")) return ip.slice(7);\r\n return ip;\r\n}\r\n","import type { CookieOptions } from \"../../types/common.type.js\";\r\n\r\nexport function serializeCookie(\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {},\r\n): string {\r\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\r\n\r\n if (options.maxAge != null) {\r\n cookie += `; Max-Age=${Math.floor(options.maxAge)}`;\r\n }\r\n\r\n if (options.expires) {\r\n cookie += `; Expires=${options.expires.toUTCString()}`;\r\n }\r\n\r\n if (options.domain) {\r\n cookie += `; Domain=${options.domain}`;\r\n }\r\n\r\n cookie += `; Path=${options.path ?? \"/\"}`;\r\n\r\n if (options.secure) {\r\n cookie += \"; Secure\";\r\n }\r\n\r\n if (options.httpOnly !== false) {\r\n cookie += \"; HttpOnly\";\r\n }\r\n\r\n if (options.sameSite) {\r\n cookie += `; SameSite=${options.sameSite}`;\r\n }\r\n\r\n return cookie;\r\n}\r\n\r\nexport function clearCookieHeader(\r\n name: string,\r\n options: CookieOptions = {},\r\n): string {\r\n return serializeCookie(name, \"\", {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n","/** Tags OpenAPI a nível de controller (todas as rotas do class) */\r\nexport const API_TAGS_KEY = \"azura:api-tags\";\r\n\r\n/** Tags por método (independente da ordem em relação a @Get/@Post) */\r\nexport const METHOD_TAGS_KEY = \"azura:swagger-method-tags\";\r\n\r\n/** Metadados OpenAPI por método (summary, responses, etc.) */\r\nexport const API_OPERATION_KEY = \"azura:swagger-operation\";\r\n","import type { HttpMethod } from \"../types/common.type.js\";\r\nimport type { RouteDocument } from \"../core/router.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions, OpenApiInfo } from \"../types/swagger.type.js\";\r\n\r\nfunction resolveInfo(options: BuildOpenApiOptions): OpenApiInfo {\r\n return (\r\n options.info ?? {\r\n title: \"AzuraJS API\",\r\n version: \"1.0.0\",\r\n description: \"Generated OpenAPI specification\",\r\n }\r\n );\r\n}\r\n\r\n/** Converte path AzuraJS `/users/:id` → OpenAPI `/users/{id}` */\r\nexport function toOpenApiPath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n const mapped = path\r\n .split(\"/\")\r\n .map((seg) => {\r\n if (seg === \"*\") return \"{wildcard}\";\r\n return seg.startsWith(\":\") ? `{${seg.slice(1)}}` : seg;\r\n })\r\n .join(\"/\")\r\n .replace(/\\/{2,}/g, \"/\");\r\n if (mapped.endsWith(\"/*\")) {\r\n return mapped.slice(0, -2) + \"/{wildcard}\";\r\n }\r\n return mapped;\r\n}\r\n\r\nfunction pathParametersFromTemplate(path: string): Array<Record<string, unknown>> {\r\n const re = /\\{([^}]+)\\}/g;\r\n const out: Array<Record<string, unknown>> = [];\r\n let m: RegExpExecArray | null;\r\n const seen = new Set<string>();\r\n while ((m = re.exec(path)) !== null) {\r\n const name = m[1];\r\n if (seen.has(name)) continue;\r\n seen.add(name);\r\n out.push({\r\n name,\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nfunction defaultResponses(meta?: RouteMeta): Record<string, unknown> {\r\n if (meta?.responses && Object.keys(meta.responses).length > 0) {\r\n const out: Record<string, unknown> = {};\r\n for (const [code, r] of Object.entries(meta.responses)) {\r\n out[String(code)] = {\r\n description: r.description,\r\n ...(r.schema ? { content: { \"application/json\": { schema: r.schema } } } : {}),\r\n };\r\n }\r\n return out;\r\n }\r\n return {\r\n \"200\": {\r\n description: \"Successful response\",\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction mergeParameters(\r\n meta: RouteMeta | undefined,\r\n pathParams: Array<Record<string, unknown>>,\r\n): Array<Record<string, unknown>> {\r\n const fromMeta = meta?.parameters ?? [];\r\n const names = new Set(pathParams.map((p) => p.name as string));\r\n const rest = fromMeta.filter((p) => !(p.in === \"path\" && names.has(p.name)));\r\n const mapped = fromMeta\r\n .filter((p) => p.in === \"path\")\r\n .map((p) => ({\r\n name: p.name,\r\n in: \"path\",\r\n required: p.required ?? true,\r\n description: p.description,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n }));\r\n const pathMerged = [...pathParams];\r\n for (const m of mapped) {\r\n if (!pathMerged.find((x) => x.name === m.name)) pathMerged.push(m);\r\n }\r\n return [...pathMerged, ...rest.map((p) => mapParameter(p))];\r\n}\r\n\r\nfunction mapParameter(p: import(\"../types/routes.type.js\").ParameterMeta): Record<string, unknown> {\r\n const base: Record<string, unknown> = {\r\n name: p.name,\r\n in: p.in,\r\n required: p.required ?? (p.in === \"path\" ? true : false),\r\n description: p.description,\r\n };\r\n if (p.in === \"body\") {\r\n return {\r\n ...base,\r\n content: {\r\n \"application/json\": {\r\n schema: p.schema ?? { type: \"object\" },\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n ...base,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n };\r\n}\r\n\r\nfunction operationIdFor(method: HttpMethod, oPath: string): string {\r\n const slug = oPath\r\n .replace(/[/{}\\-*]/g, \"_\")\r\n .replace(/_+/g, \"_\")\r\n .replace(/^_|_$/g, \"\");\r\n return `${method.toLowerCase()}_${slug || \"root\"}`;\r\n}\r\n\r\nfunction operationForMethod(\r\n method: HttpMethod,\r\n oPath: string,\r\n meta: RouteMeta | undefined,\r\n): Record<string, unknown> {\r\n const op: Record<string, unknown> = {\r\n operationId: operationIdFor(method, oPath),\r\n summary: meta?.summary ?? `${method} ${oPath}`,\r\n ...(meta?.description ? { description: meta.description } : {}),\r\n ...(meta?.deprecated ? { deprecated: true } : {}),\r\n ...(meta?.tags?.length ? { tags: meta.tags } : {}),\r\n ...(meta?.security?.length ? { security: meta.security } : {}),\r\n };\r\n\r\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method) && !meta?.parameters?.some((x) => x.in === \"body\")) {\r\n op.requestBody = {\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n required: false,\r\n };\r\n }\r\n\r\n op.responses = defaultResponses(meta);\r\n return op;\r\n}\r\n\r\n/**\r\n * Gera documento OpenAPI 3.0 a partir das rotas registadas.\r\n */\r\nexport function buildOpenApiDocument(\r\n routes: RouteDocument[],\r\n options: BuildOpenApiOptions,\r\n): Record<string, unknown> {\r\n const info = resolveInfo(options);\r\n const prefix = options.pathPrefix ?? \"\";\r\n const paths: Record<string, Record<string, unknown>> = {};\r\n\r\n const seen = new Set<string>();\r\n for (const r of routes) {\r\n const full = prefix + r.path;\r\n const oPath = toOpenApiPath(full);\r\n const key = `${r.method}:${oPath}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const pathParams = pathParametersFromTemplate(oPath);\r\n const op = operationForMethod(r.method, oPath, r.meta);\r\n const parameters = mergeParameters(r.meta, pathParams);\r\n if (parameters.length) op.parameters = parameters;\r\n\r\n const methodLc = r.method.toLowerCase();\r\n if (!paths[oPath]) paths[oPath] = {};\r\n paths[oPath][methodLc] = op;\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: {\r\n title: info.title,\r\n version: info.version,\r\n ...(info.description ? { description: info.description } : {}),\r\n ...(info.contact ? { contact: info.contact } : {}),\r\n ...(info.license ? { license: info.license } : {}),\r\n },\r\n ...(options.servers?.length ? { servers: options.servers } : {}),\r\n paths,\r\n };\r\n}\r\n","import { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport { createServer as createHttpsServer } from \"node:https\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { Router } from \"./router.js\";\r\nimport { Logger } from \"../utils/Logger.js\";\r\nimport { HttpError } from \"../utils/HttpError.js\";\r\nimport { parseQueryString, parseCookies, parseBody, parseUrl } from \"../utils/Parser.js\";\r\nimport { resolveIp } from \"../utils/IpResolver.js\";\r\nimport { serializeCookie, clearCookieHeader } from \"../utils/cookies/CookieManager.js\";\r\nimport type {\r\n AzuraRequest,\r\n AzuraResponse,\r\n NextFunction,\r\n MiddlewareHandler,\r\n ErrorHandler,\r\n HttpMethod,\r\n CookieOptions,\r\n} from \"../types/common.type.js\";\r\nimport type { AzuraConfig } from \"../types/config.type.js\";\r\nimport type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { ControllerMetadata, RouteMeta, RouteMetadata } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions } from \"../types/swagger.type.js\";\r\nimport { API_OPERATION_KEY, API_TAGS_KEY, METHOD_TAGS_KEY } from \"../swagger/constants.js\";\r\nimport { buildOpenApiDocument } from \"../swagger/openapi-builder.js\";\r\n\r\nfunction isRouteDocumentMeta(o: unknown): o is RouteMeta {\r\n if (!o || typeof o !== \"object\" || Array.isArray(o)) return false;\r\n const x = o as Record<string, unknown>;\r\n return (\r\n \"summary\" in x ||\r\n \"description\" in x ||\r\n \"tags\" in x ||\r\n \"deprecated\" in x ||\r\n \"parameters\" in x ||\r\n \"responses\" in x ||\r\n \"security\" in x ||\r\n \"produces\" in x ||\r\n \"consumes\" in x\r\n );\r\n}\r\n\r\nconst CONTROLLER_META_KEY = \"azura:controller\";\r\nconst ROUTES_META_KEY = \"azura:routes\";\r\nconst PARAMS_META_KEY = \"azura:params\";\r\n\r\nexport class AzuraServer {\r\n private server: Server | null = null;\r\n private router: Router;\r\n private logger: Logger;\r\n private middlewares: MiddlewareHandler[] = [];\r\n private plugins: PluginHandler[] = [];\r\n private errorHandler: ErrorHandler | null = null;\r\n private config: AzuraConfig;\r\n private compiledChain: ((req: AzuraRequest, res: AzuraResponse) => Promise<void>) | null = null;\r\n\r\n constructor(config: AzuraConfig = {}) {\r\n this.config = {\r\n environment: config.environment ?? (process.env.NODE_ENV as any) ?? \"development\",\r\n server: {\r\n port: config.server?.port ?? 3000,\r\n host: config.server?.host ?? \"0.0.0.0\",\r\n keepAliveTimeout: config.server?.keepAliveTimeout ?? 72000,\r\n headersTimeout: config.server?.headersTimeout ?? 75000,\r\n requestTimeout: config.server?.requestTimeout ?? 30000,\r\n ...config.server,\r\n },\r\n logging: {\r\n enabled: config.logging?.enabled ?? true,\r\n level: config.logging?.level ?? \"info\",\r\n timestamp: config.logging?.timestamp ?? true,\r\n colors: config.logging?.colors ?? true,\r\n requestLogging: config.logging?.requestLogging ?? true,\r\n ...config.logging,\r\n },\r\n plugins: config.plugins ?? {},\r\n debug: config.debug ?? false,\r\n };\r\n\r\n this.router = new Router();\r\n this.logger = new Logger({\r\n level: this.config.logging?.enabled === false ? \"silent\" : this.config.logging?.level,\r\n colors: this.config.logging?.colors,\r\n timestamp: this.config.logging?.timestamp,\r\n });\r\n }\r\n\r\n use(handler: MiddlewareHandler | PluginHandler): this {\r\n this.compiledChain = null;\r\n if (handler.length <= 2) {\r\n this.plugins.push(handler as PluginHandler);\r\n } else {\r\n this.middlewares.push(handler as MiddlewareHandler);\r\n }\r\n return this;\r\n }\r\n\r\n plugin(handler: PluginHandler): this {\r\n this.compiledChain = null;\r\n this.plugins.push(handler);\r\n return this;\r\n }\r\n\r\n onError(handler: ErrorHandler): this {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n get(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"GET\", path, handlers);\r\n }\r\n\r\n post(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"POST\", path, handlers);\r\n }\r\n\r\n put(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PUT\", path, handlers);\r\n }\r\n\r\n delete(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"DELETE\", path, handlers);\r\n }\r\n\r\n patch(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PATCH\", path, handlers);\r\n }\r\n\r\n head(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"HEAD\", path, handlers);\r\n }\r\n\r\n options(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"OPTIONS\", path, handlers);\r\n }\r\n\r\n all(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n const methods: HttpMethod[] = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\n for (const method of methods) {\r\n this.route(method, path, handlers);\r\n }\r\n return this;\r\n }\r\n\r\n private route(method: HttpMethod, path: string, handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n let meta: RouteMeta | undefined;\r\n let list = handlers as unknown[];\r\n const last = list[list.length - 1];\r\n if (list.length >= 2 && isRouteDocumentMeta(last)) {\r\n meta = last;\r\n list = list.slice(0, -1);\r\n }\r\n if (list.length === 0) {\r\n throw new Error(`Route ${method} ${path} requires a handler function`);\r\n }\r\n const routeHandler = list[list.length - 1] as any;\r\n const middlewares = list.slice(0, -1) as MiddlewareHandler[];\r\n this.router.add(method, path, routeHandler, middlewares, meta);\r\n return this;\r\n }\r\n\r\n register(...controllers: (new (...args: any[]) => any)[]): this {\r\n for (const Controller of controllers) {\r\n this.registerController(Controller);\r\n }\r\n return this;\r\n }\r\n\r\n private registerController(Controller: new (...args: any[]) => any): void {\r\n const instance = new Controller();\r\n const prefix: string = Reflect.getMetadata?.(CONTROLLER_META_KEY, Controller) ?? \"\";\r\n const controllerMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", Controller) ?? [];\r\n const controllerTags: string[] = Reflect.getMetadata?.(API_TAGS_KEY, Controller) ?? [];\r\n\r\n const prototype = Controller.prototype;\r\n const propertyNames = Object.getOwnPropertyNames(prototype).filter(\r\n (p) => p !== \"constructor\",\r\n );\r\n\r\n for (const propertyKey of propertyNames) {\r\n const routeMeta: RouteMetadata | undefined = Reflect.getMetadata?.(\r\n ROUTES_META_KEY,\r\n prototype,\r\n propertyKey,\r\n );\r\n\r\n if (!routeMeta) continue;\r\n\r\n const fullPath = this.joinPaths(prefix, routeMeta.path);\r\n const paramsMeta = Reflect.getMetadata?.(PARAMS_META_KEY, prototype, propertyKey) ?? [];\r\n const routeMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", prototype, propertyKey) ?? [];\r\n\r\n const allMiddlewares = [...controllerMiddlewares, ...routeMiddlewares];\r\n\r\n const methodTags: string[] = Reflect.getMetadata?.(METHOD_TAGS_KEY, prototype, propertyKey) ?? [];\r\n const opExtra = (Reflect.getMetadata?.(API_OPERATION_KEY, prototype, propertyKey) ??\r\n {}) as Partial<RouteMeta>;\r\n const tagList = [...controllerTags, ...methodTags, ...(routeMeta.meta?.tags ?? [])];\r\n const mergedMeta: RouteMeta | undefined = (() => {\r\n const m = { ...routeMeta.meta, ...opExtra } as RouteMeta;\r\n if (tagList.length) m.tags = tagList;\r\n return Object.keys(m).length ? m : undefined;\r\n })();\r\n\r\n const handler = async (req: AzuraRequest, res: AzuraResponse) => {\r\n const args = this.resolveParams(paramsMeta, req, res);\r\n const result = await instance[propertyKey](...args);\r\n if (result !== undefined && !res.sent) {\r\n if (typeof result === \"object\") {\r\n res.json(result);\r\n } else {\r\n res.send(String(result));\r\n }\r\n }\r\n };\r\n\r\n this.router.add(routeMeta.method, fullPath, handler, allMiddlewares, mergedMeta);\r\n }\r\n }\r\n\r\n private resolveParams(paramsMeta: any[], req: AzuraRequest, res: AzuraResponse): any[] {\r\n if (!paramsMeta || paramsMeta.length === 0) return [req, res];\r\n\r\n const sorted = [...paramsMeta].sort((a, b) => a.index - b.index);\r\n const args: any[] = new Array(sorted.length);\r\n\r\n for (const meta of sorted) {\r\n let value: any;\r\n\r\n switch (meta.type) {\r\n case \"body\":\r\n value = meta.name ? req.body?.[meta.name] : req.body;\r\n break;\r\n case \"query\":\r\n value = meta.name ? req.query[meta.name] : req.query;\r\n break;\r\n case \"param\":\r\n value = meta.name ? req.params[meta.name] : req.params;\r\n break;\r\n case \"header\":\r\n value = meta.name ? req.headers[meta.name.toLowerCase()] : req.headers;\r\n break;\r\n case \"cookie\":\r\n value = meta.name ? req.cookies[meta.name] : req.cookies;\r\n break;\r\n case \"req\":\r\n value = req;\r\n break;\r\n case \"res\":\r\n value = res;\r\n break;\r\n case \"next\":\r\n value = () => {};\r\n break;\r\n case \"ip\":\r\n value = req.ip;\r\n break;\r\n case \"session\":\r\n value = req.session;\r\n break;\r\n default:\r\n value = undefined;\r\n }\r\n\r\n if (meta.pipes) {\r\n for (const pipe of meta.pipes) {\r\n value = pipe(value);\r\n }\r\n }\r\n\r\n args[meta.index] = value;\r\n }\r\n\r\n return args;\r\n }\r\n\r\n private joinPaths(prefix: string, path: string): string {\r\n const p = prefix.endsWith(\"/\") ? prefix.slice(0, -1) : prefix;\r\n const s = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${p}${s}`;\r\n }\r\n\r\n private extendRequest(req: IncomingMessage, pathname: string, query: Record<string, string | string[]>): AzuraRequest {\r\n const azReq = req as AzuraRequest;\r\n azReq.pathname = pathname;\r\n azReq.query = query;\r\n azReq.params = {};\r\n azReq.cookies = parseCookies(req.headers.cookie);\r\n azReq.ip = resolveIp(req);\r\n azReq.protocol = (req.socket as any).encrypted ? \"https\" : \"http\";\r\n azReq.secure = azReq.protocol === \"https\";\r\n azReq.hostname = (req.headers.host ?? \"localhost\").split(\":\")[0];\r\n azReq.startTime = process.hrtime.bigint();\r\n azReq.raw = req;\r\n return azReq;\r\n }\r\n\r\n private extendResponse(res: ServerResponse): AzuraResponse {\r\n const azRes = res as AzuraResponse;\r\n azRes.locals = {};\r\n azRes.sent = false;\r\n\r\n azRes.status = function (code: number) {\r\n this.statusCode = code;\r\n return this;\r\n };\r\n\r\n azRes.json = function (data: unknown) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n const body = JSON.stringify(data);\r\n this.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.send = function (body: string | Buffer) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n if (!this.getHeader(\"Content-Type\")) {\r\n this.setHeader(\"Content-Type\", typeof body === \"string\" ? \"text/plain; charset=utf-8\" : \"application/octet-stream\");\r\n }\r\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\r\n this.setHeader(\"Content-Length\", buf.length);\r\n this.end(buf);\r\n };\r\n\r\n azRes.html = function (body: string) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.redirect = function (url: string, code = 302) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.statusCode = code;\r\n this.setHeader(\"Location\", url);\r\n this.end();\r\n };\r\n\r\n azRes.cookie = function (name: string, value: string, options?: CookieOptions) {\r\n const header = serializeCookie(name, value, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.clearCookie = function (name: string, options?: CookieOptions) {\r\n const header = clearCookieHeader(name, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.header = function (name: string, value: string | number | string[]) {\r\n this.setHeader(name, value as any);\r\n return this;\r\n };\r\n\r\n azRes.type = function (contentType: string) {\r\n this.setHeader(\"Content-Type\", contentType);\r\n return this;\r\n };\r\n\r\n azRes.attachment = function (filename?: string) {\r\n if (filename) {\r\n this.setHeader(\"Content-Disposition\", `attachment; filename=\"${filename}\"`);\r\n } else {\r\n this.setHeader(\"Content-Disposition\", \"attachment\");\r\n }\r\n return this;\r\n };\r\n\r\n azRes.download = function (_path: string, _filename?: string) {\r\n // TODO: implement file streaming\r\n };\r\n\r\n return azRes;\r\n }\r\n\r\n private compileMiddlewareChain(): (req: AzuraRequest, res: AzuraResponse) => Promise<void> {\r\n if (this.compiledChain) return this.compiledChain;\r\n\r\n const self = this;\r\n const globalMiddlewares = [...this.middlewares];\r\n\r\n this.compiledChain = async (req: AzuraRequest, res: AzuraResponse) => {\r\n for (const plugin of self.plugins) {\r\n if (res.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = plugin({ req, res }, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (res.sent) return;\r\n\r\n let idx = 0;\r\n const runMiddleware = async (): Promise<void> => {\r\n if (idx >= globalMiddlewares.length || res.sent) return;\r\n const mw = globalMiddlewares[idx++];\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(req, res, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n await runMiddleware();\r\n };\r\n\r\n await runMiddleware();\r\n };\r\n\r\n return this.compiledChain;\r\n }\r\n\r\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n const { pathname, search } = parseUrl(req.url ?? \"/\");\r\n const query = parseQueryString(search);\r\n\r\n const azReq = this.extendRequest(req, pathname, query);\r\n const azRes = this.extendResponse(res);\r\n\r\n try {\r\n const chain = this.compileMiddlewareChain();\r\n await chain(azReq, azRes);\r\n\r\n if (azRes.sent) return;\r\n\r\n const method = (req.method ?? \"GET\").toUpperCase() as HttpMethod;\r\n const match = this.router.find(method, pathname);\r\n\r\n if (!match) {\r\n if (pathname === \"/favicon.ico\") {\r\n azRes.status(204).send(\"\");\r\n return;\r\n }\r\n throw HttpError.notFound(`Route ${method} ${pathname} not found`);\r\n }\r\n\r\n azReq.params = match.params;\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\") {\r\n azReq.body = await parseBody(req);\r\n }\r\n\r\n for (const mw of match.middlewares) {\r\n if (azRes.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(azReq, azRes, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (azRes.sent) return;\r\n\r\n const result = await match.handler(azReq, azRes);\r\n\r\n if (result !== undefined && !azRes.sent) {\r\n if (typeof result === \"object\" && result !== null) {\r\n azRes.json(result);\r\n } else {\r\n azRes.send(String(result));\r\n }\r\n }\r\n } catch (err) {\r\n this.handleError(err, azReq, azRes);\r\n } finally {\r\n if (this.config.logging?.requestLogging) {\r\n const duration = process.hrtime.bigint() - azReq.startTime;\r\n this.logger.request(\r\n req.method ?? \"GET\",\r\n pathname,\r\n res.statusCode,\r\n duration,\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleError(err: any, req: AzuraRequest, res: AzuraResponse): void {\r\n if (res.sent) return;\r\n\r\n if (this.errorHandler) {\r\n try {\r\n this.errorHandler(err, req, res, () => {});\r\n return;\r\n } catch (handlerErr) {\r\n this.logger.error(\"Error handler threw:\", handlerErr);\r\n }\r\n }\r\n\r\n if (err instanceof HttpError) {\r\n res.status(err.statusCode).json(err.toJSON());\r\n return;\r\n }\r\n\r\n const statusCode = err?.statusCode ?? err?.status ?? 500;\r\n const message = this.config.environment === \"production\"\r\n ? \"Internal Server Error\"\r\n : err?.message ?? \"Internal Server Error\";\r\n\r\n this.logger.error(`Unhandled error: ${err?.message ?? err}`);\r\n if (this.config.debug && err?.stack) {\r\n this.logger.error(err.stack);\r\n }\r\n\r\n res.status(statusCode).json({\r\n error: {\r\n statusCode,\r\n message,\r\n ...(this.config.debug ? { stack: err?.stack } : {}),\r\n },\r\n });\r\n }\r\n\r\n async listen(port?: number, callback?: () => void): Promise<Server> {\r\n const serverPort = port ?? this.config.server?.port ?? 3000;\r\n const host = this.config.server?.host ?? \"0.0.0.0\";\r\n\r\n const handler = (req: IncomingMessage, res: ServerResponse) => {\r\n this.handleRequest(req, res).catch((err) => {\r\n this.logger.error(\"Fatal request error:\", err);\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.end('{\"error\":{\"statusCode\":500,\"message\":\"Internal Server Error\"}}');\r\n }\r\n });\r\n };\r\n\r\n if (this.config.server?.https) {\r\n const httpsConfig = this.config.server.https;\r\n this.server = createHttpsServer(\r\n {\r\n key: readFileSync(httpsConfig.key),\r\n cert: readFileSync(httpsConfig.cert),\r\n ...(httpsConfig.ca ? { ca: readFileSync(httpsConfig.ca) } : {}),\r\n },\r\n handler,\r\n );\r\n } else {\r\n this.server = createServer(handler);\r\n }\r\n\r\n if (this.config.server?.keepAliveTimeout) {\r\n this.server.keepAliveTimeout = this.config.server.keepAliveTimeout;\r\n }\r\n if (this.config.server?.headersTimeout) {\r\n this.server.headersTimeout = this.config.server.headersTimeout;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this.server!.listen(serverPort, host, () => {\r\n this.logger.banner(serverPort, host);\r\n callback?.();\r\n resolve(this.server!);\r\n });\r\n });\r\n }\r\n\r\n async close(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n resolve();\r\n return;\r\n }\r\n this.server.close((err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n });\r\n }\r\n\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n getLogger(): Logger {\r\n return this.logger;\r\n }\r\n\r\n getConfig(): AzuraConfig {\r\n return this.config;\r\n }\r\n\r\n getRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.router.getAllRoutes();\r\n }\r\n\r\n /** Rotas com metadados OpenAPI (para Swagger ou export manual). */\r\n getRouteDocuments() {\r\n return this.router.getRouteDocuments();\r\n }\r\n\r\n /** Gera documento OpenAPI 3.0 a partir das rotas registadas. */\r\n getOpenApiDocument(options: BuildOpenApiOptions = {}) {\r\n return buildOpenApiDocument(this.getRouteDocuments(), options);\r\n }\r\n}\r\n"]}
|