{"version":3,"sources":["../main/cli/index.ts","../package.json","../main/utils/fs.ts","../main/config/index.ts","../main/config/defaults.ts","../main/config/manager.ts","../main/config/validator.ts","../main/utils/logger.ts","../main/cli/commands/init.ts","../main/cli/wrapper.ts","../main/core/ast/index.ts","../main/core/key-generator/index.ts","../main/utils/import-manager.ts","../main/utils/pattern.ts","../main/cli/commands/extract.ts","../main/core/translation/providers/baidu.ts","../main/core/translation/queue.ts","../main/core/translation/cache.ts","../main/utils/progress-display.ts","../main/utils/write-queue.ts","../main/core/translation/manager.ts","../main/utils/config-validator.ts","../main/core/translation/translation-checker.ts","../main/core/translation/reports.ts","../main/core/translation/cli.ts","../main/cli/commands/translate.ts","../main/core/check/cli.ts","../main/cli/commands/check.ts","../main/cli/commands/rpkey.ts","../main/cli/commands/check-translation.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { version } from '../../package.json';\n\n// 导入各个命令\nimport { initCommand } from './commands/init';\nimport { extractCommand } from './commands/extract';\nimport { translateCommand } from './commands/translate';\nimport { checkCommand } from './commands/check';\nimport { rpkeyCommand } from './commands/rpkey';\nimport { checkTranslationCommand } from './commands/check-translation';\n\nconst program = new Command();\n\nprogram.name('i18n-xy').description('自动提取React项目中的中文字符串并国际化').version(version);\n\nprogram\n  .command('init')\n  .alias('i')\n  .description('初始化i18n配置')\n  .option('-o, --outputDir <dir>', '国际化文件输出目录', '.test-output/locales')\n  .option('-t, --tempDir <dir>', '临时文件目录', '.test-output/temp')\n  .option('-c, --configPath <path>', '配置文件保存路径', './i18n.config.json')\n  .option('-l, --locale <locale>', '源语言代码', 'zh-CN')\n  .option('-f, --functionName <name>', 'i18n函数名', '$t')\n  .action(initCommand);\n\nprogram\n  .command('extract')\n  .alias('e')\n  .description('提取中文并生成i18n key-value')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .action(extractCommand);\n\nprogram\n  .command('translate')\n  .alias('t')\n  .description('翻译中文字符串到其他语言')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .option('-f, --from <from>', '源语言代码（如：zh, en, auto）')\n  .option('-t, --to <to>', '目标语言代码（如：en, zh, ja, ko）')\n  .option('-i, --input <input>', '要翻译的文本或文件路径')\n  .option('-j, --json <json>', '指定要翻译的JSON文件路径')\n  .option('--batch', '批量翻译语言文件（从配置的源语言文件翻译）')\n  .option('--test', '测试模式：翻译单个文本')\n  .action(translateCommand);\n\nprogram\n  .command('check')\n  .alias('ck')\n  .description('检查还有哪些文件存在没有被t函数包裹的中文')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .option('-o, --output <path>', '自定义输出文件路径（默认生成i18n-check-report.md）')\n  .option('-s, --summary', '使用简略输出格式，只显示文件路径和中文文案（默认启用）')\n  .option('--detailed', '使用详细输出格式，显示完整信息')\n  .option('--no-file', '不生成文件，仅在控制台输出摘要')\n  .option('--include <types>', '指定要包含的内容类型：need（需要处理但未处理）, ignored（已忽略）, all（全部）', 'need')\n  .action(checkCommand);\n\nprogram\n  .command('rpkey')\n  .alias('rk')\n  .description('根据配置批量替换 $t(key) 为 $t(value)')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .action(rpkeyCommand);\n\nprogram\n  .command('check-translation')\n  .alias('ct')\n  .description('检查语言文件的翻译完整性')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .option('-l, --languages <languages>', '指定要检查的目标语言，用逗号分隔（未指定时自动从outputDir发现）')\n  .option('-o, --output [path]', '指定报告输出路径（Markdown格式），不指定路径时使用默认文件名')\n  .option('-s, --summary', '简略模式：仅显示前20个缺失的键和未翻译条目（默认启用）')\n  .option('--detailed', '详细模式：显示完整的缺失键和未翻译条目列表')\n  .action(checkTranslationCommand);\n\nprogram.parse();","{\n  \"name\": \"i18n-xy\",\n  \"version\": \"0.0.30\",\n  \"description\": \"自动提取React项目中的中文字符串并进行国际化的CLI工具\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"type\": \"module\",\n  \"bin\": {\n    \"i18n-xy\": \"dist/cli.cjs\",\n    \"i18nx\": \"dist/cli.cjs\"\n  },\n  \"files\": [\n    \"dist\",\n    \"README.md\"\n  ],\n  \"engines\": {\n    \"node\": \">=16.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"build\": \"tsup\",\n    \"dev\": \"tsup --watch\",\n    \"lint\": \"eslint main --ext .ts,.tsx --fix\",\n    \"lint:check\": \"eslint main --ext .ts,.tsx\",\n    \"format\": \"prettier --write \\\"main/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n    \"format:check\": \"prettier --check \\\"main/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n    \"format:fix\": \"pnpm run format && pnpm run lint\",\n    \"type-check\": \"tsc --noEmit\",\n    \"check-all\": \"pnpm run type-check && pnpm run lint:check && pnpm run format:check\",\n    \"prepublishOnly\": \"pnpm run build\",\n    \"postpack\": \"echo '✅ 打包完成，可以使用 npm publish 发布'\",\n    \"clean-test\": \"rm -rf test-output dist\",\n    \"extract\": \"pnpm build && node dist/cli.cjs extract\",\n    \"check\": \"pnpm build && node dist/cli.cjs check --no-file\",\n    \"translate\": \"pnpm build && node dist/cli.cjs translate --batch\",\n    \"rpkey\": \"pnpm build && node dist/cli.cjs rpkey\",\n    \"test:full\": \"pnpm clean-test && pnpm build && pnpm extract && pnpm check && pnpm translate && pnpm rpkey && echo '✅ 所有CLI测试完成'\"\n  },\n  \"keywords\": [\n    \"i18n\",\n    \"internationalization\",\n    \"localization\",\n    \"l10n\",\n    \"translation\",\n    \"react\",\n    \"vue\",\n    \"angular\",\n    \"frontend\",\n    \"cli\",\n    \"command-line-tool\",\n    \"development-tool\",\n    \"build-tool\",\n    \"typescript\",\n    \"javascript\",\n    \"jsx\",\n    \"tsx\",\n    \"babel\",\n    \"ast\",\n    \"abstract-syntax-tree\",\n    \"code-transformation\",\n    \"string-extraction\",\n    \"extraction\",\n    \"automation\",\n    \"chinese\",\n    \"chinese-characters\",\n    \"pinyin\",\n    \"chinese-to-pinyin\",\n    \"multilingual\",\n    \"language-files\",\n    \"json-generation\",\n    \"locale\",\n    \"text-processing\",\n    \"parser\",\n    \"generator\",\n    \"codemod\",\n    \"refactoring\"\n  ],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.27.2\",\n    \"@babel/core\": \"^7.27.4\",\n    \"@types/babel__generator\": \"^7.27.0\",\n    \"@types/babel__traverse\": \"^7.20.7\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/inquirer\": \"^9.0.8\",\n    \"@types/lodash\": \"^4.17.18\",\n    \"@types/micromatch\": \"^4.0.9\",\n    \"@types/node\": \"^24.0.3\",\n    \"@types/string-hash\": \"^1.1.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.13.0\",\n    \"@typescript-eslint/parser\": \"^8.13.0\",\n    \"eslint\": \"^9.15.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"eslint-plugin-prettier\": \"^5.2.1\",\n    \"prettier\": \"^3.3.3\",\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"^5.8.3\"\n  },\n  \"dependencies\": {\n    \"@babel/generator\": \"^7.27.5\",\n    \"@babel/parser\": \"^7.27.5\",\n    \"@babel/traverse\": \"^7.27.4\",\n    \"@babel/types\": \"^7.27.6\",\n    \"baidu-translate-service\": \"^2.2.4\",\n    \"cli-progress\": \"^3.12.0\",\n    \"commander\": \"^14.0.0\",\n    \"fast-glob\": \"^3.3.3\",\n    \"fs-extra\": \"^11.3.0\",\n    \"inquirer\": \"^12.6.3\",\n    \"lodash\": \"^4.17.21\",\n    \"micromatch\": \"^4.0.8\",\n    \"pinyin-pro\": \"^3.26.0\",\n    \"string-hash\": \"^1.1.3\"\n  }\n}\n","import * as fs from 'fs-extra';\nimport * as path from 'path';\nimport fg, { Options } from 'fast-glob';\n\n/**\n * 读取文件内容\n */\nexport function readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.readFile(absPath, encoding);\n}\n\n/**\n * 写入文件内容\n */\nexport function writeFile(filePath: string, data: string | Buffer): Promise<void> {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.outputFile(absPath, data);\n}\n\n/**\n * 写入文件内容，支持 tempDir 配置\n * @param filePath 原始文件路径\n * @param data 文件内容\n * @param tempDir 临时目录，如果配置则写入到临时目录，否则写入原始位置\n */\nexport function writeFileWithTempDir(\n  filePath: string,\n  data: string | Buffer,\n  tempDir?: string\n): Promise<void> {\n  let targetPath: string;\n\n  if (tempDir) {\n    // 如果配置了 tempDir，则在 tempDir 下按照原始路径结构生成文件\n    const relativePath = path.relative(process.cwd(), filePath);\n    targetPath = path.resolve(process.cwd(), tempDir, relativePath);\n  } else {\n    // 如果没有配置 tempDir，则直接写入原始文件\n    targetPath = path.resolve(process.cwd(), filePath);\n  }\n\n  return fs.outputFile(targetPath, data);\n}\n\n/**\n * 创建目录\n */\nexport function ensureDir(dirPath: string): Promise<void> {\n  const absPath = path.resolve(process.cwd(), dirPath);\n  return fs.ensureDir(absPath);\n}\n\n/**\n * 遍历目录下所有文件，支持glob模式和过滤参数\n */\nexport function findFiles(pattern: string | string[], options: Options = {}): Promise<string[]> {\n  return fg(pattern, { dot: true, ...options, cwd: process.cwd() });\n}\n\n/**\n * 根据 include/exclude 参数筛选目标文件，所有路径以 CLI 执行目录为根目录\n * @param include 需要包含的文件模式（glob数组或字符串）\n * @param exclude 需要排除的文件模式（glob数组或字符串）\n */\nexport function findTargetFiles(include: string[], exclude: string[] = []): Promise<string[]> {\n  return fg(include, { ignore: exclude, dot: true, cwd: process.cwd() });\n}\n\n/**\n * 检查文件是否存在\n * @param filePath 文件路径\n */\nexport function fileExists(filePath: string): boolean {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.existsSync(absPath);\n}\n\n/**\n * 同步读取 JSON 文件内容\n * @param filePath JSON 文件路径\n */\nexport function readJsonSync(filePath: string): unknown {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.readJsonSync(absPath);\n}\n\n/**\n * 异步读取 JSON 文件内容\n * @param filePath JSON 文件路径\n * @param defaultValue 文件不存在时的默认值\n */\nexport async function readJson<T = unknown>(filePath: string, defaultValue?: T): Promise<T> {\n  try {\n    const content = await readFile(filePath, 'utf-8');\n    return JSON.parse(content) as T;\n  } catch (error) {\n    if (defaultValue !== undefined) {\n      return defaultValue;\n    }\n    throw error;\n  }\n}\n\n/**\n * 异步写入 JSON 文件内容\n * @param filePath JSON 文件路径\n * @param data 要写入的数据\n * @param pretty 是否格式化输出，默认为 true\n */\nexport function writeJson(filePath: string, data: unknown, pretty: boolean = true): Promise<void> {\n  const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n  return writeFile(filePath, content);\n}","import { merge } from 'lodash';\nimport { I18nConfig } from './types';\nimport { defaultConfig } from './defaults';\nimport { fileExists, readJsonSync } from '../utils/fs';\nimport { Logger } from '../utils/logger';\n\n/**\n * 验证配置对象的有效性\n */\nfunction validateConfig(config: I18nConfig): void {\n  const errors: string[] = [];\n\n  // 验证必需字段\n  if (!config.include || !Array.isArray(config.include) || config.include.length === 0) {\n    errors.push('include 字段必须是非空数组');\n  }\n\n  if (!config.outputDir || typeof config.outputDir !== 'string') {\n    errors.push('outputDir 字段必须是有效的字符串路径');\n  }\n\n  if (!config.locale || typeof config.locale !== 'string') {\n    errors.push('locale 字段必须是有效的语言代码');\n  }\n\n  // 验证翻译配置\n  if (config.translation?.enabled) {\n    if (!config.translation.provider) {\n      errors.push('启用翻译时必须指定 translation.provider');\n    }\n\n    if (config.translation.provider === 'baidu') {\n      if (!config.translation.baidu?.appid || !config.translation.baidu?.key) {\n        errors.push('使用百度翻译时必须配置 translation.baidu.appid 和 translation.baidu.key');\n      }\n    }\n  }\n\n  // 验证日志级别\n  if (config.logging?.level && !['minimal', 'normal', 'verbose'].includes(config.logging.level)) {\n    errors.push('logging.level 必须是 minimal、normal 或 verbose 之一');\n  }\n\n  if (errors.length > 0) {\n    Logger.error('配置验证失败:', 'minimal');\n    errors.forEach((error) => Logger.error(`  - ${error}`, 'minimal'));\n    throw new Error(`配置验证失败: ${errors.join('; ')}`);\n  }\n}\n\nexport function loadConfig(customConfigPath?: string): I18nConfig {\n  let userConfig: Partial<I18nConfig> = {};\n\n  if (customConfigPath) {\n    if (fileExists(customConfigPath)) {\n      Logger.verbose(`加载配置文件: ${customConfigPath}`);\n      try {\n        userConfig = readJsonSync(customConfigPath) as Partial<I18nConfig>;\n        Logger.verbose('配置文件加载成功');\n      } catch (error) {\n        throw new Error(`配置文件解析失败: ${error}`);\n      }\n    } else {\n      Logger.warn(`配置文件不存在: ${customConfigPath}，使用默认配置`);\n    }\n  }\n\n  const finalConfig = merge({}, defaultConfig, userConfig) as I18nConfig;\n\n  // 验证最终配置\n  validateConfig(finalConfig);\n\n  Logger.verbose('配置验证通过');\n  return finalConfig;\n}\n\n// 导出其他相关模块\nexport { ConfigManager } from './manager';\nexport { ConfigValidator } from './validator';\nexport type { I18nConfig } from './types';","import { I18nConfig } from './types';\n\n// 默认配置\nexport const defaultConfig: I18nConfig = {\n  // 基础语言配置\n  locale: 'zh-CN',\n  displayLanguage: 'en-US',\n  outputDir: 'locales',\n  // tempDir: undefined,  // 可选，不设置则直接修改源文件\n\n  // 文件处理配置\n  include: [\n    'src/**/*.{js,jsx,ts,tsx}',\n  ],\n\n  exclude: [\n    'node_modules/**',\n    'dist/**',\n    'build/**',\n    '**/*.test.{js,jsx,ts,tsx}',\n    '**/*.spec.{js,jsx,ts,tsx}',\n  ],\n\n  // Key 生成配置\n  keyGeneration: {\n    maxChineseLength: 10, // 最大汉字长度\n    hashLength: 6, // 哈希长度\n    maxRetryCount: 5, // 最大重试次数\n    reuseExistingKey: true, // 默认重复使用相同文案的key\n    duplicateKeySuffix: 'hash', // 重复key后缀模式，默认hash\n    keyPrefix: '', // key前缀，默认为空\n    separator: '_', // 连接符，默认下划线\n    pinyinOptions: {\n      // 拼音转换选项\n      toneType: 'none', // 不带声调\n      type: 'array', // 返回数组格式\n    },\n  },\n\n  // 输出配置\n  output: {\n    prettyJson: true, // 格式化 JSON 输出\n    localeFileName: '{locale}.json', // 语言文件名格式\n  },\n\n  // 日志配置\n  logging: {\n    enabled: true, // 默认启用日志\n    level: 'normal', // 默认正常级别\n  },\n\n  // 替换配置\n  replacement: {\n    functionName: '$t', // 默认替换函数名\n    quoteType: 'single', // 默认使用单引号\n    useOriginalTextAsKey: false, // 默认使用生成的key\n    templateString: {\n      enabled: true, // 默认启用模板字符串智能处理\n      preserveExpressions: true, // 默认保留原始表达式\n      splitStrategy: 'smart', // 默认智能拆分策略\n    },\n    autoImport: {\n      enabled: false, // 默认不启用自动引入\n      insertPosition: 'afterImports', // 默认在import语句后插入\n      imports: {},\n    },\n  },\n\n  // 翻译配置\n  translation: {\n    enabled: false, // 默认不启用翻译功能\n    provider: 'baidu', // 默认使用百度翻译\n    defaultSourceLang: 'zh', // 默认源语言：中文\n    defaultTargetLang: 'en', // 默认目标语言：英文\n    concurrency: 5, // 默认并发数：5 (降低并发数避免API限制)\n    retryTimes: 3, // 默认重试次数：3次（不包括第一次）\n    retryDelay: 1000, // 默认重试延迟：1秒\n    batchDelay: 500, // 默认批次延迟：0.5秒\n    baidu: {\n      appid: '', // 需要用户配置\n      key: '', // 需要用户配置\n    },\n  },\n};","import { I18nConfig } from './types';\n\n// ConfigManager 单例\nclass ConfigManagerClass {\n  private config: I18nConfig | null = null;\n\n  init(config: I18nConfig): void {\n    this.config = config;\n  }\n\n  get(): I18nConfig {\n    if (!this.config) {\n      throw new Error('ConfigManager: config not initialized!');\n    }\n    return this.config;\n  }\n\n  reset(): void {\n    this.config = null;\n  }\n\n  isInitialized(): boolean {\n    return this.config !== null;\n  }\n}\n\nexport const ConfigManager = new ConfigManagerClass();","import { ConfigManager } from './manager';\nimport { Logger } from '../utils/logger';\n\n/**\n * 配置一致性检查工具\n * 用于验证所有配置项是否正确使用，没有硬编码值\n */\nexport class ConfigValidator {\n  /**\n   * 检查配置的一致性和完整性\n   */\n  static validateConfigUsage(): {\n    isValid: boolean;\n    errors: string[];\n    warnings: string[];\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      const config = ConfigManager.get();\n\n      // 检查必需配置\n      if (!config.include || config.include.length === 0) {\n        errors.push('配置项 include 不能为空');\n      }\n\n      if (!config.outputDir) {\n        errors.push('配置项 outputDir 不能为空');\n      }\n\n      if (!config.locale) {\n        errors.push('配置项 locale 不能为空');\n      }\n\n      // 检查翻译配置一致性\n      if (config.translation?.enabled) {\n        if (!config.translation.provider) {\n          errors.push('启用翻译时必须指定 provider');\n        }\n\n        if (config.translation.provider === 'baidu') {\n          if (!config.translation.baidu?.appid || !config.translation.baidu?.key) {\n            warnings.push('百度翻译服务缺少 appid 或 key 配置');\n          }\n        }\n      }\n\n      // 检查key生成配置\n      if (config.keyGeneration) {\n        if (config.keyGeneration.maxChineseLength && config.keyGeneration.maxChineseLength <= 0) {\n          warnings.push('maxChineseLength 应该大于0');\n        }\n\n        if (config.keyGeneration.hashLength && config.keyGeneration.hashLength <= 0) {\n          warnings.push('hashLength 应该大于0');\n        }\n      }\n\n      // 检查日志配置\n      if (\n        config.logging?.level &&\n        !['minimal', 'normal', 'verbose'].includes(config.logging.level)\n      ) {\n        errors.push('logging.level 必须是 minimal、normal 或 verbose 之一');\n      }\n\n      // 检查输出配置\n      if (config.output?.localeFileName && !config.output.localeFileName.includes('{locale}')) {\n        warnings.push('localeFileName 建议包含 {locale} 占位符');\n      }\n    } catch (error) {\n      errors.push(`配置检查时发生错误: ${error}`);\n    }\n\n    const isValid = errors.length === 0;\n\n    if (!isValid) {\n      Logger.error('配置验证失败:', 'minimal');\n      errors.forEach((error) => Logger.error(`  - ${error}`, 'minimal'));\n    }\n\n    if (warnings.length > 0) {\n      Logger.warn('配置警告:', 'normal');\n      warnings.forEach((warning) => Logger.warn(`  - ${warning}`, 'normal'));\n    }\n\n    // 移除\"配置验证通过，无警告\"输出以减少日志噪音\n\n    return { isValid, errors, warnings };\n  }\n\n  /**\n   * 检查是否存在配置与代码不一致的问题\n   */\n  static checkConfigConsistency(): void {\n    const config = ConfigManager.get();\n\n    Logger.verbose('检查配置一致性...');\n\n    // 检查文件名生成是否使用了配置\n    const expectedFileName = (config.output?.localeFileName ?? '{locale}.json').replace(\n      '{locale}',\n      config.locale\n    );\n    Logger.verbose(`预期的语言文件名: ${expectedFileName}`);\n\n    // 检查替换函数名是否一致\n    const functionName = config.replacement?.functionName ?? '$t';\n    Logger.verbose(`预期的替换函数名: ${functionName}`);\n\n    // 检查目录配置\n    Logger.verbose(`输出目录: ${config.outputDir}`);\n    if (config.tempDir) {\n      Logger.verbose(`临时目录: ${config.tempDir}`);\n    }\n\n    Logger.verbose('配置一致性检查完成');\n  }\n}","import { ConfigManager } from '../config';\n\nexport class Logger {\n  private static temporaryLevel: string | null = null; // 临时日志级别\n  \n  private static getLogLevel(): string {\n    try {\n      // 优先使用临时级别\n      if (this.temporaryLevel) {\n        return this.temporaryLevel;\n      }\n      const config = ConfigManager.get();\n      return config.logging?.level ?? 'normal';\n    } catch {\n      // 如果ConfigManager未初始化，使用默认值\n      return 'normal';\n    }\n  }\n\n  /**\n   * 临时设置日志级别（用于进度显示期间）\n   */\n  static setTemporaryLevel(level: string | null): void {\n    this.temporaryLevel = level;\n  }\n\n  private static shouldLog(level: 'minimal' | 'normal' | 'verbose'): boolean {\n    const currentLevel = this.getLogLevel();\n\n    if (currentLevel === 'minimal') {\n      return level === 'minimal';\n    } else if (currentLevel === 'normal') {\n      return level !== 'verbose';\n    } else if (currentLevel === 'verbose') {\n      return true;\n    }\n\n    return false;\n  }\n\n  static success(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.log(`✅ ${message}`);\n    }\n  }\n\n  static info(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.log(`ℹ️  ${message}`);\n    }\n  }\n\n  static warn(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.warn(`⚠️  ${message}`);\n    }\n  }\n\n  static error(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.error(`❌ ${message}`);\n    }\n  }\n\n  static verbose(message: string): void {\n    this.info(message, 'verbose');\n  }\n}","import { writeJson } from '../../utils/fs';\nimport { Logger } from '../../utils/logger';\nimport { defaultConfig } from '../../config/defaults';\nimport type { I18nConfig } from '../../config';\n\ninterface InitOptions {\n  outputDir?: string;\n  tempDir?: string;\n  configPath?: string;\n  locale?: string;\n  functionName?: string;\n}\n\nasync function initHandler(options: InitOptions): Promise<void> {\n  // 使用传入的参数或默认值\n  const outputDir = options.outputDir || '.test-output/locales';\n  const tempDir = options.tempDir || '.test-output/temp';\n  const configPath = options.configPath || './i18n.config.json';\n  const locale = options.locale || defaultConfig.locale;\n  const functionName = options.functionName || defaultConfig.replacement?.functionName;\n\n  const config: I18nConfig = {\n    ...defaultConfig,\n    outputDir,\n    tempDir,\n    locale,\n    replacement: {\n      ...defaultConfig.replacement,\n      functionName\n    }\n  };\n\n  try {\n    await writeJson(configPath, config, true);\n    Logger.success(`配置文件已生成: ${configPath}`, 'minimal');\n    Logger.info('你可以根据项目需求修改配置文件。', 'normal');\n  } catch (error) {\n    Logger.error(`配置文件生成失败: ${error}`, 'minimal');\n    process.exit(1);\n  }\n}\n\n// init命令不需要wrapper，直接导出\nexport const initCommand = initHandler;","import { loadConfig, ConfigManager, ConfigValidator } from '../config';\nimport { Logger } from '../utils/logger';\nimport type { I18nConfig } from '../config';\n\ninterface CLIWrapperOptions<T> {\n  configRequired?: boolean;\n  validator?: (config: I18nConfig) => void;\n  preProcess?: (options: T) => T;\n}\n\n/**\n * CLI统一包裹函数\n * 统一处理配置加载、验证、错误处理等逻辑\n */\nexport function withCLI<T extends Record<string, any>>(\n  handler: (options: T, config: I18nConfig) => Promise<void>,\n  wrapperOptions: CLIWrapperOptions<T> = {}\n) {\n  return async (options: T) => {\n    try {\n      // 1. 参数预处理\n      const processedOptions = wrapperOptions.preProcess?.(options) ?? options;\n      \n      // 2. 配置加载（统一在这里处理）\n      let config: I18nConfig | null = null;\n      if (wrapperOptions.configRequired !== false) {\n        // 默认使用根目录下的配置文件\n        const configPath = (processedOptions as any).config ?? './i18n.config.json';\n        config = loadConfig(configPath);\n        ConfigManager.init(config);\n        \n        // 3. 配置验证（统一在这里处理）\n        const validation = ConfigValidator.validateConfigUsage();\n        if (!validation.isValid) {\n          Logger.error('配置验证失败，无法继续执行', 'minimal');\n          process.exit(1);\n        }\n        ConfigValidator.checkConfigConsistency();\n      }\n      \n      // 4. 执行自定义验证器（如果有）\n      if (config && wrapperOptions.validator) {\n        wrapperOptions.validator(config);\n      }\n      \n      // 5. 执行业务逻辑\n      await handler(processedOptions, config!);\n    } catch (error) {\n      Logger.error(`命令执行失败: ${error}`, 'minimal');\n      process.exit(1);\n    }\n  };\n}","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { findTargetFiles, readFile, writeFileWithTempDir } from '../../utils/fs';\nimport { ConfigManager } from '../../config';\nimport { createI18nKey, initI18nCache, flushI18nCache } from '../key-generator';\nimport { Logger } from '../../utils/logger';\nimport { ImportManager } from '../../utils/import-manager';\n\n// 简单的require导入，只针对有兼容性问题的模块\nconst traverse = require('@babel/traverse').default;\nconst generate = require('@babel/generator').default;\n\n// 中文字符正则\nconst CHINESE_RE = /[\\u4e00-\\u9fa5]/;\n\n/**\n * 上下文类型定义\n */\nexport type ContextType = 'code' | 'comment' | 'ts-definition' | 'object-key' | 'enum-value' | 'import-export' | 'type-annotation';\n\n/**\n * 上下文分析结果\n */\nexport interface ContextAnalysis {\n  shouldProcess: boolean;\n  contextType: ContextType;\n  reason?: string;\n}\n\n/**\n * 检查节点是否在注释中\n */\nfunction isInComment(path: any, codeLines: string[]): boolean {\n  const loc = path.node.loc;\n  if (!loc || !codeLines) return false;\n\n  const lineIndex = loc.start.line - 1;\n  if (lineIndex >= 0 && lineIndex < codeLines.length) {\n    const line = codeLines[lineIndex];\n    const beforeText = line.substring(0, loc.start.column);\n    const afterText = line.substring(loc.end.column);\n    \n    // 检查单行注释 //\n    if (beforeText.includes('//')) {\n      return true;\n    }\n    \n    // 检查多行注释 /* */\n    if (beforeText.includes('/*') && !beforeText.includes('*/')) {\n      return true;\n    }\n    \n    // 检查是否在多行注释中间\n    for (let i = lineIndex - 1; i >= 0; i--) {\n      const prevLine = codeLines[i];\n      if (prevLine.includes('*/')) {\n        break; // 找到注释结束，不在注释中\n      }\n      if (prevLine.includes('/*')) {\n        return true; // 找到注释开始，在注释中\n      }\n    }\n    \n    // 检查JSDoc注释 /** */\n    if (beforeText.includes('/**') || beforeText.includes('*')) {\n      return true;\n    }\n  }\n  \n  return false;\n}\n\n/**\n * 检查节点是否在不应该替换的位置并返回详细的上下文信息\n * 包括：TypeScript 类型位置、对象属性键、import/export 语句、注释等\n */\nfunction analyzeContext(path: any, codeLines?: string[]): ContextAnalysis {\n  // 首先检查是否在注释中\n  if (codeLines && isInComment(path, codeLines)) {\n    return {\n      shouldProcess: false,\n      contextType: 'comment',\n      reason: '注释中的文本'\n    };\n  }\n\n  let current = path;\n\n  while (current) {\n    const parent = current.parent;\n    const parentPath = current.parentPath;\n\n    if (!parent || !parentPath) break;\n\n    // 检查是否是对象属性的键\n    if (t.isObjectProperty(parent) && parent.key === current.node) {\n      return {\n        shouldProcess: false,\n        contextType: 'object-key',\n        reason: '对象属性键名'\n      };\n    }\n\n    // 检查是否是对象方法的键\n    if (t.isObjectMethod(parent) && parent.key === current.node) {\n      return {\n        shouldProcess: false,\n        contextType: 'object-key',\n        reason: '对象方法名'\n      };\n    }\n\n    // 检查是否在 import/export 语句中\n    // 注意：只检查直接的import/export声明，不包括export function内部的内容\n    if (\n      t.isImportDeclaration(parent) ||\n      t.isImportSpecifier(parent) ||\n      t.isExportSpecifier(parent) ||\n      // 只有当字符串直接在export声明中时才忽略（如 export { \"key\" as alias }）\n      // 而不是在export function/class内部\n      (t.isExportDeclaration(parent) && (\n        t.isExportAllDeclaration(parent) ||\n        t.isExportDefaultDeclaration(parent) && current.node === parent.declaration ||\n        t.isExportNamedDeclaration(parent) && parent.specifiers?.some(spec => spec === current.node)\n      ))\n    ) {\n      return {\n        shouldProcess: false,\n        contextType: 'import-export',\n        reason: 'import/export语句'\n      };\n    }\n\n    // 检查各种 TypeScript 类型上下文\n    if (\n      t.isTSTypeAnnotation(parent) || // : string\n      t.isTSLiteralType(parent) || // type T = \"literal\"\n      t.isTSIntersectionType(parent) || // A & B\n      t.isTSTypeReference(parent) || // SomeType<T>\n      t.isTSTypeLiteral(parent) || // { key: \"value\" }\n      t.isTSInterfaceDeclaration(parent) || // interface I {}\n      t.isTSTypeAliasDeclaration(parent) || // type T = ...\n      t.isTSEnumDeclaration(parent) || // enum E {}\n      t.isTSPropertySignature(parent) || // { prop: \"type\" }\n      t.isTSMethodSignature(parent) || // { method(): \"return\" }\n      t.isTSCallSignatureDeclaration(parent) || // { (): \"return\" }\n      t.isTSConstructSignatureDeclaration(parent) || // { new(): \"type\" }\n      t.isTSIndexSignature(parent) || // { [key: string]: \"value\" }\n      t.isTSMappedType(parent) || // { [K in keyof T]: \"value\" }\n      t.isTSConditionalType(parent) || // T extends \"literal\" ? A : B\n      t.isTSInferType(parent) || // infer R\n      t.isTSTypeParameter(parent) || // <T extends \"literal\">\n      t.isTSTypeParameterDeclaration(parent) // <T = \"default\">\n    ) {\n      // 特殊处理: 枚举成员值需要进行替换，但枚举成员名称不需要\n      if (t.isTSEnumMember(parent) && (parent as any).initializer === current.node) {\n        return {\n          shouldProcess: true,\n          contextType: 'enum-value',\n          reason: '枚举值'\n        };\n      }\n      return {\n        shouldProcess: false,\n        contextType: 'ts-definition',\n        reason: 'TypeScript类型定义'\n      };\n    }\n\n    // 增强的联合类型检测\n    if (t.isTSUnionType(parent)) {\n      // 检查当前节点是否是联合类型的成员\n      if (parent.types && parent.types.includes(current.node)) {\n        return {\n          shouldProcess: false,\n          contextType: 'type-annotation',\n          reason: '联合类型成员'\n        };\n      }\n      // 检查是否在联合类型的字面量类型中\n      if (t.isTSLiteralType(current.parent) && parent.types.includes(current.parent)) {\n        return {\n          shouldProcess: false,\n          contextType: 'type-annotation',\n          reason: '联合类型字面量'\n        };\n      }\n    }\n\n    // 检查是否在接口属性的类型注解中\n    if (t.isTSPropertySignature(parent)) {\n      if (parent.typeAnnotation && parent.typeAnnotation.typeAnnotation === current.node) {\n        return {\n          shouldProcess: false,\n          contextType: 'type-annotation',\n          reason: '接口属性类型注解'\n        };\n      }\n      // 检查接口属性的类型注解内部\n      if (t.isTSTypeAnnotation(current.parent) && parent.typeAnnotation === current.parent) {\n        return {\n          shouldProcess: false,\n          contextType: 'type-annotation',\n          reason: '接口属性类型注解'\n        };\n      }\n    }\n\n    // 检查是否在类型别名定义中\n    if (t.isTSTypeAliasDeclaration(parent)) {\n      if (parent.typeAnnotation === current.node) {\n        return {\n          shouldProcess: false,\n          contextType: 'ts-definition',\n          reason: '类型别名定义'\n        };\n      }\n    }\n\n    // 检查是否在泛型参数中\n    if (t.isTSTypeParameterInstantiation(parent)) {\n      return {\n        shouldProcess: false,\n        contextType: 'type-annotation',\n        reason: '泛型参数'\n      };\n    }\n\n    // 检查是否在类属性的键位置\n    if (t.isClassProperty(parent) && parent.key === current.node) {\n      return {\n        shouldProcess: false,\n        contextType: 'object-key',\n        reason: '类属性名'\n      };\n    }\n\n    // 检查是否在成员表达式的属性位置 (obj.property)\n    if (t.isMemberExpression(parent) && parent.property === current.node && !parent.computed) {\n      return {\n        shouldProcess: false,\n        contextType: 'object-key',\n        reason: '成员表达式属性名'\n      };\n    }\n\n    // 增强的函数参数类型检测\n    if (\n      t.isFunctionDeclaration(parent) ||\n      t.isFunctionExpression(parent) ||\n      t.isArrowFunctionExpression(parent)\n    ) {\n      // 检查是否在函数参数的类型注解中\n      if (parent.params) {\n        for (const param of parent.params) {\n          if (t.isIdentifier(param) && param.typeAnnotation) {\n            const typeNode = (param.typeAnnotation as any).typeAnnotation;\n            if (isNodeInTypeAnnotation(current.node, typeNode)) {\n              return {\n                shouldProcess: false,\n                contextType: 'type-annotation',\n                reason: '函数参数类型注解'\n              };\n            }\n          }\n        }\n      }\n    }\n\n    // 向上遍历\n    current = parentPath;\n  }\n\n  // 默认情况，应该处理\n  return {\n    shouldProcess: true,\n    contextType: 'code',\n    reason: '代码中的字符串'\n  };\n}\n\n/**\n * 检查节点是否在不应该替换的位置（向后兼容）\n */\nfunction isInTypePosition(path: any): boolean {\n  return !analyzeContext(path).shouldProcess;\n}\n\n/**\n * 辅助函数：检查节点是否在类型注解内部\n */\nfunction isNodeInTypeAnnotation(targetNode: any, typeAnnotation: any): boolean {\n  if (!typeAnnotation) return false;\n\n  if (typeAnnotation === targetNode) return true;\n\n  if (t.isTSUnionType(typeAnnotation)) {\n    return typeAnnotation.types.some((type: any) => isNodeInTypeAnnotation(targetNode, type));\n  }\n\n  if (t.isTSLiteralType(typeAnnotation)) {\n    return typeAnnotation.literal === targetNode;\n  }\n\n  return false;\n}\n\n/**\n * 检查字符串是否包含中文\n */\nfunction containsChinese(str: string): boolean {\n  return CHINESE_RE.test(str);\n}\n\n/**\n * 创建国际化替换表达式\n */\nfunction createI18nCallExpression(\n  functionName: string,\n  key: string,\n  quoteType: 'single' | 'double'\n): t.CallExpression {\n  // 获取配置，判断是否使用原始中文文本作为key\n\n  const keyNode = t.stringLiteral(key);\n\n  // 当需要双引号时，确保节点具有正确的引号类型\n  if (quoteType === 'double' && keyNode.extra) {\n    keyNode.extra = { ...keyNode.extra, raw: `\"${key}\"`, rawValue: key };\n  }\n\n  return t.callExpression(t.identifier(functionName), [keyNode]);\n}\n\n/**\n * 检查节点是否已经是国际化函数调用格式（如$t(key)）\n */\nfunction isI18nFunctionCall(path: any, functionName: string): boolean {\n  const node = path.node;\n\n  // 检查是否是函数调用\n  if (!t.isCallExpression(node)) {\n    return false;\n  }\n\n  // 检查函数名是否匹配\n  if (!t.isIdentifier(node.callee) || node.callee.name !== functionName) {\n    return false;\n  }\n\n  // 检查参数数量\n  if (node.arguments.length !== 1) {\n    return false;\n  }\n\n  // 检查参数是否为字符串字面量\n  if (!t.isStringLiteral(node.arguments[0])) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * 处理字符串字面量\n */\nfunction handleStringLiteral(\n  path: any,\n  functionName: string,\n  quoteType: 'single' | 'double'\n): boolean {\n  // 跳过类型定义位置的字符串字面量\n  if (isInTypePosition(path)) {\n    return false;\n  }\n\n  // 检查父节点是否已经是国际化函数调用\n  const parentPath = path.parentPath;\n  if (parentPath && isI18nFunctionCall(parentPath, functionName)) {\n    Logger.verbose(`跳过已经国际化的函数调用: ${functionName}(${path.node.value})`);\n    return false;\n  }\n\n  const stringValue = path.node.value;\n  if (stringValue && typeof stringValue === 'string' && containsChinese(stringValue)) {\n    const key = createI18nKey(stringValue);\n\n    // 根据配置创建带有适当引号类型的函数调用\n    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n    path.replaceWith(callExpression);\n\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * 检查结果接口\n */\nexport interface CheckResult {\n  file: string;\n  issues: Array<{\n    line: number;\n    column: number;\n    text: string;\n    type: 'string' | 'template' | 'jsx-text' | 'jsx-attribute';\n    context?: string;\n    shouldProcess: boolean;\n    contextType: 'code' | 'comment' | 'ts-definition' | 'object-key' | 'enum-value' | 'import-export' | 'type-annotation';\n    reason?: string; // 不应该处理的原因\n  }>;\n}\n\n/**\n * 检查文件中未国际化的中文字符串\n */\nexport async function checkUnwrappedChinese(): Promise<CheckResult[]> {\n  const config = ConfigManager.get();\n  const functionName = config.replacement?.functionName ?? '$t';\n\n  Logger.info('开始检查未国际化的中文字符串...', 'normal');\n  Logger.verbose(`配置信息: \n    - include: ${JSON.stringify(config.include)}\n    - exclude: ${JSON.stringify(config.exclude)}\n    - tempDir: ${config.tempDir || '无'}\n    - functionName: ${functionName}`);\n\n  Logger.info('搜索目标文件...', 'verbose');\n  \n  let files: string[];\n  let sourceDescription: string;\n  \n  // 优先检查tempDir，如果存在且有文件则使用；否则使用include配置\n  if (config.tempDir) {\n    try {\n      // 检查tempDir是否存在文件\n      const tempFiles = await findTargetFiles([`${config.tempDir}/**/*.{js,jsx,ts,tsx}`], config.exclude);\n      if (tempFiles.length > 0) {\n        files = tempFiles;\n        sourceDescription = `临时目录 (${config.tempDir})`;\n        Logger.info(`使用临时目录文件进行检查: ${config.tempDir}`, 'verbose');\n      } else {\n        // tempDir存在但无文件，使用原始文件\n        files = await findTargetFiles(config.include, config.exclude);\n        sourceDescription = '原始文件';\n        Logger.info('临时目录无文件，使用原始文件进行检查', 'verbose');\n      }\n    } catch (error) {\n      // tempDir访问失败，使用原始文件\n      files = await findTargetFiles(config.include, config.exclude);\n      sourceDescription = '原始文件';\n      Logger.verbose(`临时目录访问失败: ${error}, 使用原始文件进行检查`);\n    }\n  } else {\n    // 没有tempDir配置，使用include配置\n    files = await findTargetFiles(config.include, config.exclude);\n    sourceDescription = '原始文件';\n  }\n\n  if (files.length === 0) {\n    Logger.warn(`在${sourceDescription}中没有找到匹配的文件`, 'normal');\n    return [];\n  }\n\n  Logger.info(`找到 ${files.length} 个文件需要检查 (来源: ${sourceDescription})`, 'normal');\n\n  const results: CheckResult[] = [];\n  let processedCount = 0;\n  let totalIssues = 0;\n\n  for (const file of files) {\n    processedCount++;\n    Logger.info(`[${processedCount}/${files.length}] 检查文件: ${file}`, 'verbose');\n\n    const code = await readFile(file, 'utf-8');\n    const fileResult: CheckResult = { file, issues: [] };\n\n    let ast;\n    try {\n      ast = parse(code, {\n        sourceType: 'unambiguous',\n        plugins: ['jsx', 'typescript', 'classProperties', 'decorators-legacy', 'dynamicImport'],\n      });\n    } catch (error) {\n      Logger.warn(`解析文件失败: ${file}`, 'minimal');\n      Logger.verbose(`错误详情: ${error}`);\n      continue;\n    }\n\n    // 获取代码行信息用于定位\n    const codeLines = code.split('\\n');\n\n    traverse(ast, {\n      // 检查字符串字面量\n      StringLiteral(path: any) {\n        const contextAnalysis = analyzeContext(path, codeLines);\n\n        const parentPath = path.parentPath;\n        if (parentPath && isI18nFunctionCall(parentPath, functionName)) return;\n\n        const stringValue = path.node.value;\n        if (stringValue && typeof stringValue === 'string' && containsChinese(stringValue)) {\n          const loc = path.node.loc;\n          if (loc) {\n            fileResult.issues.push({\n              line: loc.start.line,\n              column: loc.start.column,\n              text: stringValue,\n              type: 'string',\n              context: getContextInfo(path, codeLines),\n              shouldProcess: contextAnalysis.shouldProcess,\n              contextType: contextAnalysis.contextType,\n              reason: contextAnalysis.reason,\n            });\n          }\n        }\n      },\n\n      // 检查模板字符串\n      TemplateLiteral(path: any) {\n        const contextAnalysis = analyzeContext(path, codeLines);\n\n        const parentPath = path.parentPath;\n        if (parentPath && isI18nFunctionCall(parentPath, functionName)) return;\n\n        // 检查模板字符串的静态部分\n        path.node.quasis.forEach((quasi: any) => {\n          const raw = quasi.value?.raw;\n          if (raw && typeof raw === 'string' && containsChinese(raw)) {\n            const loc = path.node.loc;\n            if (loc) {\n              fileResult.issues.push({\n                line: loc.start.line,\n                column: loc.start.column,\n                text: raw,\n                type: 'template',\n                context: getContextInfo(path, codeLines),\n                shouldProcess: contextAnalysis.shouldProcess,\n                contextType: contextAnalysis.contextType,\n                reason: contextAnalysis.reason,\n              });\n            }\n          }\n        });\n\n        // 检查模板字符串的表达式部分\n        path.node.expressions.forEach((expr: any) => {\n          if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n            const loc = expr.loc;\n            if (loc) {\n              fileResult.issues.push({\n                line: loc.start.line,\n                column: loc.start.column,\n                text: expr.value,\n                type: 'template',\n                context: getContextInfo(path, codeLines),\n                shouldProcess: contextAnalysis.shouldProcess,\n                contextType: contextAnalysis.contextType,\n                reason: contextAnalysis.reason,\n              });\n            }\n          }\n        });\n      },\n\n      // 检查JSX文本\n      JSXText(path: any) {\n        const textValue = path.node.value;\n        if (textValue && typeof textValue === 'string' && containsChinese(textValue)) {\n          const contextAnalysis = analyzeContext(path, codeLines);\n\n          const parentPath = path.parentPath;\n          if (\n            parentPath?.isJSXExpressionContainer() &&\n            parentPath.node.expression &&\n            isI18nFunctionCall({ node: parentPath.node.expression }, functionName)\n          ) {\n            return;\n          }\n\n          const trimmedValue = textValue.trim();\n          if (trimmedValue) {\n            const loc = path.node.loc;\n            if (loc) {\n              fileResult.issues.push({\n                line: loc.start.line,\n                column: loc.start.column,\n                text: trimmedValue,\n                type: 'jsx-text',\n                context: getContextInfo(path, codeLines),\n                shouldProcess: contextAnalysis.shouldProcess,\n                contextType: contextAnalysis.contextType,\n                reason: contextAnalysis.reason,\n              });\n            }\n          }\n        }\n      },\n\n      // 检查JSX属性\n      JSXAttribute(path: any) {\n        if (\n          t.isStringLiteral(path.node.value) &&\n          path.node.value.value &&\n          typeof path.node.value.value === 'string' &&\n          containsChinese(path.node.value.value)\n        ) {\n          const contextAnalysis = analyzeContext(path, codeLines);\n\n          if (\n            t.isJSXExpressionContainer(path.node.value) &&\n            path.node.value.expression &&\n            isI18nFunctionCall({ node: path.node.value.expression }, functionName)\n          ) {\n            return;\n          }\n\n          const attributeValue = path.node.value.value;\n          const loc = path.node.loc;\n          if (loc) {\n            fileResult.issues.push({\n              line: loc.start.line,\n              column: loc.start.column,\n              text: attributeValue,\n              type: 'jsx-attribute',\n              context: getContextInfo(path, codeLines),\n              shouldProcess: contextAnalysis.shouldProcess,\n              contextType: contextAnalysis.contextType,\n              reason: contextAnalysis.reason,\n            });\n          }\n        }\n      },\n    });\n\n    if (fileResult.issues.length > 0) {\n      results.push(fileResult);\n      totalIssues += fileResult.issues.length;\n      Logger.info(`文件 ${file} 发现 ${fileResult.issues.length} 个未国际化的中文字符串`, 'normal');\n    } else {\n      Logger.verbose(`文件 ${file} 无未国际化的中文字符串`);\n    }\n  }\n\n  Logger.success(`检查完成！`, 'minimal');\n  Logger.info(`统计信息:`, 'normal');\n  Logger.info(`  - 检查文件总数: ${processedCount}`, 'normal');\n  Logger.info(`  - 有问题的文件数: ${results.length}`, 'normal');\n  Logger.info(`  - 未国际化字符串总数: ${totalIssues}`, 'normal');\n\n  return results;\n}\n\n/**\n * 获取上下文信息\n */\nfunction getContextInfo(path: any, codeLines: string[]): string {\n  const loc = path.node.loc;\n  if (!loc || !codeLines) return '';\n\n  const lineIndex = loc.start.line - 1;\n  if (lineIndex >= 0 && lineIndex < codeLines.length) {\n    return codeLines[lineIndex]?.trim() ?? '';\n  }\n  return '';\n}\n\nexport async function scanAndReplaceAll(): Promise<void> {\n  const config = ConfigManager.get();\n\n  Logger.info('开始扫描和替换中文字符串...', 'normal');\n  Logger.verbose(`配置信息: \n    - include: ${JSON.stringify(config.include)}\n    - exclude: ${JSON.stringify(config.exclude)}\n    - outputDir: ${config.outputDir}\n    - locale: ${config.locale}\n    - tempDir: ${config.tempDir || '无'}`);\n\n  Logger.info('初始化i18n缓存...', 'verbose');\n  await initI18nCache();\n\n  Logger.info('搜索目标文件...', 'verbose');\n  const files = await findTargetFiles(config.include, config.exclude);\n\n  if (files.length === 0) {\n    Logger.warn('没有找到匹配的文件', 'normal');\n    return;\n  }\n\n  Logger.info(`找到 ${files.length} 个文件需要处理`, 'normal');\n  Logger.verbose(`文件列表: ${files.join(', ')}`);\n\n  // 获取替换配置\n  const functionName = config.replacement?.functionName ?? '$t';\n  const quoteType = config.replacement?.quoteType ?? 'single';\n  const autoImportEnabled = config.replacement?.autoImport?.enabled ?? false;\n  const insertPosition = config.replacement?.autoImport?.insertPosition ?? 'afterImports';\n  const imports = config.replacement?.autoImport?.imports ?? {};\n\n  // 获取模板字符串配置\n  const templateConfig = config.replacement?.templateString ?? {\n    enabled: true,\n    preserveExpressions: true,\n    splitStrategy: 'smart',\n  };\n\n  Logger.verbose(`替换配置:\n    - 函数名: ${functionName}\n    - 引号类型: ${quoteType}\n    - 自动导入: ${autoImportEnabled ? '启用' : '禁用'}\n    - 插入位置: ${insertPosition}\n    - 模板字符串处理: ${templateConfig.enabled ? '启用' : '禁用'}\n    - 拆分策略: ${templateConfig.splitStrategy}`);\n\n  // 统计变量\n  let processedCount = 0;\n  let modifiedCount = 0;\n  let totalReplacements = 0;\n\n  // 创建import管理器实例\n  const importManager = new ImportManager();\n\n  for (const file of files) {\n    processedCount++;\n    Logger.info(`[${processedCount}/${files.length}] 处理文件: ${file}`, 'verbose');\n    Logger.verbose(`正在处理文件: ${file}`);\n    const code = await readFile(file, 'utf-8');\n\n    let ast;\n    try {\n      ast = parse(code, {\n        sourceType: 'unambiguous',\n        plugins: ['jsx', 'typescript', 'classProperties', 'decorators-legacy', 'dynamicImport'],\n      });\n    } catch (error) {\n      Logger.warn(`解析文件失败: ${file}`, 'minimal');\n      Logger.verbose(`错误详情: ${error}`);\n      continue;\n    }\n\n    // 重置import管理器状态\n    importManager.reset();\n\n    // 跟踪是否发生了替换\n    let hasReplacement = false;\n    let fileReplacements = 0;\n\n    traverse(ast, {\n      // 处理普通字符串字面量\n      StringLiteral(path: any) {\n        if (handleStringLiteral(path, functionName, quoteType)) {\n          hasReplacement = true;\n          fileReplacements++;\n          const stringValue = path.node.value;\n          Logger.verbose(\n            `替换字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${stringValue}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n      },\n\n      // 处理模板字符串元素\n      TemplateElement(path: any) {\n        // 检查是否启用模板字符串处理\n        if (!templateConfig.enabled) {\n          return;\n        }\n\n        // 跳过类型定义位置的模板字符串\n        if (isInTypePosition(path)) {\n          return;\n        }\n\n        // 检查父节点是否已经是国际化函数调用的一部分\n        const parentPath = path.parentPath;\n        if (parentPath?.parentPath && isI18nFunctionCall(parentPath.parentPath, functionName)) {\n          Logger.verbose(`跳过已经国际化的模板字符串元素`);\n          return;\n        }\n\n        const raw = path.node.value?.raw;\n        if (raw && typeof raw === 'string' && containsChinese(raw)) {\n          // 检查中文片段\n          const chineseMatches = raw.match(/[\\u4e00-\\u9fa5]+/g);\n          if (chineseMatches && chineseMatches.length > 0) {\n            // 应用不同的拆分策略\n            if (templateConfig.splitStrategy === 'conservative') {\n              // 保守策略：只替换独立的中文片段\n              const result = raw.replace(/[\\u4e00-\\u9fa5]+/g, (match: string) => {\n                const key = createI18nKey(match);\n                const quoteChar = quoteType === 'single' ? \"'\" : '\"';\n                return '${' + functionName + '(' + quoteChar + key + quoteChar + ')}';\n              });\n              path.node.value.raw = result;\n              path.node.value.cooked = result;\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(`保守策略替换模板字符串中的中文片段`);\n            } else {\n              // 智能策略或激进策略：使用原有逻辑\n              const SEPARATOR = '\\u{1F4D6}'; // 使用书本emoji作为分隔符，避免控制字符问题\n              const replaced = raw.replace(\n                /[\\u4e00-\\u9fa5]+/g,\n                (match: string) => `${SEPARATOR}${match}${SEPARATOR}`\n              );\n              const parts = replaced\n                .split(new RegExp(`${SEPARATOR}([\\\\u4e00-\\\\u9fa5]+)${SEPARATOR}`, 'g'))\n                .filter(Boolean);\n              let result = '';\n\n              // 根据配置选择引号类型\n              const quoteChar = quoteType === 'single' ? \"'\" : '\"';\n\n              for (const part of parts) {\n                if (/^[\\u4e00-\\u9fa5]+$/.test(part)) {\n                  const key = createI18nKey(part);\n                  result += '${' + functionName + '(' + quoteChar + key + quoteChar + ')}';\n                } else {\n                  result += part;\n                }\n              }\n              path.node.value.raw = result;\n              path.node.value.cooked = result;\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(`${templateConfig.splitStrategy}策略替换模板字符串中的中文片段`);\n            }\n          }\n        }\n      },\n\n      // 处理模板字符串\n      TemplateLiteral(path: any) {\n        // 检查父节点是否已经是国际化函数调用\n        const parentPath = path.parentPath;\n        if (parentPath && isI18nFunctionCall(parentPath, functionName)) {\n          Logger.verbose(`跳过已经国际化的模板字符串`);\n          return;\n        }\n\n        // 跳过类型定义位置的模板字符串\n        if (isInTypePosition(path)) {\n          return;\n        }\n\n        // 检查是否启用模板字符串处理\n        if (!templateConfig.enabled) {\n          return;\n        }\n\n        // 处理模板字符串：保持模板字符串格式，只替换其中的中文部分\n        let hasModified = false;\n\n        // 处理 quasis（模板字符串的静态部分）\n        path.node.quasis.forEach((quasi: any) => {\n          if (quasi?.value?.raw && containsChinese(quasi.value.raw)) {\n            const raw = quasi.value.raw;\n            // 检查中文片段\n            const chineseMatches = raw.match(/[\\u4e00-\\u9fa5]+/g);\n\n            if (chineseMatches && chineseMatches.length > 0) {\n              // 在模板字符串内部替换中文为 ${$t('key')} 格式\n              const newRaw = raw.replace(/[\\u4e00-\\u9fa5]+/g, (match: string) => {\n                const key = createI18nKey(match);\n                const quoteChar = quoteType === 'single' ? \"'\" : '\"';\n                return '${' + functionName + '(' + quoteChar + key + quoteChar + ')}';\n              });\n\n              if (newRaw !== raw) {\n                quasi.value.raw = newRaw;\n                quasi.value.cooked = newRaw;\n                hasModified = true;\n              }\n            }\n          }\n        });\n\n        // 处理表达式中的中文字符串\n        if (path.node.expressions) {\n          path.node.expressions.forEach((expr: any, index: number) => {\n            if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              const stringValue = expr.value;\n              const key = createI18nKey(stringValue);\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.expressions[index] = callExpression;\n              hasModified = true;\n              Logger.verbose(\n                `替换模板字符串表达式中的字符串: \"${stringValue}\" -> ${functionName}('${key}')`\n              );\n            }\n          });\n        }\n\n        // 处理只有一个静态部分的模板字符串（没有表达式）\n        if (\n          path.node.expressions &&\n          path.node.expressions.length === 0 &&\n          path.node.quasis &&\n          path.node.quasis.length === 1\n        ) {\n          const firstQuasi = path.node.quasis[0];\n          if (firstQuasi?.value && firstQuasi.value.raw !== undefined) {\n            const templateValue = firstQuasi.value.raw;\n            if (containsChinese(templateValue)) {\n              // 对于纯静态的模板字符串，直接替换为普通函数调用\n              const key = createI18nKey(templateValue);\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.replaceWith(callExpression);\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换完整模板字符串: \\`${templateValue}\\` -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n              return;\n            }\n          }\n        }\n\n        if (hasModified) {\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(`保持模板字符串格式，只替换中文片段`);\n        }\n      },\n\n      // 处理JSX文本节点\n      JSXText(path: any) {\n        const textValue = path.node.value;\n        if (textValue && typeof textValue === 'string' && containsChinese(textValue)) {\n          // 检查父节点是否已经是JSX表达式容器中的国际化函数调用\n          const parentPath = path.parentPath;\n          if (\n            parentPath?.isJSXExpressionContainer() &&\n            parentPath.node.expression &&\n            isI18nFunctionCall({ node: parentPath.node.expression }, functionName)\n          ) {\n            Logger.verbose(`跳过已经国际化的JSX文本: ${functionName}(${textValue.trim()})`);\n            return;\n          }\n\n          const trimmedValue = textValue.trim();\n          if (trimmedValue) {\n            // 确保trim后不是空字符串\n            const key = createI18nKey(trimmedValue);\n\n            // 创建JSX表达式容器\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.replaceWith(t.jsxExpressionContainer(callExpression));\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换JSX文本: \"${trimmedValue}\" -> {${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})}`\n            );\n          }\n        }\n      },\n\n      // 处理JSX属性\n      JSXAttribute(path: any) {\n        if (\n          t.isStringLiteral(path.node.value) &&\n          path.node.value.value &&\n          typeof path.node.value.value === 'string' &&\n          containsChinese(path.node.value.value)\n        ) {\n          // 检查属性值是否已经是JSX表达式容器中的国际化函数调用\n          if (\n            t.isJSXExpressionContainer(path.node.value) &&\n            path.node.value.expression &&\n            isI18nFunctionCall({ node: path.node.value.expression }, functionName)\n          ) {\n            Logger.verbose(`跳过已经国际化的JSX属性: ${functionName}(${path.node.value.value})`);\n            return;\n          }\n\n          const attributeValue = path.node.value.value;\n          const key = createI18nKey(attributeValue);\n\n          // 创建JSX表达式容器作为属性值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.value = t.jsxExpressionContainer(callExpression);\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换JSX属性: \"${attributeValue}\" -> {${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})}`\n          );\n        }\n      },\n\n      // 处理JSX表达式容器中的字符串字面量\n      JSXExpressionContainer(path: any) {\n        const expression = path.node.expression;\n\n        // 检查是否已经是国际化函数调用\n        if (isI18nFunctionCall({ node: expression }, functionName)) {\n          Logger.verbose(`跳过已经国际化的JSX表达式: ${functionName}(...)`);\n          return;\n        }\n\n        if (t.isStringLiteral(expression) && containsChinese(expression.value)) {\n          const stringValue = expression.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换表达式容器中的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.expression = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换JSX表达式容器中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n        // 处理JSX表达式容器中的模板字符串\n        else if (t.isTemplateLiteral(expression)) {\n          let hasChineseInTemplate = false;\n\n          // 检查模板字符串的静态部分\n          expression.quasis.forEach((quasi: any) => {\n            if (containsChinese(quasi.value.raw)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 检查模板字符串的表达式部分\n          expression.expressions.forEach((expr: any) => {\n            if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 如果模板字符串包含中文，需要递归处理\n          if (hasChineseInTemplate) {\n            // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n            Logger.verbose(`检测到JSX表达式容器中的模板字符串包含中文，将递归处理`);\n          }\n        }\n        // 处理JSX表达式容器中的三元表达式\n        else if (t.isConditionalExpression(expression)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个三元表达式\n          Logger.verbose(`检测到JSX表达式容器中的三元表达式，将递归处理`);\n        }\n      },\n\n      // 处理三元表达式中的字符串\n      ConditionalExpression(path: any) {\n        // 检查是否已经是国际化函数调用\n        if (isI18nFunctionCall(path, functionName)) {\n          Logger.verbose(`跳过已经国际化的三元表达式`);\n          return;\n        }\n\n        // 处理三元表达式的测试部分\n        if (t.isStringLiteral(path.node.test) && containsChinese(path.node.test.value)) {\n          // 检查测试部分是否已经是国际化函数调用\n          if (isI18nFunctionCall({ node: path.node.test }, functionName)) {\n            Logger.verbose(`跳过已经国际化的三元表达式测试部分`);\n          } else {\n            const stringValue = path.node.test.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换三元表达式测试部分的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.test = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换三元表达式测试部分的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        }\n\n        // 处理三元表达式的结果部分\n        ['consequent', 'alternate'].forEach((key) => {\n          const node = path.node[key];\n\n          // 检查结果部分是否已经是国际化函数调用\n          if (isI18nFunctionCall({ node }, functionName)) {\n            Logger.verbose(\n              `跳过已经国际化的三元表达式${key === 'consequent' ? '结果' : '备选'}部分`\n            );\n            return;\n          }\n\n          // 处理直接的字符串字面量\n          if (t.isStringLiteral(node) && containsChinese(node.value)) {\n            const stringValue = node.value;\n            const i18nKey = createI18nKey(stringValue);\n\n            // 替换三元表达式结果中的字符串\n            const callExpression = createI18nCallExpression(functionName, i18nKey, quoteType);\n            path.node[key] = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换三元表达式中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${i18nKey}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n          // 处理模板字符串\n          else if (t.isTemplateLiteral(node)) {\n            // 如果模板字符串只有一个表达式和两个 quasis，并且其中一个 quasi 包含中文\n            if (node.expressions.length === 1 && node.quasis.length === 2) {\n              const firstQuasi = node.quasis[0];\n              const secondQuasi = node.quasis[1];\n              const expr = node.expressions[0];\n\n              // 确保所有需要的元素都存在，并且 expr 是表达式类型\n              if (firstQuasi && secondQuasi && expr && t.isExpression(expr)) {\n                // 检查第一个 quasi 是否包含中文\n                if (containsChinese(firstQuasi.value.raw) && firstQuasi.value.raw.trim() !== '') {\n                  const chineseText = firstQuasi.value.raw;\n                  const key = createI18nKey(chineseText);\n\n                  // 创建一个表达式拼接：$t('key') + expr\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  const result = t.binaryExpression('+', callExpression, expr);\n\n                  path.node[key] = result;\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换三元表达式中模板字符串的前缀中文: \\`${chineseText}\\${expr}\\` -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'}) + expr`\n                  );\n                }\n\n                // 检查第二个 quasi 是否包含中文\n                if (containsChinese(secondQuasi.value.raw) && secondQuasi.value.raw.trim() !== '') {\n                  const chineseText = secondQuasi.value.raw;\n                  const key = createI18nKey(chineseText);\n\n                  // 创建一个表达式拼接：expr + $t('key')\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  const result = t.binaryExpression('+', expr, callExpression);\n\n                  path.node[key] = result;\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换三元表达式中模板字符串的后缀中文: \\`\\${expr}${chineseText}\\` -> expr + ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                  );\n                }\n              }\n            }\n            // 对于更复杂的模板字符串，递归处理\n            else {\n              // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n              Logger.verbose(`检测到三元表达式中的复杂模板字符串，将递归处理`);\n            }\n          }\n          // 处理嵌套的三元表达式\n          else if (t.isConditionalExpression(node)) {\n            // 这里不直接替换，因为 traverse 会自动访问到这个嵌套的三元表达式\n            Logger.verbose(`检测到嵌套的三元表达式，将递归处理`);\n          }\n        });\n      },\n\n      // 处理对象属性的值\n      ObjectProperty(path: any) {\n        const valueNode = path.node.value;\n\n        // 检查值是否已经是国际化函数调用\n        if (isI18nFunctionCall({ node: valueNode }, functionName)) {\n          Logger.verbose(`跳过已经国际化的对象属性值`);\n          return;\n        }\n\n        // 只处理值部分，键名不处理\n        if (\n          t.isStringLiteral(valueNode) &&\n          !path.node.computed &&\n          containsChinese(valueNode.value)\n        ) {\n          // 判断是否在特殊上下文中（如TypeScript类型）\n          if (!isInTypePosition(path.get('value'))) {\n            const stringValue = valueNode.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换对象属性值\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.value = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换对象属性值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        }\n      },\n\n      // 处理对象表达式中的属性\n      ObjectExpression(path: any) {\n        path.node.properties.forEach((property: any) => {\n          if (\n            t.isObjectProperty(property) &&\n            t.isStringLiteral(property.value) &&\n            containsChinese(property.value.value)\n          ) {\n            // 确保不在类型位置\n            if (!isInTypePosition(path)) {\n              const stringValue = property.value.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换对象表达式中的字符串属性值\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              property.value = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换对象表达式中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n          // 处理嵌套对象\n          else if (t.isObjectProperty(property) && t.isObjectExpression(property.value)) {\n            // 递归处理嵌套对象的属性\n            property.value.properties.forEach((nestedProp: any) => {\n              if (\n                t.isObjectProperty(nestedProp) &&\n                t.isStringLiteral(nestedProp.value) &&\n                containsChinese(nestedProp.value.value)\n              ) {\n                const stringValue = nestedProp.value.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换嵌套对象中的字符串属性值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                nestedProp.value = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换嵌套对象中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理函数调用参数中的对象表达式\n      CallExpression(path: any) {\n        // 如果当前节点已经是国际化函数调用，直接跳过\n        if (isI18nFunctionCall(path, functionName)) {\n          Logger.verbose(`跳过已经国际化的函数调用: ${functionName}(...)`);\n          return;\n        }\n\n        // 处理 useState 调用的初始值\n        if (t.isIdentifier(path.node.callee) && path.node.callee.name === 'useState') {\n          // useState 调用通常只有一个参数，即初始值\n          if (path.node.arguments.length === 1) {\n            const initialValue = path.node.arguments[0];\n\n            // 处理字符串字面量作为初始值\n            if (t.isStringLiteral(initialValue) && containsChinese(initialValue.value)) {\n              const stringValue = initialValue.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 useState 初始值\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[0] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 useState 初始值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n            // 处理模板字符串作为初始值\n            else if (t.isTemplateLiteral(initialValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n              Logger.verbose(`检测到 useState 初始值为模板字符串，将递归处理`);\n            }\n            // 处理对象表达式作为初始值\n            else if (t.isObjectExpression(initialValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n              Logger.verbose(`检测到 useState 初始值为对象表达式，将递归处理`);\n            }\n            // 处理数组表达式作为初始值\n            else if (t.isArrayExpression(initialValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个数组表达式\n              Logger.verbose(`检测到 useState 初始值为数组表达式，将递归处理`);\n            }\n          }\n        }\n\n        // 处理 setState 调用\n        if (\n          t.isCallExpression(path.node.callee) &&\n          t.isMemberExpression(path.node.callee.callee) &&\n          t.isIdentifier(path.node.callee.callee.property) &&\n          path.node.callee.callee.property.name === 'useState'\n        ) {\n          // setState 调用通常只有一个参数\n          if (path.node.arguments.length === 1) {\n            const setValue = path.node.arguments[0];\n\n            // 处理字符串字面量作为设置值\n            if (t.isStringLiteral(setValue) && containsChinese(setValue.value)) {\n              const stringValue = setValue.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 setState 参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[0] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 setState 参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n        }\n\n        // 处理 setError 等 setter 函数调用\n        if (\n          t.isIdentifier(path.node.callee) &&\n          path.node.callee.name.startsWith('set') &&\n          path.node.callee.name.length > 3 &&\n          path.node.callee.name[3].toUpperCase() === path.node.callee.name[3]\n        ) {\n          // setter 调用通常只有一个参数\n          if (path.node.arguments.length === 1) {\n            const setValue = path.node.arguments[0];\n\n            // 处理字符串字面量作为设置值\n            if (t.isStringLiteral(setValue) && containsChinese(setValue.value)) {\n              const stringValue = setValue.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 setter 参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[0] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 setter 函数参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n            // 处理模板字符串作为设置值\n            else if (t.isTemplateLiteral(setValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n              Logger.verbose(`检测到 setter 函数参数为模板字符串，将递归处理`);\n            }\n            // 处理对象表达式作为设置值\n            else if (t.isObjectExpression(setValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n              Logger.verbose(`检测到 setter 函数参数为对象表达式，将递归处理`);\n            }\n          }\n        }\n\n        // 处理函数调用的标识符\n        if (\n          t.isIdentifier(path.node.callee) &&\n          ['alert', 'confirm', 'prompt'].includes(path.node.callee.name)\n        ) {\n          // 特殊处理常见的浏览器API\n          path.node.arguments.forEach((arg: any, index: number) => {\n            if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n              const stringValue = arg.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换浏览器API调用参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换${path.node.callee.name}调用参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          });\n        }\n\n        // 处理所有函数调用参数\n        path.node.arguments.forEach((arg: any, index: number) => {\n          if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n            // 确保不在类型参数中\n            if (!isInTypePosition(path.get(`arguments.${index}`))) {\n              const stringValue = arg.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换函数调用参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换函数调用参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n\n          // 处理对象表达式参数\n          if (t.isObjectExpression(arg)) {\n            arg.properties.forEach((prop: any) => {\n              if (\n                t.isObjectProperty(prop) &&\n                t.isStringLiteral(prop.value) &&\n                containsChinese(prop.value.value)\n              ) {\n                const stringValue = prop.value.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象表达式参数中的字符串\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                prop.value = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换函数调用对象参数中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n\n              // 处理嵌套对象\n              if (t.isObjectProperty(prop) && t.isObjectExpression(prop.value)) {\n                prop.value.properties.forEach((nestedProp: any) => {\n                  if (\n                    t.isObjectProperty(nestedProp) &&\n                    t.isStringLiteral(nestedProp.value) &&\n                    containsChinese(nestedProp.value.value)\n                  ) {\n                    const stringValue = nestedProp.value.value;\n                    const key = createI18nKey(stringValue);\n\n                    // 替换嵌套对象中的字符串\n                    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                    nestedProp.value = callExpression;\n\n                    hasReplacement = true;\n                    fileReplacements++;\n                    Logger.verbose(\n                      `替换函数调用嵌套对象中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                    );\n                  }\n                });\n              }\n            });\n          }\n        });\n      },\n\n      // 处理变量声明\n      VariableDeclarator(path: any) {\n        const init = path.node.init;\n\n        // 检查初始值是否已经是国际化函数调用\n        if (init && isI18nFunctionCall({ node: init }, functionName)) {\n          Logger.verbose(`跳过已经国际化的变量初始值`);\n          return;\n        }\n\n        if (t.isStringLiteral(init) && containsChinese(init.value)) {\n          const stringValue = init.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换变量初始值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.init = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换变量初始值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n        // 处理变量初始值为模板字符串的情况\n        else if (t.isTemplateLiteral(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n          Logger.verbose(`检测到变量初始值为模板字符串，将递归处理`);\n        }\n        // 处理变量初始值为对象表达式的情况\n        else if (t.isObjectExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n          Logger.verbose(`检测到变量初始值为对象表达式，将递归处理`);\n        }\n        // 处理变量初始值为数组表达式的情况\n        else if (t.isArrayExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个数组表达式\n          Logger.verbose(`检测到变量初始值为数组表达式，将递归处理`);\n        }\n        // 处理变量初始值为函数调用的情况\n        else if (t.isCallExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个函数调用\n          Logger.verbose(`检测到变量初始值为函数调用，将递归处理`);\n        }\n        // 处理变量初始值为三元表达式的情况\n        else if (t.isConditionalExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个三元表达式\n          Logger.verbose(`检测到变量初始值为三元表达式，将递归处理`);\n        }\n      },\n\n      // 处理数组表达式中的字符串元素\n      ArrayExpression(path: any) {\n        path.node.elements.forEach((element: any, index: number) => {\n          // 检查元素是否已经是国际化函数调用\n          if (element && isI18nFunctionCall({ node: element }, functionName)) {\n            Logger.verbose(`跳过已经国际化的数组元素`);\n            return;\n          }\n\n          if (t.isStringLiteral(element) && containsChinese(element.value)) {\n            const stringValue = element.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换数组元素\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.elements[index] = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换数组元素: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n          // 处理数组中的对象元素\n          if (t.isObjectExpression(element)) {\n            element.properties.forEach((prop: any) => {\n              if (\n                t.isObjectProperty(prop) &&\n                t.isStringLiteral(prop.value) &&\n                containsChinese(prop.value.value)\n              ) {\n                const stringValue = prop.value.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换数组中对象属性的字符串值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                prop.value = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换数组中对象属性的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n              // 处理数组中嵌套对象的嵌套属性\n              else if (t.isObjectProperty(prop) && t.isObjectExpression(prop.value)) {\n                prop.value.properties.forEach((nestedProp: any) => {\n                  if (\n                    t.isObjectProperty(nestedProp) &&\n                    t.isStringLiteral(nestedProp.value) &&\n                    containsChinese(nestedProp.value.value)\n                  ) {\n                    const stringValue = nestedProp.value.value;\n                    const key = createI18nKey(stringValue);\n\n                    // 替换嵌套对象中的字符串\n                    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                    nestedProp.value = callExpression;\n\n                    hasReplacement = true;\n                    fileReplacements++;\n                    Logger.verbose(\n                      `替换数组中嵌套对象的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                    );\n                  }\n                });\n              }\n            });\n          }\n        });\n      },\n\n      // 处理成员表达式赋值\n      AssignmentExpression(path: any) {\n        // 检查右侧是否已经是国际化函数调用\n        if (isI18nFunctionCall({ node: path.node.right }, functionName)) {\n          Logger.verbose(`跳过已经国际化的赋值表达式右侧`);\n          return;\n        }\n\n        // 处理形如 obj.prop = '中文' 的情况\n        if (\n          t.isMemberExpression(path.node.left) &&\n          t.isStringLiteral(path.node.right) &&\n          containsChinese(path.node.right.value)\n        ) {\n          const stringValue = path.node.right.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换赋值表达式右侧的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.right = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换成员表达式赋值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n        // 处理形如 obj.prop = `模板字符串` 的情况\n        else if (t.isMemberExpression(path.node.left) && t.isTemplateLiteral(path.node.right)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n          Logger.verbose(`检测到成员表达式赋值中的模板字符串，将递归处理`);\n        }\n        // 处理形如 obj.prop = { key: '中文' } 的情况\n        else if (t.isMemberExpression(path.node.left) && t.isObjectExpression(path.node.right)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n          Logger.verbose(`检测到成员表达式赋值中的对象表达式，将递归处理`);\n        }\n        // 处理形如 obj.prop = ['中文'] 的情况\n        else if (t.isMemberExpression(path.node.left) && t.isArrayExpression(path.node.right)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个数组表达式\n          Logger.verbose(`检测到成员表达式赋值中的数组表达式，将递归处理`);\n        }\n        // 处理形如 obj.prop = condition ? '中文1' : '中文2' 的情况\n        else if (\n          t.isMemberExpression(path.node.left) &&\n          t.isConditionalExpression(path.node.right)\n        ) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个三元表达式\n          Logger.verbose(`检测到成员表达式赋值中的三元表达式，将递归处理`);\n        }\n      },\n\n      // 处理二元表达式（比较、逻辑运算等）\n      BinaryExpression(path: any) {\n        // 处理左侧操作数\n        if (t.isStringLiteral(path.node.left) && containsChinese(path.node.left.value)) {\n          // 检查是否已经是国际化函数调用\n          if (!isI18nFunctionCall({ node: path.node.left }, functionName)) {\n            const stringValue = path.node.left.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换二元表达式左侧的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.left = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换二元表达式左侧的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        }\n\n        // 处理右侧操作数\n        if (t.isStringLiteral(path.node.right) && containsChinese(path.node.right.value)) {\n          // 检查是否已经是国际化函数调用\n          if (!isI18nFunctionCall({ node: path.node.right }, functionName)) {\n            const stringValue = path.node.right.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换二元表达式右侧的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.right = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换二元表达式右侧的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        }\n      },\n\n      // 处理 switch/case 语句中的字符串\n      SwitchCase(path: any) {\n        // 处理 case '中文': 这种情况\n        if (t.isStringLiteral(path.node.test) && containsChinese(path.node.test.value)) {\n          // 检查 case 表达式是否已经是国际化函数调用\n          if (isI18nFunctionCall({ node: path.node.test }, functionName)) {\n            Logger.verbose(`跳过已经国际化的 switch/case 表达式`);\n          } else {\n            const stringValue = path.node.test.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换 case 表达式中的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.test = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换 switch/case 中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        }\n\n        // 处理 case 语句块中的字符串字面量\n        path.node.consequent.forEach((statement: any) => {\n          if (\n            t.isReturnStatement(statement) &&\n            t.isStringLiteral(statement.argument) &&\n            containsChinese(statement.argument.value)\n          ) {\n            // 检查返回语句是否已经是国际化函数调用\n            if (\n              statement.argument &&\n              isI18nFunctionCall({ node: statement.argument }, functionName)\n            ) {\n              Logger.verbose(`跳过已经国际化的 case 语句块中的返回语句`);\n            } else {\n              const stringValue = statement.argument.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 return 语句中的字符串\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              statement.argument = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 case 语句块中 return 语句的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n\n          // 处理 case 语句块中的表达式语句\n          if (\n            t.isExpressionStatement(statement) &&\n            t.isStringLiteral(statement.expression) &&\n            containsChinese(statement.expression.value)\n          ) {\n            // 检查表达式语句是否已经是国际化函数调用\n            if (isI18nFunctionCall({ node: statement.expression }, functionName)) {\n              Logger.verbose(`跳过已经国际化的 case 语句块中的表达式语句`);\n            } else {\n              const stringValue = statement.expression.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换表达式语句中的字符串\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              statement.expression = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 case 语句块中表达式语句的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n        });\n      },\n\n      // 处理枚举成员的值\n      TSEnumMember(path: any) {\n        const initializer = path.node.initializer;\n\n        // 检查枚举成员值是否已经是国际化函数调用\n        if (initializer && isI18nFunctionCall({ node: initializer }, functionName)) {\n          Logger.verbose(`跳过已经国际化的枚举成员值`);\n          return;\n        }\n\n        // 只处理枚举成员的值部分\n        if (t.isStringLiteral(initializer) && containsChinese(initializer.value)) {\n          const stringValue = initializer.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换枚举成员的值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.initializer = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换枚举成员值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n      },\n\n      // 处理类属性的默认值\n      ClassProperty(path: any) {\n        const valueNode = path.node.value;\n\n        // 检查类属性值是否已经是国际化函数调用\n        if (valueNode && isI18nFunctionCall({ node: valueNode }, functionName)) {\n          Logger.verbose(`跳过已经国际化的类属性默认值`);\n          return;\n        }\n\n        // 只处理值部分，键名不处理\n        if (valueNode && t.isStringLiteral(valueNode) && containsChinese(valueNode.value)) {\n          const stringValue = valueNode.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换类属性默认值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.value = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换类属性默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n      },\n\n      // 处理函数参数默认值\n      AssignmentPattern(path: any) {\n        // 检查默认值是否已经是国际化函数调用\n        if (path.node.right && isI18nFunctionCall({ node: path.node.right }, functionName)) {\n          Logger.verbose(`跳过已经国际化的函数参数默认值`);\n          return;\n        }\n\n        // 只处理默认值部分，参数名不处理\n        if (t.isStringLiteral(path.node.right) && containsChinese(path.node.right.value)) {\n          // 确保不在类型声明中\n          if (!isInTypePosition(path)) {\n            const stringValue = path.node.right.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换函数参数默认值\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.right = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换函数参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        } else if (t.isTemplateLiteral(path.node.right)) {\n          // 处理模板字符串作为默认值的情况\n          let hasChineseInTemplate = false;\n\n          // 检查模板字符串的静态部分\n          path.node.right.quasis.forEach((quasi: any) => {\n            if (containsChinese(quasi.value.raw)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 检查模板字符串的表达式部分\n          path.node.right.expressions.forEach((expr: any) => {\n            if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 如果模板字符串包含中文，需要递归处理\n          if (hasChineseInTemplate) {\n            // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n            Logger.verbose(`检测到函数参数默认值中的模板字符串包含中文，将递归处理`);\n          }\n        }\n      },\n\n      // 处理函数参数，包括对象解构中的默认值\n      ObjectPattern(path: any) {\n        // 处理对象解构模式中的属性\n        path.node.properties.forEach((property: any) => {\n          // 检查是否有默认值\n          if (\n            t.isObjectProperty(property) &&\n            t.isAssignmentPattern(property.value) &&\n            t.isStringLiteral(property.value.right) &&\n            containsChinese(property.value.right.value)\n          ) {\n            const stringValue = property.value.right.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换对象解构中的默认值\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            property.value.right = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        });\n      },\n\n      // 处理函数声明参数\n      FunctionDeclaration(path: any) {\n        // 处理函数参数中的对象解构模式\n        path.node.params.forEach((param: any) => {\n          if (t.isObjectPattern(param)) {\n            param.properties.forEach((property: any) => {\n              if (\n                t.isAssignmentPattern(property.value) &&\n                t.isStringLiteral(property.value.right) &&\n                containsChinese(property.value.right.value)\n              ) {\n                const stringValue = property.value.right.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象解构参数默认值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                property.value.right = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换函数声明中的对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理函数表达式参数\n      FunctionExpression(path: any) {\n        // 处理函数参数中的对象解构模式\n        path.node.params.forEach((param: any) => {\n          if (t.isObjectPattern(param)) {\n            param.properties.forEach((property: any) => {\n              if (\n                t.isAssignmentPattern(property.value) &&\n                t.isStringLiteral(property.value.right) &&\n                containsChinese(property.value.right.value)\n              ) {\n                const stringValue = property.value.right.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象解构参数默认值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                property.value.right = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换函数表达式中的对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理箭头函数参数\n      ArrowFunctionExpression(path: any) {\n        // 处理箭头函数参数中的对象解构模式\n        path.node.params.forEach((param: any) => {\n          if (t.isObjectPattern(param)) {\n            param.properties.forEach((property: any) => {\n              if (\n                t.isAssignmentPattern(property.value) &&\n                t.isStringLiteral(property.value.right) &&\n                containsChinese(property.value.right.value)\n              ) {\n                const stringValue = property.value.right.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象解构参数默认值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                property.value.right = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换箭头函数中的对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理console.log等方法调用内的字符串\n      MemberExpression(path: any) {\n        // 特殊处理 console.log 调用\n        if (\n          t.isIdentifier(path.node.object) &&\n          path.node.object.name === 'console' &&\n          t.isIdentifier(path.node.property)\n        ) {\n          // 获取console方法调用的父节点\n          const parent = path.parent;\n          if (t.isCallExpression(parent)) {\n            // 处理参数中的字符串\n            parent.arguments.forEach((arg: any, index: number) => {\n              if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n                const stringValue = arg.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换console.log参数\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                parent.arguments[index] = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换console方法参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        }\n      },\n\n      // 处理类方法中的字符串字面量\n      ClassMethod(path: any) {\n        // 遍历方法体中的所有语句\n        path.node.body.body.forEach((statement: any) => {\n          // 处理return语句中的字符串字面量\n          if (\n            t.isReturnStatement(statement) &&\n            t.isStringLiteral(statement.argument) &&\n            containsChinese(statement.argument.value)\n          ) {\n            const stringValue = statement.argument.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换return语句中的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            statement.argument = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换类方法中return语句的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n\n          // 处理表达式语句中的字符串字面量\n          if (t.isExpressionStatement(statement)) {\n            // 处理方法调用中的字符串参数\n            if (t.isCallExpression(statement.expression)) {\n              statement.expression.arguments.forEach((arg: any, argIndex: number) => {\n                if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n                  const stringValue = arg.value;\n                  const key = createI18nKey(stringValue);\n\n                  // 替换方法调用参数中的字符串\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  // 使用类型断言确保TypeScript知道这是一个CallExpression\n                  (statement.expression as t.CallExpression).arguments[argIndex] = callExpression;\n\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换类方法中方法调用参数的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                  );\n                }\n\n                // 处理new表达式中的字符串参数\n                if (t.isNewExpression(arg)) {\n                  // 使用类型断言解决TypeScript类型问题\n                  const newExpr = arg as t.NewExpression & { arguments: t.Expression[] };\n                  if (newExpr.arguments) {\n                    newExpr.arguments.forEach((newArg: any, newArgIndex: number) => {\n                      if (t.isStringLiteral(newArg) && containsChinese(newArg.value)) {\n                        const stringValue = newArg.value;\n                        const key = createI18nKey(stringValue);\n\n                        // 替换new表达式参数中的字符串\n                        const callExpression = createI18nCallExpression(\n                          functionName,\n                          key,\n                          quoteType\n                        );\n                        newExpr.arguments[newArgIndex] = callExpression;\n\n                        hasReplacement = true;\n                        fileReplacements++;\n                        Logger.verbose(\n                          `替换类方法中new表达式参数的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                        );\n                      }\n                    });\n                  }\n                }\n              });\n            }\n          }\n        });\n      },\n\n      // 处理new表达式中的字符串参数\n      NewExpression(path: any) {\n        // 使用类型断言和交叉类型解决TypeScript类型问题\n        const node = path.node as t.NewExpression & { arguments: t.Expression[] };\n\n        if (node.arguments && Array.isArray(node.arguments)) {\n          node.arguments.forEach((arg: any, index: number) => {\n            if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n              const stringValue = arg.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换new表达式参数中的字符串\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              node.arguments[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换new表达式参数中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            } else if (t.isTemplateLiteral(arg)) {\n              // 处理模板字符串参数，traverse会自动处理\n              Logger.verbose(`检测到new表达式中的模板字符串参数，将递归处理`);\n            }\n          });\n        }\n      },\n\n      // 处理throw语句\n      ThrowStatement(path: any) {\n        const argument = path.node.argument;\n\n        // 检查throw语句参数是否已经是国际化函数调用\n        if (argument && isI18nFunctionCall({ node: argument }, functionName)) {\n          Logger.verbose(`跳过已经国际化的throw语句`);\n          return;\n        }\n\n        // 处理直接 throw '中文'\n        if (t.isStringLiteral(argument) && containsChinese(argument.value)) {\n          const stringValue = argument.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换throw语句中的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.argument = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换throw语句中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n\n        // 处理 throw new Error('中文')\n        if (t.isNewExpression(argument)) {\n          const newExpr = argument as t.NewExpression & { arguments: t.Expression[] };\n\n          if (newExpr.arguments && Array.isArray(newExpr.arguments)) {\n            newExpr.arguments.forEach((arg: any, index: number) => {\n              // 检查Error构造函数参数是否已经是国际化函数调用\n              if (arg && isI18nFunctionCall({ node: arg }, functionName)) {\n                Logger.verbose(`跳过已经国际化的throw new Error()参数`);\n                return;\n              }\n\n              if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n                const stringValue = arg.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换Error构造函数中的字符串\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                newExpr.arguments[index] = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换throw new Error()中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              } else if (t.isTemplateLiteral(arg)) {\n                // 处理模板字符串，traverse会自动处理\n                Logger.verbose(`检测到throw new Error()中的模板字符串，将递归处理`);\n              }\n            });\n          }\n        }\n      },\n    });\n\n    // 使用import管理器插入import语句\n    importManager.insertImportIfNeeded(\n      ast,\n      file,\n      autoImportEnabled,\n      hasReplacement,\n      imports,\n      insertPosition\n    );\n\n    // 只有在发生替换时才输出文件\n    if (hasReplacement) {\n      // 生成代码时考虑引号配置和格式保持\n      const generateOptions = {\n        // 取消 retainLines，因为它会导致格式问题\n        compact: false, // 确保代码不会被压缩\n        comments: true, // 保留注释\n        minified: false, // 不压缩代码\n        // 设置引号类型\n        jsescOption: {\n          quotes: quoteType,\n        },\n        // 添加缩进配置\n        indent: {\n          style: '  ', // 使用2个空格缩进\n        },\n      };\n\n      let output = generate(ast, generateOptions, code).code;\n\n      // 使用import管理器添加空行\n      output = importManager.addEmptyLineToOutput(output);\n\n      // 格式化输出代码以改善可读性\n      output = output\n        .replace(/;\\s*\\n\\s*\\n/g, ';\\n\\n') // 确保语句后有适当的空行\n        .replace(/\\{\\s*\\n\\s*\\n/g, '{\\n') // 去除多余的空行\n        .replace(/\\n\\s*\\n\\s*\\}/g, '\\n}') // 去除闭合括号前的多余空行\n        .replace(/\\n{3,}/g, '\\n\\n'); // 限制连续空行不超过2行\n\n      await writeFileWithTempDir(file, output, config.tempDir);\n      modifiedCount++;\n      totalReplacements += fileReplacements;\n      Logger.info(`文件 ${file} 处理完成，替换了 ${fileReplacements} 个中文字符串`, 'normal');\n      if (config.tempDir) {\n        Logger.verbose(`修改后的文件保存到: ${config.tempDir}/${file}`);\n      }\n    } else {\n      Logger.verbose(`文件 ${file} 无需修改`);\n    }\n    await flushI18nCache();\n  }\n\n  // 输出最终统计结果\n  Logger.success(`扫描和替换完成！`, 'minimal');\n  Logger.info(`统计信息:`, 'normal');\n  Logger.info(`  - 处理文件总数: ${processedCount}`, 'normal');\n  Logger.info(`  - 修改文件数量: ${modifiedCount}`, 'normal');\n  Logger.info(`  - 替换字符串总数: ${totalReplacements}`, 'normal');\n\n  if (modifiedCount > 0) {\n    Logger.info(`国际化处理完成，共有 ${modifiedCount} 个文件被修改`, 'normal');\n    if (config.tempDir) {\n      Logger.info(`修改后的文件保存在临时目录: ${config.tempDir}`, 'normal');\n    }\n  } else {\n    Logger.info('没有文件需要修改', 'normal');\n  }\n}\n","import { ensureDir, readJson, writeJson } from '../../utils/fs';\nimport { pinyin } from 'pinyin-pro';\nimport * as path from 'path';\nimport { ConfigManager } from '../../config';\nimport stringHash from 'string-hash';\nimport { Logger } from '../../utils/logger';\n\ninterface KeyValueMap {\n  [key: string]: string;\n}\n\ninterface ValueKeyMap {\n  [value: string]: string;\n}\n\n// 内存缓存\nlet keyValueCache: KeyValueMap = {};\nlet valueKeyCache: ValueKeyMap = {}; // 新增：文案到key的反向映射\nlet outputFilePath = '';\n\n// 初始化缓存和文件\nexport async function initI18nCache(): Promise<void> {\n  const config = ConfigManager.get();\n  const outputDir = config.outputDir ?? 'locales';\n  await ensureDir(outputDir);\n\n  // 使用配置中的locale和文件名模式，而不是硬编码\n  const localeFileName = config.output?.localeFileName ?? '{locale}.json';\n  const fileName = localeFileName.replace('{locale}', config.locale ?? 'zh-CN');\n  outputFilePath = path.join(outputDir, fileName);\n\n  // 使用新的 readJson 函数，带默认值\n  keyValueCache = await readJson<KeyValueMap>(outputFilePath, {});\n\n  // 构建反向映射缓存：文案 -> key\n  valueKeyCache = {};\n  for (const [key, value] of Object.entries(keyValueCache)) {\n    valueKeyCache[value] = key;\n  }\n\n  const existingKeyCount = Object.keys(keyValueCache).length;\n\n  if (existingKeyCount > 0) {\n    Logger.verbose(`加载了 ${existingKeyCount} 个已存在的翻译键`);\n  }\n\n  // 如果文件不存在，初始化写入\n  await writeJson(outputFilePath, keyValueCache);\n}\n\nfunction toShortHash(text: string): string {\n  const config = ConfigManager.get();\n  const hashLength = config.keyGeneration?.hashLength ?? 6;\n  return stringHash(text).toString(36).slice(0, hashLength);\n}\n\n/**\n * 生成唯一的key，处理重复情况\n */\nfunction generateUniqueKey(baseKey: string, text: string): string {\n  const config = ConfigManager.get();\n  const separator = config.keyGeneration?.separator ?? '_';\n  const maxRetry = config.keyGeneration?.maxRetryCount ?? 5;\n\n  // 如果baseKey不重复，直接返回\n  if (!keyValueCache[baseKey]) {\n    return baseKey;\n  }\n\n  // 添加hash后缀处理重复key\n  let finalKey = baseKey + separator + toShortHash(text);\n  let tryCount = 0;\n\n  while (keyValueCache[finalKey] && tryCount < maxRetry) {\n    finalKey = baseKey + separator + toShortHash(text + Math.random().toString());\n    tryCount++;\n  }\n\n  if (tryCount >= maxRetry) {\n    Logger.warn(`生成唯一key失败，达到最大重试次数: ${baseKey}`);\n    // 使用时间戳作为最后的备选方案\n    finalKey = baseKey + separator + Date.now().toString(36);\n  }\n\n  return finalKey;\n}\n\nexport function createI18nKey(text: string): string {\n  const config = ConfigManager.get();\n  const reuseExistingKey = config.keyGeneration?.reuseExistingKey ?? true;\n\n  // 如果配置为重复使用相同文案的key，先检查文案是否已存在\n  if (reuseExistingKey && valueKeyCache[text]) {\n    Logger.verbose(`重复使用已存在文案的key: \"${valueKeyCache[text]}\" for \"${text}\"`);\n    return valueKeyCache[text];\n  }\n\n  // 提取所有汉字，截取前N个\n  const maxLength = config.keyGeneration?.maxChineseLength ?? 10;\n  const han = (text.match(/[\\u4e00-\\u9fa5]+/g)?.join('') ?? '').slice(0, maxLength);\n\n  if (!han) {\n    return '';\n  }\n\n  // 获取配置\n  const pinyinOptions = config.keyGeneration?.pinyinOptions ?? { toneType: 'none', type: 'array' };\n  const separator = config.keyGeneration?.separator ?? '_';\n  const keyPrefix = config.keyGeneration?.keyPrefix ?? '';\n\n  // 生成基础key\n  const baseKey = (\n    pinyin(han, {\n      toneType: pinyinOptions.toneType ?? 'none',\n      type: 'array',\n    }) ?? []\n  ).join(separator);\n\n  if (!baseKey) {\n    return '';\n  }\n\n  // 构建完整key（添加前缀）\n  const keyWithPrefix = keyPrefix ? `${keyPrefix}${separator}${baseKey}` : baseKey;\n\n  // 生成唯一key（处理重复）\n  const finalKey = generateUniqueKey(keyWithPrefix, text);\n\n  // 缓存到内存（双向映射）\n  keyValueCache[finalKey] = text;\n  valueKeyCache[text] = finalKey;\n\n  return finalKey;\n}\n\n// 可选：写回文件\nexport async function flushI18nCache(): Promise<void> {\n  if (outputFilePath) {\n    const config = ConfigManager.get();\n    const prettyJson = config.output?.prettyJson ?? true;\n    await writeJson(outputFilePath, keyValueCache, prettyJson);\n    const keyCount = Object.keys(keyValueCache).length;\n    Logger.info(`已保存 ${keyCount} 个翻译键到 ${outputFilePath}`, 'normal');\n  }\n}\n","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { Logger } from './logger';\nimport { findMatchingImport } from './pattern';\n\n// 简单的require导入，只针对有兼容性问题的模块\nconst generate = require('@babel/generator').default;\n\n/**\n * 检查是否已经存在相同的import语句\n * @param ast AST对象\n * @param importStatement import语句字符串\n * @returns 是否已存在\n */\nfunction hasExistingImport(ast: any, importStatement: string): boolean {\n  try {\n    const importAst = parse(importStatement, {\n      sourceType: 'module',\n      plugins: ['jsx', 'typescript'],\n    });\n\n    if (!importAst.program?.body || importAst.program.body.length === 0) {\n      return false;\n    }\n\n    const newStatements = importAst.program.body;\n    const existingStatements = ast.program.body;\n\n    // 检查每个新语句是否已存在\n    for (const newStmt of newStatements) {\n      let found = false;\n      for (const existingStmt of existingStatements) {\n        // 比较AST节点的字符串表示（简单但有效的方法）\n        const newCode = generate(newStmt, { minified: true }).code;\n        const existingCode = generate(existingStmt, { minified: true }).code;\n        if (newCode === existingCode) {\n          found = true;\n          break;\n        }\n      }\n      if (!found) {\n        return false; // 有新语句不存在\n      }\n    }\n    return true; // 所有语句都已存在\n  } catch (error) {\n    Logger.verbose(`检查import重复时出错: ${error}`);\n    return false;\n  }\n}\n\n/**\n * 在AST中添加import语句（支持不同插入位置）\n * @param ast AST对象\n * @param importStatement import语句字符串\n * @param insertPosition 插入位置 'top' | 'afterImports'\n */\nfunction addImportToAST(\n  ast: any,\n  importStatement: string,\n  insertPosition: 'top' | 'afterImports' = 'afterImports'\n): void {\n  try {\n    // 检查是否已存在相同的import语句\n    if (hasExistingImport(ast, importStatement)) {\n      Logger.verbose('Import语句已存在，跳过插入');\n      return;\n    }\n\n    // 解析import语句为AST节点\n    const importAst = parse(importStatement, {\n      sourceType: 'module',\n      plugins: ['jsx', 'typescript'],\n    });\n\n    // 将解析出的语句添加到指定位置\n    if (importAst.program?.body && importAst.program.body.length > 0) {\n      let insertIndex = 0;\n\n      if (insertPosition === 'afterImports') {\n        // 在现有import语句之后插入\n        for (let i = 0; i < ast.program.body.length; i++) {\n          if (t.isImportDeclaration(ast.program.body[i])) {\n            insertIndex = i + 1;\n          } else {\n            break;\n          }\n        }\n      } else {\n        // 在文件顶部插入\n        insertIndex = 0;\n      }\n\n      // 插入新的语句\n      ast.program.body.splice(insertIndex, 0, ...importAst.program.body);\n\n      Logger.verbose(`Import语句已插入到位置: ${insertPosition}`);\n    }\n  } catch (error) {\n    Logger.warn(`无法解析import语句: ${importStatement}`);\n    Logger.verbose(`错误详情: ${error}`);\n  }\n}\n\n/**\n * 在生成的代码中为import语句后添加空行\n * 由于@babel/generator会重新格式化代码，需要在生成后处理\n * @param code 生成的代码字符串\n * @param importStatement 插入的import语句内容\n * @returns 处理后的代码字符串\n */\nfunction addEmptyLineAfterImport(code: string, importStatement: string): string {\n  // 清理import语句，移除可能的换行符和多余空格\n  const cleanImportStatement = importStatement.replace(/;\\s*$/g, ';').trim();\n\n  // 在代码中找到该import语句的位置\n  const importIndex = code.indexOf(cleanImportStatement);\n  if (importIndex === -1) {\n    Logger.verbose('未在生成的代码中找到import语句，跳过空行添加');\n    return code;\n  }\n\n  // 找到import语句的结束位置（分号后）\n  const importEndIndex = importIndex + cleanImportStatement.length;\n\n  // 检查import语句后是否直接跟着其他代码（没有换行）\n  const charAfterImport = code.charAt(importEndIndex);\n  if (charAfterImport && charAfterImport !== '\\n' && charAfterImport !== '\\r') {\n    // import语句后直接跟着其他代码，需要先添加换行，再添加空行\n    // 同时去掉后续代码开头可能的空格，避免多余的缩进\n    const restCode = code.substring(importEndIndex);\n    const trimmedRestCode = restCode.replace(/^[ \\t]*/, ''); // 移除开头的空格和制表符\n    return code.substring(0, importEndIndex) + '\\n\\n' + trimmedRestCode;\n  }\n\n  // 找到import语句行的实际结束位置（换行符位置）\n  let lineEndIndex = importEndIndex;\n  while (lineEndIndex < code.length && code.charAt(lineEndIndex) !== '\\n') {\n    lineEndIndex++;\n  }\n\n  if (lineEndIndex >= code.length) {\n    // 如果import是文件最后一行，添加空行\n    return code + '\\n';\n  }\n\n  // 检查import行后是否已有空行\n  const nextLineStart = lineEndIndex + 1;\n  if (nextLineStart >= code.length) {\n    // 文件结束，添加空行\n    return code + '\\n';\n  }\n\n  const nextLineEnd = code.indexOf('\\n', nextLineStart);\n  const nextLine =\n    nextLineEnd === -1 ? code.substring(nextLineStart) : code.substring(nextLineStart, nextLineEnd);\n\n  // 如果下一行不是空行，插入空行\n  if (nextLine.trim() !== '') {\n    return code.substring(0, lineEndIndex + 1) + '\\n' + code.substring(lineEndIndex + 1);\n  }\n\n  return code;\n}\n\n/**\n * Import管理器 - 封装import插入相关的逻辑\n */\nexport class ImportManager {\n  private hasImportInserted = false;\n  private insertedImportStatement = '';\n\n  /**\n   * 重置状态（处理新文件时调用）\n   */\n  reset(): void {\n    this.hasImportInserted = false;\n    this.insertedImportStatement = '';\n  }\n\n  /**\n   * 按需插入import语句\n   */\n  insertImportIfNeeded(\n    ast: any,\n    file: string,\n    autoImportEnabled: boolean,\n    hasReplacement: boolean,\n    imports: any,\n    insertPosition: 'top' | 'afterImports'\n  ): void {\n    if (!this.hasImportInserted && autoImportEnabled && hasReplacement) {\n      const importStatement = findMatchingImport(file, imports);\n      if (importStatement) {\n        Logger.verbose(`为文件 ${file} 添加import语句: ${importStatement.trim()}`);\n        addImportToAST(ast, importStatement, insertPosition);\n        this.hasImportInserted = true;\n        this.insertedImportStatement = importStatement;\n      } else {\n        Logger.warn(`文件 ${file} 需要import语句但未找到匹配的import配置`, 'normal');\n      }\n    }\n  }\n\n  /**\n   * 为输出代码添加空行（如果插入了import语句）\n   */\n  addEmptyLineToOutput(output: string): string {\n    if (this.hasImportInserted && this.insertedImportStatement) {\n      const result = addEmptyLineAfterImport(output, this.insertedImportStatement);\n      if (result !== output) {\n        Logger.verbose(`已为import语句后添加空行`);\n      }\n      return result;\n    }\n    return output;\n  }\n\n  /**\n   * 检查是否已插入import语句\n   */\n  get isImportInserted(): boolean {\n    return this.hasImportInserted;\n  }\n\n  /**\n   * 获取插入的import语句内容\n   */\n  get insertedStatement(): string {\n    return this.insertedImportStatement;\n  }\n}","import { Logger } from './logger';\nimport micromatch from 'micromatch';\n\n/**\n * 使用micromatch进行glob模式匹配\n * 支持完整的glob语法，包括 *, **, {}, [], ! 等\n */\nexport function matchPattern(pattern: string, filePath: string): boolean {\n  try {\n    return micromatch.isMatch(filePath, pattern);\n  } catch (error) {\n    Logger.warn(`模式匹配出错 - pattern: ${pattern}, filePath: ${filePath}, error: ${error}`);\n    return false;\n  }\n}\n\n/**\n * 从配置中找到匹配文件路径的import配置\n */\nexport function findMatchingImport(\n  filePath: string,\n  imports: { [pattern: string]: { importStatement: string } } = {}\n): string | null {\n  Logger.verbose(`findMatchingImport: ${filePath}`);\n\n  // 获取所有模式，按优先级排序（更具体的模式优先）\n  const patterns = Object.keys(imports).sort((a, b) => {\n    // 优先级：具体路径 > 带扩展名的模式 > 通用模式\n    const scoreA = getPatternSpecificity(a);\n    const scoreB = getPatternSpecificity(b);\n    return scoreB - scoreA;\n  });\n\n  for (const pattern of patterns) {\n    if (matchPattern(pattern, filePath)) {\n      Logger.verbose(`匹配到模式: ${pattern} -> ${filePath}`);\n      return imports[pattern]?.importStatement || null;\n    }\n  }\n\n  Logger.verbose(`未找到匹配的import配置: ${filePath}`);\n  return null;\n}\n\n/**\n * 计算模式的具体性分数（分数越高越具体）\n */\nfunction getPatternSpecificity(pattern: string): number {\n  let score = 0;\n\n  // 没有通配符的路径分数更高\n  if (!pattern.includes('*')) {\n    score += 100;\n  }\n\n  // 有具体扩展名的分数更高\n  if (pattern.includes('.{') || pattern.match(/\\.\\w+$/)) {\n    score += 50;\n  }\n\n  // 路径层级越深分数越高\n  score += (pattern.match(/\\//g)?.length || 0) * 10;\n\n  // ** 通配符降低分数\n  score -= (pattern.match(/\\*\\*/g)?.length || 0) * 20;\n\n  // * 通配符降低分数\n  score -= (pattern.match(/(?<!\\*)\\*(?!\\*)/g)?.length || 0) * 5;\n\n  return score;\n}","import { withCLI } from '../wrapper';\nimport { Logger } from '../../utils/logger';\nimport type { I18nConfig } from '../../config';\n\nimport { scanAndReplaceAll } from '../../core/ast';\nimport { ConfigManager } from '../../config';\n\ninterface ExtractOptions {\n  config?: string;\n}\n\nasync function extractHandler(options: ExtractOptions, config: I18nConfig): Promise<void> {\n  // 同步配置到main模块的ConfigManager\n  ConfigManager.init(config);\n  \n  Logger.info('配置加载完成，开始执行提取与替换流程...', 'normal');\n  await scanAndReplaceAll();\n  Logger.success('提取与替换流程已完成', 'minimal');\n}\n\nexport const extractCommand = withCLI(extractHandler);","import { TranslationProvider, TranslationResult } from '../index';\nimport { Logger } from '../../../utils/logger';\nimport baiduTranslateService from 'baidu-translate-service';\n\ninterface BaiduTranslateConfig {\n  appid: string;\n  key: string;\n}\n\ninterface BaiduTranslateResponse {\n  from: string;\n  to: string;\n  trans_result: Array<{\n    src: string;\n    dst: string;\n  }>;\n  error_code?: string;\n  error_msg?: string;\n}\n\nexport class BaiduTranslationProvider implements TranslationProvider {\n  public readonly name = 'baidu';\n  private config: BaiduTranslateConfig;\n\n  constructor(config: BaiduTranslateConfig) {\n    this.config = config;\n    Logger.verbose(`百度翻译提供者初始化完成，appid: ${config.appid ? '已配置' : '未配置'}`);\n  }\n\n  async translate(\n    text: string,\n    from: string = 'auto',\n    to: string = 'en'\n  ): Promise<TranslationResult> {\n    if (!this.isConfigured()) {\n      throw new Error('百度翻译服务未配置，请设置 appid 和 key');\n    }\n\n    try {\n      const mappedFrom = this.mapLanguageCode(from);\n      const mappedTo = this.mapLanguageCode(to);\n      Logger.verbose(`发起百度翻译请求: ${mappedFrom} -> ${mappedTo}, 文本长度: ${text.length}`);\n\n      const response: BaiduTranslateResponse = await baiduTranslateService({\n        appid: this.config.appid,\n        key: this.config.key,\n        q: text,\n        from: mappedFrom,\n        to: mappedTo,\n      });\n\n      if (response.error_code) {\n        throw new Error(`百度翻译API错误: ${response.error_code} - ${response.error_msg}`);\n      }\n\n      if (!response.trans_result || response.trans_result.length === 0) {\n        throw new Error('翻译结果为空');\n      }\n\n      const translatedText = response.trans_result.map((item) => item.dst).join('\\n');\n\n      Logger.verbose(`翻译成功: \"${text}\" -> \"${translatedText}\"`);\n\n      return {\n        originalText: text,\n        translatedText,\n        sourceLanguage: response.from,\n        targetLanguage: response.to,\n        provider: this.name,\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      Logger.error(`百度翻译失败: ${errorMessage}`);\n      throw error;\n    }\n  }\n\n  isConfigured(): boolean {\n    return !!(this.config.appid && this.config.key);\n  }\n\n  getSupportedLanguages(): string[] {\n    return [\n      'auto',\n      'zh',\n      'en',\n      'yue',\n      'wyw',\n      'jp',\n      'kor',\n      'fra',\n      'spa',\n      'th',\n      'ara',\n      'ru',\n      'pt',\n      'de',\n      'it',\n      'el',\n      'nl',\n      'pl',\n      'bul',\n      'est',\n      'dan',\n      'fin',\n      'cs',\n      'rom',\n      'slo',\n      'swe',\n      'hu',\n      'cht',\n      'vie',\n    ];\n  }\n\n  /**\n   * 映射语言代码到百度翻译API支持的格式\n   */\n  private mapLanguageCode(lang: string): string {\n    const langMap: Record<string, string> = {\n      'zh-CN': 'zh',\n      'zh-TW': 'cht',\n      'en-US': 'en',\n      ja: 'jp',\n      ko: 'kor',\n      fr: 'fra',\n      es: 'spa',\n      ar: 'ara',\n      ru: 'ru',\n      pt: 'pt',\n      de: 'de',\n      it: 'it',\n      nl: 'nl',\n      pl: 'pl',\n      sv: 'swe',\n      vi: 'vie',\n    };\n\n    return langMap[lang] ?? lang;\n  }\n}\n","import { Logger } from '../../utils/logger';\n\nexport interface QueueTask<T> {\n  id: string;\n  execute: () => Promise<T>;\n  maxRetries: number;\n  retryDelay: number;\n  currentRetry?: number;\n}\n\nexport interface QueueStats {\n  total: number;\n  pending: number;\n  completed: number;\n  failed: number;\n  inProgress: number;\n}\n\nexport interface ProgressCallback {\n  (stats: QueueStats, currentTask?: string): void;\n}\n\nexport interface WriteCallback {\n  (taskId: string, result: unknown): Promise<void>;\n}\n\n/**\n * 翻译队列，用于控制并发和重试逻辑\n */\nexport class TranslationQueue {\n  private readonly concurrency: number;\n  private tasks: QueueTask<unknown>[] = [];\n  private completedResults: Map<string, unknown> = new Map();\n  private failedTasks: Map<string, Error> = new Map();\n  private stats: QueueStats = {\n    total: 0,\n    pending: 0,\n    completed: 0,\n    failed: 0,\n    inProgress: 0,\n  };\n  private batchDelay: number = 0; // 批次间延迟（毫秒）\n  private isApiLimited: boolean = false; // API限制状态标志\n  private apiLimitResetTime: number = 0; // API限制重置时间\n  private progressCallback?: ProgressCallback; // 进度回调\n  private writeCallback?: WriteCallback; // 写入回调\n  private activeTasks: Set<string> = new Set(); // 当前活跃的任务ID\n\n  constructor(concurrency: number = 10) {\n    this.concurrency = concurrency;\n  }\n\n  /**\n   * 添加任务到队列\n   */\n  addTask<T>(task: QueueTask<T>): void {\n    task.currentRetry = 0;\n    this.tasks.push(task as QueueTask<unknown>);\n    this.stats.total++;\n    this.stats.pending++;\n  }\n\n  /**\n   * 设置批次间延迟时间（毫秒）\n   */\n  setBatchDelay(delay: number): void {\n    this.batchDelay = delay;\n  }\n\n  /**\n   * 设置写入回调函数\n   */\n  setWriteCallback(callback: WriteCallback): void {\n    this.writeCallback = callback;\n  }\n\n  /**\n   * 设置进度回调函数\n   */\n  setProgressCallback(callback: ProgressCallback): void {\n    this.progressCallback = callback;\n  }\n\n  /**\n   * 触发进度回调\n   */\n  private triggerProgressCallback(currentTask?: string): void {\n    if (this.progressCallback) {\n      this.progressCallback({ ...this.stats }, currentTask);\n    }\n  }\n\n  /**\n   * 执行所有任务，返回结果映射\n   */\n  async executeAll(): Promise<Map<string, unknown>> {\n    Logger.info(`开始执行翻译队列，并发数: ${this.concurrency}，任务总数: ${this.stats.total}`, 'normal');\n\n    this.completedResults.clear();\n    this.failedTasks.clear();\n\n    const workers: Promise<void>[] = [];\n\n    // 启动固定数量的worker\n    for (let i = 0; i < Math.min(this.concurrency, this.tasks.length); i++) {\n      workers.push(this.worker());\n    }\n\n    // 等待所有worker完成\n    await Promise.all(workers);\n\n    return this.completedResults;\n  }\n\n  /**\n   * 工作线程，负责执行任务队列中的任务\n   */\n  private async worker(): Promise<void> {\n    while (this.tasks.length > 0) {\n      // 检查API限制状态\n      if (this.isApiLimited) {\n        const now = Date.now();\n        if (now < this.apiLimitResetTime) {\n          // API处于限制状态，等待重置\n          const waitTime = this.apiLimitResetTime - now;\n          Logger.warn(`API速率限制中，等待 ${Math.ceil(waitTime / 1000)} 秒后继续...`);\n          await this.delay(waitTime);\n          this.isApiLimited = false;\n        }\n      }\n\n      const task = this.tasks.shift();\n      if (!task) continue;\n\n      this.stats.pending--;\n      this.stats.inProgress++;\n      this.activeTasks.add(task.id);\n      \n      // 触发进度回调\n      this.triggerProgressCallback(task.id);\n\n      try {\n        // 执行任务\n        const result = await task.execute();\n\n        // 记录成功结果\n        this.completedResults.set(task.id, result);\n        this.stats.completed++;\n        this.stats.inProgress--;\n        this.activeTasks.delete(task.id);\n\n        // 触发写入回调（异步非阻塞）\n        if (this.writeCallback) {\n          this.writeCallback(task.id, result).catch((error) => {\n            Logger.warn(`写入回调执行失败: ${error}`);\n          });\n        }\n\n        // 触发进度回调\n        this.triggerProgressCallback();\n\n        Logger.verbose(`任务 ${task.id} 执行成功`);\n\n        // 添加批次间延迟，避免API限制\n        if (this.batchDelay > 0) {\n          await this.delay(this.batchDelay);\n        }\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        this.stats.inProgress--;\n        this.activeTasks.delete(task.id);\n\n        // 检测API限制错误\n        if (this.isApiLimitError(errorMessage)) {\n          this.handleApiLimitError();\n\n          // 放回队列头部，等待API限制解除后重试\n          this.tasks.unshift(task);\n          this.stats.pending++;\n        } else {\n          Logger.error(`任务 ${task.id} 执行失败: ${errorMessage}`);\n\n          // 检查是否还可以重试\n          if ((task.currentRetry ?? 0) < task.maxRetries) {\n            task.currentRetry = (task.currentRetry ?? 0) + 1;\n            Logger.warn(\n              `任务 ${task.id} 执行失败，准备第 ${task.currentRetry} 次重试: ${errorMessage}`\n            );\n\n            // 等待重试延迟时间\n            await this.delay(task.retryDelay);\n\n            // 放回队列末尾，等待重试\n            this.tasks.push(task);\n            this.stats.pending++;\n          } else {\n            // 重试次数用尽，记录最终失败\n            const finalError = error instanceof Error ? error : new Error(String(error));\n            this.failedTasks.set(task.id, finalError);\n            this.stats.failed++;\n          }\n        }\n        \n        // 触发进度回调\n        this.triggerProgressCallback();\n      }\n    }\n  }\n\n  /**\n   * 检测是否为API限制错误\n   */\n  private isApiLimitError(errorMessage: string): boolean {\n    // 根据错误消息判断是否为API限制错误\n    return (\n      errorMessage.includes('API错误: 54003') ||\n      errorMessage.includes('Invalid Access Limit') ||\n      errorMessage.includes('rate limit') ||\n      errorMessage.includes('too many requests')\n    );\n  }\n\n  /**\n   * 处理API限制错误\n   */\n  private handleApiLimitError(): void {\n    // API限制，设置标志并计算恢复时间\n    this.isApiLimited = true;\n    // 设置60秒的API限制冷却时间\n    const cooldownTime = 60 * 1000;\n    this.apiLimitResetTime = Date.now() + cooldownTime;\n\n    Logger.warn(`检测到API速率限制，将暂停 ${cooldownTime / 1000} 秒后继续`);\n  }\n\n  /**\n   * 获取已完成任务的结果\n   */\n  getCompletedResults(): Map<string, unknown> {\n    return this.completedResults;\n  }\n\n  /**\n   * 获取失败任务的错误信息\n   */\n  getFailedTasks(): Map<string, Error> {\n    return this.failedTasks;\n  }\n\n  /**\n   * 获取当前统计信息\n   */\n  getStats(): QueueStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Promise延迟等待\n   */\n  private delay(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n","import { Logger } from '../../utils/logger';\n\nexport interface TranslationCacheItem {\n  originalText: string;\n  translatedText: string;\n  sourceLanguage: string;\n  targetLanguage: string;\n  provider: string;\n  timestamp: number;\n}\n\n/**\n * 翻译缓存管理器\n * 简单的内存缓存，用于存储和检索已翻译过的文本，避免重复调用翻译API\n */\nexport class TranslationCache {\n  private static instance: TranslationCache;\n  private cache: Map<string, TranslationCacheItem> = new Map();\n\n  private constructor() {\n    // 单例模式，私有构造函数\n  }\n\n  /**\n   * 获取翻译缓存管理器实例\n   */\n  public static getInstance(): TranslationCache {\n    if (!TranslationCache.instance) {\n      TranslationCache.instance = new TranslationCache();\n      Logger.verbose('初始化翻译内存缓存');\n    }\n    return TranslationCache.instance;\n  }\n\n  /**\n   * 从缓存中获取翻译结果\n   */\n  public get(\n    text: string,\n    from: string,\n    to: string,\n    provider: string\n  ): TranslationCacheItem | null {\n    const key = this.generateCacheKey(text, from, to, provider);\n    const cached = this.cache.get(key);\n\n    if (cached) {\n      Logger.verbose(`缓存命中: \"${text}\" (${from} -> ${to})`);\n      return cached;\n    }\n\n    return null;\n  }\n\n  /**\n   * 将翻译结果存入缓存\n   */\n  public set(\n    text: string,\n    translatedText: string,\n    from: string,\n    to: string,\n    provider: string\n  ): void {\n    const key = this.generateCacheKey(text, from, to, provider);\n\n    this.cache.set(key, {\n      originalText: text,\n      translatedText,\n      sourceLanguage: from,\n      targetLanguage: to,\n      provider,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * 清空缓存\n   */\n  public clear(): void {\n    this.cache.clear();\n    Logger.verbose('翻译缓存已清空');\n  }\n\n  /**\n   * 获取缓存大小\n   */\n  public size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * 生成缓存键\n   */\n  private generateCacheKey(text: string, from: string, to: string, provider: string): string {\n    // 使用源文本、源语言、目标语言和提供者生成唯一键\n    return `${provider}:${from}:${to}:${text}`;\n  }\n}\n","import { QueueStats } from '../core/translation/queue';\nimport * as cliProgress from 'cli-progress';\n\nexport class ProgressDisplay {\n  private progressBar?: cliProgress.SingleBar;\n  private isRunning = false;\n  private isInitialized = false;\n  private currentStats: QueueStats = { total: 0, pending: 0, completed: 0, failed: 0, inProgress: 0 };\n  private activeTasks: string[] = [];\n  private startTime = 0; // 开始时间\n  private lastUpdateTime = 0; // 上次更新时间\n\n  /**\n   * 开始显示进度\n   */\n  start(): void {\n    this.isRunning = true;\n    this.startTime = Date.now();\n    this.lastUpdateTime = this.startTime;\n    \n    // 创建进度条\n    this.progressBar = new cliProgress.SingleBar({\n      format: '🌍 翻译进度 |{bar}| {percentage}% ({value}/{total}) | 并发: {concurrent} | 已用时: {elapsed}s',\n      barCompleteChar: '█',\n      barIncompleteChar: '░',\n      hideCursor: true,\n      clearOnComplete: false,\n      stopOnComplete: true,\n      barsize: 40,\n    }, cliProgress.Presets.shades_classic);\n\n    // 暂时不启动进度条，等待第一次updateProgress调用时再启动\n  }\n\n  /**\n   * 停止显示进度\n   */\n  stop(): void {\n    this.isRunning = false;\n    if (this.progressBar) {\n      this.progressBar.stop();\n      this.progressBar = undefined;\n    }\n  }\n\n  /**\n   * 更新进度数据\n   */\n  updateProgress(stats: QueueStats, currentTask?: string): void {\n    this.currentStats = stats;\n    this.lastUpdateTime = Date.now();\n    \n    if (currentTask) {\n      // 添加新的活跃任务，保持最多显示3个\n      if (!this.activeTasks.includes(currentTask)) {\n        this.activeTasks.unshift(currentTask);\n        if (this.activeTasks.length > 3) {\n          this.activeTasks = this.activeTasks.slice(0, 3);\n        }\n      }\n    }\n\n    // 更新进度条\n    if (this.progressBar && this.isRunning) {\n      // 首次初始化进度条\n      if (!this.isInitialized) {\n        this.progressBar.start(stats.total, 0, {\n          concurrent: 0,\n          elapsed: 0\n        });\n        this.isInitialized = true;\n      }\n      \n      const completed = stats.completed + stats.failed;\n      const elapsedSeconds = Math.round((this.lastUpdateTime - this.startTime) / 1000);\n      \n      this.progressBar.setTotal(stats.total);\n      this.progressBar.update(completed, {\n        concurrent: stats.inProgress,\n        elapsed: elapsedSeconds\n      });\n    }\n  }\n\n  /**\n   * 显示最终结果\n   */\n  showFinalResult(stats: QueueStats): void {\n    this.stop();\n    \n    const { total, completed, failed } = stats;\n    const totalElapsed = Math.round((Date.now() - this.startTime) / 1000);\n    \n    if (failed > 0) {\n      console.log(`✅ 翻译完成! 成功: ${completed}, 失败: ${failed}, 总计: ${total}, 用时: ${totalElapsed}s`);\n    } else {\n      console.log(`✅ 翻译全部完成! 成功翻译 ${completed} 个条目, 用时: ${totalElapsed}s`);\n    }\n  }\n}","import { writeJson } from './fs';\nimport { Logger } from './logger';\n\ninterface WriteTask {\n  key: string;\n  value: string;\n  timestamp: number;\n}\n\nexport class WriteQueue {\n  private queue: WriteTask[] = [];\n  private isWriting = false;\n  private batchSize = 10; // 每次批量写入的数量\n  private writeTimeout = 2000; // 写入超时时间（毫秒）\n  private timer?: NodeJS.Timeout;\n  private filePath: string;\n  private baseData: Record<string, unknown>;\n\n  constructor(filePath: string, baseData: Record<string, unknown> = {}) {\n    this.filePath = filePath;\n    this.baseData = { ...baseData };\n  }\n\n  /**\n   * 添加写入任务到队列\n   */\n  addTask(key: string, value: string): void {\n    this.queue.push({\n      key,\n      value,\n      timestamp: Date.now()\n    });\n\n    // 立即更新内存数据\n    this.baseData[key] = value;\n\n    // 如果队列达到批次大小，立即写入\n    if (this.queue.length >= this.batchSize) {\n      this.flushQueue();\n    } else {\n      // 否则设置定时器延迟写入\n      this.scheduleWrite();\n    }\n  }\n\n  /**\n   * 安排延迟写入\n   */\n  private scheduleWrite(): void {\n    if (this.timer) {\n      clearTimeout(this.timer);\n    }\n    \n    this.timer = setTimeout(() => {\n      this.flushQueue();\n    }, this.writeTimeout);\n  }\n\n  /**\n   * 立即刷新队列到文件（异步非阻塞）\n   */\n  flushQueue(): void {\n    if (this.isWriting || this.queue.length === 0) {\n      return;\n    }\n\n    this.isWriting = true;\n\n    if (this.timer) {\n      clearTimeout(this.timer);\n      this.timer = undefined;\n    }\n\n    const writeCount = this.queue.length;\n    \n    // 异步写入，不阻塞\n    writeJson(this.filePath, this.baseData, true)\n      .then(() => {\n        Logger.verbose(`批量写入 ${writeCount} 个翻译结果到 ${this.filePath}`);\n      })\n      .catch((error) => {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        Logger.warn(`批量写入失败: ${errorMessage}`);\n      })\n      .finally(() => {\n        this.isWriting = false;\n      });\n    \n    // 清空队列\n    this.queue = [];\n  }\n\n  /**\n   * 等待所有写入完成\n   */\n  async finish(): Promise<void> {\n    // 刷新剩余的队列\n    this.flushQueue();\n    \n    // 等待正在进行的写入完成\n    while (this.isWriting) {\n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n  }\n\n  /**\n   * 获取当前队列大小\n   */\n  getQueueSize(): number {\n    return this.queue.length;\n  }\n}","import { TranslationProvider, TranslationResult, TranslationConfig } from './index';\nimport { BaiduTranslationProvider } from './providers/baidu';\nimport { Logger } from '../../utils/logger';\nimport { TranslationQueue } from './queue';\nimport { readJson, writeJson, fileExists } from '../../utils/fs';\nimport { TranslationCache } from './cache';\nimport { ProgressDisplay } from '../../utils/progress-display';\nimport { WriteQueue } from '../../utils/write-queue';\nimport * as path from 'path';\n\nexport class TranslationManager {\n  private providers: Map<string, TranslationProvider> = new Map();\n  private config: TranslationConfig;\n  private cache: TranslationCache;\n\n  constructor(config: TranslationConfig) {\n    this.config = config;\n    Logger.verbose(`初始化翻译管理器，提供者: ${config.provider}，并发数: ${config.concurrency}`);\n\n    // 初始化缓存\n    this.cache = TranslationCache.getInstance();\n\n    this.initializeProviders();\n  }\n\n  private initializeProviders(): void {\n    // 初始化百度翻译服务\n    if (this.config.baidu?.appid && this.config.baidu?.key) {\n      const baiduProvider = new BaiduTranslationProvider({\n        appid: this.config.baidu.appid,\n        key: this.config.baidu.key,\n      });\n      this.providers.set('baidu', baiduProvider);\n      Logger.verbose('百度翻译服务已初始化');\n    }\n\n    // TODO: 可以在这里添加其他翻译服务提供者\n    // if (this.config.custom) {\n    //   const customProvider = new CustomTranslationProvider(this.config.custom);\n    //   this.providers.set('custom', customProvider);\n    // }\n  }\n\n  /**\n   * 翻译文本\n   */\n  async translate(\n    text: string,\n    from: string = this.config.defaultSourceLang ?? 'auto',\n    to: string = this.config.defaultTargetLang ?? 'en'\n  ): Promise<TranslationResult> {\n    if (!this.config.enabled) {\n      throw new Error('翻译服务未启用');\n    }\n\n    const provider = this.providers.get(this.config.provider);\n    if (!provider) {\n      throw new Error(`翻译服务提供者 '${this.config.provider}' 未找到或未配置`);\n    }\n\n    if (!provider.isConfigured()) {\n      throw new Error(`翻译服务提供者 '${this.config.provider}' 配置不完整`);\n    }\n\n    const providerName = provider.name ?? this.config.provider;\n\n    // 先检查缓存是否存在\n    const cachedResult = this.cache.get(text, from, to, providerName);\n    if (cachedResult) {\n      Logger.info(`[缓存] 翻译: \"${text}\" -> \"${cachedResult.translatedText}\"`);\n      return {\n        originalText: cachedResult.originalText,\n        translatedText: cachedResult.translatedText,\n        sourceLanguage: cachedResult.sourceLanguage,\n        targetLanguage: cachedResult.targetLanguage,\n        provider: cachedResult.provider,\n      };\n    }\n\n    Logger.verbose(`使用 ${providerName} 翻译: \"${text}\" (${from} -> ${to})`);\n\n    try {\n      const result = await provider.translate(text, from, to);\n      Logger.verbose(`翻译完成: \"${text}\" -> \"${result.translatedText}\"`);\n\n      // 翻译完成后存入缓存\n      this.cache.set(text, result.translatedText, from, to, providerName);\n\n      return result;\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      Logger.error(`翻译失败: ${errorMessage}`);\n      throw error;\n    }\n  }\n\n  /**\n   * 批量翻译文本数组\n   */\n  async translateBatch(\n    texts: string[],\n    from: string = this.config.defaultSourceLang ?? 'auto',\n    to: string = this.config.defaultTargetLang ?? 'en'\n  ): Promise<TranslationResult[]> {\n    if (!this.config.enabled) {\n      throw new Error('翻译服务未启用');\n    }\n\n    // 优化API调用参数\n    const concurrency = Math.min(this.config.concurrency ?? 5, 5); // 限制最大并发为5\n    const retryTimes = this.config.retryTimes ?? 3;\n    const retryDelay = Math.max(this.config.retryDelay ?? 1000, 1000); // 至少1秒的重试延迟\n    const batchDelay = Math.max(this.config.batchDelay ?? 500, 500); // 至少0.5秒的批次延迟\n\n    Logger.info(\n      `开始批量翻译，文本数量: ${texts.length}，并发数: ${concurrency}，重试次数: ${retryTimes}`,\n      'normal'\n    );\n    Logger.verbose(`翻译方向: ${from} -> ${to}`);\n\n    // 检查哪些文本已经在缓存中\n    const providerName = this.config.provider;\n    const textsToTranslate: string[] = [];\n    const cachedResults: Map<string, TranslationResult> = new Map();\n\n    for (let i = 0; i < texts.length; i++) {\n      const text = texts[i];\n      if (!text) continue;\n\n      const cachedResult = this.cache.get(text, from || 'auto', to || 'en', providerName);\n\n      if (cachedResult) {\n        // 使用缓存结果\n        Logger.verbose(`[缓存] 文本 ${i + 1}/${texts.length}: \"${text}\"`);\n        cachedResults.set(`translate_${i}`, {\n          originalText: cachedResult.originalText,\n          translatedText: cachedResult.translatedText,\n          sourceLanguage: cachedResult.sourceLanguage,\n          targetLanguage: cachedResult.targetLanguage,\n          provider: cachedResult.provider,\n        });\n      } else {\n        // 需要翻译\n        textsToTranslate.push(text);\n      }\n    }\n\n    // 创建翻译队列和进度显示\n    const queue = new TranslationQueue(concurrency);\n    queue.setBatchDelay(batchDelay);\n    \n    const progressDisplay = new ProgressDisplay();\n    \n    // 设置进度回调\n    queue.setProgressCallback((stats, currentTask) => {\n      progressDisplay.updateProgress(stats, currentTask);\n    });\n\n    // 添加需要翻译的文本到队列\n    for (let i = 0; i < texts.length; i++) {\n      if (!cachedResults.has(`translate_${i}`)) {\n        const text = texts[i];\n        if (!text) continue;\n\n        queue.addTask({\n          id: `translate_${i}`,\n          execute: () => this.translate(text, from || 'auto', to || 'en'),\n          maxRetries: retryTimes,\n          retryDelay: retryDelay,\n        });\n      }\n    }\n\n    Logger.info(`需要翻译: ${textsToTranslate.length} 个, 缓存加载: ${cachedResults.size} 个`, 'normal');\n\n    // 如果所有文本都在缓存中，则直接返回\n    if (textsToTranslate.length === 0) {\n      Logger.info(`所有文本都从缓存加载，跳过API调用`);\n      const results: TranslationResult[] = [];\n      for (let i = 0; i < texts.length; i++) {\n        const result = cachedResults.get(`translate_${i}`);\n        if (result) {\n          results.push(result);\n        }\n      }\n      return results;\n    }\n\n    // 开始进度显示并执行所有任务（在所有任务添加完成后）\n    // 临时设置日志级别为minimal，只显示关键信息\n    Logger.setTemporaryLevel('minimal');\n    progressDisplay.start();\n    const completedResults = await queue.executeAll();\n    \n    // 显示最终结果并停止进度显示\n    const queueStats = queue.getStats();\n    progressDisplay.showFinalResult(queueStats);\n    \n    // 恢复原始日志级别\n    Logger.setTemporaryLevel(null);\n\n    // 整理结果\n    const results: TranslationResult[] = [];\n    const failedTasks = queue.getFailedTasks();\n\n    for (let i = 0; i < texts.length; i++) {\n      const taskId = `translate_${i}`;\n\n      // 如果是缓存结果\n      if (cachedResults.has(taskId)) {\n        const result = cachedResults.get(taskId);\n        if (result) {\n          results.push(result);\n        }\n        continue;\n      }\n\n      // 如果是API请求结果\n      const result = completedResults.get(taskId) as TranslationResult | undefined;\n\n      if (result) {\n        results.push(result);\n      } else {\n        const error = failedTasks.get(taskId);\n        const errorMessage = error?.message ?? '未知错误';\n        const currentText = texts[i];\n        if (currentText) {\n          Logger.error(`文本 \"${currentText}\" 翻译失败: ${errorMessage}`);\n          // 为失败的翻译创建一个占位结果\n          results.push({\n            originalText: currentText,\n            translatedText: currentText, // 失败时返回原文\n            sourceLanguage: from || 'auto',\n            targetLanguage: to || 'en',\n            provider: this.config.provider,\n          });\n        }\n      }\n    }\n\n    const stats = queue.getStats();\n    Logger.info(\n      `批量翻译完成，成功: ${stats.completed}，失败: ${stats.failed}，总计: ${texts.length}，使用缓存: ${cachedResults.size}`,\n      'normal'\n    );\n\n    return results;\n  }\n\n  /**\n   * 翻译语言文件（JSON）\n   * 此方法整合了原来的translateJsonFile和translateLanguageFiles\n   * 支持增量翻译和实时写入结果\n   */\n  async translateLanguageFile(\n    sourcePath: string,\n    targetLocale: string,\n    from: string = this.config.defaultSourceLang ?? 'auto',\n    to: string = this.config.defaultTargetLang ?? 'en',\n    incrementalMode: boolean = true // 是否增量翻译模式\n  ): Promise<{\n    outputPath: string;\n    totalCount: number;\n    successCount: number;\n    skippedCount: number;\n  }> {\n    if (!fileExists(sourcePath)) {\n      throw new Error(`源语言文件不存在: ${sourcePath}`);\n    }\n\n    Logger.info(`📖 读取JSON文件: ${sourcePath}`);\n\n    // 解析源文件\n    const sourceContent = await readJson<Record<string, unknown>>(sourcePath);\n    const totalSourceItems = Object.keys(sourceContent).length;\n\n    // 生成正确的目标文件名，使用targetLocale，如\"en-US.json\"而不是\"zh-CN.en.json\"\n    const outputPath = path.join(path.dirname(sourcePath), `${targetLocale}.json`);\n\n    // 如果是增量翻译模式，先尝试读取已有的翻译文件\n    let existingTranslations: Record<string, unknown> = {};\n    let skippedCount = 0;\n    if (incrementalMode && fileExists(outputPath)) {\n      try {\n        existingTranslations = await readJson<Record<string, unknown>>(outputPath);\n        Logger.verbose(`增量翻译模式: 加载已有的翻译文件 ${outputPath}`);\n        Logger.verbose(`已加载 ${Object.keys(existingTranslations).length} 个已翻译的项`);\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        Logger.warn(`读取已有翻译文件失败: ${errorMessage}，将创建新文件`);\n        existingTranslations = {};\n      }\n    }\n\n    // 提取需要翻译的文本\n    const keysToTranslate: string[] = [];\n    const textsToTranslate: string[] = [];\n    const finalTranslations: Record<string, unknown> = { ...existingTranslations };\n\n    // 分析源文件，确定哪些需要翻译\n    for (const key in sourceContent) {\n      const value = sourceContent[key];\n      // 只翻译字符串类型的值\n      if (typeof value === 'string') {\n        if (incrementalMode && key in existingTranslations && existingTranslations[key]) {\n          // 如果已经翻译过，并且是增量模式，则跳过\n          skippedCount++;\n          continue;\n        }\n        keysToTranslate.push(key);\n        textsToTranslate.push(value);\n      } else {\n        // 非字符串值直接复制\n        finalTranslations[key] = value;\n      }\n    }\n\n    // 所有需要翻译的新条目数\n    const needTranslateCount = textsToTranslate.length;\n\n    // 提示增量翻译的情况\n    if (incrementalMode && skippedCount > 0) {\n      Logger.info(`增量翻译：跳过 ${skippedCount} 个已翻译条目，开始翻译 ${needTranslateCount} 个新条目`, 'normal');\n    } else if (needTranslateCount > 0) {\n      Logger.info(`🔄 开始翻译 ${needTranslateCount} 个文本条目...`);\n    }\n\n    if (needTranslateCount === 0) {\n      Logger.info(`没有需要翻译的新文本，保留所有已翻译内容`);\n      // 依然写入文件，以确保输出文件存在\n      await writeJson(outputPath, finalTranslations, true);\n      return {\n        outputPath,\n        totalCount: totalSourceItems,\n        successCount: 0, // 没有新翻译，成功数为0\n        skippedCount: skippedCount, // 返回跳过的数量\n      };\n    }\n\n    // 优化API调用参数\n    const concurrency = Math.min(this.config.concurrency ?? 5, 5);\n    const retryTimes = this.config.retryTimes ?? 3;\n    const retryDelay = Math.max(this.config.retryDelay ?? 1000, 1000);\n    const batchDelay = Math.max(this.config.batchDelay ?? 500, 500);\n\n    // 创建写入队列\n    const writeQueue = new WriteQueue(outputPath, finalTranslations);\n\n    // 创建翻译队列和进度显示\n    const queue = new TranslationQueue(concurrency);\n    queue.setBatchDelay(batchDelay);\n    \n    const progressDisplay = new ProgressDisplay();\n    \n    // 设置进度回调\n    queue.setProgressCallback((stats, currentTask) => {\n      progressDisplay.updateProgress(stats, currentTask);\n    });\n\n    // 设置写入回调\n    queue.setWriteCallback(async (taskId, result) => {\n      const index = parseInt(taskId.replace('translate_', ''));\n      const key = keysToTranslate[index];\n      const translationResult = result as TranslationResult;\n      \n      if (key && translationResult && translationResult.translatedText !== translationResult.originalText) {\n        writeQueue.addTask(key, translationResult.translatedText);\n      } else if (key) {\n        // 翻译失败或未变化，保留原文\n        writeQueue.addTask(key, sourceContent[key] as string);\n      }\n    });\n\n    // 添加需要翻译的文本到队列\n    for (let i = 0; i < keysToTranslate.length; i++) {\n      const key = keysToTranslate[i];\n      const text = textsToTranslate[i];\n      if (!text) continue;\n\n      queue.addTask({\n        id: `translate_${i}`,\n        execute: () => this.translate(text, from || 'auto', to || 'en'),\n        maxRetries: retryTimes,\n        retryDelay: retryDelay,\n      });\n    }\n\n    // 开始进度显示并执行所有任务\n    Logger.setTemporaryLevel('minimal');\n    progressDisplay.start();\n    const completedResults = await queue.executeAll();\n    \n    // 显示最终结果并停止进度显示\n    const queueStats = queue.getStats();\n    progressDisplay.showFinalResult(queueStats);\n    \n    // 恢复原始日志级别\n    Logger.setTemporaryLevel(null);\n\n    // 等待所有写入完成\n    await writeQueue.finish();\n\n    const successCount = queueStats.completed;\n\n    // 移除冗余日志输出，由CLI层负责统一输出\n    Logger.verbose(`翻译完成，结果保存到: ${outputPath}`);\n\n    return {\n      outputPath,\n      totalCount: totalSourceItems,\n      successCount,\n      skippedCount,\n    };\n  }\n\n  /**\n   * 检查服务是否可用\n   */\n  isAvailable(): boolean {\n    if (!this.config.enabled) {\n      return false;\n    }\n\n    const provider = this.providers.get(this.config.provider);\n    return provider ? provider.isConfigured() : false;\n  }\n\n  /**\n   * 获取当前提供者支持的语言\n   */\n  getSupportedLanguages(): string[] {\n    const provider = this.providers.get(this.config.provider);\n    return provider ? provider.getSupportedLanguages() : [];\n  }\n\n  /**\n   * 获取可用的翻译服务提供者列表\n   */\n  getAvailableProviders(): string[] {\n    return Array.from(this.providers.keys()).filter((name) => {\n      const provider = this.providers.get(name);\n      return provider?.isConfigured() ?? false;\n    });\n  }\n\n  /**\n   * 获取缓存状态\n   */\n  getCacheStatus(): { size: number } {\n    return {\n      size: this.cache.size(),\n    };\n  }\n\n  /**\n   * 清除缓存\n   */\n  clearCache(): void {\n    this.cache.clear();\n    Logger.info('翻译缓存已清空');\n  }\n}\n","import { ConfigManager } from '../config';\nimport { Logger } from './logger';\n\n/**\n * 配置一致性检查工具\n * 用于验证所有配置项是否正确使用，没有硬编码值\n */\nexport class ConfigValidator {\n  /**\n   * 检查配置的一致性和完整性\n   */\n  static validateConfigUsage(): {\n    isValid: boolean;\n    errors: string[];\n    warnings: string[];\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      const config = ConfigManager.get();\n\n      // 检查必需配置\n      if (!config.include || config.include.length === 0) {\n        errors.push('配置项 include 不能为空');\n      }\n\n      if (!config.outputDir) {\n        errors.push('配置项 outputDir 不能为空');\n      }\n\n      if (!config.locale) {\n        errors.push('配置项 locale 不能为空');\n      }\n\n      // 检查翻译配置一致性\n      if (config.translation?.enabled) {\n        if (!config.translation.provider) {\n          errors.push('启用翻译时必须指定 provider');\n        }\n\n        if (config.translation.provider === 'baidu') {\n          if (!config.translation.baidu?.appid || !config.translation.baidu?.key) {\n            warnings.push('百度翻译服务缺少 appid 或 key 配置');\n          }\n        }\n      }\n\n      // 检查key生成配置\n      if (config.keyGeneration) {\n        if (config.keyGeneration.maxChineseLength && config.keyGeneration.maxChineseLength <= 0) {\n          warnings.push('maxChineseLength 应该大于0');\n        }\n\n        if (config.keyGeneration.hashLength && config.keyGeneration.hashLength <= 0) {\n          warnings.push('hashLength 应该大于0');\n        }\n      }\n\n      // 检查日志配置\n      if (\n        config.logging?.level &&\n        !['minimal', 'normal', 'verbose'].includes(config.logging.level)\n      ) {\n        errors.push('logging.level 必须是 minimal、normal 或 verbose 之一');\n      }\n\n      // 检查输出配置\n      if (config.output?.localeFileName && !config.output.localeFileName.includes('{locale}')) {\n        warnings.push('localeFileName 建议包含 {locale} 占位符');\n      }\n    } catch (error) {\n      errors.push(`配置检查时发生错误: ${error}`);\n    }\n\n    const isValid = errors.length === 0;\n\n    if (!isValid) {\n      Logger.error('配置验证失败:', 'minimal');\n      errors.forEach((error) => Logger.error(`  - ${error}`, 'minimal'));\n    }\n\n    if (warnings.length > 0) {\n      Logger.warn('配置警告:', 'normal');\n      warnings.forEach((warning) => Logger.warn(`  - ${warning}`, 'normal'));\n    }\n\n    if (isValid && warnings.length === 0) {\n      Logger.verbose('配置验证通过，无警告');\n    }\n\n    return { isValid, errors, warnings };\n  }\n\n  /**\n   * 检查是否存在配置与代码不一致的问题\n   */\n  static checkConfigConsistency(): void {\n    const config = ConfigManager.get();\n\n    Logger.verbose('检查配置一致性...');\n\n    // 检查文件名生成是否使用了配置\n    const expectedFileName = (config.output?.localeFileName ?? '{locale}.json').replace(\n      '{locale}',\n      config.locale\n    );\n    Logger.verbose(`预期的语言文件名: ${expectedFileName}`);\n\n    // 检查替换函数名是否一致\n    const functionName = config.replacement?.functionName ?? '$t';\n    Logger.verbose(`预期的替换函数名: ${functionName}`);\n\n    // 检查目录配置\n    Logger.verbose(`输出目录: ${config.outputDir}`);\n    if (config.tempDir) {\n      Logger.verbose(`临时目录: ${config.tempDir}`);\n    }\n\n    Logger.verbose('配置一致性检查完成');\n  }\n}\n","import path from 'path';\nimport fs from 'fs/promises';\nimport { ConfigManager } from '../../config';\nimport { Logger } from '../../utils/logger';\n\n// 检查结果接口\nexport interface TranslationCheckResult {\n  sourceLanguage: string;\n  targetLanguage: string;\n  totalKeys: number;\n  translatedKeys: number;\n  untranslatedKeys: number;\n  missingKeys: string[];\n  untranslatedEntries: Array<{\n    key: string;\n    sourceText: string;\n    isUntranslated: boolean;\n  }>;\n  completionRate: number;\n}\n\n// 语言文件检查摘要\nexport interface TranslationCheckSummary {\n  sourceFile: string;\n  targetFiles: Array<{\n    language: string;\n    filePath: string;\n    exists: boolean;\n    result?: TranslationCheckResult;\n  }>;\n  totalLanguages: number;\n  existingLanguages: number;\n  overallCompletionRate: number;\n}\n\n/**\n * 检查字符串是否包含中文字符\n */\nfunction containsChinese(str: string): boolean {\n  return /[\\u4e00-\\u9fa5]/.test(str);\n}\n\n/**\n * 检查字符串是否可能是翻译后的文本\n * 如果文本与原文相同或只包含中文，则认为可能未翻译\n */\nfunction isPossiblyUntranslated(\n  originalText: string,\n  translatedText: string,\n  targetLang: string\n): boolean {\n  // 如果翻译后的文本与原文完全相同，认为未翻译\n  if (originalText === translatedText) {\n    return true;\n  }\n\n  // 对于英语等西文语言，如果翻译后的文本仍然包含大量中文字符，认为可能未翻译\n  if (targetLang.startsWith('en') && containsChinese(translatedText)) {\n    // 计算中文字符比例\n    const chineseChars = translatedText.match(/[\\u4e00-\\u9fa5]/g);\n    if (chineseChars && chineseChars.length / translatedText.length > 0.3) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * 读取语言文件\n */\nasync function readLanguageFile(filePath: string): Promise<Record<string, string> | null> {\n  try {\n    const content = await fs.readFile(filePath, 'utf-8');\n    return JSON.parse(content) as Record<string, string>;\n  } catch (error) {\n    Logger.verbose(`无法读取语言文件: ${filePath} - ${error}`);\n    return null;\n  }\n}\n\n/**\n * 检查单个目标语言文件的翻译完整性\n */\nasync function checkTargetLanguage(\n  sourceData: Record<string, string>,\n  targetFilePath: string,\n  targetLanguage: string\n): Promise<TranslationCheckResult> {\n  const targetData = await readLanguageFile(targetFilePath);\n\n  if (!targetData) {\n    // 目标文件不存在或无法读取\n    return {\n      sourceLanguage: 'zh-CN',\n      targetLanguage,\n      totalKeys: Object.keys(sourceData).length,\n      translatedKeys: 0,\n      untranslatedKeys: Object.keys(sourceData).length,\n      missingKeys: Object.keys(sourceData),\n      untranslatedEntries: Object.entries(sourceData).map(([key, value]) => ({\n        key,\n        sourceText: value,\n        isUntranslated: true,\n      })),\n      completionRate: 0,\n    };\n  }\n\n  const sourceKeys = Object.keys(sourceData);\n  const missingKeys: string[] = [];\n  const untranslatedEntries: Array<{\n    key: string;\n    sourceText: string;\n    isUntranslated: boolean;\n  }> = [];\n\n  let translatedCount = 0;\n\n  for (const key of sourceKeys) {\n    const sourceText = sourceData[key];\n    const targetText = targetData[key];\n\n    // 确保源文本存在\n    if (!sourceText) {\n      continue;\n    }\n\n    if (!targetText) {\n      // 目标文件中缺少该键\n      missingKeys.push(key);\n      untranslatedEntries.push({\n        key,\n        sourceText,\n        isUntranslated: true,\n      });\n    } else if (isPossiblyUntranslated(sourceText, targetText, targetLanguage)) {\n      // 可能未翻译（翻译文本与原文相同或包含大量中文）\n      untranslatedEntries.push({\n        key,\n        sourceText,\n        isUntranslated: true,\n      });\n    } else {\n      // 已翻译\n      translatedCount++;\n    }\n  }\n\n  const totalKeys = sourceKeys.length;\n  const untranslatedKeys = totalKeys - translatedCount;\n  const completionRate = totalKeys > 0 ? (translatedCount / totalKeys) * 100 : 100;\n\n  return {\n    sourceLanguage: 'zh-CN',\n    targetLanguage,\n    totalKeys,\n    translatedKeys: translatedCount,\n    untranslatedKeys,\n    missingKeys,\n    untranslatedEntries,\n    completionRate,\n  };\n}\n\n/**\n * 检查所有语言文件的翻译完整性\n */\nexport async function checkTranslationCompleteness(\n  targetLanguages: string[] = ['en-US', 'ja-JP', 'ko-KR']\n): Promise<TranslationCheckSummary> {\n  const config = ConfigManager.get();\n  const outputDir = config.outputDir || 'locales';\n  const sourceLanguage = config.locale || 'zh-CN';\n  const localeFileName = config.output?.localeFileName || '{locale}.json';\n\n  // 构建源文件路径\n  const sourceFileName = localeFileName.replace('{locale}', sourceLanguage);\n  const sourceFilePath = path.resolve(outputDir, sourceFileName);\n\n  Logger.info(`开始检查翻译完整性...`, 'normal');\n  Logger.verbose(`源语言文件: ${sourceFilePath}`);\n  Logger.verbose(`目标语言: ${targetLanguages.join(', ')}`);\n\n  // 读取源语言文件\n  const sourceData = await readLanguageFile(sourceFilePath);\n  if (!sourceData) {\n    throw new Error(`无法读取源语言文件: ${sourceFilePath}`);\n  }\n\n  Logger.verbose(`源文件包含 ${Object.keys(sourceData).length} 个键值对`);\n\n  const targetFiles: Array<{\n    language: string;\n    filePath: string;\n    exists: boolean;\n    result?: TranslationCheckResult;\n  }> = [];\n\n  let totalCompletionRate = 0;\n  let existingLanguageCount = 0;\n\n  // 检查每个目标语言\n  for (const targetLanguage of targetLanguages) {\n    const targetFileName = localeFileName.replace('{locale}', targetLanguage);\n    const targetFilePath = path.resolve(outputDir, targetFileName);\n\n    Logger.verbose(`检查目标语言文件: ${targetFilePath}`);\n\n    // 检查文件是否存在\n    let exists = false;\n    try {\n      await fs.access(targetFilePath);\n      exists = true;\n    } catch {\n      exists = false;\n    }\n\n    const targetFileInfo: {\n      language: string;\n      filePath: string;\n      exists: boolean;\n      result?: TranslationCheckResult;\n    } = {\n      language: targetLanguage,\n      filePath: targetFilePath,\n      exists,\n    };\n\n    if (exists) {\n      // 检查翻译完整性\n      const checkResult = await checkTargetLanguage(sourceData, targetFilePath, targetLanguage);\n      targetFileInfo.result = checkResult;\n      totalCompletionRate += checkResult.completionRate;\n      existingLanguageCount++;\n\n      Logger.verbose(\n        `语言 ${targetLanguage} 完成度: ${checkResult.completionRate.toFixed(1)}% (${\n          checkResult.translatedKeys\n        }/${checkResult.totalKeys})`\n      );\n    } else {\n      Logger.verbose(`语言文件不存在: ${targetLanguage}`);\n    }\n\n    targetFiles.push(targetFileInfo);\n  }\n\n  const overallCompletionRate =\n    existingLanguageCount > 0 ? totalCompletionRate / existingLanguageCount : 0;\n\n  const summary: TranslationCheckSummary = {\n    sourceFile: sourceFilePath,\n    targetFiles,\n    totalLanguages: targetLanguages.length,\n    existingLanguages: existingLanguageCount,\n    overallCompletionRate,\n  };\n\n  Logger.success(`翻译完整性检查完成！`, 'minimal');\n  Logger.info(`总语言数: ${targetLanguages.length}`, 'normal');\n  Logger.info(`存在的语言文件数: ${existingLanguageCount}`, 'normal');\n  Logger.info(`平均完成度: ${overallCompletionRate.toFixed(1)}%`, 'normal');\n\n  return summary;\n}\n","import path from 'path';\nimport { TranslationCheckResult, TranslationCheckSummary } from './translation-checker';\n\n/**\n * 报告生成配置选项\n */\nexport interface ReportOptions {\n  /** 是否为简略模式 */\n  summaryMode?: boolean;\n  /** 时间戳格式化选项 */\n  timestampLocale?: string;\n  /** 项目仓库URL */\n  repositoryUrl?: string;\n}\n\n/**\n * 报告内容构建器\n */\nexport class TranslationReportBuilder {\n  private report = '';\n  private readonly options: Required<ReportOptions>;\n\n  constructor(options: ReportOptions = {}) {\n    this.options = {\n      summaryMode: options.summaryMode ?? false,\n      timestampLocale: options.timestampLocale ?? 'zh-CN',\n      repositoryUrl: options.repositoryUrl ?? 'https://github.com/your-org/i18n-xy',\n    };\n  }\n\n  /**\n   * 生成报告头部\n   */\n  private generateHeader(): this {\n    const timestamp = new Date().toLocaleString(this.options.timestampLocale);\n    const modeText = this.options.summaryMode ? '（简略模式）' : '';\n\n    this.report += `# 翻译完整性检查报告${modeText}\n\n**生成时间**: ${timestamp}\n\n`;\n    return this;\n  }\n\n  /**\n   * 生成概览统计表格\n   */\n  private generateOverviewTable(summary: TranslationCheckSummary): this {\n    this.report += `## 📊 概览统计\n\n| 项目 | 数值 |\n|------|------|\n| 源文件 | \\`${path.basename(summary.sourceFile)}\\` |\n| 总语言数 | ${summary.totalLanguages} |\n| 存在的语言文件数 | ${summary.existingLanguages} |\n| 平均完成度 | ${summary.overallCompletionRate.toFixed(1)}% |\n\n`;\n    return this;\n  }\n\n  /**\n   * 生成语言文件状态表格\n   */\n  private generateLanguageStatusTable(summary: TranslationCheckSummary): this {\n    this.report += `## 🌐 语言文件状态\n\n| 语言 | 状态 | 完成度 | 已翻译 | 未翻译 | 缺失 |\n|------|------|--------|--------|--------|------|\n`;\n\n    for (const targetFile of summary.targetFiles) {\n      const exists = targetFile.exists ? '✅ 存在' : '❌ 不存在';\n      const completionRate = targetFile.result\n        ? `${targetFile.result.completionRate.toFixed(1)}%`\n        : 'N/A';\n      const translated = targetFile.result ? targetFile.result.translatedKeys.toString() : 'N/A';\n      const untranslated = targetFile.result\n        ? targetFile.result.untranslatedKeys.toString()\n        : 'N/A';\n      const missing = targetFile.result ? targetFile.result.missingKeys.length.toString() : 'N/A';\n\n      this.report += `| ${targetFile.language} | ${exists} | ${completionRate} | ${translated} | ${untranslated} | ${missing} |\\n`;\n    }\n\n    this.report += '\\n';\n    return this;\n  }\n\n  /**\n   * 生成单个语言的详细检查结果\n   */\n  private generateLanguageDetails(targetFile: TranslationCheckSummary['targetFiles'][0]): this {\n    if (!targetFile.exists) {\n      this.report += `### ❌ ${targetFile.language} - 文件不存在\n\n**文件路径**: \\`${targetFile.filePath}\\`\n\n**状态**: 语言文件不存在，需要创建并翻译所有键值对\n\n---\n\n`;\n      return this;\n    }\n\n    const result = targetFile.result!;\n    const statusIcon =\n      result.completionRate >= 95 ? '✅' : result.completionRate >= 50 ? '⚠️' : '❌';\n\n    this.report += `### ${statusIcon} ${targetFile.language} - 完成度 ${result.completionRate.toFixed(1)}%\n\n**文件路径**: \\`${targetFile.filePath}\\`\n\n**统计信息**:\n- 总键数: ${result.totalKeys}\n- 已翻译: ${result.translatedKeys}\n- 未翻译: ${result.untranslatedKeys}\n- 缺失键: ${result.missingKeys.length}\n\n`;\n\n    this.generateMissingKeysSection(result);\n    this.generateUntranslatedEntriesSection(result);\n\n    this.report += `---\n\n`;\n    return this;\n  }\n\n  /**\n   * 生成缺失键部分\n   */\n  private generateMissingKeysSection(result: TranslationCheckResult): void {\n    if (result.missingKeys.length === 0) return;\n\n    const displayLimit = this.options.summaryMode ? 20 : result.missingKeys.length;\n    const keysToShow = result.missingKeys.slice(0, displayLimit);\n\n    this.report += `**缺失的键** (${result.missingKeys.length}个${\n      this.options.summaryMode && result.missingKeys.length > 20 ? '，仅显示前20个' : ''\n    }):\n\\`\\`\\`\n${keysToShow.join('\\n')}\n\\`\\`\\``;\n\n    if (this.options.summaryMode && result.missingKeys.length > 20) {\n      this.report += `\\n*... 还有 ${result.missingKeys.length - 20} 个缺失的键*`;\n    }\n\n    this.report += `\\n\\n`;\n  }\n\n  /**\n   * 生成未翻译条目部分\n   */\n  private generateUntranslatedEntriesSection(result: TranslationCheckResult): void {\n    if (result.untranslatedEntries.length === 0) return;\n\n    const displayLimit = this.options.summaryMode ? 20 : 50;\n    const entriesToShow = result.untranslatedEntries.slice(0, displayLimit);\n\n    if (result.untranslatedEntries.length <= displayLimit || this.options.summaryMode) {\n      this.report += `**未翻译的条目** (${result.untranslatedEntries.length}个${\n        this.options.summaryMode && result.untranslatedEntries.length > 20 ? '，仅显示前20个' : ''\n      }):\n\n| 键名 | 原文 |\n|------|------|\n`;\n      for (const entry of entriesToShow) {\n        const safeKey = entry.key.replace(/\\|/g, '\\\\|');\n        const safeText = entry.sourceText.replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ');\n        this.report += `| \\`${safeKey}\\` | ${safeText} |\\n`;\n      }\n\n      if (this.options.summaryMode && result.untranslatedEntries.length > 20) {\n        this.report += `\\n*... 还有 ${result.untranslatedEntries.length - 20} 个未翻译的条目*\\n`;\n      } else if (!this.options.summaryMode && result.untranslatedEntries.length > 50) {\n        this.report += `\\n*... 还有 ${result.untranslatedEntries.length - 50} 个未翻译的条目*\\n`;\n      }\n    } else {\n      this.report += `**未翻译的条目**: 共 ${result.untranslatedEntries.length} 个（过多，仅显示统计数据）\n\n`;\n    }\n  }\n\n  /**\n   * 生成详细检查结果部分\n   */\n  private generateDetailedResults(summary: TranslationCheckSummary): this {\n    this.report += `## 📋 详细检查结果\n\n`;\n\n    for (const targetFile of summary.targetFiles) {\n      this.generateLanguageDetails(targetFile);\n    }\n\n    return this;\n  }\n\n  /**\n   * 生成推荐操作部分\n   */\n  private generateRecommendations(summary: TranslationCheckSummary): this {\n    this.report += `## 💡 推荐操作\n\n`;\n\n    this.generateMissingLanguagesRecommendation(summary);\n    this.generateIncompleteLanguagesRecommendation(summary);\n\n    this.report += `---\n\n`;\n    return this;\n  }\n\n  /**\n   * 生成缺失语言文件的推荐操作\n   */\n  private generateMissingLanguagesRecommendation(summary: TranslationCheckSummary): void {\n    const missingLanguages = summary.targetFiles.filter((f) => !f.exists);\n    if (missingLanguages.length === 0) return;\n\n    this.report += `### 创建缺失的语言文件\n\n以下语言文件不存在，建议创建：\n\n`;\n    for (const lang of missingLanguages) {\n      this.report += `- \\`${lang.language}\\`: \\`${lang.filePath}\\`\n`;\n    }\n    this.report += `\n可以使用 \\`translate\\` 命令自动生成这些文件：\n\\`\\`\\`bash\n# 翻译到英语\ni18n-xy translate -t en-US\n\n# 翻译到多种语言\ni18n-xy translate -t en-US,ja-JP,ko-KR\n\\`\\`\\`\n\n`;\n  }\n\n  /**\n   * 生成未完成翻译的推荐操作\n   */\n  private generateIncompleteLanguagesRecommendation(summary: TranslationCheckSummary): void {\n    const incompleteLanguages = summary.targetFiles.filter(\n      (f) => f.exists && f.result && f.result.completionRate < 95\n    );\n    if (incompleteLanguages.length === 0) return;\n\n    this.report += `### 完善未完成的翻译\n\n以下语言的翻译完成度不足95%：\n\n`;\n    for (const lang of incompleteLanguages) {\n      const rate = lang.result!.completionRate.toFixed(1);\n      this.report += `- **${lang.language}**: ${rate}% 完成度，还需翻译 ${lang.result!.untranslatedKeys} 个条目\n`;\n    }\n\n    this.report += `\n可以使用 \\`translate\\` 命令补充翻译：\n\\`\\`\\`bash\n# 只翻译缺失的条目\ni18n-xy translate -t en-US --incremental\n\\`\\`\\`\n\n`;\n  }\n\n  /**\n   * 生成报告尾部\n   */\n  private generateFooter(): this {\n    // 添加简略模式说明\n    if (this.options.summaryMode) {\n      this.report += `**注意**: 此报告以简略模式生成，每个语言最多显示20个缺失的键和未翻译的条目。  \n如需查看完整详情，请去除 \\`-s\\` 或 \\`--summary\\` 参数。\n\n`;\n    }\n\n    this.report += `*报告由 [i18n-xy](${this.options.repositoryUrl}) 自动生成*\n`;\n    return this;\n  }\n\n  /**\n   * 构建完整的翻译检查报告\n   */\n  public build(summary: TranslationCheckSummary): string {\n    this.report = '';\n\n    this.generateHeader()\n      .generateOverviewTable(summary)\n      .generateLanguageStatusTable(summary)\n      .generateDetailedResults(summary)\n      .generateRecommendations(summary)\n      .generateFooter();\n\n    return this.report;\n  }\n}\n\n/**\n * 生成翻译完整性检查的Markdown报告\n *\n * @param summary 翻译检查摘要数据\n * @param options 报告生成选项\n * @returns 格式化的Markdown报告内容\n */\nexport function generateTranslationReport(\n  summary: TranslationCheckSummary,\n  options: ReportOptions = {}\n): string {\n  const builder = new TranslationReportBuilder(options);\n  return builder.build(summary);\n}\n\n/**\n * 生成翻译完整性检查的Markdown报告（向后兼容的简化接口）\n *\n * @param summary 翻译检查摘要数据\n * @param summaryMode 是否为简略模式\n * @returns 格式化的Markdown报告内容\n */\nexport function generateMarkdownReport(\n  summary: TranslationCheckSummary,\n  summaryMode: boolean = false\n): string {\n  return generateTranslationReport(summary, { summaryMode });\n}\n","import { ConfigManager, loadConfig } from '../../config';\nimport { TranslationManager } from './manager';\nimport { readFile, fileExists, findTargetFiles } from '../../utils/fs';\nimport { Logger } from '../../utils/logger';\nimport { ConfigValidator } from '../../utils/config-validator';\nimport { checkTranslationCompleteness } from './translation-checker';\nimport { generateTranslationReport } from './reports';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\ninterface TranslateOptions {\n  config: string;\n  from?: string;\n  to?: string;\n  input?: string;\n  json?: string;\n  batch?: boolean;\n  test?: boolean;\n  incremental?: boolean; // 增量翻译选项，默认启用\n}\n\ninterface CheckOptions {\n  config: string;\n  languages?: string;\n  output?: string;\n  summary?: boolean;\n}\n\nexport async function translateCommand(options: TranslateOptions): Promise<void> {\n  // 加载配置\n  const config = loadConfig(options.config);\n  ConfigManager.init(config);\n\n  if (!config.translation?.enabled) {\n    Logger.info('翻译功能未启用，请在配置文件中设置 translation.enabled = true', 'normal');\n    return;\n  }\n\n  // 初始化翻译管理器\n  const translationManager = new TranslationManager({\n    enabled: config.translation.enabled,\n    provider: config.translation.provider ?? 'baidu',\n    defaultSourceLang: config.translation.defaultSourceLang ?? 'zh',\n    defaultTargetLang: config.translation.defaultTargetLang ?? 'en',\n    concurrency: config.translation.concurrency ?? 5,\n    retryTimes: config.translation.retryTimes ?? 3,\n    retryDelay: config.translation.retryDelay ?? 1000,\n    batchDelay: config.translation.batchDelay ?? 500,\n    baidu:\n      config.translation.baidu?.appid && config.translation.baidu?.key\n        ? {\n            appid: config.translation.baidu.appid,\n            key: config.translation.baidu.key,\n          }\n        : undefined,\n    custom:\n      config.translation.custom?.endpoint && config.translation.custom?.apiKey\n        ? {\n            endpoint: config.translation.custom.endpoint,\n            apiKey: config.translation.custom.apiKey,\n          }\n        : undefined,\n  });\n\n  if (!translationManager.isAvailable()) {\n    Logger.error('翻译服务不可用，请检查配置', 'minimal');\n    Logger.info('百度翻译需要配置 appid 和 key', 'normal');\n    return;\n  }\n\n  // 确定翻译方向\n  const defaultSourceLang = config.translation.defaultSourceLang ?? 'zh';\n  const defaultTargetLang = config.translation.defaultTargetLang ?? config.displayLanguage ?? 'en';\n  const from = options.from ?? defaultSourceLang;\n  const to = options.to ?? defaultTargetLang;\n\n  // 增量翻译模式，默认启用\n  const incrementalMode = options.incremental !== false;\n\n  try {\n    // 根据不同的选项执行相应的翻译操作\n    if (options.test && options.input) {\n      await handleTranslateTest(translationManager, options.input, from, to);\n    } else if (options.json) {\n      await handleTranslateJsonFile(translationManager, options.json, from, to, incrementalMode);\n    } else if (options.batch) {\n      await handleTranslateBatchFiles(translationManager, from, to, incrementalMode);\n    } else if (options.input) {\n      await handleTranslateInput(translationManager, options.input, from, to);\n    } else {\n      // 没有传递任何参数时，使用默认行为：读取配置的outputDir下的默认语言文件\n      const outputDir = config.outputDir ?? 'locales';\n      const sourceLocale = config.locale ?? 'zh-CN';\n      const targetLocale = config.displayLanguage ?? 'en-US';\n\n      Logger.info(\n        `未指定翻译内容，将从 ${outputDir} 目录读取 ${sourceLocale}.json 文件并翻译成 ${targetLocale}`,\n        'normal'\n      );\n\n      const sourceLang = sourceLocale.split('-')[0] || 'zh'; // 提取语言代码，如zh-CN -> zh\n      const targetLang = targetLocale.split('-')[0] || 'en'; // 提取语言代码，如en-US -> en\n\n      try {\n        const sourcePath = path.join(outputDir, `${sourceLocale}.json`);\n        if (!fileExists(sourcePath)) {\n          throw new Error(`源语言文件不存在: ${sourcePath}，请先运行生成命令创建源语言文件`);\n        }\n\n        Logger.info(`📖 从源语言文件读取: ${sourcePath}`);\n\n        const { outputPath, totalCount, successCount, skippedCount } =\n          await translationManager.translateLanguageFile(\n            sourcePath,\n            targetLocale,\n            sourceLang,\n            targetLang,\n            incrementalMode\n          );\n\n        Logger.success(`✅ 翻译完成，结果保存到: ${outputPath}`, 'normal');\n        if (skippedCount > 0) {\n          if (successCount > 0) {\n            Logger.info(\n              `📊 成功翻译: ${successCount}项新内容，跳过已翻译项: ${skippedCount}项，共${totalCount}项`,\n              'normal'\n            );\n          } else {\n            Logger.info(\n              `📊 无新内容需要翻译，已有翻译项: ${skippedCount}项，共${totalCount}项`,\n              'normal'\n            );\n          }\n        } else {\n          Logger.info(`📊 成功翻译: ${successCount}/${totalCount}项`, 'normal');\n        }\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        Logger.error(`翻译失败: ${errorMessage}`, 'minimal');\n        showUsageHelp();\n      }\n    }\n  } catch (error) {\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    Logger.error(`翻译失败: ${errorMessage}`, 'minimal');\n    process.exit(1);\n  }\n}\n\n/**\n * 测试翻译单个文本\n */\nasync function handleTranslateTest(\n  manager: TranslationManager,\n  text: string,\n  from: string,\n  to: string\n): Promise<void> {\n  Logger.info(`测试翻译模式 (${from} -> ${to})`, 'normal');\n  Logger.info(`原文: ${text}`, 'normal');\n\n  const result = await manager.translate(text, from, to);\n  Logger.success(`译文: ${result.translatedText}`, 'normal');\n  Logger.info(`提供者: ${result.provider}`, 'normal');\n}\n\n/**\n * 翻译指定的JSON文件\n */\nasync function handleTranslateJsonFile(\n  manager: TranslationManager,\n  jsonPath: string,\n  from: string,\n  to: string,\n  incremental: boolean = true\n): Promise<void> {\n  // 推导目标语言的Locale\n  const targetLocale = ConfigManager.get().displayLanguage || 'en-US';\n\n  const { outputPath, totalCount, successCount, skippedCount } =\n    await manager.translateLanguageFile(jsonPath, targetLocale, from, to, incremental);\n\n  Logger.success(`✅ 翻译完成，结果保存到: ${outputPath}`, 'normal');\n  if (skippedCount > 0) {\n    if (successCount > 0) {\n      Logger.info(\n        `📊 成功翻译: ${successCount}项新内容，跳过已翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    } else {\n      Logger.info(\n        `📊 无新内容需要翻译，已有翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    }\n  } else {\n    Logger.info(`📊 成功翻译: ${successCount}/${totalCount}项`, 'normal');\n  }\n}\n\n/**\n * 批量翻译语言文件\n */\nasync function handleTranslateBatchFiles(\n  manager: TranslationManager,\n  from: string,\n  to: string,\n  incremental: boolean = true\n): Promise<void> {\n  const config = ConfigManager.get();\n  const outputDir = config.outputDir ?? './locales';\n  const sourceLocale = config.locale ?? from;\n  const targetLocale = config.displayLanguage ?? 'en-US';\n\n  const sourcePath = path.join(outputDir, `${sourceLocale}.json`);\n  if (!fileExists(sourcePath)) {\n    throw new Error(`源语言文件不存在: ${sourcePath}，请先运行生成命令创建源语言文件`);\n  }\n\n  Logger.info(`📖 从源语言文件读取: ${sourcePath}`);\n\n  const { outputPath, totalCount, successCount, skippedCount } =\n    await manager.translateLanguageFile(sourcePath, targetLocale, from, to, incremental);\n\n  Logger.success(`✅ 批量翻译完成，结果保存到: ${outputPath}`, 'normal');\n  if (skippedCount > 0) {\n    if (successCount > 0) {\n      Logger.info(\n        `📊 成功翻译: ${successCount}项新内容，跳过已翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    } else {\n      Logger.info(\n        `📊 无新内容需要翻译，已有翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    }\n  } else {\n    Logger.info(`📊 成功翻译: ${successCount}/${totalCount}项`, 'normal');\n  }\n}\n\n/**\n * 翻译输入的文本或文件\n */\nasync function handleTranslateInput(\n  manager: TranslationManager,\n  input: string,\n  from: string,\n  to: string\n): Promise<void> {\n  let text = input;\n\n  // 检查是否是文件路径\n  if (fileExists(input)) {\n    try {\n      text = await readFile(input, 'utf-8');\n      Logger.info(`从文件读取内容: ${input}`);\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      throw new Error(`读取文件失败: ${errorMessage}`);\n    }\n  }\n\n  Logger.info(`正在翻译 (${from} -> ${to})...`, 'normal');\n  const result = await manager.translate(text, from, to);\n\n  Logger.info('翻译结果:', 'normal');\n  Logger.info(`原文 (${result.sourceLanguage}): ${result.originalText}`, 'normal');\n  Logger.success(`译文 (${result.targetLanguage}): ${result.translatedText}`, 'normal');\n  Logger.info(`提供者: ${result.provider}`, 'verbose');\n}\n\n/**\n * 显示使用帮助\n */\nfunction showUsageHelp(): void {\n  Logger.error('请指定翻译内容：', 'minimal');\n  Logger.info('   使用 -i 指定文本或文件路径', 'normal');\n  Logger.info('   使用 -j 指定JSON文件路径', 'normal');\n  Logger.info('   使用 --batch 批量翻译语言文件', 'normal');\n  Logger.info('   使用 --test -i \"文本\" 测试翻译', 'normal');\n  Logger.info('   使用 --incremental=false 禁用增量翻译模式', 'normal');\n}\n\nexport async function checkTranslationCommand(options: CheckOptions): Promise<void> {\n  try {\n    Logger.info(`加载配置文件: ${options.config}`, 'verbose');\n    const configObj = loadConfig(options.config);\n    ConfigManager.init(configObj);\n\n    // 验证配置\n    const validation = ConfigValidator.validateConfigUsage();\n    if (!validation.isValid) {\n      Logger.error('配置验证失败，无法继续执行', 'minimal');\n      process.exit(1);\n    }\n\n    ConfigValidator.checkConfigConsistency();\n    Logger.info('配置加载完成，开始执行翻译完整性检查流程...', 'verbose');\n\n    let targetLanguages: string[];\n\n    if (options.languages) {\n      // 如果指定了语言参数，使用指定的语言\n      targetLanguages = options.languages.split(',').map((lang: string) => lang.trim());\n      Logger.verbose(`使用指定的目标语言: ${targetLanguages.join(', ')}`);\n    } else {\n      // 如果未指定语言参数，从outputDir自动发现JSON文件\n      const config = ConfigManager.get();\n      const outputDir = config.outputDir ?? './locales';\n      const sourceLocale = config.locale ?? 'zh-CN';\n\n      Logger.info(`未指定目标语言，自动从 ${outputDir} 目录发现语言文件...`, 'normal');\n\n      try {\n        // 使用findTargetFiles发现outputDir中的所有JSON文件\n        const jsonFiles = await findTargetFiles([`${outputDir}/*.json`]);\n        \n        // 提取语言代码（排除源语言）\n        targetLanguages = jsonFiles\n          .map(file => path.basename(file, '.json'))\n          .filter(locale => locale !== sourceLocale);\n\n        if (targetLanguages.length === 0) {\n          Logger.info(`在 ${outputDir} 目录中未发现除源语言 ${sourceLocale} 之外的其他语言文件`, 'normal');\n          Logger.info('请先生成翻译文件或使用 -l 参数指定目标语言', 'normal');\n          return;\n        }\n\n        Logger.info(`自动发现的目标语言: ${targetLanguages.join(', ')}`, 'normal');\n      } catch (error) {\n        Logger.error(`读取 ${outputDir} 目录失败: ${error}`, 'minimal');\n        Logger.info('请使用 -l 参数手动指定目标语言', 'normal');\n        return;\n      }\n    }\n\n    // 执行翻译完整性检查\n    const summary = await checkTranslationCompleteness(targetLanguages);\n\n    // 生成详细报告\n    const report = generateTranslationReport(summary, { summaryMode: options.summary || false });\n\n    // 输出结果\n    if (options.output !== undefined) {\n      // 如果output为true或空字符串，使用默认文件名\n      const outputPath = options.output || 'translation-report.md';\n      \n      // 输出到指定的Markdown文件\n      await fs.writeFile(outputPath, report, 'utf-8');\n      Logger.success(`✅ 翻译完整性检查完成！`, 'minimal');\n      Logger.info(`📄 详细报告已保存到: ${outputPath}`, 'normal');\n    } else {\n      // 控制台输出摘要\n      Logger.success(`✅ 翻译完整性检查完成！`, 'minimal');\n      Logger.info(``, 'normal');\n      Logger.info(`=== 翻译完整性检查摘要 ===`, 'normal');\n      Logger.info(`源文件: ${path.basename(summary.sourceFile)}`, 'normal');\n      Logger.info(`总语言数: ${summary.totalLanguages}`, 'normal');\n      Logger.info(`存在的语言文件数: ${summary.existingLanguages}`, 'normal');\n      Logger.info(`平均完成度: ${summary.overallCompletionRate.toFixed(1)}%`, 'normal');\n      Logger.info(``, 'normal');\n\n      // 显示各语言状态\n      for (const targetFile of summary.targetFiles) {\n        if (!targetFile.exists) {\n          Logger.info(`❌ ${targetFile.language}: 缺失 (完成度: N/A)`, 'normal');\n        } else {\n          const result = targetFile.result!;\n          const statusIcon =\n            result.completionRate >= 95 ? '✅' : result.completionRate >= 50 ? '⚠️' : '❌';\n          Logger.info(\n            `${statusIcon} ${targetFile.language}: 存在 (完成度: ${result.completionRate.toFixed(1)}%)`,\n            'normal'\n          );\n\n          if (result.untranslatedKeys > 0) {\n            Logger.info(`   - 未翻译条目: ${result.untranslatedKeys}个`, 'normal');\n          }\n        }\n      }\n\n      Logger.info(``, 'normal');\n      Logger.info(`💡 提示: 使用 -o 参数生成详细的Markdown报告`, 'normal');\n      Logger.info(`   示例: i18n-xy check-translation -o translation-report.md`, 'normal');\n    }\n  } catch (error) {\n    Logger.error(`翻译完整性检查过程中发生错误: ${error}`, 'minimal');\n    process.exit(1);\n  }\n}\n","import { withCLI } from '../wrapper';\nimport { Logger } from '../../utils/logger';\nimport type { I18nConfig } from '../../config';\n\nimport { translateCommand as srcTranslateCommand } from '../../core/translation/cli';\nimport { ConfigManager } from '../../config';\n\ninterface TranslateOptions {\n  config?: string;\n  from?: string;\n  to?: string;\n  input?: string;\n  json?: string;\n  batch?: boolean;\n  test?: boolean;\n  incremental?: boolean;\n}\n\nasync function translateHandler(options: TranslateOptions, config: I18nConfig): Promise<void> {\n  // 同步配置到main模块的ConfigManager\n  ConfigManager.init(config);\n  \n  Logger.info('开始执行翻译命令...', 'verbose');\n  \n  // 直接调用原有的翻译命令实现\n  await srcTranslateCommand({\n    config: options.config || './i18n.config.json',\n    from: options.from,\n    to: options.to,\n    input: options.input,\n    json: options.json,\n    batch: options.batch,\n    test: options.test,\n    incremental: options.incremental\n  });\n}\n\nexport const translateCommand = withCLI(translateHandler);","import { checkUnwrappedChinese, CheckResult } from '../ast';\nimport { ConfigManager, loadConfig } from '../../config';\nimport { ConfigValidator } from '../../utils/config-validator';\nimport { writeFileWithTempDir } from '../../utils/fs';\nimport { Logger } from '../../utils/logger';\n\ninterface CheckUnwrappedOptions {\n  config: string;\n  output?: string;\n  simple?: boolean;\n  file?: boolean;\n  includeProcessable?: boolean;\n  includeIgnored?: boolean;\n}\n\n/**\n * 生成简略格式的检查报告\n */\nfunction generateSimpleReport(results: CheckResult[], includeProcessable: boolean = true, includeIgnored: boolean = false): string {\n  let report = '# 国际化检查报告（简略版）\\n\\n';\n\n  // 分类统计\n  let shouldProcessCount = 0;\n  let ignoredCount = 0;\n\n  results.forEach((result) => {\n    result.issues.forEach((issue) => {\n      if (issue.shouldProcess) {\n        shouldProcessCount++;\n      } else {\n        ignoredCount++;\n      }\n    });\n  });\n\n  report += `## 统计摘要\\n\\n`;\n  \n  if (includeProcessable && includeIgnored) {\n    report += `- **需要处理但未处理的中文字符串**: ${shouldProcessCount} 个\\n`;\n    report += `- **已忽略的中文字符串**: ${ignoredCount} 个\\n`;\n    report += `- **总计**: ${shouldProcessCount + ignoredCount} 个\\n\\n`;\n  } else if (includeProcessable) {\n    report += `- **需要处理但未处理的中文字符串**: ${shouldProcessCount} 个\\n\\n`;\n  } else if (includeIgnored) {\n    report += `- **已忽略的中文字符串**: ${ignoredCount} 个\\n\\n`;\n  }\n\n  // 按文件显示\n  results.forEach((result) => {\n    const shouldProcessIssues = result.issues.filter(issue => issue.shouldProcess);\n    const ignoredIssues = result.issues.filter(issue => !issue.shouldProcess);\n\n    // 检查是否有内容需要显示\n    const hasProcessableContent = includeProcessable && shouldProcessIssues.length > 0;\n    const hasIgnoredContent = includeIgnored && ignoredIssues.length > 0;\n    \n    if (!hasProcessableContent && !hasIgnoredContent) {\n      return; // 跳过没有需要显示内容的文件\n    }\n\n    report += `## 📄 ${result.file}\\n\\n`;\n\n    if (hasProcessableContent) {\n      report += `### ✅ 需要处理但未处理 (${shouldProcessIssues.length} 个)\\n\\n`;\n      shouldProcessIssues.forEach((issue) => {\n        report += `- ${issue.text}\\n`;\n      });\n      report += '\\n';\n    }\n\n    if (hasIgnoredContent) {\n      report += `### ❌ 已忽略 (${ignoredIssues.length} 个)\\n\\n`;\n      ignoredIssues.forEach((issue) => {\n        report += `- ${issue.text} *(${issue.reason})*\\n`;\n      });\n      report += '\\n';\n    }\n  });\n\n  return report;\n}\n\n/**\n * 生成详细格式的检查报告\n */\nfunction generateDetailedReport(results: CheckResult[], includeProcessable: boolean = true, includeIgnored: boolean = false): string {\n  let report = '# 国际化检查报告\\n\\n';\n\n  // 分类统计\n  let shouldProcessCount = 0;\n  let ignoredCount = 0;\n  const contextStats: Record<string, number> = {};\n\n  results.forEach((result) => {\n    result.issues.forEach((issue) => {\n      if (issue.shouldProcess) {\n        shouldProcessCount++;\n      } else {\n        ignoredCount++;\n      }\n      \n      // 只统计要显示的类型\n      if ((includeProcessable && issue.shouldProcess) || (includeIgnored && !issue.shouldProcess)) {\n        contextStats[issue.contextType] = (contextStats[issue.contextType] || 0) + 1;\n      }\n    });\n  });\n\n  report += `## 检查摘要\\n\\n`;\n  report += `- **有问题的文件数**: ${results.length}\\n`;\n  \n  if (includeProcessable && includeIgnored) {\n    report += `- **需要处理但未处理的中文字符串**: ${shouldProcessCount}\\n`;\n    report += `- **已忽略的中文字符串**: ${ignoredCount}\\n`;\n    report += `- **总计**: ${shouldProcessCount + ignoredCount}\\n\\n`;\n  } else if (includeProcessable) {\n    report += `- **需要处理但未处理的中文字符串**: ${shouldProcessCount}\\n\\n`;\n  } else if (includeIgnored) {\n    report += `- **已忽略的中文字符串**: ${ignoredCount}\\n\\n`;\n  }\n\n  if (Object.keys(contextStats).length > 0) {\n    report += `## 上下文分布\\n\\n`;\n    Object.entries(contextStats).forEach(([context, count]) => {\n      const contextName = getContextDisplayName(context);\n      report += `- **${contextName}**: ${count} 个\\n`;\n    });\n    report += '\\n';\n  }\n\n  report += `## 详细结果\\n\\n`;\n\n  results.forEach((result) => {\n    const shouldProcessIssues = result.issues.filter(issue => issue.shouldProcess);\n    const ignoredIssues = result.issues.filter(issue => !issue.shouldProcess);\n\n    // 检查是否有内容需要显示\n    const hasProcessableContent = includeProcessable && shouldProcessIssues.length > 0;\n    const hasIgnoredContent = includeIgnored && ignoredIssues.length > 0;\n    \n    if (!hasProcessableContent && !hasIgnoredContent) {\n      return; // 跳过没有需要显示内容的文件\n    }\n\n    report += `### 📄 ${result.file}\\n\\n`;\n\n    if (hasProcessableContent) {\n      report += `#### ✅ 需要处理但未处理的中文字符串 (${shouldProcessIssues.length} 个)\\n\\n`;\n      shouldProcessIssues.forEach((issue, index: number) => {\n        report += `${index + 1}. **[行 ${issue.line}:列 ${issue.column}]** - \\`${issue.type}\\`\\n`;\n        report += `   - **文本**: \"${issue.text}\"\\n`;\n        report += `   - **上下文**: \\`${issue.context ?? '无上下文'}\\`\\n`;\n        report += `   - **类型**: ${getContextDisplayName(issue.contextType)}\\n\\n`;\n      });\n    }\n\n    if (hasIgnoredContent) {\n      report += `#### ❌ 已忽略的中文字符串 (${ignoredIssues.length} 个)\\n\\n`;\n      ignoredIssues.forEach((issue, index: number) => {\n        report += `${index + 1}. **[行 ${issue.line}:列 ${issue.column}]** - \\`${issue.type}\\`\\n`;\n        report += `   - **文本**: \"${issue.text}\"\\n`;\n        report += `   - **上下文**: \\`${issue.context ?? '无上下文'}\\`\\n`;\n        report += `   - **类型**: ${getContextDisplayName(issue.contextType)}\\n`;\n        report += `   - **忽略原因**: ${issue.reason}\\n\\n`;\n      });\n    }\n\n    report += '---\\n\\n';\n  });\n\n  return report;\n}\n\n/**\n * 获取上下文类型的显示名称\n */\nfunction getContextDisplayName(contextType: string): string {\n  const displayNames: Record<string, string> = {\n    'code': '代码',\n    'comment': '注释',\n    'ts-definition': 'TypeScript类型定义',\n    'object-key': '对象键名',\n    'enum-value': '枚举值',\n    'import-export': 'import/export语句',\n    'type-annotation': '类型注解'\n  };\n  return displayNames[contextType] || contextType;\n}\n\nexport async function checkUnwrappedCommand(options: CheckUnwrappedOptions): Promise<void> {\n  try {\n    Logger.info(`开始加载配置文件: ${options.config}`, 'verbose');\n    const config = loadConfig(options.config);\n    ConfigManager.init(config);\n\n    // 执行配置验证\n    const validation = ConfigValidator.validateConfigUsage();\n    if (!validation.isValid) {\n      Logger.error('配置验证失败，无法继续执行', 'minimal');\n      process.exit(1);\n    }\n\n    ConfigValidator.checkConfigConsistency();\n    Logger.info('配置加载完成，开始执行检查流程...', 'normal');\n\n    const results = await checkUnwrappedChinese();\n\n    if (results.length === 0) {\n      Logger.success('恭喜！所有文件中的中文字符串都已经国际化', 'minimal');\n      return;\n    }\n\n    // 默认参数处理\n    const includeProcessable = options.includeProcessable !== false; // 默认true\n    const includeIgnored = options.includeIgnored || false; // 默认false\n\n    // 统计信息\n    let totalIssues = 0;\n    let shouldProcessCount = 0;\n    let ignoredCount = 0;\n    \n    results.forEach((result) => {\n      result.issues.forEach((issue) => {\n        totalIssues++;\n        if (issue.shouldProcess) {\n          shouldProcessCount++;\n        } else {\n          ignoredCount++;\n        }\n      });\n    });\n\n    // 控制台输出摘要\n    Logger.info('\\n=== 检查结果摘要 ===', 'minimal');\n    Logger.info(`发现 ${results.length} 个文件存在中文字符串`, 'minimal');\n    \n    if (includeProcessable && includeIgnored) {\n      Logger.info(`共计 ${totalIssues} 个中文字符串`, 'minimal');\n      Logger.info(`  - 需要处理但未处理: ${shouldProcessCount} 个`, 'minimal');\n      Logger.info(`  - 已忽略: ${ignoredCount} 个`, 'minimal');\n    } else if (includeProcessable) {\n      Logger.info(`需要处理但未处理: ${shouldProcessCount} 个中文字符串`, 'minimal');\n    } else if (includeIgnored) {\n      Logger.info(`已忽略: ${ignoredCount} 个中文字符串`, 'minimal');\n    }\n\n    // 是否生成文件\n    if (options.file !== false) {\n      const outputPath = options.output || 'i18n-check-report.md';\n      const reportContent = options.simple\n        ? generateSimpleReport(results, includeProcessable, includeIgnored)\n        : generateDetailedReport(results, includeProcessable, includeIgnored);\n\n      await writeFileWithTempDir(outputPath, reportContent);\n      Logger.success(`检查结果已保存到: ${outputPath}`, 'minimal');\n\n      const typeDescription = getOutputTypeDescription(includeProcessable, includeIgnored);\n      if (options.simple) {\n        Logger.info(`已生成简略版报告（${typeDescription}）`, 'minimal');\n      } else {\n        Logger.info(`已生成详细版报告（${typeDescription}）`, 'minimal');\n      }\n    } else {\n      // 仅控制台输出，显示文件预览\n      const preview = results.slice(0, 5);\n      Logger.info('\\n问题文件预览:', 'minimal');\n      preview.forEach((result) => {\n        const shouldProcessIssues = result.issues.filter(issue => issue.shouldProcess);\n        const ignoredIssues = result.issues.filter(issue => !issue.shouldProcess);\n        \n        if (includeProcessable && includeIgnored) {\n          Logger.info(`  📄 ${result.file} (需要处理: ${shouldProcessIssues.length} 个，已忽略: ${ignoredIssues.length} 个)`, 'minimal');\n        } else if (includeProcessable) {\n          Logger.info(`  📄 ${result.file} (需要处理: ${shouldProcessIssues.length} 个)`, 'minimal');\n        } else if (includeIgnored) {\n          Logger.info(`  📄 ${result.file} (已忽略: ${ignoredIssues.length} 个)`, 'minimal');\n        }\n      });\n\n      if (results.length > 5) {\n        Logger.info(`  ... 还有 ${results.length - 5} 个文件`, 'minimal');\n      }\n\n      Logger.info('\\n💡 使用 -o 参数或移除 --no-file 参数可生成详细报告文件', 'minimal');\n      Logger.info('💡 使用 --include need|ignored|all 参数可控制输出内容类型', 'minimal');\n    }\n\n    Logger.success('检查流程已完成', 'minimal');\n  } catch (error) {\n    Logger.error(`检查过程中发生错误: ${error}`, 'minimal');\n    process.exit(1);\n  }\n}\n\n/**\n * 获取输出类型描述\n */\nfunction getOutputTypeDescription(includeProcessable: boolean, includeIgnored: boolean): string {\n  if (includeProcessable && includeIgnored) {\n    return '包含需要处理和已忽略的中文';\n  } else if (includeProcessable) {\n    return '仅包含需要处理的中文';\n  } else if (includeIgnored) {\n    return '仅包含已忽略的中文';\n  } else {\n    return '无内容';\n  }\n}\n","import { withCLI } from '../wrapper';\nimport type { I18nConfig } from '../../config';\n\nimport { checkUnwrappedCommand as srcCheckCommand } from '../../core/check/cli';\nimport { ConfigManager } from '../../config';\n\ninterface CheckOptions {\n  config?: string;\n  output?: string;\n  summary?: boolean;\n  detailed?: boolean;\n  file?: boolean;\n  include?: string;\n}\n\nasync function checkHandler(options: CheckOptions, config: I18nConfig): Promise<void> {\n  // 同步配置到main模块的ConfigManager\n  ConfigManager.init(config);\n  \n  // 默认启用summary模式，除非明确指定--detailed\n  const useSummary = !options.detailed;\n  \n  // 根据include参数确定输出内容类型\n  let includeProcessable = false; // 需要处理的\n  let includeIgnored = false;     // 被忽略的\n  \n  const includeType = options.include || 'need';\n  \n  switch (includeType.toLowerCase()) {\n    case 'need':\n      // 需要处理但未处理\n      includeProcessable = true;\n      includeIgnored = false;\n      break;\n    case 'ignored':\n      includeProcessable = false;\n      includeIgnored = true;\n      break;\n    case 'all':\n      includeProcessable = true;\n      includeIgnored = true;\n      break;\n    default:\n      // 默认只输出需要处理但未处理的\n      includeProcessable = true;\n      includeIgnored = false;\n      break;\n  }\n  \n  // 直接调用原有的check命令实现\n  await srcCheckCommand({\n    config: options.config || './i18n.config.json',\n    output: options.output,\n    simple: useSummary,\n    file: options.file,\n    includeProcessable,\n    includeIgnored\n  });\n}\n\nexport const checkCommand = withCLI(checkHandler);","import { withCLI } from '../wrapper';\nimport { Logger } from '../../utils/logger';\nimport { readJsonSync, findTargetFiles, readFile, writeFileWithTempDir } from '../../utils/fs';\nimport { defaultConfig } from '../../config/defaults';\nimport type { I18nConfig } from '../../config';\nimport * as path from 'path';\n\ninterface RpkeyOptions {\n  config?: string;\n}\n\nasync function rpkeyHandler(options: RpkeyOptions, config: I18nConfig): Promise<void> {\n  Logger.info('开始批量替换 key...', 'normal');\n\n  const filenameTemplate =\n    config.output?.localeFileName ?? defaultConfig.output!.localeFileName!;\n  const localeFileName = filenameTemplate.replace('{locale}', config.locale);\n  const localeFilePath = path.resolve(process.cwd(), config.outputDir, localeFileName);\n  const translations = readJsonSync(localeFilePath) as Record<string, string>;\n\n  const files = await findTargetFiles(config.include, config.exclude);\n  for (const file of files) {\n    const content = await readFile(file);\n    const func = config.replacement?.functionName ?? defaultConfig.replacement!.functionName!;\n    const quoteType = config.replacement?.quoteType ?? defaultConfig.replacement!.quoteType!;\n    const quote = quoteType === 'single' ? \"'\" : '\"';\n\n    const regex = new RegExp(`${func}\\\\(${quote}([a-zA-Z_]+)${quote}\\\\)`, 'g');\n    Logger.verbose(`正则: ${regex}`);\n    const updated = content.replace(regex, (match, key) => {\n      Logger.verbose(`匹配KEY: ${key}`);\n      const value = translations[key];\n      return value ? `${func}(${quote}${value}${quote})` : match;\n    });\n    await writeFileWithTempDir(file, updated, config.tempDir);\n    Logger.verbose(`文件已处理: ${file}`);\n  }\n  Logger.success('批量替换完成', 'minimal');\n}\n\nexport const rpkeyCommand = withCLI(rpkeyHandler);","import { withCLI } from '../wrapper';\nimport type { I18nConfig } from '../../config';\n\nimport { checkTranslationCommand as srcCheckTranslationCommand } from '../../core/translation/cli';\nimport { ConfigManager } from '../../config';\n\ninterface CheckTranslationOptions {\n  config?: string;\n  languages?: string;\n  output?: string;\n  summary?: boolean;\n  detailed?: boolean;\n}\n\nasync function checkTranslationHandler(options: CheckTranslationOptions, config: I18nConfig): Promise<void> {\n  // 同步配置到main模块的ConfigManager\n  ConfigManager.init(config);\n  \n  // 默认启用summary模式，除非明确指定--detailed\n  const useSummary = !options.detailed;\n  \n  // 直接调用原有的check-translation命令实现\n  await srcCheckTranslationCommand({\n    config: options.config || './i18n.config.json',\n    languages: options.languages,\n    output: options.output,\n    summary: useSummary\n  });\n}\n\nexport const checkTranslationCommand = withCLI(checkTranslationHandler);"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uBAAwB;;;ACEtB,cAAW;;;ACFb,SAAoB;AACpB,WAAsB;AACtB,uBAA4B;AAKrB,SAASA,UAAS,UAAkB,WAA2B,SAA0B;AAC9F,QAAM,UAAe,aAAQ,QAAQ,IAAI,GAAG,QAAQ;AACpD,SAAU,YAAS,SAAS,QAAQ;AACtC;AAKO,SAAS,UAAU,UAAkB,MAAsC;AAChF,QAAM,UAAe,aAAQ,QAAQ,IAAI,GAAG,QAAQ;AACpD,SAAU,cAAW,SAAS,IAAI;AACpC;AAQO,SAAS,qBACd,UACA,MACA,SACe;AACf,MAAI;AAEJ,MAAI,SAAS;AAEX,UAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,QAAQ;AAC1D,iBAAkB,aAAQ,QAAQ,IAAI,GAAG,SAAS,YAAY;AAAA,EAChE,OAAO;AAEL,iBAAkB,aAAQ,QAAQ,IAAI,GAAG,QAAQ;AAAA,EACnD;AAEA,SAAU,cAAW,YAAY,IAAI;AACvC;AAKO,SAASC,WAAU,SAAgC;AACxD,QAAM,UAAe,aAAQ,QAAQ,IAAI,GAAG,OAAO;AACnD,SAAU,aAAU,OAAO;AAC7B;AAcO,SAAS,gBAAgB,SAAmB,UAAoB,CAAC,GAAsB;AAC5F,aAAO,iBAAAC,SAAG,SAAS,EAAE,QAAQ,SAAS,KAAK,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC;AACvE;AAMO,SAAS,WAAW,UAA2B;AACpD,QAAM,UAAe,aAAQ,QAAQ,IAAI,GAAG,QAAQ;AACpD,SAAU,cAAW,OAAO;AAC9B;AAMO,SAASC,cAAa,UAA2B;AACtD,QAAM,UAAe,aAAQ,QAAQ,IAAI,GAAG,QAAQ;AACpD,SAAU,gBAAa,OAAO;AAChC;AAOA,eAAsB,SAAsB,UAAkB,cAA8B;AAC1F,MAAI;AACF,UAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,QAAI,iBAAiB,QAAW;AAC9B,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAQO,SAAS,UAAU,UAAkB,MAAe,SAAkB,MAAqB;AAChG,QAAM,UAAU,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI;AAC5E,SAAO,UAAU,UAAU,OAAO;AACpC;;;ACjHA,oBAAsB;;;ACGf,IAAM,gBAA4B;AAAA;AAAA,EAEvC,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,WAAW;AAAA;AAAA;AAAA,EAIX,SAAS;AAAA,IACP;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AAAA,IACb,kBAAkB;AAAA;AAAA,IAClB,YAAY;AAAA;AAAA,IACZ,eAAe;AAAA;AAAA,IACf,kBAAkB;AAAA;AAAA,IAClB,oBAAoB;AAAA;AAAA,IACpB,WAAW;AAAA;AAAA,IACX,WAAW;AAAA;AAAA,IACX,eAAe;AAAA;AAAA,MAEb,UAAU;AAAA;AAAA,MACV,MAAM;AAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,YAAY;AAAA;AAAA,IACZ,gBAAgB;AAAA;AAAA,EAClB;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa;AAAA,IACX,cAAc;AAAA;AAAA,IACd,WAAW;AAAA;AAAA,IACX,sBAAsB;AAAA;AAAA,IACtB,gBAAgB;AAAA,MACd,SAAS;AAAA;AAAA,MACT,qBAAqB;AAAA;AAAA,MACrB,eAAe;AAAA;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA;AAAA,MACT,gBAAgB;AAAA;AAAA,MAChB,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AAAA,IACX,SAAS;AAAA;AAAA,IACT,UAAU;AAAA;AAAA,IACV,mBAAmB;AAAA;AAAA,IACnB,mBAAmB;AAAA;AAAA,IACnB,aAAa;AAAA;AAAA,IACb,YAAY;AAAA;AAAA,IACZ,YAAY;AAAA;AAAA,IACZ,YAAY;AAAA;AAAA,IACZ,OAAO;AAAA,MACL,OAAO;AAAA;AAAA,MACP,KAAK;AAAA;AAAA,IACP;AAAA,EACF;AACF;;;AChFA,IAAM,qBAAN,MAAyB;AAAA,EACf,SAA4B;AAAA,EAEpC,KAAK,QAA0B;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAkB;AAChB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;AAEO,IAAM,gBAAgB,IAAI,mBAAmB;;;ACnB7C,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA,EAI3B,OAAO,sBAIL;AAfJ;AAgBI,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI;AACF,YAAM,SAAS,cAAc,IAAI;AAGjC,UAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAAG;AAClD,eAAO,KAAK,qDAAkB;AAAA,MAChC;AAEA,UAAI,CAAC,OAAO,WAAW;AACrB,eAAO,KAAK,uDAAoB;AAAA,MAClC;AAEA,UAAI,CAAC,OAAO,QAAQ;AAClB,eAAO,KAAK,oDAAiB;AAAA,MAC/B;AAGA,WAAI,YAAO,gBAAP,mBAAoB,SAAS;AAC/B,YAAI,CAAC,OAAO,YAAY,UAAU;AAChC,iBAAO,KAAK,iEAAoB;AAAA,QAClC;AAEA,YAAI,OAAO,YAAY,aAAa,SAAS;AAC3C,cAAI,GAAC,YAAO,YAAY,UAAnB,mBAA0B,UAAS,GAAC,YAAO,YAAY,UAAnB,mBAA0B,MAAK;AACtE,qBAAS,KAAK,gFAAyB;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,eAAe;AACxB,YAAI,OAAO,cAAc,oBAAoB,OAAO,cAAc,oBAAoB,GAAG;AACvF,mBAAS,KAAK,4CAAwB;AAAA,QACxC;AAEA,YAAI,OAAO,cAAc,cAAc,OAAO,cAAc,cAAc,GAAG;AAC3E,mBAAS,KAAK,sCAAkB;AAAA,QAClC;AAAA,MACF;AAGA,YACE,YAAO,YAAP,mBAAgB,UAChB,CAAC,CAAC,WAAW,UAAU,SAAS,EAAE,SAAS,OAAO,QAAQ,KAAK,GAC/D;AACA,eAAO,KAAK,kFAA+C;AAAA,MAC7D;AAGA,YAAI,YAAO,WAAP,mBAAe,mBAAkB,CAAC,OAAO,OAAO,eAAe,SAAS,UAAU,GAAG;AACvF,iBAAS,KAAK,qEAAkC;AAAA,MAClD;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,2DAAc,KAAK,EAAE;AAAA,IACnC;AAEA,UAAM,UAAU,OAAO,WAAW;AAElC,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM,yCAAW,SAAS;AACjC,aAAO,QAAQ,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK,IAAI,SAAS,CAAC;AAAA,IACnE;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,KAAK,6BAAS,QAAQ;AAC7B,eAAS,QAAQ,CAAC,YAAY,OAAO,KAAK,OAAO,OAAO,IAAI,QAAQ,CAAC;AAAA,IACvE;AAIA,WAAO,EAAE,SAAS,QAAQ,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,yBAA+B;AA/FxC;AAgGI,UAAM,SAAS,cAAc,IAAI;AAEjC,WAAO,QAAQ,+CAAY;AAG3B,UAAM,sBAAoB,YAAO,WAAP,mBAAe,mBAAkB,iBAAiB;AAAA,MAC1E;AAAA,MACA,OAAO;AAAA,IACT;AACA,WAAO,QAAQ,qDAAa,gBAAgB,EAAE;AAG9C,UAAM,iBAAe,YAAO,gBAAP,mBAAoB,iBAAgB;AACzD,WAAO,QAAQ,qDAAa,YAAY,EAAE;AAG1C,WAAO,QAAQ,6BAAS,OAAO,SAAS,EAAE;AAC1C,QAAI,OAAO,SAAS;AAClB,aAAO,QAAQ,6BAAS,OAAO,OAAO,EAAE;AAAA,IAC1C;AAEA,WAAO,QAAQ,wDAAW;AAAA,EAC5B;AACF;;;AH9GA,SAAS,eAAe,QAA0B;AATlD;AAUE,QAAM,SAAmB,CAAC;AAG1B,MAAI,CAAC,OAAO,WAAW,CAAC,MAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AACpF,WAAO,KAAK,gEAAmB;AAAA,EACjC;AAEA,MAAI,CAAC,OAAO,aAAa,OAAO,OAAO,cAAc,UAAU;AAC7D,WAAO,KAAK,0FAAyB;AAAA,EACvC;AAEA,MAAI,CAAC,OAAO,UAAU,OAAO,OAAO,WAAW,UAAU;AACvD,WAAO,KAAK,iFAAqB;AAAA,EACnC;AAGA,OAAI,YAAO,gBAAP,mBAAoB,SAAS;AAC/B,QAAI,CAAC,OAAO,YAAY,UAAU;AAChC,aAAO,KAAK,6EAAgC;AAAA,IAC9C;AAEA,QAAI,OAAO,YAAY,aAAa,SAAS;AAC3C,UAAI,GAAC,YAAO,YAAY,UAAnB,mBAA0B,UAAS,GAAC,YAAO,YAAY,UAAnB,mBAA0B,MAAK;AACtE,eAAO,KAAK,yHAA6D;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAGA,QAAI,YAAO,YAAP,mBAAgB,UAAS,CAAC,CAAC,WAAW,UAAU,SAAS,EAAE,SAAS,OAAO,QAAQ,KAAK,GAAG;AAC7F,WAAO,KAAK,kFAA+C;AAAA,EAC7D;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,MAAM,yCAAW,SAAS;AACjC,WAAO,QAAQ,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK,IAAI,SAAS,CAAC;AACjE,UAAM,IAAI,MAAM,yCAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAChD;AACF;AAEO,SAAS,WAAW,kBAAuC;AAChE,MAAI,aAAkC,CAAC;AAEvC,MAAI,kBAAkB;AACpB,QAAI,WAAW,gBAAgB,GAAG;AAChC,aAAO,QAAQ,yCAAW,gBAAgB,EAAE;AAC5C,UAAI;AACF,qBAAaC,cAAa,gBAAgB;AAC1C,eAAO,QAAQ,kDAAU;AAAA,MAC3B,SAAS,OAAO;AACd,cAAM,IAAI,MAAM,qDAAa,KAAK,EAAE;AAAA,MACtC;AAAA,IACF,OAAO;AACL,aAAO,KAAK,+CAAY,gBAAgB,4CAAS;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,kBAAc,qBAAM,CAAC,GAAG,eAAe,UAAU;AAGvD,iBAAe,WAAW;AAE1B,SAAO,QAAQ,sCAAQ;AACvB,SAAO;AACT;;;AIxEO,IAAM,SAAN,MAAa;AAAA,EAClB,OAAe,iBAAgC;AAAA;AAAA,EAE/C,OAAe,cAAsB;AALvC;AAMI,QAAI;AAEF,UAAI,KAAK,gBAAgB;AACvB,eAAO,KAAK;AAAA,MACd;AACA,YAAM,SAAS,cAAc,IAAI;AACjC,eAAO,YAAO,YAAP,mBAAgB,UAAS;AAAA,IAClC,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,OAA4B;AACnD,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,OAAe,UAAU,OAAkD;AACzE,UAAM,eAAe,KAAK,YAAY;AAEtC,QAAI,iBAAiB,WAAW;AAC9B,aAAO,UAAU;AAAA,IACnB,WAAW,iBAAiB,UAAU;AACpC,aAAO,UAAU;AAAA,IACnB,WAAW,iBAAiB,WAAW;AACrC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAiB,QAA0C,UAAgB;AACxF,QAAI,KAAK,UAAU,KAAK,GAAG;AACzB,cAAQ,IAAI,UAAK,OAAO,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,OAAO,KAAK,SAAiB,QAA0C,UAAgB;AACrF,QAAI,KAAK,UAAU,KAAK,GAAG;AACzB,cAAQ,IAAI,iBAAO,OAAO,EAAE;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,OAAO,KAAK,SAAiB,QAA0C,UAAgB;AACrF,QAAI,KAAK,UAAU,KAAK,GAAG;AACzB,cAAQ,KAAK,iBAAO,OAAO,EAAE;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,SAAiB,QAA0C,UAAgB;AACtF,QAAI,KAAK,UAAU,KAAK,GAAG;AACzB,cAAQ,MAAM,UAAK,OAAO,EAAE;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,SAAuB;AACpC,SAAK,KAAK,SAAS,SAAS;AAAA,EAC9B;AACF;;;ACtDA,eAAe,YAAY,SAAqC;AAbhE;AAeE,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,QAAQ,UAAU,cAAc;AAC/C,QAAM,eAAe,QAAQ,kBAAgB,mBAAc,gBAAd,mBAA2B;AAExE,QAAM,SAAqB;AAAA,IACzB,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACX,GAAG,cAAc;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,YAAY,QAAQ,IAAI;AACxC,WAAO,QAAQ,+CAAY,UAAU,IAAI,SAAS;AAClD,WAAO,KAAK,oGAAoB,QAAQ;AAAA,EAC1C,SAAS,OAAO;AACd,WAAO,MAAM,qDAAa,KAAK,IAAI,SAAS;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGO,IAAM,cAAc;;;AC7BpB,SAAS,QACd,SACA,iBAAuC,CAAC,GACxC;AACA,SAAO,OAAO,YAAe;AAlB/B;AAmBI,QAAI;AAEF,YAAM,qBAAmB,oBAAe,eAAf,wCAA4B,aAAY;AAGjE,UAAI,SAA4B;AAChC,UAAI,eAAe,mBAAmB,OAAO;AAE3C,cAAM,aAAc,iBAAyB,UAAU;AACvD,iBAAS,WAAW,UAAU;AAC9B,sBAAc,KAAK,MAAM;AAGzB,cAAM,aAAa,gBAAgB,oBAAoB;AACvD,YAAI,CAAC,WAAW,SAAS;AACvB,iBAAO,MAAM,kFAAiB,SAAS;AACvC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,wBAAgB,uBAAuB;AAAA,MACzC;AAGA,UAAI,UAAU,eAAe,WAAW;AACtC,uBAAe,UAAU,MAAM;AAAA,MACjC;AAGA,YAAM,QAAQ,kBAAkB,MAAO;AAAA,IACzC,SAAS,OAAO;AACd,aAAO,MAAM,yCAAW,KAAK,IAAI,SAAS;AAC1C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;;;ACpDA,IAAAC,iBAAsB;AACtB,IAAAC,KAAmB;;;ACAnB,wBAAuB;AACvB,IAAAC,QAAsB;AAEtB,yBAAuB;AAYvB,IAAI,gBAA6B,CAAC;AAClC,IAAI,gBAA6B,CAAC;AAClC,IAAI,iBAAiB;AAGrB,eAAsB,gBAA+B;AArBrD;AAsBE,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,YAAY,OAAO,aAAa;AACtC,QAAMC,WAAU,SAAS;AAGzB,QAAM,mBAAiB,YAAO,WAAP,mBAAe,mBAAkB;AACxD,QAAM,WAAW,eAAe,QAAQ,YAAY,OAAO,UAAU,OAAO;AAC5E,mBAAsB,WAAK,WAAW,QAAQ;AAG9C,kBAAgB,MAAM,SAAsB,gBAAgB,CAAC,CAAC;AAG9D,kBAAgB,CAAC;AACjB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AACxD,kBAAc,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,mBAAmB,OAAO,KAAK,aAAa,EAAE;AAEpD,MAAI,mBAAmB,GAAG;AACxB,WAAO,QAAQ,sBAAO,gBAAgB,mDAAW;AAAA,EACnD;AAGA,QAAM,UAAU,gBAAgB,aAAa;AAC/C;AAEA,SAAS,YAAY,MAAsB;AAlD3C;AAmDE,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,eAAa,YAAO,kBAAP,mBAAsB,eAAc;AACvD,aAAO,mBAAAC,SAAW,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,UAAU;AAC1D;AAKA,SAAS,kBAAkB,SAAiB,MAAsB;AA3DlE;AA4DE,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,cAAY,YAAO,kBAAP,mBAAsB,cAAa;AACrD,QAAM,aAAW,YAAO,kBAAP,mBAAsB,kBAAiB;AAGxD,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,UAAU,YAAY,YAAY,IAAI;AACrD,MAAI,WAAW;AAEf,SAAO,cAAc,QAAQ,KAAK,WAAW,UAAU;AACrD,eAAW,UAAU,YAAY,YAAY,OAAO,KAAK,OAAO,EAAE,SAAS,CAAC;AAC5E;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,WAAO,KAAK,kGAAuB,OAAO,EAAE;AAE5C,eAAW,UAAU,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AAAA,EACzD;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,MAAsB;AAvFpD;AAwFE,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,qBAAmB,YAAO,kBAAP,mBAAsB,qBAAoB;AAGnE,MAAI,oBAAoB,cAAc,IAAI,GAAG;AAC3C,WAAO,QAAQ,qEAAmB,cAAc,IAAI,CAAC,UAAU,IAAI,GAAG;AACtE,WAAO,cAAc,IAAI;AAAA,EAC3B;AAGA,QAAM,cAAY,YAAO,kBAAP,mBAAsB,qBAAoB;AAC5D,QAAM,SAAO,UAAK,MAAM,mBAAmB,MAA9B,mBAAiC,KAAK,QAAO,IAAI,MAAM,GAAG,SAAS;AAEhF,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAGA,QAAM,kBAAgB,YAAO,kBAAP,mBAAsB,kBAAiB,EAAE,UAAU,QAAQ,MAAM,QAAQ;AAC/F,QAAM,cAAY,YAAO,kBAAP,mBAAsB,cAAa;AACrD,QAAM,cAAY,YAAO,kBAAP,mBAAsB,cAAa;AAGrD,QAAM,eACJ,0BAAO,KAAK;AAAA,IACV,UAAU,cAAc,YAAY;AAAA,IACpC,MAAM;AAAA,EACR,CAAC,KAAK,CAAC,GACP,KAAK,SAAS;AAEhB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,KAAK;AAGzE,QAAM,WAAW,kBAAkB,eAAe,IAAI;AAGtD,gBAAc,QAAQ,IAAI;AAC1B,gBAAc,IAAI,IAAI;AAEtB,SAAO;AACT;AAGA,eAAsB,iBAAgC;AAxItD;AAyIE,MAAI,gBAAgB;AAClB,UAAM,SAAS,cAAc,IAAI;AACjC,UAAM,eAAa,YAAO,WAAP,mBAAe,eAAc;AAChD,UAAM,UAAU,gBAAgB,eAAe,UAAU;AACzD,UAAM,WAAW,OAAO,KAAK,aAAa,EAAE;AAC5C,WAAO,KAAK,sBAAO,QAAQ,mCAAU,cAAc,IAAI,QAAQ;AAAA,EACjE;AACF;;;AChJA,oBAAsB;AACtB,QAAmB;;;ACAnB,wBAAuB;AAMhB,SAAS,aAAa,SAAiB,UAA2B;AACvE,MAAI;AACF,WAAO,kBAAAC,QAAW,QAAQ,UAAU,OAAO;AAAA,EAC7C,SAAS,OAAO;AACd,WAAO,KAAK,mDAAqB,OAAO,eAAe,QAAQ,YAAY,KAAK,EAAE;AAClF,WAAO;AAAA,EACT;AACF;AAKO,SAAS,mBACd,UACA,UAA8D,CAAC,GAChD;AAtBjB;AAuBE,SAAO,QAAQ,uBAAuB,QAAQ,EAAE;AAGhD,QAAM,WAAW,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAEnD,UAAM,SAAS,sBAAsB,CAAC;AACtC,UAAM,SAAS,sBAAsB,CAAC;AACtC,WAAO,SAAS;AAAA,EAClB,CAAC;AAED,aAAW,WAAW,UAAU;AAC9B,QAAI,aAAa,SAAS,QAAQ,GAAG;AACnC,aAAO,QAAQ,mCAAU,OAAO,OAAO,QAAQ,EAAE;AACjD,eAAO,aAAQ,OAAO,MAAf,mBAAkB,oBAAmB;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,QAAQ,2DAAmB,QAAQ,EAAE;AAC5C,SAAO;AACT;AAKA,SAAS,sBAAsB,SAAyB;AA/CxD;AAgDE,MAAI,QAAQ;AAGZ,MAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,aAAS;AAAA,EACX;AAGA,MAAI,QAAQ,SAAS,IAAI,KAAK,QAAQ,MAAM,QAAQ,GAAG;AACrD,aAAS;AAAA,EACX;AAGA,cAAU,aAAQ,MAAM,KAAK,MAAnB,mBAAsB,WAAU,KAAK;AAG/C,cAAU,aAAQ,MAAM,OAAO,MAArB,mBAAwB,WAAU,KAAK;AAGjD,cAAU,aAAQ,MAAM,kBAAkB,MAAhC,mBAAmC,WAAU,KAAK;AAE5D,SAAO;AACT;;;ADhEA,IAAM,WAAW,QAAQ,kBAAkB,EAAE;AAQ7C,SAAS,kBAAkB,KAAU,iBAAkC;AAdvE;AAeE,MAAI;AACF,UAAM,gBAAY,qBAAM,iBAAiB;AAAA,MACvC,YAAY;AAAA,MACZ,SAAS,CAAC,OAAO,YAAY;AAAA,IAC/B,CAAC;AAED,QAAI,GAAC,eAAU,YAAV,mBAAmB,SAAQ,UAAU,QAAQ,KAAK,WAAW,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,UAAU,QAAQ;AACxC,UAAM,qBAAqB,IAAI,QAAQ;AAGvC,eAAW,WAAW,eAAe;AACnC,UAAI,QAAQ;AACZ,iBAAW,gBAAgB,oBAAoB;AAE7C,cAAM,UAAU,SAAS,SAAS,EAAE,UAAU,KAAK,CAAC,EAAE;AACtD,cAAM,eAAe,SAAS,cAAc,EAAE,UAAU,KAAK,CAAC,EAAE;AAChE,YAAI,YAAY,cAAc;AAC5B,kBAAQ;AACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,QAAQ,qDAAkB,KAAK,EAAE;AACxC,WAAO;AAAA,EACT;AACF;AAQA,SAAS,eACP,KACA,iBACA,iBAAyC,gBACnC;AA7DR;AA8DE,MAAI;AAEF,QAAI,kBAAkB,KAAK,eAAe,GAAG;AAC3C,aAAO,QAAQ,oEAAkB;AACjC;AAAA,IACF;AAGA,UAAM,gBAAY,qBAAM,iBAAiB;AAAA,MACvC,YAAY;AAAA,MACZ,SAAS,CAAC,OAAO,YAAY;AAAA,IAC/B,CAAC;AAGD,UAAI,eAAU,YAAV,mBAAmB,SAAQ,UAAU,QAAQ,KAAK,SAAS,GAAG;AAChE,UAAI,cAAc;AAElB,UAAI,mBAAmB,gBAAgB;AAErC,iBAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ,KAAK;AAChD,cAAM,sBAAoB,IAAI,QAAQ,KAAK,CAAC,CAAC,GAAG;AAC9C,0BAAc,IAAI;AAAA,UACpB,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,sBAAc;AAAA,MAChB;AAGA,UAAI,QAAQ,KAAK,OAAO,aAAa,GAAG,GAAG,UAAU,QAAQ,IAAI;AAEjE,aAAO,QAAQ,2DAAmB,cAAc,EAAE;AAAA,IACpD;AAAA,EACF,SAAS,OAAO;AACd,WAAO,KAAK,+CAAiB,eAAe,EAAE;AAC9C,WAAO,QAAQ,6BAAS,KAAK,EAAE;AAAA,EACjC;AACF;AASA,SAAS,wBAAwB,MAAc,iBAAiC;AAE9E,QAAM,uBAAuB,gBAAgB,QAAQ,UAAU,GAAG,EAAE,KAAK;AAGzE,QAAM,cAAc,KAAK,QAAQ,oBAAoB;AACrD,MAAI,gBAAgB,IAAI;AACtB,WAAO,QAAQ,0HAA2B;AAC1C,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiB,cAAc,qBAAqB;AAG1D,QAAM,kBAAkB,KAAK,OAAO,cAAc;AAClD,MAAI,mBAAmB,oBAAoB,QAAQ,oBAAoB,MAAM;AAG3E,UAAM,WAAW,KAAK,UAAU,cAAc;AAC9C,UAAM,kBAAkB,SAAS,QAAQ,WAAW,EAAE;AACtD,WAAO,KAAK,UAAU,GAAG,cAAc,IAAI,SAAS;AAAA,EACtD;AAGA,MAAI,eAAe;AACnB,SAAO,eAAe,KAAK,UAAU,KAAK,OAAO,YAAY,MAAM,MAAM;AACvE;AAAA,EACF;AAEA,MAAI,gBAAgB,KAAK,QAAQ;AAE/B,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,gBAAgB,eAAe;AACrC,MAAI,iBAAiB,KAAK,QAAQ;AAEhC,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,cAAc,KAAK,QAAQ,MAAM,aAAa;AACpD,QAAM,WACJ,gBAAgB,KAAK,KAAK,UAAU,aAAa,IAAI,KAAK,UAAU,eAAe,WAAW;AAGhG,MAAI,SAAS,KAAK,MAAM,IAAI;AAC1B,WAAO,KAAK,UAAU,GAAG,eAAe,CAAC,IAAI,OAAO,KAAK,UAAU,eAAe,CAAC;AAAA,EACrF;AAEA,SAAO;AACT;AAKO,IAAM,gBAAN,MAAoB;AAAA,EACjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAKlC,QAAc;AACZ,SAAK,oBAAoB;AACzB,SAAK,0BAA0B;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,qBACE,KACA,MACA,mBACA,gBACA,SACA,gBACM;AACN,QAAI,CAAC,KAAK,qBAAqB,qBAAqB,gBAAgB;AAClE,YAAM,kBAAkB,mBAAmB,MAAM,OAAO;AACxD,UAAI,iBAAiB;AACnB,eAAO,QAAQ,sBAAO,IAAI,oCAAgB,gBAAgB,KAAK,CAAC,EAAE;AAClE,uBAAe,KAAK,iBAAiB,cAAc;AACnD,aAAK,oBAAoB;AACzB,aAAK,0BAA0B;AAAA,MACjC,OAAO;AACL,eAAO,KAAK,gBAAM,IAAI,+FAA8B,QAAQ;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,QAAwB;AAC3C,QAAI,KAAK,qBAAqB,KAAK,yBAAyB;AAC1D,YAAM,SAAS,wBAAwB,QAAQ,KAAK,uBAAuB;AAC3E,UAAI,WAAW,QAAQ;AACrB,eAAO,QAAQ,8DAAiB;AAAA,MAClC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,mBAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,oBAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AACF;;;AF9NA,IAAM,WAAW,QAAQ,iBAAiB,EAAE;AAC5C,IAAMC,YAAW,QAAQ,kBAAkB,EAAE;AAG7C,IAAM,aAAa;AAmBnB,SAAS,YAAYC,OAAW,WAA8B;AAC5D,QAAM,MAAMA,MAAK,KAAK;AACtB,MAAI,CAAC,OAAO,CAAC,UAAW,QAAO;AAE/B,QAAM,YAAY,IAAI,MAAM,OAAO;AACnC,MAAI,aAAa,KAAK,YAAY,UAAU,QAAQ;AAClD,UAAM,OAAO,UAAU,SAAS;AAChC,UAAM,aAAa,KAAK,UAAU,GAAG,IAAI,MAAM,MAAM;AACrD,UAAM,YAAY,KAAK,UAAU,IAAI,IAAI,MAAM;AAG/C,QAAI,WAAW,SAAS,IAAI,GAAG;AAC7B,aAAO;AAAA,IACT;AAGA,QAAI,WAAW,SAAS,IAAI,KAAK,CAAC,WAAW,SAAS,IAAI,GAAG;AAC3D,aAAO;AAAA,IACT;AAGA,aAAS,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK;AACvC,YAAM,WAAW,UAAU,CAAC;AAC5B,UAAI,SAAS,SAAS,IAAI,GAAG;AAC3B;AAAA,MACF;AACA,UAAI,SAAS,SAAS,IAAI,GAAG;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,WAAW,SAAS,KAAK,KAAK,WAAW,SAAS,GAAG,GAAG;AAC1D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,eAAeA,OAAW,WAAuC;AA5E1E;AA8EE,MAAI,aAAa,YAAYA,OAAM,SAAS,GAAG;AAC7C,WAAO;AAAA,MACL,eAAe;AAAA,MACf,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,UAAUA;AAEd,SAAO,SAAS;AACd,UAAM,SAAS,QAAQ;AACvB,UAAM,aAAa,QAAQ;AAE3B,QAAI,CAAC,UAAU,CAAC,WAAY;AAG5B,QAAM,oBAAiB,MAAM,KAAK,OAAO,QAAQ,QAAQ,MAAM;AAC7D,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,QAAM,kBAAe,MAAM,KAAK,OAAO,QAAQ,QAAQ,MAAM;AAC3D,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAIA,QACI,uBAAoB,MAAM,KAC1B,qBAAkB,MAAM,KACxB,qBAAkB,MAAM;AAAA;AAAA,IAGvB,uBAAoB,MAAM,MACzB,0BAAuB,MAAM,KAC7B,8BAA2B,MAAM,KAAK,QAAQ,SAAS,OAAO,eAC9D,4BAAyB,MAAM,OAAK,YAAO,eAAP,mBAAmB,KAAK,UAAQ,SAAS,QAAQ,SAEzF;AACA,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,QACI,sBAAmB,MAAM;AAAA,IACzB,mBAAgB,MAAM;AAAA,IACtB,wBAAqB,MAAM;AAAA,IAC3B,qBAAkB,MAAM;AAAA,IACxB,mBAAgB,MAAM;AAAA,IACtB,4BAAyB,MAAM;AAAA,IAC/B,4BAAyB,MAAM;AAAA,IAC/B,uBAAoB,MAAM;AAAA,IAC1B,yBAAsB,MAAM;AAAA,IAC5B,uBAAoB,MAAM;AAAA,IAC1B,gCAA6B,MAAM;AAAA,IACnC,qCAAkC,MAAM;AAAA,IACxC,sBAAmB,MAAM;AAAA,IACzB,kBAAe,MAAM;AAAA,IACrB,uBAAoB,MAAM;AAAA,IAC1B,iBAAc,MAAM;AAAA,IACpB,qBAAkB,MAAM;AAAA,IACxB,gCAA6B,MAAM,GACrC;AAEA,UAAM,kBAAe,MAAM,KAAM,OAAe,gBAAgB,QAAQ,MAAM;AAC5E,eAAO;AAAA,UACL,eAAe;AAAA,UACf,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AACA,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,QAAM,iBAAc,MAAM,GAAG;AAE3B,UAAI,OAAO,SAAS,OAAO,MAAM,SAAS,QAAQ,IAAI,GAAG;AACvD,eAAO;AAAA,UACL,eAAe;AAAA,UACf,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,UAAM,mBAAgB,QAAQ,MAAM,KAAK,OAAO,MAAM,SAAS,QAAQ,MAAM,GAAG;AAC9E,eAAO;AAAA,UACL,eAAe;AAAA,UACf,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,QAAM,yBAAsB,MAAM,GAAG;AACnC,UAAI,OAAO,kBAAkB,OAAO,eAAe,mBAAmB,QAAQ,MAAM;AAClF,eAAO;AAAA,UACL,eAAe;AAAA,UACf,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,UAAM,sBAAmB,QAAQ,MAAM,KAAK,OAAO,mBAAmB,QAAQ,QAAQ;AACpF,eAAO;AAAA,UACL,eAAe;AAAA,UACf,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,QAAM,4BAAyB,MAAM,GAAG;AACtC,UAAI,OAAO,mBAAmB,QAAQ,MAAM;AAC1C,eAAO;AAAA,UACL,eAAe;AAAA,UACf,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,QAAM,kCAA+B,MAAM,GAAG;AAC5C,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,QAAM,mBAAgB,MAAM,KAAK,OAAO,QAAQ,QAAQ,MAAM;AAC5D,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,QAAM,sBAAmB,MAAM,KAAK,OAAO,aAAa,QAAQ,QAAQ,CAAC,OAAO,UAAU;AACxF,aAAO;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,QACI,yBAAsB,MAAM,KAC5B,wBAAqB,MAAM,KAC3B,6BAA0B,MAAM,GAClC;AAEA,UAAI,OAAO,QAAQ;AACjB,mBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,gBAAa,KAAK,KAAK,MAAM,gBAAgB;AACjD,kBAAM,WAAY,MAAM,eAAuB;AAC/C,gBAAI,uBAAuB,QAAQ,MAAM,QAAQ,GAAG;AAClD,qBAAO;AAAA,gBACL,eAAe;AAAA,gBACf,aAAa;AAAA,gBACb,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,cAAU;AAAA,EACZ;AAGA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAKA,SAAS,iBAAiBA,OAAoB;AAC5C,SAAO,CAAC,eAAeA,KAAI,EAAE;AAC/B;AAKA,SAAS,uBAAuB,YAAiB,gBAA8B;AAC7E,MAAI,CAAC,eAAgB,QAAO;AAE5B,MAAI,mBAAmB,WAAY,QAAO;AAE1C,MAAM,iBAAc,cAAc,GAAG;AACnC,WAAO,eAAe,MAAM,KAAK,CAAC,SAAc,uBAAuB,YAAY,IAAI,CAAC;AAAA,EAC1F;AAEA,MAAM,mBAAgB,cAAc,GAAG;AACrC,WAAO,eAAe,YAAY;AAAA,EACpC;AAEA,SAAO;AACT;AAKA,SAAS,gBAAgB,KAAsB;AAC7C,SAAO,WAAW,KAAK,GAAG;AAC5B;AAKA,SAAS,yBACP,cACA,KACA,WACkB;AAGlB,QAAM,UAAY,iBAAc,GAAG;AAGnC,MAAI,cAAc,YAAY,QAAQ,OAAO;AAC3C,YAAQ,QAAQ,EAAE,GAAG,QAAQ,OAAO,KAAK,IAAI,GAAG,KAAK,UAAU,IAAI;AAAA,EACrE;AAEA,SAAS,kBAAiB,cAAW,YAAY,GAAG,CAAC,OAAO,CAAC;AAC/D;AAKA,SAAS,mBAAmBA,OAAW,cAA+B;AACpE,QAAM,OAAOA,MAAK;AAGlB,MAAI,CAAG,oBAAiB,IAAI,GAAG;AAC7B,WAAO;AAAA,EACT;AAGA,MAAI,CAAG,gBAAa,KAAK,MAAM,KAAK,KAAK,OAAO,SAAS,cAAc;AACrE,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAGA,MAAI,CAAG,mBAAgB,KAAK,UAAU,CAAC,CAAC,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,SAAS,oBACPA,OACA,cACA,WACS;AAET,MAAI,iBAAiBA,KAAI,GAAG;AAC1B,WAAO;AAAA,EACT;AAGA,QAAM,aAAaA,MAAK;AACxB,MAAI,cAAc,mBAAmB,YAAY,YAAY,GAAG;AAC9D,WAAO,QAAQ,6EAAiB,YAAY,IAAIA,MAAK,KAAK,KAAK,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,cAAcA,MAAK,KAAK;AAC9B,MAAI,eAAe,OAAO,gBAAgB,YAAY,gBAAgB,WAAW,GAAG;AAClF,UAAM,MAAM,cAAc,WAAW;AAGrC,UAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,IAAAD,MAAK,YAAYC,eAAc;AAE/B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAsBA,eAAsB,wBAAgD;AAjatE;AAkaE,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,iBAAe,YAAO,gBAAP,mBAAoB,iBAAgB;AAEzD,SAAO,KAAK,2FAAqB,QAAQ;AACzC,SAAO,QAAQ;AAAA,iBACA,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,iBAC9B,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,iBAC9B,OAAO,WAAW,QAAG;AAAA,sBAChB,YAAY,EAAE;AAElC,SAAO,KAAK,2CAAa,SAAS;AAElC,MAAI;AACJ,MAAI;AAGJ,MAAI,OAAO,SAAS;AAClB,QAAI;AAEF,YAAM,YAAY,MAAM,gBAAgB,CAAC,GAAG,OAAO,OAAO,uBAAuB,GAAG,OAAO,OAAO;AAClG,UAAI,UAAU,SAAS,GAAG;AACxB,gBAAQ;AACR,4BAAoB,6BAAS,OAAO,OAAO;AAC3C,eAAO,KAAK,6EAAiB,OAAO,OAAO,IAAI,SAAS;AAAA,MAC1D,OAAO;AAEL,gBAAQ,MAAM,gBAAgB,OAAO,SAAS,OAAO,OAAO;AAC5D,4BAAoB;AACpB,eAAO,KAAK,gHAAsB,SAAS;AAAA,MAC7C;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ,MAAM,gBAAgB,OAAO,SAAS,OAAO,OAAO;AAC5D,0BAAoB;AACpB,aAAO,QAAQ,qDAAa,KAAK,gEAAc;AAAA,IACjD;AAAA,EACF,OAAO;AAEL,YAAQ,MAAM,gBAAgB,OAAO,SAAS,OAAO,OAAO;AAC5D,wBAAoB;AAAA,EACtB;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,KAAK,SAAI,iBAAiB,gEAAc,QAAQ;AACvD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,KAAK,gBAAM,MAAM,MAAM,8DAAiB,iBAAiB,KAAK,QAAQ;AAE7E,QAAM,UAAyB,CAAC;AAChC,MAAI,iBAAiB;AACrB,MAAI,cAAc;AAElB,aAAW,QAAQ,OAAO;AACxB;AACA,WAAO,KAAK,IAAI,cAAc,IAAI,MAAM,MAAM,+BAAW,IAAI,IAAI,SAAS;AAE1E,UAAM,OAAO,MAAMC,UAAS,MAAM,OAAO;AACzC,UAAM,aAA0B,EAAE,MAAM,QAAQ,CAAC,EAAE;AAEnD,QAAI;AACJ,QAAI;AACF,gBAAM,sBAAM,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,SAAS,CAAC,OAAO,cAAc,mBAAmB,qBAAqB,eAAe;AAAA,MACxF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO,KAAK,yCAAW,IAAI,IAAI,SAAS;AACxC,aAAO,QAAQ,6BAAS,KAAK,EAAE;AAC/B;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,MAAM,IAAI;AAEjC,aAAS,KAAK;AAAA;AAAA,MAEZ,cAAcF,OAAW;AACvB,cAAM,kBAAkB,eAAeA,OAAM,SAAS;AAEtD,cAAM,aAAaA,MAAK;AACxB,YAAI,cAAc,mBAAmB,YAAY,YAAY,EAAG;AAEhE,cAAM,cAAcA,MAAK,KAAK;AAC9B,YAAI,eAAe,OAAO,gBAAgB,YAAY,gBAAgB,WAAW,GAAG;AAClF,gBAAM,MAAMA,MAAK,KAAK;AACtB,cAAI,KAAK;AACP,uBAAW,OAAO,KAAK;AAAA,cACrB,MAAM,IAAI,MAAM;AAAA,cAChB,QAAQ,IAAI,MAAM;AAAA,cAClB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS,eAAeA,OAAM,SAAS;AAAA,cACvC,eAAe,gBAAgB;AAAA,cAC/B,aAAa,gBAAgB;AAAA,cAC7B,QAAQ,gBAAgB;AAAA,YAC1B,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,gBAAgBA,OAAW;AACzB,cAAM,kBAAkB,eAAeA,OAAM,SAAS;AAEtD,cAAM,aAAaA,MAAK;AACxB,YAAI,cAAc,mBAAmB,YAAY,YAAY,EAAG;AAGhE,QAAAA,MAAK,KAAK,OAAO,QAAQ,CAAC,UAAe;AA/gBjD,cAAAG;AAghBU,gBAAM,OAAMA,MAAA,MAAM,UAAN,gBAAAA,IAAa;AACzB,cAAI,OAAO,OAAO,QAAQ,YAAY,gBAAgB,GAAG,GAAG;AAC1D,kBAAM,MAAMH,MAAK,KAAK;AACtB,gBAAI,KAAK;AACP,yBAAW,OAAO,KAAK;AAAA,gBACrB,MAAM,IAAI,MAAM;AAAA,gBAChB,QAAQ,IAAI,MAAM;AAAA,gBAClB,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,SAAS,eAAeA,OAAM,SAAS;AAAA,gBACvC,eAAe,gBAAgB;AAAA,gBAC/B,aAAa,gBAAgB;AAAA,gBAC7B,QAAQ,gBAAgB;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAGD,QAAAA,MAAK,KAAK,YAAY,QAAQ,CAAC,SAAc;AAC3C,cAAM,mBAAgB,IAAI,KAAK,gBAAgB,KAAK,KAAK,GAAG;AAC1D,kBAAM,MAAM,KAAK;AACjB,gBAAI,KAAK;AACP,yBAAW,OAAO,KAAK;AAAA,gBACrB,MAAM,IAAI,MAAM;AAAA,gBAChB,QAAQ,IAAI,MAAM;AAAA,gBAClB,MAAM,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,SAAS,eAAeA,OAAM,SAAS;AAAA,gBACvC,eAAe,gBAAgB;AAAA,gBAC/B,aAAa,gBAAgB;AAAA,gBAC7B,QAAQ,gBAAgB;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,QAAQA,OAAW;AACjB,cAAM,YAAYA,MAAK,KAAK;AAC5B,YAAI,aAAa,OAAO,cAAc,YAAY,gBAAgB,SAAS,GAAG;AAC5E,gBAAM,kBAAkB,eAAeA,OAAM,SAAS;AAEtD,gBAAM,aAAaA,MAAK;AACxB,eACE,yCAAY,+BACZ,WAAW,KAAK,cAChB,mBAAmB,EAAE,MAAM,WAAW,KAAK,WAAW,GAAG,YAAY,GACrE;AACA;AAAA,UACF;AAEA,gBAAM,eAAe,UAAU,KAAK;AACpC,cAAI,cAAc;AAChB,kBAAM,MAAMA,MAAK,KAAK;AACtB,gBAAI,KAAK;AACP,yBAAW,OAAO,KAAK;AAAA,gBACrB,MAAM,IAAI,MAAM;AAAA,gBAChB,QAAQ,IAAI,MAAM;AAAA,gBAClB,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,SAAS,eAAeA,OAAM,SAAS;AAAA,gBACvC,eAAe,gBAAgB;AAAA,gBAC/B,aAAa,gBAAgB;AAAA,gBAC7B,QAAQ,gBAAgB;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,aAAaA,OAAW;AACtB,YACI,mBAAgBA,MAAK,KAAK,KAAK,KACjCA,MAAK,KAAK,MAAM,SAChB,OAAOA,MAAK,KAAK,MAAM,UAAU,YACjC,gBAAgBA,MAAK,KAAK,MAAM,KAAK,GACrC;AACA,gBAAM,kBAAkB,eAAeA,OAAM,SAAS;AAEtD,cACI,4BAAyBA,MAAK,KAAK,KAAK,KAC1CA,MAAK,KAAK,MAAM,cAChB,mBAAmB,EAAE,MAAMA,MAAK,KAAK,MAAM,WAAW,GAAG,YAAY,GACrE;AACA;AAAA,UACF;AAEA,gBAAM,iBAAiBA,MAAK,KAAK,MAAM;AACvC,gBAAM,MAAMA,MAAK,KAAK;AACtB,cAAI,KAAK;AACP,uBAAW,OAAO,KAAK;AAAA,cACrB,MAAM,IAAI,MAAM;AAAA,cAChB,QAAQ,IAAI,MAAM;AAAA,cAClB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS,eAAeA,OAAM,SAAS;AAAA,cACvC,eAAe,gBAAgB;AAAA,cAC/B,aAAa,gBAAgB;AAAA,cAC7B,QAAQ,gBAAgB;AAAA,YAC1B,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,WAAW,OAAO,SAAS,GAAG;AAChC,cAAQ,KAAK,UAAU;AACvB,qBAAe,WAAW,OAAO;AACjC,aAAO,KAAK,gBAAM,IAAI,iBAAO,WAAW,OAAO,MAAM,uEAAgB,QAAQ;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,gBAAM,IAAI,qEAAc;AAAA,IACzC;AAAA,EACF;AAEA,SAAO,QAAQ,kCAAS,SAAS;AACjC,SAAO,KAAK,6BAAS,QAAQ;AAC7B,SAAO,KAAK,6CAAe,cAAc,IAAI,QAAQ;AACrD,SAAO,KAAK,mDAAgB,QAAQ,MAAM,IAAI,QAAQ;AACtD,SAAO,KAAK,+DAAkB,WAAW,IAAI,QAAQ;AAErD,SAAO;AACT;AAKA,SAAS,eAAeA,OAAW,WAA6B;AAjpBhE;AAkpBE,QAAM,MAAMA,MAAK,KAAK;AACtB,MAAI,CAAC,OAAO,CAAC,UAAW,QAAO;AAE/B,QAAM,YAAY,IAAI,MAAM,OAAO;AACnC,MAAI,aAAa,KAAK,YAAY,UAAU,QAAQ;AAClD,aAAO,eAAU,SAAS,MAAnB,mBAAsB,WAAU;AAAA,EACzC;AACA,SAAO;AACT;AAEA,eAAsB,oBAAmC;AA5pBzD;AA6pBE,QAAM,SAAS,cAAc,IAAI;AAEjC,SAAO,KAAK,+EAAmB,QAAQ;AACvC,SAAO,QAAQ;AAAA,iBACA,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,iBAC9B,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,mBAC5B,OAAO,SAAS;AAAA,gBACnB,OAAO,MAAM;AAAA,iBACZ,OAAO,WAAW,QAAG,EAAE;AAEtC,SAAO,KAAK,yCAAgB,SAAS;AACrC,QAAM,cAAc;AAEpB,SAAO,KAAK,2CAAa,SAAS;AAClC,QAAM,QAAQ,MAAM,gBAAgB,OAAO,SAAS,OAAO,OAAO;AAElE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,KAAK,0DAAa,QAAQ;AACjC;AAAA,EACF;AAEA,SAAO,KAAK,gBAAM,MAAM,MAAM,+CAAY,QAAQ;AAClD,SAAO,QAAQ,6BAAS,MAAM,KAAK,IAAI,CAAC,EAAE;AAG1C,QAAM,iBAAe,YAAO,gBAAP,mBAAoB,iBAAgB;AACzD,QAAM,cAAY,YAAO,gBAAP,mBAAoB,cAAa;AACnD,QAAM,sBAAoB,kBAAO,gBAAP,mBAAoB,eAApB,mBAAgC,YAAW;AACrE,QAAM,mBAAiB,kBAAO,gBAAP,mBAAoB,eAApB,mBAAgC,mBAAkB;AACzE,QAAM,YAAU,kBAAO,gBAAP,mBAAoB,eAApB,mBAAgC,YAAW,CAAC;AAG5D,QAAM,mBAAiB,YAAO,gBAAP,mBAAoB,mBAAkB;AAAA,IAC3D,SAAS;AAAA,IACT,qBAAqB;AAAA,IACrB,eAAe;AAAA,EACjB;AAEA,SAAO,QAAQ;AAAA,4BACJ,YAAY;AAAA,kCACX,SAAS;AAAA,kCACT,oBAAoB,iBAAO,cAAI;AAAA,kCAC/B,cAAc;AAAA,oDACX,eAAe,UAAU,iBAAO,cAAI;AAAA,kCACvC,eAAe,aAAa,EAAE;AAG1C,MAAI,iBAAiB;AACrB,MAAI,gBAAgB;AACpB,MAAI,oBAAoB;AAGxB,QAAM,gBAAgB,IAAI,cAAc;AAExC,aAAW,QAAQ,OAAO;AACxB;AACA,WAAO,KAAK,IAAI,cAAc,IAAI,MAAM,MAAM,+BAAW,IAAI,IAAI,SAAS;AAC1E,WAAO,QAAQ,yCAAW,IAAI,EAAE;AAChC,UAAM,OAAO,MAAME,UAAS,MAAM,OAAO;AAEzC,QAAI;AACJ,QAAI;AACF,gBAAM,sBAAM,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,SAAS,CAAC,OAAO,cAAc,mBAAmB,qBAAqB,eAAe;AAAA,MACxF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO,KAAK,yCAAW,IAAI,IAAI,SAAS;AACxC,aAAO,QAAQ,6BAAS,KAAK,EAAE;AAC/B;AAAA,IACF;AAGA,kBAAc,MAAM;AAGpB,QAAI,iBAAiB;AACrB,QAAI,mBAAmB;AAEvB,aAAS,KAAK;AAAA;AAAA,MAEZ,cAAcF,OAAW;AACvB,YAAI,oBAAoBA,OAAM,cAAc,SAAS,GAAG;AACtD,2BAAiB;AACjB;AACA,gBAAM,cAAcA,MAAK,KAAK;AAC9B,iBAAO;AAAA,YACL,oCAAW,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,WAAW,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UACrI;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,gBAAgBA,OAAW;AA1vBjC,YAAAG;AA4vBQ,YAAI,CAAC,eAAe,SAAS;AAC3B;AAAA,QACF;AAGA,YAAI,iBAAiBH,KAAI,GAAG;AAC1B;AAAA,QACF;AAGA,cAAM,aAAaA,MAAK;AACxB,aAAI,yCAAY,eAAc,mBAAmB,WAAW,YAAY,YAAY,GAAG;AACrF,iBAAO,QAAQ,4FAAiB;AAChC;AAAA,QACF;AAEA,cAAM,OAAMG,MAAAH,MAAK,KAAK,UAAV,gBAAAG,IAAiB;AAC7B,YAAI,OAAO,OAAO,QAAQ,YAAY,gBAAgB,GAAG,GAAG;AAE1D,gBAAM,iBAAiB,IAAI,MAAM,mBAAmB;AACpD,cAAI,kBAAkB,eAAe,SAAS,GAAG;AAE/C,gBAAI,eAAe,kBAAkB,gBAAgB;AAEnD,oBAAM,SAAS,IAAI,QAAQ,qBAAqB,CAAC,UAAkB;AACjE,sBAAM,MAAM,cAAc,KAAK;AAC/B,sBAAM,YAAY,cAAc,WAAW,MAAM;AACjD,uBAAO,OAAO,eAAe,MAAM,YAAY,MAAM,YAAY;AAAA,cACnE,CAAC;AACD,cAAAH,MAAK,KAAK,MAAM,MAAM;AACtB,cAAAA,MAAK,KAAK,MAAM,SAAS;AACzB,+BAAiB;AACjB;AACA,qBAAO,QAAQ,wGAAmB;AAAA,YACpC,OAAO;AAEL,oBAAM,YAAY;AAClB,oBAAM,WAAW,IAAI;AAAA,gBACnB;AAAA,gBACA,CAAC,UAAkB,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS;AAAA,cACrD;AACA,oBAAM,QAAQ,SACX,MAAM,IAAI,OAAO,GAAG,SAAS,uBAAuB,SAAS,IAAI,GAAG,CAAC,EACrE,OAAO,OAAO;AACjB,kBAAI,SAAS;AAGb,oBAAM,YAAY,cAAc,WAAW,MAAM;AAEjD,yBAAW,QAAQ,OAAO;AACxB,oBAAI,qBAAqB,KAAK,IAAI,GAAG;AACnC,wBAAM,MAAM,cAAc,IAAI;AAC9B,4BAAU,OAAO,eAAe,MAAM,YAAY,MAAM,YAAY;AAAA,gBACtE,OAAO;AACL,4BAAU;AAAA,gBACZ;AAAA,cACF;AACA,cAAAA,MAAK,KAAK,MAAM,MAAM;AACtB,cAAAA,MAAK,KAAK,MAAM,SAAS;AACzB,+BAAiB;AACjB;AACA,qBAAO,QAAQ,GAAG,eAAe,aAAa,4FAAiB;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,gBAAgBA,OAAW;AAEzB,cAAM,aAAaA,MAAK;AACxB,YAAI,cAAc,mBAAmB,YAAY,YAAY,GAAG;AAC9D,iBAAO,QAAQ,gFAAe;AAC9B;AAAA,QACF;AAGA,YAAI,iBAAiBA,KAAI,GAAG;AAC1B;AAAA,QACF;AAGA,YAAI,CAAC,eAAe,SAAS;AAC3B;AAAA,QACF;AAGA,YAAI,cAAc;AAGlB,QAAAA,MAAK,KAAK,OAAO,QAAQ,CAAC,UAAe;AAt1BjD,cAAAG;AAu1BU,gBAAIA,MAAA,+BAAO,UAAP,gBAAAA,IAAc,QAAO,gBAAgB,MAAM,MAAM,GAAG,GAAG;AACzD,kBAAM,MAAM,MAAM,MAAM;AAExB,kBAAM,iBAAiB,IAAI,MAAM,mBAAmB;AAEpD,gBAAI,kBAAkB,eAAe,SAAS,GAAG;AAE/C,oBAAM,SAAS,IAAI,QAAQ,qBAAqB,CAAC,UAAkB;AACjE,sBAAM,MAAM,cAAc,KAAK;AAC/B,sBAAM,YAAY,cAAc,WAAW,MAAM;AACjD,uBAAO,OAAO,eAAe,MAAM,YAAY,MAAM,YAAY;AAAA,cACnE,CAAC;AAED,kBAAI,WAAW,KAAK;AAClB,sBAAM,MAAM,MAAM;AAClB,sBAAM,MAAM,SAAS;AACrB,8BAAc;AAAA,cAChB;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAGD,YAAIH,MAAK,KAAK,aAAa;AACzB,UAAAA,MAAK,KAAK,YAAY,QAAQ,CAAC,MAAW,UAAkB;AAC1D,gBAAM,mBAAgB,IAAI,KAAK,gBAAgB,KAAK,KAAK,GAAG;AAC1D,oBAAM,cAAc,KAAK;AACzB,oBAAM,MAAM,cAAc,WAAW;AACrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,KAAK,YAAY,KAAK,IAAIC;AAC/B,4BAAc;AACd,qBAAO;AAAA,gBACL,gGAAqB,WAAW,QAAQ,YAAY,KAAK,GAAG;AAAA,cAC9D;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAGA,YACED,MAAK,KAAK,eACVA,MAAK,KAAK,YAAY,WAAW,KACjCA,MAAK,KAAK,UACVA,MAAK,KAAK,OAAO,WAAW,GAC5B;AACA,gBAAM,aAAaA,MAAK,KAAK,OAAO,CAAC;AACrC,eAAI,yCAAY,UAAS,WAAW,MAAM,QAAQ,QAAW;AAC3D,kBAAM,gBAAgB,WAAW,MAAM;AACvC,gBAAI,gBAAgB,aAAa,GAAG;AAElC,oBAAM,MAAM,cAAc,aAAa;AACvC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,YAAYC,eAAc;AAC/B,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,6DAAgB,aAAa,SAAS,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACrI;AACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,aAAa;AACf,2BAAiB;AACjB;AACA,iBAAO,QAAQ,wGAAmB;AAAA,QACpC;AAAA,MACF;AAAA;AAAA,MAGA,QAAQD,OAAW;AACjB,cAAM,YAAYA,MAAK,KAAK;AAC5B,YAAI,aAAa,OAAO,cAAc,YAAY,gBAAgB,SAAS,GAAG;AAE5E,gBAAM,aAAaA,MAAK;AACxB,eACE,yCAAY,+BACZ,WAAW,KAAK,cAChB,mBAAmB,EAAE,MAAM,WAAW,KAAK,WAAW,GAAG,YAAY,GACrE;AACA,mBAAO,QAAQ,oEAAkB,YAAY,IAAI,UAAU,KAAK,CAAC,GAAG;AACpE;AAAA,UACF;AAEA,gBAAM,eAAe,UAAU,KAAK;AACpC,cAAI,cAAc;AAEhB,kBAAM,MAAM,cAAc,YAAY;AAGtC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,YAAc,0BAAuBC,eAAc,CAAC;AAEzD,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,iCAAa,YAAY,SAAS,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACjI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,aAAaD,OAAW;AACtB,YACI,mBAAgBA,MAAK,KAAK,KAAK,KACjCA,MAAK,KAAK,MAAM,SAChB,OAAOA,MAAK,KAAK,MAAM,UAAU,YACjC,gBAAgBA,MAAK,KAAK,MAAM,KAAK,GACrC;AAEA,cACI,4BAAyBA,MAAK,KAAK,KAAK,KAC1CA,MAAK,KAAK,MAAM,cAChB,mBAAmB,EAAE,MAAMA,MAAK,KAAK,MAAM,WAAW,GAAG,YAAY,GACrE;AACA,mBAAO,QAAQ,oEAAkB,YAAY,IAAIA,MAAK,KAAK,MAAM,KAAK,GAAG;AACzE;AAAA,UACF;AAEA,gBAAM,iBAAiBA,MAAK,KAAK,MAAM;AACvC,gBAAM,MAAM,cAAc,cAAc;AAGxC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,QAAU,0BAAuBC,eAAc;AAEzD,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,iCAAa,cAAc,SAAS,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UACnI;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,uBAAuBD,OAAW;AAChC,cAAM,aAAaA,MAAK,KAAK;AAG7B,YAAI,mBAAmB,EAAE,MAAM,WAAW,GAAG,YAAY,GAAG;AAC1D,iBAAO,QAAQ,0EAAmB,YAAY,OAAO;AACrD;AAAA,QACF;AAEA,YAAM,mBAAgB,UAAU,KAAK,gBAAgB,WAAW,KAAK,GAAG;AACtE,gBAAM,cAAc,WAAW;AAC/B,gBAAM,MAAM,cAAc,WAAW;AAGrC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,aAAaC;AAEvB,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,iFAAqB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UACvI;AAAA,QACF,WAEW,qBAAkB,UAAU,GAAG;AACxC,cAAI,uBAAuB;AAG3B,qBAAW,OAAO,QAAQ,CAAC,UAAe;AACxC,gBAAI,gBAAgB,MAAM,MAAM,GAAG,GAAG;AACpC,qCAAuB;AAAA,YACzB;AAAA,UACF,CAAC;AAGD,qBAAW,YAAY,QAAQ,CAAC,SAAc;AAC5C,gBAAM,mBAAgB,IAAI,KAAK,gBAAgB,KAAK,KAAK,GAAG;AAC1D,qCAAuB;AAAA,YACzB;AAAA,UACF,CAAC;AAGD,cAAI,sBAAsB;AAExB,mBAAO,QAAQ,2JAA8B;AAAA,UAC/C;AAAA,QACF,WAEW,2BAAwB,UAAU,GAAG;AAE9C,iBAAO,QAAQ,mIAA0B;AAAA,QAC3C;AAAA,MACF;AAAA;AAAA,MAGA,sBAAsBD,OAAW;AAE/B,YAAI,mBAAmBA,OAAM,YAAY,GAAG;AAC1C,iBAAO,QAAQ,gFAAe;AAC9B;AAAA,QACF;AAGA,YAAM,mBAAgBA,MAAK,KAAK,IAAI,KAAK,gBAAgBA,MAAK,KAAK,KAAK,KAAK,GAAG;AAE9E,cAAI,mBAAmB,EAAE,MAAMA,MAAK,KAAK,KAAK,GAAG,YAAY,GAAG;AAC9D,mBAAO,QAAQ,wGAAmB;AAAA,UACpC,OAAO;AACL,kBAAM,cAAcA,MAAK,KAAK,KAAK;AACnC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,OAAOC;AAEjB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,gGAAqB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACvI;AAAA,UACF;AAAA,QACF;AAGA,SAAC,cAAc,WAAW,EAAE,QAAQ,CAAC,QAAQ;AAC3C,gBAAM,OAAOD,MAAK,KAAK,GAAG;AAG1B,cAAI,mBAAmB,EAAE,KAAK,GAAG,YAAY,GAAG;AAC9C,mBAAO;AAAA,cACL,iFAAgB,QAAQ,eAAe,iBAAO,cAAI;AAAA,YACpD;AACA;AAAA,UACF;AAGA,cAAM,mBAAgB,IAAI,KAAK,gBAAgB,KAAK,KAAK,GAAG;AAC1D,kBAAM,cAAc,KAAK;AACzB,kBAAM,UAAU,cAAc,WAAW;AAGzC,kBAAMC,kBAAiB,yBAAyB,cAAc,SAAS,SAAS;AAChF,YAAAD,MAAK,KAAK,GAAG,IAAIC;AAEjB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,8EAAkB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,OAAO,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACxI;AAAA,UACF,WAEW,qBAAkB,IAAI,GAAG;AAElC,gBAAI,KAAK,YAAY,WAAW,KAAK,KAAK,OAAO,WAAW,GAAG;AAC7D,oBAAM,aAAa,KAAK,OAAO,CAAC;AAChC,oBAAM,cAAc,KAAK,OAAO,CAAC;AACjC,oBAAM,OAAO,KAAK,YAAY,CAAC;AAG/B,kBAAI,cAAc,eAAe,QAAU,gBAAa,IAAI,GAAG;AAE7D,oBAAI,gBAAgB,WAAW,MAAM,GAAG,KAAK,WAAW,MAAM,IAAI,KAAK,MAAM,IAAI;AAC/E,wBAAM,cAAc,WAAW,MAAM;AACrC,wBAAMG,OAAM,cAAc,WAAW;AAGrC,wBAAMH,kBAAiB,yBAAyB,cAAcG,MAAK,SAAS;AAC5E,wBAAM,SAAW,oBAAiB,KAAKH,iBAAgB,IAAI;AAE3D,kBAAAD,MAAK,KAAKI,IAAG,IAAI;AACjB,mCAAiB;AACjB;AACA,yBAAO;AAAA,oBACL,mHAAyB,WAAW,iBAAiB,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAGA,IAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,kBACpJ;AAAA,gBACF;AAGA,oBAAI,gBAAgB,YAAY,MAAM,GAAG,KAAK,YAAY,MAAM,IAAI,KAAK,MAAM,IAAI;AACjF,wBAAM,cAAc,YAAY,MAAM;AACtC,wBAAMA,OAAM,cAAc,WAAW;AAGrC,wBAAMH,kBAAiB,yBAAyB,cAAcG,MAAK,SAAS;AAC5E,wBAAM,SAAW,oBAAiB,KAAK,MAAMH,eAAc;AAE3D,kBAAAD,MAAK,KAAKI,IAAG,IAAI;AACjB,mCAAiB;AACjB;AACA,yBAAO;AAAA,oBACL,2HAAiC,WAAW,gBAAgB,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAGA,IAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,kBAC3J;AAAA,gBACF;AAAA,cACF;AAAA,YACF,OAEK;AAEH,qBAAO,QAAQ,4IAAyB;AAAA,YAC1C;AAAA,UACF,WAEW,2BAAwB,IAAI,GAAG;AAExC,mBAAO,QAAQ,wGAAmB;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,eAAeJ,OAAW;AACxB,cAAM,YAAYA,MAAK,KAAK;AAG5B,YAAI,mBAAmB,EAAE,MAAM,UAAU,GAAG,YAAY,GAAG;AACzD,iBAAO,QAAQ,gFAAe;AAC9B;AAAA,QACF;AAGA,YACI,mBAAgB,SAAS,KAC3B,CAACA,MAAK,KAAK,YACX,gBAAgB,UAAU,KAAK,GAC/B;AAEA,cAAI,CAAC,iBAAiBA,MAAK,IAAI,OAAO,CAAC,GAAG;AACxC,kBAAM,cAAc,UAAU;AAC9B,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,QAAQC;AAElB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,gDAAa,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YAC/H;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,iBAAiBD,OAAW;AAC1B,QAAAA,MAAK,KAAK,WAAW,QAAQ,CAAC,aAAkB;AAC9C,cACI,oBAAiB,QAAQ,KACzB,mBAAgB,SAAS,KAAK,KAChC,gBAAgB,SAAS,MAAM,KAAK,GACpC;AAEA,gBAAI,CAAC,iBAAiBA,KAAI,GAAG;AAC3B,oBAAM,cAAc,SAAS,MAAM;AACnC,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,uBAAS,QAAQA;AAEjB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,8EAAkB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACpI;AAAA,YACF;AAAA,UACF,WAEW,oBAAiB,QAAQ,KAAO,sBAAmB,SAAS,KAAK,GAAG;AAE7E,qBAAS,MAAM,WAAW,QAAQ,CAAC,eAAoB;AACrD,kBACI,oBAAiB,UAAU,KAC3B,mBAAgB,WAAW,KAAK,KAClC,gBAAgB,WAAW,MAAM,KAAK,GACtC;AACA,sBAAM,cAAc,WAAW,MAAM;AACrC,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,2BAAW,QAAQA;AAEnB,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,wEAAiB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBACnI;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,eAAeD,OAAW;AAExB,YAAI,mBAAmBA,OAAM,YAAY,GAAG;AAC1C,iBAAO,QAAQ,6EAAiB,YAAY,OAAO;AACnD;AAAA,QACF;AAGA,YAAM,gBAAaA,MAAK,KAAK,MAAM,KAAKA,MAAK,KAAK,OAAO,SAAS,YAAY;AAE5E,cAAIA,MAAK,KAAK,UAAU,WAAW,GAAG;AACpC,kBAAM,eAAeA,MAAK,KAAK,UAAU,CAAC;AAG1C,gBAAM,mBAAgB,YAAY,KAAK,gBAAgB,aAAa,KAAK,GAAG;AAC1E,oBAAM,cAAc,aAAa;AACjC,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,KAAK,UAAU,CAAC,IAAIC;AAEzB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,8CAAqB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACvI;AAAA,YACF,WAEW,qBAAkB,YAAY,GAAG;AAE1C,qBAAO,QAAQ,wHAA8B;AAAA,YAC/C,WAEW,sBAAmB,YAAY,GAAG;AAE3C,qBAAO,QAAQ,wHAA8B;AAAA,YAC/C,WAEW,qBAAkB,YAAY,GAAG;AAE1C,qBAAO,QAAQ,wHAA8B;AAAA,YAC/C;AAAA,UACF;AAAA,QACF;AAGA,YACI,oBAAiBD,MAAK,KAAK,MAAM,KACjC,sBAAmBA,MAAK,KAAK,OAAO,MAAM,KAC1C,gBAAaA,MAAK,KAAK,OAAO,OAAO,QAAQ,KAC/CA,MAAK,KAAK,OAAO,OAAO,SAAS,SAAS,YAC1C;AAEA,cAAIA,MAAK,KAAK,UAAU,WAAW,GAAG;AACpC,kBAAM,WAAWA,MAAK,KAAK,UAAU,CAAC;AAGtC,gBAAM,mBAAgB,QAAQ,KAAK,gBAAgB,SAAS,KAAK,GAAG;AAClE,oBAAM,cAAc,SAAS;AAC7B,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,KAAK,UAAU,CAAC,IAAIC;AAEzB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,wCAAoB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACtI;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,YACI,gBAAaD,MAAK,KAAK,MAAM,KAC/BA,MAAK,KAAK,OAAO,KAAK,WAAW,KAAK,KACtCA,MAAK,KAAK,OAAO,KAAK,SAAS,KAC/BA,MAAK,KAAK,OAAO,KAAK,CAAC,EAAE,YAAY,MAAMA,MAAK,KAAK,OAAO,KAAK,CAAC,GAClE;AAEA,cAAIA,MAAK,KAAK,UAAU,WAAW,GAAG;AACpC,kBAAM,WAAWA,MAAK,KAAK,UAAU,CAAC;AAGtC,gBAAM,mBAAgB,QAAQ,KAAK,gBAAgB,SAAS,KAAK,GAAG;AAClE,oBAAM,cAAc,SAAS;AAC7B,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,KAAK,UAAU,CAAC,IAAIC;AAEzB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,kDAAoB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACtI;AAAA,YACF,WAEW,qBAAkB,QAAQ,GAAG;AAEtC,qBAAO,QAAQ,4HAA6B;AAAA,YAC9C,WAEW,sBAAmB,QAAQ,GAAG;AAEvC,qBAAO,QAAQ,4HAA6B;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AAGA,YACI,gBAAaD,MAAK,KAAK,MAAM,KAC/B,CAAC,SAAS,WAAW,QAAQ,EAAE,SAASA,MAAK,KAAK,OAAO,IAAI,GAC7D;AAEA,UAAAA,MAAK,KAAK,UAAU,QAAQ,CAAC,KAAU,UAAkB;AACvD,gBAAM,mBAAgB,GAAG,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACxD,oBAAM,cAAc,IAAI;AACxB,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,KAAK,UAAU,KAAK,IAAIC;AAE7B,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,eAAKD,MAAK,KAAK,OAAO,IAAI,8BAAU,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACtJ;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAGA,QAAAA,MAAK,KAAK,UAAU,QAAQ,CAAC,KAAU,UAAkB;AACvD,cAAM,mBAAgB,GAAG,KAAK,gBAAgB,IAAI,KAAK,GAAG;AAExD,gBAAI,CAAC,iBAAiBA,MAAK,IAAI,aAAa,KAAK,EAAE,CAAC,GAAG;AACrD,oBAAM,cAAc,IAAI;AACxB,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,cAAAD,MAAK,KAAK,UAAU,KAAK,IAAIC;AAE7B,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,sDAAc,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cAChI;AAAA,YACF;AAAA,UACF;AAGA,cAAM,sBAAmB,GAAG,GAAG;AAC7B,gBAAI,WAAW,QAAQ,CAAC,SAAc;AACpC,kBACI,oBAAiB,IAAI,KACrB,mBAAgB,KAAK,KAAK,KAC5B,gBAAgB,KAAK,MAAM,KAAK,GAChC;AACA,sBAAM,cAAc,KAAK,MAAM;AAC/B,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,qBAAK,QAAQA;AAEb,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,gGAAqB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBACvI;AAAA,cACF;AAGA,kBAAM,oBAAiB,IAAI,KAAO,sBAAmB,KAAK,KAAK,GAAG;AAChE,qBAAK,MAAM,WAAW,QAAQ,CAAC,eAAoB;AACjD,sBACI,oBAAiB,UAAU,KAC3B,mBAAgB,WAAW,KAAK,KAClC,gBAAgB,WAAW,MAAM,KAAK,GACtC;AACA,0BAAM,cAAc,WAAW,MAAM;AACrC,0BAAM,MAAM,cAAc,WAAW;AAGrC,0BAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,+BAAW,QAAQA;AAEnB,qCAAiB;AACjB;AACA,2BAAO;AAAA,sBACL,gGAAqB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,oBACvI;AAAA,kBACF;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,mBAAmBD,OAAW;AAC5B,cAAM,OAAOA,MAAK,KAAK;AAGvB,YAAI,QAAQ,mBAAmB,EAAE,MAAM,KAAK,GAAG,YAAY,GAAG;AAC5D,iBAAO,QAAQ,gFAAe;AAC9B;AAAA,QACF;AAEA,YAAM,mBAAgB,IAAI,KAAK,gBAAgB,KAAK,KAAK,GAAG;AAC1D,gBAAM,cAAc,KAAK;AACzB,gBAAM,MAAM,cAAc,WAAW;AAGrC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,OAAOC;AAEjB,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,gDAAa,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UAC/H;AAAA,QACF,WAEW,qBAAkB,IAAI,GAAG;AAElC,iBAAO,QAAQ,0HAAsB;AAAA,QACvC,WAEW,sBAAmB,IAAI,GAAG;AAEnC,iBAAO,QAAQ,0HAAsB;AAAA,QACvC,WAEW,qBAAkB,IAAI,GAAG;AAElC,iBAAO,QAAQ,0HAAsB;AAAA,QACvC,WAEW,oBAAiB,IAAI,GAAG;AAEjC,iBAAO,QAAQ,oHAAqB;AAAA,QACtC,WAEW,2BAAwB,IAAI,GAAG;AAExC,iBAAO,QAAQ,0HAAsB;AAAA,QACvC;AAAA,MACF;AAAA;AAAA,MAGA,gBAAgBD,OAAW;AACzB,QAAAA,MAAK,KAAK,SAAS,QAAQ,CAAC,SAAc,UAAkB;AAE1D,cAAI,WAAW,mBAAmB,EAAE,MAAM,QAAQ,GAAG,YAAY,GAAG;AAClE,mBAAO,QAAQ,0EAAc;AAC7B;AAAA,UACF;AAEA,cAAM,mBAAgB,OAAO,KAAK,gBAAgB,QAAQ,KAAK,GAAG;AAChE,kBAAM,cAAc,QAAQ;AAC5B,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,SAAS,KAAK,IAAIC;AAE5B,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,0CAAY,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YAC9H;AAAA,UACF;AAEA,cAAM,sBAAmB,OAAO,GAAG;AACjC,oBAAQ,WAAW,QAAQ,CAAC,SAAc;AACxC,kBACI,oBAAiB,IAAI,KACrB,mBAAgB,KAAK,KAAK,KAC5B,gBAAgB,KAAK,MAAM,KAAK,GAChC;AACA,sBAAM,cAAc,KAAK,MAAM;AAC/B,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,qBAAK,QAAQA;AAEb,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,oFAAmB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBACrI;AAAA,cACF,WAEW,oBAAiB,IAAI,KAAO,sBAAmB,KAAK,KAAK,GAAG;AACrE,qBAAK,MAAM,WAAW,QAAQ,CAAC,eAAoB;AACjD,sBACI,oBAAiB,UAAU,KAC3B,mBAAgB,WAAW,KAAK,KAClC,gBAAgB,WAAW,MAAM,KAAK,GACtC;AACA,0BAAM,cAAc,WAAW,MAAM;AACrC,0BAAM,MAAM,cAAc,WAAW;AAGrC,0BAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,+BAAW,QAAQA;AAEnB,qCAAiB;AACjB;AACA,2BAAO;AAAA,sBACL,oFAAmB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,oBACrI;AAAA,kBACF;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,qBAAqBD,OAAW;AAE9B,YAAI,mBAAmB,EAAE,MAAMA,MAAK,KAAK,MAAM,GAAG,YAAY,GAAG;AAC/D,iBAAO,QAAQ,4FAAiB;AAChC;AAAA,QACF;AAGA,YACI,sBAAmBA,MAAK,KAAK,IAAI,KACjC,mBAAgBA,MAAK,KAAK,KAAK,KACjC,gBAAgBA,MAAK,KAAK,MAAM,KAAK,GACrC;AACA,gBAAM,cAAcA,MAAK,KAAK,MAAM;AACpC,gBAAM,MAAM,cAAc,WAAW;AAGrC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,QAAQC;AAElB,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,4DAAe,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UACjI;AAAA,QACF,WAEW,sBAAmBD,MAAK,KAAK,IAAI,KAAO,qBAAkBA,MAAK,KAAK,KAAK,GAAG;AAErF,iBAAO,QAAQ,4IAAyB;AAAA,QAC1C,WAEW,sBAAmBA,MAAK,KAAK,IAAI,KAAO,sBAAmBA,MAAK,KAAK,KAAK,GAAG;AAEtF,iBAAO,QAAQ,4IAAyB;AAAA,QAC1C,WAEW,sBAAmBA,MAAK,KAAK,IAAI,KAAO,qBAAkBA,MAAK,KAAK,KAAK,GAAG;AAErF,iBAAO,QAAQ,4IAAyB;AAAA,QAC1C,WAGI,sBAAmBA,MAAK,KAAK,IAAI,KACjC,2BAAwBA,MAAK,KAAK,KAAK,GACzC;AAEA,iBAAO,QAAQ,4IAAyB;AAAA,QAC1C;AAAA,MACF;AAAA;AAAA,MAGA,iBAAiBA,OAAW;AAE1B,YAAM,mBAAgBA,MAAK,KAAK,IAAI,KAAK,gBAAgBA,MAAK,KAAK,KAAK,KAAK,GAAG;AAE9E,cAAI,CAAC,mBAAmB,EAAE,MAAMA,MAAK,KAAK,KAAK,GAAG,YAAY,GAAG;AAC/D,kBAAM,cAAcA,MAAK,KAAK,KAAK;AACnC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,OAAOC;AAEjB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,oFAAmB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACrI;AAAA,UACF;AAAA,QACF;AAGA,YAAM,mBAAgBD,MAAK,KAAK,KAAK,KAAK,gBAAgBA,MAAK,KAAK,MAAM,KAAK,GAAG;AAEhF,cAAI,CAAC,mBAAmB,EAAE,MAAMA,MAAK,KAAK,MAAM,GAAG,YAAY,GAAG;AAChE,kBAAM,cAAcA,MAAK,KAAK,MAAM;AACpC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,QAAQC;AAElB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,oFAAmB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACrI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,WAAWD,OAAW;AAEpB,YAAM,mBAAgBA,MAAK,KAAK,IAAI,KAAK,gBAAgBA,MAAK,KAAK,KAAK,KAAK,GAAG;AAE9E,cAAI,mBAAmB,EAAE,MAAMA,MAAK,KAAK,KAAK,GAAG,YAAY,GAAG;AAC9D,mBAAO,QAAQ,iFAA0B;AAAA,UAC3C,OAAO;AACL,kBAAM,cAAcA,MAAK,KAAK,KAAK;AACnC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,OAAOC;AAEjB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,6DAA0B,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YAC5I;AAAA,UACF;AAAA,QACF;AAGA,QAAAD,MAAK,KAAK,WAAW,QAAQ,CAAC,cAAmB;AAC/C,cACI,qBAAkB,SAAS,KAC3B,mBAAgB,UAAU,QAAQ,KACpC,gBAAgB,UAAU,SAAS,KAAK,GACxC;AAEA,gBACE,UAAU,YACV,mBAAmB,EAAE,MAAM,UAAU,SAAS,GAAG,YAAY,GAC7D;AACA,qBAAO,QAAQ,8GAAyB;AAAA,YAC1C,OAAO;AACL,oBAAM,cAAc,UAAU,SAAS;AACvC,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,wBAAU,WAAWA;AAErB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,4FAAgC,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cAClJ;AAAA,YACF;AAAA,UACF;AAGA,cACI,yBAAsB,SAAS,KAC/B,mBAAgB,UAAU,UAAU,KACtC,gBAAgB,UAAU,WAAW,KAAK,GAC1C;AAEA,gBAAI,mBAAmB,EAAE,MAAM,UAAU,WAAW,GAAG,YAAY,GAAG;AACpE,qBAAO,QAAQ,oHAA0B;AAAA,YAC3C,OAAO;AACL,oBAAM,cAAc,UAAU,WAAW;AACzC,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,wBAAU,aAAaA;AAEvB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,sGAA2B,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cAC7I;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,aAAaD,OAAW;AACtB,cAAM,cAAcA,MAAK,KAAK;AAG9B,YAAI,eAAe,mBAAmB,EAAE,MAAM,YAAY,GAAG,YAAY,GAAG;AAC1E,iBAAO,QAAQ,gFAAe;AAC9B;AAAA,QACF;AAGA,YAAM,mBAAgB,WAAW,KAAK,gBAAgB,YAAY,KAAK,GAAG;AACxE,gBAAM,cAAc,YAAY;AAChC,gBAAM,MAAM,cAAc,WAAW;AAGrC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,cAAcC;AAExB,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,gDAAa,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UAC/H;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,cAAcD,OAAW;AACvB,cAAM,YAAYA,MAAK,KAAK;AAG5B,YAAI,aAAa,mBAAmB,EAAE,MAAM,UAAU,GAAG,YAAY,GAAG;AACtE,iBAAO,QAAQ,sFAAgB;AAC/B;AAAA,QACF;AAGA,YAAI,aAAe,mBAAgB,SAAS,KAAK,gBAAgB,UAAU,KAAK,GAAG;AACjF,gBAAM,cAAc,UAAU;AAC9B,gBAAM,MAAM,cAAc,WAAW;AAGrC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,QAAQC;AAElB,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,sDAAc,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UAChI;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,kBAAkBD,OAAW;AAE3B,YAAIA,MAAK,KAAK,SAAS,mBAAmB,EAAE,MAAMA,MAAK,KAAK,MAAM,GAAG,YAAY,GAAG;AAClF,iBAAO,QAAQ,4FAAiB;AAChC;AAAA,QACF;AAGA,YAAM,mBAAgBA,MAAK,KAAK,KAAK,KAAK,gBAAgBA,MAAK,KAAK,MAAM,KAAK,GAAG;AAEhF,cAAI,CAAC,iBAAiBA,KAAI,GAAG;AAC3B,kBAAM,cAAcA,MAAK,KAAK,MAAM;AACpC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,YAAAD,MAAK,KAAK,QAAQC;AAElB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,4DAAe,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACjI;AAAA,UACF;AAAA,QACF,WAAa,qBAAkBD,MAAK,KAAK,KAAK,GAAG;AAE/C,cAAI,uBAAuB;AAG3B,UAAAA,MAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,UAAe;AAC7C,gBAAI,gBAAgB,MAAM,MAAM,GAAG,GAAG;AACpC,qCAAuB;AAAA,YACzB;AAAA,UACF,CAAC;AAGD,UAAAA,MAAK,KAAK,MAAM,YAAY,QAAQ,CAAC,SAAc;AACjD,gBAAM,mBAAgB,IAAI,KAAK,gBAAgB,KAAK,KAAK,GAAG;AAC1D,qCAAuB;AAAA,YACzB;AAAA,UACF,CAAC;AAGD,cAAI,sBAAsB;AAExB,mBAAO,QAAQ,oKAA6B;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,cAAcA,OAAW;AAEvB,QAAAA,MAAK,KAAK,WAAW,QAAQ,CAAC,aAAkB;AAE9C,cACI,oBAAiB,QAAQ,KACzB,uBAAoB,SAAS,KAAK,KAClC,mBAAgB,SAAS,MAAM,KAAK,KACtC,gBAAgB,SAAS,MAAM,MAAM,KAAK,GAC1C;AACA,kBAAM,cAAc,SAAS,MAAM,MAAM;AACzC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,qBAAS,MAAM,QAAQA;AAEvB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,wEAAiB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YACnI;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,oBAAoBD,OAAW;AAE7B,QAAAA,MAAK,KAAK,OAAO,QAAQ,CAAC,UAAe;AACvC,cAAM,mBAAgB,KAAK,GAAG;AAC5B,kBAAM,WAAW,QAAQ,CAAC,aAAkB;AAC1C,kBACI,uBAAoB,SAAS,KAAK,KAClC,mBAAgB,SAAS,MAAM,KAAK,KACtC,gBAAgB,SAAS,MAAM,MAAM,KAAK,GAC1C;AACA,sBAAM,cAAc,SAAS,MAAM,MAAM;AACzC,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,yBAAS,MAAM,QAAQA;AAEvB,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,4GAAuB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBACzI;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,mBAAmBD,OAAW;AAE5B,QAAAA,MAAK,KAAK,OAAO,QAAQ,CAAC,UAAe;AACvC,cAAM,mBAAgB,KAAK,GAAG;AAC5B,kBAAM,WAAW,QAAQ,CAAC,aAAkB;AAC1C,kBACI,uBAAoB,SAAS,KAAK,KAClC,mBAAgB,SAAS,MAAM,KAAK,KACtC,gBAAgB,SAAS,MAAM,MAAM,KAAK,GAC1C;AACA,sBAAM,cAAc,SAAS,MAAM,MAAM;AACzC,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,yBAAS,MAAM,QAAQA;AAEvB,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,kHAAwB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBAC1I;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,wBAAwBD,OAAW;AAEjC,QAAAA,MAAK,KAAK,OAAO,QAAQ,CAAC,UAAe;AACvC,cAAM,mBAAgB,KAAK,GAAG;AAC5B,kBAAM,WAAW,QAAQ,CAAC,aAAkB;AAC1C,kBACI,uBAAoB,SAAS,KAAK,KAClC,mBAAgB,SAAS,MAAM,KAAK,KACtC,gBAAgB,SAAS,MAAM,MAAM,KAAK,GAC1C;AACA,sBAAM,cAAc,SAAS,MAAM,MAAM;AACzC,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,yBAAS,MAAM,QAAQA;AAEvB,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,4GAAuB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBACzI;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,iBAAiBD,OAAW;AAE1B,YACI,gBAAaA,MAAK,KAAK,MAAM,KAC/BA,MAAK,KAAK,OAAO,SAAS,aACxB,gBAAaA,MAAK,KAAK,QAAQ,GACjC;AAEA,gBAAM,SAASA,MAAK;AACpB,cAAM,oBAAiB,MAAM,GAAG;AAE9B,mBAAO,UAAU,QAAQ,CAAC,KAAU,UAAkB;AACpD,kBAAM,mBAAgB,GAAG,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACxD,sBAAM,cAAc,IAAI;AACxB,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,uBAAO,UAAU,KAAK,IAAIA;AAE1B,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,iDAAmB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBACrI;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,YAAYD,OAAW;AAErB,QAAAA,MAAK,KAAK,KAAK,KAAK,QAAQ,CAAC,cAAmB;AAE9C,cACI,qBAAkB,SAAS,KAC3B,mBAAgB,UAAU,QAAQ,KACpC,gBAAgB,UAAU,SAAS,KAAK,GACxC;AACA,kBAAM,cAAc,UAAU,SAAS;AACvC,kBAAM,MAAM,cAAc,WAAW;AAGrC,kBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,sBAAU,WAAWA;AAErB,6BAAiB;AACjB;AACA,mBAAO;AAAA,cACL,oFAAwB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,YAC1I;AAAA,UACF;AAGA,cAAM,yBAAsB,SAAS,GAAG;AAEtC,gBAAM,oBAAiB,UAAU,UAAU,GAAG;AAC5C,wBAAU,WAAW,UAAU,QAAQ,CAAC,KAAU,aAAqB;AACrE,oBAAM,mBAAgB,GAAG,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACxD,wBAAM,cAAc,IAAI;AACxB,wBAAM,MAAM,cAAc,WAAW;AAGrC,wBAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAE5E,kBAAC,UAAU,WAAgC,UAAU,QAAQ,IAAIA;AAEjE,mCAAiB;AACjB;AACA,yBAAO;AAAA,oBACL,sGAAsB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,kBACxI;AAAA,gBACF;AAGA,oBAAM,mBAAgB,GAAG,GAAG;AAE1B,wBAAM,UAAU;AAChB,sBAAI,QAAQ,WAAW;AACrB,4BAAQ,UAAU,QAAQ,CAAC,QAAa,gBAAwB;AAC9D,0BAAM,mBAAgB,MAAM,KAAK,gBAAgB,OAAO,KAAK,GAAG;AAC9D,8BAAM,cAAc,OAAO;AAC3B,8BAAM,MAAM,cAAc,WAAW;AAGrC,8BAAMA,kBAAiB;AAAA,0BACrB;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AACA,gCAAQ,UAAU,WAAW,IAAIA;AAEjC,yCAAiB;AACjB;AACA,+BAAO;AAAA,0BACL,mGAAwB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,wBAC1I;AAAA,sBACF;AAAA,oBACF,CAAC;AAAA,kBACH;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,cAAcD,OAAW;AAEvB,cAAM,OAAOA,MAAK;AAElB,YAAI,KAAK,aAAa,MAAM,QAAQ,KAAK,SAAS,GAAG;AACnD,eAAK,UAAU,QAAQ,CAAC,KAAU,UAAkB;AAClD,gBAAM,mBAAgB,GAAG,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACxD,oBAAM,cAAc,IAAI;AACxB,oBAAM,MAAM,cAAc,WAAW;AAGrC,oBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,mBAAK,UAAU,KAAK,IAAIA;AAExB,+BAAiB;AACjB;AACA,qBAAO;AAAA,gBACL,iFAAqB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,cACvI;AAAA,YACF,WAAa,qBAAkB,GAAG,GAAG;AAEnC,qBAAO,QAAQ,mIAA0B;AAAA,YAC3C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA,MAGA,eAAeD,OAAW;AACxB,cAAM,WAAWA,MAAK,KAAK;AAG3B,YAAI,YAAY,mBAAmB,EAAE,MAAM,SAAS,GAAG,YAAY,GAAG;AACpE,iBAAO,QAAQ,mEAAiB;AAChC;AAAA,QACF;AAGA,YAAM,mBAAgB,QAAQ,KAAK,gBAAgB,SAAS,KAAK,GAAG;AAClE,gBAAM,cAAc,SAAS;AAC7B,gBAAM,MAAM,cAAc,WAAW;AAGrC,gBAAMC,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,UAAAD,MAAK,KAAK,WAAWC;AAErB,2BAAiB;AACjB;AACA,iBAAO;AAAA,YACL,iEAAoB,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,UACtI;AAAA,QACF;AAGA,YAAM,mBAAgB,QAAQ,GAAG;AAC/B,gBAAM,UAAU;AAEhB,cAAI,QAAQ,aAAa,MAAM,QAAQ,QAAQ,SAAS,GAAG;AACzD,oBAAQ,UAAU,QAAQ,CAAC,KAAU,UAAkB;AAErD,kBAAI,OAAO,mBAAmB,EAAE,MAAM,IAAI,GAAG,YAAY,GAAG;AAC1D,uBAAO,QAAQ,+EAA6B;AAC5C;AAAA,cACF;AAEA,kBAAM,mBAAgB,GAAG,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACxD,sBAAM,cAAc,IAAI;AACxB,sBAAM,MAAM,cAAc,WAAW;AAGrC,sBAAMA,kBAAiB,yBAAyB,cAAc,KAAK,SAAS;AAC5E,wBAAQ,UAAU,KAAK,IAAIA;AAE3B,iCAAiB;AACjB;AACA,uBAAO;AAAA,kBACL,iEAA8B,WAAW,QAAQ,YAAY,IAAI,cAAc,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,cAAc,WAAW,MAAM,GAAG;AAAA,gBAChJ;AAAA,cACF,WAAa,qBAAkB,GAAG,GAAG;AAEnC,uBAAO,QAAQ,mHAAmC;AAAA,cACpD;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAGD,kBAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,gBAAgB;AAElB,YAAM,kBAAkB;AAAA;AAAA,QAEtB,SAAS;AAAA;AAAA,QACT,UAAU;AAAA;AAAA,QACV,UAAU;AAAA;AAAA;AAAA,QAEV,aAAa;AAAA,UACX,QAAQ;AAAA,QACV;AAAA;AAAA,QAEA,QAAQ;AAAA,UACN,OAAO;AAAA;AAAA,QACT;AAAA,MACF;AAEA,UAAI,SAASF,UAAS,KAAK,iBAAiB,IAAI,EAAE;AAGlD,eAAS,cAAc,qBAAqB,MAAM;AAGlD,eAAS,OACN,QAAQ,gBAAgB,OAAO,EAC/B,QAAQ,iBAAiB,KAAK,EAC9B,QAAQ,iBAAiB,KAAK,EAC9B,QAAQ,WAAW,MAAM;AAE5B,YAAM,qBAAqB,MAAM,QAAQ,OAAO,OAAO;AACvD;AACA,2BAAqB;AACrB,aAAO,KAAK,gBAAM,IAAI,qDAAa,gBAAgB,yCAAW,QAAQ;AACtE,UAAI,OAAO,SAAS;AAClB,eAAO,QAAQ,2DAAc,OAAO,OAAO,IAAI,IAAI,EAAE;AAAA,MACvD;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,gBAAM,IAAI,2BAAO;AAAA,IAClC;AACA,UAAM,eAAe;AAAA,EACvB;AAGA,SAAO,QAAQ,oDAAY,SAAS;AACpC,SAAO,KAAK,6BAAS,QAAQ;AAC7B,SAAO,KAAK,6CAAe,cAAc,IAAI,QAAQ;AACrD,SAAO,KAAK,6CAAe,aAAa,IAAI,QAAQ;AACpD,SAAO,KAAK,mDAAgB,iBAAiB,IAAI,QAAQ;AAEzD,MAAI,gBAAgB,GAAG;AACrB,WAAO,KAAK,gEAAc,aAAa,yCAAW,QAAQ;AAC1D,QAAI,OAAO,SAAS;AAClB,aAAO,KAAK,mFAAkB,OAAO,OAAO,IAAI,QAAQ;AAAA,IAC1D;AAAA,EACF,OAAO;AACL,WAAO,KAAK,oDAAY,QAAQ;AAAA,EAClC;AACF;;;AIjrEA,eAAe,eAAe,SAAyB,QAAmC;AAExF,gBAAc,KAAK,MAAM;AAEzB,SAAO,KAAK,mHAAyB,QAAQ;AAC7C,QAAM,kBAAkB;AACxB,SAAO,QAAQ,gEAAc,SAAS;AACxC;AAEO,IAAM,iBAAiB,QAAQ,cAAc;;;AClBpD,qCAAkC;AAkB3B,IAAM,2BAAN,MAA8D;AAAA,EACnD,OAAO;AAAA,EACf;AAAA,EAER,YAAY,QAA8B;AACxC,SAAK,SAAS;AACd,WAAO,QAAQ,wFAAuB,OAAO,QAAQ,uBAAQ,oBAAK,EAAE;AAAA,EACtE;AAAA,EAEA,MAAM,UACJ,MACA,OAAe,QACf,KAAa,MACe;AAC5B,QAAI,CAAC,KAAK,aAAa,GAAG;AACxB,YAAM,IAAI,MAAM,iGAA2B;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,aAAa,KAAK,gBAAgB,IAAI;AAC5C,YAAM,WAAW,KAAK,gBAAgB,EAAE;AACxC,aAAO,QAAQ,qDAAa,UAAU,OAAO,QAAQ,+BAAW,KAAK,MAAM,EAAE;AAE7E,YAAM,WAAmC,UAAM,+BAAAM,SAAsB;AAAA,QACnE,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK,KAAK,OAAO;AAAA,QACjB,GAAG;AAAA,QACH,MAAM;AAAA,QACN,IAAI;AAAA,MACN,CAAC;AAED,UAAI,SAAS,YAAY;AACvB,cAAM,IAAI,MAAM,4CAAc,SAAS,UAAU,MAAM,SAAS,SAAS,EAAE;AAAA,MAC7E;AAEA,UAAI,CAAC,SAAS,gBAAgB,SAAS,aAAa,WAAW,GAAG;AAChE,cAAM,IAAI,MAAM,sCAAQ;AAAA,MAC1B;AAEA,YAAM,iBAAiB,SAAS,aAAa,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,KAAK,IAAI;AAE9E,aAAO,QAAQ,8BAAU,IAAI,SAAS,cAAc,GAAG;AAEvD,aAAO;AAAA,QACL,cAAc;AAAA,QACd;AAAA,QACA,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,UAAU,KAAK;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAO,MAAM,yCAAW,YAAY,EAAE;AACtC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,eAAwB;AACtB,WAAO,CAAC,EAAE,KAAK,OAAO,SAAS,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEA,wBAAkC;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAsB;AAC5C,UAAM,UAAkC;AAAA,MACtC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAEA,WAAO,QAAQ,IAAI,KAAK;AAAA,EAC1B;AACF;;;AC/GO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACT,QAA8B,CAAC;AAAA,EAC/B,mBAAyC,oBAAI,IAAI;AAAA,EACjD,cAAkC,oBAAI,IAAI;AAAA,EAC1C,QAAoB;AAAA,IAC1B,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACQ,aAAqB;AAAA;AAAA,EACrB,eAAwB;AAAA;AAAA,EACxB,oBAA4B;AAAA;AAAA,EAC5B;AAAA;AAAA,EACA;AAAA;AAAA,EACA,cAA2B,oBAAI,IAAI;AAAA;AAAA,EAE3C,YAAY,cAAsB,IAAI;AACpC,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAW,MAA0B;AACnC,SAAK,eAAe;AACpB,SAAK,MAAM,KAAK,IAA0B;AAC1C,SAAK,MAAM;AACX,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAqB;AACjC,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAA+B;AAC9C,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,UAAkC;AACpD,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,aAA4B;AAC1D,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,EAAE,GAAG,KAAK,MAAM,GAAG,WAAW;AAAA,IACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4C;AAChD,WAAO,KAAK,6EAAiB,KAAK,WAAW,mCAAU,KAAK,MAAM,KAAK,IAAI,QAAQ;AAEnF,SAAK,iBAAiB,MAAM;AAC5B,SAAK,YAAY,MAAM;AAEvB,UAAM,UAA2B,CAAC;AAGlC,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,aAAa,KAAK,MAAM,MAAM,GAAG,KAAK;AACtE,cAAQ,KAAK,KAAK,OAAO,CAAC;AAAA,IAC5B;AAGA,UAAM,QAAQ,IAAI,OAAO;AAEzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAwB;AACpC,WAAO,KAAK,MAAM,SAAS,GAAG;AAE5B,UAAI,KAAK,cAAc;AACrB,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,MAAM,KAAK,mBAAmB;AAEhC,gBAAM,WAAW,KAAK,oBAAoB;AAC1C,iBAAO,KAAK,uDAAe,KAAK,KAAK,WAAW,GAAI,CAAC,8BAAU;AAC/D,gBAAM,KAAK,MAAM,QAAQ;AACzB,eAAK,eAAe;AAAA,QACtB;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,UAAI,CAAC,KAAM;AAEX,WAAK,MAAM;AACX,WAAK,MAAM;AACX,WAAK,YAAY,IAAI,KAAK,EAAE;AAG5B,WAAK,wBAAwB,KAAK,EAAE;AAEpC,UAAI;AAEF,cAAM,SAAS,MAAM,KAAK,QAAQ;AAGlC,aAAK,iBAAiB,IAAI,KAAK,IAAI,MAAM;AACzC,aAAK,MAAM;AACX,aAAK,MAAM;AACX,aAAK,YAAY,OAAO,KAAK,EAAE;AAG/B,YAAI,KAAK,eAAe;AACtB,eAAK,cAAc,KAAK,IAAI,MAAM,EAAE,MAAM,CAAC,UAAU;AACnD,mBAAO,KAAK,qDAAa,KAAK,EAAE;AAAA,UAClC,CAAC;AAAA,QACH;AAGA,aAAK,wBAAwB;AAE7B,eAAO,QAAQ,gBAAM,KAAK,EAAE,2BAAO;AAGnC,YAAI,KAAK,aAAa,GAAG;AACvB,gBAAM,KAAK,MAAM,KAAK,UAAU;AAAA,QAClC;AAAA,MACF,SAAS,OAAO;AACd,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAK,MAAM;AACX,aAAK,YAAY,OAAO,KAAK,EAAE;AAG/B,YAAI,KAAK,gBAAgB,YAAY,GAAG;AACtC,eAAK,oBAAoB;AAGzB,eAAK,MAAM,QAAQ,IAAI;AACvB,eAAK,MAAM;AAAA,QACb,OAAO;AACL,iBAAO,MAAM,gBAAM,KAAK,EAAE,8BAAU,YAAY,EAAE;AAGlD,eAAK,KAAK,gBAAgB,KAAK,KAAK,YAAY;AAC9C,iBAAK,gBAAgB,KAAK,gBAAgB,KAAK;AAC/C,mBAAO;AAAA,cACL,gBAAM,KAAK,EAAE,qDAAa,KAAK,YAAY,wBAAS,YAAY;AAAA,YAClE;AAGA,kBAAM,KAAK,MAAM,KAAK,UAAU;AAGhC,iBAAK,MAAM,KAAK,IAAI;AACpB,iBAAK,MAAM;AAAA,UACb,OAAO;AAEL,kBAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,iBAAK,YAAY,IAAI,KAAK,IAAI,UAAU;AACxC,iBAAK,MAAM;AAAA,UACb;AAAA,QACF;AAGA,aAAK,wBAAwB;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,cAA+B;AAErD,WACE,aAAa,SAAS,wBAAc,KACpC,aAAa,SAAS,sBAAsB,KAC5C,aAAa,SAAS,YAAY,KAClC,aAAa,SAAS,mBAAmB;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAElC,SAAK,eAAe;AAEpB,UAAM,eAAe,KAAK;AAC1B,SAAK,oBAAoB,KAAK,IAAI,IAAI;AAEtC,WAAO,KAAK,yEAAkB,eAAe,GAAI,2BAAO;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA4C;AAC1C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAuB;AACrB,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AAAA,EACzD;AACF;;;ACvPO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAC5B,OAAe;AAAA,EACP,QAA2C,oBAAI,IAAI;AAAA,EAEnD,cAAc;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,cAAgC;AAC5C,QAAI,CAAC,kBAAiB,UAAU;AAC9B,wBAAiB,WAAW,IAAI,kBAAiB;AACjD,aAAO,QAAQ,wDAAW;AAAA,IAC5B;AACA,WAAO,kBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,IACL,MACA,MACA,IACA,UAC6B;AAC7B,UAAM,MAAM,KAAK,iBAAiB,MAAM,MAAM,IAAI,QAAQ;AAC1D,UAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AAEjC,QAAI,QAAQ;AACV,aAAO,QAAQ,8BAAU,IAAI,MAAM,IAAI,OAAO,EAAE,GAAG;AACnD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,IACL,MACA,gBACA,MACA,IACA,UACM;AACN,UAAM,MAAM,KAAK,iBAAiB,MAAM,MAAM,IAAI,QAAQ;AAE1D,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB,cAAc;AAAA,MACd;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACnB,SAAK,MAAM,MAAM;AACjB,WAAO,QAAQ,4CAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,OAAe;AACpB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAAc,MAAc,IAAY,UAA0B;AAEzF,WAAO,GAAG,QAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;AAAA,EAC1C;AACF;;;ACjGA,kBAA6B;AAEtB,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAA2B,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,EAAE;AAAA,EAC1F,cAAwB,CAAC;AAAA,EACzB,YAAY;AAAA;AAAA,EACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzB,QAAc;AACZ,SAAK,YAAY;AACjB,SAAK,YAAY,KAAK,IAAI;AAC1B,SAAK,iBAAiB,KAAK;AAG3B,SAAK,cAAc,IAAgB,sBAAU;AAAA,MAC3C,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,SAAS;AAAA,IACX,GAAe,oBAAQ,cAAc;AAAA,EAGvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,YAAY;AACjB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,KAAK;AACtB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAmB,aAA4B;AAC5D,SAAK,eAAe;AACpB,SAAK,iBAAiB,KAAK,IAAI;AAE/B,QAAI,aAAa;AAEf,UAAI,CAAC,KAAK,YAAY,SAAS,WAAW,GAAG;AAC3C,aAAK,YAAY,QAAQ,WAAW;AACpC,YAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,eAAK,cAAc,KAAK,YAAY,MAAM,GAAG,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,eAAe,KAAK,WAAW;AAEtC,UAAI,CAAC,KAAK,eAAe;AACvB,aAAK,YAAY,MAAM,MAAM,OAAO,GAAG;AAAA,UACrC,YAAY;AAAA,UACZ,SAAS;AAAA,QACX,CAAC;AACD,aAAK,gBAAgB;AAAA,MACvB;AAEA,YAAM,YAAY,MAAM,YAAY,MAAM;AAC1C,YAAM,iBAAiB,KAAK,OAAO,KAAK,iBAAiB,KAAK,aAAa,GAAI;AAE/E,WAAK,YAAY,SAAS,MAAM,KAAK;AACrC,WAAK,YAAY,OAAO,WAAW;AAAA,QACjC,YAAY,MAAM;AAAA,QAClB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAyB;AACvC,SAAK,KAAK;AAEV,UAAM,EAAE,OAAO,WAAW,OAAO,IAAI;AACrC,UAAM,eAAe,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,aAAa,GAAI;AAEpE,QAAI,SAAS,GAAG;AACd,cAAQ,IAAI,kDAAe,SAAS,mBAAS,MAAM,mBAAS,KAAK,mBAAS,YAAY,GAAG;AAAA,IAC3F,OAAO;AACL,cAAQ,IAAI,yEAAkB,SAAS,sCAAa,YAAY,GAAG;AAAA,IACrE;AAAA,EACF;AACF;;;AC1FO,IAAM,aAAN,MAAiB;AAAA,EACd,QAAqB,CAAC;AAAA,EACtB,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EACZ,eAAe;AAAA;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAkB,WAAoC,CAAC,GAAG;AACpE,SAAK,WAAW;AAChB,SAAK,WAAW,EAAE,GAAG,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAa,OAAqB;AACxC,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAGD,SAAK,SAAS,GAAG,IAAI;AAGrB,QAAI,KAAK,MAAM,UAAU,KAAK,WAAW;AACvC,WAAK,WAAW;AAAA,IAClB,OAAO;AAEL,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAsB;AAC5B,QAAI,KAAK,OAAO;AACd,mBAAa,KAAK,KAAK;AAAA,IACzB;AAEA,SAAK,QAAQ,WAAW,MAAM;AAC5B,WAAK,WAAW;AAAA,IAClB,GAAG,KAAK,YAAY;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,QAAI,KAAK,aAAa,KAAK,MAAM,WAAW,GAAG;AAC7C;AAAA,IACF;AAEA,SAAK,YAAY;AAEjB,QAAI,KAAK,OAAO;AACd,mBAAa,KAAK,KAAK;AACvB,WAAK,QAAQ;AAAA,IACf;AAEA,UAAM,aAAa,KAAK,MAAM;AAG9B,cAAU,KAAK,UAAU,KAAK,UAAU,IAAI,EACzC,KAAK,MAAM;AACV,aAAO,QAAQ,4BAAQ,UAAU,yCAAW,KAAK,QAAQ,EAAE;AAAA,IAC7D,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAO,KAAK,yCAAW,YAAY,EAAE;AAAA,IACvC,CAAC,EACA,QAAQ,MAAM;AACb,WAAK,YAAY;AAAA,IACnB,CAAC;AAGH,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAwB;AAE5B,SAAK,WAAW;AAGhB,WAAO,KAAK,WAAW;AACrB,YAAM,IAAI,QAAQ,CAAAC,aAAW,WAAWA,UAAS,GAAG,CAAC;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ACvGA,IAAAC,QAAsB;AAEf,IAAM,qBAAN,MAAyB;AAAA,EACtB,YAA8C,oBAAI,IAAI;AAAA,EACtD;AAAA,EACA;AAAA,EAER,YAAY,QAA2B;AACrC,SAAK,SAAS;AACd,WAAO,QAAQ,6EAAiB,OAAO,QAAQ,6BAAS,OAAO,WAAW,EAAE;AAG5E,SAAK,QAAQ,iBAAiB,YAAY;AAE1C,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,sBAA4B;AAzBtC;AA2BI,UAAI,UAAK,OAAO,UAAZ,mBAAmB,YAAS,UAAK,OAAO,UAAZ,mBAAmB,MAAK;AACtD,YAAM,gBAAgB,IAAI,yBAAyB;AAAA,QACjD,OAAO,KAAK,OAAO,MAAM;AAAA,QACzB,KAAK,KAAK,OAAO,MAAM;AAAA,MACzB,CAAC;AACD,WAAK,UAAU,IAAI,SAAS,aAAa;AACzC,aAAO,QAAQ,8DAAY;AAAA,IAC7B;AAAA,EAOF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,MACA,OAAe,KAAK,OAAO,qBAAqB,QAChD,KAAa,KAAK,OAAO,qBAAqB,MAClB;AAC5B,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,YAAM,IAAI,MAAM,4CAAS;AAAA,IAC3B;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO,QAAQ;AACxD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,+CAAY,KAAK,OAAO,QAAQ,8CAAW;AAAA,IAC7D;AAEA,QAAI,CAAC,SAAS,aAAa,GAAG;AAC5B,YAAM,IAAI,MAAM,+CAAY,KAAK,OAAO,QAAQ,kCAAS;AAAA,IAC3D;AAEA,UAAM,eAAe,SAAS,QAAQ,KAAK,OAAO;AAGlD,UAAM,eAAe,KAAK,MAAM,IAAI,MAAM,MAAM,IAAI,YAAY;AAChE,QAAI,cAAc;AAChB,aAAO,KAAK,iCAAa,IAAI,SAAS,aAAa,cAAc,GAAG;AACpE,aAAO;AAAA,QACL,cAAc,aAAa;AAAA,QAC3B,gBAAgB,aAAa;AAAA,QAC7B,gBAAgB,aAAa;AAAA,QAC7B,gBAAgB,aAAa;AAAA,QAC7B,UAAU,aAAa;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,QAAQ,gBAAM,YAAY,mBAAS,IAAI,MAAM,IAAI,OAAO,EAAE,GAAG;AAEpE,QAAI;AACF,YAAM,SAAS,MAAM,SAAS,UAAU,MAAM,MAAM,EAAE;AACtD,aAAO,QAAQ,8BAAU,IAAI,SAAS,OAAO,cAAc,GAAG;AAG9D,WAAK,MAAM,IAAI,MAAM,OAAO,gBAAgB,MAAM,IAAI,YAAY;AAElE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAO,MAAM,6BAAS,YAAY,EAAE;AACpC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,OACA,OAAe,KAAK,OAAO,qBAAqB,QAChD,KAAa,KAAK,OAAO,qBAAqB,MAChB;AAC9B,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,YAAM,IAAI,MAAM,4CAAS;AAAA,IAC3B;AAGA,UAAM,cAAc,KAAK,IAAI,KAAK,OAAO,eAAe,GAAG,CAAC;AAC5D,UAAM,aAAa,KAAK,OAAO,cAAc;AAC7C,UAAM,aAAa,KAAK,IAAI,KAAK,OAAO,cAAc,KAAM,GAAI;AAChE,UAAM,aAAa,KAAK,IAAI,KAAK,OAAO,cAAc,KAAK,GAAG;AAE9D,WAAO;AAAA,MACL,uEAAgB,MAAM,MAAM,6BAAS,WAAW,mCAAU,UAAU;AAAA,MACpE;AAAA,IACF;AACA,WAAO,QAAQ,6BAAS,IAAI,OAAO,EAAE,EAAE;AAGvC,UAAM,eAAe,KAAK,OAAO;AACjC,UAAM,mBAA6B,CAAC;AACpC,UAAM,gBAAgD,oBAAI,IAAI;AAE9D,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,KAAM;AAEX,YAAM,eAAe,KAAK,MAAM,IAAI,MAAM,QAAQ,QAAQ,MAAM,MAAM,YAAY;AAElF,UAAI,cAAc;AAEhB,eAAO,QAAQ,+BAAW,IAAI,CAAC,IAAI,MAAM,MAAM,MAAM,IAAI,GAAG;AAC5D,sBAAc,IAAI,aAAa,CAAC,IAAI;AAAA,UAClC,cAAc,aAAa;AAAA,UAC3B,gBAAgB,aAAa;AAAA,UAC7B,gBAAgB,aAAa;AAAA,UAC7B,gBAAgB,aAAa;AAAA,UAC7B,UAAU,aAAa;AAAA,QACzB,CAAC;AAAA,MACH,OAAO;AAEL,yBAAiB,KAAK,IAAI;AAAA,MAC5B;AAAA,IACF;AAGA,UAAM,QAAQ,IAAI,iBAAiB,WAAW;AAC9C,UAAM,cAAc,UAAU;AAE9B,UAAM,kBAAkB,IAAI,gBAAgB;AAG5C,UAAM,oBAAoB,CAACC,QAAO,gBAAgB;AAChD,sBAAgB,eAAeA,QAAO,WAAW;AAAA,IACnD,CAAC;AAGD,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,CAAC,cAAc,IAAI,aAAa,CAAC,EAAE,GAAG;AACxC,cAAM,OAAO,MAAM,CAAC;AACpB,YAAI,CAAC,KAAM;AAEX,cAAM,QAAQ;AAAA,UACZ,IAAI,aAAa,CAAC;AAAA,UAClB,SAAS,MAAM,KAAK,UAAU,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,UAC9D,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,6BAAS,iBAAiB,MAAM,sCAAa,cAAc,IAAI,WAAM,QAAQ;AAGzF,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO,KAAK,+FAAoB;AAChC,YAAMC,WAA+B,CAAC;AACtC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,SAAS,cAAc,IAAI,aAAa,CAAC,EAAE;AACjD,YAAI,QAAQ;AACV,UAAAA,SAAQ,KAAK,MAAM;AAAA,QACrB;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAIA,WAAO,kBAAkB,SAAS;AAClC,oBAAgB,MAAM;AACtB,UAAM,mBAAmB,MAAM,MAAM,WAAW;AAGhD,UAAM,aAAa,MAAM,SAAS;AAClC,oBAAgB,gBAAgB,UAAU;AAG1C,WAAO,kBAAkB,IAAI;AAG7B,UAAM,UAA+B,CAAC;AACtC,UAAM,cAAc,MAAM,eAAe;AAEzC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,SAAS,aAAa,CAAC;AAG7B,UAAI,cAAc,IAAI,MAAM,GAAG;AAC7B,cAAMC,UAAS,cAAc,IAAI,MAAM;AACvC,YAAIA,SAAQ;AACV,kBAAQ,KAAKA,OAAM;AAAA,QACrB;AACA;AAAA,MACF;AAGA,YAAM,SAAS,iBAAiB,IAAI,MAAM;AAE1C,UAAI,QAAQ;AACV,gBAAQ,KAAK,MAAM;AAAA,MACrB,OAAO;AACL,cAAM,QAAQ,YAAY,IAAI,MAAM;AACpC,cAAM,gBAAe,+BAAO,YAAW;AACvC,cAAM,cAAc,MAAM,CAAC;AAC3B,YAAI,aAAa;AACf,iBAAO,MAAM,iBAAO,WAAW,+BAAW,YAAY,EAAE;AAExD,kBAAQ,KAAK;AAAA,YACX,cAAc;AAAA,YACd,gBAAgB;AAAA;AAAA,YAChB,gBAAgB,QAAQ;AAAA,YACxB,gBAAgB,MAAM;AAAA,YACtB,UAAU,KAAK,OAAO;AAAA,UACxB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,SAAS;AAC7B,WAAO;AAAA,MACL,2DAAc,MAAM,SAAS,uBAAQ,MAAM,MAAM,uBAAQ,MAAM,MAAM,mCAAU,cAAc,IAAI;AAAA,MACjG;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBACJ,YACA,cACA,OAAe,KAAK,OAAO,qBAAqB,QAChD,KAAa,KAAK,OAAO,qBAAqB,MAC9C,kBAA2B,MAM1B;AACD,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,YAAM,IAAI,MAAM,qDAAa,UAAU,EAAE;AAAA,IAC3C;AAEA,WAAO,KAAK,2CAAgB,UAAU,EAAE;AAGxC,UAAM,gBAAgB,MAAM,SAAkC,UAAU;AACxE,UAAM,mBAAmB,OAAO,KAAK,aAAa,EAAE;AAGpD,UAAM,aAAkB,WAAU,cAAQ,UAAU,GAAG,GAAG,YAAY,OAAO;AAG7E,QAAI,uBAAgD,CAAC;AACrD,QAAI,eAAe;AACnB,QAAI,mBAAmB,WAAW,UAAU,GAAG;AAC7C,UAAI;AACF,+BAAuB,MAAM,SAAkC,UAAU;AACzE,eAAO,QAAQ,gGAAqB,UAAU,EAAE;AAChD,eAAO,QAAQ,sBAAO,OAAO,KAAK,oBAAoB,EAAE,MAAM,uCAAS;AAAA,MACzE,SAAS,OAAO;AACd,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,eAAO,KAAK,iEAAe,YAAY,4CAAS;AAChD,+BAAuB,CAAC;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,kBAA4B,CAAC;AACnC,UAAM,mBAA6B,CAAC;AACpC,UAAM,oBAA6C,EAAE,GAAG,qBAAqB;AAG7E,eAAW,OAAO,eAAe;AAC/B,YAAM,QAAQ,cAAc,GAAG;AAE/B,UAAI,OAAO,UAAU,UAAU;AAC7B,YAAI,mBAAmB,OAAO,wBAAwB,qBAAqB,GAAG,GAAG;AAE/E;AACA;AAAA,QACF;AACA,wBAAgB,KAAK,GAAG;AACxB,yBAAiB,KAAK,KAAK;AAAA,MAC7B,OAAO;AAEL,0BAAkB,GAAG,IAAI;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,qBAAqB,iBAAiB;AAG5C,QAAI,mBAAmB,eAAe,GAAG;AACvC,aAAO,KAAK,8CAAW,YAAY,uEAAgB,kBAAkB,6BAAS,QAAQ;AAAA,IACxF,WAAW,qBAAqB,GAAG;AACjC,aAAO,KAAK,sCAAW,kBAAkB,oCAAW;AAAA,IACtD;AAEA,QAAI,uBAAuB,GAAG;AAC5B,aAAO,KAAK,0HAAsB;AAElC,YAAM,UAAU,YAAY,mBAAmB,IAAI;AACnD,aAAO;AAAA,QACL;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA;AAAA,QACd;AAAA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,IAAI,KAAK,OAAO,eAAe,GAAG,CAAC;AAC5D,UAAM,aAAa,KAAK,OAAO,cAAc;AAC7C,UAAM,aAAa,KAAK,IAAI,KAAK,OAAO,cAAc,KAAM,GAAI;AAChE,UAAM,aAAa,KAAK,IAAI,KAAK,OAAO,cAAc,KAAK,GAAG;AAG9D,UAAM,aAAa,IAAI,WAAW,YAAY,iBAAiB;AAG/D,UAAM,QAAQ,IAAI,iBAAiB,WAAW;AAC9C,UAAM,cAAc,UAAU;AAE9B,UAAM,kBAAkB,IAAI,gBAAgB;AAG5C,UAAM,oBAAoB,CAAC,OAAO,gBAAgB;AAChD,sBAAgB,eAAe,OAAO,WAAW;AAAA,IACnD,CAAC;AAGD,UAAM,iBAAiB,OAAO,QAAQ,WAAW;AAC/C,YAAM,QAAQ,SAAS,OAAO,QAAQ,cAAc,EAAE,CAAC;AACvD,YAAM,MAAM,gBAAgB,KAAK;AACjC,YAAM,oBAAoB;AAE1B,UAAI,OAAO,qBAAqB,kBAAkB,mBAAmB,kBAAkB,cAAc;AACnG,mBAAW,QAAQ,KAAK,kBAAkB,cAAc;AAAA,MAC1D,WAAW,KAAK;AAEd,mBAAW,QAAQ,KAAK,cAAc,GAAG,CAAW;AAAA,MACtD;AAAA,IACF,CAAC;AAGD,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,YAAM,MAAM,gBAAgB,CAAC;AAC7B,YAAM,OAAO,iBAAiB,CAAC;AAC/B,UAAI,CAAC,KAAM;AAEX,YAAM,QAAQ;AAAA,QACZ,IAAI,aAAa,CAAC;AAAA,QAClB,SAAS,MAAM,KAAK,UAAU,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,QAC9D,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AAGA,WAAO,kBAAkB,SAAS;AAClC,oBAAgB,MAAM;AACtB,UAAM,mBAAmB,MAAM,MAAM,WAAW;AAGhD,UAAM,aAAa,MAAM,SAAS;AAClC,oBAAgB,gBAAgB,UAAU;AAG1C,WAAO,kBAAkB,IAAI;AAG7B,UAAM,WAAW,OAAO;AAExB,UAAM,eAAe,WAAW;AAGhC,WAAO,QAAQ,iEAAe,UAAU,EAAE;AAE1C,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO,QAAQ;AACxD,WAAO,WAAW,SAAS,aAAa,IAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAkC;AAChC,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO,QAAQ;AACxD,WAAO,WAAW,SAAS,sBAAsB,IAAI,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAkC;AAChC,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS;AACxD,YAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AACxC,cAAO,qCAAU,mBAAkB;AAAA,IACrC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAmC;AACjC,WAAO;AAAA,MACL,MAAM,KAAK,MAAM,KAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,MAAM,MAAM;AACjB,WAAO,KAAK,4CAAS;AAAA,EACvB;AACF;;;ACtcO,IAAMC,mBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA,EAI3B,OAAO,sBAIL;AAfJ;AAgBI,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI;AACF,YAAM,SAAS,cAAc,IAAI;AAGjC,UAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAAG;AAClD,eAAO,KAAK,qDAAkB;AAAA,MAChC;AAEA,UAAI,CAAC,OAAO,WAAW;AACrB,eAAO,KAAK,uDAAoB;AAAA,MAClC;AAEA,UAAI,CAAC,OAAO,QAAQ;AAClB,eAAO,KAAK,oDAAiB;AAAA,MAC/B;AAGA,WAAI,YAAO,gBAAP,mBAAoB,SAAS;AAC/B,YAAI,CAAC,OAAO,YAAY,UAAU;AAChC,iBAAO,KAAK,iEAAoB;AAAA,QAClC;AAEA,YAAI,OAAO,YAAY,aAAa,SAAS;AAC3C,cAAI,GAAC,YAAO,YAAY,UAAnB,mBAA0B,UAAS,GAAC,YAAO,YAAY,UAAnB,mBAA0B,MAAK;AACtE,qBAAS,KAAK,gFAAyB;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,eAAe;AACxB,YAAI,OAAO,cAAc,oBAAoB,OAAO,cAAc,oBAAoB,GAAG;AACvF,mBAAS,KAAK,4CAAwB;AAAA,QACxC;AAEA,YAAI,OAAO,cAAc,cAAc,OAAO,cAAc,cAAc,GAAG;AAC3E,mBAAS,KAAK,sCAAkB;AAAA,QAClC;AAAA,MACF;AAGA,YACE,YAAO,YAAP,mBAAgB,UAChB,CAAC,CAAC,WAAW,UAAU,SAAS,EAAE,SAAS,OAAO,QAAQ,KAAK,GAC/D;AACA,eAAO,KAAK,kFAA+C;AAAA,MAC7D;AAGA,YAAI,YAAO,WAAP,mBAAe,mBAAkB,CAAC,OAAO,OAAO,eAAe,SAAS,UAAU,GAAG;AACvF,iBAAS,KAAK,qEAAkC;AAAA,MAClD;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,2DAAc,KAAK,EAAE;AAAA,IACnC;AAEA,UAAM,UAAU,OAAO,WAAW;AAElC,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM,yCAAW,SAAS;AACjC,aAAO,QAAQ,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK,IAAI,SAAS,CAAC;AAAA,IACnE;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,KAAK,6BAAS,QAAQ;AAC7B,eAAS,QAAQ,CAAC,YAAY,OAAO,KAAK,OAAO,OAAO,IAAI,QAAQ,CAAC;AAAA,IACvE;AAEA,QAAI,WAAW,SAAS,WAAW,GAAG;AACpC,aAAO,QAAQ,8DAAY;AAAA,IAC7B;AAEA,WAAO,EAAE,SAAS,QAAQ,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,yBAA+B;AAjGxC;AAkGI,UAAM,SAAS,cAAc,IAAI;AAEjC,WAAO,QAAQ,+CAAY;AAG3B,UAAM,sBAAoB,YAAO,WAAP,mBAAe,mBAAkB,iBAAiB;AAAA,MAC1E;AAAA,MACA,OAAO;AAAA,IACT;AACA,WAAO,QAAQ,qDAAa,gBAAgB,EAAE;AAG9C,UAAM,iBAAe,YAAO,gBAAP,mBAAoB,iBAAgB;AACzD,WAAO,QAAQ,qDAAa,YAAY,EAAE;AAG1C,WAAO,QAAQ,6BAAS,OAAO,SAAS,EAAE;AAC1C,QAAI,OAAO,SAAS;AAClB,aAAO,QAAQ,6BAAS,OAAO,OAAO,EAAE;AAAA,IAC1C;AAEA,WAAO,QAAQ,wDAAW;AAAA,EAC5B;AACF;;;ACzHA,kBAAiB;AACjB,sBAAe;AAqCf,SAASC,iBAAgB,KAAsB;AAC7C,SAAO,kBAAkB,KAAK,GAAG;AACnC;AAMA,SAAS,uBACP,cACA,gBACA,YACS;AAET,MAAI,iBAAiB,gBAAgB;AACnC,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,WAAW,IAAI,KAAKA,iBAAgB,cAAc,GAAG;AAElE,UAAM,eAAe,eAAe,MAAM,kBAAkB;AAC5D,QAAI,gBAAgB,aAAa,SAAS,eAAe,SAAS,KAAK;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAe,iBAAiB,UAA0D;AACxF,MAAI;AACF,UAAM,UAAU,MAAM,gBAAAC,QAAG,SAAS,UAAU,OAAO;AACnD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,WAAO,QAAQ,qDAAa,QAAQ,MAAM,KAAK,EAAE;AACjD,WAAO;AAAA,EACT;AACF;AAKA,eAAe,oBACb,YACA,gBACA,gBACiC;AACjC,QAAM,aAAa,MAAM,iBAAiB,cAAc;AAExD,MAAI,CAAC,YAAY;AAEf,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB;AAAA,MACA,WAAW,OAAO,KAAK,UAAU,EAAE;AAAA,MACnC,gBAAgB;AAAA,MAChB,kBAAkB,OAAO,KAAK,UAAU,EAAE;AAAA,MAC1C,aAAa,OAAO,KAAK,UAAU;AAAA,MACnC,qBAAqB,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QACrE;AAAA,QACA,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,EAAE;AAAA,MACF,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,KAAK,UAAU;AACzC,QAAM,cAAwB,CAAC;AAC/B,QAAM,sBAID,CAAC;AAEN,MAAI,kBAAkB;AAEtB,aAAW,OAAO,YAAY;AAC5B,UAAM,aAAa,WAAW,GAAG;AACjC,UAAM,aAAa,WAAW,GAAG;AAGjC,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AAEf,kBAAY,KAAK,GAAG;AACpB,0BAAoB,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,WAAW,uBAAuB,YAAY,YAAY,cAAc,GAAG;AAEzE,0BAAoB,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AAEL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,WAAW;AAC7B,QAAM,mBAAmB,YAAY;AACrC,QAAM,iBAAiB,YAAY,IAAK,kBAAkB,YAAa,MAAM;AAE7E,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAsB,6BACpB,kBAA4B,CAAC,SAAS,SAAS,OAAO,GACpB;AA1KpC;AA2KE,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,iBAAiB,OAAO,UAAU;AACxC,QAAM,mBAAiB,YAAO,WAAP,mBAAe,mBAAkB;AAGxD,QAAM,iBAAiB,eAAe,QAAQ,YAAY,cAAc;AACxE,QAAM,iBAAiB,YAAAC,QAAK,QAAQ,WAAW,cAAc;AAE7D,SAAO,KAAK,6DAAgB,QAAQ;AACpC,SAAO,QAAQ,mCAAU,cAAc,EAAE;AACzC,SAAO,QAAQ,6BAAS,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAGpD,QAAM,aAAa,MAAM,iBAAiB,cAAc;AACxD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,2DAAc,cAAc,EAAE;AAAA,EAChD;AAEA,SAAO,QAAQ,kCAAS,OAAO,KAAK,UAAU,EAAE,MAAM,2BAAO;AAE7D,QAAM,cAKD,CAAC;AAEN,MAAI,sBAAsB;AAC1B,MAAI,wBAAwB;AAG5B,aAAW,kBAAkB,iBAAiB;AAC5C,UAAM,iBAAiB,eAAe,QAAQ,YAAY,cAAc;AACxE,UAAM,iBAAiB,YAAAA,QAAK,QAAQ,WAAW,cAAc;AAE7D,WAAO,QAAQ,qDAAa,cAAc,EAAE;AAG5C,QAAI,SAAS;AACb,QAAI;AACF,YAAM,gBAAAD,QAAG,OAAO,cAAc;AAC9B,eAAS;AAAA,IACX,QAAQ;AACN,eAAS;AAAA,IACX;AAEA,UAAM,iBAKF;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,IACF;AAEA,QAAI,QAAQ;AAEV,YAAM,cAAc,MAAM,oBAAoB,YAAY,gBAAgB,cAAc;AACxF,qBAAe,SAAS;AACxB,6BAAuB,YAAY;AACnC;AAEA,aAAO;AAAA,QACL,gBAAM,cAAc,wBAAS,YAAY,eAAe,QAAQ,CAAC,CAAC,MAChE,YAAY,cACd,IAAI,YAAY,SAAS;AAAA,MAC3B;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,+CAAY,cAAc,EAAE;AAAA,IAC7C;AAEA,gBAAY,KAAK,cAAc;AAAA,EACjC;AAEA,QAAM,wBACJ,wBAAwB,IAAI,sBAAsB,wBAAwB;AAE5E,QAAM,UAAmC;AAAA,IACvC,YAAY;AAAA,IACZ;AAAA,IACA,gBAAgB,gBAAgB;AAAA,IAChC,mBAAmB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,QAAQ,gEAAc,SAAS;AACtC,SAAO,KAAK,6BAAS,gBAAgB,MAAM,IAAI,QAAQ;AACvD,SAAO,KAAK,qDAAa,qBAAqB,IAAI,QAAQ;AAC1D,SAAO,KAAK,mCAAU,sBAAsB,QAAQ,CAAC,CAAC,KAAK,QAAQ;AAEnE,SAAO;AACT;;;ACzQA,IAAAE,eAAiB;AAkBV,IAAM,2BAAN,MAA+B;AAAA,EAC5B,SAAS;AAAA,EACA;AAAA,EAEjB,YAAY,UAAyB,CAAC,GAAG;AACvC,SAAK,UAAU;AAAA,MACb,aAAa,QAAQ,eAAe;AAAA,MACpC,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,eAAe,QAAQ,iBAAiB;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAuB;AAC7B,UAAM,aAAY,oBAAI,KAAK,GAAE,eAAe,KAAK,QAAQ,eAAe;AACxE,UAAM,WAAW,KAAK,QAAQ,cAAc,yCAAW;AAEvD,SAAK,UAAU,2DAAc,QAAQ;AAAA;AAAA,gCAE7B,SAAS;AAAA;AAAA;AAGjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,SAAwC;AACpE,SAAK,UAAU;AAAA;AAAA;AAAA;AAAA,2BAIP,aAAAC,QAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,+BAClC,QAAQ,cAAc;AAAA,uDAClB,QAAQ,iBAAiB;AAAA,qCAC5B,QAAQ,sBAAsB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAGhD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAA4B,SAAwC;AAC1E,SAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAMf,eAAW,cAAc,QAAQ,aAAa;AAC5C,YAAM,SAAS,WAAW,SAAS,wBAAS;AAC5C,YAAM,iBAAiB,WAAW,SAC9B,GAAG,WAAW,OAAO,eAAe,QAAQ,CAAC,CAAC,MAC9C;AACJ,YAAM,aAAa,WAAW,SAAS,WAAW,OAAO,eAAe,SAAS,IAAI;AACrF,YAAM,eAAe,WAAW,SAC5B,WAAW,OAAO,iBAAiB,SAAS,IAC5C;AACJ,YAAM,UAAU,WAAW,SAAS,WAAW,OAAO,YAAY,OAAO,SAAS,IAAI;AAEtF,WAAK,UAAU,KAAK,WAAW,QAAQ,MAAM,MAAM,MAAM,cAAc,MAAM,UAAU,MAAM,YAAY,MAAM,OAAO;AAAA;AAAA,IACxH;AAEA,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,YAA6D;AAC3F,QAAI,CAAC,WAAW,QAAQ;AACtB,WAAK,UAAU,cAAS,WAAW,QAAQ;AAAA;AAAA,kCAEnC,WAAW,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO3B,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,WAAW;AAC1B,UAAM,aACJ,OAAO,kBAAkB,KAAK,WAAM,OAAO,kBAAkB,KAAK,iBAAO;AAE3E,SAAK,UAAU,OAAO,UAAU,IAAI,WAAW,QAAQ,yBAAU,OAAO,eAAe,QAAQ,CAAC,CAAC;AAAA;AAAA,kCAEvF,WAAW,QAAQ;AAAA;AAAA;AAAA,wBAGxB,OAAO,SAAS;AAAA,wBAChB,OAAO,cAAc;AAAA,wBACrB,OAAO,gBAAgB;AAAA,wBACvB,OAAO,YAAY,MAAM;AAAA;AAAA;AAI9B,SAAK,2BAA2B,MAAM;AACtC,SAAK,mCAAmC,MAAM;AAE9C,SAAK,UAAU;AAAA;AAAA;AAGf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,QAAsC;AACvE,QAAI,OAAO,YAAY,WAAW,EAAG;AAErC,UAAM,eAAe,KAAK,QAAQ,cAAc,KAAK,OAAO,YAAY;AACxE,UAAM,aAAa,OAAO,YAAY,MAAM,GAAG,YAAY;AAE3D,SAAK,UAAU,iCAAa,OAAO,YAAY,MAAM,SACnD,KAAK,QAAQ,eAAe,OAAO,YAAY,SAAS,KAAK,2CAAa,EAC5E;AAAA;AAAA,EAEF,WAAW,KAAK,IAAI,CAAC;AAAA;AAGnB,QAAI,KAAK,QAAQ,eAAe,OAAO,YAAY,SAAS,IAAI;AAC9D,WAAK,UAAU;AAAA,oBAAa,OAAO,YAAY,SAAS,EAAE;AAAA,IAC5D;AAEA,SAAK,UAAU;AAAA;AAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKQ,mCAAmC,QAAsC;AAC/E,QAAI,OAAO,oBAAoB,WAAW,EAAG;AAE7C,UAAM,eAAe,KAAK,QAAQ,cAAc,KAAK;AACrD,UAAM,gBAAgB,OAAO,oBAAoB,MAAM,GAAG,YAAY;AAEtE,QAAI,OAAO,oBAAoB,UAAU,gBAAgB,KAAK,QAAQ,aAAa;AACjF,WAAK,UAAU,6CAAe,OAAO,oBAAoB,MAAM,SAC7D,KAAK,QAAQ,eAAe,OAAO,oBAAoB,SAAS,KAAK,2CAAa,EACpF;AAAA;AAAA;AAAA;AAAA;AAKA,iBAAW,SAAS,eAAe;AACjC,cAAM,UAAU,MAAM,IAAI,QAAQ,OAAO,KAAK;AAC9C,cAAM,WAAW,MAAM,WAAW,QAAQ,OAAO,KAAK,EAAE,QAAQ,OAAO,GAAG;AAC1E,aAAK,UAAU,OAAO,OAAO,QAAQ,QAAQ;AAAA;AAAA,MAC/C;AAEA,UAAI,KAAK,QAAQ,eAAe,OAAO,oBAAoB,SAAS,IAAI;AACtE,aAAK,UAAU;AAAA,oBAAa,OAAO,oBAAoB,SAAS,EAAE;AAAA;AAAA,MACpE,WAAW,CAAC,KAAK,QAAQ,eAAe,OAAO,oBAAoB,SAAS,IAAI;AAC9E,aAAK,UAAU;AAAA,oBAAa,OAAO,oBAAoB,SAAS,EAAE;AAAA;AAAA,MACpE;AAAA,IACF,OAAO;AACL,WAAK,UAAU,oDAAiB,OAAO,oBAAoB,MAAM;AAAA;AAAA;AAAA,IAGnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,SAAwC;AACtE,SAAK,UAAU;AAAA;AAAA;AAIf,eAAW,cAAc,QAAQ,aAAa;AAC5C,WAAK,wBAAwB,UAAU;AAAA,IACzC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,SAAwC;AACtE,SAAK,UAAU;AAAA;AAAA;AAIf,SAAK,uCAAuC,OAAO;AACnD,SAAK,0CAA0C,OAAO;AAEtD,SAAK,UAAU;AAAA;AAAA;AAGf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uCAAuC,SAAwC;AACrF,UAAM,mBAAmB,QAAQ,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AACpE,QAAI,iBAAiB,WAAW,EAAG;AAEnC,SAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAKf,eAAW,QAAQ,kBAAkB;AACnC,WAAK,UAAU,OAAO,KAAK,QAAQ,SAAS,KAAK,QAAQ;AAAA;AAAA,IAE3D;AACA,SAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWjB;AAAA;AAAA;AAAA;AAAA,EAKQ,0CAA0C,SAAwC;AACxF,UAAM,sBAAsB,QAAQ,YAAY;AAAA,MAC9C,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,iBAAiB;AAAA,IAC3D;AACA,QAAI,oBAAoB,WAAW,EAAG;AAEtC,SAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAKf,eAAW,QAAQ,qBAAqB;AACtC,YAAM,OAAO,KAAK,OAAQ,eAAe,QAAQ,CAAC;AAClD,WAAK,UAAU,OAAO,KAAK,QAAQ,OAAO,IAAI,sDAAc,KAAK,OAAQ,gBAAgB;AAAA;AAAA,IAE3F;AAEA,SAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAuB;AAE7B,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,UAAU;AAAA;AAAA;AAAA;AAAA,IAIjB;AAEA,SAAK,UAAU,iCAAkB,KAAK,QAAQ,aAAa;AAAA;AAE3D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM,SAA0C;AACrD,SAAK,SAAS;AAEd,SAAK,eAAe,EACjB,sBAAsB,OAAO,EAC7B,4BAA4B,OAAO,EACnC,wBAAwB,OAAO,EAC/B,wBAAwB,OAAO,EAC/B,eAAe;AAElB,WAAO,KAAK;AAAA,EACd;AACF;AASO,SAAS,0BACd,SACA,UAAyB,CAAC,GAClB;AACR,QAAM,UAAU,IAAI,yBAAyB,OAAO;AACpD,SAAO,QAAQ,MAAM,OAAO;AAC9B;;;ACjUA,IAAAC,MAAoB;AACpB,IAAAC,QAAsB;AAoBtB,eAAsB,iBAAiB,SAA0C;AA5BjF;AA8BE,QAAM,SAAS,WAAW,QAAQ,MAAM;AACxC,gBAAc,KAAK,MAAM;AAEzB,MAAI,GAAC,YAAO,gBAAP,mBAAoB,UAAS;AAChC,WAAO,KAAK,qIAAgD,QAAQ;AACpE;AAAA,EACF;AAGA,QAAM,qBAAqB,IAAI,mBAAmB;AAAA,IAChD,SAAS,OAAO,YAAY;AAAA,IAC5B,UAAU,OAAO,YAAY,YAAY;AAAA,IACzC,mBAAmB,OAAO,YAAY,qBAAqB;AAAA,IAC3D,mBAAmB,OAAO,YAAY,qBAAqB;AAAA,IAC3D,aAAa,OAAO,YAAY,eAAe;AAAA,IAC/C,YAAY,OAAO,YAAY,cAAc;AAAA,IAC7C,YAAY,OAAO,YAAY,cAAc;AAAA,IAC7C,YAAY,OAAO,YAAY,cAAc;AAAA,IAC7C,SACE,YAAO,YAAY,UAAnB,mBAA0B,YAAS,YAAO,YAAY,UAAnB,mBAA0B,OACzD;AAAA,MACE,OAAO,OAAO,YAAY,MAAM;AAAA,MAChC,KAAK,OAAO,YAAY,MAAM;AAAA,IAChC,IACA;AAAA,IACN,UACE,YAAO,YAAY,WAAnB,mBAA2B,eAAY,YAAO,YAAY,WAAnB,mBAA2B,UAC9D;AAAA,MACE,UAAU,OAAO,YAAY,OAAO;AAAA,MACpC,QAAQ,OAAO,YAAY,OAAO;AAAA,IACpC,IACA;AAAA,EACR,CAAC;AAED,MAAI,CAAC,mBAAmB,YAAY,GAAG;AACrC,WAAO,MAAM,kFAAiB,SAAS;AACvC,WAAO,KAAK,qEAAwB,QAAQ;AAC5C;AAAA,EACF;AAGA,QAAM,oBAAoB,OAAO,YAAY,qBAAqB;AAClE,QAAM,oBAAoB,OAAO,YAAY,qBAAqB,OAAO,mBAAmB;AAC5F,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,QAAQ,MAAM;AAGzB,QAAM,kBAAkB,QAAQ,gBAAgB;AAEhD,MAAI;AAEF,QAAI,QAAQ,QAAQ,QAAQ,OAAO;AACjC,YAAM,oBAAoB,oBAAoB,QAAQ,OAAO,MAAM,EAAE;AAAA,IACvE,WAAW,QAAQ,MAAM;AACvB,YAAM,wBAAwB,oBAAoB,QAAQ,MAAM,MAAM,IAAI,eAAe;AAAA,IAC3F,WAAW,QAAQ,OAAO;AACxB,YAAM,0BAA0B,oBAAoB,MAAM,IAAI,eAAe;AAAA,IAC/E,WAAW,QAAQ,OAAO;AACxB,YAAM,qBAAqB,oBAAoB,QAAQ,OAAO,MAAM,EAAE;AAAA,IACxE,OAAO;AAEL,YAAM,YAAY,OAAO,aAAa;AACtC,YAAM,eAAe,OAAO,UAAU;AACtC,YAAM,eAAe,OAAO,mBAAmB;AAE/C,aAAO;AAAA,QACL,gEAAc,SAAS,6BAAS,YAAY,8CAAgB,YAAY;AAAA,QACxE;AAAA,MACF;AAEA,YAAM,aAAa,aAAa,MAAM,GAAG,EAAE,CAAC,KAAK;AACjD,YAAM,aAAa,aAAa,MAAM,GAAG,EAAE,CAAC,KAAK;AAEjD,UAAI;AACF,cAAM,aAAkB,WAAK,WAAW,GAAG,YAAY,OAAO;AAC9D,YAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,gBAAM,IAAI,MAAM,qDAAa,UAAU,kGAAkB;AAAA,QAC3D;AAEA,eAAO,KAAK,+DAAgB,UAAU,EAAE;AAExC,cAAM,EAAE,YAAY,YAAY,cAAc,aAAa,IACzD,MAAM,mBAAmB;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEF,eAAO,QAAQ,wEAAiB,UAAU,IAAI,QAAQ;AACtD,YAAI,eAAe,GAAG;AACpB,cAAI,eAAe,GAAG;AACpB,mBAAO;AAAA,cACL,uCAAY,YAAY,uEAAgB,YAAY,qBAAM,UAAU;AAAA,cACpE;AAAA,YACF;AAAA,UACF,OAAO;AACL,mBAAO;AAAA,cACL,mGAAsB,YAAY,qBAAM,UAAU;AAAA,cAClD;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,iBAAO,KAAK,uCAAY,YAAY,IAAI,UAAU,UAAK,QAAQ;AAAA,QACjE;AAAA,MACF,SAAS,OAAO;AACd,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,eAAO,MAAM,6BAAS,YAAY,IAAI,SAAS;AAC/C,sBAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,WAAO,MAAM,6BAAS,YAAY,IAAI,SAAS;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,oBACb,SACA,MACA,MACA,IACe;AACf,SAAO,KAAK,yCAAW,IAAI,OAAO,EAAE,KAAK,QAAQ;AACjD,SAAO,KAAK,iBAAO,IAAI,IAAI,QAAQ;AAEnC,QAAM,SAAS,MAAM,QAAQ,UAAU,MAAM,MAAM,EAAE;AACrD,SAAO,QAAQ,iBAAO,OAAO,cAAc,IAAI,QAAQ;AACvD,SAAO,KAAK,uBAAQ,OAAO,QAAQ,IAAI,QAAQ;AACjD;AAKA,eAAe,wBACb,SACA,UACA,MACA,IACA,cAAuB,MACR;AAEf,QAAM,eAAe,cAAc,IAAI,EAAE,mBAAmB;AAE5D,QAAM,EAAE,YAAY,YAAY,cAAc,aAAa,IACzD,MAAM,QAAQ,sBAAsB,UAAU,cAAc,MAAM,IAAI,WAAW;AAEnF,SAAO,QAAQ,wEAAiB,UAAU,IAAI,QAAQ;AACtD,MAAI,eAAe,GAAG;AACpB,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,QACL,uCAAY,YAAY,uEAAgB,YAAY,qBAAM,UAAU;AAAA,QACpE;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,mGAAsB,YAAY,qBAAM,UAAU;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO,KAAK,uCAAY,YAAY,IAAI,UAAU,UAAK,QAAQ;AAAA,EACjE;AACF;AAKA,eAAe,0BACb,SACA,MACA,IACA,cAAuB,MACR;AACf,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,eAAe,OAAO,UAAU;AACtC,QAAM,eAAe,OAAO,mBAAmB;AAE/C,QAAM,aAAkB,WAAK,WAAW,GAAG,YAAY,OAAO;AAC9D,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,UAAM,IAAI,MAAM,qDAAa,UAAU,kGAAkB;AAAA,EAC3D;AAEA,SAAO,KAAK,+DAAgB,UAAU,EAAE;AAExC,QAAM,EAAE,YAAY,YAAY,cAAc,aAAa,IACzD,MAAM,QAAQ,sBAAsB,YAAY,cAAc,MAAM,IAAI,WAAW;AAErF,SAAO,QAAQ,oFAAmB,UAAU,IAAI,QAAQ;AACxD,MAAI,eAAe,GAAG;AACpB,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,QACL,uCAAY,YAAY,uEAAgB,YAAY,qBAAM,UAAU;AAAA,QACpE;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,mGAAsB,YAAY,qBAAM,UAAU;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO,KAAK,uCAAY,YAAY,IAAI,UAAU,UAAK,QAAQ;AAAA,EACjE;AACF;AAKA,eAAe,qBACb,SACA,OACA,MACA,IACe;AACf,MAAI,OAAO;AAGX,MAAI,WAAW,KAAK,GAAG;AACrB,QAAI;AACF,aAAO,MAAMC,UAAS,OAAO,OAAO;AACpC,aAAO,KAAK,+CAAY,KAAK,EAAE;AAAA,IACjC,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAM,IAAI,MAAM,yCAAW,YAAY,EAAE;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,KAAK,6BAAS,IAAI,OAAO,EAAE,QAAQ,QAAQ;AAClD,QAAM,SAAS,MAAM,QAAQ,UAAU,MAAM,MAAM,EAAE;AAErD,SAAO,KAAK,6BAAS,QAAQ;AAC7B,SAAO,KAAK,iBAAO,OAAO,cAAc,MAAM,OAAO,YAAY,IAAI,QAAQ;AAC7E,SAAO,QAAQ,iBAAO,OAAO,cAAc,MAAM,OAAO,cAAc,IAAI,QAAQ;AAClF,SAAO,KAAK,uBAAQ,OAAO,QAAQ,IAAI,SAAS;AAClD;AAKA,SAAS,gBAAsB;AAC7B,SAAO,MAAM,oDAAY,SAAS;AAClC,SAAO,KAAK,6EAAsB,QAAQ;AAC1C,SAAO,KAAK,+DAAuB,QAAQ;AAC3C,SAAO,KAAK,4EAA0B,QAAQ;AAC9C,SAAO,KAAK,qEAA6B,QAAQ;AACjD,SAAO,KAAK,wFAAsC,QAAQ;AAC5D;AAEA,eAAsB,wBAAwB,SAAsC;AAClF,MAAI;AACF,WAAO,KAAK,yCAAW,QAAQ,MAAM,IAAI,SAAS;AAClD,UAAM,YAAY,WAAW,QAAQ,MAAM;AAC3C,kBAAc,KAAK,SAAS;AAG5B,UAAM,aAAaC,iBAAgB,oBAAoB;AACvD,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO,MAAM,kFAAiB,SAAS;AACvC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,IAAAA,iBAAgB,uBAAuB;AACvC,WAAO,KAAK,+HAA2B,SAAS;AAEhD,QAAI;AAEJ,QAAI,QAAQ,WAAW;AAErB,wBAAkB,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,SAAiB,KAAK,KAAK,CAAC;AAChF,aAAO,QAAQ,2DAAc,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,IAC3D,OAAO;AAEL,YAAM,SAAS,cAAc,IAAI;AACjC,YAAM,YAAY,OAAO,aAAa;AACtC,YAAM,eAAe,OAAO,UAAU;AAEtC,aAAO,KAAK,sEAAe,SAAS,wDAAgB,QAAQ;AAE5D,UAAI;AAEF,cAAM,YAAY,MAAM,gBAAgB,CAAC,GAAG,SAAS,SAAS,CAAC;AAG/D,0BAAkB,UACf,IAAI,UAAa,eAAS,MAAM,OAAO,CAAC,EACxC,OAAO,YAAU,WAAW,YAAY;AAE3C,YAAI,gBAAgB,WAAW,GAAG;AAChC,iBAAO,KAAK,UAAK,SAAS,iEAAe,YAAY,2DAAc,QAAQ;AAC3E,iBAAO,KAAK,0HAA2B,QAAQ;AAC/C;AAAA,QACF;AAEA,eAAO,KAAK,2DAAc,gBAAgB,KAAK,IAAI,CAAC,IAAI,QAAQ;AAAA,MAClE,SAAS,OAAO;AACd,eAAO,MAAM,gBAAM,SAAS,8BAAU,KAAK,IAAI,SAAS;AACxD,eAAO,KAAK,sFAAqB,QAAQ;AACzC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,6BAA6B,eAAe;AAGlE,UAAM,SAAS,0BAA0B,SAAS,EAAE,aAAa,QAAQ,WAAW,MAAM,CAAC;AAG3F,QAAI,QAAQ,WAAW,QAAW;AAEhC,YAAM,aAAa,QAAQ,UAAU;AAGrC,YAAS,cAAU,YAAY,QAAQ,OAAO;AAC9C,aAAO,QAAQ,uEAAgB,SAAS;AACxC,aAAO,KAAK,+DAAgB,UAAU,IAAI,QAAQ;AAAA,IACpD,OAAO;AAEL,aAAO,QAAQ,uEAAgB,SAAS;AACxC,aAAO,KAAK,IAAI,QAAQ;AACxB,aAAO,KAAK,kEAAqB,QAAQ;AACzC,aAAO,KAAK,uBAAa,eAAS,QAAQ,UAAU,CAAC,IAAI,QAAQ;AACjE,aAAO,KAAK,6BAAS,QAAQ,cAAc,IAAI,QAAQ;AACvD,aAAO,KAAK,qDAAa,QAAQ,iBAAiB,IAAI,QAAQ;AAC9D,aAAO,KAAK,mCAAU,QAAQ,sBAAsB,QAAQ,CAAC,CAAC,KAAK,QAAQ;AAC3E,aAAO,KAAK,IAAI,QAAQ;AAGxB,iBAAW,cAAc,QAAQ,aAAa;AAC5C,YAAI,CAAC,WAAW,QAAQ;AACtB,iBAAO,KAAK,UAAK,WAAW,QAAQ,4CAAmB,QAAQ;AAAA,QACjE,OAAO;AACL,gBAAM,SAAS,WAAW;AAC1B,gBAAM,aACJ,OAAO,kBAAkB,KAAK,WAAM,OAAO,kBAAkB,KAAK,iBAAO;AAC3E,iBAAO;AAAA,YACL,GAAG,UAAU,IAAI,WAAW,QAAQ,uCAAc,OAAO,eAAe,QAAQ,CAAC,CAAC;AAAA,YAClF;AAAA,UACF;AAEA,cAAI,OAAO,mBAAmB,GAAG;AAC/B,mBAAO,KAAK,wCAAe,OAAO,gBAAgB,UAAK,QAAQ;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAEA,aAAO,KAAK,IAAI,QAAQ;AACxB,aAAO,KAAK,0GAAkC,QAAQ;AACtD,aAAO,KAAK,uEAA6D,QAAQ;AAAA,IACnF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,yFAAmB,KAAK,IAAI,SAAS;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACrXA,eAAe,iBAAiB,SAA2B,QAAmC;AAE5F,gBAAc,KAAK,MAAM;AAEzB,SAAO,KAAK,uDAAe,SAAS;AAGpC,QAAM,iBAAoB;AAAA,IACxB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,MAAM,QAAQ;AAAA,IACd,IAAI,QAAQ;AAAA,IACZ,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,EACvB,CAAC;AACH;AAEO,IAAMC,oBAAmB,QAAQ,gBAAgB;;;ACnBxD,SAAS,qBAAqB,SAAwB,qBAA8B,MAAM,iBAA0B,OAAe;AACjI,MAAI,SAAS;AAGb,MAAI,qBAAqB;AACzB,MAAI,eAAe;AAEnB,UAAQ,QAAQ,CAAC,WAAW;AAC1B,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,UAAI,MAAM,eAAe;AACvB;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,YAAU;AAAA;AAAA;AAEV,MAAI,sBAAsB,gBAAgB;AACxC,cAAU,+FAAyB,kBAAkB;AAAA;AACrD,cAAU,iEAAoB,YAAY;AAAA;AAC1C,cAAU,uBAAa,qBAAqB,YAAY;AAAA;AAAA;AAAA,EAC1D,WAAW,oBAAoB;AAC7B,cAAU,+FAAyB,kBAAkB;AAAA;AAAA;AAAA,EACvD,WAAW,gBAAgB;AACzB,cAAU,iEAAoB,YAAY;AAAA;AAAA;AAAA,EAC5C;AAGA,UAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAM,sBAAsB,OAAO,OAAO,OAAO,WAAS,MAAM,aAAa;AAC7E,UAAM,gBAAgB,OAAO,OAAO,OAAO,WAAS,CAAC,MAAM,aAAa;AAGxE,UAAM,wBAAwB,sBAAsB,oBAAoB,SAAS;AACjF,UAAM,oBAAoB,kBAAkB,cAAc,SAAS;AAEnE,QAAI,CAAC,yBAAyB,CAAC,mBAAmB;AAChD;AAAA,IACF;AAEA,cAAU,gBAAS,OAAO,IAAI;AAAA;AAAA;AAE9B,QAAI,uBAAuB;AACzB,gBAAU,gEAAmB,oBAAoB,MAAM;AAAA;AAAA;AACvD,0BAAoB,QAAQ,CAAC,UAAU;AACrC,kBAAU,KAAK,MAAM,IAAI;AAAA;AAAA,MAC3B,CAAC;AACD,gBAAU;AAAA,IACZ;AAEA,QAAI,mBAAmB;AACrB,gBAAU,kCAAc,cAAc,MAAM;AAAA;AAAA;AAC5C,oBAAc,QAAQ,CAAC,UAAU;AAC/B,kBAAU,KAAK,MAAM,IAAI,MAAM,MAAM,MAAM;AAAA;AAAA,MAC7C,CAAC;AACD,gBAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAKA,SAAS,uBAAuB,SAAwB,qBAA8B,MAAM,iBAA0B,OAAe;AACnI,MAAI,SAAS;AAGb,MAAI,qBAAqB;AACzB,MAAI,eAAe;AACnB,QAAM,eAAuC,CAAC;AAE9C,UAAQ,QAAQ,CAAC,WAAW;AAC1B,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,UAAI,MAAM,eAAe;AACvB;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAGA,UAAK,sBAAsB,MAAM,iBAAmB,kBAAkB,CAAC,MAAM,eAAgB;AAC3F,qBAAa,MAAM,WAAW,KAAK,aAAa,MAAM,WAAW,KAAK,KAAK;AAAA,MAC7E;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,YAAU;AAAA;AAAA;AACV,YAAU,qDAAkB,QAAQ,MAAM;AAAA;AAE1C,MAAI,sBAAsB,gBAAgB;AACxC,cAAU,+FAAyB,kBAAkB;AAAA;AACrD,cAAU,iEAAoB,YAAY;AAAA;AAC1C,cAAU,uBAAa,qBAAqB,YAAY;AAAA;AAAA;AAAA,EAC1D,WAAW,oBAAoB;AAC7B,cAAU,+FAAyB,kBAAkB;AAAA;AAAA;AAAA,EACvD,WAAW,gBAAgB;AACzB,cAAU,iEAAoB,YAAY;AAAA;AAAA;AAAA,EAC5C;AAEA,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,cAAU;AAAA;AAAA;AACV,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,SAAS,KAAK,MAAM;AACzD,YAAM,cAAc,sBAAsB,OAAO;AACjD,gBAAU,OAAO,WAAW,OAAO,KAAK;AAAA;AAAA,IAC1C,CAAC;AACD,cAAU;AAAA,EACZ;AAEA,YAAU;AAAA;AAAA;AAEV,UAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAM,sBAAsB,OAAO,OAAO,OAAO,WAAS,MAAM,aAAa;AAC7E,UAAM,gBAAgB,OAAO,OAAO,OAAO,WAAS,CAAC,MAAM,aAAa;AAGxE,UAAM,wBAAwB,sBAAsB,oBAAoB,SAAS;AACjF,UAAM,oBAAoB,kBAAkB,cAAc,SAAS;AAEnE,QAAI,CAAC,yBAAyB,CAAC,mBAAmB;AAChD;AAAA,IACF;AAEA,cAAU,iBAAU,OAAO,IAAI;AAAA;AAAA;AAE/B,QAAI,uBAAuB;AACzB,gBAAU,qGAA0B,oBAAoB,MAAM;AAAA;AAAA;AAC9D,0BAAoB,QAAQ,CAAC,OAAO,UAAkB;AACpD,kBAAU,GAAG,QAAQ,CAAC,eAAU,MAAM,IAAI,WAAM,MAAM,MAAM,WAAW,MAAM,IAAI;AAAA;AACjF,kBAAU,2BAAiB,MAAM,IAAI;AAAA;AACrC,kBAAU,kCAAmB,MAAM,WAAW,0BAAM;AAAA;AACpD,kBAAU,0BAAgB,sBAAsB,MAAM,WAAW,CAAC;AAAA;AAAA;AAAA,MACpE,CAAC;AAAA,IACH;AAEA,QAAI,mBAAmB;AACrB,gBAAU,uEAAqB,cAAc,MAAM;AAAA;AAAA;AACnD,oBAAc,QAAQ,CAAC,OAAO,UAAkB;AAC9C,kBAAU,GAAG,QAAQ,CAAC,eAAU,MAAM,IAAI,WAAM,MAAM,MAAM,WAAW,MAAM,IAAI;AAAA;AACjF,kBAAU,2BAAiB,MAAM,IAAI;AAAA;AACrC,kBAAU,kCAAmB,MAAM,WAAW,0BAAM;AAAA;AACpD,kBAAU,0BAAgB,sBAAsB,MAAM,WAAW,CAAC;AAAA;AAClE,kBAAU,sCAAkB,MAAM,MAAM;AAAA;AAAA;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,cAAU;AAAA,EACZ,CAAC;AAED,SAAO;AACT;AAKA,SAAS,sBAAsB,aAA6B;AAC1D,QAAM,eAAuC;AAAA,IAC3C,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,EACrB;AACA,SAAO,aAAa,WAAW,KAAK;AACtC;AAEA,eAAsB,sBAAsB,SAA+C;AACzF,MAAI;AACF,WAAO,KAAK,qDAAa,QAAQ,MAAM,IAAI,SAAS;AACpD,UAAM,SAAS,WAAW,QAAQ,MAAM;AACxC,kBAAc,KAAK,MAAM;AAGzB,UAAM,aAAaC,iBAAgB,oBAAoB;AACvD,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO,MAAM,kFAAiB,SAAS;AACvC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,IAAAA,iBAAgB,uBAAuB;AACvC,WAAO,KAAK,iGAAsB,QAAQ;AAE1C,UAAM,UAAU,MAAM,sBAAsB;AAE5C,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,QAAQ,4HAAwB,SAAS;AAChD;AAAA,IACF;AAGA,UAAM,qBAAqB,QAAQ,uBAAuB;AAC1D,UAAM,iBAAiB,QAAQ,kBAAkB;AAGjD,QAAI,cAAc;AAClB,QAAI,qBAAqB;AACzB,QAAI,eAAe;AAEnB,YAAQ,QAAQ,CAAC,WAAW;AAC1B,aAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B;AACA,YAAI,MAAM,eAAe;AACvB;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAGD,WAAO,KAAK,kDAAoB,SAAS;AACzC,WAAO,KAAK,gBAAM,QAAQ,MAAM,iEAAe,SAAS;AAExD,QAAI,sBAAsB,gBAAgB;AACxC,aAAO,KAAK,gBAAM,WAAW,yCAAW,SAAS;AACjD,aAAO,KAAK,yDAAiB,kBAAkB,WAAM,SAAS;AAC9D,aAAO,KAAK,2BAAY,YAAY,WAAM,SAAS;AAAA,IACrD,WAAW,oBAAoB;AAC7B,aAAO,KAAK,qDAAa,kBAAkB,yCAAW,SAAS;AAAA,IACjE,WAAW,gBAAgB;AACzB,aAAO,KAAK,uBAAQ,YAAY,yCAAW,SAAS;AAAA,IACtD;AAGA,QAAI,QAAQ,SAAS,OAAO;AAC1B,YAAM,aAAa,QAAQ,UAAU;AACrC,YAAM,gBAAgB,QAAQ,SAC1B,qBAAqB,SAAS,oBAAoB,cAAc,IAChE,uBAAuB,SAAS,oBAAoB,cAAc;AAEtE,YAAM,qBAAqB,YAAY,aAAa;AACpD,aAAO,QAAQ,qDAAa,UAAU,IAAI,SAAS;AAEnD,YAAM,kBAAkB,yBAAyB,oBAAoB,cAAc;AACnF,UAAI,QAAQ,QAAQ;AAClB,eAAO,KAAK,yDAAY,eAAe,UAAK,SAAS;AAAA,MACvD,OAAO;AACL,eAAO,KAAK,yDAAY,eAAe,UAAK,SAAS;AAAA,MACvD;AAAA,IACF,OAAO;AAEL,YAAM,UAAU,QAAQ,MAAM,GAAG,CAAC;AAClC,aAAO,KAAK,2CAAa,SAAS;AAClC,cAAQ,QAAQ,CAAC,WAAW;AAC1B,cAAM,sBAAsB,OAAO,OAAO,OAAO,WAAS,MAAM,aAAa;AAC7E,cAAM,gBAAgB,OAAO,OAAO,OAAO,WAAS,CAAC,MAAM,aAAa;AAExE,YAAI,sBAAsB,gBAAgB;AACxC,iBAAO,KAAK,eAAQ,OAAO,IAAI,+BAAW,oBAAoB,MAAM,oCAAW,cAAc,MAAM,YAAO,SAAS;AAAA,QACrH,WAAW,oBAAoB;AAC7B,iBAAO,KAAK,eAAQ,OAAO,IAAI,+BAAW,oBAAoB,MAAM,YAAO,SAAS;AAAA,QACtF,WAAW,gBAAgB;AACzB,iBAAO,KAAK,eAAQ,OAAO,IAAI,yBAAU,cAAc,MAAM,YAAO,SAAS;AAAA,QAC/E;AAAA,MACF,CAAC;AAED,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,sBAAY,QAAQ,SAAS,CAAC,uBAAQ,SAAS;AAAA,MAC7D;AAEA,aAAO,KAAK,2IAA0C,SAAS;AAC/D,aAAO,KAAK,wHAAgD,SAAS;AAAA,IACvE;AAEA,WAAO,QAAQ,8CAAW,SAAS;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,MAAM,2DAAc,KAAK,IAAI,SAAS;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,SAAS,yBAAyB,oBAA6B,gBAAiC;AAC9F,MAAI,sBAAsB,gBAAgB;AACxC,WAAO;AAAA,EACT,WAAW,oBAAoB;AAC7B,WAAO;AAAA,EACT,WAAW,gBAAgB;AACzB,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;;;ACpSA,eAAe,aAAa,SAAuB,QAAmC;AAEpF,gBAAc,KAAK,MAAM;AAGzB,QAAM,aAAa,CAAC,QAAQ;AAG5B,MAAI,qBAAqB;AACzB,MAAI,iBAAiB;AAErB,QAAM,cAAc,QAAQ,WAAW;AAEvC,UAAQ,YAAY,YAAY,GAAG;AAAA,IACjC,KAAK;AAEH,2BAAqB;AACrB,uBAAiB;AACjB;AAAA,IACF,KAAK;AACH,2BAAqB;AACrB,uBAAiB;AACjB;AAAA,IACF,KAAK;AACH,2BAAqB;AACrB,uBAAiB;AACjB;AAAA,IACF;AAEE,2BAAqB;AACrB,uBAAiB;AACjB;AAAA,EACJ;AAGA,QAAM,sBAAgB;AAAA,IACpB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,IACR,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,IAAM,eAAe,QAAQ,YAAY;;;ACvDhD,IAAAC,QAAsB;AAMtB,eAAe,aAAa,SAAuB,QAAmC;AAXtF;AAYE,SAAO,KAAK,+CAAiB,QAAQ;AAErC,QAAM,qBACJ,YAAO,WAAP,mBAAe,mBAAkB,cAAc,OAAQ;AACzD,QAAM,iBAAiB,iBAAiB,QAAQ,YAAY,OAAO,MAAM;AACzE,QAAM,iBAAsB,cAAQ,QAAQ,IAAI,GAAG,OAAO,WAAW,cAAc;AACnF,QAAM,eAAeC,cAAa,cAAc;AAEhD,QAAM,QAAQ,MAAM,gBAAgB,OAAO,SAAS,OAAO,OAAO;AAClE,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,MAAMC,UAAS,IAAI;AACnC,UAAM,SAAO,YAAO,gBAAP,mBAAoB,iBAAgB,cAAc,YAAa;AAC5E,UAAM,cAAY,YAAO,gBAAP,mBAAoB,cAAa,cAAc,YAAa;AAC9E,UAAM,QAAQ,cAAc,WAAW,MAAM;AAE7C,UAAM,QAAQ,IAAI,OAAO,GAAG,IAAI,MAAM,KAAK,eAAe,KAAK,OAAO,GAAG;AACzE,WAAO,QAAQ,iBAAO,KAAK,EAAE;AAC7B,UAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC,OAAO,QAAQ;AACrD,aAAO,QAAQ,oBAAU,GAAG,EAAE;AAC9B,YAAM,QAAQ,aAAa,GAAG;AAC9B,aAAO,QAAQ,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,MAAM;AAAA,IACvD,CAAC;AACD,UAAM,qBAAqB,MAAM,SAAS,OAAO,OAAO;AACxD,WAAO,QAAQ,mCAAU,IAAI,EAAE;AAAA,EACjC;AACA,SAAO,QAAQ,wCAAU,SAAS;AACpC;AAEO,IAAM,eAAe,QAAQ,YAAY;;;AC1BhD,eAAe,wBAAwB,SAAkC,QAAmC;AAE1G,gBAAc,KAAK,MAAM;AAGzB,QAAM,aAAa,CAAC,QAAQ;AAG5B,QAAM,wBAA2B;AAAA,IAC/B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,SAAS;AAAA,EACX,CAAC;AACH;AAEO,IAAMC,2BAA0B,QAAQ,uBAAuB;;;A7BnBtE,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QAAQ,KAAK,SAAS,EAAE,YAAY,6GAAwB,EAAE,QAAQ,OAAO;AAE7E,QACG,QAAQ,MAAM,EACd,MAAM,GAAG,EACT,YAAY,oCAAW,EACvB,OAAO,yBAAyB,0DAAa,sBAAsB,EACnE,OAAO,uBAAuB,wCAAU,mBAAmB,EAC3D,OAAO,2BAA2B,oDAAY,oBAAoB,EAClE,OAAO,yBAAyB,kCAAS,OAAO,EAChD,OAAO,6BAA6B,0BAAW,IAAI,EACnD,OAAO,WAAW;AAErB,QACG,QAAQ,SAAS,EACjB,MAAM,GAAG,EACT,YAAY,0DAAuB,EACnC,OAAO,uBAAuB,oDAAY,oBAAoB,EAC9D,OAAO,cAAc;AAExB,QACG,QAAQ,WAAW,EACnB,MAAM,GAAG,EACT,YAAY,0EAAc,EAC1B,OAAO,uBAAuB,oDAAY,oBAAoB,EAC9D,OAAO,qBAAqB,oEAAuB,EACnD,OAAO,iBAAiB,4EAA0B,EAClD,OAAO,uBAAuB,oEAAa,EAC3C,OAAO,qBAAqB,kEAAgB,EAC5C,OAAO,WAAW,gIAAuB,EACzC,OAAO,UAAU,oEAAa,EAC9B,OAAOC,iBAAgB;AAE1B,QACG,QAAQ,OAAO,EACf,MAAM,IAAI,EACV,YAAY,2HAAuB,EACnC,OAAO,uBAAuB,oDAAY,oBAAoB,EAC9D,OAAO,uBAAuB,gHAAqC,EACnE,OAAO,iBAAiB,oKAA6B,EACrD,OAAO,cAAc,4FAAiB,EACtC,OAAO,aAAa,4FAAiB,EACrC,OAAO,qBAAqB,0MAAoD,MAAM,EACtF,OAAO,YAAY;AAEtB,QACG,QAAQ,OAAO,EACf,MAAM,IAAI,EACV,YAAY,2EAA8B,EAC1C,OAAO,uBAAuB,oDAAY,oBAAoB,EAC9D,OAAO,YAAY;AAEtB,QACG,QAAQ,mBAAmB,EAC3B,MAAM,IAAI,EACV,YAAY,0EAAc,EAC1B,OAAO,uBAAuB,oDAAY,oBAAoB,EAC9D,OAAO,+BAA+B,6KAAsC,EAC5E,OAAO,uBAAuB,sKAAoC,EAClE,OAAO,iBAAiB,gKAA8B,EACtD,OAAO,cAAc,gIAAuB,EAC5C,OAAOC,wBAAuB;AAEjC,QAAQ,MAAM;","names":["readFile","ensureDir","fg","readJsonSync","readFile","readJsonSync","import_parser","t","path","ensureDir","stringHash","micromatch","generate","path","callExpression","readFile","_a","key","baiduTranslateService","resolve","resolve","path","stats","results","result","ConfigValidator","containsChinese","fs","path","import_path","path","fs","path","readFile","ConfigValidator","translateCommand","ConfigValidator","path","readJsonSync","readFile","checkTranslationCommand","translateCommand","checkTranslationCommand"]}