@dev-anywhere/proxy 0.1.9 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-BMVYMCKF.js → chunk-3ZUZ22V6.js} +2 -2
- package/dist/{chunk-7XMJMVIL.js → chunk-4YQ2JUM7.js} +41 -6
- package/dist/chunk-4YQ2JUM7.js.map +1 -0
- package/dist/chunk-7UOPAMX7.js +220 -0
- package/dist/chunk-7UOPAMX7.js.map +1 -0
- package/dist/chunk-NBRBO5GS.js +1032 -0
- package/dist/chunk-NBRBO5GS.js.map +1 -0
- package/dist/chunk-NQDJ6QAM.js +18 -0
- package/dist/chunk-NQDJ6QAM.js.map +1 -0
- package/dist/chunk-OBYEKZWC.js +104 -0
- package/dist/chunk-OBYEKZWC.js.map +1 -0
- package/dist/chunk-PWG6K5QB.js +204 -0
- package/dist/chunk-PWG6K5QB.js.map +1 -0
- package/dist/{chunk-DCDXAM76.js → chunk-RIQ6OL7X.js} +9 -6
- package/dist/chunk-RIQ6OL7X.js.map +1 -0
- package/dist/{chunk-6O6JTF24.js → chunk-WUBRUO3G.js} +1 -1
- package/dist/index.js +5 -5
- package/dist/{relay-token-Z4JZFPQ5.js → relay-token-RKAVVQHE.js} +5 -4
- package/dist/{relay-token-Z4JZFPQ5.js.map → relay-token-RKAVVQHE.js.map} +1 -1
- package/dist/serve.js +538 -431
- package/dist/serve.js.map +1 -1
- package/dist/session-worker.js +99 -32
- package/dist/session-worker.js.map +1 -1
- package/dist/{terminal-FJAIRC73.js → terminal-YO2D2OJU.js} +194 -151
- package/dist/terminal-YO2D2OJU.js.map +1 -0
- package/package.json +3 -3
- package/dist/chunk-2JUB4LDU.js +0 -84
- package/dist/chunk-2JUB4LDU.js.map +0 -1
- package/dist/chunk-7XMJMVIL.js.map +0 -1
- package/dist/chunk-DCDXAM76.js.map +0 -1
- package/dist/chunk-ORZTFYXR.js +0 -123
- package/dist/chunk-ORZTFYXR.js.map +0 -1
- package/dist/chunk-QFYI6AMN.js +0 -870
- package/dist/chunk-QFYI6AMN.js.map +0 -1
- package/dist/chunk-U5T7ZYXT.js +0 -346
- package/dist/chunk-U5T7ZYXT.js.map +0 -1
- package/dist/terminal-FJAIRC73.js.map +0 -1
- /package/dist/{chunk-BMVYMCKF.js.map → chunk-3ZUZ22V6.js.map} +0 -0
- /package/dist/{chunk-6O6JTF24.js.map → chunk-WUBRUO3G.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { atomicWriteFileSync } from \"./atomic-write.js\";\nimport { dirname, isAbsolute } from \"node:path\";\nimport { z } from \"zod\";\nimport { CONFIG_PATH, PROFILE_NAME, defaultHookPortForProfile } from \"./paths.js\";\nimport { serviceLogger } from \"./logger.js\";\nimport { VALID_LOG_LEVELS, loadProxyRuntimeEnv } from \"./runtime-env.js\";\nimport type { ProviderId } from \"../providers/types.js\";\n\nexport type { LogLevel } from \"./runtime-env.js\";\n\nexport interface ProxyConfig {\n profileName: string;\n relayName: string;\n relayUrl?: string;\n // /proxy 端点的预共享 token, 和 relay 侧 RELAY_PROXY_TOKEN 对应. 公网 relay 必须设置\n relayToken?: string;\n hookPort?: number;\n claudeBin?: string;\n codexBin?: string;\n previewRoots: string[];\n agentCliSuggestions: Record<ProviderId, string[]>;\n sources: {\n relayName: \"cli\" | \"profile\";\n relayUrl: \"env\" | \"file\" | \"none\";\n relayToken: \"env\" | \"file\" | \"none\";\n hookPort: \"env\" | \"default\";\n claudeBin: \"env\" | \"file\" | \"none\";\n codexBin: \"env\" | \"file\" | \"none\";\n };\n}\n\nconst LogLevelSchema = z.enum(VALID_LOG_LEVELS);\n// LogLevel 由 runtime-env.ts 定义并 re-export,schema 用同一组字面量保证两边对齐。\n\nconst RelayTargetSchema = z\n .object({\n url: z.string().optional(),\n proxyToken: z.string().optional(),\n })\n .strict();\n\nconst ProxyProfileSchema = z\n .object({\n relay: z.string().optional(),\n })\n .strict();\n\nconst AgentCliSchema = z\n .object({\n claudeBin: z.string().optional(),\n codexBin: z.string().optional(),\n claudeBinHistory: z.array(z.string()).optional(),\n codexBinHistory: z.array(z.string()).optional(),\n })\n .strict();\n\n// .strict() 在顶层捕获拼错的字段(\"relayss\" / \"profile\"),但 profiles/relays 内部\n// 是 record(用户定义键),不限制键名。\nconst ProxyConfigFileSchema = z\n .object({\n defaultProfile: z.string().optional(),\n profiles: z.record(z.string(), ProxyProfileSchema),\n relays: z.record(z.string(), RelayTargetSchema),\n agentCli: AgentCliSchema.optional(),\n previewRoots: z.array(z.string()).optional(),\n logLevel: LogLevelSchema.optional(),\n })\n .strict();\n\ntype ProxyConfigFile = z.infer<typeof ProxyConfigFileSchema>;\ntype RelayTargetConfig = z.infer<typeof RelayTargetSchema>;\ntype AgentCliConfig = z.infer<typeof AgentCliSchema>;\n\nfunction readConfigFile(): ProxyConfigFile {\n if (!existsSync(CONFIG_PATH)) {\n throw new Error(`Dev Anywhere config not found at ${CONFIG_PATH}. Run \"dev-anywhere init\".`);\n }\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(CONFIG_PATH, \"utf-8\"));\n } catch (err) {\n throw new Error(\n `${CONFIG_PATH} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n const parsed = ProxyConfigFileSchema.safeParse(raw);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map(\n (issue) => ` ${issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\"}: ${issue.message}`,\n )\n .join(\"\\n\");\n throw new Error(`Invalid config at ${CONFIG_PATH}:\\n${issues}`);\n }\n return parsed.data;\n}\n\nfunction agentCliField(provider: ProviderId): \"claudeBin\" | \"codexBin\" {\n return provider === \"claude\" ? \"claudeBin\" : \"codexBin\";\n}\n\nfunction agentCliHistoryField(provider: ProviderId): \"claudeBinHistory\" | \"codexBinHistory\" {\n return provider === \"claude\" ? \"claudeBinHistory\" : \"codexBinHistory\";\n}\n\nfunction validateAgentCliPath(path: string): string {\n const normalized = path.trim();\n if (!normalized) throw new Error(\"请输入 CLI 路径\");\n if (!isAbsolute(normalized)) throw new Error(\"CLI 路径必须是绝对路径\");\n return normalized;\n}\n\nfunction uniqueAbsolutePaths(paths: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const path of paths) {\n const normalized = path?.trim();\n if (!normalized || !isAbsolute(normalized) || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nfunction resolveRelayConfig(\n fromFile: ProxyConfigFile,\n requestedRelayName?: string,\n): {\n relayName: string;\n relayNameSource: ProxyConfig[\"sources\"][\"relayName\"];\n relay: RelayTargetConfig;\n} {\n const profile = fromFile.profiles[PROFILE_NAME];\n if (!profile) {\n const available = Object.keys(fromFile.profiles).sort();\n throw new Error(\n `Unknown profile \"${PROFILE_NAME}\". Available profiles: ${available.length > 0 ? available.join(\", \") : \"(none)\"}`,\n );\n }\n\n const relayName = requestedRelayName?.trim() || profile.relay?.trim();\n if (!relayName) {\n throw new Error(`Profile \"${PROFILE_NAME}\" must specify a relay.`);\n }\n\n const relay = fromFile.relays[relayName];\n if (!relay) {\n const available = Object.keys(fromFile.relays).sort();\n throw new Error(\n `Unknown relay \"${relayName}\". Available relays: ${available.length > 0 ? available.join(\", \") : \"(none)\"}`,\n );\n }\n\n return {\n relayName,\n relayNameSource: requestedRelayName?.trim() ? \"cli\" : \"profile\",\n relay,\n };\n}\n\nexport function loadConfig(options?: { relayName?: string }): ProxyConfig {\n const env = loadProxyRuntimeEnv();\n const fromFile = readConfigFile();\n const agentCli = fromFile.agentCli ?? {};\n const resolved = resolveRelayConfig(fromFile, options?.relayName);\n const claudeBin = env.claudeBin ?? agentCli.claudeBin;\n const codexBin = env.codexBin ?? agentCli.codexBin;\n const config: ProxyConfig = {\n profileName: PROFILE_NAME,\n relayName: resolved.relayName,\n relayUrl: env.relayUrl ?? resolved.relay.url,\n relayToken: env.relayProxyToken ?? resolved.relay.proxyToken,\n hookPort: env.hookPort ?? defaultHookPortForProfile(PROFILE_NAME),\n claudeBin,\n codexBin,\n previewRoots: uniqueAbsolutePaths(fromFile.previewRoots ?? []),\n agentCliSuggestions: {\n claude: uniqueAbsolutePaths([\n env.claudeBin,\n agentCli.claudeBin,\n ...(agentCli.claudeBinHistory ?? []),\n ]),\n codex: uniqueAbsolutePaths([\n env.codexBin,\n agentCli.codexBin,\n ...(agentCli.codexBinHistory ?? []),\n ]),\n },\n sources: {\n relayName: resolved.relayNameSource,\n relayUrl: env.relayUrl ? \"env\" : resolved.relay.url ? \"file\" : \"none\",\n relayToken: env.relayProxyToken ? \"env\" : resolved.relay.proxyToken ? \"file\" : \"none\",\n hookPort: env.hookPort !== undefined ? \"env\" : \"default\",\n claudeBin: env.claudeBin ? \"env\" : agentCli.claudeBin ? \"file\" : \"none\",\n codexBin: env.codexBin ? \"env\" : agentCli.codexBin ? \"file\" : \"none\",\n },\n };\n\n serviceLogger.info(\n {\n profile: config.profileName,\n relayName: config.relayName,\n relayNameSource: config.sources.relayName,\n relayUrl: config.relayUrl ?? \"(unset)\",\n relayUrlSource: config.sources.relayUrl,\n relayTokenSource: config.sources.relayToken,\n hookPort: config.hookPort,\n hookPortSource: config.sources.hookPort,\n claudeBinSource: config.sources.claudeBin,\n codexBinSource: config.sources.codexBin,\n },\n \"Config loaded\",\n );\n\n return config;\n}\n\nexport function buildProviderEnv(\n config: ProxyConfig,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n return {\n ...baseEnv,\n ...(config.claudeBin ? { CLAUDE_BIN: config.claudeBin } : {}),\n ...(config.codexBin ? { CODEX_BIN: config.codexBin } : {}),\n };\n}\n\nfunction updateAgentCliConfig(\n config: AgentCliConfig,\n provider: ProviderId,\n path: string,\n): AgentCliConfig {\n const field = agentCliField(provider);\n const historyField = agentCliHistoryField(provider);\n const history = uniqueAbsolutePaths([path, ...(config[historyField] ?? [])]).slice(0, 8);\n return {\n ...config,\n [field]: path,\n [historyField]: history,\n };\n}\n\nexport function saveAgentCliPath(provider: ProviderId, path: string): void {\n const normalized = validateAgentCliPath(path);\n const fromFile = readConfigFile();\n fromFile.agentCli = updateAgentCliConfig(fromFile.agentCli ?? {}, provider, normalized);\n mkdirSync(dirname(CONFIG_PATH), { recursive: true });\n // mode 0o600: config 文件含 relays[].proxyToken 等敏感字段, 不能让其他用户读到\n atomicWriteFileSync(CONFIG_PATH, `${JSON.stringify(fromFile, null, 2)}\\n`, { mode: 0o600 });\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
daemonRelayArgs,
|
|
4
4
|
setDesiredDaemonRelay
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3ZUZ22V6.js";
|
|
6
6
|
import {
|
|
7
7
|
spawnScript
|
|
8
8
|
} from "./chunk-ZUWAB67J.js";
|
|
9
9
|
import {
|
|
10
10
|
createIpcReader,
|
|
11
11
|
serializeIpc
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NBRBO5GS.js";
|
|
13
13
|
import {
|
|
14
14
|
CONFIG_PATH,
|
|
15
15
|
PID_PATH,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
ensureProfileWorkspace,
|
|
21
21
|
initWorkspace,
|
|
22
22
|
isInitialized
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-PWG6K5QB.js";
|
|
24
24
|
|
|
25
25
|
// src/index.ts
|
|
26
26
|
import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
@@ -246,7 +246,7 @@ var program = new Command("dev-anywhere").description("Dev Anywhere - transparen
|
|
|
246
246
|
console.error(err instanceof Error ? err.message : String(err));
|
|
247
247
|
process.exit(1);
|
|
248
248
|
}
|
|
249
|
-
const { startTerminal } = await import("./terminal-
|
|
249
|
+
const { startTerminal } = await import("./terminal-YO2D2OJU.js");
|
|
250
250
|
const { provider, args } = invocation;
|
|
251
251
|
await startTerminal(args, provider);
|
|
252
252
|
});
|
|
@@ -300,7 +300,7 @@ relay.command("token").description("Print the relay's current client token (auth
|
|
|
300
300
|
console.error(`Dev Anywhere is not initialized. Run "dev-anywhere init" first.`);
|
|
301
301
|
process.exit(1);
|
|
302
302
|
}
|
|
303
|
-
const { runRelayTokenCommand } = await import("./relay-token-
|
|
303
|
+
const { runRelayTokenCommand } = await import("./relay-token-RKAVVQHE.js");
|
|
304
304
|
await runRelayTokenCommand({ relayName: opts.relay });
|
|
305
305
|
});
|
|
306
306
|
program.addCommand(relay);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-RIQ6OL7X.js";
|
|
5
|
+
import "./chunk-NQDJ6QAM.js";
|
|
6
|
+
import "./chunk-7UOPAMX7.js";
|
|
7
|
+
import "./chunk-PWG6K5QB.js";
|
|
7
8
|
|
|
8
9
|
// src/relay-token.ts
|
|
9
10
|
function toHttpUrl(relayUrl) {
|
|
@@ -78,4 +79,4 @@ function printResult(relayName, relayUrl, result) {
|
|
|
78
79
|
export {
|
|
79
80
|
runRelayTokenCommand
|
|
80
81
|
};
|
|
81
|
-
//# sourceMappingURL=relay-token-
|
|
82
|
+
//# sourceMappingURL=relay-token-RKAVVQHE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/relay-token.ts"],"sourcesContent":["// `dev-anywhere relay token` 实现:用本地 proxyToken 向已配置的 relay\n// 请求当前生效的 client token,避免运维者必须 ssh 到 VPS 读 .env。\nimport { loadConfig } from \"./common/config.js\";\n\ninterface FetchClientTokenResult {\n status: \"ok\" | \"no_client_token\";\n clientToken?: string;\n}\n\nfunction toHttpUrl(relayUrl: string): string {\n return relayUrl.replace(/^ws:/i, \"http:\").replace(/^wss:/i, \"https:\").replace(/\\/$/, \"\");\n}\n\nexport async function runRelayTokenCommand(options: { relayName?: string }): Promise<void> {\n let config: ReturnType<typeof loadConfig>;\n try {\n config = loadConfig({ relayName: options.relayName });\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n const { relayName, relayUrl, relayToken } = config;\n if (!relayUrl) {\n console.error(\n `Relay \"${relayName}\" has no URL configured. Edit ~/.dev-anywhere/config.json or set RELAY_URL.`,\n );\n process.exit(1);\n }\n if (!relayToken) {\n console.error(\n `Relay \"${relayName}\" has no proxy token configured. The admin endpoint requires one.`,\n );\n process.exit(1);\n }\n\n const adminUrl = `${toHttpUrl(relayUrl)}/api/admin/client-token`;\n let res: Response;\n try {\n res = await fetch(adminUrl, {\n headers: { authorization: `Bearer ${relayToken}` },\n cache: \"no-store\",\n });\n } catch (err) {\n console.error(`Request to ${adminUrl} failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n\n if (res.status === 401) {\n console.error(\n `Relay rejected the proxy token (HTTP 401). Verify ~/.dev-anywhere/config.json matches the relay's RELAY_PROXY_TOKEN.`,\n );\n process.exit(1);\n }\n if (res.status === 204) {\n const result: FetchClientTokenResult = { status: \"no_client_token\" };\n printResult(relayName, relayUrl, result);\n return;\n }\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(`Unexpected response from relay (HTTP ${res.status}): ${body}`);\n process.exit(1);\n }\n\n const json = (await res.json()) as { clientToken?: unknown };\n if (typeof json.clientToken !== \"string\" || json.clientToken.length === 0) {\n console.error(`Relay returned a malformed payload: ${JSON.stringify(json)}`);\n process.exit(1);\n }\n printResult(relayName, relayUrl, { status: \"ok\", clientToken: json.clientToken });\n}\n\nfunction printResult(relayName: string, relayUrl: string, result: FetchClientTokenResult): void {\n const httpBase = toHttpUrl(relayUrl);\n console.log(`Relay: ${relayName} (${relayUrl})`);\n if (result.status === \"no_client_token\") {\n console.log(`Token: (not configured — /client endpoint is open)`);\n console.log(`URL: ${httpBase}/`);\n return;\n }\n console.log(`Token: ${result.clientToken}`);\n console.log(`URL: ${httpBase}/?relayToken=${encodeURIComponent(result.clientToken!)}`);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/relay-token.ts"],"sourcesContent":["// `dev-anywhere relay token` 实现:用本地 proxyToken 向已配置的 relay\n// 请求当前生效的 client token,避免运维者必须 ssh 到 VPS 读 .env。\nimport { loadConfig } from \"./common/config.js\";\n\ninterface FetchClientTokenResult {\n status: \"ok\" | \"no_client_token\";\n clientToken?: string;\n}\n\nfunction toHttpUrl(relayUrl: string): string {\n return relayUrl.replace(/^ws:/i, \"http:\").replace(/^wss:/i, \"https:\").replace(/\\/$/, \"\");\n}\n\nexport async function runRelayTokenCommand(options: { relayName?: string }): Promise<void> {\n let config: ReturnType<typeof loadConfig>;\n try {\n config = loadConfig({ relayName: options.relayName });\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n const { relayName, relayUrl, relayToken } = config;\n if (!relayUrl) {\n console.error(\n `Relay \"${relayName}\" has no URL configured. Edit ~/.dev-anywhere/config.json or set RELAY_URL.`,\n );\n process.exit(1);\n }\n if (!relayToken) {\n console.error(\n `Relay \"${relayName}\" has no proxy token configured. The admin endpoint requires one.`,\n );\n process.exit(1);\n }\n\n const adminUrl = `${toHttpUrl(relayUrl)}/api/admin/client-token`;\n let res: Response;\n try {\n res = await fetch(adminUrl, {\n headers: { authorization: `Bearer ${relayToken}` },\n cache: \"no-store\",\n });\n } catch (err) {\n console.error(`Request to ${adminUrl} failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n\n if (res.status === 401) {\n console.error(\n `Relay rejected the proxy token (HTTP 401). Verify ~/.dev-anywhere/config.json matches the relay's RELAY_PROXY_TOKEN.`,\n );\n process.exit(1);\n }\n if (res.status === 204) {\n const result: FetchClientTokenResult = { status: \"no_client_token\" };\n printResult(relayName, relayUrl, result);\n return;\n }\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(`Unexpected response from relay (HTTP ${res.status}): ${body}`);\n process.exit(1);\n }\n\n const json = (await res.json()) as { clientToken?: unknown };\n if (typeof json.clientToken !== \"string\" || json.clientToken.length === 0) {\n console.error(`Relay returned a malformed payload: ${JSON.stringify(json)}`);\n process.exit(1);\n }\n printResult(relayName, relayUrl, { status: \"ok\", clientToken: json.clientToken });\n}\n\nfunction printResult(relayName: string, relayUrl: string, result: FetchClientTokenResult): void {\n const httpBase = toHttpUrl(relayUrl);\n console.log(`Relay: ${relayName} (${relayUrl})`);\n if (result.status === \"no_client_token\") {\n console.log(`Token: (not configured — /client endpoint is open)`);\n console.log(`URL: ${httpBase}/`);\n return;\n }\n console.log(`Token: ${result.clientToken}`);\n console.log(`URL: ${httpBase}/?relayToken=${encodeURIComponent(result.clientToken!)}`);\n}\n"],"mappings":";;;;;;;;;AASA,SAAS,UAAU,UAA0B;AAC3C,SAAO,SAAS,QAAQ,SAAS,OAAO,EAAE,QAAQ,UAAU,QAAQ,EAAE,QAAQ,OAAO,EAAE;AACzF;AAEA,eAAsB,qBAAqB,SAAgD;AACzF,MAAI;AACJ,MAAI;AACF,aAAS,WAAW,EAAE,WAAW,QAAQ,UAAU,CAAC;AAAA,EACtD,SAAS,KAAK;AACZ,YAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,WAAW,UAAU,WAAW,IAAI;AAC5C,MAAI,CAAC,UAAU;AACb,YAAQ;AAAA,MACN,UAAU,SAAS;AAAA,IACrB;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,CAAC,YAAY;AACf,YAAQ;AAAA,MACN,UAAU,SAAS;AAAA,IACrB;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,GAAG,UAAU,QAAQ,CAAC;AACvC,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,UAAU;AAAA,MAC1B,SAAS,EAAE,eAAe,UAAU,UAAU,GAAG;AAAA,MACjD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,MAAM,cAAc,QAAQ,YAAY,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,IAAI,WAAW,KAAK;AACtB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,IAAI,WAAW,KAAK;AACtB,UAAM,SAAiC,EAAE,QAAQ,kBAAkB;AACnE,gBAAY,WAAW,UAAU,MAAM;AACvC;AAAA,EACF;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,YAAQ,MAAM,wCAAwC,IAAI,MAAM,MAAM,IAAI,EAAE;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,WAAW,GAAG;AACzE,YAAQ,MAAM,uCAAuC,KAAK,UAAU,IAAI,CAAC,EAAE;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,cAAY,WAAW,UAAU,EAAE,QAAQ,MAAM,aAAa,KAAK,YAAY,CAAC;AAClF;AAEA,SAAS,YAAY,WAAmB,UAAkB,QAAsC;AAC9F,QAAM,WAAW,UAAU,QAAQ;AACnC,UAAQ,IAAI,UAAU,SAAS,KAAK,QAAQ,GAAG;AAC/C,MAAI,OAAO,WAAW,mBAAmB;AACvC,YAAQ,IAAI,yDAAoD;AAChE,YAAQ,IAAI,UAAU,QAAQ,GAAG;AACjC;AAAA,EACF;AACA,UAAQ,IAAI,UAAU,OAAO,WAAW,EAAE;AAC1C,UAAQ,IAAI,UAAU,QAAQ,gBAAgB,mBAAmB,OAAO,WAAY,CAAC,EAAE;AACzF;","names":[]}
|